@chanlerdev/scorel 0.0.7 → 0.0.8

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/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../packages/protocol/src/ids.ts", "../packages/protocol/src/messages.ts", "../packages/protocol/src/events.ts", "../packages/protocol/src/wire.ts", "../packages/protocol/src/transport.ts", "../packages/protocol/src/relay.ts", "../packages/protocol/src/index.ts", "../packages/client/src/relay-transport.ts", "../packages/client/src/index.ts", "../packages/daemon/src/projects/registry.ts", "../packages/daemon/src/projects/directories.ts", "../packages/daemon/src/projects/sessions.ts", "../packages/core/src/config/index.ts", "../packages/core/src/tools/coding-tools.ts", "../packages/core/src/tools/index.ts", "../packages/core/src/channel/index.ts", "../packages/core/src/extensions/index.ts", "../packages/core/src/instructions/index.ts", "../packages/core/src/memory/index.ts", "../packages/core/src/reminders/index.ts", "../packages/core/src/provider/pi-ai.ts", "../packages/core/src/runtime/index.ts", "../packages/core/src/session/index.ts", "../packages/core/src/skills/index.ts", "../packages/core/src/index.ts", "../packages/daemon/src/relay/auth.ts", "../packages/daemon/src/relay/pair.ts", "../packages/daemon/src/relay/host-client.ts", "../packages/daemon/src/index.ts", "../apps/cli/src/relay-cli.ts", "../apps/cli/src/update-cli.ts", "../apps/cli/src/daemon-cli.ts", "../apps/relay/src/diagnostics.ts", "../apps/relay/src/pairing.ts", "../apps/relay/src/presence.ts", "../apps/relay/src/routing.ts", "../apps/relay/src/store.ts", "../apps/relay/src/server.ts", "../apps/relay/src/library.ts", "../apps/cli/src/relay-server-cli.ts", "../apps/cli/src/up-cli.ts", "../apps/cli/src/webui-cli.ts", "../apps/cli/src/index.ts", "../apps/cli/src/bin.ts"],
4
- "sourcesContent": ["export type Brand<TValue, TBrand extends string> = TValue & { readonly __brand: TBrand };\n\nexport type SessionId = Brand<string, \"SessionId\">;\nexport type EventId = Brand<string, \"EventId\">;\nexport type ClientId = Brand<string, \"ClientId\">;\nexport type DeviceId = Brand<string, \"DeviceId\">;\nexport type ProjectId = Brand<string, \"ProjectId\">;\nexport type RequestId = Brand<string, \"RequestId\">;\nexport type Seq = Brand<number, \"Seq\">;\n\nexport const protocolVersion = 5 as const;\n\nexport const asSessionId = (value: string): SessionId => value as SessionId;\nexport const asEventId = (value: string): EventId => value as EventId;\nexport const asClientId = (value: string): ClientId => value as ClientId;\nexport const asDeviceId = (value: string): DeviceId => value as DeviceId;\nexport const asProjectId = (value: string): ProjectId => value as ProjectId;\nexport const asRequestId = (value: string): RequestId => value as RequestId;\nexport const asSeq = (value: number): Seq => value as Seq;\n", "export type MessageRole = \"system\" | \"user\" | \"assistant\" | \"tool_result\";\n\nexport type TextContentBlock = {\n type: \"text\";\n text: string;\n visibility?: \"display\" | \"model\";\n};\n\nexport type ThinkingContentBlock = {\n type: \"thinking\";\n text: string;\n};\n\nexport type ToolCallContentBlock = {\n type: \"tool_call\";\n toolCallId: string;\n toolName: string;\n args: unknown;\n};\n\nexport type ToolResultContentBlock = {\n type: \"tool_result\";\n toolCallId: string;\n toolName: string;\n result: unknown;\n isError?: boolean;\n};\n\nexport type SystemReminderKind =\n | \"attachment\"\n | \"time\"\n | \"message_ref\"\n | \"skill_listing\"\n | \"skill_delta\"\n | \"memory\"\n | \"channel_context\"\n | \"steer\"\n | \"todo_nudge\"\n | \"runtime_notice\"\n | \"compact_summary\";\n\nexport type SystemReminderOrigin = \"system\" | \"user\" | \"tool\" | \"skill\";\n\nexport type SystemReminderVisibility = \"model\" | \"display\" | \"compact\";\n\nexport type SystemReminderScope = \"message\" | \"turn\" | \"next_model_call\" | \"session\";\n\nexport type SystemReminderContentBlock = {\n type: \"system_reminder\";\n kind: SystemReminderKind;\n origin: SystemReminderOrigin;\n text: string;\n visibility: SystemReminderVisibility;\n scope: SystemReminderScope;\n data?: Record<string, unknown>;\n};\n\nexport type ContentBlock =\n | TextContentBlock\n | ThinkingContentBlock\n | ToolCallContentBlock\n | ToolResultContentBlock\n | SystemReminderContentBlock;\n\nexport type Usage = {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n};\n\nexport type StopReason = \"end_turn\" | \"tool_call\" | \"cancelled\" | \"max_tokens\" | \"error\" | \"unknown\";\n\nexport type ScorelMessage = {\n role: MessageRole;\n content: ContentBlock[];\n usage?: Usage;\n stopReason?: StopReason;\n meta?: Record<string, unknown>;\n};\n", "import type { ClientId, EventId, ProjectId, Seq, SessionId } from \"./ids.js\";\nimport type { ScorelMessage, StopReason, Usage } from \"./messages.js\";\n\nexport type CreateSessionMeta = {\n projectId: ProjectId;\n title?: string;\n model?: string;\n modelSelection?: ModelSelectionInput;\n};\n\nexport type SessionMeta = {\n projectId: ProjectId;\n title?: string;\n model?: string;\n selectedModel?: SelectedModelSummary;\n createdAt?: number;\n updatedAt?: number;\n};\n\nexport type ModelRole = \"primary\" | \"standard\" | \"auxiliary\";\n\nexport type ModelSelectionInput = {\n modelId?: string;\n role?: ModelRole;\n};\n\nexport type AvailableModelSummary = {\n modelId: string;\n providerModelId: string;\n providerId: string;\n provider: string;\n id: string;\n displayName: string;\n roles: ModelRole[];\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsDeveloperRole?: boolean;\n supportsImageInput?: boolean;\n};\n\nexport type ProviderConnectionSummary = {\n providerId: string;\n type: \"builtin\" | \"custom\";\n provider: string;\n api?: \"openai-completions\" | \"openai-responses\" | \"google-generative-ai\" | \"anthropic-messages\";\n baseUrl?: string;\n apiKeyEnv?: string;\n credentialSource: \"env\" | \"direct\";\n credentialStatus: \"available\" | \"missing\";\n};\n\nexport type ProviderModelSummary = {\n providerModelId: string;\n providerId: string;\n provider: string;\n id: string;\n displayName: string;\n availableModelIds: string[];\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsDeveloperRole?: boolean;\n supportsImageInput?: boolean;\n};\n\nexport type ProviderCatalogModelSummary = {\n id: string;\n displayName: string;\n};\n\nexport type UpsertModelProfileInput = {\n projectId?: ProjectId;\n providerId?: string;\n providerType?: \"builtin\" | \"custom\";\n provider?: string;\n apiKeyEnv?: string;\n apiKey?: string;\n api?: \"openai-completions\" | \"openai-responses\" | \"google-generative-ai\" | \"anthropic-messages\";\n baseUrl?: string;\n modelId?: string;\n providerModelId?: string;\n providerModelKey?: string;\n availableModelId?: string;\n addToAvailable?: boolean;\n removeAvailableModelId?: string;\n displayName?: string;\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsDeveloperRole?: boolean;\n supportsImageInput?: boolean;\n roles?: Partial<Record<ModelRole, string>>;\n};\n\nexport type RemoveModelProviderInput = {\n projectId?: ProjectId;\n providerId: string;\n};\n\nexport type MemorySettings = {\n enabled: boolean;\n daily: boolean;\n sessionMemory: boolean;\n autoDream: boolean;\n promoteRoot: boolean;\n dreamIdleMinutes: number;\n autoCompactThreshold: number;\n};\n\nexport type RuntimeSettings = {\n tokenSavingRtk: boolean;\n rtkAvailable: boolean;\n rtkExecutable?: string;\n rtkVersion?: string;\n installStatus?: \"idle\" | \"installed\" | \"failed\";\n installMessage?: string;\n estimatedOutputTokens: number;\n estimatedSavedTokens: number;\n};\n\nexport type MemoryStatus = {\n projectId: ProjectId;\n dirty: boolean;\n running: boolean;\n lastDailyAppendAt?: number;\n lastDailyPath?: string;\n scheduledFor?: number;\n lastAttemptAt?: number;\n lastSuccessAt?: number;\n lastFailure?: {\n at: number;\n message: string;\n };\n lastProjectMemoryUpdateAt?: number;\n lastRootMemoryUpdateAt?: number;\n};\n\nexport type UpsertMemorySettingsInput = Partial<MemorySettings> & {\n projectId?: ProjectId;\n};\n\nexport type UpsertRuntimeSettingsInput = {\n projectId?: ProjectId;\n tokenSavingRtk?: boolean;\n};\n\nexport type ExtensionSettings = {\n extensionId: string;\n enabled: boolean;\n kind: \"im\";\n config: Record<string, string | number | boolean>;\n active: boolean;\n};\n\nexport type UpsertExtensionSettingsInput = {\n extensionId: string;\n enabled?: boolean;\n kind?: \"im\";\n config?: Record<string, string | number | boolean | undefined>;\n};\n\nexport type SelectedModelSummary = {\n modelId: string;\n role?: ModelRole;\n providerId: string;\n provider: string;\n id: string;\n displayName: string;\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsImageInput?: boolean;\n};\n\nexport type PersistentEventBase = {\n id: EventId;\n parentId: EventId | null;\n seq: Seq;\n sessionId: SessionId;\n clientId: ClientId;\n ts: number;\n};\n\nexport type SessionHeaderEvent = PersistentEventBase & {\n type: \"session_header\";\n protocolVersion: 5;\n meta: SessionMeta;\n};\n\nexport type UserMessageEvent = PersistentEventBase & {\n type: \"user_message\";\n message: ScorelMessage & { role: \"user\" };\n};\n\nexport type AssistantMessageEvent = PersistentEventBase & {\n type: \"assistant_message\";\n message: ScorelMessage & { role: \"assistant\" };\n};\n\nexport type ToolResultEvent = PersistentEventBase & {\n type: \"tool_result\";\n message: ScorelMessage & { role: \"tool_result\" };\n};\n\nexport type SessionTitleUpdatedEvent = PersistentEventBase & {\n type: \"session_title_updated\";\n title: string;\n source: \"model\" | \"user\";\n model?: SelectedModelSummary;\n derivedFrom?: {\n eventId: EventId;\n seq: Seq;\n };\n};\n\nexport type InstructionSectionKind = \"baseline\" | \"agents\" | \"memory\" | \"workspace\" | \"environment\" | \"time\";\n\nexport type InstructionSource = {\n sourceType: \"builtin\" | \"agents_md\" | \"memory\";\n path?: string;\n scope?: \"global_user\" | \"project\";\n priority?: number;\n content?: string;\n};\n\nexport type InstructionSection = {\n kind: InstructionSectionKind;\n frozenAt: number;\n sources?: InstructionSource[];\n renderedBlock: string;\n data?: Record<string, unknown>;\n};\n\nexport type InstructionSnapshot = {\n version: 1;\n cwd: string;\n sections: InstructionSection[];\n};\n\nexport type InstructionSnapshotEvent = PersistentEventBase & {\n type: \"instruction_snapshot\";\n snapshot: InstructionSnapshot;\n};\n\nexport type HarnessItemKind =\n | \"attachment\"\n | \"skill_listing\"\n | \"skill_delta\"\n | \"memory\"\n | \"channel_context\"\n | \"date_change\"\n | \"steer\"\n | \"runtime_notice\";\n\nexport type HarnessItemOrigin = \"user\" | \"system\" | \"tool\" | \"skill\";\n\nexport type HarnessItem = {\n kind: HarnessItemKind;\n origin: HarnessItemOrigin;\n content: string;\n visibility: \"display\" | \"hidden\" | \"compact\";\n data?: Record<string, unknown>;\n};\n\nexport type HarnessItemEvent = PersistentEventBase & {\n type: \"harness_item\";\n item: HarnessItem;\n};\n\nexport type CompactEvent = PersistentEventBase & {\n type: \"compact\";\n summary: string;\n compactedThrough: EventId;\n tokensBefore: number;\n tokensAfter: number;\n retainedEventCount: number;\n};\n\nexport type ContextControlEvent = PersistentEventBase & {\n type: \"context_control\";\n operation: \"hide_user_turn\";\n anchorUserEventId: EventId;\n throughEventId: EventId;\n actor: \"agent\" | \"user\" | \"system\";\n reason?: string;\n};\n\nexport type QueueName = \"follow_up\" | \"steer\";\n\nexport type QueueItem = {\n id: string;\n content: ScorelMessage[\"content\"];\n createdAt: number;\n updatedAt: number;\n clientId: ClientId;\n data?: Record<string, unknown>;\n};\n\nexport type QueueUpdateEvent = PersistentEventBase & {\n type: \"queue_update\";\n queue: QueueName;\n operation: \"rewrite\";\n items: QueueItem[];\n anchorEventId: EventId | null;\n};\n\nexport type SkillIndexEntry = {\n name: string;\n path: string;\n scope: \"user\" | \"project\" | \"extension\";\n description: string;\n displayName?: string;\n mtimeMs: number;\n size: number;\n contentHash: string;\n priority: number;\n shadowed?: boolean;\n diagnostics?: string[];\n};\n\nexport type SkillIndexSnapshotEvent = PersistentEventBase & {\n type: \"skill_index_snapshot\";\n anchorEventId: EventId | null;\n entries: SkillIndexEntry[];\n};\n\nexport type SkillIndexDeltaEvent = PersistentEventBase & {\n type: \"skill_index_delta\";\n anchorEventId: EventId | null;\n added: SkillIndexEntry[];\n changed: SkillIndexEntry[];\n removed: { name: string; previousPath: string }[];\n};\n\nexport type PersistentEvent =\n | SessionHeaderEvent\n | UserMessageEvent\n | AssistantMessageEvent\n | ToolResultEvent\n | SessionTitleUpdatedEvent\n | InstructionSnapshotEvent\n | HarnessItemEvent\n | CompactEvent\n | ContextControlEvent\n | QueueUpdateEvent\n | SkillIndexSnapshotEvent\n | SkillIndexDeltaEvent;\n\nexport type TransientEventBase = {\n seq: Seq;\n sessionId: SessionId;\n clientId: ClientId;\n ts: number;\n};\n\nexport type TurnStartEvent = TransientEventBase & {\n type: \"turn_start\";\n turnIndex: number;\n};\n\nexport type TurnEndEvent = TransientEventBase & {\n type: \"turn_end\";\n turnIndex: number;\n usage?: Usage;\n stopReason?: StopReason;\n};\n\nexport type MessageStartEvent = TransientEventBase & {\n type: \"message_start\";\n eventId: EventId;\n parentId: EventId | null;\n role: \"assistant\" | \"tool_result\";\n model?: string;\n};\n\nexport type MessageEndEvent = TransientEventBase & {\n type: \"message_end\";\n eventId: EventId;\n stopReason?: StopReason;\n usage?: Usage;\n};\n\nexport type TextDeltaEvent = TransientEventBase & {\n type: \"text_delta\";\n eventId: EventId;\n delta: string;\n};\n\nexport type ThinkingDeltaEvent = TransientEventBase & {\n type: \"thinking_delta\";\n eventId: EventId;\n delta: string;\n};\n\nexport type ErrorEvent = TransientEventBase & {\n type: \"error\";\n code: ErrorCode;\n message: string;\n requestId?: string;\n};\n\nexport type TransientEvent =\n | TurnStartEvent\n | TurnEndEvent\n | MessageStartEvent\n | MessageEndEvent\n | TextDeltaEvent\n | ThinkingDeltaEvent\n | ErrorEvent;\n\nexport type ScorelEvent = PersistentEvent | TransientEvent;\n\nexport type ErrorCode =\n | \"session_not_found\"\n | \"project_not_found\"\n | \"project_has_sessions\"\n | \"filesystem_error\"\n | \"runtime_busy\"\n | \"invalid_request\"\n | \"auth_failed\"\n | \"protocol_mismatch\"\n | \"resync_failed\"\n | \"invalid_event_id\"\n | \"conflict\"\n | \"transport_closed\"\n | \"internal_error\";\n\nexport type DaemonStatus = {\n running: boolean;\n model?: string;\n activeClients: ClientId[];\n sessionCount: number;\n uptimeMs: number;\n};\n\nexport type SessionSummary = {\n sessionId: SessionId;\n projectId: ProjectId;\n title?: string;\n model?: string;\n updatedAt: number;\n currentSeq: Seq;\n};\n\nexport type HostProject = {\n projectId: ProjectId;\n displayName: string;\n workDir: string;\n createdAt: number;\n updatedAt: number;\n};\n\nexport type DirectoryEntry = {\n name: string;\n path: string;\n kind: \"directory\";\n};\n\nexport type DirectoryListing = {\n path: string;\n parentPath?: string;\n entries: DirectoryEntry[];\n};\n", "import type { ClientId, DeviceId, EventId, ProjectId, RequestId, Seq, SessionId } from \"./ids.js\";\nimport type {\n CreateSessionMeta,\n DaemonStatus,\n DirectoryListing,\n ErrorCode,\n ExtensionSettings,\n HostProject,\n AvailableModelSummary,\n ModelRole,\n ProviderConnectionSummary,\n ProviderCatalogModelSummary,\n ProviderModelSummary,\n RemoveModelProviderInput,\n UpsertModelProfileInput,\n MemoryStatus,\n MemorySettings,\n ModelSelectionInput,\n RuntimeSettings,\n UpsertExtensionSettingsInput,\n UpsertMemorySettingsInput,\n UpsertRuntimeSettingsInput,\n PersistentEvent,\n QueueItem,\n QueueName,\n ScorelEvent,\n SessionMeta,\n SessionSummary,\n} from \"./events.js\";\nimport type { ContentBlock } from \"./messages.js\";\n\nexport type SendMessageOptions = {\n parentId?: EventId | null;\n runningBehavior?: QueueName;\n channelContext?: ChannelContext;\n modelSelection?: ModelSelectionInput;\n};\n\nexport type ChannelContext = {\n channel: string;\n externalConversationId: string;\n conversationType?: string;\n senderDisplayName?: string;\n mentionedBot?: boolean;\n data?: Record<string, unknown>;\n};\n\nexport type SendMessageResponse = {\n status: \"completed\" | \"queued\";\n userEventId?: EventId;\n assistantEventId?: EventId;\n queue?: QueueName;\n queueItemId?: string;\n};\n\nexport type ClientRequestMap = {\n create_session: {\n request: { sessionId?: SessionId; meta: CreateSessionMeta };\n response: { sessionId: SessionId };\n };\n load_session: {\n request: { sessionId: SessionId; lastSeq?: Seq };\n response: {\n sessionId: SessionId;\n activeLeafId: EventId | null;\n currentSeq: Seq;\n events: PersistentEvent[];\n meta: SessionMeta;\n };\n };\n list_sessions: {\n request: { projectId?: ProjectId; limit?: number };\n response: { sessions: SessionSummary[] };\n };\n list_projects: {\n request: Record<never, never>;\n response: { projects: HostProject[] };\n };\n list_models: {\n request: { projectId?: ProjectId };\n response: { providers: ProviderConnectionSummary[]; providerModels: ProviderModelSummary[]; models: AvailableModelSummary[]; roles: Record<ModelRole, string>; warnings?: string[] };\n };\n upsert_model_profile: {\n request: UpsertModelProfileInput;\n response: { providers: ProviderConnectionSummary[]; providerModels: ProviderModelSummary[]; models: AvailableModelSummary[]; roles: Record<ModelRole, string>; warnings?: string[] };\n };\n fetch_provider_models: {\n request: { projectId?: ProjectId; providerId: string };\n response: { models: ProviderCatalogModelSummary[] };\n };\n remove_model_provider: {\n request: RemoveModelProviderInput;\n response: { providers: ProviderConnectionSummary[]; providerModels: ProviderModelSummary[]; models: AvailableModelSummary[]; roles: Record<ModelRole, string>; warnings?: string[]; removed: boolean };\n };\n get_memory_settings: {\n request: { projectId?: ProjectId };\n response: { memory: MemorySettings };\n };\n get_memory_status: {\n request: { projectId: ProjectId };\n response: { status: MemoryStatus };\n };\n upsert_memory_settings: {\n request: UpsertMemorySettingsInput;\n response: { memory: MemorySettings };\n };\n get_runtime_settings: {\n request: { projectId?: ProjectId };\n response: { runtime: RuntimeSettings };\n };\n upsert_runtime_settings: {\n request: UpsertRuntimeSettingsInput;\n response: { runtime: RuntimeSettings };\n };\n get_extension_settings: {\n request: { extensionId: string };\n response: { extension: ExtensionSettings };\n };\n upsert_extension_settings: {\n request: UpsertExtensionSettingsInput;\n response: { extension: ExtensionSettings };\n };\n list_directories: {\n request: { path?: string };\n response: DirectoryListing;\n };\n register_project: {\n request: { workDir: string };\n response: { project: HostProject };\n };\n remove_project: {\n request: { projectId: ProjectId };\n response: { projectId: ProjectId; removed: boolean };\n };\n cancel: {\n request: { sessionId: SessionId };\n response: { sessionId: SessionId; cancelled: boolean };\n };\n send_message: {\n request: { sessionId: SessionId; content: string | ContentBlock[]; options?: SendMessageOptions };\n response: SendMessageResponse;\n };\n rewrite_queue: {\n request: { sessionId: SessionId; queue: QueueName; items: QueueItem[] };\n response: { sessionId: SessionId; queue: QueueName; items: QueueItem[] };\n };\n get_status: {\n request: { sessionId?: SessionId };\n response: DaemonStatus;\n };\n subscribe_events: {\n request: { sessionId: SessionId; lastSeq?: Seq };\n response: { currentSeq: Seq };\n };\n resync_events: {\n request: { sessionId: SessionId; persistentLastSeq?: Seq; streamLastSeq?: Seq; fromSeq?: Seq };\n response: {\n events: ScorelEvent[];\n throughSeq: Seq;\n mode: \"stream_resume\" | \"persistent_fallback\" | \"full_reload\";\n gapFromSeq?: Seq;\n gapToSeq?: Seq;\n };\n };\n};\n\nexport type ClientRequestType = keyof ClientRequestMap;\n\nexport type ClientRequest<TType extends ClientRequestType = ClientRequestType> = {\n [K in TType]: {\n type: K;\n requestId: RequestId;\n } & ClientRequestMap[K][\"request\"];\n}[TType];\n\nexport type ClientMessage =\n | ClientRequest\n | { type: \"disconnect\"; sessionId?: SessionId }\n | { type: \"ping\"; requestId?: RequestId };\n\nexport type ResponseFor<TRequest extends ClientRequest> =\n ClientResponse<TRequest[\"type\"]>;\n\nexport type ClientResponse<TType extends ClientRequestType = ClientRequestType> = {\n [K in TType]: {\n type: \"response\";\n requestType: K;\n requestId: RequestId;\n ok: true;\n data: ClientRequestMap[K][\"response\"];\n };\n}[TType];\n\nexport type ErrorResponse = {\n type: \"error\";\n requestId?: RequestId;\n ok: false;\n code: ErrorCode;\n message: string;\n};\n\nexport type DaemonMessage =\n | {\n type: \"connected\";\n clientId: ClientId;\n sessionId?: SessionId;\n currentSeq?: Seq;\n deviceId: DeviceId;\n deviceDisplayName?: string;\n }\n | { type: \"disconnected\"; reason: string }\n | { type: \"pong\"; requestId?: RequestId }\n | { type: \"event\"; event: ScorelEvent }\n | ClientResponse\n | ErrorResponse;\n\nexport const okResponse = <TRequest extends ClientRequest>(\n request: TRequest,\n data: ClientRequestMap[TRequest[\"type\"]][\"response\"],\n): ResponseFor<TRequest> => ({\n type: \"response\",\n requestType: request.type,\n requestId: request.requestId,\n ok: true,\n data,\n}) as ResponseFor<TRequest>;\n", "import type { ClientId, DeviceId, Seq, SessionId } from \"./ids.js\";\nimport type { ClientMessage, DaemonMessage } from \"./wire.js\";\n\nexport type ConnectParams = {\n clientId: ClientId;\n sessionId?: SessionId;\n persistentLastSeq?: Seq;\n streamLastSeq?: Seq;\n lastSeq?: Seq;\n};\n\nexport type ConnectResult = {\n clientId: ClientId;\n sessionId?: SessionId;\n currentSeq?: Seq;\n deviceId: DeviceId;\n deviceDisplayName?: string;\n};\n\nexport type RemoteEndpoint = {\n url: string;\n token: string;\n};\n\nexport type Unsubscribe = () => void;\n\nexport interface DaemonTransport {\n connect(params: ConnectParams): Promise<ConnectResult>;\n send(message: ClientMessage): void | Promise<void>;\n onMessage(handler: (message: DaemonMessage) => void): Unsubscribe;\n close(): void;\n}\n", "import type { ClientId, DeviceId, RequestId } from \"./ids.js\";\nimport type { ConnectParams } from \"./transport.js\";\nimport type { ClientMessage, DaemonMessage } from \"./wire.js\";\n\nexport type RelayDeviceRecord = {\n deviceId: DeviceId;\n label?: string;\n publicKey?: string;\n createdAt: number;\n updatedAt: number;\n};\n\nexport type RelayClientRecord = {\n clientId: ClientId;\n label?: string;\n publicKey?: string;\n createdAt: number;\n updatedAt: number;\n};\n\nexport type RelayBindingRecord = {\n deviceId: DeviceId;\n clientId: ClientId;\n createdAt: number;\n};\n\nexport type RelayAuthorizedDevice = RelayDeviceRecord & {\n online: boolean;\n};\n\nexport type RelayConnectPayload = ConnectParams & {\n type: \"connect\";\n};\n\nexport type RelayClientPayload = ClientMessage | RelayConnectPayload;\n\nexport type RelayEntryFrame =\n | { type: \"entry_hello\"; clientId: ClientId; label?: string; publicKey?: string }\n | { type: \"create_pair_session\"; requestId: RequestId; clientId?: ClientId }\n | { type: \"entry_to_device\"; deviceId: DeviceId; payload: RelayClientPayload }\n | { type: \"list_authorized_devices\"; requestId: RequestId };\n\nexport type RelayHostFrame =\n | { type: \"host_hello\"; deviceId: DeviceId; label?: string; publicKey?: string }\n | { type: \"redeem_pair\"; requestId: RequestId; pairCode: string; deviceId: DeviceId }\n | { type: \"host_to_entry\"; clientId: ClientId; payload: DaemonMessage };\n\nexport type RelayErrorCode =\n | \"invalid_request\"\n | \"not_announced\"\n | \"pair_not_found\"\n | \"pair_expired\"\n | \"unauthorized\"\n | \"device_offline\"\n | \"client_offline\"\n | \"internal_error\";\n\nexport type RelayResponse =\n | {\n type: \"relay_response\";\n requestId: RequestId;\n ok: true;\n data:\n | { pairCode: string; expiresAt: number }\n | { clientId: ClientId }\n | { devices: RelayAuthorizedDevice[] };\n }\n | {\n type: \"relay_error\";\n requestId?: RequestId;\n ok: false;\n code: RelayErrorCode;\n message: string;\n };\n\nexport type RelayToHostFrame = {\n type: \"relay_to_host\";\n clientId: ClientId;\n payload: RelayClientPayload;\n};\n\nexport type RelayToEntryFrame = {\n type: \"device_to_entry\";\n deviceId: DeviceId;\n payload: DaemonMessage;\n};\n\nexport type RelayServerFrame = RelayResponse | RelayToHostFrame | RelayToEntryFrame;\n", "export const protocolPackageName = \"@scorel/protocol\" as const;\n\nexport * from \"./ids.js\";\nexport * from \"./messages.js\";\nexport * from \"./events.js\";\nexport * from \"./wire.js\";\nexport * from \"./transport.js\";\nexport * from \"./relay.js\";\n", "import {\n type ClientId,\n type ClientMessage,\n type ConnectParams,\n type ConnectResult,\n type DaemonMessage,\n type DaemonTransport,\n type DeviceId,\n type RelayEntryFrame,\n type RelayServerFrame,\n type Unsubscribe,\n} from \"@scorel/protocol\";\n\nexport type RelayTransportOptions = {\n relayUrl: string;\n deviceId: DeviceId;\n clientId: ClientId;\n createWebSocket?: (url: string) => WebSocketLike;\n};\n\ntype WebSocketLike = {\n readyState: number;\n send(data: string): void;\n close(): void;\n addEventListener(type: \"open\", listener: () => void, options?: { once?: boolean }): void;\n addEventListener(type: \"message\", listener: (event: { data: unknown }) => void): void;\n addEventListener(type: \"error\", listener: (event: unknown) => void, options?: { once?: boolean }): void;\n removeEventListener(type: \"error\", listener: (event: unknown) => void): void;\n};\n\nconst websocketOpenState = 1;\n\nexport class RelayTransport implements DaemonTransport {\n readonly relayUrl: string;\n readonly deviceId: DeviceId;\n readonly clientId: ClientId;\n readonly #createWebSocket: (url: string) => WebSocketLike;\n readonly #handlers = new Set<(message: DaemonMessage) => void>();\n #socket: WebSocketLike | undefined;\n\n constructor(options: RelayTransportOptions) {\n this.relayUrl = options.relayUrl;\n this.deviceId = options.deviceId;\n this.clientId = options.clientId;\n this.#createWebSocket =\n options.createWebSocket ??\n ((url) => {\n if (typeof WebSocket === \"undefined\") {\n throw new Error(\"WebSocket is not available in this runtime\");\n }\n return new WebSocket(url);\n });\n }\n\n connect(params: ConnectParams): Promise<ConnectResult> {\n return new Promise((resolve, reject) => {\n const socket = this.#createWebSocket(this.relayUrl);\n this.#socket = socket;\n const rejectOnError = (event: unknown) => {\n socket.removeEventListener(\"error\", rejectOnError);\n reject(event instanceof Error ? event : new Error(\"Relay WebSocket connection failed\"));\n };\n socket.addEventListener(\"error\", rejectOnError, { once: true });\n socket.addEventListener(\"message\", (event) => {\n const frame = parseRelayFrame(event.data);\n if (frame.type === \"relay_error\") {\n reject(new Error(frame.message));\n return;\n }\n if (frame.type !== \"device_to_entry\") {\n return;\n }\n this.#emit(frame.payload);\n if (frame.payload.type === \"connected\") {\n socket.removeEventListener(\"error\", rejectOnError);\n resolve({\n clientId: frame.payload.clientId,\n sessionId: frame.payload.sessionId,\n currentSeq: frame.payload.currentSeq,\n deviceId: frame.payload.deviceId,\n deviceDisplayName: frame.payload.deviceDisplayName,\n });\n }\n });\n socket.addEventListener(\n \"open\",\n () => {\n this.#write({ type: \"entry_hello\", clientId: this.clientId });\n this.#write({\n type: \"entry_to_device\",\n deviceId: this.deviceId,\n payload: { type: \"connect\", ...params },\n });\n },\n { once: true },\n );\n });\n }\n\n send(message: ClientMessage): void {\n this.#write({\n type: \"entry_to_device\",\n deviceId: this.deviceId,\n payload: message,\n });\n }\n\n onMessage(handler: (message: DaemonMessage) => void): Unsubscribe {\n this.#handlers.add(handler);\n return () => {\n this.#handlers.delete(handler);\n };\n }\n\n close(): void {\n this.#socket?.close();\n this.#socket = undefined;\n this.#handlers.clear();\n }\n\n #write(frame: RelayEntryFrame): void {\n if (!this.#socket || this.#socket.readyState !== websocketOpenState) {\n throw new Error(\"RelayTransport is not connected\");\n }\n this.#socket.send(JSON.stringify(frame));\n }\n\n #emit(message: DaemonMessage): void {\n for (const handler of this.#handlers) {\n handler(message);\n }\n }\n}\n\nconst parseRelayFrame = (data: unknown): RelayServerFrame => {\n const text = typeof data === \"string\" ? data : data instanceof ArrayBuffer ? new TextDecoder().decode(data) : String(data);\n return JSON.parse(text) as RelayServerFrame;\n};\n", "import {\n asRequestId,\n asSeq,\n type ClientMessage,\n type ConnectParams,\n type ConnectResult,\n protocolPackageName,\n protocolVersion,\n type ClientId,\n type ClientRequest,\n type ClientRequestMap,\n type ClientRequestType,\n type ContentBlock,\n type CreateSessionMeta,\n type DaemonMessage,\n type DirectoryListing,\n type DaemonTransport,\n type DeviceId,\n type EventId,\n type ExtensionSettings,\n type HostProject,\n type AvailableModelSummary,\n type ModelRole,\n type MemoryStatus,\n type RuntimeSettings,\n type ProviderCatalogModelSummary,\n type ProviderConnectionSummary,\n type ProviderModelSummary,\n type UpsertModelProfileInput,\n type MemorySettings,\n type UpsertExtensionSettingsInput,\n type UpsertMemorySettingsInput,\n type UpsertRuntimeSettingsInput,\n type PersistentEvent,\n type ProjectId,\n type QueueItem,\n type QueueName,\n type ScorelEvent,\n type SendMessageOptions,\n type SendMessageResponse,\n type Seq,\n type SessionId,\n type SessionSummary,\n type Unsubscribe,\n} from \"@scorel/protocol\";\n\nexport const clientPackageName = \"@scorel/client\" as const;\nexport const clientProtocolDependency = protocolPackageName;\nexport const clientProtocolVersion = protocolVersion;\nexport type ClientDaemonTransport = DaemonTransport;\nexport { RelayTransport, type RelayTransportOptions } from \"./relay-transport.js\";\n\n/**\n * Public marker error for \"the underlying transport tried to write while not\n * connected\" (S0045). Every public DaemonClient method that funnels through\n * the transport catches synchronous transport throws and re-emits them as a\n * rejected Promise carrying this error class, so callers in browser /\n * React effect paths can handle a stale-token / closed-socket scenario as a\n * normal rejection instead of an unhandled runtime error.\n *\n * `code` is a const literal for stable string-based dispatch in webui\n * (`session.ts` classifyError, `sidebar.tsx` etc).\n */\nexport class TransportDisconnectedError extends Error {\n readonly code = \"transport_disconnected\" as const;\n constructor(message: string) {\n super(message);\n this.name = \"TransportDisconnectedError\";\n }\n}\n\nfunction isTransportDisconnectedError(\n cause: unknown,\n): cause is TransportDisconnectedError {\n if (cause instanceof TransportDisconnectedError) return true;\n if (typeof cause !== \"object\" || cause === null) return false;\n return (cause as { code?: unknown }).code === \"transport_disconnected\";\n}\n\nfunction toTransportError(cause: unknown): TransportDisconnectedError {\n if (cause instanceof TransportDisconnectedError) return cause;\n const message = cause instanceof Error ? cause.message : String(cause);\n return new TransportDisconnectedError(message);\n}\n\n/**\n * Heuristic: synchronous throws from `WsTransport.#write` carry the literal\n * \"WsTransport is not connected\" message. Other transport implementations\n * may throw for unrelated reasons (parse, schema, etc); only the\n * not-connected case is mapped to `TransportDisconnectedError` so daemon-\n * side errors keep their existing reason.\n */\nfunction isTransportNotConnected(cause: unknown): boolean {\n if (cause instanceof TransportDisconnectedError) return true;\n if (cause instanceof Error) {\n return /not connected/i.test(cause.message) && /transport/i.test(cause.message);\n }\n const text = String(cause);\n return /not connected/i.test(text) && /transport/i.test(text);\n}\n\nfunction wrapTransportThrow(cause: unknown): never {\n if (isTransportDisconnectedError(cause) || isTransportNotConnected(cause)) {\n throw toTransportError(cause);\n }\n throw cause;\n}\n\nexport type WsTransportOptions = {\n url: string;\n token: string;\n createWebSocket?: (url: string) => WebSocketLike;\n};\n\ntype WebSocketLike = {\n readyState: number;\n send(data: string): void;\n close(): void;\n addEventListener(type: \"open\", listener: () => void, options?: { once?: boolean }): void;\n addEventListener(type: \"message\", listener: (event: { data: unknown }) => void): void;\n addEventListener(type: \"error\", listener: (event: unknown) => void, options?: { once?: boolean }): void;\n addEventListener(type: \"close\", listener: () => void, options?: { once?: boolean }): void;\n removeEventListener(type: \"error\", listener: (event: unknown) => void): void;\n};\n\nconst websocketOpenState = 1;\n\nexport type DaemonClientOptions = {\n clientId: ClientId;\n createRequestId?: () => ReturnType<typeof asRequestId>;\n};\n\nexport type DaemonConnectionIdentity = {\n deviceId?: DeviceId;\n deviceDisplayName?: string;\n};\n\ntype PendingRequest<TType extends ClientRequestType = ClientRequestType> = {\n resolve: (data: ClientRequestMap[TType][\"response\"]) => void;\n reject: (error: Error) => void;\n};\n\nexport class DaemonClient {\n readonly clientId: ClientId;\n readonly #transport: DaemonTransport;\n readonly #createRequestId: () => ReturnType<typeof asRequestId>;\n readonly #pending = new Map<string, PendingRequest>();\n readonly #subscribers = new Set<(event: ScorelEvent) => void>();\n readonly #events: PersistentEvent[] = [];\n #unsubscribe: Unsubscribe | undefined;\n #state: \"disconnected\" | \"connecting\" | \"connected\" = \"disconnected\";\n #sessionId: SessionId | null = null;\n #persistentLastSeq: Seq = asSeq(0);\n #streamLastSeq: Seq = asSeq(0);\n #connectionIdentity: DaemonConnectionIdentity = {};\n #requestCounter = 0;\n\n constructor(transport: DaemonTransport, options: DaemonClientOptions) {\n this.#transport = transport;\n this.clientId = options.clientId;\n this.#createRequestId =\n options.createRequestId ??\n (() => {\n this.#requestCounter += 1;\n return asRequestId(`req_${this.#requestCounter}`);\n });\n }\n\n get state(): \"disconnected\" | \"connecting\" | \"connected\" {\n return this.#state;\n }\n\n get sessionId(): SessionId | null {\n return this.#sessionId;\n }\n\n get lastSeq(): Seq {\n return this.#streamLastSeq;\n }\n\n get persistentLastSeq(): Seq {\n return this.#persistentLastSeq;\n }\n\n get streamLastSeq(): Seq {\n return this.#streamLastSeq;\n }\n\n get connectionIdentity(): DaemonConnectionIdentity {\n return { ...this.#connectionIdentity };\n }\n\n async connect(sessionId?: SessionId): Promise<void> {\n try {\n this.#state = \"connecting\";\n this.#unsubscribe ??= this.#transport.onMessage((message) => this.#handleMessage(message));\n const result = await this.#transport.connect({\n clientId: this.clientId,\n sessionId,\n persistentLastSeq: this.#persistentLastSeq,\n streamLastSeq: this.#streamLastSeq,\n lastSeq: this.#streamLastSeq,\n });\n this.#sessionId = result.sessionId ?? sessionId ?? null;\n this.#connectionIdentity = {\n deviceId: result.deviceId,\n deviceDisplayName: result.deviceDisplayName,\n };\n this.#state = \"connected\";\n } catch (cause) {\n // Map transport-level not-connected throws to the public marker error\n // so callers in React effect paths see a rejection rather than an\n // unhandled runtime error (S0045 \u00A74.1).\n wrapTransportThrow(cause);\n }\n }\n\n disconnect(): void {\n try {\n this.#transport.send({ type: \"disconnect\", sessionId: this.#sessionId ?? undefined });\n } catch (cause) {\n // Disconnect is a fire-and-forget cleanup; if the socket is already\n // closed we still want to flush local state. Re-throwing would force\n // every caller to wrap a try/catch that has no useful recovery path.\n if (!isTransportNotConnected(cause)) {\n // Non-transport errors are unexpected; log and continue cleanup.\n // eslint-disable-next-line no-console\n console.warn(\"[scorel/client] transport.send(disconnect) threw:\", cause);\n }\n }\n try {\n this.#transport.close();\n } catch {\n /* ignore */\n }\n this.#unsubscribe?.();\n this.#unsubscribe = undefined;\n this.#state = \"disconnected\";\n }\n\n async createSession(input: { sessionId?: SessionId; meta: CreateSessionMeta }): Promise<SessionId> {\n const response = await this.#request(\"create_session\", { meta: input.meta, sessionId: input.sessionId });\n return response.sessionId;\n }\n\n async loadSession(sessionId: SessionId): Promise<ClientRequestMap[\"load_session\"][\"response\"]> {\n const response = await this.#request(\"load_session\", { sessionId, lastSeq: this.#persistentLastSeq });\n this.#sessionId = response.sessionId;\n for (const event of response.events) {\n this.#recordEvent(event);\n }\n this.#persistentLastSeq = maxSeq(this.#persistentLastSeq, response.currentSeq);\n this.#streamLastSeq = maxSeq(this.#streamLastSeq, response.currentSeq);\n return response;\n }\n\n async sendMessage(\n content: string | ContentBlock[],\n options?: SendMessageOptions,\n ): Promise<SendMessageResponse> {\n if (!this.#sessionId) {\n throw new Error(\"DaemonClient is not connected to a session\");\n }\n return this.#request(\"send_message\", { sessionId: this.#sessionId, content, options });\n }\n\n async cancel(): Promise<{ sessionId: SessionId; cancelled: boolean }> {\n if (!this.#sessionId) {\n throw new Error(\"DaemonClient is not connected to a session\");\n }\n return this.#request(\"cancel\", { sessionId: this.#sessionId });\n }\n\n async rewriteQueue(queue: QueueName, items: QueueItem[]): Promise<QueueItem[]> {\n if (!this.#sessionId) {\n throw new Error(\"DaemonClient is not connected to a session\");\n }\n return (await this.#request(\"rewrite_queue\", {\n sessionId: this.#sessionId,\n queue,\n items,\n })).items;\n }\n\n async listSessions(filter?: { projectId?: ProjectId; limit?: number }): Promise<SessionSummary[]> {\n this.#assertDaemonConnected();\n const response = await this.#request(\"list_sessions\", {\n projectId: filter?.projectId,\n limit: filter?.limit,\n });\n return response.sessions;\n }\n\n async listProjects(): Promise<HostProject[]> {\n this.#assertDaemonConnected();\n const response = await this.#request(\"list_projects\", {});\n return response.projects;\n }\n\n async listModels(filter?: { projectId?: ProjectId }): Promise<{ providers: ProviderConnectionSummary[]; providerModels: ProviderModelSummary[]; models: AvailableModelSummary[]; roles: Record<ModelRole, string>; warnings?: string[] }> {\n this.#assertDaemonConnected();\n return this.#request(\"list_models\", { projectId: filter?.projectId });\n }\n\n async upsertModelProfile(input: UpsertModelProfileInput): Promise<{ providers: ProviderConnectionSummary[]; providerModels: ProviderModelSummary[]; models: AvailableModelSummary[]; roles: Record<ModelRole, string>; warnings?: string[] }> {\n this.#assertDaemonConnected();\n return this.#request(\"upsert_model_profile\", input);\n }\n\n async fetchProviderModels(input: { projectId?: ProjectId; providerId: string }): Promise<ProviderCatalogModelSummary[]> {\n this.#assertDaemonConnected();\n return (await this.#request(\"fetch_provider_models\", input)).models;\n }\n\n async removeModelProvider(input: { projectId?: ProjectId; providerId: string }): Promise<{ providers: ProviderConnectionSummary[]; providerModels: ProviderModelSummary[]; models: AvailableModelSummary[]; roles: Record<ModelRole, string>; warnings?: string[]; removed: boolean }> {\n this.#assertDaemonConnected();\n return this.#request(\"remove_model_provider\", input);\n }\n\n async getMemorySettings(input: { projectId?: ProjectId } = {}): Promise<MemorySettings> {\n this.#assertDaemonConnected();\n return (await this.#request(\"get_memory_settings\", input)).memory;\n }\n\n async getMemoryStatus(input: { projectId: ProjectId }): Promise<MemoryStatus> {\n this.#assertDaemonConnected();\n return (await this.#request(\"get_memory_status\", input)).status;\n }\n\n async upsertMemorySettings(input: UpsertMemorySettingsInput): Promise<MemorySettings> {\n this.#assertDaemonConnected();\n return (await this.#request(\"upsert_memory_settings\", input)).memory;\n }\n\n async getRuntimeSettings(input: { projectId?: ProjectId } = {}): Promise<RuntimeSettings> {\n this.#assertDaemonConnected();\n return (await this.#request(\"get_runtime_settings\", input)).runtime;\n }\n\n async upsertRuntimeSettings(input: UpsertRuntimeSettingsInput): Promise<RuntimeSettings> {\n this.#assertDaemonConnected();\n return (await this.#request(\"upsert_runtime_settings\", input)).runtime;\n }\n\n async getExtensionSettings(input: { extensionId: string }): Promise<ExtensionSettings> {\n this.#assertDaemonConnected();\n return (await this.#request(\"get_extension_settings\", input)).extension;\n }\n\n async upsertExtensionSettings(input: UpsertExtensionSettingsInput): Promise<ExtensionSettings> {\n this.#assertDaemonConnected();\n return (await this.#request(\"upsert_extension_settings\", input)).extension;\n }\n\n async listDirectories(path?: string): Promise<DirectoryListing> {\n this.#assertDaemonConnected();\n return this.#request(\"list_directories\", { path });\n }\n\n async registerProject(workDir: string): Promise<HostProject> {\n this.#assertDaemonConnected();\n return (await this.#request(\"register_project\", { workDir })).project;\n }\n\n async removeProject(projectId: ProjectId): Promise<boolean> {\n this.#assertDaemonConnected();\n return (await this.#request(\"remove_project\", { projectId })).removed;\n }\n\n #assertDaemonConnected(): void {\n if (this.#state !== \"connected\") {\n throw new Error(\"DaemonClient is not connected to a daemon\");\n }\n }\n\n async resync(anchors?: Seq | { persistentLastSeq?: Seq; streamLastSeq?: Seq }): Promise<ClientRequestMap[\"resync_events\"][\"response\"]> {\n if (!this.#sessionId) {\n throw new Error(\"DaemonClient is not connected to a session\");\n }\n const legacyFromSeq = typeof anchors === \"number\" ? anchors : undefined;\n const response = await this.#request(\"resync_events\", {\n sessionId: this.#sessionId,\n fromSeq: legacyFromSeq,\n persistentLastSeq: typeof anchors === \"object\" ? anchors.persistentLastSeq : this.#persistentLastSeq,\n streamLastSeq: typeof anchors === \"object\" ? anchors.streamLastSeq : legacyFromSeq ?? this.#streamLastSeq,\n });\n if (response.mode === \"full_reload\") {\n this.#events.length = 0;\n this.#persistentLastSeq = asSeq(0);\n }\n for (const event of response.events) {\n this.#recordEvent(event);\n for (const subscriber of this.#subscribers) {\n subscriber(event);\n }\n }\n if (response.mode === \"persistent_fallback\" || response.mode === \"full_reload\") {\n this.#persistentLastSeq = maxSeq(this.#persistentLastSeq, response.throughSeq);\n this.#streamLastSeq = maxSeq(this.#streamLastSeq, response.throughSeq);\n } else {\n this.#streamLastSeq = maxSeq(this.#streamLastSeq, response.throughSeq);\n }\n return response;\n }\n\n subscribe(handler: (event: ScorelEvent) => void): Unsubscribe {\n this.#subscribers.add(handler);\n return () => {\n this.#subscribers.delete(handler);\n };\n }\n\n getEvents(): PersistentEvent[] {\n return [...this.#events];\n }\n\n getActiveLeaf(): EventId | null {\n return this.#events.at(-1)?.id ?? null;\n }\n\n #request<TType extends ClientRequestType>(\n type: TType,\n payload: ClientRequestMap[TType][\"request\"],\n ): Promise<ClientRequestMap[TType][\"response\"]> {\n const requestId = this.#createRequestId();\n const request = {\n type,\n requestId,\n ...payload,\n } as ClientRequest<TType>;\n\n return new Promise((resolve, reject) => {\n this.#pending.set(String(requestId), { resolve, reject } as PendingRequest);\n try {\n this.#transport.send(request as ClientRequest);\n } catch (cause) {\n // Synchronous throw from transport.send (e.g. socket already\n // closed). The Promise body would auto-reject, but we drop the\n // pending entry first so a late `error` message doesn't try to\n // reject the same request twice. Map to the public marker error\n // so webui can classify it as `transport_disconnected` (S0045).\n this.#pending.delete(String(requestId));\n if (isTransportDisconnectedError(cause) || isTransportNotConnected(cause)) {\n reject(toTransportError(cause));\n } else {\n reject(cause instanceof Error ? cause : new Error(String(cause)));\n }\n }\n });\n }\n\n #handleMessage(message: DaemonMessage): void {\n switch (message.type) {\n case \"event\":\n this.#recordEvent(message.event);\n for (const subscriber of this.#subscribers) {\n subscriber(message.event);\n }\n break;\n case \"response\": {\n const pending = this.#pending.get(String(message.requestId));\n if (pending) {\n this.#pending.delete(String(message.requestId));\n pending.resolve(message.data);\n }\n break;\n }\n case \"error\": {\n if (message.requestId) {\n const pending = this.#pending.get(String(message.requestId));\n if (pending) {\n this.#pending.delete(String(message.requestId));\n pending.reject(new Error(message.message));\n }\n }\n break;\n }\n case \"connected\":\n this.#sessionId = message.sessionId ?? this.#sessionId;\n // Merge: a follow-up `connected` (e.g. duplicate ack from a server that\n // sends one manually plus the default) must not blank out identity\n // fields the first message established.\n this.#connectionIdentity = {\n deviceId: message.deviceId ?? this.#connectionIdentity.deviceId,\n deviceDisplayName:\n message.deviceDisplayName ?? this.#connectionIdentity.deviceDisplayName,\n };\n break;\n case \"disconnected\":\n this.#state = \"disconnected\";\n break;\n case \"pong\":\n break;\n }\n }\n\n #recordEvent(event: ScorelEvent): void {\n this.#streamLastSeq = maxSeq(this.#streamLastSeq, event.seq);\n if (\"id\" in event) {\n this.#persistentLastSeq = maxSeq(this.#persistentLastSeq, event.seq);\n const existingIndex = this.#events.findIndex((candidate) => candidate.id === event.id);\n if (existingIndex >= 0) {\n this.#events[existingIndex] = event;\n } else {\n this.#events.push(event);\n }\n }\n }\n}\n\nconst maxSeq = (left: Seq, right: Seq): Seq => asSeq(Math.max(Number(left), Number(right)));\n\nexport class WsTransport implements DaemonTransport {\n readonly url: string;\n readonly #token: string;\n readonly #createWebSocket: (url: string) => WebSocketLike;\n readonly #handlers = new Set<(message: DaemonMessage) => void>();\n #socket: WebSocketLike | undefined;\n\n constructor(options: WsTransportOptions) {\n this.url = options.url;\n this.#token = options.token;\n this.#createWebSocket =\n options.createWebSocket ??\n ((url) => {\n if (typeof WebSocket === \"undefined\") {\n throw new Error(\"WebSocket is not available in this runtime\");\n }\n return new WebSocket(url);\n });\n }\n\n connect(params: ConnectParams): Promise<ConnectResult> {\n return new Promise((resolve, reject) => {\n const socket = this.#createWebSocket(this.url);\n this.#socket = socket;\n const rejectOnError = (event: unknown) => {\n socket.removeEventListener(\"error\", rejectOnError);\n reject(event instanceof Error ? event : new Error(\"WebSocket connection failed\"));\n };\n socket.addEventListener(\"error\", rejectOnError, { once: true });\n socket.addEventListener(\"message\", (event) => this.#handleMessageData(event.data));\n const unsubscribe = this.onMessage((message) => {\n if (message.type === \"error\") {\n unsubscribe();\n socket.removeEventListener(\"error\", rejectOnError);\n reject(new Error(message.message));\n return;\n }\n if (message.type !== \"connected\") {\n return;\n }\n unsubscribe();\n socket.removeEventListener(\"error\", rejectOnError);\n resolve({\n clientId: message.clientId,\n sessionId: message.sessionId,\n currentSeq: message.currentSeq,\n deviceId: message.deviceId,\n deviceDisplayName: message.deviceDisplayName,\n });\n });\n socket.addEventListener(\n \"open\",\n () => {\n this.#write({ type: \"connect\", ...params, token: this.#token });\n },\n { once: true },\n );\n });\n }\n\n send(message: ClientMessage): void {\n this.#write(message);\n }\n\n onMessage(handler: (message: DaemonMessage) => void): Unsubscribe {\n this.#handlers.add(handler);\n return () => {\n this.#handlers.delete(handler);\n };\n }\n\n close(): void {\n this.#socket?.close();\n this.#socket = undefined;\n this.#handlers.clear();\n }\n\n #write(message: ClientMessage | (ConnectParams & { type: \"connect\"; token: string })): void {\n if (!this.#socket || this.#socket.readyState !== websocketOpenState) {\n throw new Error(\"WsTransport is not connected\");\n }\n this.#socket.send(JSON.stringify(message));\n }\n\n #handleMessageData(data: unknown): void {\n const text = typeof data === \"string\" ? data : data instanceof ArrayBuffer ? new TextDecoder().decode(data) : String(data);\n const message = JSON.parse(text) as DaemonMessage;\n for (const handler of this.#handlers) {\n handler(message);\n }\n }\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, readdir, realpath, rename, stat, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\n\nimport { asProjectId, type HostProject, type ProjectId } from \"@scorel/protocol\";\n\ntype ProjectRegistryFile = {\n version: 1;\n projects: HostProject[];\n};\n\nexport type ProjectRegistryOptions = {\n projectsPath: string;\n sessionsDir: string;\n createId?: () => string;\n now?: () => number;\n};\n\nexport class ProjectRegistryError extends Error {\n readonly code: \"project_not_found\" | \"project_has_sessions\" | \"filesystem_error\" | \"conflict\";\n\n constructor(code: ProjectRegistryError[\"code\"], message: string) {\n super(message);\n this.name = \"ProjectRegistryError\";\n this.code = code;\n }\n}\n\nexport class ProjectRegistry {\n readonly #projectsPath: string;\n readonly #sessionsDir: string;\n readonly #createId: () => string;\n readonly #now: () => number;\n #mutation = Promise.resolve();\n\n constructor(options: ProjectRegistryOptions) {\n this.#projectsPath = options.projectsPath;\n this.#sessionsDir = options.sessionsDir;\n this.#createId = options.createId ?? randomUUID;\n this.#now = options.now ?? Date.now;\n }\n\n async list(): Promise<HostProject[]> {\n const file = await this.#read();\n return sortProjects(file.projects);\n }\n\n async get(projectId: ProjectId): Promise<HostProject | undefined> {\n return (await this.list()).find((project) => project.projectId === projectId);\n }\n\n async require(projectId: ProjectId): Promise<HostProject> {\n const project = await this.get(projectId);\n if (!project) {\n throw new ProjectRegistryError(\"project_not_found\", `Unknown project: ${projectId}`);\n }\n return project;\n }\n\n async register(workDir: string): Promise<HostProject> {\n return this.#mutate(async (file) => {\n const canonical = await canonicalDirectory(workDir);\n const existing = file.projects.find((project) => project.workDir === canonical);\n if (existing) {\n return { result: existing, changed: false };\n }\n const now = this.#now();\n const project: HostProject = {\n projectId: asProjectId(`prj_${this.#createId()}`),\n displayName: basename(canonical) || canonical,\n workDir: canonical,\n createdAt: now,\n updatedAt: now,\n };\n file.projects.push(project);\n return { result: project, changed: true };\n });\n }\n\n async remove(projectId: ProjectId): Promise<boolean> {\n return this.#mutate(async (file) => {\n const index = file.projects.findIndex((project) => project.projectId === projectId);\n if (index < 0) {\n throw new ProjectRegistryError(\"project_not_found\", `Unknown project: ${projectId}`);\n }\n if (await sessionReferencesProject(this.#sessionsDir, projectId)) {\n throw new ProjectRegistryError(\"project_has_sessions\", `Project still has sessions: ${projectId}`);\n }\n file.projects.splice(index, 1);\n return { result: true, changed: true };\n });\n }\n\n async #mutate<TResult>(\n mutation: (file: ProjectRegistryFile) => Promise<{ result: TResult; changed: boolean }>,\n ): Promise<TResult> {\n const operation = this.#mutation.then(async () => {\n const file = await this.#read();\n const { result, changed } = await mutation(file);\n if (changed) {\n await this.#write({ version: 1, projects: sortProjects(file.projects) });\n }\n return result;\n });\n this.#mutation = operation.then(\n () => undefined,\n () => undefined,\n );\n return operation;\n }\n\n async #read(): Promise<ProjectRegistryFile> {\n try {\n const parsed = JSON.parse(await readFile(this.#projectsPath, \"utf8\")) as unknown;\n if (!isRegistryFile(parsed)) {\n throw new ProjectRegistryError(\"filesystem_error\", `Invalid project registry: ${this.#projectsPath}`);\n }\n return { version: 1, projects: parsed.projects.map((project) => ({ ...project })) };\n } catch (cause) {\n if (isNodeError(cause, \"ENOENT\")) {\n return { version: 1, projects: [] };\n }\n if (cause instanceof ProjectRegistryError) {\n throw cause;\n }\n throw new ProjectRegistryError(\"filesystem_error\", errorMessage(cause));\n }\n }\n\n async #write(file: ProjectRegistryFile): Promise<void> {\n await mkdir(dirname(this.#projectsPath), { recursive: true });\n const temporaryPath = `${this.#projectsPath}.${process.pid}.${randomUUID()}.tmp`;\n try {\n await writeFile(temporaryPath, `${JSON.stringify(file, null, 2)}\\n`, \"utf8\");\n await rename(temporaryPath, this.#projectsPath);\n } catch (cause) {\n throw new ProjectRegistryError(\"filesystem_error\", errorMessage(cause));\n }\n }\n}\n\nconst canonicalDirectory = async (workDir: string): Promise<string> => {\n try {\n const canonical = await realpath(workDir);\n if (!(await stat(canonical)).isDirectory()) {\n throw new ProjectRegistryError(\"filesystem_error\", `Project path is not a directory: ${workDir}`);\n }\n return canonical;\n } catch (cause) {\n if (cause instanceof ProjectRegistryError) {\n throw cause;\n }\n throw new ProjectRegistryError(\"filesystem_error\", errorMessage(cause));\n }\n};\n\nconst sessionReferencesProject = async (sessionsDir: string, projectId: ProjectId): Promise<boolean> => {\n let names: string[];\n try {\n names = await readdir(sessionsDir);\n } catch (cause) {\n if (isNodeError(cause, \"ENOENT\")) {\n return false;\n }\n throw new ProjectRegistryError(\"filesystem_error\", errorMessage(cause));\n }\n for (const name of names) {\n if (!name.endsWith(\".jsonl\") || name.startsWith(\".\")) {\n continue;\n }\n try {\n const firstLine = (await readFile(join(sessionsDir, name), \"utf8\")).split(/\\r?\\n/, 1)[0];\n const parsed = firstLine ? (JSON.parse(firstLine) as unknown) : undefined;\n if (isRecord(parsed) && isRecord(parsed.meta) && parsed.meta.projectId === projectId) {\n return true;\n }\n } catch (cause) {\n if (!isNodeError(cause, \"ENOENT\")) {\n throw new ProjectRegistryError(\"filesystem_error\", errorMessage(cause));\n }\n }\n }\n return false;\n};\n\nconst sortProjects = (projects: HostProject[]): HostProject[] =>\n [...projects].sort((left, right) => String(left.projectId).localeCompare(String(right.projectId)));\n\nconst isRegistryFile = (value: unknown): value is ProjectRegistryFile =>\n isRecord(value) &&\n value.version === 1 &&\n Array.isArray(value.projects) &&\n value.projects.every(\n (project) =>\n isRecord(project) &&\n typeof project.projectId === \"string\" &&\n typeof project.displayName === \"string\" &&\n typeof project.workDir === \"string\" &&\n typeof project.createdAt === \"number\" &&\n typeof project.updatedAt === \"number\",\n );\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isNodeError = (cause: unknown, code: string): boolean =>\n cause instanceof Error && \"code\" in cause && cause.code === code;\n\nconst errorMessage = (cause: unknown): string => cause instanceof Error ? cause.message : String(cause);\n", "import { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { readdir, realpath, stat } from \"node:fs/promises\";\n\nimport type { DirectoryEntry, DirectoryListing } from \"@scorel/protocol\";\n\nimport { ProjectRegistryError } from \"./registry.js\";\n\nexport const listDirectories = async (path = homedir()): Promise<DirectoryListing> => {\n try {\n const canonical = await realpath(path);\n if (!(await stat(canonical)).isDirectory()) {\n throw new ProjectRegistryError(\"filesystem_error\", `Path is not a directory: ${path}`);\n }\n const entries = await directoryEntries(canonical);\n const parent = dirname(canonical);\n return {\n path: canonical,\n parentPath: parent === canonical ? undefined : parent,\n entries,\n };\n } catch (cause) {\n if (cause instanceof ProjectRegistryError) {\n throw cause;\n }\n throw new ProjectRegistryError(\"filesystem_error\", errorMessage(cause));\n }\n};\n\nconst directoryEntries = async (path: string): Promise<DirectoryEntry[]> => {\n const entries = await readdir(path, { withFileTypes: true });\n const directories = await Promise.all(\n entries.map(async (entry): Promise<DirectoryEntry | undefined> => {\n const candidate = join(path, entry.name);\n if (!entry.isDirectory() && !entry.isSymbolicLink()) {\n return undefined;\n }\n try {\n const canonical = await realpath(candidate);\n return (await stat(canonical)).isDirectory()\n ? { name: entry.name, path: canonical, kind: \"directory\" }\n : undefined;\n } catch {\n return undefined;\n }\n }),\n );\n return directories\n .filter((entry): entry is DirectoryEntry => entry !== undefined)\n .sort((left, right) => left.name.localeCompare(right.name) || left.path.localeCompare(right.path));\n};\n\nconst errorMessage = (cause: unknown): string => cause instanceof Error ? cause.message : String(cause);\n", "import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { asProjectId, asSeq, asSessionId, type ProjectId, type SessionSummary } from \"@scorel/protocol\";\n\nexport type SessionSummaryOverrides = Map<string, { currentSeq?: number; updatedAt?: number }>;\n\nexport const listSessionSummaries = async (\n sessionsDir: string,\n filter: { projectId?: ProjectId; limit?: number } = {},\n overrides?: SessionSummaryOverrides,\n): Promise<SessionSummary[]> => {\n let names: string[];\n try {\n names = await readdir(sessionsDir);\n } catch (cause) {\n if (isNodeError(cause, \"ENOENT\")) {\n return [];\n }\n throw cause;\n }\n const sessions = (\n await Promise.all(\n names\n .filter((name) => name.endsWith(\".jsonl\") && !name.startsWith(\".\"))\n .map((name) => readSummary(join(sessionsDir, name), overrides)),\n )\n )\n .filter((session): session is SessionSummary => session !== undefined)\n .filter((session) => filter.projectId === undefined || session.projectId === filter.projectId)\n .sort((left, right) => right.updatedAt - left.updatedAt || String(left.sessionId).localeCompare(String(right.sessionId)));\n return sessions.slice(0, clampLimit(filter.limit));\n};\n\nconst readSummary = async (\n filePath: string,\n overrides?: SessionSummaryOverrides,\n): Promise<SessionSummary | undefined> => {\n let content: string;\n try {\n content = await readFile(filePath, \"utf8\");\n } catch (cause) {\n if (isNodeError(cause, \"ENOENT\")) {\n return undefined;\n }\n throw cause;\n }\n const lines = content.split(/\\r?\\n/).filter(Boolean);\n const header = parseRecord(lines[0]);\n if (\n header?.version !== 1 ||\n typeof header.sessionId !== \"string\" ||\n typeof header.createdAt !== \"number\" ||\n !isRecord(header.meta) ||\n typeof header.meta.projectId !== \"string\"\n ) {\n return undefined;\n }\n const override = overrides?.get(header.sessionId);\n const title = latestTitle(lines.slice(1)) ?? (typeof header.meta.title === \"string\" ? header.meta.title : undefined);\n return {\n sessionId: asSessionId(header.sessionId),\n projectId: asProjectId(header.meta.projectId),\n title,\n model: typeof header.meta.model === \"string\" ? header.meta.model : undefined,\n updatedAt: override?.updatedAt ?? (typeof header.meta.updatedAt === \"number\" ? header.meta.updatedAt : header.createdAt),\n currentSeq: asSeq(override?.currentSeq ?? tailSeq(lines.slice(1))),\n };\n};\n\nconst tailSeq = (lines: string[]): number => {\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const event = parseRecord(lines[index]);\n if (typeof event?.seq === \"number\") {\n return event.seq;\n }\n }\n return 0;\n};\n\nconst latestTitle = (lines: string[]): string | undefined => {\n let title: string | undefined;\n for (const line of lines) {\n const event = parseRecord(line);\n if (event?.type === \"session_title_updated\" && typeof event.title === \"string\" && event.title.trim()) {\n title = event.title.trim();\n }\n }\n return title;\n};\n\nconst clampLimit = (limit: number | undefined): number =>\n limit === undefined || !Number.isFinite(limit) || limit <= 0 ? 200 : Math.min(Math.floor(limit), 1_000);\n\nconst parseRecord = (line: string | undefined): Record<string, unknown> | undefined => {\n try {\n const value = line === undefined ? undefined : JSON.parse(line) as unknown;\n return isRecord(value) ? value : undefined;\n } catch {\n return undefined;\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isNodeError = (cause: unknown, code: string): boolean =>\n cause instanceof Error && \"code\" in cause && cause.code === code;\n", "import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport const SCOREL_CONFIG_SCHEMA = {\n fixedPaths: {\n userRoot: \"~/.scorel\",\n userConfig: \"~/.scorel/config.toml\",\n sessionsDir: \"~/.scorel/sessions\",\n },\n sections: {\n root: {\n keys: [],\n },\n provider: {\n keys: [\"type\", \"provider\", \"api\", \"baseUrl\", \"apiKeyEnv\", \"apiKey\"],\n },\n providerModel: {\n keys: [\"provider\", \"id\", \"displayName\", \"contextWindow\", \"maxTokens\", \"reasoning\", \"supportsDeveloperRole\", \"supportsImageInput\"],\n },\n availableModel: {\n keys: [\"model\", \"displayName\"],\n },\n modelProfileRoles: {\n keys: [\"primary\", \"standard\", \"auxiliary\"],\n },\n memory: {\n keys: [\"enabled\", \"daily\", \"sessionMemory\", \"autoDream\", \"promoteRoot\", \"dreamIdleMinutes\", \"autoCompactThreshold\"],\n },\n runtime: {\n keys: [\"tokenSavingRtk\"],\n },\n extension: {\n keys: [\"enabled\", \"kind\"],\n },\n extensionConfig: {\n keys: [],\n },\n },\n} as const;\n\nexport type ModelRole = \"primary\" | \"standard\" | \"auxiliary\";\n\nexport type BuiltinPiAiProviderConfig = {\n type: \"builtin\";\n provider: string;\n apiKey: string;\n baseUrl?: string;\n};\n\nexport type CustomPiAiApi = \"openai-completions\" | \"openai-responses\" | \"google-generative-ai\" | \"anthropic-messages\";\n\nexport type CustomPiAiProviderConfig = {\n type: \"custom\";\n api: CustomPiAiApi;\n provider: string;\n baseUrl: string;\n apiKey: string;\n};\n\nexport type ScorelProviderConfig = BuiltinPiAiProviderConfig | CustomPiAiProviderConfig;\n\nexport type ProviderModelConfig = {\n provider: string;\n id: string;\n displayName: string;\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsImageInput?: boolean;\n compat?: {\n supportsDeveloperRole?: boolean;\n };\n};\n\nexport type AvailableModelConfig = {\n model: string;\n displayName?: string;\n};\n\nexport type BuiltinPiAiModelConfig = BuiltinPiAiProviderConfig & {\n id: string;\n displayName?: string;\n};\n\nexport type CustomPiAiModelConfig = CustomPiAiProviderConfig & {\n id: string;\n displayName?: string;\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsImageInput?: boolean;\n compat?: {\n supportsDeveloperRole?: boolean;\n };\n};\n\nexport type ScorelConfig = {\n providers: Record<string, ScorelProviderConfig>;\n providerModels: Record<string, ProviderModelConfig>;\n models: Record<string, AvailableModelConfig>;\n modelProfile: {\n roles: Record<ModelRole, string>;\n };\n memory: MemoryConfig;\n runtime: RuntimeConfig;\n extensions: Record<string, ExtensionConfig>;\n};\n\nexport type MemoryConfig = {\n enabled: boolean;\n daily: boolean;\n sessionMemory: boolean;\n autoDream: boolean;\n promoteRoot: boolean;\n dreamIdleMinutes: number;\n autoCompactThreshold: number;\n};\n\nexport type RuntimeConfig = {\n tokenSavingRtk: boolean;\n};\n\nexport type ExtensionConfig = {\n enabled: boolean;\n kind: \"im\";\n config: Record<string, string | number | boolean>;\n};\n\nexport type ProviderConnectionSummary = {\n providerId: string;\n type: \"builtin\" | \"custom\";\n provider: string;\n api?: CustomPiAiApi;\n baseUrl?: string;\n apiKeyEnv?: string;\n credentialSource: \"env\" | \"direct\";\n credentialStatus: \"available\" | \"missing\";\n};\n\ntype ProviderProfileConfig = ProviderConnectionSummary & {\n apiKey?: string;\n};\n\nexport type ScorelConfigProfile = {\n providers: Record<string, ProviderProfileConfig>;\n providerModels: Record<string, ProviderModelConfig>;\n models: Record<string, AvailableModelConfig>;\n modelProfile: {\n roles: Record<ModelRole, string>;\n };\n memory: MemoryConfig;\n runtime: RuntimeConfig;\n extensions: Record<string, ExtensionConfig>;\n warnings?: string[];\n};\n\nexport type AvailableModelSummary = {\n modelId: string;\n providerModelId: string;\n providerId: string;\n provider: string;\n id: string;\n displayName: string;\n roles: ModelRole[];\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsDeveloperRole?: boolean;\n supportsImageInput?: boolean;\n};\n\nexport type ProviderModelSummary = {\n providerModelId: string;\n providerId: string;\n provider: string;\n id: string;\n displayName: string;\n availableModelIds: string[];\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsDeveloperRole?: boolean;\n supportsImageInput?: boolean;\n};\n\nexport type ResolvedModelSelection = {\n modelId: string;\n role?: ModelRole;\n displayName: string;\n providerId: string;\n config: BuiltinPiAiModelConfig | CustomPiAiModelConfig;\n};\n\nexport type UpsertModelProfileConfigInput = {\n providerId?: string;\n removeProviderId?: string;\n providerType?: \"builtin\" | \"custom\";\n provider?: string;\n apiKeyEnv?: string;\n apiKey?: string;\n api?: CustomPiAiApi;\n baseUrl?: string;\n modelId?: string;\n providerModelKey?: string;\n availableModelId?: string;\n addToAvailable?: boolean;\n removeAvailableModelId?: string;\n providerModelId?: string;\n displayName?: string;\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsDeveloperRole?: boolean;\n supportsImageInput?: boolean;\n roles?: Partial<Record<ModelRole, string>>;\n existingConfigText?: string;\n};\n\nexport type UpsertMemoryConfigInput = Partial<MemoryConfig> & {\n existingConfigText?: string;\n};\n\nexport type UpsertRuntimeConfigInput = Partial<RuntimeConfig> & {\n existingConfigText?: string;\n};\n\nexport type ConfigValue = string | number | boolean;\n\nexport type UpsertExtensionConfigInput = {\n extensionId: string;\n enabled?: boolean;\n kind?: \"im\";\n config?: Record<string, ConfigValue | undefined>;\n existingConfigText?: string;\n};\n\nexport const scorelUserRoot = (homeDir: string): string => join(homeDir, \".scorel\");\n\nexport const scorelUserConfigPath = (homeDir: string): string => join(scorelUserRoot(homeDir), \"config.toml\");\n\nexport const scorelSessionsDir = (homeDir: string): string => join(scorelUserRoot(homeDir), \"sessions\");\n\nexport type LoadScorelConfigOptions = {\n cwd: string;\n homeDir?: string;\n scorelHomeDir?: string;\n env?: Record<string, string | undefined>;\n};\n\ntype RawConfig = {\n providers: Record<string, {\n type?: string;\n provider?: string;\n api?: string;\n baseUrl?: string;\n apiKeyEnv?: string;\n apiKey?: string;\n }>;\n providerModels: Record<string, {\n provider?: string;\n id?: string;\n displayName?: string;\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsDeveloperRole?: boolean;\n supportsImageInput?: boolean;\n }>;\n availableModels: Record<string, {\n model?: string;\n displayName?: string;\n }>;\n modelProfile?: {\n roles?: Partial<Record<ModelRole, string>>;\n };\n memory?: Partial<MemoryConfig>;\n runtime?: Partial<RuntimeConfig>;\n extensions: Record<string, {\n enabled?: boolean;\n kind?: string;\n config?: Record<string, ConfigValue>;\n }>;\n};\n\ntype ConfigSection =\n | { kind: \"root\" }\n | { kind: \"provider\"; id: string }\n | { kind: \"providerModel\"; id: string }\n | { kind: \"availableModel\"; id: string }\n | { kind: \"modelProfileRoles\" }\n | { kind: \"memory\" }\n | { kind: \"runtime\" }\n | { kind: \"extension\"; id: string }\n | { kind: \"extensionConfig\"; id: string };\nexport const loadScorelConfig = async (options: LoadScorelConfigOptions): Promise<ScorelConfig> => {\n const env = options.env ?? process.env;\n const raw = parseToml(await readConfigText(options));\n const providers = loadProviders(raw, env);\n const providerModels = loadProviderModels(raw, providers);\n const models = loadAvailableModels(raw, providerModels);\n const roles = loadRoles(raw, models);\n\n return {\n providers,\n providerModels,\n models,\n modelProfile: { roles },\n memory: loadMemory(raw),\n runtime: loadRuntime(raw),\n extensions: loadExtensions(raw),\n };\n};\n\nexport const loadScorelConfigProfile = async (options: LoadScorelConfigOptions & { includeSecrets?: boolean }): Promise<ScorelConfigProfile> => {\n const env = options.env ?? process.env;\n const raw = parseToml(await readConfigText(options));\n const providers = loadProviderProfiles(raw, env, { includeSecrets: options.includeSecrets ?? false });\n const providerModels = loadProviderModels(raw, providers, { requireAny: false });\n const models = loadAvailableModels(raw, providerModels, { requireAny: false, includeAllProviderModels: false });\n const roles = loadRoles(raw, models, { requireComplete: false });\n\n return {\n providers,\n providerModels,\n models,\n modelProfile: { roles },\n memory: loadMemory(raw),\n runtime: loadRuntime(raw),\n extensions: loadExtensions(raw),\n };\n};\n\nexport const listProviderConnections = (config: ScorelConfig | ScorelConfigProfile): ProviderConnectionSummary[] =>\n Object.entries(config.providers).map(([providerId, provider]) => ({\n providerId,\n type: provider.type,\n provider: provider.provider,\n ...(provider.type === \"custom\" ? { api: provider.api, baseUrl: provider.baseUrl } : {}),\n ...(provider.type === \"builtin\" && provider.baseUrl ? { baseUrl: provider.baseUrl } : {}),\n ...(\"apiKeyEnv\" in provider && provider.apiKeyEnv ? { apiKeyEnv: provider.apiKeyEnv } : {}),\n credentialSource: \"credentialSource\" in provider ? provider.credentialSource : \"apiKey\" in provider ? \"direct\" : \"env\",\n credentialStatus: \"credentialStatus\" in provider ? provider.credentialStatus : \"available\",\n }));\n\nexport const listAvailableModels = (config: ScorelConfig | ScorelConfigProfile): AvailableModelSummary[] =>\n Object.entries(config.models).map(([modelId, available]) => {\n const providerModel = config.providerModels[available.model];\n if (!providerModel) {\n throw new Error(`available_models.${modelId}.model must reference a configured provider model`);\n }\n const provider = config.providers[providerModel.provider];\n if (!provider) {\n throw new Error(`provider_models.${available.model}.provider must reference a configured provider`);\n }\n return {\n modelId,\n providerModelId: available.model,\n providerId: providerModel.provider,\n provider: normalizeProviderName(provider.provider),\n id: providerModel.id,\n displayName: available.displayName ?? providerModel.displayName,\n roles: modelRoles(config, modelId),\n ...(providerModel.contextWindow !== undefined ? { contextWindow: providerModel.contextWindow } : {}),\n ...(providerModel.maxTokens !== undefined ? { maxTokens: providerModel.maxTokens } : {}),\n ...(providerModel.reasoning !== undefined ? { reasoning: providerModel.reasoning } : {}),\n ...(providerModel.compat?.supportsDeveloperRole !== undefined ? { supportsDeveloperRole: providerModel.compat.supportsDeveloperRole } : {}),\n ...(providerModel.supportsImageInput !== undefined ? { supportsImageInput: providerModel.supportsImageInput } : {}),\n };\n });\n\nexport const listProviderModels = (config: ScorelConfig | ScorelConfigProfile): ProviderModelSummary[] =>\n Object.entries(config.providerModels).map(([providerModelId, model]) => {\n const provider = config.providers[model.provider];\n if (!provider) {\n throw new Error(`provider_models.${providerModelId}.provider must reference a configured provider`);\n }\n return {\n providerModelId,\n providerId: model.provider,\n provider: normalizeProviderName(provider.provider),\n id: model.id,\n displayName: model.displayName,\n availableModelIds: Object.entries(config.models)\n .filter(([, available]) => available.model === providerModelId)\n .map(([modelId]) => modelId),\n ...(model.contextWindow !== undefined ? { contextWindow: model.contextWindow } : {}),\n ...(model.maxTokens !== undefined ? { maxTokens: model.maxTokens } : {}),\n ...(model.reasoning !== undefined ? { reasoning: model.reasoning } : {}),\n ...(model.compat?.supportsDeveloperRole !== undefined ? { supportsDeveloperRole: model.compat.supportsDeveloperRole } : {}),\n ...(model.supportsImageInput !== undefined ? { supportsImageInput: model.supportsImageInput } : {}),\n };\n });\n\nexport const resolveModelSelection = (\n config: ScorelConfig,\n selection?: { modelId?: string; role?: ModelRole },\n): ResolvedModelSelection => {\n const role = selection?.role ?? (selection?.modelId ? undefined : \"standard\");\n const modelId = selection?.modelId ?? config.modelProfile.roles[role ?? \"standard\"];\n const model = config.models[modelId];\n if (!model) {\n throw new Error(`Unknown configured model: ${modelId}`);\n }\n const providerModel = config.providerModels[model.model];\n if (!providerModel) {\n throw new Error(`available_models.${modelId}.model must reference a configured provider model`);\n }\n const provider = config.providers[providerModel.provider];\n if (!provider) {\n throw new Error(`provider_models.${model.model}.provider must reference a configured provider`);\n }\n const displayName = model.displayName ?? providerModel.displayName;\n if (provider.type === \"builtin\") {\n return {\n modelId,\n role,\n displayName,\n providerId: providerModel.provider,\n config: {\n ...provider,\n id: providerModel.id,\n displayName,\n },\n };\n }\n return {\n modelId,\n role,\n displayName,\n providerId: providerModel.provider,\n config: {\n ...provider,\n id: providerModel.id,\n displayName,\n ...(providerModel.contextWindow !== undefined ? { contextWindow: providerModel.contextWindow } : {}),\n ...(providerModel.maxTokens !== undefined ? { maxTokens: providerModel.maxTokens } : {}),\n ...(providerModel.reasoning !== undefined ? { reasoning: providerModel.reasoning } : {}),\n ...(providerModel.supportsImageInput !== undefined ? { supportsImageInput: providerModel.supportsImageInput } : {}),\n ...(providerModel.compat ? { compat: providerModel.compat } : {}),\n },\n };\n};\n\nexport const renderModelProfileConfig = (input: UpsertModelProfileConfigInput): string => {\n const raw = parseEditableConfig(input.existingConfigText);\n\n if (input.removeProviderId) {\n removeProvider(raw, requireIdentifier(input.removeProviderId, \"removeProviderId\"));\n }\n\n if (input.providerType || input.provider || input.apiKeyEnv || input.apiKey || input.api || input.baseUrl) {\n const providerId = requireIdentifier(input.providerId, \"providerId\");\n const providerType = requireProviderType(input.providerType, \"providerType\");\n const existingProvider = raw.providers[providerId];\n raw.providers[providerId] = {\n type: providerType,\n provider: normalizeProviderName(requireString(input.provider, \"provider\")),\n };\n if (input.apiKey !== undefined) {\n raw.providers[providerId].apiKey = input.apiKey ? requireString(input.apiKey, \"apiKey\") : existingProvider?.apiKey;\n } else if (existingProvider?.apiKey) {\n raw.providers[providerId].apiKey = existingProvider.apiKey;\n }\n if (input.apiKeyEnv !== undefined) {\n raw.providers[providerId].apiKeyEnv = input.apiKeyEnv ? requireString(input.apiKeyEnv, \"apiKeyEnv\") : existingProvider?.apiKeyEnv;\n } else if (existingProvider?.apiKeyEnv) {\n raw.providers[providerId].apiKeyEnv = existingProvider.apiKeyEnv;\n }\n requireProviderCredential(raw.providers[providerId], `providers.${providerId}`);\n if (providerType === \"custom\") {\n raw.providers[providerId].api = requireCustomApi(input.api, \"api\");\n raw.providers[providerId].baseUrl = stripTrailingSlashes(requireString(input.baseUrl, \"baseUrl\"));\n } else {\n delete raw.providers[providerId].api;\n if (input.baseUrl) {\n raw.providers[providerId].baseUrl = stripTrailingSlashes(input.baseUrl);\n } else {\n delete raw.providers[providerId].baseUrl;\n }\n }\n }\n\n if (input.providerModelKey || input.providerModelId || input.displayName || input.contextWindow !== undefined || input.maxTokens !== undefined || input.reasoning !== undefined || input.supportsDeveloperRole !== undefined || input.supportsImageInput !== undefined) {\n const providerId = requireIdentifier(input.providerId, \"providerId\");\n const providerModelKey = requireIdentifier(input.providerModelKey ?? `${providerId}_${input.availableModelId ?? input.modelId ?? \"main\"}`, \"providerModelKey\");\n const providerType = raw.providers[providerId]?.type ?? input.providerType;\n raw.providerModels[providerModelKey] = {\n provider: providerId,\n id: requireString(input.providerModelId, \"providerModelId\"),\n displayName: requireString(input.displayName, \"displayName\"),\n };\n if (providerType === \"custom\" && input.contextWindow !== undefined) {\n raw.providerModels[providerModelKey].contextWindow = requireNumber(input.contextWindow, \"contextWindow\");\n }\n if (providerType === \"custom\" && input.maxTokens !== undefined) {\n raw.providerModels[providerModelKey].maxTokens = requireNumber(input.maxTokens, \"maxTokens\");\n }\n if (providerType === \"custom\" && input.reasoning !== undefined) {\n raw.providerModels[providerModelKey].reasoning = requireBoolean(input.reasoning, \"reasoning\");\n }\n if (providerType === \"custom\" && input.supportsImageInput !== undefined) {\n raw.providerModels[providerModelKey].supportsImageInput = requireBoolean(input.supportsImageInput, \"supportsImageInput\");\n }\n if (providerType === \"custom\" && input.supportsDeveloperRole !== undefined) {\n raw.providerModels[providerModelKey].supportsDeveloperRole = requireBoolean(input.supportsDeveloperRole, \"supportsDeveloperRole\");\n }\n if (providerType !== \"custom\") {\n delete raw.providerModels[providerModelKey].contextWindow;\n delete raw.providerModels[providerModelKey].maxTokens;\n delete raw.providerModels[providerModelKey].reasoning;\n delete raw.providerModels[providerModelKey].supportsDeveloperRole;\n delete raw.providerModels[providerModelKey].supportsImageInput;\n }\n }\n\n if (input.addToAvailable === true || input.availableModelId || input.modelId) {\n const providerId = input.providerId ? requireIdentifier(input.providerId, \"providerId\") : undefined;\n const providerModelKey = requireIdentifier(input.providerModelKey ?? (providerId ? `${providerId}_${input.availableModelId ?? input.modelId ?? \"main\"}` : undefined), \"providerModelKey\");\n const availableModelId = requireIdentifier(input.availableModelId ?? input.modelId, \"availableModelId\");\n raw.availableModels[availableModelId] = {\n model: providerModelKey,\n ...(input.displayName ? { displayName: input.displayName } : {}),\n };\n }\n\n if (input.removeAvailableModelId) {\n const availableModelId = requireIdentifier(input.removeAvailableModelId, \"removeAvailableModelId\");\n delete raw.availableModels[availableModelId];\n if (raw.modelProfile?.roles) {\n const fallbackModelId = Object.keys(raw.availableModels).sort()[0];\n if (!fallbackModelId) {\n delete raw.modelProfile;\n } else {\n for (const role of [\"primary\", \"standard\", \"auxiliary\"] as const) {\n if (raw.modelProfile.roles[role] === availableModelId) {\n raw.modelProfile.roles[role] = fallbackModelId;\n }\n }\n }\n }\n }\n\n if (input.roles) {\n raw.modelProfile ??= {};\n raw.modelProfile.roles = {\n primary: requireIdentifier(input.roles.primary, \"roles.primary\"),\n standard: requireIdentifier(input.roles.standard, \"roles.standard\"),\n auxiliary: requireIdentifier(input.roles.auxiliary, \"roles.auxiliary\"),\n };\n } else if (!raw.modelProfile?.roles && Object.keys(raw.availableModels).length > 0) {\n const firstAvailableModel = Object.keys(raw.availableModels).sort()[0]!;\n raw.modelProfile = {\n roles: {\n primary: firstAvailableModel,\n standard: firstAvailableModel,\n auxiliary: firstAvailableModel,\n },\n };\n }\n\n return renderRawConfig(raw);\n};\n\nconst removeProvider = (raw: RawConfig, providerId: string): void => {\n delete raw.providers[providerId];\n const removedProviderModels = new Set<string>();\n for (const [providerModelId, providerModel] of Object.entries(raw.providerModels)) {\n if (providerModel.provider === providerId) {\n delete raw.providerModels[providerModelId];\n removedProviderModels.add(providerModelId);\n }\n }\n const removedAvailableModels = new Set<string>();\n for (const [availableModelId, availableModel] of Object.entries(raw.availableModels)) {\n if (availableModel.model && removedProviderModels.has(availableModel.model)) {\n delete raw.availableModels[availableModelId];\n removedAvailableModels.add(availableModelId);\n }\n }\n if (!raw.modelProfile?.roles) return;\n const fallbackModelId = Object.keys(raw.availableModels).sort()[0];\n if (!fallbackModelId) {\n delete raw.modelProfile;\n return;\n }\n for (const role of [\"primary\", \"standard\", \"auxiliary\"] as const) {\n if (!raw.modelProfile.roles[role] || removedAvailableModels.has(raw.modelProfile.roles[role])) {\n raw.modelProfile.roles[role] = fallbackModelId;\n }\n }\n};\n\nexport const renderMemoryConfig = (input: UpsertMemoryConfigInput): string => {\n const raw = parseEditableConfig(input.existingConfigText);\n raw.memory = {\n ...loadMemory(raw),\n ...(input.enabled !== undefined ? { enabled: requireBoolean(input.enabled, \"memory.enabled\") } : {}),\n ...(input.daily !== undefined ? { daily: requireBoolean(input.daily, \"memory.daily\") } : {}),\n ...(input.sessionMemory !== undefined ? { sessionMemory: requireBoolean(input.sessionMemory, \"memory.sessionMemory\") } : {}),\n ...(input.autoDream !== undefined ? { autoDream: requireBoolean(input.autoDream, \"memory.autoDream\") } : {}),\n ...(input.promoteRoot !== undefined ? { promoteRoot: requireBoolean(input.promoteRoot, \"memory.promoteRoot\") } : {}),\n ...(input.dreamIdleMinutes !== undefined ? { dreamIdleMinutes: requireNonNegativeNumber(input.dreamIdleMinutes, \"memory.dreamIdleMinutes\") } : {}),\n ...(input.autoCompactThreshold !== undefined ? { autoCompactThreshold: requireCompactThreshold(input.autoCompactThreshold) } : {}),\n };\n return renderRawConfig(raw);\n};\n\nexport const renderRuntimeConfig = (input: UpsertRuntimeConfigInput): string => {\n const raw = parseEditableConfig(input.existingConfigText);\n raw.runtime = {\n ...loadRuntime(raw),\n ...(input.tokenSavingRtk !== undefined ? { tokenSavingRtk: requireBoolean(input.tokenSavingRtk, \"runtime.tokenSavingRtk\") } : {}),\n };\n return renderRawConfig(raw);\n};\n\nexport const renderExtensionConfig = (input: UpsertExtensionConfigInput): string => {\n const raw = parseEditableConfig(input.existingConfigText);\n const extensionId = requireIdentifier(input.extensionId, \"extensionId\");\n const existing = raw.extensions[extensionId] ?? {};\n const config = { ...(existing.config ?? {}) };\n for (const [key, value] of Object.entries(input.config ?? {})) {\n if (!/^[A-Za-z0-9_-]+$/.test(key)) {\n throw new Error(`Unsupported config key: ${key}`);\n }\n if (value === undefined || value === \"\") {\n delete config[key];\n } else {\n config[key] = value;\n }\n }\n raw.extensions[extensionId] = {\n enabled: input.enabled ?? existing.enabled ?? false,\n kind: input.kind ?? (existing.kind === \"im\" ? \"im\" : \"im\"),\n ...(Object.keys(config).length > 0 ? { config } : {}),\n };\n return renderRawConfig(raw);\n};\n\nconst DEFAULT_MEMORY_CONFIG: MemoryConfig = {\n enabled: true,\n daily: true,\n sessionMemory: true,\n autoDream: true,\n promoteRoot: true,\n dreamIdleMinutes: 60,\n autoCompactThreshold: 0.8,\n};\n\nconst DEFAULT_RUNTIME_CONFIG: RuntimeConfig = {\n tokenSavingRtk: false,\n};\n\nconst loadMemory = (raw: RawConfig): MemoryConfig => ({\n enabled: raw.memory?.enabled ?? DEFAULT_MEMORY_CONFIG.enabled,\n daily: raw.memory?.daily ?? DEFAULT_MEMORY_CONFIG.daily,\n sessionMemory: raw.memory?.sessionMemory ?? DEFAULT_MEMORY_CONFIG.sessionMemory,\n autoDream: raw.memory?.autoDream ?? DEFAULT_MEMORY_CONFIG.autoDream,\n promoteRoot: raw.memory?.promoteRoot ?? DEFAULT_MEMORY_CONFIG.promoteRoot,\n dreamIdleMinutes: requireNonNegativeNumber(raw.memory?.dreamIdleMinutes ?? DEFAULT_MEMORY_CONFIG.dreamIdleMinutes, \"memory.dreamIdleMinutes\"),\n autoCompactThreshold: requireCompactThreshold(raw.memory?.autoCompactThreshold ?? DEFAULT_MEMORY_CONFIG.autoCompactThreshold),\n});\n\nconst loadRuntime = (raw: RawConfig): RuntimeConfig => ({\n tokenSavingRtk: raw.runtime?.tokenSavingRtk ?? DEFAULT_RUNTIME_CONFIG.tokenSavingRtk,\n});\n\nconst loadExtensions = (raw: RawConfig): Record<string, ExtensionConfig> => {\n const extensions: Record<string, ExtensionConfig> = {};\n for (const [extensionId, extension] of Object.entries(raw.extensions)) {\n if (extension.kind !== \"im\") {\n throw new Error(`extensions.${extensionId}.kind must be im`);\n }\n extensions[extensionId] = {\n enabled: extension.enabled === true,\n kind: \"im\",\n config: extension.config ?? {},\n };\n }\n return extensions;\n};\n\nconst loadProviders = (raw: RawConfig, env: Record<string, string | undefined>): Record<string, ScorelProviderConfig> => {\n const providers: Record<string, ScorelProviderConfig> = {};\n for (const [providerId, provider] of Object.entries(raw.providers)) {\n const apiKey = resolveProviderApiKey(provider, env, `providers.${providerId}`);\n\n if (provider.type === \"builtin\") {\n providers[providerId] = {\n type: \"builtin\",\n provider: normalizeProviderName(requireString(provider.provider, `providers.${providerId}.provider`)),\n ...(provider.baseUrl ? { baseUrl: stripTrailingSlashes(provider.baseUrl) } : {}),\n apiKey,\n };\n continue;\n }\n\n if (provider.type === \"custom\") {\n providers[providerId] = {\n type: \"custom\",\n api: requireCustomApi(provider.api, `providers.${providerId}.api`),\n provider: normalizeProviderName(requireString(provider.provider, `providers.${providerId}.provider`)),\n baseUrl: stripTrailingSlashes(requireString(provider.baseUrl, `providers.${providerId}.baseUrl`)),\n apiKey,\n };\n continue;\n }\n\n throw new Error(`providers.${providerId}.type must be builtin or custom`);\n }\n if (Object.keys(providers).length === 0) {\n throw new Error(\"at least one provider config is required\");\n }\n return providers;\n};\n\nconst loadProviderProfiles = (\n raw: RawConfig,\n env: Record<string, string | undefined>,\n options: { includeSecrets?: boolean } = {},\n): Record<string, ProviderProfileConfig> => {\n const providers: Record<string, ProviderProfileConfig> = {};\n for (const [providerId, provider] of Object.entries(raw.providers)) {\n const credential = providerCredentialSummary(provider, env);\n const base = {\n providerId,\n provider: normalizeProviderName(requireString(provider.provider, `providers.${providerId}.provider`)),\n ...credential,\n ...(options.includeSecrets && provider.apiKey ? { apiKey: provider.apiKey } : {}),\n } as const;\n\n if (provider.type === \"builtin\") {\n providers[providerId] = {\n ...base,\n type: \"builtin\",\n ...(provider.baseUrl ? { baseUrl: stripTrailingSlashes(provider.baseUrl) } : {}),\n };\n continue;\n }\n\n if (provider.type === \"custom\") {\n providers[providerId] = {\n ...base,\n type: \"custom\",\n api: requireCustomApi(provider.api, `providers.${providerId}.api`),\n baseUrl: stripTrailingSlashes(requireString(provider.baseUrl, `providers.${providerId}.baseUrl`)),\n };\n continue;\n }\n\n throw new Error(`providers.${providerId}.type must be builtin or custom`);\n }\n return providers;\n};\n\nconst loadProviderModels = (\n raw: RawConfig,\n providers: Record<string, { type: \"builtin\" | \"custom\" }>,\n options: { requireAny?: boolean } = { requireAny: true },\n): Record<string, ProviderModelConfig> => {\n const models: Record<string, ProviderModelConfig> = {};\n for (const [modelId, model] of Object.entries(raw.providerModels)) {\n const providerId = requireString(model.provider, `provider_models.${modelId}.provider`);\n const provider = providers[providerId];\n if (!provider) {\n throw new Error(`provider_models.${modelId}.provider must reference a configured provider`);\n }\n const loaded: ProviderModelConfig = {\n provider: providerId,\n id: requireString(model.id, `provider_models.${modelId}.id`),\n displayName: requireString(model.displayName, `provider_models.${modelId}.displayName`),\n };\n if (provider.type === \"custom\") {\n if (model.contextWindow !== undefined) {\n loaded.contextWindow = requireNumber(model.contextWindow, `provider_models.${modelId}.contextWindow`);\n }\n if (model.maxTokens !== undefined) {\n loaded.maxTokens = requireNumber(model.maxTokens, `provider_models.${modelId}.maxTokens`);\n }\n if (model.reasoning !== undefined) {\n loaded.reasoning = requireBoolean(model.reasoning, `provider_models.${modelId}.reasoning`);\n }\n if (model.supportsImageInput !== undefined) {\n loaded.supportsImageInput = requireBoolean(model.supportsImageInput, `provider_models.${modelId}.supportsImageInput`);\n }\n if (model.supportsDeveloperRole !== undefined) {\n loaded.compat = {\n supportsDeveloperRole: requireBoolean(model.supportsDeveloperRole, `provider_models.${modelId}.supportsDeveloperRole`),\n };\n }\n }\n models[modelId] = loaded;\n }\n if (options.requireAny !== false && Object.keys(models).length === 0) {\n throw new Error(\"at least one provider model config is required\");\n }\n return models;\n};\n\nconst loadAvailableModels = (\n raw: RawConfig,\n providerModels: Record<string, ProviderModelConfig>,\n options: { requireAny?: boolean; includeAllProviderModels?: boolean } = { requireAny: true, includeAllProviderModels: true },\n): Record<string, AvailableModelConfig> => {\n const models: Record<string, AvailableModelConfig> = {};\n if (options.includeAllProviderModels !== false && Object.keys(raw.availableModels).length === 0) {\n for (const [modelId, providerModel] of Object.entries(providerModels)) {\n models[modelId] = {\n model: modelId,\n displayName: providerModel.displayName,\n };\n }\n return models;\n }\n for (const [modelId, model] of Object.entries(raw.availableModels)) {\n const providerModelId = requireString(model.model, `available_models.${modelId}.model`);\n if (!providerModels[providerModelId]) {\n throw new Error(`available_models.${modelId}.model must reference a configured provider model`);\n }\n models[modelId] = {\n model: providerModelId,\n ...(model.displayName ? { displayName: model.displayName } : {}),\n };\n }\n if (options.requireAny !== false && Object.keys(models).length === 0) {\n throw new Error(\"at least one available model config is required\");\n }\n return models;\n};\n\nconst loadRoles = (\n raw: RawConfig,\n models: Record<string, AvailableModelConfig>,\n options: { requireComplete?: boolean } = { requireComplete: true },\n): Record<ModelRole, string> => {\n const roles = raw.modelProfile?.roles;\n if (!roles) {\n if (options.requireComplete === false) {\n return { primary: \"\", standard: \"\", auxiliary: \"\" };\n }\n throw new Error(\"model_profile.roles is required\");\n }\n if (options.requireComplete === false) {\n return {\n primary: roles.primary ? requireModelRole(roles.primary, \"primary\", models) : \"\",\n standard: roles.standard ? requireModelRole(roles.standard, \"standard\", models) : \"\",\n auxiliary: roles.auxiliary ? requireModelRole(roles.auxiliary, \"auxiliary\", models) : \"\",\n };\n }\n return {\n primary: requireModelRole(roles.primary, \"primary\", models),\n standard: requireModelRole(roles.standard, \"standard\", models),\n auxiliary: requireModelRole(roles.auxiliary, \"auxiliary\", models),\n };\n};\n\nconst readConfigText = async (options: LoadScorelConfigOptions): Promise<string> => {\n const userPath = configPathForDevice(options);\n try {\n return await readFile(userPath, \"utf8\");\n } catch (cause) {\n if (isNodeErrorCode(cause, \"ENOENT\")) {\n throw new Error(`Scorel config not found: ${userPath}`);\n }\n throw cause;\n }\n};\n\nconst configPathForDevice = (options: LoadScorelConfigOptions): string => {\n if (options.scorelHomeDir) {\n return join(options.scorelHomeDir, \"config.toml\");\n }\n const home = options.homeDir ?? process.env.HOME;\n if (!home) {\n throw new Error(\"Scorel config not found: HOME is not set\");\n }\n return scorelUserConfigPath(home);\n};\n\nconst parseToml = (text: string): RawConfig => {\n const result: RawConfig = emptyRawConfig();\n let section: ConfigSection = { kind: \"root\" };\n\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = stripComment(rawLine).trim();\n if (line.length === 0) {\n continue;\n }\n\n const sectionMatch = /^\\[([A-Za-z0-9_.-]+)\\]$/.exec(line);\n if (sectionMatch) {\n section = requireSection(sectionMatch[1] ?? \"\");\n ensureSection(result, section);\n continue;\n }\n\n const match = /^([A-Za-z0-9_-]+)\\s*=\\s*(.+?)\\s*$/.exec(line);\n if (!match) {\n throw new Error(`Unsupported config line: ${rawLine.trim()}`);\n }\n const [, key, rawValue] = match;\n if (!key || rawValue === undefined) {\n throw new Error(`Unsupported config line: ${rawLine.trim()}`);\n }\n setConfigValue(result, section, key, parseTomlValue(rawValue));\n }\n\n return result;\n};\n\nconst parseEditableConfig = (text: string | undefined): RawConfig => {\n if (!text?.trim()) {\n return emptyRawConfig();\n }\n return parseToml(text);\n};\n\nconst renderRawConfig = (raw: RawConfig): string => {\n const lines: string[] = [];\n for (const [providerId, provider] of Object.entries(raw.providers).sort(([left], [right]) => left.localeCompare(right))) {\n lines.push(`[providers.${providerId}]`);\n lines.push(`type = ${tomlString(requireProviderType(provider.type, `providers.${providerId}.type`))}`);\n lines.push(`provider = ${tomlString(normalizeProviderName(requireString(provider.provider, `providers.${providerId}.provider`)))}`);\n if (provider.type === \"custom\") {\n lines.push(`api = ${tomlString(requireCustomApi(provider.api, `providers.${providerId}.api`))}`);\n lines.push(`baseUrl = ${tomlString(stripTrailingSlashes(requireString(provider.baseUrl, `providers.${providerId}.baseUrl`)))}`);\n } else if (provider.baseUrl) {\n lines.push(`baseUrl = ${tomlString(stripTrailingSlashes(provider.baseUrl))}`);\n }\n if (provider.apiKey) {\n lines.push(`apiKey = ${tomlString(requireString(provider.apiKey, `providers.${providerId}.apiKey`))}`);\n } else {\n lines.push(`apiKeyEnv = ${tomlString(requireString(provider.apiKeyEnv, `providers.${providerId}.apiKeyEnv`))}`);\n }\n lines.push(\"\");\n }\n\n for (const [modelId, model] of Object.entries(raw.providerModels).sort(([left], [right]) => left.localeCompare(right))) {\n lines.push(`[provider_models.${modelId}]`);\n lines.push(`provider = ${tomlString(requireString(model.provider, `provider_models.${modelId}.provider`))}`);\n lines.push(`id = ${tomlString(requireString(model.id, `provider_models.${modelId}.id`))}`);\n lines.push(`displayName = ${tomlString(requireString(model.displayName, `provider_models.${modelId}.displayName`))}`);\n const provider = raw.providers[model.provider ?? \"\"];\n if (provider?.type === \"custom\" && model.contextWindow !== undefined) {\n lines.push(`contextWindow = ${requireNumber(model.contextWindow, `provider_models.${modelId}.contextWindow`)}`);\n }\n if (provider?.type === \"custom\" && model.maxTokens !== undefined) {\n lines.push(`maxTokens = ${requireNumber(model.maxTokens, `provider_models.${modelId}.maxTokens`)}`);\n }\n if (provider?.type === \"custom\" && model.reasoning !== undefined) {\n lines.push(`reasoning = ${requireBoolean(model.reasoning, `provider_models.${modelId}.reasoning`)}`);\n }\n if (provider?.type === \"custom\" && model.supportsImageInput !== undefined) {\n lines.push(`supportsImageInput = ${requireBoolean(model.supportsImageInput, `provider_models.${modelId}.supportsImageInput`)}`);\n }\n if (provider?.type === \"custom\" && model.supportsDeveloperRole !== undefined) {\n lines.push(`supportsDeveloperRole = ${requireBoolean(model.supportsDeveloperRole, `provider_models.${modelId}.supportsDeveloperRole`)}`);\n }\n lines.push(\"\");\n }\n\n for (const [modelId, model] of Object.entries(raw.availableModels).sort(([left], [right]) => left.localeCompare(right))) {\n lines.push(`[available_models.${modelId}]`);\n lines.push(`model = ${tomlString(requireString(model.model, `available_models.${modelId}.model`))}`);\n if (model.displayName) {\n lines.push(`displayName = ${tomlString(model.displayName)}`);\n }\n lines.push(\"\");\n }\n\n if (raw.modelProfile?.roles) {\n lines.push(\"[model_profile.roles]\");\n lines.push(`primary = ${tomlString(requireIdentifier(raw.modelProfile.roles.primary, \"model_profile.roles.primary\"))}`);\n lines.push(`standard = ${tomlString(requireIdentifier(raw.modelProfile.roles.standard, \"model_profile.roles.standard\"))}`);\n lines.push(`auxiliary = ${tomlString(requireIdentifier(raw.modelProfile.roles.auxiliary, \"model_profile.roles.auxiliary\"))}`);\n lines.push(\"\");\n }\n if (raw.memory) {\n const memory = loadMemory(raw);\n lines.push(\"[memory]\");\n lines.push(`enabled = ${memory.enabled}`);\n lines.push(`daily = ${memory.daily}`);\n lines.push(`sessionMemory = ${memory.sessionMemory}`);\n lines.push(`autoDream = ${memory.autoDream}`);\n lines.push(`promoteRoot = ${memory.promoteRoot}`);\n lines.push(`dreamIdleMinutes = ${memory.dreamIdleMinutes}`);\n lines.push(`autoCompactThreshold = ${memory.autoCompactThreshold}`);\n lines.push(\"\");\n }\n if (raw.runtime) {\n const runtime = loadRuntime(raw);\n lines.push(\"[runtime]\");\n lines.push(`tokenSavingRtk = ${runtime.tokenSavingRtk}`);\n lines.push(\"\");\n }\n for (const [extensionId, extension] of Object.entries(raw.extensions).sort(([left], [right]) => left.localeCompare(right))) {\n lines.push(`[extensions.${extensionId}]`);\n lines.push(`enabled = ${extension.enabled === true}`);\n lines.push(`kind = ${tomlString(extension.kind === \"im\" ? \"im\" : requireString(extension.kind, `extensions.${extensionId}.kind`))}`);\n lines.push(\"\");\n if (extension.config && Object.keys(extension.config).length > 0) {\n lines.push(`[extensions.${extensionId}.config]`);\n for (const [key, value] of Object.entries(extension.config).sort(([left], [right]) => left.localeCompare(right))) {\n lines.push(`${key} = ${renderTomlValue(value)}`);\n }\n lines.push(\"\");\n }\n }\n return lines.join(\"\\n\");\n};\n\nconst emptyRawConfig = (): RawConfig => ({\n providers: {},\n providerModels: {},\n availableModels: {},\n extensions: {},\n});\n\nconst stripComment = (line: string): string => {\n const index = line.indexOf(\"#\");\n return index === -1 ? line : line.slice(0, index);\n};\n\nconst requireString = (value: string | undefined, name: string): string => {\n if (!value) {\n throw new Error(`${name} is required`);\n }\n return value;\n};\n\nconst normalizeProviderName = (value: string): string => {\n const provider = value.split(\"/\")[0]?.trim();\n return provider || value.trim();\n};\n\nconst requireProviderCredential = (provider: { apiKeyEnv?: string; apiKey?: string }, name: string): void => {\n if (!provider.apiKeyEnv && !provider.apiKey) {\n throw new Error(`${name}.apiKeyEnv or ${name}.apiKey is required`);\n }\n};\n\nconst resolveProviderApiKey = (\n provider: { apiKeyEnv?: string; apiKey?: string },\n env: Record<string, string | undefined>,\n name: string,\n): string => {\n if (provider.apiKey) {\n return provider.apiKey;\n }\n const apiKeyEnv = requireString(provider.apiKeyEnv, `${name}.apiKeyEnv`);\n const apiKey = env[apiKeyEnv];\n if (!apiKey) {\n throw new Error(`${apiKeyEnv} is not set`);\n }\n return apiKey;\n};\n\nconst providerCredentialSummary = (\n provider: { apiKeyEnv?: string; apiKey?: string },\n env: Record<string, string | undefined>,\n): Pick<ProviderConnectionSummary, \"apiKeyEnv\" | \"credentialSource\" | \"credentialStatus\"> => {\n if (provider.apiKey) {\n return {\n credentialSource: \"direct\",\n credentialStatus: \"available\",\n };\n }\n const apiKeyEnv = provider.apiKeyEnv;\n if (!apiKeyEnv) {\n return {\n credentialSource: \"env\",\n credentialStatus: \"missing\",\n };\n }\n return {\n apiKeyEnv,\n credentialSource: \"env\",\n credentialStatus: env[apiKeyEnv] ? \"available\" : \"missing\",\n };\n};\n\nconst requireNumber = (value: number | undefined, name: string): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(`${name} is required`);\n }\n return value;\n};\n\nconst requireNonNegativeNumber = (value: number | undefined, name: string): number => {\n const number = requireNumber(value, name);\n if (number < 0) {\n throw new Error(`${name} must be non-negative`);\n }\n return number;\n};\n\nconst requireCompactThreshold = (value: number | undefined): number => {\n const number = requireNumber(value, \"memory.autoCompactThreshold\");\n if (number <= 0 || number >= 1) {\n throw new Error(\"memory.autoCompactThreshold must be greater than 0 and less than 1\");\n }\n return number;\n};\n\nconst requireBoolean = (value: boolean | undefined, name: string): boolean => {\n if (typeof value !== \"boolean\") {\n throw new Error(`${name} is required`);\n }\n return value;\n};\n\nconst requireCustomApi = (value: string | undefined, name: string): CustomPiAiApi => {\n if (\n value === \"openai-completions\" ||\n value === \"openai-responses\" ||\n value === \"google-generative-ai\" ||\n value === \"anthropic-messages\"\n ) {\n return value;\n }\n throw new Error(`${name} must be openai-completions, openai-responses, google-generative-ai, or anthropic-messages`);\n};\n\nconst requireProviderType = (value: string | undefined, name: string): \"builtin\" | \"custom\" => {\n if (value === \"builtin\" || value === \"custom\") {\n return value;\n }\n throw new Error(`${name} must be builtin or custom`);\n};\n\nconst requireSection = (section: string): ConfigSection => {\n if (section === \"root\") {\n return { kind: \"root\" };\n }\n const providerMatch = /^providers\\.([A-Za-z0-9_-]+)$/.exec(section);\n if (providerMatch?.[1]) {\n return { kind: \"provider\", id: providerMatch[1] };\n }\n const providerModelMatch = /^provider_models\\.([A-Za-z0-9_-]+)$/.exec(section);\n if (providerModelMatch?.[1]) {\n return { kind: \"providerModel\", id: providerModelMatch[1] };\n }\n const availableModelMatch = /^available_models\\.([A-Za-z0-9_-]+)$/.exec(section);\n if (availableModelMatch?.[1]) {\n return { kind: \"availableModel\", id: availableModelMatch[1] };\n }\n if (section === \"model_profile.roles\") {\n return { kind: \"modelProfileRoles\" };\n }\n if (section === \"memory\") {\n return { kind: \"memory\" };\n }\n if (section === \"runtime\") {\n return { kind: \"runtime\" };\n }\n const extensionConfigMatch = /^extensions\\.([A-Za-z0-9_-]+)\\.config$/.exec(section);\n if (extensionConfigMatch?.[1]) {\n return { kind: \"extensionConfig\", id: extensionConfigMatch[1] };\n }\n const extensionMatch = /^extensions\\.([A-Za-z0-9_-]+)$/.exec(section);\n if (extensionMatch?.[1]) {\n return { kind: \"extension\", id: extensionMatch[1] };\n }\n throw new Error(`Unsupported config section: ${section}`);\n};\n\nconst ensureSection = (config: RawConfig, section: ConfigSection): void => {\n if (section.kind === \"provider\") {\n config.providers[section.id] ??= {};\n } else if (section.kind === \"providerModel\") {\n config.providerModels[section.id] ??= {};\n } else if (section.kind === \"availableModel\") {\n config.availableModels[section.id] ??= {};\n } else if (section.kind === \"modelProfileRoles\") {\n config.modelProfile ??= {};\n config.modelProfile.roles ??= {};\n } else if (section.kind === \"memory\") {\n config.memory ??= {};\n } else if (section.kind === \"runtime\") {\n config.runtime ??= {};\n } else if (section.kind === \"extension\") {\n config.extensions[section.id] ??= {};\n } else if (section.kind === \"extensionConfig\") {\n config.extensions[section.id] ??= {};\n config.extensions[section.id].config ??= {};\n }\n};\n\nconst setConfigValue = (config: RawConfig, section: ConfigSection, key: string, value: ConfigValue): void => {\n assertKnownKey(section, key);\n if (section.kind === \"provider\") {\n config.providers[section.id] ??= {};\n setValue(config.providers[section.id], key, value);\n } else if (section.kind === \"providerModel\") {\n config.providerModels[section.id] ??= {};\n setValue(config.providerModels[section.id], key, value);\n } else if (section.kind === \"availableModel\") {\n config.availableModels[section.id] ??= {};\n setValue(config.availableModels[section.id], key, value);\n } else if (section.kind === \"modelProfileRoles\") {\n config.modelProfile ??= {};\n config.modelProfile.roles ??= {};\n setValue(config.modelProfile.roles, key, value);\n } else if (section.kind === \"memory\") {\n config.memory ??= {};\n setValue(config.memory, key, value);\n } else if (section.kind === \"runtime\") {\n config.runtime ??= {};\n setValue(config.runtime, key, value);\n } else if (section.kind === \"extension\") {\n config.extensions[section.id] ??= {};\n setValue(config.extensions[section.id], key, value);\n } else if (section.kind === \"extensionConfig\") {\n config.extensions[section.id] ??= {};\n const extensionConfig = config.extensions[section.id].config ?? {};\n config.extensions[section.id].config = extensionConfig;\n setValue(extensionConfig, key, value);\n }\n};\n\nconst assertKnownKey = (section: ConfigSection, key: string): void => {\n const schemaSection = section.kind;\n if (schemaSection === \"extensionConfig\") {\n if (!/^[A-Za-z0-9_-]+$/.test(key)) {\n throw new Error(`Unsupported config key: ${key}`);\n }\n return;\n }\n const allowed = SCOREL_CONFIG_SCHEMA.sections[schemaSection].keys;\n if (!(allowed as readonly string[]).includes(key)) {\n throw new Error(`Unsupported config key: ${key}`);\n }\n};\n\nconst setValue = (target: object, key: string, value: ConfigValue): void => {\n (target as Record<string, ConfigValue | undefined>)[key] = value;\n};\n\nconst parseTomlValue = (value: string): ConfigValue => {\n const stringMatch = /^\"([^\"]*)\"$/.exec(value);\n if (stringMatch) {\n return stringMatch[1] ?? \"\";\n }\n if (value === \"true\") {\n return true;\n }\n if (value === \"false\") {\n return false;\n }\n const number = Number(value);\n if (Number.isFinite(number)) {\n return number;\n }\n throw new Error(`Unsupported config value: ${value}`);\n};\n\nconst stripTrailingSlashes = (value: string): string => value.replace(/\\/+$/, \"\");\n\nconst requireIdentifier = (value: string | undefined, name: string): string => {\n const text = requireString(value, name);\n if (!/^[A-Za-z0-9_-]+$/.test(text)) {\n throw new Error(`${name} must contain only letters, numbers, underscores, or hyphens`);\n }\n return text;\n};\n\nconst tomlString = (value: string): string => `\"${value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"\\\"\", \"\\\\\\\"\")}\"`;\n\nconst renderTomlValue = (value: ConfigValue): string =>\n typeof value === \"string\" ? tomlString(value) : String(value);\n\nconst isNodeErrorCode = (cause: unknown, code: string): boolean =>\n typeof cause === \"object\" && cause !== null && \"code\" in cause && cause.code === code;\n\nconst requireModelRole = (\n value: string | undefined,\n role: ModelRole,\n models: Record<string, AvailableModelConfig>,\n): string => {\n const modelId = requireString(value, `model_profile.roles.${role}`);\n if (!models[modelId]) {\n throw new Error(`model_profile.roles.${role} must reference a configured model`);\n }\n return modelId;\n};\n\nconst modelRoles = (config: ScorelConfig | ScorelConfigProfile, modelId: string): ModelRole[] =>\n ([\"primary\", \"standard\", \"auxiliary\"] as const).filter((role) => config.modelProfile.roles[role] === modelId);\n", "import { createHash, randomUUID } from \"node:crypto\";\nimport { execFile } from \"node:child_process\";\nimport { mkdir, readFile, rename, rm, stat, writeFile } from \"node:fs/promises\";\nimport { userInfo } from \"node:os\";\nimport { basename, dirname, extname, isAbsolute, relative, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nimport { Type } from \"@mariozechner/pi-ai\";\n\nimport type { AgentTool, ToolResult } from \"./index.js\";\nimport { defineTool } from \"./index.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport type CodingToolsOptions = {\n cwd: string;\n defaultTimeoutMs?: number;\n maxTimeoutMs?: number;\n maxOutputBytes?: number;\n maxReadTokens?: number;\n contextWindow?: number;\n defaultShell?: string;\n toolResultArtifacts?: {\n dir: string;\n };\n tokenSaving?: {\n rtk?: {\n enabled: boolean;\n executable?: string;\n };\n };\n};\n\ntype FileReadSnapshot = {\n content: string;\n hash: string;\n mtimeMs: number;\n ranges: ReadRange[];\n size: number;\n totalLines: number;\n};\n\ntype ReadRange = {\n startLine: number;\n endLine: number;\n};\n\ntype CodingToolsState = {\n reads: Map<string, FileReadSnapshot>;\n todos: TodoItem[];\n};\n\ntype ReadArgs = {\n path: string;\n offset?: number;\n limit?: number;\n full?: boolean;\n};\n\ntype WriteArgs = {\n path: string;\n content: string;\n};\n\ntype EditArgs = {\n path: string;\n old_string: string;\n new_string: string;\n replace_all?: boolean;\n};\n\ntype BashArgs = {\n command: string;\n cwd?: string;\n timeoutMs?: number;\n maxOutputBytes?: number;\n description?: string;\n};\n\ntype GlobArgs = {\n pattern: string;\n path?: string;\n head_limit?: number;\n offset?: number;\n};\n\ntype GrepArgs = {\n pattern: string;\n path?: string;\n glob?: string;\n output_mode?: \"files\" | \"content\" | \"count\";\n before_context?: number;\n after_context?: number;\n context?: number;\n line_numbers?: boolean;\n case_insensitive?: boolean;\n type?: string;\n head_limit?: number;\n offset?: number;\n multiline?: boolean;\n};\n\ntype TodoStatus = \"pending\" | \"in_progress\" | \"completed\";\n\ntype TodoItem = {\n content: string;\n status: TodoStatus;\n activeForm?: string;\n};\n\ntype TodoWriteArgs = {\n todos: TodoItem[];\n};\n\nconst DEFAULT_SEARCH_LIMIT = 100;\nconst DEFAULT_GREP_LIMIT = 250;\nconst DEFAULT_READ_LIMIT = 2_000;\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\nconst READ_TOKEN_BUDGET_RATIO = 0.01;\nconst FULL_READ_TOKEN_BUDGET_RATIO = 0.1;\n\nexport const createCodingTools = (options: CodingToolsOptions): AgentTool[] => {\n const root = resolve(options.cwd);\n const state: CodingToolsState = { reads: new Map(), todos: [] };\n const defaultTimeoutMs = options.defaultTimeoutMs ?? 30_000;\n const maxTimeoutMs = options.maxTimeoutMs ?? 120_000;\n const maxOutputBytes = options.maxOutputBytes ?? 16_000;\n const normalReadTokens = options.maxReadTokens ?? readTokenBudget(options.contextWindow, READ_TOKEN_BUDGET_RATIO);\n const fullReadTokens = options.maxReadTokens ?? readTokenBudget(options.contextWindow, FULL_READ_TOKEN_BUDGET_RATIO);\n const defaultShell = resolveDefaultShell(options.defaultShell);\n\n const resolveWorkspacePath = (input: string): string => {\n if (input.length === 0) {\n throw new Error(\"path must not be empty\");\n }\n const candidate = isAbsolute(input) ? resolve(input) : resolve(root, input);\n if (!isWithin(root, candidate)) {\n throw new Error(`path escapes workspace: ${input}`);\n }\n return candidate;\n };\n\n const workspaceTarget = (input: string | undefined): string => {\n const target = input ? resolveWorkspacePath(input) : root;\n return relative(root, target) || \".\";\n };\n\n const assertFreshReadableCoverage = async (path: string, toolName: string): Promise<FileReadSnapshot> => {\n const snapshot = state.reads.get(path);\n if (!snapshot) {\n throw new Error(`Read must be used before ${toolName} on existing file: ${path}`);\n }\n if (!hasCompleteCoverage(snapshot.ranges, snapshot.totalLines)) {\n throw new Error(`The complete file must be read before ${toolName} on existing file: ${path}`);\n }\n const current = await snapshotFile(path);\n if (!sameSnapshot(snapshot, current)) {\n throw new Error(`File changed since last Read: ${path}`);\n }\n return snapshot;\n };\n\n return [\n defineTool({\n name: \"Read\",\n description:\n \"Read a text file from the workspace. Long reads are truncated by complete lines; accumulated coverage unlocks Write/Edit.\",\n parameters: Type.Object({\n file_path: Type.String(),\n offset: Type.Optional(Type.Number()),\n limit: Type.Optional(Type.Number()),\n full: Type.Optional(Type.Boolean()),\n }),\n execute: async (_toolCallId, args) => {\n const input = parseReadArgs(args);\n if (input.full && (input.offset !== undefined || input.limit !== undefined)) {\n throw new Error(\"full cannot be combined with offset or limit\");\n }\n const path = resolveWorkspacePath(input.path);\n assertReadableFileKind(path);\n const fileStat = await stat(path);\n if (fileStat.isDirectory()) {\n throw new Error(`Read cannot read a directory: ${input.path}. Use Glob to find files.`);\n }\n\n const buffer = await readFile(path);\n assertTextBuffer(buffer, input.path);\n const content = buffer.toString(\"utf8\");\n const lines = linesOf(content);\n const offset = input.offset ?? 1;\n const limit = input.full ? Math.max(lines.length, 1) : (input.limit ?? DEFAULT_READ_LIMIT);\n if (!Number.isInteger(offset) || offset < 1) {\n throw new Error(\"offset must be a positive integer\");\n }\n if (!Number.isInteger(limit) || limit < 1) {\n throw new Error(\"limit must be a positive integer\");\n }\n\n const startIndex = offset - 1;\n const candidate = lines.slice(startIndex, startIndex + limit);\n const tokenBudget = input.full ? fullReadTokens : normalReadTokens;\n const selected = selectCompleteLinesWithinBudget(candidate, offset, tokenBudget);\n const endLine = selected.length === 0 ? offset - 1 : offset + selected.length - 1;\n const truncated = startIndex + selected.length < lines.length;\n const nextOffset = truncated ? endLine + 1 : null;\n const current = await snapshotFile(path, content);\n const previous = state.reads.get(path);\n const previousRanges = previous && sameSnapshot(previous, current) ? previous.ranges : [];\n const currentRange = selected.length > 0 ? [{ startLine: offset, endLine }] : [];\n const ranges = mergeRanges([...previousRanges, ...currentRange]);\n const canWrite = hasCompleteCoverage(ranges, lines.length);\n state.reads.set(path, { ...current, ranges });\n\n const rendered = renderReadLines(selected, offset);\n const truncationNotice = truncated\n ? `\\n\\n[Showing lines ${offset}-${endLine}/${lines.length}. Next offset: ${nextOffset}.]`\n : \"\";\n const text = `${rendered}${truncationNotice}`;\n\n return textResult(text, {\n path,\n startLine: offset,\n endLine,\n totalLines: lines.length,\n truncated,\n nextOffset,\n size: fileStat.size,\n estimatedTokens: estimateTokens(rendered),\n tokenBudget,\n canWrite,\n });\n },\n }),\n defineTool({\n name: \"Write\",\n description:\n \"Create a new file or fully overwrite an existing file. Existing files require complete read coverage of the current file.\",\n parameters: Type.Object({\n file_path: Type.String(),\n content: Type.String(),\n }),\n execute: async (_toolCallId, args) => {\n const input = parseWriteArgs(args);\n const path = resolveWorkspacePath(input.path);\n const previous = (await exists(path)) ? await assertFreshReadableCoverage(path, \"Write\") : undefined;\n\n await mkdir(dirname(path), { recursive: true });\n await atomicWriteFile(path, input.content);\n state.reads.set(path, await snapshotFile(path, input.content, completeRanges(linesOf(input.content).length)));\n\n const type = previous ? \"update\" : \"create\";\n return textResult(\n type === \"create\" ? `File created successfully at: ${path}` : `The file ${path} has been updated successfully.`,\n {\n type,\n filePath: path,\n bytes: byteLength(input.content),\n },\n );\n },\n }),\n defineTool({\n name: \"Edit\",\n description:\n \"Perform an exact string replacement in an existing file. Requires complete read coverage and a unique old_string unless replace_all is true.\",\n parameters: Type.Object({\n file_path: Type.String(),\n old_string: Type.String(),\n new_string: Type.String(),\n replace_all: Type.Optional(Type.Boolean()),\n }),\n execute: async (_toolCallId, args) => {\n const input = parseEditArgs(args);\n const path = resolveWorkspacePath(input.path);\n await assertFreshReadableCoverage(path, \"Edit\");\n if (input.old_string === input.new_string) {\n throw new Error(\"old_string and new_string must differ\");\n }\n\n const content = await readFile(path, \"utf8\");\n const count = countOccurrences(content, input.old_string);\n if (count === 0) {\n throw new Error(`String to replace not found in file.\\nString: ${input.old_string}`);\n }\n if (count > 1 && !input.replace_all) {\n throw new Error(\n `Found ${count} matches of the string to replace, but replace_all is false. Provide more context or set replace_all to true.\\nString: ${input.old_string}`,\n );\n }\n\n const next = input.replace_all\n ? content.split(input.old_string).join(input.new_string)\n : content.replace(input.old_string, input.new_string);\n await atomicWriteFile(path, next);\n state.reads.set(path, await snapshotFile(path, next, completeRanges(linesOf(next).length)));\n return textResult(\n input.replace_all\n ? `The file ${path} has been updated. All occurrences were successfully replaced.`\n : `The file ${path} has been updated successfully.`,\n {\n filePath: path,\n replacements: input.replace_all ? count : 1,\n replaceAll: input.replace_all ?? false,\n },\n );\n },\n }),\n defineTool({\n name: \"Bash\",\n description: \"Execute a shell command in the workspace with timeout and output truncation.\",\n parameters: Type.Object({\n command: Type.String(),\n cwd: Type.Optional(Type.String()),\n timeout: Type.Optional(Type.Number()),\n description: Type.Optional(Type.String()),\n maxOutputBytes: Type.Optional(Type.Number()),\n }),\n execute: async (toolCallId, args, signal) => {\n const input = parseBashArgs(args);\n const commandCwd = input.cwd ? resolveWorkspacePath(input.cwd) : root;\n const timeoutMs = Math.min(input.timeoutMs ?? defaultTimeoutMs, maxTimeoutMs);\n const outputLimit = input.maxOutputBytes ?? maxOutputBytes;\n const rtk = options.tokenSaving?.rtk;\n const rtkCommand = await resolveRtkCommand(rtk, input.command);\n const command = rtkCommand.rewrittenCommand ?? input.command;\n const executionCommand = rtkCommand.executionCommand ?? input.command;\n const executable = defaultShell;\n const argv = shellCommandArgs(defaultShell, executionCommand);\n const rtkGainBefore = rtkCommand.applied && rtk?.executable ? await readRtkGain(rtk.executable, commandCwd) : undefined;\n const rtkResult = {\n enabled: rtk?.enabled === true,\n applied: rtkCommand.applied,\n ...(rtk?.executable ? { executable: rtk.executable } : {}),\n ...(rtkCommand.rewrittenCommand ? { rewrittenCommand: rtkCommand.rewrittenCommand } : {}),\n };\n\n try {\n const result = await execFileAsync(executable, argv, {\n cwd: commandCwd,\n timeout: timeoutMs,\n signal,\n maxBuffer: Math.max(outputLimit * 4, 1024 * 1024),\n });\n const rtkSavedTokens = rtk?.executable ? await rtkSavedTokenDelta(rtk.executable, commandCwd, rtkGainBefore) : undefined;\n return await bashResult({\n exitCode: 0,\n stdout: result.stdout,\n stderr: result.stderr,\n cwd: commandCwd,\n outputLimit,\n artifactDir: options.toolResultArtifacts?.dir,\n toolCallId,\n shell: defaultShell,\n command,\n rtk: withRtkSavings(rtkResult, rtkSavedTokens),\n });\n } catch (cause) {\n if (isTimeoutError(cause)) {\n throw new Error(`Bash command timed out after ${timeoutMs}ms`);\n }\n if (isExecError(cause)) {\n const rtkSavedTokens = rtk?.executable ? await rtkSavedTokenDelta(rtk.executable, commandCwd, rtkGainBefore) : undefined;\n return await bashResult({\n exitCode: typeof cause.code === \"number\" ? cause.code : 1,\n stdout: String(cause.stdout ?? \"\"),\n stderr: String(cause.stderr ?? cause.message),\n cwd: commandCwd,\n outputLimit,\n artifactDir: options.toolResultArtifacts?.dir,\n toolCallId,\n shell: defaultShell,\n command,\n rtk: withRtkSavings(rtkResult, rtkSavedTokens),\n });\n }\n throw cause;\n }\n },\n }),\n defineTool({\n name: \"Glob\",\n description: \"Find files by glob pattern using ripgrep file discovery.\",\n parameters: Type.Object({\n pattern: Type.String(),\n path: Type.Optional(Type.String()),\n head_limit: Type.Optional(Type.Number()),\n offset: Type.Optional(Type.Number()),\n }),\n execute: async (_toolCallId, args, signal) => {\n const input = parseGlobArgs(args);\n const limit = input.head_limit ?? DEFAULT_SEARCH_LIMIT;\n const offset = input.offset ?? 0;\n const all = (await runRipgrep([\"--files\", \"--hidden\", \"--glob\", input.pattern, ...vcsExcludes()], workspaceTarget(input.path), root, signal))\n .sort((left, right) => toWorkspaceRelative(root)(left).localeCompare(toWorkspaceRelative(root)(right)));\n const selected = paginate(all, limit, offset);\n const text = selected.items.map(toWorkspaceRelative(root)).join(\"\\n\");\n return textResult(text || \"No files found\", {\n filenames: selected.items.map(toWorkspaceRelative(root)),\n numFiles: selected.items.length,\n totalFiles: all.length,\n truncated: selected.truncated,\n ...(selected.appliedLimit !== undefined ? { appliedLimit: selected.appliedLimit } : {}),\n ...(offset > 0 ? { appliedOffset: offset } : {}),\n });\n },\n }),\n defineTool({\n name: \"Grep\",\n description:\n 'Search file contents with ripgrep. Default output_mode is \"files\" for matching paths; use \"content\" for matching lines or \"count\" for match counts.',\n parameters: Type.Object({\n pattern: Type.String(),\n path: Type.Optional(Type.String()),\n glob: Type.Optional(Type.String()),\n output_mode: Type.Optional(Type.Union([Type.Literal(\"files\"), Type.Literal(\"content\"), Type.Literal(\"count\")])),\n \"-B\": Type.Optional(Type.Number()),\n \"-A\": Type.Optional(Type.Number()),\n \"-C\": Type.Optional(Type.Number()),\n context: Type.Optional(Type.Number()),\n \"-n\": Type.Optional(Type.Boolean()),\n \"-i\": Type.Optional(Type.Boolean()),\n type: Type.Optional(Type.String()),\n head_limit: Type.Optional(Type.Number()),\n offset: Type.Optional(Type.Number()),\n multiline: Type.Optional(Type.Boolean()),\n }),\n execute: async (_toolCallId, args, signal) => {\n const input = parseGrepArgs(args);\n const mode = input.output_mode ?? \"files\";\n const limit = input.head_limit ?? DEFAULT_GREP_LIMIT;\n const offset = input.offset ?? 0;\n const rgArgs = grepArgs(input, mode);\n const raw = await runRipgrep(rgArgs, workspaceTarget(input.path), root, signal);\n\n if (mode === \"content\") {\n const selected = paginate(raw, limit, offset);\n const lines = selected.items.map(relativizeGrepLine(root));\n return textResult(formatPaginatedText(lines, selected, offset), {\n mode,\n content: lines.join(\"\\n\"),\n numLines: lines.length,\n filenames: [],\n numFiles: 0,\n ...(selected.appliedLimit !== undefined ? { appliedLimit: selected.appliedLimit } : {}),\n ...(offset > 0 ? { appliedOffset: offset } : {}),\n });\n }\n\n if (mode === \"count\") {\n const selected = paginate(raw, limit, offset);\n const lines = selected.items.map(relativizeCountLine(root));\n const counts = parseCountLines(lines);\n return textResult(formatPaginatedText(lines, selected, offset), {\n mode,\n content: lines.join(\"\\n\"),\n filenames: [],\n numFiles: counts.files,\n numMatches: counts.matches,\n ...(selected.appliedLimit !== undefined ? { appliedLimit: selected.appliedLimit } : {}),\n ...(offset > 0 ? { appliedOffset: offset } : {}),\n });\n }\n\n const sorted = await sortPathsByMtime(root, raw);\n const selected = paginate(sorted, limit, offset);\n const filenames = selected.items.map(toWorkspaceRelative(root));\n return textResult(\n filenames.length === 0\n ? \"No files found\"\n : `Found ${filenames.length} ${filenames.length === 1 ? \"file\" : \"files\"}${formatLimitSuffix(selected, offset)}\\n${filenames.join(\"\\n\")}`,\n {\n mode,\n filenames,\n numFiles: filenames.length,\n ...(selected.appliedLimit !== undefined ? { appliedLimit: selected.appliedLimit } : {}),\n ...(offset > 0 ? { appliedOffset: offset } : {}),\n },\n );\n },\n }),\n defineTool({\n name: \"TodoWrite\",\n description: \"Replace the current session todo list with a complete updated list.\",\n parameters: Type.Object({\n todos: Type.Array(\n Type.Object({\n content: Type.String(),\n status: Type.Union([Type.Literal(\"pending\"), Type.Literal(\"in_progress\"), Type.Literal(\"completed\")]),\n activeForm: Type.Optional(Type.String()),\n }),\n ),\n }),\n execute: async (_toolCallId, args) => {\n const input = parseTodoWriteArgs(args);\n const oldTodos = state.todos;\n const allDone = input.todos.length > 0 && input.todos.every((todo) => todo.status === \"completed\");\n state.todos = allDone ? [] : input.todos;\n const message = allDone\n ? \"Todos have been modified successfully. All items are completed, so the current todo list has been cleared.\"\n : \"Todos have been modified successfully. Continue using the todo list to track progress.\";\n return textResult(message, { oldTodos, currentTodos: state.todos });\n },\n }),\n ];\n};\n\nconst parseReadArgs = (args: unknown): ReadArgs => {\n const input = expectRecord(args);\n return {\n path: expectPath(input),\n offset: optionalNumber(input.offset, \"offset\"),\n limit: optionalNumber(input.limit, \"limit\"),\n full: optionalBoolean(input.full, \"full\"),\n };\n};\n\nconst parseWriteArgs = (args: unknown): WriteArgs => {\n const input = expectRecord(args);\n return {\n path: expectPath(input),\n content: expectString(input.content, \"content\"),\n };\n};\n\nconst parseEditArgs = (args: unknown): EditArgs => {\n const input = expectRecord(args);\n return {\n path: expectPath(input),\n old_string: expectString(input.old_string, \"old_string\"),\n new_string: expectString(input.new_string, \"new_string\"),\n replace_all: optionalBoolean(input.replace_all, \"replace_all\"),\n };\n};\n\nconst parseBashArgs = (args: unknown): BashArgs => {\n const input = expectRecord(args);\n return {\n command: expectString(input.command, \"command\"),\n cwd: optionalString(input.cwd, \"cwd\"),\n timeoutMs: optionalNumber(input.timeoutMs ?? input.timeout, \"timeout\"),\n maxOutputBytes: optionalNumber(input.maxOutputBytes, \"maxOutputBytes\"),\n description: optionalString(input.description, \"description\"),\n };\n};\n\nconst parseGlobArgs = (args: unknown): GlobArgs => {\n const input = expectRecord(args);\n return {\n pattern: expectString(input.pattern, \"pattern\"),\n path: optionalString(input.path ?? input.cwd, \"path\"),\n head_limit: optionalNumber(input.head_limit ?? input.maxResults, \"head_limit\"),\n offset: optionalNumber(input.offset, \"offset\"),\n };\n};\n\nconst parseGrepArgs = (args: unknown): GrepArgs => {\n const input = expectRecord(args);\n const outputMode = optionalString(input.output_mode ?? input.outputMode, \"output_mode\");\n if (\n outputMode !== undefined &&\n outputMode !== \"files\" &&\n outputMode !== \"content\" &&\n outputMode !== \"count\"\n ) {\n throw new Error(\"output_mode must be files, content, or count\");\n }\n return {\n pattern: expectString(input.pattern, \"pattern\"),\n path: optionalString(input.path ?? input.cwd, \"path\"),\n glob: optionalString(input.glob, \"glob\"),\n output_mode: outputMode,\n before_context: optionalNumber(input[\"-B\"], \"-B\"),\n after_context: optionalNumber(input[\"-A\"], \"-A\"),\n context: optionalNumber(input.context ?? input[\"-C\"], \"context\"),\n line_numbers: optionalBoolean(input[\"-n\"], \"-n\"),\n case_insensitive: optionalBoolean(input[\"-i\"] ?? input.case_insensitive, \"-i\"),\n type: optionalString(input.type, \"type\"),\n head_limit: optionalNumber(input.head_limit ?? input.maxResults, \"head_limit\"),\n offset: optionalNumber(input.offset, \"offset\"),\n multiline: optionalBoolean(input.multiline, \"multiline\"),\n };\n};\n\nconst parseTodoWriteArgs = (args: unknown): TodoWriteArgs => {\n const input = expectRecord(args);\n if (!Array.isArray(input.todos)) {\n throw new Error(\"todos must be an array\");\n }\n const todos = input.todos.map(parseTodoItem);\n const inProgressCount = todos.filter((todo) => todo.status === \"in_progress\").length;\n if (inProgressCount > 1) {\n throw new Error(\"TodoWrite allows at most one in_progress item\");\n }\n return { todos };\n};\n\nconst parseTodoItem = (value: unknown): TodoItem => {\n const input = expectRecord(value);\n const status = expectString(input.status, \"status\");\n if (status !== \"pending\" && status !== \"in_progress\" && status !== \"completed\") {\n throw new Error(\"status must be pending, in_progress, or completed\");\n }\n return {\n content: expectString(input.content, \"content\"),\n status,\n activeForm: optionalString(input.activeForm, \"activeForm\"),\n };\n};\n\nconst expectRecord = (value: unknown): Record<string, unknown> => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(\"tool args must be an object\");\n }\n return value as Record<string, unknown>;\n};\n\nconst expectPath = (input: Record<string, unknown>): string => expectString(input.file_path ?? input.path, \"file_path\");\n\nconst expectString = (value: unknown, name: string): string => {\n if (typeof value !== \"string\") {\n throw new Error(`${name} must be a string`);\n }\n return value;\n};\n\nconst optionalString = (value: unknown, name: string): string | undefined => {\n if (value === undefined) {\n return undefined;\n }\n return expectString(value, name);\n};\n\nconst optionalNumber = (value: unknown, name: string): number | undefined => {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(`${name} must be a finite number`);\n }\n return value;\n};\n\nconst optionalBoolean = (value: unknown, name: string): boolean | undefined => {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"boolean\") {\n throw new Error(`${name} must be a boolean`);\n }\n return value;\n};\n\nconst snapshotFile = async (path: string, content?: string, ranges?: ReadRange[]): Promise<FileReadSnapshot> => {\n const [fileStat, fileContent] = await Promise.all([stat(path), content ?? readFile(path, \"utf8\")]);\n const totalLines = linesOf(fileContent).length;\n return {\n content: fileContent,\n hash: createHash(\"sha256\").update(fileContent).digest(\"hex\"),\n mtimeMs: fileStat.mtimeMs,\n ranges: ranges ?? [],\n size: fileStat.size,\n totalLines,\n };\n};\n\nconst sameSnapshot = (left: FileReadSnapshot, right: FileReadSnapshot): boolean =>\n left.hash === right.hash && left.size === right.size && left.mtimeMs === right.mtimeMs;\n\nconst exists = async (path: string): Promise<boolean> => {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n};\n\nconst isWithin = (root: string, path: string): boolean => {\n const rel = relative(root, path);\n return rel === \"\" || (!rel.startsWith(\"..\") && !isAbsolute(rel));\n};\n\nconst linesOf = (content: string): string[] => {\n const lines = content.split(/\\r?\\n/);\n if (lines.at(-1) === \"\") {\n lines.pop();\n }\n return lines;\n};\n\nconst IMAGE_EXTENSIONS = new Set([\".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\", \".bmp\", \".tiff\", \".ico\"]);\nconst DOCUMENT_EXTENSIONS = new Set([\".pdf\", \".doc\", \".docx\", \".ppt\", \".pptx\", \".xls\", \".xlsx\"]);\nconst BINARY_EXTENSIONS = new Set([\n \".zip\",\n \".tar\",\n \".gz\",\n \".bz2\",\n \".xz\",\n \".7z\",\n \".rar\",\n \".dmg\",\n \".pkg\",\n \".exe\",\n \".dll\",\n \".so\",\n \".dylib\",\n \".class\",\n \".jar\",\n \".wasm\",\n \".pyc\",\n \".sqlite\",\n \".db\",\n]);\n\nconst assertReadableFileKind = (path: string): void => {\n const ext = extname(path).toLowerCase();\n if (IMAGE_EXTENSIONS.has(ext)) {\n throw new Error(`Read does not yet support image files (${ext}). A dedicated image Read path is planned; do not read this file as text.`);\n }\n if (DOCUMENT_EXTENSIONS.has(ext)) {\n throw new Error(`Read does not yet support document files (${ext}). PDF/page and document-aware Read support is planned; do not read this file as text.`);\n }\n if (BINARY_EXTENSIONS.has(ext)) {\n throw new Error(`Read cannot read binary files (${ext}). Use an appropriate binary/document tool instead.`);\n }\n};\n\nconst assertTextBuffer = (buffer: Buffer, path: string): void => {\n if (buffer.includes(0)) {\n throw new Error(`Read cannot read binary file as text: ${path}`);\n }\n const decoded = buffer.toString(\"utf8\");\n const replacementChars = decoded.match(/\\uFFFD/g)?.length ?? 0;\n if (replacementChars > 0 && replacementChars / Math.max(decoded.length, 1) > 0.01) {\n throw new Error(`Read cannot safely decode file as UTF-8 text: ${path}`);\n }\n};\n\nconst selectCompleteLinesWithinBudget = (\n lines: string[],\n offset: number,\n maxTokens: number,\n): string[] => {\n let selected = lines;\n while (selected.length > 0 && estimateTokens(renderReadLines(selected, offset)) > maxTokens) {\n selected = selected.slice(0, -1);\n }\n if (selected.length === 0 && lines.length > 0) {\n throw new Error(\n `Line ${offset} exceeds Read output token budget (${maxTokens} estimated tokens). Use Grep or a more specific tool; Read will not return partial lines.`,\n );\n }\n return selected;\n};\n\nconst estimateTokens = (value: string): number => Math.ceil(value.length / 3);\n\nconst renderReadLines = (lines: string[], offset: number): string =>\n lines.map((line, index) => `${String(offset + index).padStart(6, \" \")}\\t${line}`).join(\"\\n\");\n\nconst readTokenBudget = (contextWindow: number | undefined, ratio: number): number => {\n const window = contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n if (!Number.isFinite(window) || window <= 0) {\n return Math.max(1, Math.floor(DEFAULT_CONTEXT_WINDOW * ratio));\n }\n return Math.max(1, Math.floor(window * ratio));\n};\n\nconst completeRanges = (totalLines: number): ReadRange[] => (totalLines === 0 ? [] : [{ startLine: 1, endLine: totalLines }]);\n\nconst hasCompleteCoverage = (ranges: ReadRange[], totalLines: number): boolean => {\n if (totalLines === 0) {\n return true;\n }\n const merged = mergeRanges(ranges);\n return merged.length === 1 && merged[0]?.startLine === 1 && merged[0].endLine >= totalLines;\n};\n\nconst mergeRanges = (ranges: ReadRange[]): ReadRange[] => {\n const sorted = ranges\n .filter((range) => range.startLine <= range.endLine)\n .sort((left, right) => left.startLine - right.startLine || left.endLine - right.endLine);\n const merged: ReadRange[] = [];\n for (const range of sorted) {\n const last = merged.at(-1);\n if (!last || range.startLine > last.endLine + 1) {\n merged.push({ ...range });\n continue;\n }\n last.endLine = Math.max(last.endLine, range.endLine);\n }\n return merged;\n};\n\nconst countOccurrences = (content: string, needle: string): number => {\n if (needle.length === 0) {\n throw new Error(\"old_string must not be empty\");\n }\n let count = 0;\n let index = 0;\n while (true) {\n const found = content.indexOf(needle, index);\n if (found === -1) {\n return count;\n }\n count += 1;\n index = found + needle.length;\n }\n};\n\nconst atomicWriteFile = async (path: string, content: string): Promise<void> => {\n const temp = resolve(dirname(path), `.${randomUUID()}.tmp`);\n try {\n await writeFile(temp, content, \"utf8\");\n await rename(temp, path);\n } catch (cause) {\n await rm(temp, { force: true }).catch(() => undefined);\n throw cause;\n }\n};\n\nconst bashResult = async (input: {\n exitCode: number;\n stdout: string;\n stderr: string;\n cwd: string;\n outputLimit: number;\n artifactDir?: string;\n toolCallId: string;\n shell?: string;\n command?: string;\n rtk?: {\n enabled: boolean;\n applied: boolean;\n executable?: string;\n rewrittenCommand?: string;\n estimatedSavedTokens?: number;\n };\n}): Promise<ToolResult> => {\n const stdoutBytes = Buffer.byteLength(input.stdout);\n const stderrBytes = Buffer.byteLength(input.stderr);\n const fullResult = renderFullBashResult(input);\n const resultBytes = Buffer.byteLength(fullResult);\n const shouldArchive = Boolean(input.artifactDir) && resultBytes > input.outputLimit;\n const artifactPath = shouldArchive && input.artifactDir\n ? await writeBashArtifact(input.artifactDir, input.toolCallId, fullResult)\n : undefined;\n const projection = artifactPath\n ? projectBashStreams(input.stdout, input.stderr, input.outputLimit)\n : undefined;\n const stdout = projection?.stdout ?? truncate(input.stdout, input.outputLimit, \"stdout\");\n const stderr = projection?.stderr ?? truncate(input.stderr, input.outputLimit, \"stderr\");\n const text = artifactPath\n ? [\n `exitCode: ${input.exitCode}`,\n `cwd: ${input.cwd}`,\n `artifact: ${artifactPath}`,\n `resultBytes: ${resultBytes}`,\n `stdoutBytes: ${stdoutBytes}`,\n `stderrBytes: ${stderrBytes}`,\n ...(projection?.lines ?? []),\n ].join(\"\\n\")\n : `exitCode: ${input.exitCode}\\ncwd: ${input.cwd}\\nstdout:\\n${stdout}\\nstderr:\\n${stderr}`;\n return textResult(text, {\n exitCode: input.exitCode,\n cwd: input.cwd,\n ...(artifactPath ? {\n artifact: {\n path: artifactPath,\n resultBytes,\n stdoutBytes,\n stderrBytes,\n },\n } : {}),\n ...(input.shell ? { shell: input.shell } : {}),\n ...(input.command ? { command: input.command } : {}),\n ...(input.rtk ? {\n rtk: {\n ...input.rtk,\n estimatedOutputTokens: estimateTokens(`${stdout}\\n${stderr}`),\n },\n } : {}),\n });\n};\n\nconst renderFullBashResult = (input: { exitCode: number; cwd: string; stdout: string; stderr: string }): string =>\n `exitCode: ${input.exitCode}\\ncwd: ${input.cwd}\\nstdout:\\n${input.stdout}\\nstderr:\\n${input.stderr}`;\n\nconst writeBashArtifact = async (artifactDir: string, toolCallId: string, content: string): Promise<string> => {\n const directory = resolve(artifactDir, safeArtifactSegment(toolCallId));\n await mkdir(directory, { recursive: true });\n const path = resolve(directory, \"result.txt\");\n await writeFile(path, content, { encoding: \"utf8\", mode: 0o600 });\n return path;\n};\n\nconst safeArtifactSegment = (value: string): string =>\n value.replace(/[^A-Za-z0-9._-]/g, \"_\").slice(0, 120) || \"tool_call\";\n\nconst projectBashStreams = (\n stdout: string,\n stderr: string,\n maxBytes: number,\n): { lines: string[]; stdout: string; stderr: string } => {\n const streams = [\n { label: \"stdout\", value: stdout },\n { label: \"stderr\", value: stderr },\n ].filter((stream) => Buffer.byteLength(stream.value) > 0);\n if (streams.length === 0) {\n return { lines: [\"stdout:\", \"\", \"stderr:\", \"\"], stdout: \"\", stderr: \"\" };\n }\n const perStreamBudget = Math.max(1, Math.floor(maxBytes / streams.length));\n const projected = streams.map((stream) => projectOutputStream(stream.value, perStreamBudget, stream.label));\n const stdoutText = projected.find((stream) => stream.label === \"stdout\")?.text ?? \"stdout:\\n\";\n const stderrText = projected.find((stream) => stream.label === \"stderr\")?.text ?? \"stderr:\\n\";\n return {\n lines: projected.map((stream) => stream.text),\n stdout: stdoutText,\n stderr: stderrText,\n };\n};\n\nconst projectOutputStream = (value: string, maxBytes: number, label: string): { label: string; text: string } => {\n const bytes = Buffer.byteLength(value);\n if (bytes <= maxBytes) {\n return { label, text: `${label}:\\n${value}` };\n }\n const headBytes = Math.max(1, Math.floor(maxBytes / 2));\n const tailBytes = Math.max(1, maxBytes - headBytes);\n return {\n label,\n text: [\n `${label} head:`,\n sliceBytes(value, 0, headBytes),\n `${label} tail:`,\n sliceBytes(value, Math.max(0, bytes - tailBytes), bytes),\n `[${label} archived: ${bytes} bytes; projection budget ${maxBytes} bytes]`,\n ].join(\"\\n\"),\n };\n};\n\nconst resolveDefaultShell = (input: string | undefined): string => {\n const shell = input || process.env.SHELL || userShell() || \"/bin/sh\";\n return shell.trim() || \"/bin/sh\";\n};\n\nconst resolveRtkCommand = async (\n rtk: NonNullable<CodingToolsOptions[\"tokenSaving\"]>[\"rtk\"] | undefined,\n command: string,\n): Promise<{ applied: boolean; rewrittenCommand?: string; executionCommand?: string }> => {\n if (rtk?.enabled !== true || typeof rtk.executable !== \"string\" || rtk.executable.length === 0) {\n return { applied: false };\n }\n try {\n const result = await execFileAsync(rtk.executable, [\"rewrite\", command], {\n timeout: 5_000,\n maxBuffer: 1024 * 1024,\n });\n return rtkRewriteResult(result.stdout, rtk.executable);\n } catch (cause) {\n if (isExecError(cause) && typeof cause.stdout === \"string\") {\n return rtkRewriteResult(cause.stdout, rtk.executable);\n }\n return { applied: false };\n }\n};\n\nconst rtkRewriteResult = (\n stdout: string,\n executable: string,\n): { applied: boolean; rewrittenCommand?: string; executionCommand?: string } => {\n const rewrittenCommand = stdout.trim();\n return rewrittenCommand\n ? { applied: true, rewrittenCommand, executionCommand: executableRewriteCommand(rewrittenCommand, executable) }\n : { applied: false };\n};\n\nconst executableRewriteCommand = (command: string, executable: string): string =>\n command.replace(/^rtk(?=\\s|$)/, shellQuote(executable));\n\nconst readRtkGain = async (rtkExecutable: string, cwd: string): Promise<{ savedTokens: number } | undefined> => {\n try {\n const { stdout } = await execFileAsync(rtkExecutable, [\"gain\", \"--project\", \"--format\", \"json\"], {\n cwd,\n timeout: 5_000,\n maxBuffer: 5_000_000,\n });\n const parsed = JSON.parse(stdout) as unknown;\n if (!isRecord(parsed) || !isRecord(parsed.summary)) {\n return undefined;\n }\n return { savedTokens: nonNegativeInteger(parsed.summary.total_saved) };\n } catch {\n return undefined;\n }\n};\n\nconst rtkSavedTokenDelta = async (\n rtkExecutable: string,\n cwd: string,\n before: { savedTokens: number } | undefined,\n): Promise<number | undefined> => {\n if (!before) {\n return undefined;\n }\n const after = await readRtkGain(rtkExecutable, cwd);\n if (!after) {\n return undefined;\n }\n return Math.max(0, after.savedTokens - before.savedTokens);\n};\n\nconst withRtkSavings = <T extends { applied: boolean }>(rtk: T, savedTokens: number | undefined): T & { estimatedSavedTokens?: number } => ({\n ...rtk,\n ...(rtk.applied && savedTokens !== undefined ? { estimatedSavedTokens: savedTokens } : {}),\n});\n\nconst nonNegativeInteger = (value: unknown): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return 0;\n }\n return Math.floor(value);\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst shellQuote = (value: string): string =>\n `'${value.replace(/'/g, \"'\\\\''\")}'`;\n\nconst shellCommandArgs = (shell: string, command: string): string[] => {\n const name = basename(shell).toLowerCase();\n if (name === \"csh\" || name === \"tcsh\" || name === \"fish\") {\n return [\"-c\", command];\n }\n return [\"-lc\", command];\n};\n\nconst userShell = (): string | undefined => {\n try {\n return userInfo().shell ?? undefined;\n } catch {\n return undefined;\n }\n};\n\nconst truncate = (value: string, maxBytes: number, label: string): string => {\n const bytes = Buffer.byteLength(value);\n if (bytes <= maxBytes) {\n return value;\n }\n const truncated = sliceBytes(value, 0, maxBytes);\n return `${truncated}\\n[${label} truncated: ${bytes} bytes > ${maxBytes} bytes]`;\n};\n\nconst sliceBytes = (value: string, start: number, end: number): string =>\n Buffer.from(value).subarray(start, end).toString(\"utf8\");\n\nconst textResult = (text: string, details?: unknown): ToolResult => ({\n content: [{ type: \"text\", text }],\n details,\n});\n\nconst byteLength = (value: string): number => Buffer.byteLength(value);\n\nconst isTimeoutError = (cause: unknown): boolean =>\n typeof cause === \"object\" &&\n cause !== null &&\n (\"killed\" in cause || \"signal\" in cause) &&\n ((cause as { killed?: unknown }).killed === true || (cause as { signal?: unknown }).signal === \"SIGTERM\");\n\nconst isExecError = (cause: unknown): cause is Error & { code?: number | string; stdout?: string; stderr?: string } =>\n cause instanceof Error && (\"stdout\" in cause || \"stderr\" in cause || \"code\" in cause);\n\nconst runRipgrep = async (args: string[], target: string, cwd: string, signal: AbortSignal): Promise<string[]> => {\n try {\n const result = await execFileAsync(\"rg\", [...args, target], {\n cwd,\n signal,\n maxBuffer: 20_000_000,\n });\n return splitOutput(result.stdout);\n } catch (cause) {\n if (isExecError(cause) && cause.code === 1) {\n return [];\n }\n if (isExecError(cause) && typeof cause.stdout === \"string\" && cause.stdout.trim().length > 0) {\n return splitOutput(cause.stdout);\n }\n const message = cause instanceof Error ? cause.message : String(cause);\n throw new Error(`ripgrep failed: ${message}`);\n }\n};\n\nconst splitOutput = (output: string): string[] =>\n output\n .trim()\n .split(\"\\n\")\n .map((line) => line.replace(/\\r$/, \"\"))\n .filter(Boolean);\n\nconst vcsExcludes = (): string[] =>\n [\".git\", \".svn\", \".hg\", \".bzr\", \".jj\", \".sl\"].flatMap((dir) => [\"--glob\", `!${dir}`]);\n\nconst grepArgs = (input: GrepArgs, mode: NonNullable<GrepArgs[\"output_mode\"]>): string[] => {\n const args = [\"--hidden\", \"--max-columns\", \"500\", ...vcsExcludes()];\n if (input.multiline) {\n args.push(\"-U\", \"--multiline-dotall\");\n }\n if (input.case_insensitive) {\n args.push(\"-i\");\n }\n if (mode === \"files\") {\n args.push(\"-l\");\n } else if (mode === \"count\") {\n args.push(\"-c\");\n } else {\n if (input.line_numbers ?? true) {\n args.push(\"-n\");\n }\n if (input.context !== undefined) {\n args.push(\"-C\", String(input.context));\n } else {\n if (input.before_context !== undefined) {\n args.push(\"-B\", String(input.before_context));\n }\n if (input.after_context !== undefined) {\n args.push(\"-A\", String(input.after_context));\n }\n }\n }\n if (input.type) {\n args.push(\"--type\", input.type);\n }\n if (input.glob) {\n for (const pattern of splitGlobPatterns(input.glob)) {\n args.push(\"--glob\", pattern);\n }\n }\n if (input.pattern.startsWith(\"-\")) {\n args.push(\"-e\", input.pattern);\n } else {\n args.push(input.pattern);\n }\n return args;\n};\n\nconst splitGlobPatterns = (value: string): string[] =>\n value\n .split(/\\s+/)\n .flatMap((part) => (part.includes(\"{\") && part.includes(\"}\") ? [part] : part.split(\",\")))\n .filter(Boolean);\n\nconst paginate = <T>(items: T[], limit: number, offset: number): { items: T[]; truncated: boolean; appliedLimit?: number } => {\n if (!Number.isInteger(limit) || limit < 0) {\n throw new Error(\"head_limit must be a non-negative integer\");\n }\n if (!Number.isInteger(offset) || offset < 0) {\n throw new Error(\"offset must be a non-negative integer\");\n }\n if (limit === 0) {\n return { items: items.slice(offset), truncated: false };\n }\n const selected = items.slice(offset, offset + limit);\n const truncated = items.length - offset > limit;\n return {\n items: selected,\n truncated,\n ...(truncated ? { appliedLimit: limit } : {}),\n };\n};\n\nconst toWorkspaceRelative = (root: string): ((path: string) => string) => (path) => {\n const absolute = isAbsolute(path) ? path : resolve(root, path);\n return relative(root, absolute) || \".\";\n};\n\nconst relativizeGrepLine = (root: string): ((line: string) => string) => (line) => {\n const colon = line.indexOf(\":\");\n if (colon <= 0) {\n return line;\n }\n const file = line.slice(0, colon);\n const rest = line.slice(colon);\n return `${toWorkspaceRelative(root)(file)}${rest}`;\n};\n\nconst relativizeCountLine = (root: string): ((line: string) => string) => (line) => {\n const colon = line.lastIndexOf(\":\");\n if (colon <= 0) {\n return line;\n }\n const file = line.slice(0, colon);\n const rest = line.slice(colon);\n return `${toWorkspaceRelative(root)(file)}${rest}`;\n};\n\nconst sortPathsByMtime = async (root: string, paths: string[]): Promise<string[]> => {\n const entries = await Promise.all(\n paths.map(async (path) => {\n try {\n const info = await stat(isAbsolute(path) ? path : resolve(root, path));\n return { path, mtimeMs: info.mtimeMs };\n } catch {\n return { path, mtimeMs: 0 };\n }\n }),\n );\n return entries\n .sort((left, right) => {\n const time = right.mtimeMs - left.mtimeMs;\n return time === 0 ? left.path.localeCompare(right.path) : time;\n })\n .map((entry) => entry.path);\n};\n\nconst formatPaginatedText = <T>(lines: string[], page: { appliedLimit?: number }, offset: number): string => {\n const body = lines.length > 0 ? lines.join(\"\\n\") : \"No matches found\";\n const suffix = formatLimitSuffix(page, offset);\n return suffix ? `${body}\\n\\n[Showing results with pagination =${suffix}]` : body;\n};\n\nconst formatLimitSuffix = <T>(page: { appliedLimit?: number }, offset: number): string => {\n const parts = [];\n if (page.appliedLimit !== undefined) {\n parts.push(`limit: ${page.appliedLimit}`);\n }\n if (offset > 0) {\n parts.push(`offset: ${offset}`);\n }\n return parts.length > 0 ? ` ${parts.join(\", \")}` : \"\";\n};\n\nconst parseCountLines = (lines: string[]): { files: number; matches: number } => {\n let files = 0;\n let matches = 0;\n for (const line of lines) {\n const colon = line.lastIndexOf(\":\");\n if (colon <= 0) {\n continue;\n }\n const count = Number.parseInt(line.slice(colon + 1), 10);\n if (Number.isFinite(count)) {\n files += 1;\n matches += count;\n }\n }\n return { files, matches };\n};\n", "import { Type, type TSchema } from \"@mariozechner/pi-ai\";\n\nimport type { ContentBlock, EventId } from \"@scorel/protocol\";\n\nexport type ToolResult = {\n content: ContentBlock[];\n details?: unknown;\n};\n\nexport type AgentTool = {\n name: string;\n description: string;\n parameters: TSchema;\n execute: (\n toolCallId: string,\n args: unknown,\n signal: AbortSignal,\n onUpdate: (partial: unknown) => void,\n ) => Promise<ToolResult>;\n};\n\nexport const defineTool = (tool: AgentTool): AgentTool => tool;\n\nexport type SnipToolInput = {\n userMessageId: string;\n reason?: string;\n};\n\nexport type SnipToolResult = {\n anchorUserEventId: EventId;\n throughEventId: EventId;\n hiddenEventCount: number;\n};\n\nexport const createSnipTool = (options: {\n snip(input: SnipToolInput): Promise<SnipToolResult>;\n}): AgentTool =>\n defineTool({\n name: \"snip\",\n description: [\n \"Hide a completed user turn from future model context.\",\n \"Use only when an earlier user turn is obsolete or noisy.\",\n \"The session JSONL evidence is preserved; the hidden turn disappears from the next context build.\",\n \"Input: { userMessageId: string, reason?: string }.\",\n ].join(\" \"),\n parameters: Type.Object({\n userMessageId: Type.String(),\n reason: Type.Optional(Type.String()),\n }),\n execute: async (_toolCallId, args) => {\n const input = parseSnipToolInput(args);\n const result = await options.snip(input);\n return {\n content: [{\n type: \"text\",\n text: \"Snipped the selected user turn. It will be omitted from future model context.\",\n }],\n details: result,\n };\n },\n });\n\nexport * from \"./coding-tools.js\";\n\nconst parseSnipToolInput = (args: unknown): SnipToolInput => {\n if (!isRecord(args) || typeof args.userMessageId !== \"string\") {\n throw new Error(\"snip requires { userMessageId: string }\");\n }\n return {\n userMessageId: args.userMessageId as EventId,\n ...(typeof args.reason === \"string\" && args.reason.trim() ? { reason: args.reason.trim() } : {}),\n };\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n", "import { Type } from \"@mariozechner/pi-ai\";\n\nimport { defineTool, type AgentTool } from \"../tools/index.js\";\n\nexport type SendChannelMessageInput = {\n text?: string;\n attachments?: SendChannelMessageAttachment[];\n channel?: string;\n target?: \"current\";\n};\n\nexport type SendChannelMessageAttachment = {\n type: \"image\" | \"file\";\n path?: string;\n url?: string;\n mimeType?: string;\n caption?: string;\n};\n\nexport type CreateSendChannelMessageToolOptions = {\n sendCurrent: (input: SendChannelMessageInput) => Promise<{ channel: string; target: string; attachments?: number }>;\n};\n\nexport const createSendChannelMessageTool = (options: CreateSendChannelMessageToolOptions): AgentTool =>\n defineTool({\n name: \"SendChannelMessage\",\n description: \"Send a text reply to the current IM channel conversation. Do not provide raw platform user ids or group ids.\",\n parameters: Type.Object({\n text: Type.Optional(Type.String()),\n attachments: Type.Optional(Type.Array(Type.Object({\n type: Type.Union([Type.Literal(\"image\"), Type.Literal(\"file\")]),\n path: Type.Optional(Type.String()),\n url: Type.Optional(Type.String()),\n mimeType: Type.Optional(Type.String()),\n caption: Type.Optional(Type.String()),\n }))),\n channel: Type.Optional(Type.String()),\n target: Type.Optional(Type.Literal(\"current\")),\n }),\n execute: async (_toolCallId, args) => {\n const input = parseSendChannelMessageInput(args);\n const result = await options.sendCurrent(input);\n return {\n content: [{ type: \"text\", text: `Channel message sent to ${result.channel}:${result.target}` }],\n details: { ...result, attachments: result.attachments ?? input.attachments?.length ?? 0 },\n };\n },\n });\n\nconst parseSendChannelMessageInput = (value: unknown): SendChannelMessageInput => {\n if (!isRecord(value)) {\n throw new Error(\"SendChannelMessage args must be an object\");\n }\n const text = typeof value.text === \"string\" && value.text.trim().length > 0 ? value.text : undefined;\n const attachments = parseAttachments(value.attachments);\n if (!text && attachments.length === 0) {\n throw new Error(\"SendChannelMessage requires text or attachments\");\n }\n if (value.channel !== undefined && (typeof value.channel !== \"string\" || value.channel.trim().length === 0)) {\n throw new Error(\"SendChannelMessage.channel must be a non-empty string when provided\");\n }\n if (value.target !== undefined && value.target !== \"current\") {\n throw new Error(\"SendChannelMessage.target must be current when provided\");\n }\n return {\n ...(text ? { text } : {}),\n ...(attachments.length > 0 ? { attachments } : {}),\n ...(typeof value.channel === \"string\" ? { channel: value.channel } : {}),\n ...(value.target === \"current\" ? { target: \"current\" as const } : {}),\n };\n};\n\nconst parseAttachments = (value: unknown): SendChannelMessageAttachment[] => {\n if (value === undefined) {\n return [];\n }\n if (!Array.isArray(value)) {\n throw new Error(\"SendChannelMessage.attachments must be an array\");\n }\n return value.map((item, index) => {\n if (!isRecord(item)) {\n throw new Error(`SendChannelMessage.attachments.${index} must be an object`);\n }\n if (item.type !== \"image\" && item.type !== \"file\") {\n throw new Error(`SendChannelMessage.attachments.${index}.type must be image or file`);\n }\n const path = optionalString(item.path, `SendChannelMessage.attachments.${index}.path`);\n const url = optionalString(item.url, `SendChannelMessage.attachments.${index}.url`);\n if (!path && !url) {\n throw new Error(`SendChannelMessage.attachments.${index} requires path or url`);\n }\n return {\n type: item.type,\n ...(path ? { path } : {}),\n ...(url ? { url } : {}),\n ...(optionalString(item.mimeType, `SendChannelMessage.attachments.${index}.mimeType`) ? { mimeType: optionalString(item.mimeType, `SendChannelMessage.attachments.${index}.mimeType`) } : {}),\n ...(optionalString(item.caption, `SendChannelMessage.attachments.${index}.caption`) ? { caption: optionalString(item.caption, `SendChannelMessage.attachments.${index}.caption`) } : {}),\n };\n });\n};\n\nconst optionalString = (value: unknown, name: string): string | undefined => {\n if (value === undefined || value === \"\") {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new Error(`${name} must be a string`);\n }\n return value;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n", "import { readFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nexport type ExtensionKind = \"im\";\n\nexport type ExtensionManifest = {\n id: string;\n kind: ExtensionKind;\n displayName: string;\n adapter: string;\n skills: string[];\n mcp: unknown[];\n manifestPath: string;\n rootDir: string;\n};\n\nexport const loadExtensionManifest = async (manifestPath: string): Promise<ExtensionManifest> =>\n parseExtensionManifest(await readFile(manifestPath, \"utf8\"), manifestPath);\n\nexport const parseExtensionManifest = (text: string, manifestPath = \"scorel.extension.json\"): ExtensionManifest => {\n let value: unknown;\n try {\n value = JSON.parse(text);\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n throw new Error(`Invalid extension manifest JSON at ${manifestPath}: ${message}`);\n }\n if (!isRecord(value)) {\n throw new Error(`Extension manifest at ${manifestPath} must be an object`);\n }\n const rootDir = dirname(resolve(manifestPath));\n const id = requireIdentifier(value.id, \"id\", manifestPath);\n const kind = requireKind(value.kind, manifestPath);\n const displayName = requireString(value.displayName, \"displayName\", manifestPath);\n const adapter = requireRelativePath(value.adapter, \"adapter\", manifestPath);\n const skills = optionalRelativePaths(value.skills, \"skills\", manifestPath);\n const mcp = Array.isArray(value.mcp) ? value.mcp : [];\n return {\n id,\n kind,\n displayName,\n adapter,\n skills,\n mcp,\n manifestPath: resolve(manifestPath),\n rootDir,\n };\n};\n\nconst requireString = (value: unknown, name: string, manifestPath: string): string => {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`Extension manifest ${manifestPath} field ${name} must be a non-empty string`);\n }\n return value;\n};\n\nconst requireIdentifier = (value: unknown, name: string, manifestPath: string): string => {\n const text = requireString(value, name, manifestPath);\n if (!/^[A-Za-z0-9_-]+$/.test(text)) {\n throw new Error(`Extension manifest ${manifestPath} field ${name} must contain only letters, numbers, underscores, or hyphens`);\n }\n return text;\n};\n\nconst requireKind = (value: unknown, manifestPath: string): ExtensionKind => {\n if (value === \"im\") {\n return value;\n }\n throw new Error(`Extension manifest ${manifestPath} field kind must be im`);\n};\n\nconst requireRelativePath = (value: unknown, name: string, manifestPath: string): string => {\n const text = requireString(value, name, manifestPath);\n if (text.startsWith(\"/\") || text.includes(\"..\")) {\n throw new Error(`Extension manifest ${manifestPath} field ${name} must be a relative path inside the extension`);\n }\n return text;\n};\n\nconst optionalRelativePaths = (value: unknown, name: string, manifestPath: string): string[] => {\n if (value === undefined) {\n return [];\n }\n if (!Array.isArray(value)) {\n throw new Error(`Extension manifest ${manifestPath} field ${name} must be an array`);\n }\n return value.map((item, index) => requireRelativePath(item, `${name}.${index}`, manifestPath));\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n", "import { existsSync } from \"node:fs\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { homedir, platform, release } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\n\nimport type {\n InstructionSection,\n InstructionSnapshot,\n InstructionSource,\n} from \"@scorel/protocol\";\n\nexport type BuildInstructionSnapshotOptions = {\n cwd: string;\n now?: () => number;\n homeDir?: string;\n env?: NodeJS.ProcessEnv;\n};\n\ntype AgentsSource = Required<Pick<InstructionSource, \"sourceType\" | \"path\" | \"scope\" | \"priority\" | \"content\">>;\n\nconst BASELINE_PROMPT = [\n \"You are Scorel, a coding agent running inside a recoverable local workspace.\",\n \"Follow the user's request, respect the project instructions, use tools deliberately, and keep changes scoped to the active task.\",\n \"Tool results and user messages may include <system-reminder> tags. These tags contain information automatically added by Scorel's harness. They are not part of the specific tool result or user message in which they appear.\",\n \"If the AppendDaily tool is available, use it once near the end of meaningful completed work to record durable progress, decisions, and follow-ups. Do not use it for empty turns or transient noise.\",\n].join(\"\\n\");\n\nexport const buildInstructionSnapshot = async (\n options: BuildInstructionSnapshotOptions,\n): Promise<InstructionSnapshot> => {\n const cwd = resolve(options.cwd);\n const now = options.now ?? Date.now;\n const frozenAt = now();\n const homeDir = resolve(options.homeDir ?? homedir());\n const agentsSources = await discoverAgentsSources({ cwd, homeDir });\n const repoRoot = findGitRoot(cwd);\n\n return {\n version: 1,\n cwd,\n sections: [\n section(\"baseline\", frozenAt, BASELINE_PROMPT, [{ sourceType: \"builtin\" }]),\n section(\"agents\", frozenAt, renderAgentsBlock(agentsSources), agentsSources),\n section(\"memory\", frozenAt, \"No memory sources are configured for this session.\", []),\n section(\"workspace\", frozenAt, await renderWorkspaceBlock(cwd, repoRoot), undefined, {\n cwd,\n repoRoot,\n }),\n section(\"environment\", frozenAt, renderEnvironmentBlock(options.env ?? process.env), undefined, {\n platform: platform(),\n release: release(),\n shell: (options.env ?? process.env).SHELL,\n }),\n section(\"time\", frozenAt, renderTimeBlock(frozenAt), undefined, {\n timestamp: frozenAt,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n }),\n ],\n };\n};\n\nexport const renderSystemPrompt = (snapshot: InstructionSnapshot): string =>\n snapshot.sections\n .map((section) => section.renderedBlock.trim())\n .filter(Boolean)\n .join(\"\\n\\n\");\n\nconst section = (\n kind: InstructionSection[\"kind\"],\n frozenAt: number,\n renderedBlock: string,\n sources?: InstructionSource[],\n data?: Record<string, unknown>,\n): InstructionSection => ({\n kind,\n frozenAt,\n ...(sources ? { sources } : {}),\n renderedBlock,\n ...(data ? { data } : {}),\n});\n\nconst discoverAgentsSources = async (options: { cwd: string; homeDir: string }): Promise<AgentsSource[]> => {\n const projectFiles = projectAgentsPaths(options.cwd, options.homeDir);\n const globalPath = join(options.homeDir, \".scorel\", \"AGENTS.md\");\n const candidates = [...projectFiles.map((path) => ({ path, scope: \"project\" as const })), { path: globalPath, scope: \"global_user\" as const }];\n const sources: AgentsSource[] = [];\n\n for (const candidate of candidates) {\n try {\n const content = await readFile(candidate.path, \"utf8\");\n sources.push({\n sourceType: \"agents_md\",\n path: candidate.path,\n scope: candidate.scope,\n priority: candidate.scope === \"global_user\" ? 0 : sources.length + 1,\n content,\n });\n } catch (cause) {\n if (!isNodeErrorCode(cause, \"ENOENT\") && !isNodeErrorCode(cause, \"ENOTDIR\")) {\n throw cause;\n }\n }\n }\n\n return sources;\n};\n\nconst projectAgentsPaths = (cwd: string, homeDir: string): string[] => {\n const gitRoot = findGitRoot(cwd);\n const stopAt = gitRoot ?? homeDir;\n const paths: string[] = [];\n let current = cwd;\n\n while (true) {\n if (current !== homeDir) {\n paths.push(join(current, \"AGENTS.md\"));\n }\n if (current === stopAt || current === dirname(current)) {\n break;\n }\n const next = dirname(current);\n if (!gitRoot && next === homeDir) {\n break;\n }\n current = next;\n }\n\n return paths.reverse();\n};\n\nconst findGitRoot = (cwd: string): string | undefined => {\n let current = cwd;\n while (true) {\n if (existsSync(join(current, \".git\"))) {\n return current;\n }\n const next = dirname(current);\n if (next === current) {\n return undefined;\n }\n current = next;\n }\n};\n\nconst renderAgentsBlock = (sources: AgentsSource[]): string => {\n if (sources.length === 0) {\n return \"No AGENTS.md instructions were found for this session.\";\n }\n return [\n \"AGENTS.md instructions loaded for this session:\",\n ...sources.map((source) =>\n [`Source: ${source.path}`, `Scope: ${source.scope}`, \"Content:\", source.content.trimEnd()].join(\"\\n\"),\n ),\n ].join(\"\\n\\n\");\n};\n\nconst renderWorkspaceBlock = async (cwd: string, repoRoot: string | undefined): Promise<string> => {\n const root = repoRoot ?? cwd;\n let entries: string[] = [];\n try {\n entries = (await readdir(root, { withFileTypes: true }))\n .filter((entry) => !entry.name.startsWith(\".\"))\n .slice(0, 20)\n .map((entry) => `${entry.isDirectory() ? \"dir\" : \"file\"}:${entry.name}`);\n } catch {\n entries = [];\n }\n return [`Workspace cwd: ${cwd}`, `Repository root: ${repoRoot ?? \"not detected\"}`, `Top-level entries: ${entries.join(\", \") || \"none\"}`].join(\"\\n\");\n};\n\nconst renderEnvironmentBlock = (env: NodeJS.ProcessEnv): string =>\n [`Platform: ${platform()} ${release()}`, `Shell: ${env.SHELL ?? \"unknown\"}`].join(\"\\n\");\n\nconst renderTimeBlock = (timestamp: number): string =>\n [`Session started at: ${new Date(timestamp).toISOString()}`, `Timezone: ${Intl.DateTimeFormat().resolvedOptions().timeZone}`].join(\"\\n\");\n\nconst isNodeErrorCode = (cause: unknown, code: string): boolean =>\n cause instanceof Error && \"code\" in cause && cause.code === code;\n", "import { appendFile, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { Type } from \"@mariozechner/pi-ai\";\n\nimport { defineTool, type AgentTool } from \"../tools/index.js\";\n\nexport type MemoryPaths = {\n rootDir: string;\n rootMemoryPath: string;\n projectDir: string;\n projectMemoryPath: string;\n dailyDir: string;\n todayDailyPath: string;\n yesterdayDailyPath: string;\n dreamStatePath: string;\n today: string;\n yesterday: string;\n};\n\nexport type MemoryContext = {\n paths: MemoryPaths;\n rootMemory: string;\n projectMemory: string;\n todayDaily: string;\n yesterdayDaily: string;\n};\n\nexport type SessionMemoryPaths = {\n sessionsDir: string;\n sessionMemoryPath: string;\n};\n\nexport type BuildMemoryContextOptions = {\n projectId: string;\n homeDir?: string;\n now?: () => number;\n};\n\nexport type AppendDailyOptions = BuildMemoryContextOptions & {\n text: string;\n};\n\nexport type AppendDailyResult = {\n path: string;\n entry: string;\n date: string;\n skippedReason?: \"empty\" | \"duplicate\";\n};\n\nexport type AppendDailyInput = {\n summary: string;\n completed?: string[];\n decisions?: string[];\n followUps?: string[];\n memoryCandidates?: string[];\n evidence?: string[];\n};\n\nexport type CreateAppendDailyToolOptions = BuildMemoryContextOptions & {\n onAppend?: (result: AppendDailyResult) => void | Promise<void>;\n};\n\nexport type MemoryDreamState = {\n projectId: string;\n dirty: boolean;\n running: boolean;\n sessionId?: string;\n clientId?: string;\n lastDailyAppendAt?: number;\n lastDailyPath?: string;\n scheduledFor?: number;\n lastAttemptAt?: number;\n lastSuccessAt?: number;\n lastFailure?: { at: number; message: string };\n lastProjectMemoryUpdateAt?: number;\n lastRootMemoryUpdateAt?: number;\n};\n\nexport type SessionMemoryInput = {\n sessionId: string;\n projectId: string;\n summary: string;\n recentMessages?: string[];\n decisions?: string[];\n followUps?: string[];\n now?: () => number;\n homeDir?: string;\n};\n\nexport const memoryDate = (timestamp: number): string => new Date(timestamp).toISOString().slice(0, 10);\n\nexport const scorelMemoryPaths = (options: BuildMemoryContextOptions): MemoryPaths => {\n const home = options.homeDir ?? homedir();\n const now = options.now ?? Date.now;\n const today = memoryDate(now());\n const yesterday = memoryDate(now() - 24 * 60 * 60 * 1000);\n const rootDir = join(home, \".scorel\", \"memory\");\n const projectDir = join(rootDir, \"projects\", safeProjectId(options.projectId));\n const dailyDir = join(projectDir, \"daily\");\n return {\n rootDir,\n rootMemoryPath: join(rootDir, \"MEMORY.md\"),\n projectDir,\n projectMemoryPath: join(projectDir, \"MEMORY.md\"),\n dailyDir,\n todayDailyPath: join(dailyDir, `${today}.md`),\n yesterdayDailyPath: join(dailyDir, `${yesterday}.md`),\n dreamStatePath: join(projectDir, \"dream-state.json\"),\n today,\n yesterday,\n };\n};\n\nexport const scorelSessionMemoryPaths = (options: {\n projectId: string;\n sessionId: string;\n homeDir?: string;\n}): SessionMemoryPaths => {\n const home = options.homeDir ?? homedir();\n const sessionsDir = join(home, \".scorel\", \"context\", \"session-memory\", safeProjectId(options.projectId));\n return {\n sessionsDir,\n sessionMemoryPath: join(sessionsDir, `${safeProjectId(options.sessionId)}.md`),\n };\n};\n\nexport const buildMemoryContext = async (options: BuildMemoryContextOptions): Promise<MemoryContext> => {\n const paths = scorelMemoryPaths(options);\n await ensureMemoryFiles(paths);\n return {\n paths,\n rootMemory: trimForContext(await readOptional(paths.rootMemoryPath), 8_000),\n projectMemory: trimForContext(await readOptional(paths.projectMemoryPath), 12_000),\n todayDaily: trimForContext(await readOptional(paths.todayDailyPath), 8_000, \"tail\"),\n yesterdayDaily: trimForContext(await readOptional(paths.yesterdayDailyPath), 8_000, \"tail\"),\n };\n};\n\nexport const renderMemoryHarness = (context: MemoryContext): string => [\n \"Memory context for this session.\",\n \"\",\n \"Root MEMORY.md:\",\n context.rootMemory.trim() || \"(empty)\",\n \"\",\n \"Project MEMORY.md:\",\n context.projectMemory.trim() || \"(empty)\",\n \"\",\n `Recent daily (${context.paths.yesterday}, ${context.paths.today}):`,\n context.yesterdayDaily.trim() || \"(yesterday empty)\",\n \"\",\n context.todayDaily.trim() || \"(today empty)\",\n \"\",\n \"Memory rules:\",\n \"- Treat memory as point-in-time context; verify current code facts from the repo before acting.\",\n \"- Project MEMORY overrides root MEMORY for project-specific decisions.\",\n \"- Daily notes are recent progress context, not long-term truth.\",\n].join(\"\\n\");\n\nexport const appendDailyEntry = async (options: AppendDailyOptions): Promise<AppendDailyResult> => {\n const paths = scorelMemoryPaths(options);\n await ensureMemoryFiles(paths);\n const text = options.text.trim();\n if (!text) {\n return { path: paths.todayDailyPath, entry: \"\", date: paths.today, skippedReason: \"empty\" };\n }\n const existing = await readOptional(paths.todayDailyPath);\n if (containsNormalizedDailyEntry(existing, text)) {\n return { path: paths.todayDailyPath, entry: \"\", date: paths.today, skippedReason: \"duplicate\" };\n }\n const time = new Date((options.now ?? Date.now)()).toISOString().slice(11, 16);\n const entry = `- ${time} ${text.replace(/\\s+/g, \" \")}\\n`;\n await appendFile(paths.todayDailyPath, entry, \"utf8\");\n return { path: paths.todayDailyPath, entry: entry.trimEnd(), date: paths.today };\n};\n\nexport const createAppendDailyTool = (options: CreateAppendDailyToolOptions): AgentTool =>\n defineTool({\n name: \"AppendDaily\",\n description: [\n \"Append a compact hidden project daily journal entry after meaningful work.\",\n \"Use this once near the end of a completed user turn when there is progress, a decision, or a follow-up worth preserving.\",\n \"Do not include secrets, raw logs, speculation, or facts that should be re-read from the repository.\",\n ].join(\" \"),\n parameters: Type.Object({\n summary: Type.String(),\n completed: Type.Optional(Type.Array(Type.String())),\n decisions: Type.Optional(Type.Array(Type.String())),\n followUps: Type.Optional(Type.Array(Type.String())),\n memoryCandidates: Type.Optional(Type.Array(Type.String())),\n evidence: Type.Optional(Type.Array(Type.String())),\n }),\n execute: async (_toolCallId, args) => {\n const input = parseAppendDailyInput(args);\n validateAppendDailyInput(input);\n const result = await appendDailyEntry({\n projectId: options.projectId,\n homeDir: options.homeDir,\n now: options.now,\n text: renderDailyEntry(input),\n });\n await options.onAppend?.(result);\n return {\n content: [{\n type: \"text\",\n text: result.entry\n ? `Daily appended: ${result.date}`\n : `Daily append skipped: ${result.skippedReason ?? \"empty\"}`,\n }],\n details: {\n path: result.path,\n date: result.date,\n skippedReason: result.skippedReason,\n },\n };\n },\n });\n\nexport const renderDailyEntry = (input: AppendDailyInput): string => {\n const sections = [\n `Summary: ${compactLine(input.summary, 500)}`,\n renderList(\"Completed\", input.completed),\n renderList(\"Decisions\", input.decisions),\n renderList(\"Follow-ups\", input.followUps),\n renderList(\"Memory candidates\", input.memoryCandidates),\n renderList(\"Evidence\", input.evidence),\n ].filter(Boolean);\n return sections.join(\" \");\n};\n\nexport const readMemoryDreamState = async (options: BuildMemoryContextOptions): Promise<MemoryDreamState | undefined> => {\n const paths = scorelMemoryPaths(options);\n const text = await readOptional(paths.dreamStatePath);\n if (!text.trim()) return undefined;\n try {\n const parsed = JSON.parse(text) as Partial<MemoryDreamState>;\n if (parsed.projectId !== options.projectId) return undefined;\n return {\n projectId: options.projectId,\n dirty: Boolean(parsed.dirty),\n running: Boolean(parsed.running),\n sessionId: optionalString(parsed.sessionId),\n clientId: optionalString(parsed.clientId),\n lastDailyAppendAt: optionalNumber(parsed.lastDailyAppendAt),\n lastDailyPath: optionalString(parsed.lastDailyPath),\n scheduledFor: optionalNumber(parsed.scheduledFor),\n lastAttemptAt: optionalNumber(parsed.lastAttemptAt),\n lastSuccessAt: optionalNumber(parsed.lastSuccessAt),\n lastFailure: parseLastFailure(parsed.lastFailure),\n lastProjectMemoryUpdateAt: optionalNumber(parsed.lastProjectMemoryUpdateAt),\n lastRootMemoryUpdateAt: optionalNumber(parsed.lastRootMemoryUpdateAt),\n };\n } catch {\n return undefined;\n }\n};\n\nexport const writeMemoryDreamState = async (\n options: BuildMemoryContextOptions & { state: MemoryDreamState },\n): Promise<MemoryDreamState> => {\n const paths = scorelMemoryPaths(options);\n await mkdir(paths.projectDir, { recursive: true, mode: 0o700 });\n const state = { ...options.state, projectId: options.projectId };\n await writeFile(paths.dreamStatePath, `${JSON.stringify(state, null, 2)}\\n`, { encoding: \"utf8\", mode: 0o600 });\n return state;\n};\n\nexport const mergeMemoryMarkdown = (current: string, addition: string): string => {\n const text = addition.trim();\n if (!text) {\n return current;\n }\n const normalized = current.trim() || \"# Memory\\n\";\n if (normalized.includes(text)) {\n return `${normalized.trimEnd()}\\n`;\n }\n return `${normalized.trimEnd()}\\n\\n- ${text.replace(/^-+\\s*/, \"\")}\\n`;\n};\n\nexport const readSessionMemory = async (options: {\n projectId: string;\n sessionId: string;\n homeDir?: string;\n}): Promise<string> => {\n const paths = scorelSessionMemoryPaths(options);\n return trimForContext(await readOptional(paths.sessionMemoryPath), 12_000, \"tail\");\n};\n\nexport const writeSessionMemory = async (input: SessionMemoryInput): Promise<{ path: string; content: string }> => {\n const paths = scorelSessionMemoryPaths(input);\n await mkdir(paths.sessionsDir, { recursive: true, mode: 0o700 });\n const content = renderSessionMemory(input);\n await writeFile(paths.sessionMemoryPath, content, { encoding: \"utf8\", mode: 0o600 });\n return { path: paths.sessionMemoryPath, content };\n};\n\nexport const renderSessionMemory = (input: SessionMemoryInput): string => {\n const timestamp = new Date((input.now ?? Date.now)()).toISOString();\n return normalizeMarkdownFile([\n `# Session Memory: ${input.sessionId}`,\n \"\",\n `Updated: ${timestamp}`,\n \"\",\n \"## Current State\",\n compactLine(input.summary, 1_200) || \"- No durable session state captured yet.\",\n \"\",\n \"## Recent Work\",\n renderBullets(input.recentMessages, 360) || \"- No recent work captured.\",\n \"\",\n \"## Decisions\",\n renderBullets(input.decisions, 360) || \"- No session decisions captured.\",\n \"\",\n \"## Follow-ups\",\n renderBullets(input.followUps, 360) || \"- No follow-ups captured.\",\n ].join(\"\\n\"));\n};\n\nconst ensureMemoryFiles = async (paths: MemoryPaths): Promise<void> => {\n await mkdir(paths.rootDir, { recursive: true, mode: 0o700 });\n await mkdir(paths.projectDir, { recursive: true, mode: 0o700 });\n await mkdir(paths.dailyDir, { recursive: true, mode: 0o700 });\n await ensureFile(paths.rootMemoryPath, \"# Memory\\n\");\n await ensureFile(paths.projectMemoryPath, \"# Project Memory\\n\");\n await ensureFile(paths.todayDailyPath, `# ${paths.today}\\n\\n`);\n};\n\nconst ensureFile = async (path: string, content: string): Promise<void> => {\n try {\n await writeFile(path, content, { encoding: \"utf8\", flag: \"wx\", mode: 0o600 });\n } catch (cause) {\n if (!isNodeErrorCode(cause, \"EEXIST\")) {\n throw cause;\n }\n }\n};\n\nconst readOptional = async (path: string): Promise<string> => {\n try {\n return await readFile(path, \"utf8\");\n } catch (cause) {\n if (isNodeErrorCode(cause, \"ENOENT\")) {\n return \"\";\n }\n throw cause;\n }\n};\n\nconst trimForContext = (text: string, maxChars: number, mode: \"head\" | \"tail\" = \"head\"): string => {\n if (text.length <= maxChars) {\n return text;\n }\n return mode === \"tail\" ? text.slice(-maxChars) : text.slice(0, maxChars);\n};\n\nconst compactLine = (value: string, maxChars: number): string =>\n value.replace(/\\s+/g, \" \").trim().slice(0, maxChars);\n\nconst renderList = (label: string, values: string[] | undefined): string => {\n const items = (values ?? []).map((value) => compactLine(value, 240)).filter(Boolean);\n return items.length > 0 ? `${label}: ${items.join(\"; \")}` : \"\";\n};\n\nconst renderBullets = (values: string[] | undefined, maxChars: number): string =>\n (values ?? [])\n .map((value) => compactLine(value, maxChars))\n .filter(Boolean)\n .map((value) => `- ${value}`)\n .join(\"\\n\");\n\nexport const normalizeMarkdownFile = (value: string): string => `${value.trimEnd()}\\n`;\n\nconst parseAppendDailyInput = (value: unknown): AppendDailyInput => {\n if (!isRecord(value)) {\n throw new Error(\"AppendDaily args must be an object\");\n }\n const summary = requireString(value.summary, \"summary\");\n return {\n summary,\n completed: optionalStringArray(value.completed, \"completed\"),\n decisions: optionalStringArray(value.decisions, \"decisions\"),\n followUps: optionalStringArray(value.followUps, \"followUps\"),\n memoryCandidates: optionalStringArray(value.memoryCandidates, \"memoryCandidates\"),\n evidence: optionalStringArray(value.evidence, \"evidence\"),\n };\n};\n\nconst validateAppendDailyInput = (input: AppendDailyInput): void => {\n const summary = compactLine(input.summary, 500);\n if (isLowSignalSummary(summary)) {\n throw new Error(\"AppendDaily.summary is too generic; include concrete durable progress or a decision\");\n }\n const details = [\n ...(input.completed ?? []),\n ...(input.decisions ?? []),\n ...(input.followUps ?? []),\n ...(input.memoryCandidates ?? []),\n ...(input.evidence ?? []),\n ].map((value) => compactLine(value, 240)).filter(Boolean);\n if (details.length === 0) {\n throw new Error(\"AppendDaily requires at least one completed item, decision, follow-up, memory candidate, or evidence item\");\n }\n};\n\nconst isLowSignalSummary = (value: string): boolean => {\n const normalized = value.toLowerCase().replace(/\\s+/g, \"\");\n return [\n \"done\",\n \"completed\",\n \"finished\",\n \"updated\",\n \"\u7EE7\u7EED\u63A8\u8FDB\",\n \"\u5B8C\u6210\u4EFB\u52A1\",\n \"\u5DF2\u5904\u7406\",\n \"\u5904\u7406\u5B8C\u6210\",\n \"\u505A\u4E86\u4E00\u4E9B\u4FEE\u6539\",\n ].includes(normalized);\n};\n\nconst containsNormalizedDailyEntry = (daily: string, text: string): boolean => {\n const needle = normalizeDailyText(text);\n return daily\n .split(\"\\n\")\n .map((line) => line.replace(/^-\\s+\\d\\d:\\d\\d\\s+/, \"\"))\n .some((line) => normalizeDailyText(line) === needle);\n};\n\nconst normalizeDailyText = (value: string): string =>\n value.replace(/\\s+/g, \" \").trim().toLowerCase();\n\nconst requireString = (value: unknown, name: string): string => {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`AppendDaily.${name} must be a non-empty string`);\n }\n return value.trim();\n};\n\nconst optionalStringArray = (value: unknown, name: string): string[] | undefined => {\n if (value === undefined) {\n return undefined;\n }\n if (!Array.isArray(value) || !value.every((item) => typeof item === \"string\")) {\n throw new Error(`AppendDaily.${name} must be an array of strings`);\n }\n return value.map((item) => item.trim()).filter(Boolean);\n};\n\nconst optionalNumber = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n\nconst optionalString = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.trim() ? value : undefined;\n\nconst parseLastFailure = (value: unknown): MemoryDreamState[\"lastFailure\"] => {\n if (!isRecord(value)) return undefined;\n const at = optionalNumber(value.at);\n const message = optionalString(value.message);\n return at !== undefined && message ? { at, message } : undefined;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst safeProjectId = (projectId: string): string => {\n if (!/^[A-Za-z0-9_-]+$/.test(projectId)) {\n throw new Error(\"projectId must contain only letters, numbers, underscores, or hyphens\");\n }\n return projectId;\n};\n\nconst isNodeErrorCode = (cause: unknown, code: string): boolean =>\n cause instanceof Error && \"code\" in cause && cause.code === code;\n", "import type {\n ScorelMessage,\n SystemReminderContentBlock,\n SystemReminderKind,\n SystemReminderOrigin,\n SystemReminderScope,\n SystemReminderVisibility,\n ToolResultContentBlock,\n} from \"@scorel/protocol\";\n\nexport type CreateSystemReminderBlockInput = {\n kind: SystemReminderKind;\n origin: SystemReminderOrigin;\n text: string;\n visibility: SystemReminderVisibility;\n scope: SystemReminderScope;\n data?: Record<string, unknown>;\n};\n\nexport const createSystemReminderBlock = (\n input: CreateSystemReminderBlockInput,\n): SystemReminderContentBlock => ({\n type: \"system_reminder\",\n kind: input.kind,\n origin: input.origin,\n text: input.text,\n visibility: input.visibility,\n scope: input.scope,\n ...(input.data ? { data: { ...input.data } } : {}),\n});\n\nexport const renderSystemReminderText = (text: string): string =>\n `<system-reminder>\\n${text}\\n</system-reminder>`;\n\nexport const renderSystemReminder = (input: SystemReminderContentBlock | string): string =>\n renderSystemReminderText(typeof input === \"string\" ? input : input.text);\n\nexport const systemReminderMessage = (\n block: SystemReminderContentBlock,\n meta?: Record<string, unknown>,\n): ScorelMessage => ({\n role: \"user\",\n content: [cloneSystemReminderBlock(block)],\n ...(meta ? { meta: { ...meta } } : {}),\n});\n\nexport const appendSystemReminderToToolResult = (\n message: ScorelMessage,\n block: SystemReminderContentBlock,\n): boolean => {\n for (let i = message.content.length - 1; i >= 0; i -= 1) {\n const candidate = message.content[i];\n if (candidate?.type !== \"tool_result\" || !isToolResultWithContent(candidate.result)) {\n continue;\n }\n const mergedResult = {\n ...candidate.result,\n content: [...candidate.result.content, cloneSystemReminderBlock(block)],\n };\n message.content[i] = {\n ...candidate,\n result: mergedResult,\n } satisfies ToolResultContentBlock;\n return true;\n }\n return false;\n};\n\nexport const cloneSystemReminderBlock = (\n block: SystemReminderContentBlock,\n): SystemReminderContentBlock => ({\n ...block,\n ...(block.data ? { data: { ...block.data } } : {}),\n});\n\nconst isToolResultWithContent = (value: unknown): value is { content: unknown[] } =>\n typeof value === \"object\" &&\n value !== null &&\n \"content\" in value &&\n Array.isArray((value as { content?: unknown }).content);\n", "import {\n getModels,\n streamSimple,\n type Api,\n type Context,\n type KnownProvider,\n type Message,\n type Model,\n type TextContent,\n type ThinkingContent,\n type Tool,\n type ToolCall,\n type Usage as PiUsage,\n} from \"@mariozechner/pi-ai\";\n\nimport type {\n ContentBlock,\n ScorelMessage,\n StopReason,\n SystemReminderContentBlock,\n ToolCallContentBlock,\n ToolResultContentBlock,\n Usage,\n} from \"@scorel/protocol\";\n\nimport type { BuiltinPiAiModelConfig, CustomPiAiApi, CustomPiAiModelConfig } from \"../config/index.js\";\nimport type { RuntimeProvider } from \"../runtime/index.js\";\nimport { renderSystemReminder } from \"../reminders/index.js\";\nimport type { AgentTool } from \"../tools/index.js\";\n\nexport type PiAiProviderOptions = {\n model: Model<Api>;\n apiKey: string;\n reasoning?: \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n onPayload?: (payload: unknown, model: Model<Api>) => unknown | undefined | Promise<unknown | undefined>;\n};\n\nconst DEFAULT_CUSTOM_MODEL_CONTEXT_WINDOW = 200_000;\nconst DEFAULT_CUSTOM_MODEL_MAX_TOKENS = 64_000;\n\nexport const createPiAiProvider = (options: PiAiProviderOptions): RuntimeProvider => ({\n streamTurn: async function* ({ context, systemPrompt, tools, signal }) {\n const stream = streamSimple(options.model, toPiContext(context, systemPrompt, tools), {\n apiKey: options.apiKey,\n signal,\n ...(options.reasoning ? { reasoning: options.reasoning } : {}),\n ...(options.onPayload ? { onPayload: options.onPayload } : {}),\n });\n\n for await (const event of stream) {\n if (event.type === \"text_delta\") {\n yield { type: \"text_delta\", delta: event.delta };\n } else if (event.type === \"thinking_delta\") {\n yield { type: \"thinking_delta\", delta: event.delta };\n }\n }\n\n return fromPiAssistant(await stream.result());\n },\n});\n\nexport const resolvePiAiModel = (config: BuiltinPiAiModelConfig | CustomPiAiModelConfig): Model<Api> => {\n if (config.type === \"custom\") {\n return {\n id: config.id,\n name: config.id,\n api: config.api,\n provider: config.provider,\n baseUrl: config.baseUrl,\n input: config.supportsImageInput ? [\"text\", \"image\"] : [\"text\"],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n reasoning: config.reasoning ?? false,\n contextWindow: config.contextWindow ?? DEFAULT_CUSTOM_MODEL_CONTEXT_WINDOW,\n maxTokens: config.maxTokens ?? DEFAULT_CUSTOM_MODEL_MAX_TOKENS,\n ...(config.api === \"openai-completions\"\n ? { compat: { supportsDeveloperRole: config.compat?.supportsDeveloperRole ?? false } }\n : {}),\n } satisfies Model<CustomPiAiApi>;\n }\n\n const model = getModels(config.provider as KnownProvider).find((candidate) => candidate.id === config.id);\n if (!model) {\n throw new Error(`Unknown pi-ai model: ${config.provider}/${config.id}`);\n }\n return {\n ...model,\n ...(config.baseUrl ? { baseUrl: config.baseUrl } : {}),\n };\n};\n\nconst toPiContext = (context: ScorelMessage[], systemPrompt: string | undefined, tools: AgentTool[]): Context => ({\n ...(systemPrompt ? { systemPrompt } : {}),\n messages: context.flatMap(toPiMessage),\n tools: tools.map(toPiTool),\n});\n\nconst toPiMessage = (message: ScorelMessage): Message[] => {\n if (message.role === \"system\") {\n return [{ role: \"user\", content: textContent(message), timestamp: Date.now() }];\n }\n if (message.role === \"user\") {\n return [{ role: \"user\", content: textContent(message), timestamp: Date.now() }];\n }\n if (message.role === \"assistant\") {\n return [\n {\n role: \"assistant\",\n content: message.content.flatMap(toPiAssistantBlock),\n api: stringMeta(message, \"api\") ?? \"openai-completions\",\n provider: stringMeta(message, \"provider\") ?? \"scorel\",\n model: stringMeta(message, \"model\") ?? \"unknown\",\n usage: {\n input: message.usage?.inputTokens ?? 0,\n output: message.usage?.outputTokens ?? 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: message.usage?.totalTokens ?? 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: toPiStopReason(message.stopReason),\n timestamp: Date.now(),\n },\n ];\n }\n\n return message.content.flatMap((block): Message[] => {\n if (block.type !== \"tool_result\") {\n return [];\n }\n return [\n {\n role: \"toolResult\",\n toolCallId: block.toolCallId,\n toolName: block.toolName,\n content: [{ type: \"text\", text: toolResultText(block.result) }],\n isError: block.isError ?? false,\n timestamp: Date.now(),\n },\n ];\n });\n};\n\nconst toPiAssistantBlock = (block: ContentBlock): Array<TextContent | ThinkingContent | ToolCall> => {\n if (block.type === \"text\") {\n return [{ type: \"text\", text: block.text }];\n }\n if (block.type === \"system_reminder\") {\n return [{ type: \"text\", text: renderSystemReminder(block) }];\n }\n if (block.type === \"thinking\") {\n return [{ type: \"thinking\", thinking: block.text }];\n }\n if (block.type === \"tool_call\") {\n return [{ type: \"toolCall\", id: block.toolCallId, name: block.toolName, arguments: block.args as Record<string, unknown> }];\n }\n return [];\n};\n\nconst fromPiAssistant = (message: Extract<Message, { role: \"assistant\" }>): ScorelMessage & { role: \"assistant\" } => ({\n role: \"assistant\",\n content: message.content.map(fromPiContentBlock),\n stopReason: fromPiStopReason(message.stopReason),\n usage: fromPiUsage(message.usage),\n meta: {\n api: message.api,\n provider: message.provider,\n model: message.model,\n },\n});\n\nconst fromPiContentBlock = (block: Extract<Message, { role: \"assistant\" }>[\"content\"][number]): ContentBlock => {\n if (block.type === \"text\") {\n return { type: \"text\", text: block.text };\n }\n if (block.type === \"thinking\") {\n return { type: \"thinking\", text: block.thinking };\n }\n return {\n type: \"tool_call\",\n toolCallId: block.id,\n toolName: block.name,\n args: block.arguments,\n };\n};\n\nconst toPiTool = (tool: AgentTool): Tool => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n});\n\nconst textContent = (message: ScorelMessage): string =>\n message.content.flatMap((block) => {\n if (block.type === \"text\") {\n return [block.text];\n }\n if (block.type === \"system_reminder\") {\n return [renderSystemReminder(block)];\n }\n return [];\n }).join(\"\\n\");\n\nconst toolResultText = (result: ToolResultContentBlock[\"result\"]): string => {\n if (typeof result === \"object\" && result !== null && \"content\" in result) {\n const content = (result as { content?: unknown }).content;\n if (Array.isArray(content)) {\n return content\n .flatMap((block): string[] => {\n if (block?.type === \"text\" && typeof block.text === \"string\") {\n return [block.text];\n }\n if (isSystemReminderContentBlock(block)) {\n return [renderSystemReminder(block)];\n }\n return [];\n })\n .join(\"\\n\");\n }\n }\n return JSON.stringify(result);\n};\n\nconst isSystemReminderContentBlock = (value: unknown): value is SystemReminderContentBlock =>\n typeof value === \"object\" &&\n value !== null &&\n (value as { type?: unknown }).type === \"system_reminder\" &&\n typeof (value as { text?: unknown }).text === \"string\";\n\nconst stringMeta = (message: ScorelMessage, key: string): string | undefined => {\n const value = message.meta?.[key];\n return typeof value === \"string\" ? value : undefined;\n};\n\nconst toPiStopReason = (reason: StopReason | undefined): Extract<Message, { role: \"assistant\" }>[\"stopReason\"] => {\n if (reason === \"tool_call\") {\n return \"toolUse\";\n }\n if (reason === \"max_tokens\") {\n return \"length\";\n }\n if (reason === \"cancelled\") {\n return \"aborted\";\n }\n if (reason === \"error\") {\n return \"error\";\n }\n return \"stop\";\n};\n\nconst fromPiStopReason = (reason: Extract<Message, { role: \"assistant\" }>[\"stopReason\"]): StopReason => {\n if (reason === \"toolUse\") {\n return \"tool_call\";\n }\n if (reason === \"length\") {\n return \"max_tokens\";\n }\n if (reason === \"aborted\") {\n return \"cancelled\";\n }\n if (reason === \"error\") {\n return \"error\";\n }\n return \"end_turn\";\n};\n\nconst fromPiUsage = (usage: PiUsage | undefined): Usage | undefined => {\n if (!usage) {\n return undefined;\n }\n return {\n inputTokens: usage.input,\n outputTokens: usage.output,\n totalTokens: usage.totalTokens,\n };\n};\n", "import type {\n ScorelMessage,\n StopReason,\n ToolCallContentBlock,\n ToolResultContentBlock,\n Usage,\n} from \"@scorel/protocol\";\n\nimport type { AgentTool, ToolResult } from \"../tools/index.js\";\n\nexport type RuntimeTurnOptions = {\n refreshContext?: (context: ScorelMessage[]) => ScorelMessage[] | Promise<ScorelMessage[]>;\n};\n\nexport type ProviderStreamChunk = {\n type: \"text_delta\" | \"thinking_delta\";\n delta: string;\n};\n\nexport type RuntimeProviderTurn = {\n context: ScorelMessage[];\n systemPrompt: string | undefined;\n tools: AgentTool[];\n signal: AbortSignal;\n options: RuntimeTurnOptions;\n};\n\nexport type RuntimeProvider = {\n streamTurn(turn: RuntimeProviderTurn): AsyncGenerator<ProviderStreamChunk, ScorelMessage | void, undefined>;\n};\n\nexport type RawRuntimeEvent =\n | { type: \"turn_start\" }\n | { type: \"turn_end\"; usage?: Usage; stopReason?: StopReason }\n | { type: \"message_start\"; role: \"assistant\" | \"tool_result\" }\n | { type: \"text_delta\"; delta: string }\n | { type: \"thinking_delta\"; delta: string }\n | { type: \"message_end\"; message: ScorelMessage & { role: \"assistant\" } }\n | { type: \"tool_execution_start\"; toolCallId: string; toolName: string; args: unknown }\n | {\n type: \"tool_execution_end\";\n toolCallId: string;\n toolName: string;\n durationMs: number;\n isError: boolean;\n result: ToolResult;\n }\n | { type: \"error\"; error: Error };\n\ntype ProviderTurnResult = {\n message?: ScorelMessage & { role: \"assistant\" };\n finished?: boolean;\n stopReason?: StopReason;\n};\n\nexport class ScorelRuntime {\n readonly #provider: RuntimeProvider;\n readonly #tools = new Map<string, AgentTool>();\n #controller: AbortController | undefined;\n\n constructor({ provider }: { provider: RuntimeProvider }) {\n this.#provider = provider;\n }\n\n get running(): boolean {\n return this.#controller !== undefined;\n }\n\n registerTool(tool: AgentTool): void {\n this.#tools.set(tool.name, tool);\n }\n\n unregisterTool(name: string): void {\n this.#tools.delete(name);\n }\n\n cancel(): void {\n this.#controller?.abort();\n }\n\n async *executeTurn(\n context: ScorelMessage[],\n systemPrompt: string | undefined,\n options: RuntimeTurnOptions,\n ): AsyncGenerator<RawRuntimeEvent, void, undefined> {\n if (this.#controller) {\n throw new Error(\"Runtime is already running\");\n }\n\n const controller = new AbortController();\n this.#controller = controller;\n\n yield { type: \"turn_start\" };\n\n try {\n let nextContext = [...context];\n\n while (!controller.signal.aborted) {\n const result = yield* this.#runProviderTurn(nextContext, systemPrompt, options, controller.signal);\n if (result.finished) {\n return;\n }\n\n const assistant = result.message;\n if (!assistant) {\n yield { type: \"turn_end\", stopReason: result.stopReason ?? \"end_turn\" };\n return;\n }\n\n const toolCalls = assistant.content.filter(\n (block): block is ToolCallContentBlock => block.type === \"tool_call\",\n );\n\n if (controller.signal.aborted || toolCalls.length === 0 || assistant.stopReason !== \"tool_call\") {\n yield { type: \"turn_end\", stopReason: controller.signal.aborted ? \"cancelled\" : assistant.stopReason };\n return;\n }\n\n const toolMessages: ScorelMessage[] = [];\n for (const toolCall of toolCalls) {\n if (controller.signal.aborted) {\n break;\n }\n toolMessages.push(yield* this.#executeTool(toolCall, controller.signal));\n }\n\n if (controller.signal.aborted) {\n yield { type: \"turn_end\", stopReason: \"cancelled\" };\n return;\n }\n\n const contextAfterTools = [...nextContext, assistant, ...toolMessages];\n nextContext = options.refreshContext ? await options.refreshContext(contextAfterTools) : contextAfterTools;\n }\n\n yield { type: \"turn_end\", stopReason: \"cancelled\" };\n } finally {\n this.#controller = undefined;\n }\n }\n\n async *#runProviderTurn(\n context: ScorelMessage[],\n systemPrompt: string | undefined,\n options: RuntimeTurnOptions,\n signal: AbortSignal,\n ): AsyncGenerator<RawRuntimeEvent, ProviderTurnResult, undefined> {\n let text = \"\";\n let thinking = \"\";\n\n yield { type: \"message_start\", role: \"assistant\" };\n\n try {\n const stream = this.#provider.streamTurn({\n context,\n systemPrompt,\n tools: [...this.#tools.values()],\n signal,\n options,\n });\n\n while (true) {\n if (signal.aborted) {\n break;\n }\n\n const next = await stream.next();\n if (next.done) {\n const message = normalizeAssistantMessage(next.value, { thinking, text }, signal.aborted ? \"cancelled\" : \"end_turn\");\n if (message) {\n yield { type: \"message_end\", message };\n }\n return { message, stopReason: message?.stopReason ?? \"end_turn\" };\n }\n\n if (next.value.type === \"text_delta\") {\n text += next.value.delta;\n yield next.value;\n } else if (next.value.type === \"thinking_delta\") {\n thinking += next.value.delta;\n yield next.value;\n }\n }\n\n const cancelledMessage = partialAssistantMessage({ thinking, text }, \"cancelled\");\n if (cancelledMessage) {\n yield { type: \"message_end\", message: cancelledMessage };\n }\n return { stopReason: \"cancelled\" };\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n const partial = partialAssistantMessage({ thinking, text }, \"error\");\n if (partial) {\n yield { type: \"message_end\", message: partial };\n }\n yield { type: \"error\", error };\n yield { type: \"turn_end\", stopReason: \"error\" };\n return { finished: true };\n }\n }\n\n async *#executeTool(\n toolCall: ToolCallContentBlock,\n signal: AbortSignal,\n ): AsyncGenerator<RawRuntimeEvent, ScorelMessage, undefined> {\n const start = Date.now();\n const tool = this.#tools.get(toolCall.toolName);\n yield {\n type: \"tool_execution_start\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: toolCall.args,\n };\n\n let result: ToolResult;\n let isError = false;\n try {\n if (!tool) {\n throw new Error(`Unknown tool: ${toolCall.toolName}`);\n }\n result = await tool.execute(toolCall.toolCallId, toolCall.args, signal, () => undefined);\n } catch (cause) {\n isError = true;\n const message = cause instanceof Error ? cause.message : String(cause);\n result = { content: [{ type: \"text\", text: message }] };\n }\n\n yield {\n type: \"tool_execution_end\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n durationMs: Date.now() - start,\n isError,\n result,\n };\n\n const block: ToolResultContentBlock = {\n type: \"tool_result\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n result: toolResultForContext(result),\n isError,\n };\n\n return {\n role: \"tool_result\",\n content: [block],\n };\n }\n}\n\nconst toolResultForContext = (result: ToolResult): ToolResult => ({\n content: result.content,\n});\n\nconst normalizeAssistantMessage = (\n value: ScorelMessage | void,\n streamed: StreamedAssistantContent,\n fallbackStopReason: StopReason,\n): (ScorelMessage & { role: \"assistant\" }) | undefined => {\n if (value) {\n if (!isAssistantMessage(value)) {\n throw new Error(`Provider returned ${value.role} message instead of assistant`);\n }\n return value;\n }\n return partialAssistantMessage(streamed, fallbackStopReason);\n};\n\nconst isAssistantMessage = (message: ScorelMessage): message is ScorelMessage & { role: \"assistant\" } =>\n message.role === \"assistant\";\n\ntype StreamedAssistantContent = {\n thinking: string;\n text: string;\n};\n\nconst partialAssistantMessage = (\n streamed: StreamedAssistantContent,\n stopReason: StopReason,\n): (ScorelMessage & { role: \"assistant\" }) | undefined => {\n if (streamed.thinking.length === 0 && streamed.text.length === 0) {\n return undefined;\n }\n return {\n role: \"assistant\",\n content: [\n ...(streamed.thinking ? [{ type: \"thinking\" as const, text: streamed.thinking }] : []),\n ...(streamed.text ? [{ type: \"text\" as const, text: streamed.text }] : []),\n ],\n stopReason,\n meta: stopReason === \"end_turn\" ? undefined : { partial: true },\n };\n};\n", "import { createHash } from \"node:crypto\";\nimport { appendFile, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport {\n asSeq,\n type DeviceId,\n type EventId,\n type HarnessItemEvent,\n type InstructionSnapshot,\n type PersistentEvent,\n type QueueItem,\n type QueueName,\n type ScorelMessage,\n type SystemReminderKind,\n type SystemReminderScope,\n type SystemReminderVisibility,\n type SkillIndexEntry,\n type Seq,\n type SessionId,\n type SessionMeta,\n} from \"@scorel/protocol\";\n\nimport {\n appendSystemReminderToToolResult,\n cloneSystemReminderBlock,\n createSystemReminderBlock,\n systemReminderMessage,\n} from \"../reminders/index.js\";\n\ntype MessagePersistentEvent = Extract<PersistentEvent, { message: ScorelMessage }>;\ntype CompactPersistentEvent = Extract<PersistentEvent, { type: \"compact\" }>;\ntype ConversationPersistentEvent = MessagePersistentEvent | HarnessItemEvent | CompactPersistentEvent;\n\nexport const snipUserMessageAlias = (eventId: EventId): string =>\n `u_${createHash(\"sha256\").update(eventId).digest(\"hex\").slice(0, 8)}`;\n\nexport type HiddenUserTurnSpan = {\n anchorUserEventId: EventId;\n throughEventId: EventId;\n};\n\nexport type SessionControlState = {\n instructionSnapshot?: InstructionSnapshot;\n queues: Record<QueueName, QueueItem[]>;\n skillIndexInitialized: boolean;\n skillIndex: Record<string, SkillIndexEntry>;\n hiddenUserTurnSpans: HiddenUserTurnSpan[];\n};\n\nexport type SessionHeader = {\n version: 1;\n sessionId: SessionId;\n deviceId: DeviceId;\n createdAt: number;\n clonedFrom?: {\n sessionId: SessionId;\n deviceId: DeviceId;\n eventId: EventId;\n };\n meta: SessionMeta;\n};\n\nexport type SessionStoreErrorCode =\n | \"missing_header\"\n | \"invalid_header\"\n | \"invalid_event\"\n | \"invalid_json\"\n | \"duplicate_event_id\"\n | \"invalid_parent\"\n | \"non_monotonic_seq\"\n | \"session_mismatch\";\n\nexport class SessionStoreError extends Error {\n readonly code: SessionStoreErrorCode;\n readonly line?: number;\n\n constructor(code: SessionStoreErrorCode, message: string, options?: { line?: number }) {\n super(message);\n this.name = \"SessionStoreError\";\n this.code = code;\n this.line = options?.line;\n }\n}\n\nexport type TreeNode = {\n readonly event: PersistentEvent;\n readonly children: readonly EventId[];\n};\n\ntype MutableTreeNode = {\n event: PersistentEvent;\n children: EventId[];\n};\n\nexport class SessionTree implements Iterable<PersistentEvent> {\n #nodes = new Map<EventId, MutableTreeNode>();\n #events = new Map<EventId, PersistentEvent>();\n #order: EventId[] = [];\n #conversationOrder: EventId[] = [];\n #rootId: EventId | null = null;\n #currentSeq = asSeq(0);\n readonly controlState: SessionControlState = {\n queues: {\n follow_up: [],\n steer: [],\n },\n skillIndexInitialized: false,\n skillIndex: {},\n hiddenUserTurnSpans: [],\n };\n\n get rootId(): EventId | null {\n return this.#rootId;\n }\n\n get size(): number {\n return this.#events.size;\n }\n\n get currentSeq(): Seq {\n return this.#currentSeq;\n }\n\n get(id: EventId): TreeNode | undefined {\n const node = this.#nodes.get(id);\n if (!node) {\n return undefined;\n }\n return {\n event: node.event,\n children: [...node.children],\n };\n }\n\n has(id: EventId): boolean {\n return this.#events.has(id);\n }\n\n append(event: PersistentEvent): void {\n this.assertCanAppend(event);\n\n this.#events.set(event.id, event);\n this.#order.push(event.id);\n this.#currentSeq = event.seq;\n this.#applyControlEvent(event);\n\n if (!isConversationEvent(event)) {\n return;\n }\n\n if (event.parentId !== null) {\n this.#nodes.get(event.parentId)?.children.push(event.id);\n } else {\n this.#rootId = event.id;\n }\n this.#nodes.set(event.id, { event, children: [] });\n this.#conversationOrder.push(event.id);\n }\n\n assertCanAppend(event: PersistentEvent): void {\n assertTreeEvent(event);\n\n if (this.#events.has(event.id)) {\n throw new SessionStoreError(\"duplicate_event_id\", `Duplicate event id: ${event.id}`);\n }\n\n if (Number(event.seq) <= Number(this.#currentSeq)) {\n throw new SessionStoreError(\n \"non_monotonic_seq\",\n `Event seq ${String(event.seq)} must be greater than ${String(this.#currentSeq)}`,\n );\n }\n\n if (!isConversationEvent(event)) {\n return;\n }\n\n if (event.parentId === null) {\n if (this.#rootId !== null) {\n throw new SessionStoreError(\"invalid_parent\", \"Only the first event can have a null parentId\");\n }\n } else {\n const parent = this.#nodes.get(event.parentId);\n if (!parent) {\n throw new SessionStoreError(\"invalid_parent\", `Missing parent event: ${event.parentId}`);\n }\n }\n }\n\n getLeaves(): EventId[] {\n return this.#conversationOrder.filter((id) => this.#nodes.get(id)?.children.length === 0);\n }\n\n getChildren(id: EventId): EventId[] {\n return [...(this.#nodes.get(id)?.children ?? [])];\n }\n\n getPath(id: EventId): EventId[] {\n if (!this.#nodes.has(id)) {\n throw new SessionStoreError(\"invalid_parent\", `Unknown event id: ${id}`);\n }\n\n const path: EventId[] = [];\n let current: EventId | null = id;\n while (current !== null) {\n const node = this.#nodes.get(current);\n if (!node) {\n throw new SessionStoreError(\"invalid_parent\", `Broken path at event id: ${current}`);\n }\n path.push(current);\n current = node.event.parentId;\n }\n return path.reverse();\n }\n\n getBranchPoints(): EventId[] {\n return this.#conversationOrder.filter((id) => (this.#nodes.get(id)?.children.length ?? 0) > 1);\n }\n\n *[Symbol.iterator](): Iterator<PersistentEvent> {\n for (const id of this.#order) {\n const event = this.#events.get(id);\n if (event) {\n yield event;\n }\n }\n }\n\n #applyControlEvent(event: PersistentEvent): void {\n if (event.type === \"instruction_snapshot\") {\n this.controlState.instructionSnapshot = event.snapshot;\n } else if (event.type === \"queue_update\") {\n this.controlState.queues[event.queue] = [...event.items];\n } else if (event.type === \"skill_index_snapshot\") {\n this.controlState.skillIndexInitialized = true;\n this.controlState.skillIndex = Object.fromEntries(event.entries.map((entry) => [entry.name, entry]));\n } else if (event.type === \"skill_index_delta\") {\n this.controlState.skillIndexInitialized = true;\n const next = { ...this.controlState.skillIndex };\n for (const entry of event.added) {\n next[entry.name] = entry;\n }\n for (const entry of event.changed) {\n next[entry.name] = entry;\n }\n for (const removed of event.removed) {\n delete next[removed.name];\n }\n this.controlState.skillIndex = next;\n } else if (event.type === \"context_control\") {\n this.controlState.hiddenUserTurnSpans = [\n ...this.controlState.hiddenUserTurnSpans.filter(\n (span) => span.anchorUserEventId !== event.anchorUserEventId,\n ),\n {\n anchorUserEventId: event.anchorUserEventId,\n throughEventId: event.throughEventId,\n },\n ];\n }\n }\n}\n\nexport type CreateSessionOptions = {\n sessionsDir: string;\n header: SessionHeader;\n};\n\nexport type LoadSessionOptions =\n | {\n sessionsDir: string;\n sessionId: SessionId;\n filePath?: never;\n }\n | {\n filePath: string;\n sessionsDir?: never;\n sessionId?: never;\n };\n\nexport class JsonlSession {\n readonly filePath: string;\n readonly header: SessionHeader;\n readonly tree: SessionTree;\n\n constructor(filePath: string, header: SessionHeader, tree = new SessionTree()) {\n this.filePath = filePath;\n this.header = header;\n this.tree = tree;\n }\n\n get activeLeafId(): EventId | null {\n const leaves = this.tree.getLeaves();\n return leaves.at(-1) ?? null;\n }\n\n get currentSeq(): Seq {\n return this.tree.currentSeq;\n }\n\n async append(event: PersistentEvent): Promise<PersistentEvent> {\n validateSessionMatch(this.header, event);\n this.tree.assertCanAppend(event);\n await appendFile(this.filePath, `${JSON.stringify(event)}\\n`, \"utf8\");\n this.tree.append(event);\n return event;\n }\n\n async close(): Promise<void> {\n return Promise.resolve();\n }\n}\n\nexport const sessionFilePath = (sessionsDir: string, sessionId: SessionId): string =>\n join(sessionsDir, `${sessionId}.jsonl`);\n\nexport const sessionLogFilePath = (sessionsDir: string, sessionId: SessionId): string =>\n join(sessionsDir, `${sessionId}.log`);\n\nexport const sessionArtifactsDirPath = (sessionsDir: string, sessionId: SessionId): string =>\n join(sessionsDir, `${sessionId}.artifacts`);\n\nexport const createSession = async ({ sessionsDir, header }: CreateSessionOptions): Promise<JsonlSession> => {\n const validHeader = parseHeader(header);\n await mkdir(sessionsDir, { recursive: true });\n const filePath = sessionFilePath(sessionsDir, validHeader.sessionId);\n await writeFile(filePath, `${JSON.stringify(validHeader)}\\n`, { encoding: \"utf8\", flag: \"wx\" });\n return new JsonlSession(filePath, validHeader);\n};\n\nexport const loadSession = async (options: LoadSessionOptions): Promise<JsonlSession> => {\n const filePath =\n options.filePath !== undefined ? options.filePath : sessionFilePath(options.sessionsDir, options.sessionId);\n const content = await readFile(filePath, \"utf8\");\n const lines: string[] = content.split(/\\r?\\n/);\n const headerLine = lines[0];\n\n if (!headerLine) {\n throw new SessionStoreError(\"missing_header\", \"Session file is missing a header\");\n }\n\n const parsedLines = lines\n .map((line: string, index: number) => ({ line, lineNumber: index + 1 }))\n .filter(({ line }) => line.length > 0)\n .map(({ line, lineNumber }) => parseJsonLine(line, lineNumber));\n\n const header = parseHeader(parsedLines[0]);\n\n const tree = new SessionTree();\n for (const event of parsedLines.slice(1)) {\n tree.append(parseSessionEvent(header, event));\n }\n\n await mkdir(dirname(filePath), { recursive: true });\n return new JsonlSession(filePath, header, tree);\n};\n\nexport const buildContext = (tree: SessionTree, leafId: EventId): ScorelMessage[] => {\n const path = tree.getPath(leafId);\n const hiddenIds = hiddenContextEventIds(tree, path, leafId);\n return path.reduce<ScorelMessage[]>((messages, id, index) => {\n if (hiddenIds.has(id)) {\n return messages;\n }\n const event = tree.get(id)?.event;\n if (!event) {\n return messages;\n }\n if (\"message\" in event) {\n messages.push(cloneMessage(event.message));\n return messages;\n }\n if (event.type === \"harness_item\") {\n appendHarnessItemToContext(messages, event);\n }\n if (event.type === \"compact\") {\n const retained = retainedMessagesBeforeCompact(tree, path.slice(0, index), event.retainedEventCount, hiddenIds);\n messages.length = 0;\n messages.push(compactSummaryMessage(event));\n messages.push(...retained);\n }\n return messages;\n }, []);\n};\n\nconst hiddenContextEventIds = (tree: SessionTree, path: EventId[], leafId: EventId): Set<EventId> => {\n const leaf = tree.get(leafId)?.event;\n if (!leaf) {\n return new Set();\n }\n const pathIndexes = new Map(path.map((id, index) => [id, index]));\n const hidden = new Set<EventId>();\n for (const event of tree) {\n if (event.type !== \"context_control\" || Number(event.seq) > Number(leaf.seq)) {\n continue;\n }\n const start = pathIndexes.get(event.anchorUserEventId);\n const end = pathIndexes.get(event.throughEventId);\n if (start === undefined || end === undefined || end < start) {\n continue;\n }\n for (const id of path.slice(start, end + 1)) {\n hidden.add(id);\n }\n }\n return hidden;\n};\n\nconst retainedMessagesBeforeCompact = (\n tree: SessionTree,\n pathBeforeCompact: EventId[],\n retainedEventCount: number,\n hiddenIds = new Set<EventId>(),\n): ScorelMessage[] => {\n if (retainedEventCount <= 0) {\n return [];\n }\n const candidateStart = Math.max(0, pathBeforeCompact.length - retainedEventCount);\n let start = pathBeforeCompact.length;\n for (let index = candidateStart; index < pathBeforeCompact.length; index += 1) {\n const event = tree.get(pathBeforeCompact[index])?.event;\n if (isRetainedContextStart(event)) {\n start = index;\n break;\n }\n }\n const retained: ScorelMessage[] = [];\n for (const id of pathBeforeCompact.slice(start)) {\n if (hiddenIds.has(id)) {\n continue;\n }\n const event = tree.get(id)?.event;\n if (!event) {\n continue;\n }\n if (\"message\" in event) {\n retained.push(cloneMessage(event.message));\n } else if (event.type === \"harness_item\") {\n appendHarnessItemToContext(retained, event);\n } else if (event.type === \"compact\") {\n retained.length = 0;\n retained.push(compactSummaryMessage(event));\n }\n }\n return retained;\n};\n\nconst isRetainedContextStart = (event: PersistentEvent | undefined): boolean =>\n event?.type === \"user_message\" ||\n event?.type === \"compact\" ||\n (\n event?.type === \"assistant_message\" &&\n event.message.content.some((block) => block.type === \"tool_call\")\n );\n\nconst parseJsonLine = (line: string, lineNumber: number): unknown => {\n try {\n return JSON.parse(line);\n } catch (cause) {\n throw new SessionStoreError(\"invalid_json\", `Invalid JSON at line ${lineNumber}`, { line: lineNumber });\n }\n};\n\nconst parseHeader = (value: unknown): SessionHeader => {\n if (!isRecord(value)) {\n throw new SessionStoreError(\"invalid_header\", \"Session header must be an object\");\n }\n if (value.version !== 1 || typeof value.sessionId !== \"string\" || typeof value.deviceId !== \"string\") {\n throw new SessionStoreError(\"invalid_header\", \"Session header is missing required identity fields\");\n }\n if (typeof value.createdAt !== \"number\" || !isRecord(value.meta)) {\n throw new SessionStoreError(\"invalid_header\", \"Session header is missing createdAt or meta\");\n }\n if (typeof value.meta.projectId !== \"string\" || value.meta.projectId.length === 0) {\n throw new SessionStoreError(\"invalid_header\", \"Session header is missing meta.projectId\");\n }\n return value as SessionHeader;\n};\n\nconst parseSessionEvent = (header: SessionHeader, value: unknown): PersistentEvent => {\n validateSessionMatch(header, value);\n assertTreeEvent(value);\n return value;\n};\n\nconst validateSessionMatch = (header: SessionHeader, value: unknown): void => {\n if (!isRecord(value) || typeof value.sessionId !== \"string\") {\n throw new SessionStoreError(\"invalid_header\", \"Event must be an object with a sessionId\");\n }\n if (value.sessionId !== header.sessionId) {\n throw new SessionStoreError(\"session_mismatch\", `Event belongs to ${value.sessionId}, expected ${header.sessionId}`);\n }\n};\n\nfunction assertTreeEvent(value: unknown): asserts value is PersistentEvent {\n if (!isRecord(value)) {\n throw new SessionStoreError(\"invalid_event\", \"Event must be an object\");\n }\n if (value.type === \"session_header\") {\n throw new SessionStoreError(\"invalid_event\", \"Session header must be stored as the JSONL header line\");\n }\n if (\n value.type !== \"user_message\" &&\n value.type !== \"assistant_message\" &&\n value.type !== \"tool_result\" &&\n value.type !== \"session_title_updated\" &&\n value.type !== \"instruction_snapshot\" &&\n value.type !== \"harness_item\" &&\n value.type !== \"compact\" &&\n value.type !== \"context_control\" &&\n value.type !== \"queue_update\" &&\n value.type !== \"skill_index_snapshot\" &&\n value.type !== \"skill_index_delta\"\n ) {\n throw new SessionStoreError(\"invalid_event\", \"Unsupported session event type\");\n }\n if (\n typeof value.id !== \"string\" ||\n (value.parentId !== null && typeof value.parentId !== \"string\") ||\n typeof value.seq !== \"number\" ||\n typeof value.clientId !== \"string\" ||\n typeof value.ts !== \"number\"\n ) {\n throw new SessionStoreError(\"invalid_event\", \"Event is missing required base fields\");\n }\n if (\n (value.type === \"user_message\" || value.type === \"assistant_message\" || value.type === \"tool_result\") &&\n !isRecord(value.message)\n ) {\n throw new SessionStoreError(\"invalid_event\", \"Message event is missing message payload\");\n }\n if (value.type === \"session_title_updated\" && !isSessionTitleUpdated(value)) {\n throw new SessionStoreError(\"invalid_event\", \"session_title_updated is missing title payload\");\n }\n if (value.type === \"instruction_snapshot\" && !isInstructionSnapshot(value.snapshot)) {\n throw new SessionStoreError(\"invalid_event\", \"instruction_snapshot is missing snapshot payload\");\n }\n if (value.type === \"harness_item\" && !isHarnessItem(value.item)) {\n throw new SessionStoreError(\"invalid_event\", \"harness_item is missing item payload\");\n }\n if (value.type === \"compact\" && !isCompactEvent(value)) {\n throw new SessionStoreError(\"invalid_event\", \"compact is missing summary payload\");\n }\n if (value.type === \"context_control\" && !isContextControlEvent(value)) {\n throw new SessionStoreError(\"invalid_event\", \"context_control is missing hide_user_turn payload\");\n }\n if (value.type === \"queue_update\" && !isQueueUpdate(value)) {\n throw new SessionStoreError(\"invalid_event\", \"queue_update is missing queue payload\");\n }\n if (value.type === \"skill_index_snapshot\" && !isSkillIndexSnapshot(value)) {\n throw new SessionStoreError(\"invalid_event\", \"skill_index_snapshot is missing entries\");\n }\n if (value.type === \"skill_index_delta\" && !isSkillIndexDelta(value)) {\n throw new SessionStoreError(\"invalid_event\", \"skill_index_delta is missing delta payload\");\n }\n}\n\nconst isConversationEvent = (event: PersistentEvent): event is ConversationPersistentEvent =>\n event.type === \"user_message\" ||\n event.type === \"assistant_message\" ||\n event.type === \"tool_result\" ||\n event.type === \"harness_item\" ||\n event.type === \"compact\";\n\nconst isInstructionSnapshot = (value: unknown): value is InstructionSnapshot => {\n if (!isRecord(value) || value.version !== 1 || typeof value.cwd !== \"string\" || !Array.isArray(value.sections)) {\n return false;\n }\n return value.sections.every(\n (section) =>\n isRecord(section) &&\n typeof section.kind === \"string\" &&\n typeof section.frozenAt === \"number\" &&\n typeof section.renderedBlock === \"string\",\n );\n};\n\nconst isHarnessItem = (value: unknown): boolean =>\n isRecord(value) &&\n typeof value.kind === \"string\" &&\n typeof value.origin === \"string\" &&\n typeof value.content === \"string\" &&\n (value.visibility === \"display\" || value.visibility === \"hidden\" || value.visibility === \"compact\");\n\nconst isCompactEvent = (value: Record<string, unknown>): boolean =>\n typeof value.summary === \"string\" &&\n typeof value.compactedThrough === \"string\" &&\n typeof value.tokensBefore === \"number\" &&\n typeof value.tokensAfter === \"number\" &&\n typeof value.retainedEventCount === \"number\";\n\nconst isContextControlEvent = (value: Record<string, unknown>): boolean =>\n value.operation === \"hide_user_turn\" &&\n typeof value.anchorUserEventId === \"string\" &&\n typeof value.throughEventId === \"string\" &&\n (value.actor === \"agent\" || value.actor === \"user\" || value.actor === \"system\") &&\n (value.reason === undefined || typeof value.reason === \"string\");\n\nconst isQueueUpdate = (value: Record<string, unknown>): boolean =>\n (value.queue === \"follow_up\" || value.queue === \"steer\") &&\n value.operation === \"rewrite\" &&\n Array.isArray(value.items) &&\n (value.anchorEventId === null || typeof value.anchorEventId === \"string\") &&\n value.items.every(\n (item) =>\n isRecord(item) &&\n typeof item.id === \"string\" &&\n Array.isArray(item.content) &&\n typeof item.createdAt === \"number\" &&\n typeof item.updatedAt === \"number\" &&\n typeof item.clientId === \"string\",\n );\n\nconst isSessionTitleUpdated = (value: Record<string, unknown>): boolean =>\n typeof value.title === \"string\" &&\n value.title.length > 0 &&\n (value.source === \"model\" || value.source === \"user\") &&\n (value.derivedFrom === undefined ||\n (isRecord(value.derivedFrom) &&\n typeof value.derivedFrom.eventId === \"string\" &&\n typeof value.derivedFrom.seq === \"number\"));\n\nconst isSkillIndexSnapshot = (value: Record<string, unknown>): boolean =>\n (value.anchorEventId === null || typeof value.anchorEventId === \"string\") &&\n Array.isArray(value.entries) &&\n value.entries.every(isSkillIndexEntry);\n\nconst isSkillIndexDelta = (value: Record<string, unknown>): boolean =>\n (value.anchorEventId === null || typeof value.anchorEventId === \"string\") &&\n Array.isArray(value.added) &&\n Array.isArray(value.changed) &&\n Array.isArray(value.removed) &&\n value.added.every(isSkillIndexEntry) &&\n value.changed.every(isSkillIndexEntry) &&\n value.removed.every(\n (item) => isRecord(item) && typeof item.name === \"string\" && typeof item.previousPath === \"string\",\n );\n\nconst isSkillIndexEntry = (value: unknown): value is SkillIndexEntry =>\n isRecord(value) &&\n typeof value.name === \"string\" &&\n typeof value.path === \"string\" &&\n (value.scope === \"user\" || value.scope === \"project\" || value.scope === \"extension\") &&\n typeof value.description === \"string\" &&\n typeof value.mtimeMs === \"number\" &&\n typeof value.size === \"number\" &&\n typeof value.contentHash === \"string\" &&\n typeof value.priority === \"number\";\n\nconst appendHarnessItemToContext = (messages: ScorelMessage[], event: HarnessItemEvent): void => {\n const reminder = createSystemReminderBlock({\n kind: reminderKindFromHarness(event.item.kind),\n origin: event.item.origin,\n text: event.item.content,\n visibility: reminderVisibilityFromHarness(event.item.visibility),\n scope: reminderScopeFromHarness(event.item.kind),\n ...(event.item.data ? { data: event.item.data } : {}),\n });\n const last = messages.at(-1);\n if (last?.role === \"tool_result\" && appendSystemReminderToToolResult(last, reminder)) {\n return;\n }\n messages.push(systemReminderMessage(reminder, {\n source: \"harness_item\",\n harnessKind: event.item.kind,\n harnessOrigin: event.item.origin,\n }));\n};\n\nconst compactSummaryMessage = (event: CompactPersistentEvent): ScorelMessage => ({\n role: \"user\",\n content: [createSystemReminderBlock({\n kind: \"compact_summary\",\n origin: \"system\",\n text: [\n \"Earlier session context has been compacted.\",\n \"\",\n event.summary.trim(),\n \"\",\n \"Use this summary as continuity context. Verify current repository facts before acting.\",\n ].join(\"\\n\"),\n visibility: \"model\",\n scope: \"session\",\n })],\n meta: {\n source: \"compact\",\n compactedThrough: event.compactedThrough,\n },\n});\n\nconst reminderKindFromHarness = (kind: HarnessItemEvent[\"item\"][\"kind\"]): SystemReminderKind => {\n if (\n kind === \"attachment\" ||\n kind === \"skill_listing\" ||\n kind === \"skill_delta\" ||\n kind === \"memory\" ||\n kind === \"channel_context\" ||\n kind === \"steer\" ||\n kind === \"runtime_notice\"\n ) {\n return kind;\n }\n if (kind === \"date_change\") {\n return \"time\";\n }\n return \"runtime_notice\";\n};\n\nconst reminderVisibilityFromHarness = (\n visibility: HarnessItemEvent[\"item\"][\"visibility\"],\n): SystemReminderVisibility => {\n if (visibility === \"hidden\") {\n return \"model\";\n }\n return visibility;\n};\n\nconst reminderScopeFromHarness = (kind: HarnessItemEvent[\"item\"][\"kind\"]): SystemReminderScope => {\n if (kind === \"steer\" || kind === \"skill_delta\" || kind === \"runtime_notice\") {\n return \"next_model_call\";\n }\n if (kind === \"channel_context\" || kind === \"attachment\" || kind === \"date_change\") {\n return \"turn\";\n }\n return \"session\";\n};\n\nconst cloneMessage = (message: ScorelMessage): ScorelMessage => ({\n ...message,\n content: message.content.map((block) => {\n if (block.type === \"system_reminder\") {\n return cloneSystemReminderBlock(block);\n }\n if (block.type !== \"tool_result\" || !isRecord(block.result)) {\n return { ...block };\n }\n const content = Array.isArray(block.result.content)\n ? { content: block.result.content.map((item) => (isRecord(item) ? { ...item } : item)) }\n : {};\n return {\n ...block,\n result: {\n content: content.content ?? [],\n },\n };\n }),\n ...(message.meta ? { meta: { ...message.meta } } : {}),\n});\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n", "import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\n\nimport { Type } from \"@mariozechner/pi-ai\";\n\nimport type { SkillIndexEntry } from \"@scorel/protocol\";\n\nimport { defineTool, type AgentTool } from \"../tools/index.js\";\n\nexport type ScanSkillIndexOptions = {\n cwd: string;\n homeDir?: string;\n extensionSkillRoots?: Array<{ path: string; extensionId: string }>;\n};\n\nexport type SkillIndexDelta = {\n added: SkillIndexEntry[];\n changed: SkillIndexEntry[];\n removed: { name: string; previousPath: string }[];\n};\n\nexport type CreateSkillToolOptions = {\n getEntry: (name: string) => SkillIndexEntry | undefined;\n listNames: () => string[];\n};\n\nexport const scanSkillIndex = async (options: ScanSkillIndexOptions): Promise<SkillIndexEntry[]> => {\n const cwd = resolve(options.cwd);\n const homeDir = resolve(options.homeDir ?? homedir());\n const roots = [\n ...projectSkillRoots(cwd, homeDir),\n { path: join(homeDir, \".scorel\", \"skills\"), scope: \"user\" as const, priority: 0 },\n ...(options.extensionSkillRoots ?? []).map((root, index) => ({\n path: root.path,\n scope: \"extension\" as const,\n priority: -100 - index,\n })),\n ];\n const byName = new Map<string, SkillIndexEntry>();\n\n for (const root of roots) {\n let children: string[];\n try {\n children = await readdir(root.path);\n } catch (cause) {\n if (isNodeErrorCode(cause, \"ENOENT\") || isNodeErrorCode(cause, \"ENOTDIR\")) {\n continue;\n }\n throw cause;\n }\n for (const child of children.sort()) {\n const entry = await readSkillEntry({\n name: child,\n skillPath: join(root.path, child, \"SKILL.md\"),\n scope: root.scope,\n priority: root.priority,\n });\n if (!entry || byName.has(entry.name)) {\n continue;\n }\n byName.set(entry.name, entry);\n }\n }\n\n return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name));\n};\n\nexport const diffSkillIndex = (\n previous: Record<string, SkillIndexEntry>,\n nextEntries: SkillIndexEntry[],\n): SkillIndexDelta => {\n const next = Object.fromEntries(nextEntries.map((entry) => [entry.name, entry]));\n const added: SkillIndexEntry[] = [];\n const changed: SkillIndexEntry[] = [];\n const removed: { name: string; previousPath: string }[] = [];\n\n for (const entry of nextEntries) {\n const old = previous[entry.name];\n if (!old) {\n added.push(entry);\n } else if (\n old.path !== entry.path ||\n old.contentHash !== entry.contentHash ||\n old.mtimeMs !== entry.mtimeMs ||\n old.size !== entry.size\n ) {\n changed.push(entry);\n }\n }\n for (const old of Object.values(previous)) {\n if (!next[old.name]) {\n removed.push({ name: old.name, previousPath: old.path });\n }\n }\n\n return { added, changed, removed };\n};\n\nexport const hasSkillIndexDelta = (delta: SkillIndexDelta): boolean =>\n delta.added.length > 0 || delta.changed.length > 0 || delta.removed.length > 0;\n\nexport const renderSkillListing = (entries: SkillIndexEntry[]): string => {\n if (entries.length === 0) {\n return \"No skills are currently available for the Skill tool.\";\n }\n return [\n \"The following skills are available for use with the Skill tool:\",\n \"\",\n ...entries.map((entry) => `- ${entry.name}: ${entry.description}`),\n ].join(\"\\n\");\n};\n\nexport const renderSkillDelta = (delta: SkillIndexDelta): string => {\n const lines = [\"Skill updates detected:\"];\n if (delta.added.length > 0) {\n lines.push(\"\", \"Added:\", ...delta.added.map((entry) => `- ${entry.name}: ${entry.description}`));\n }\n if (delta.changed.length > 0) {\n lines.push(\"\", \"Changed:\", ...delta.changed.map((entry) => `- ${entry.name}: ${entry.description}`));\n }\n if (delta.removed.length > 0) {\n lines.push(\"\", \"Removed:\", ...delta.removed.map((entry) => `- ${entry.name}`));\n }\n return lines.join(\"\\n\");\n};\n\nexport const createSkillTool = (options: CreateSkillToolOptions): AgentTool =>\n defineTool({\n name: \"Skill\",\n description: \"Load the full SKILL.md instructions for an available session-indexed skill by name.\",\n parameters: Type.Object({\n name: Type.String(),\n args: Type.Optional(Type.String()),\n }),\n execute: async (_toolCallId, args) => {\n const input = parseSkillArgs(args);\n const entry = options.getEntry(input.name);\n if (!entry) {\n throw new Error(`Unknown skill: ${input.name}. Available skills: ${options.listNames().join(\", \") || \"none\"}`);\n }\n const content = await readFile(entry.path, \"utf8\");\n return {\n content: [{ type: \"text\", text: content }],\n details: {\n skill: {\n name: entry.name,\n path: entry.path,\n scope: entry.scope,\n args: input.args,\n },\n },\n };\n },\n });\n\nconst projectSkillRoots = (cwd: string, homeDir: string): Array<{ path: string; scope: \"project\"; priority: number }> => {\n const roots: string[] = [];\n const gitRoot = findGitRoot(cwd);\n const stopAt = gitRoot ?? homeDir;\n let current = cwd;\n\n while (true) {\n if (current !== homeDir) {\n roots.push(join(current, \".scorel\", \"skills\"));\n }\n if (current === stopAt || current === dirname(current)) {\n break;\n }\n const next = dirname(current);\n if (!gitRoot && next === homeDir) {\n break;\n }\n current = next;\n }\n\n return roots.map((path, index) => ({ path, scope: \"project\", priority: 100 + index }));\n};\n\nconst readSkillEntry = async (options: {\n name: string;\n skillPath: string;\n scope: \"user\" | \"project\" | \"extension\";\n priority: number;\n}): Promise<SkillIndexEntry | undefined> => {\n let fileStat;\n let content: string;\n try {\n [fileStat, content] = await Promise.all([stat(options.skillPath), readFile(options.skillPath, \"utf8\")]);\n } catch (cause) {\n if (isNodeErrorCode(cause, \"ENOENT\") || isNodeErrorCode(cause, \"ENOTDIR\")) {\n return undefined;\n }\n throw cause;\n }\n const parsed = parseSkillMetadata(content);\n const description = parsed.description ?? firstParagraph(content);\n if (!description) {\n return undefined;\n }\n return {\n name: options.name,\n path: options.skillPath,\n scope: options.scope,\n description,\n ...(parsed.displayName ? { displayName: parsed.displayName } : {}),\n mtimeMs: fileStat.mtimeMs,\n size: fileStat.size,\n contentHash: createHash(\"sha256\").update(content).digest(\"hex\"),\n priority: options.priority,\n };\n};\n\nconst parseSkillMetadata = (content: string): { displayName?: string; description?: string } => {\n if (!content.startsWith(\"---\\n\")) {\n return {};\n }\n const end = content.indexOf(\"\\n---\", 4);\n if (end < 0) {\n return {};\n }\n const frontmatter = content.slice(4, end).split(/\\r?\\n/);\n const metadata: { displayName?: string; description?: string } = {};\n for (const line of frontmatter) {\n const match = /^([A-Za-z_][A-Za-z0-9_-]*):\\s*(.*)$/.exec(line);\n if (!match) {\n continue;\n }\n const value = match[2]?.replace(/^[\"']|[\"']$/g, \"\").trim();\n if (!value) {\n continue;\n }\n if (match[1] === \"name\") {\n metadata.displayName = value;\n } else if (match[1] === \"description\") {\n metadata.description = value;\n }\n }\n return metadata;\n};\n\nconst firstParagraph = (content: string): string | undefined => {\n const frontmatterEnd = content.startsWith(\"---\\n\") ? content.indexOf(\"\\n---\", 4) : -1;\n const body = frontmatterEnd >= 0 ? content.slice(frontmatterEnd + 4) : content;\n return body\n .split(/\\n\\s*\\n/)\n .map((part) => part.trim().replace(/^#\\s+.+\\n?/, \"\").trim())\n .find((part) => part.length > 0);\n};\n\nconst parseSkillArgs = (args: unknown): { name: string; args?: string } => {\n if (typeof args !== \"object\" || args === null || Array.isArray(args)) {\n throw new Error(\"Skill args must be an object\");\n }\n const input = args as { name?: unknown; args?: unknown };\n if (typeof input.name !== \"string\" || input.name.length === 0) {\n throw new Error(\"Skill name must be a non-empty string\");\n }\n return {\n name: input.name,\n ...(typeof input.args === \"string\" ? { args: input.args } : {}),\n };\n};\n\nconst findGitRoot = (cwd: string): string | undefined => {\n let current = cwd;\n while (true) {\n if (existsSync(join(current, \".git\"))) {\n return current;\n }\n const next = dirname(current);\n if (next === current) {\n return undefined;\n }\n current = next;\n }\n};\n\nconst isNodeErrorCode = (cause: unknown, code: string): boolean =>\n cause instanceof Error && \"code\" in cause && cause.code === code;\n", "import { protocolPackageName, protocolVersion, type ScorelEvent } from \"@scorel/protocol\";\n\nexport const corePackageName = \"@scorel/core\" as const;\nexport const coreProtocolDependency = protocolPackageName;\nexport const coreProtocolVersion = protocolVersion;\nexport type CoreScorelEvent = ScorelEvent;\n\nexport * from \"./config/index.js\";\nexport * from \"./channel/index.js\";\nexport * from \"./extensions/index.js\";\nexport * from \"./instructions/index.js\";\nexport * from \"./memory/index.js\";\nexport * from \"./provider/pi-ai.js\";\nexport * from \"./reminders/index.js\";\nexport * from \"./runtime/index.js\";\nexport * from \"./session/index.js\";\nexport * from \"./skills/index.js\";\nexport * from \"./tools/index.js\";\n", "import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { asDeviceId, type ClientId, type DeviceId } from \"@scorel/protocol\";\n\nexport type HostDeviceIdentity = {\n version: 1;\n deviceId: DeviceId;\n displayName: string;\n};\n\nexport type HostRelayAuthFile = {\n version: 1;\n clients: Array<{\n clientId: ClientId;\n createdAt: number;\n label?: string;\n }>;\n};\n\nexport const hostDeviceIdentityPath = (stateDir: string): string => join(stateDir, \"device.json\");\n\nexport const hostRelayAuthPath = (stateDir: string): string => join(stateDir, \"relay-auth.json\");\n\nexport const loadOrCreateHostDeviceIdentity = async (\n options: { stateDir: string; displayName?: string; now?: () => number },\n): Promise<HostDeviceIdentity> => {\n const existing = await readHostDeviceIdentity(options.stateDir);\n if (existing) {\n return existing;\n }\n const identity: HostDeviceIdentity = {\n version: 1,\n deviceId: asDeviceId(`device_${randomUUID()}`),\n displayName: options.displayName ?? \"Local daemon\",\n };\n await mkdir(options.stateDir, { recursive: true });\n await writeFile(hostDeviceIdentityPath(options.stateDir), `${JSON.stringify(identity, null, 2)}\\n`);\n return identity;\n};\n\nexport const readHostDeviceIdentity = async (stateDir: string): Promise<HostDeviceIdentity | null> => {\n try {\n const raw = JSON.parse(await readFile(hostDeviceIdentityPath(stateDir), \"utf8\")) as Partial<HostDeviceIdentity>;\n if (raw.version !== 1 || typeof raw.deviceId !== \"string\" || typeof raw.displayName !== \"string\") {\n return null;\n }\n return {\n version: 1,\n deviceId: asDeviceId(raw.deviceId),\n displayName: raw.displayName,\n };\n } catch (cause) {\n if (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") {\n return null;\n }\n throw cause;\n }\n};\n\nexport const readHostRelayAuth = async (stateDir: string): Promise<HostRelayAuthFile> => {\n try {\n const raw = JSON.parse(await readFile(hostRelayAuthPath(stateDir), \"utf8\")) as Partial<HostRelayAuthFile>;\n if (raw.version !== 1 || !Array.isArray(raw.clients)) {\n return emptyAuthFile();\n }\n return {\n version: 1,\n clients: raw.clients.filter((client): client is HostRelayAuthFile[\"clients\"][number] => typeof client.clientId === \"string\" && typeof client.createdAt === \"number\"),\n };\n } catch (cause) {\n if (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") {\n return emptyAuthFile();\n }\n throw cause;\n }\n};\n\nexport const authorizeRelayClient = async (\n options: { stateDir: string; clientId: ClientId; label?: string; now?: () => number },\n): Promise<HostRelayAuthFile> => {\n const auth = await readHostRelayAuth(options.stateDir);\n const existing = auth.clients.find((client) => client.clientId === options.clientId);\n if (existing) {\n return auth;\n }\n auth.clients.push({\n clientId: options.clientId,\n createdAt: (options.now ?? Date.now)(),\n label: options.label,\n });\n await mkdir(options.stateDir, { recursive: true });\n await writeFile(hostRelayAuthPath(options.stateDir), `${JSON.stringify(auth, null, 2)}\\n`);\n return auth;\n};\n\nexport const isRelayClientAuthorized = async (\n options: { stateDir: string; clientId: ClientId },\n): Promise<boolean> => {\n const auth = await readHostRelayAuth(options.stateDir);\n return auth.clients.some((client) => client.clientId === options.clientId);\n};\n\nconst emptyAuthFile = (): HostRelayAuthFile => ({\n version: 1,\n clients: [],\n});\n", "import WebSocket from \"ws\";\n\nimport { asRequestId, type ClientId, type DeviceId, type RelayResponse } from \"@scorel/protocol\";\n\nimport { authorizeRelayClient } from \"./auth.js\";\n\nexport type RedeemRelayPairOptions = {\n relayUrl: string;\n pairCode: string;\n deviceId: DeviceId;\n stateDir: string;\n label?: string;\n createWebSocket?: (url: string) => WebSocket;\n};\n\nexport type RedeemRelayPairResult = {\n clientId: ClientId;\n};\n\nexport const redeemRelayPair = async (options: RedeemRelayPairOptions): Promise<RedeemRelayPairResult> => {\n const socket = options.createWebSocket?.(options.relayUrl) ?? new WebSocket(options.relayUrl);\n try {\n await waitForOpen(socket);\n socket.send(JSON.stringify({\n type: \"host_hello\",\n deviceId: options.deviceId,\n label: options.label,\n }));\n socket.send(JSON.stringify({\n type: \"redeem_pair\",\n requestId: asRequestId(\"relay_pair\"),\n pairCode: options.pairCode,\n deviceId: options.deviceId,\n }));\n const response = await waitForRelayResponse(socket);\n if (!response.ok) {\n throw new Error(`${response.code}: ${response.message}`);\n }\n if (!(\"clientId\" in response.data)) {\n throw new Error(\"relay pair response missing clientId\");\n }\n await authorizeRelayClient({\n stateDir: options.stateDir,\n clientId: response.data.clientId,\n });\n return { clientId: response.data.clientId };\n } finally {\n socket.close();\n }\n};\n\nconst waitForOpen = (socket: WebSocket): Promise<void> =>\n new Promise((resolve, reject) => {\n socket.once(\"open\", () => resolve());\n socket.once(\"error\", reject);\n });\n\nconst waitForRelayResponse = (socket: WebSocket): Promise<RelayResponse> =>\n new Promise((resolve, reject) => {\n socket.once(\"error\", reject);\n socket.on(\"message\", function handle(data) {\n const frame = JSON.parse(data.toString()) as RelayResponse | { type?: string };\n if (frame.type !== \"relay_response\" && frame.type !== \"relay_error\") {\n return;\n }\n socket.off(\"message\", handle);\n resolve(frame as RelayResponse);\n });\n });\n", "import WebSocket from \"ws\";\n\nimport {\n asSeq,\n type ClientId,\n type DaemonMessage,\n type DeviceId,\n type RelayClientPayload,\n type RelayHostFrame,\n type RelayServerFrame,\n} from \"@scorel/protocol\";\n\nimport type { ScorelHost } from \"../index.js\";\nimport { isRelayClientAuthorized } from \"./auth.js\";\n\ntype HostConnection = Parameters<ScorelHost[\"connect\"]>[0];\n\nexport type HostRelayClientOptions = {\n relayUrl: string;\n hostService: ScorelHost;\n deviceId: DeviceId;\n deviceDisplayName?: string;\n stateDir: string;\n createWebSocket?: (url: string) => WebSocket;\n isAuthorized?: (clientId: ClientId) => Promise<boolean>;\n reconnectDelayMs?: number;\n onDiagnostic?: (type: string, data?: Record<string, unknown>) => void;\n};\n\nexport type HostRelayClient = {\n close(): void;\n};\n\nexport const startHostRelayClient = async (options: HostRelayClientOptions): Promise<HostRelayClient> => {\n const client = new ReconnectingHostRelayClient(options);\n await client.start();\n return client;\n};\n\nclass ReconnectingHostRelayClient implements HostRelayClient {\n readonly #options: HostRelayClientOptions;\n #socket: WebSocket | undefined;\n #connections = new Map<ClientId, HostConnection>();\n #closed = false;\n #reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor(options: HostRelayClientOptions) {\n this.#options = options;\n }\n\n async start(): Promise<void> {\n await this.#connect();\n }\n\n close(): void {\n this.#closed = true;\n if (this.#reconnectTimer) {\n clearTimeout(this.#reconnectTimer);\n this.#reconnectTimer = undefined;\n }\n this.#disconnectHostConnections();\n this.#socket?.close();\n }\n\n async #connect(): Promise<void> {\n if (this.#closed) {\n return;\n }\n const socket = this.#options.createWebSocket?.(this.#options.relayUrl) ?? new WebSocket(this.#options.relayUrl);\n this.#socket = socket;\n await waitForOpen(socket);\n if (this.#closed) {\n socket.close();\n return;\n }\n sendHostFrame(socket, {\n type: \"host_hello\",\n deviceId: this.#options.deviceId,\n label: this.#options.deviceDisplayName,\n });\n this.#options.onDiagnostic?.(\"relay_host_connected\", { relayUrl: this.#options.relayUrl, deviceId: this.#options.deviceId });\n\n socket.on(\"message\", (data) => {\n void handleRelayFrame({\n frame: JSON.parse(data.toString()) as RelayServerFrame,\n socket,\n connections: this.#connections,\n options: this.#options,\n }).catch((cause) => {\n this.#options.onDiagnostic?.(\"relay_host_error\", {\n error: cause instanceof Error ? cause.message : String(cause),\n });\n });\n });\n socket.on(\"error\", (cause) => {\n this.#options.onDiagnostic?.(\"relay_host_error\", {\n error: cause instanceof Error ? cause.message : String(cause),\n });\n });\n\n socket.once(\"close\", () => {\n if (this.#socket === socket) {\n this.#socket = undefined;\n }\n this.#disconnectHostConnections();\n this.#options.onDiagnostic?.(\"relay_host_disconnected\", { relayUrl: this.#options.relayUrl, deviceId: this.#options.deviceId });\n this.#scheduleReconnect();\n });\n }\n\n #disconnectHostConnections(): void {\n for (const connection of this.#connections.values()) {\n this.#options.hostService.disconnect(connection);\n }\n this.#connections.clear();\n }\n\n #scheduleReconnect(): void {\n if (this.#closed || this.#reconnectTimer) {\n return;\n }\n const delayMs = this.#options.reconnectDelayMs ?? 1000;\n this.#options.onDiagnostic?.(\"relay_host_reconnecting\", {\n relayUrl: this.#options.relayUrl,\n deviceId: this.#options.deviceId,\n delayMs,\n });\n this.#reconnectTimer = setTimeout(() => {\n this.#reconnectTimer = undefined;\n void this.#connect().catch((cause) => {\n this.#options.onDiagnostic?.(\"relay_host_error\", {\n error: cause instanceof Error ? cause.message : String(cause),\n });\n this.#scheduleReconnect();\n });\n }, delayMs);\n }\n}\n\nconst handleRelayFrame = async (\n input: {\n frame: RelayServerFrame;\n socket: WebSocket;\n connections: Map<ClientId, HostConnection>;\n options: HostRelayClientOptions;\n },\n): Promise<void> => {\n if (input.frame.type !== \"relay_to_host\") {\n return;\n }\n const authorized = input.options.isAuthorized\n ? await input.options.isAuthorized(input.frame.clientId)\n : await isRelayClientAuthorized({ stateDir: input.options.stateDir, clientId: input.frame.clientId });\n if (!authorized) {\n sendHostFrame(input.socket, {\n type: \"host_to_entry\",\n clientId: input.frame.clientId,\n payload: relayAuthError(input.frame.payload),\n });\n input.options.onDiagnostic?.(\"relay_frame_rejected\", {\n clientId: input.frame.clientId,\n reason: \"unauthorized\",\n payloadType: input.frame.payload.type,\n });\n return;\n }\n\n const connection = connectionFor(input.connections, input.frame.clientId, input.socket);\n if (input.frame.payload.type === \"connect\") {\n const result = input.options.hostService.connect(connection, input.frame.payload.sessionId);\n sendHostFrame(input.socket, {\n type: \"host_to_entry\",\n clientId: input.frame.clientId,\n payload: {\n type: \"connected\",\n clientId: input.frame.clientId,\n sessionId: result.sessionId,\n currentSeq: result.currentSeq ?? asSeq(0),\n deviceId: result.deviceId,\n deviceDisplayName: result.deviceDisplayName,\n },\n });\n return;\n }\n\n await input.options.hostService.handleMessage(connection, input.frame.payload);\n};\n\nconst connectionFor = (\n connections: Map<ClientId, HostConnection>,\n clientId: ClientId,\n socket: WebSocket,\n): HostConnection => {\n const existing = connections.get(clientId);\n if (existing) {\n return existing;\n }\n const connection: HostConnection = {\n clientId,\n emit(message: DaemonMessage) {\n sendHostFrame(socket, {\n type: \"host_to_entry\",\n clientId,\n payload: message,\n });\n },\n };\n connections.set(clientId, connection);\n return connection;\n};\n\nconst relayAuthError = (payload: RelayClientPayload): DaemonMessage => ({\n type: \"error\",\n requestId: \"requestId\" in payload ? payload.requestId : undefined,\n ok: false,\n code: \"auth_failed\",\n message: \"relay client is not authorized by host\",\n});\n\nconst sendHostFrame = (socket: WebSocket, frame: RelayHostFrame): void => {\n if (socket.readyState === socket.OPEN) {\n socket.send(JSON.stringify(frame));\n }\n};\n\nconst waitForOpen = (socket: WebSocket): Promise<void> =>\n new Promise((resolve, reject) => {\n socket.once(\"open\", () => resolve());\n socket.once(\"error\", reject);\n });\n", "import { execFile } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { appendFile, mkdir, readFile, readdir, rename, rm, writeFile } from \"node:fs/promises\";\nimport { userInfo } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { promisify } from \"node:util\";\nimport { WebSocketServer, type WebSocket } from \"ws\";\n\nimport { listDirectories as browseDirectories } from \"./projects/directories.js\";\nimport { ProjectRegistry, ProjectRegistryError } from \"./projects/registry.js\";\nimport { listSessionSummaries } from \"./projects/sessions.js\";\n\nimport {\n ScorelRuntime,\n buildContext,\n buildInstructionSnapshot,\n buildMemoryContext,\n corePackageName,\n createAppendDailyTool,\n createCodingTools,\n createSendChannelMessageTool,\n createSkillTool,\n createSnipTool,\n createSystemReminderBlock,\n diffSkillIndex,\n createPiAiProvider,\n createSession,\n hasSkillIndexDelta,\n listAvailableModels,\n listProviderConnections,\n listProviderModels,\n loadScorelConfig,\n loadScorelConfigProfile,\n loadExtensionManifest,\n loadSession,\n renderMemoryConfig,\n renderRuntimeConfig,\n renderExtensionConfig,\n renderMemoryHarness,\n renderSkillDelta,\n renderSkillListing,\n renderSystemPrompt,\n renderModelProfileConfig,\n readMemoryDreamState,\n readSessionMemory,\n resolveModelSelection,\n resolvePiAiModel,\n scanSkillIndex,\n sessionArtifactsDirPath,\n sessionLogFilePath,\n snipUserMessageAlias,\n scorelSessionsDir,\n scorelMemoryPaths,\n writeMemoryDreamState,\n writeSessionMemory,\n type ExtensionManifest,\n type ScorelConfig,\n type ScorelConfigProfile,\n type JsonlSession,\n type RawRuntimeEvent,\n} from \"@scorel/core\";\nimport {\n asClientId,\n asDeviceId,\n asEventId,\n asRequestId,\n asSeq,\n asSessionId,\n protocolPackageName,\n protocolVersion,\n type ClientId,\n type ClientMessage,\n type ClientRequest,\n type ConnectParams,\n type ConnectResult,\n type CreateSessionMeta,\n type DaemonTransport,\n type DaemonMessage,\n type DeviceId,\n type EventId,\n type AvailableModelSummary,\n type HostProject,\n type PersistentEvent,\n type ProjectId,\n type QueueItem,\n type QueueName,\n type ScorelEvent,\n type SelectedModelSummary,\n type ProviderCatalogModelSummary,\n type ProviderConnectionSummary,\n type ProviderModelSummary,\n type Seq,\n type SessionId,\n type SessionMeta,\n type ScorelMessage,\n type TransientEvent,\n type Unsubscribe,\n type ClientRequestMap,\n type ChannelContext,\n type MemoryStatus,\n type ModelSelectionInput,\n type ExtensionSettings,\n type MemorySettings,\n type RuntimeSettings,\n} from \"@scorel/protocol\";\n\nexport const daemonPackageName = \"@scorel/daemon\" as const;\nexport const daemonCoreDependency = corePackageName;\nexport const daemonProtocolDependency = protocolPackageName;\nexport const daemonProtocolVersion = protocolVersion;\nconst SESSION_MEMORY_COMPACT_WAIT_MS = 5_000;\nconst AUTO_COMPACT_RETAINED_EVENTS = 8;\nconst execFileAsync = promisify(execFile);\nexport type ScorelHostTransport = DaemonTransport;\nexport { loadScorelConfig, loadScorelConfigProfile, scorelSessionsDir, type ScorelConfig };\nexport {\n authorizeRelayClient,\n hostDeviceIdentityPath,\n hostRelayAuthPath,\n isRelayClientAuthorized,\n loadOrCreateHostDeviceIdentity,\n readHostDeviceIdentity,\n readHostRelayAuth,\n type HostDeviceIdentity,\n type HostRelayAuthFile,\n} from \"./relay/auth.js\";\nexport { redeemRelayPair, type RedeemRelayPairOptions, type RedeemRelayPairResult } from \"./relay/pair.js\";\nexport { startHostRelayClient, type HostRelayClient, type HostRelayClientOptions } from \"./relay/host-client.js\";\n\n/**\n * On-disk shape of `~/.scorel/daemon.json` (S0043). The unix-socket era schema\n * (`socketPath` + `pid`-only) is removed; a single WS daemon owns the state\n * file across restarts. `token` persists so subsequent `serve` runs reuse it\n * without operator intervention; `stoppedAt` flips from `null` \u2192 epoch on\n * graceful shutdown so `daemonStateLiveness` can distinguish a clean stop\n * from a crashed/orphan pid.\n */\nexport type LocalDaemonState = {\n host: string;\n port: number;\n wsUrl: string;\n token: string;\n pid: number;\n startedAt: number;\n stoppedAt: number | null;\n};\n\nexport type LocalDaemonStateOptions = {\n stateDir: string;\n};\n\nexport type CreateLocalDaemonStateOptions = LocalDaemonStateOptions & LocalDaemonState;\n\nexport type DaemonStateLiveness = \"running\" | \"stopped\" | \"orphan\";\n\nexport type RemoteDaemonWebSocketConnection = {\n clientId?: ClientId;\n socket: WebSocket;\n send(message: DaemonMessage): void;\n};\n\nexport type RemoteDaemonWebSocketServerOptions = {\n host: string;\n port: number;\n token: string;\n onClientConnect?: (connection: RemoteDaemonWebSocketConnection, params: ConnectParams) => ConnectResult;\n onClientMessage: (connection: RemoteDaemonWebSocketConnection, message: ClientMessage) => DaemonMessage | void;\n};\n\nexport type RemoteDaemonWebSocketServer = {\n host: string;\n port: number;\n url: string;\n close(): Promise<void>;\n};\n\nconst localDaemonStateFile = (stateDir: string): string => join(stateDir, \"daemon.json\");\n\nexport const createLocalDaemonState = async (options: CreateLocalDaemonStateOptions): Promise<LocalDaemonState> => {\n const state: LocalDaemonState = {\n host: options.host,\n port: options.port,\n wsUrl: options.wsUrl,\n token: options.token,\n pid: options.pid,\n startedAt: options.startedAt,\n stoppedAt: options.stoppedAt,\n };\n await mkdir(options.stateDir, { recursive: true });\n await writeFile(localDaemonStateFile(options.stateDir), `${JSON.stringify(state, null, 2)}\\n`);\n return state;\n};\n\nexport const readLocalDaemonState = async (options: LocalDaemonStateOptions): Promise<LocalDaemonState | null> => {\n try {\n const raw = JSON.parse(await readFile(localDaemonStateFile(options.stateDir), \"utf8\")) as Partial<LocalDaemonState>;\n if (\n typeof raw.host !== \"string\" ||\n typeof raw.port !== \"number\" ||\n typeof raw.wsUrl !== \"string\" ||\n typeof raw.token !== \"string\" ||\n typeof raw.pid !== \"number\" ||\n typeof raw.startedAt !== \"number\" ||\n !(raw.stoppedAt === null || typeof raw.stoppedAt === \"number\")\n ) {\n return null;\n }\n return {\n host: raw.host,\n port: raw.port,\n wsUrl: raw.wsUrl,\n token: raw.token,\n pid: raw.pid,\n startedAt: raw.startedAt,\n stoppedAt: raw.stoppedAt,\n };\n } catch (cause) {\n if (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") {\n return null;\n }\n throw cause;\n }\n};\n\nexport const removeLocalDaemonState = async (options: LocalDaemonStateOptions): Promise<void> => {\n await rm(localDaemonStateFile(options.stateDir), { force: true });\n};\n\n/**\n * Partial in-place update used by `serve` graceful-shutdown to flip\n * `stoppedAt` from `null` to a timestamp without disturbing other fields.\n * Silently no-ops if the state file disappeared (e.g. operator ran `reset`\n * concurrently) \u2014 flipping `stoppedAt` is a best-effort marker.\n */\nexport const markDaemonStopped = async (\n options: LocalDaemonStateOptions & { stoppedAt: number },\n): Promise<void> => {\n const state = await readLocalDaemonState({ stateDir: options.stateDir });\n if (!state) {\n return;\n }\n await writeFile(\n localDaemonStateFile(options.stateDir),\n `${JSON.stringify({ ...state, stoppedAt: options.stoppedAt }, null, 2)}\\n`,\n );\n};\n\n/**\n * Classify a state file's owning process. The `pid` field is only meaningful\n * paired with `stoppedAt`: a dead pid + null `stoppedAt` is the orphan case\n * that `serve` is allowed to overwrite, while a dead pid + populated\n * `stoppedAt` is the normal \"previous run exited\" case.\n *\n * `process.kill(pid, 0)` on POSIX returns truthy for any process the caller\n * could signal \u2014 including unrelated processes that happen to have inherited\n * the pid after wraparound. The trade-off is documented in the spec; users\n * can always `scorel daemon reset` if they get a false-positive after a\n * reboot.\n */\nexport const daemonStateLiveness = (\n state: LocalDaemonState,\n options: { isPidAlive?: (pid: number) => boolean } = {},\n): DaemonStateLiveness => {\n const isAlive = options.isPidAlive ?? defaultIsPidAlive;\n const alive = isAlive(state.pid);\n if (alive && state.stoppedAt === null) {\n return \"running\";\n }\n if (!alive && state.stoppedAt === null) {\n return \"orphan\";\n }\n return \"stopped\";\n};\n\nconst defaultIsPidAlive = (pid: number): boolean => {\n try {\n process.kill(pid, 0);\n return true;\n } catch (cause) {\n if (cause instanceof Error && \"code\" in cause && cause.code === \"EPERM\") {\n // Pid exists but we can't signal it (different user). Treat as alive.\n return true;\n }\n return false;\n }\n};\n\nexport const startRemoteDaemonWebSocketServer = async (\n options: RemoteDaemonWebSocketServerOptions,\n): Promise<RemoteDaemonWebSocketServer> => {\n const server = new WebSocketServer({ host: options.host, port: options.port });\n server.on(\"connection\", (socket) => {\n const connection: RemoteDaemonWebSocketConnection = {\n socket,\n send(message) {\n if (socket.readyState === socket.OPEN) {\n socket.send(JSON.stringify(message));\n }\n },\n };\n\n socket.on(\"message\", (data) => {\n let message: ClientMessage | ({ type: \"connect\"; token: string } & ConnectParams);\n try {\n message = JSON.parse(data.toString()) as ClientMessage | ({ type: \"connect\"; token: string } & ConnectParams);\n } catch {\n connection.send({\n type: \"error\",\n ok: false,\n code: \"invalid_request\",\n message: \"invalid JSON message\",\n });\n return;\n }\n\n if (message.type === \"connect\") {\n if (message.token !== options.token) {\n connection.send({\n type: \"error\",\n ok: false,\n code: \"auth_failed\",\n message: \"invalid remote token\",\n });\n socket.close();\n return;\n }\n connection.clientId = message.clientId;\n const result: ConnectResult = options.onClientConnect?.(connection, message) ?? {\n clientId: message.clientId,\n sessionId: message.sessionId,\n currentSeq: message.streamLastSeq ?? message.lastSeq ?? asSeq(0),\n deviceId: asDeviceId(\"device_unknown\"),\n };\n connection.send({\n type: \"connected\",\n clientId: result.clientId,\n sessionId: result.sessionId,\n currentSeq: result.currentSeq,\n deviceId: result.deviceId,\n deviceDisplayName: result.deviceDisplayName,\n });\n return;\n }\n\n const response = options.onClientMessage(connection, message);\n if (response) {\n connection.send(response);\n }\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.once(\"listening\", () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n const address = server.address();\n if (!address || typeof address === \"string\") {\n await closeWebSocketServer(server);\n throw new Error(\"remote daemon WebSocket server did not expose a TCP address\");\n }\n const host = options.host === \"0.0.0.0\" ? \"127.0.0.1\" : options.host;\n return {\n host: options.host,\n port: address.port,\n url: `ws://${host}:${address.port}`,\n close: () => closeWebSocketServer(server),\n };\n};\n\nexport const startScorelHostWebSocketServer = async (\n options: { hostService: ScorelHost; host: string; port: number; token: string },\n): Promise<RemoteDaemonWebSocketServer> => {\n const connections = new WeakMap<RemoteDaemonWebSocketConnection, Connection>();\n const daemonConnectionFor = (webSocketConnection: RemoteDaemonWebSocketConnection, params?: ConnectParams): Connection => {\n const existing = connections.get(webSocketConnection);\n if (existing) {\n return existing;\n }\n const connection: Connection = {\n clientId: params?.clientId ?? asClientId(\"ws_unconnected\"),\n emit: (daemonMessage) => webSocketConnection.send(daemonMessage),\n };\n connections.set(webSocketConnection, connection);\n webSocketConnection.socket.once(\"close\", () => options.hostService.disconnect(connection));\n return connection;\n };\n\n return startRemoteDaemonWebSocketServer({\n host: options.host,\n port: options.port,\n token: options.token,\n onClientConnect: (webSocketConnection, params) => {\n const daemonConnection = daemonConnectionFor(webSocketConnection, params);\n daemonConnection.clientId = params.clientId;\n const result = options.hostService.connect(daemonConnection, params.sessionId);\n return {\n clientId: params.clientId,\n sessionId: result.sessionId,\n currentSeq: result.currentSeq,\n deviceId: result.deviceId,\n deviceDisplayName: result.deviceDisplayName,\n };\n },\n onClientMessage: (webSocketConnection, message) => {\n const daemonConnection = daemonConnectionFor(webSocketConnection);\n if (!daemonConnection.clientId) {\n return {\n type: \"error\",\n ok: false,\n code: \"invalid_request\",\n message: \"websocket is not connected\",\n };\n }\n void options.hostService.handleMessage(daemonConnection, message).catch((cause) => {\n webSocketConnection.send({\n type: \"error\",\n ok: false,\n code: \"internal_error\",\n message: cause instanceof Error ? cause.message : String(cause),\n });\n });\n return undefined;\n },\n });\n};\n\nconst closeWebSocketServer = (server: WebSocketServer): Promise<void> =>\n new Promise((resolve, reject) => {\n for (const client of server.clients) {\n client.close();\n }\n server.close((error) => (error ? reject(error) : resolve()));\n });\n\nexport type RuntimeFactoryOptions = {\n cwd: string;\n config: ScorelConfig;\n sessionsDir?: string;\n sessionId?: SessionId;\n modelSelection?: { modelId?: string; role?: \"primary\" | \"standard\" | \"auxiliary\" };\n includeTools?: boolean;\n rtkExecutable?: string;\n};\n\nexport type ScorelHostOptions = {\n sessionsDir: string;\n projectsPath: string;\n deviceId: DeviceId;\n deviceDisplayName?: string;\n scorelHomeDir?: string;\n builtinExtensionsDir?: string;\n modelProfile?: ScorelConfig;\n loadConfig?: (options: { project: HostProject }) => Promise<ScorelConfig>;\n loadConfigProfile?: (options: { project: HostProject }) => Promise<ScorelConfigProfile | ScorelConfig>;\n createRuntime: (options: { sessionId: SessionId; project: HostProject; selectedModel?: SelectedModelSummary; purpose: \"chat\" | \"title\" | \"memory\" }) => Promise<ScorelRuntime>;\n memoryHomeDir?: string;\n onSessionListChanged?: (change: { projectId: ProjectId; sessionId: SessionId }) => void;\n idleShutdownMs?: number;\n onIdleShutdown?: () => void;\n now?: () => number;\n createId?: () => string;\n};\n\nexport type ImIncomingMessage = {\n externalConversationId: string;\n text: string;\n conversationType?: string;\n senderDisplayName?: string;\n mentionedBot?: boolean;\n target?: ImTarget;\n data?: Record<string, unknown>;\n};\n\nexport type ImTarget = {\n externalConversationId: string;\n data?: Record<string, unknown>;\n};\n\nexport type ImOutgoingMessage = {\n text?: string;\n attachments?: Array<{\n type: \"image\" | \"file\";\n path?: string;\n url?: string;\n mimeType?: string;\n caption?: string;\n }>;\n};\n\nexport type ImAdapterContext = {\n onMessage(message: ImIncomingMessage): Promise<void>;\n logger: {\n info(message: string, data?: Record<string, unknown>): void;\n error(message: string, data?: Record<string, unknown>): void;\n };\n};\n\nexport type ImAdapter = {\n start(ctx: ImAdapterContext): Promise<void>;\n stop(): Promise<void>;\n sendMessage(target: ImTarget, message: ImOutgoingMessage): Promise<void>;\n setTyping?(target: ImTarget, typing: boolean): Promise<void>;\n getOutbox?(): ImOutgoingMessage[];\n};\n\nexport const createRealRuntime = async (options: RuntimeFactoryOptions): Promise<ScorelRuntime> => {\n const selection = resolveModelSelection(options.config, options.modelSelection);\n const model = resolvePiAiModel(selection.config);\n const rtkExecutable = options.rtkExecutable ?? (options.config.runtime.tokenSavingRtk ? (await detectRtk()).executable : undefined);\n const runtime = new ScorelRuntime({\n provider: createPiAiProvider({\n model,\n apiKey: selection.config.apiKey,\n }),\n });\n if (options.includeTools !== false) {\n for (const tool of createCodingTools({\n cwd: options.cwd,\n contextWindow: model.contextWindow,\n ...(options.sessionsDir && options.sessionId\n ? { toolResultArtifacts: { dir: sessionArtifactsDirPath(options.sessionsDir, options.sessionId) } }\n : {}),\n tokenSaving: {\n rtk: {\n enabled: options.config.runtime.tokenSavingRtk,\n executable: rtkExecutable,\n },\n },\n })) {\n runtime.registerTool(tool);\n }\n }\n return runtime;\n};\n\ntype SessionLane = {\n session: JsonlSession;\n project: HostProject;\n runtime: ScorelRuntime;\n selectedModel?: SelectedModelSummary;\n queue: Promise<unknown>;\n appendQueue: Promise<void>;\n followUpWaiters: Map<string, { connection: Connection; request: ClientRequest<\"send_message\"> }>;\n channelContext?: RuntimeChannelContext;\n snipClientId?: ClientId;\n};\n\ntype RuntimeChannelContext = ChannelContext & {\n extensionId: string;\n target: ImTarget;\n};\n\ntype LoadedImExtension = {\n manifest: ExtensionManifest;\n adapter: ImAdapter;\n skillRoots: string[];\n};\n\ntype ImSessionBinding = {\n extensionId: string;\n externalConversationId: string;\n projectId: ProjectId;\n sessionId: SessionId;\n createdAt: number;\n updatedAt: number;\n};\n\ntype MemoryDreamSchedule = {\n timer?: ReturnType<typeof setTimeout>;\n running: boolean;\n sessionId: SessionId;\n clientId: ClientId;\n lastActivityAt: number;\n};\n\ntype AfterUserMessageHook = (input: {\n lane: SessionLane;\n clientId: ClientId;\n userEvent: Extract<PersistentEvent, { type: \"user_message\" }>;\n}) => Promise<void>;\n\ntype PersistentEventInput =\n | Omit<Extract<PersistentEvent, { type: \"user_message\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"assistant_message\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"tool_result\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"session_title_updated\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"instruction_snapshot\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"harness_item\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"compact\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"context_control\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"queue_update\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"skill_index_snapshot\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"skill_index_delta\" }>, \"seq\">;\n\ntype TransientEventInput =\n | Omit<Extract<TransientEvent, { type: \"turn_start\" }>, \"seq\">\n | Omit<Extract<TransientEvent, { type: \"turn_end\" }>, \"seq\">\n | Omit<Extract<TransientEvent, { type: \"message_start\" }>, \"seq\">\n | Omit<Extract<TransientEvent, { type: \"text_delta\" }>, \"seq\">\n | Omit<Extract<TransientEvent, { type: \"thinking_delta\" }>, \"seq\">\n | Omit<Extract<TransientEvent, { type: \"error\" }>, \"seq\">;\n\ntype Connection = {\n clientId: ClientId;\n sessionId?: SessionId;\n emit: (message: DaemonMessage) => void;\n};\n\ntype RuntimeEventState = {\n parentId: EventId;\n assistantEventId: EventId;\n finalAssistantEventId: EventId;\n};\n\ntype ResyncEventsResult = ClientRequestMap[\"resync_events\"][\"response\"];\n\nexport class ScorelHost {\n readonly #sessionsDir: string;\n readonly #deviceId: DeviceId;\n readonly #deviceDisplayName: string | undefined;\n readonly #scorelHomeDir: string;\n readonly #userHomeDir: string;\n readonly #builtinExtensionsDir: string;\n readonly #modelProfile: ScorelConfig | undefined;\n readonly #loadConfig: ((options: { project: HostProject }) => Promise<ScorelConfig>) | undefined;\n readonly #loadConfigProfile: ((options: { project: HostProject }) => Promise<ScorelConfigProfile | ScorelConfig>) | undefined;\n readonly #createRuntime: ScorelHostOptions[\"createRuntime\"];\n readonly #memoryHomeDir: string | undefined;\n readonly #onSessionListChanged: ((change: { projectId: ProjectId; sessionId: SessionId }) => void) | undefined;\n readonly #idleShutdownMs: number | undefined;\n readonly #onIdleShutdown: (() => void) | undefined;\n readonly #now: () => number;\n readonly #createId: () => string;\n readonly #sessions = new Map<SessionId, SessionLane>();\n readonly #connections = new Set<Connection>();\n readonly #events = new Map<SessionId, ScorelEvent[]>();\n readonly #seqs = new Map<SessionId, number>();\n readonly #memoryDreams = new Map<ProjectId, MemoryDreamSchedule>();\n readonly #sessionMemoryUpdates = new Map<SessionId, Promise<void>>();\n readonly #imExtensions = new Map<string, LoadedImExtension>();\n readonly #imBindings = new Map<string, ImSessionBinding>();\n readonly #registry: ProjectRegistry;\n #runtimeStatsQueue: Promise<void> = Promise.resolve();\n #idleShutdownTimer: ReturnType<typeof setTimeout> | undefined;\n #lastActiveWorkAt: number;\n #started = false;\n\n constructor(options: ScorelHostOptions) {\n this.#sessionsDir = options.sessionsDir;\n this.#deviceId = options.deviceId;\n this.#deviceDisplayName = options.deviceDisplayName;\n this.#scorelHomeDir = resolve(options.scorelHomeDir ?? dirname(options.projectsPath));\n this.#userHomeDir = dirname(this.#scorelHomeDir);\n this.#builtinExtensionsDir = resolve(options.builtinExtensionsDir ?? defaultBuiltinExtensionsDir());\n this.#modelProfile = options.modelProfile;\n this.#loadConfig = options.loadConfig;\n this.#loadConfigProfile = options.loadConfigProfile;\n this.#createRuntime = options.createRuntime;\n this.#memoryHomeDir = options.memoryHomeDir;\n this.#onSessionListChanged = options.onSessionListChanged;\n this.#idleShutdownMs = options.idleShutdownMs;\n this.#onIdleShutdown = options.onIdleShutdown;\n this.#now = options.now ?? Date.now;\n this.#createId = options.createId ?? (() => crypto.randomUUID());\n this.#lastActiveWorkAt = this.#now();\n this.#registry = new ProjectRegistry({\n sessionsDir: this.#sessionsDir,\n projectsPath: options.projectsPath,\n createId: this.#createId,\n now: this.#now,\n });\n }\n\n async start(): Promise<void> {\n this.#started = true;\n await mkdir(this.#scorelHomeDir, { recursive: true });\n await this.#loadImBindings();\n await this.#startEnabledImExtensions();\n this.#scheduleIdleShutdownCheck();\n }\n\n async shutdown(): Promise<void> {\n this.#clearIdleShutdownTimer();\n for (const schedule of this.#memoryDreams.values()) {\n if (schedule.timer) {\n clearTimeout(schedule.timer);\n }\n }\n this.#memoryDreams.clear();\n await this.#stopImExtensions();\n this.#connections.clear();\n this.#started = false;\n }\n\n async refreshImExtensions(): Promise<void> {\n this.#assertStarted();\n await this.#stopImExtensions();\n await this.#startEnabledImExtensions();\n this.#scheduleIdleShutdownCheck();\n }\n\n connect(connection: Connection, sessionId?: SessionId): ConnectResult {\n this.#assertStarted();\n this.#clearIdleShutdownTimer();\n connection.sessionId = sessionId;\n this.#connections.add(connection);\n if (sessionId) {\n void this.#appendDiagnostic(sessionId, \"client_connected\", {\n clientId: connection.clientId,\n deviceId: this.#deviceId,\n deviceDisplayName: this.#deviceDisplayName,\n });\n }\n return {\n clientId: connection.clientId,\n sessionId,\n currentSeq: asSeq(sessionId ? (this.#seqs.get(sessionId) ?? 0) : 0),\n deviceId: this.#deviceId,\n deviceDisplayName: this.#deviceDisplayName,\n };\n }\n\n disconnect(connection: Connection): void {\n if (connection.sessionId) {\n void this.#appendDiagnostic(connection.sessionId, \"client_disconnected\", {\n clientId: connection.clientId,\n });\n }\n this.#connections.delete(connection);\n this.#scheduleIdleShutdownCheck();\n }\n\n releaseSessionEventBuffer(sessionId: SessionId): void {\n this.#events.delete(sessionId);\n }\n\n activityStatus(): { activeWork: boolean; lastActiveWorkAt: number } {\n const activeWork = this.#hasActiveWork();\n if (activeWork) {\n this.#lastActiveWorkAt = this.#now();\n }\n return { activeWork, lastActiveWorkAt: this.#lastActiveWorkAt };\n }\n\n async handleMessage(connection: Connection, message: ClientMessage): Promise<void> {\n this.#assertStarted();\n try {\n await this.#handleMessage(connection, message);\n } catch (cause) {\n if (\"requestId\" in message) {\n connection.emit({\n type: \"error\",\n requestId: message.requestId,\n ok: false,\n code: wireErrorCode(cause),\n message: cause instanceof Error ? cause.message : String(cause),\n });\n return;\n }\n throw cause;\n } finally {\n this.#scheduleIdleShutdownCheck();\n }\n }\n\n async listDirectories(path?: string) {\n const listing = await browseDirectories(path);\n await this.#appendHostDiagnostic(\"directory_listed\", { path: listing.path });\n return listing;\n }\n\n async registerProject(workDir: string): Promise<HostProject> {\n const project = await this.#registry.register(workDir);\n await this.#appendHostDiagnostic(\"project_registered\", {\n projectId: project.projectId,\n workDir: project.workDir,\n });\n return project;\n }\n\n async listProjects(): Promise<HostProject[]> {\n return this.#registry.list();\n }\n\n async removeProject(projectId: ProjectId): Promise<boolean> {\n const project = await this.#registry.require(projectId);\n const removed = await this.#registry.remove(projectId);\n await this.#appendHostDiagnostic(\"project_removed\", {\n projectId,\n workDir: project.workDir,\n });\n return removed;\n }\n\n async receiveImMessage(extensionId: string, message: ImIncomingMessage): Promise<SessionId> {\n this.#assertStarted();\n const extension = this.#imExtensions.get(extensionId);\n if (!extension) {\n throw new Error(`IM extension is not enabled: ${extensionId}`);\n }\n return this.#handleImMessage(extension, message);\n }\n\n loopbackOutbox(extensionId = \"loopback\"): ImOutgoingMessage[] {\n return this.#imExtensions.get(extensionId)?.adapter.getOutbox?.() ?? [];\n }\n\n async #handleMessage(connection: Connection, message: ClientMessage): Promise<void> {\n switch (message.type) {\n case \"create_session\":\n await this.#handleCreateSession(connection, message);\n break;\n case \"load_session\":\n await this.#handleLoadSession(connection, message);\n break;\n case \"send_message\":\n await this.#handleSendMessage(connection, message);\n break;\n case \"rewrite_queue\":\n await this.#handleRewriteQueue(connection, message);\n break;\n case \"resync_events\":\n this.#respond(connection, message, await this.#resyncEvents(message.sessionId, {\n persistentLastSeq: message.persistentLastSeq ?? message.fromSeq,\n streamLastSeq: message.streamLastSeq ?? message.fromSeq,\n }));\n break;\n case \"subscribe_events\":\n connection.sessionId = message.sessionId;\n this.#respond(connection, message, {\n currentSeq: asSeq(this.#seqs.get(message.sessionId) ?? 0),\n });\n break;\n case \"get_status\":\n this.#respond(connection, message, {\n running: false,\n activeClients: [...this.#connections].map((candidate) => candidate.clientId),\n sessionCount: this.#sessions.size,\n uptimeMs: 0,\n });\n break;\n case \"ping\":\n connection.emit({ type: \"pong\", requestId: message.requestId });\n break;\n case \"disconnect\":\n this.disconnect(connection);\n break;\n case \"list_sessions\": {\n const sessions = await listSessionSummaries(\n this.#sessionsDir,\n { projectId: message.projectId, limit: message.limit },\n this.#sessionSummaryOverrides(),\n );\n this.#respond(connection, message, { sessions });\n break;\n }\n case \"list_projects\": {\n this.#respond(connection, message, { projects: await this.listProjects() });\n break;\n }\n case \"list_models\": {\n this.#respond(connection, message, await this.#listModels(message.projectId));\n break;\n }\n case \"upsert_model_profile\": {\n this.#respond(connection, message, await this.#handleUpsertModelProfile(message));\n break;\n }\n case \"remove_model_provider\": {\n this.#respond(connection, message, await this.#handleRemoveModelProvider(message));\n break;\n }\n case \"fetch_provider_models\": {\n this.#respond(connection, message, { models: await this.#fetchProviderModels(message.projectId, message.providerId) });\n break;\n }\n case \"get_memory_settings\": {\n this.#respond(connection, message, { memory: await this.#memorySettings(message.projectId) });\n break;\n }\n case \"get_memory_status\": {\n this.#respond(connection, message, { status: await this.#memoryStatusForProject(message.projectId) });\n break;\n }\n case \"upsert_memory_settings\": {\n this.#respond(connection, message, { memory: await this.#handleUpsertMemorySettings(message) });\n break;\n }\n case \"get_runtime_settings\": {\n this.#respond(connection, message, { runtime: await this.#runtimeSettings(message.projectId) });\n break;\n }\n case \"upsert_runtime_settings\": {\n this.#respond(connection, message, { runtime: await this.#handleUpsertRuntimeSettings(message) });\n break;\n }\n case \"get_extension_settings\": {\n this.#respond(connection, message, { extension: await this.#extensionSettings(message.extensionId) });\n break;\n }\n case \"upsert_extension_settings\": {\n this.#respond(connection, message, { extension: await this.#handleUpsertExtensionSettings(message) });\n break;\n }\n case \"list_directories\": {\n this.#respond(connection, message, await this.listDirectories(message.path));\n break;\n }\n case \"register_project\": {\n this.#respond(connection, message, { project: await this.registerProject(message.workDir) });\n break;\n }\n case \"remove_project\": {\n this.#respond(connection, message, {\n projectId: message.projectId,\n removed: await this.removeProject(message.projectId),\n });\n break;\n }\n case \"cancel\":\n await this.#handleCancel(connection, message);\n break;\n }\n }\n\n #scheduleIdleShutdownCheck(): void {\n this.#clearIdleShutdownTimer();\n if (!this.#shouldIdleShutdown()) {\n return;\n }\n this.#idleShutdownTimer = setTimeout(() => {\n this.#idleShutdownTimer = undefined;\n if (this.#shouldIdleShutdown()) {\n this.#onIdleShutdown?.();\n }\n }, this.#idleShutdownMs);\n }\n\n #clearIdleShutdownTimer(): void {\n if (!this.#idleShutdownTimer) {\n return;\n }\n clearTimeout(this.#idleShutdownTimer);\n this.#idleShutdownTimer = undefined;\n }\n\n #shouldIdleShutdown(): boolean {\n return (\n this.#started &&\n this.#idleShutdownMs !== undefined &&\n this.#idleShutdownMs > 0 &&\n this.#connections.size === 0 &&\n this.#imExtensions.size === 0 &&\n !this.#hasActiveWork()\n );\n }\n\n #hasActiveWork(): boolean {\n for (const lane of this.#sessions.values()) {\n if (lane.runtime.running) {\n return true;\n }\n if (\n lane.session.tree.controlState.queues.follow_up.length > 0 ||\n lane.session.tree.controlState.queues.steer.length > 0\n ) {\n return true;\n }\n }\n return false;\n }\n\n async #handleCreateSession(connection: Connection, request: ClientRequest<\"create_session\">): Promise<void> {\n const sessionId = request.sessionId ?? asSessionId(`ses_${this.#createId()}`);\n const project = await this.#resolveProject(sessionId, request.meta.projectId);\n if (request.sessionId && (await this.#loadExistingLaneIfPresent(sessionId))) {\n if (this.#sessions.get(sessionId)?.project.projectId !== project.projectId) {\n throw new ProjectRegistryError(\"conflict\", `Session ${sessionId} belongs to another project`);\n }\n await this.#appendDiagnostic(sessionId, \"session_loaded\", { clientId: connection.clientId });\n this.#respond(connection, request, { sessionId });\n return;\n }\n let lane: SessionLane;\n let created = true;\n try {\n lane = await this.#createLane(sessionId, request.meta, project);\n } catch (cause) {\n if (!request.sessionId || !isNodeErrorCode(cause, \"EEXIST\")) {\n throw cause;\n }\n lane = await this.#getLane(sessionId);\n created = false;\n }\n this.#sessions.set(sessionId, lane);\n if (created) {\n this.#events.set(sessionId, []);\n this.#seqs.set(sessionId, 0);\n }\n await this.#appendDiagnostic(sessionId, created ? \"session_created\" : \"session_loaded\", {\n clientId: connection.clientId,\n projectId: lane.project.projectId,\n workDir: lane.project.workDir,\n model: request.meta.model,\n });\n if (created) {\n this.#onSessionListChanged?.({ projectId: lane.project.projectId, sessionId });\n }\n this.#respond(connection, request, { sessionId });\n }\n\n async #handleLoadSession(connection: Connection, request: ClientRequest<\"load_session\">): Promise<void> {\n try {\n const lane = await this.#getLane(request.sessionId);\n await this.#appendDiagnostic(request.sessionId, \"session_loaded\", { clientId: connection.clientId });\n connection.sessionId = request.sessionId;\n const persistentEvents = [...lane.session.tree];\n const sessionEvents = this.#events.get(request.sessionId) ?? [];\n if (sessionEvents.length === 0 && persistentEvents.length > 0) {\n this.#events.set(request.sessionId, persistentEvents);\n }\n this.#respond(connection, request, {\n sessionId: request.sessionId,\n activeLeafId: lane.session.activeLeafId,\n currentSeq: lane.session.currentSeq,\n events: persistentEvents,\n meta: lane.session.header.meta,\n });\n } catch (cause) {\n connection.emit({\n type: \"error\",\n requestId: request.requestId,\n ok: false,\n code: \"session_not_found\",\n message: cause instanceof Error ? cause.message : String(cause),\n });\n }\n }\n\n async #handleSendMessage(connection: Connection, request: ClientRequest<\"send_message\">): Promise<void> {\n const lane = await this.#getLane(request.sessionId);\n if (lane.runtime.running) {\n const runningBehavior = request.options?.runningBehavior ?? \"follow_up\";\n if (runningBehavior === \"steer\") {\n await this.#enqueueSteer(lane, connection, request);\n return;\n }\n await this.#enqueueFollowUp(lane, connection, request);\n return;\n }\n\n lane.queue = lane.queue.then(async () => {\n await this.#drainFollowUps(lane);\n await this.#runUserTurn(lane, connection.clientId, {\n content: normalizeContent(request.content),\n parentId: request.options?.parentId,\n source: \"user\",\n modelSelection: request.options?.modelSelection,\n channelContext: request.options?.channelContext ? runtimeChannelContextFromWire(request.options.channelContext) : undefined,\n onComplete: (result) => this.#respond(connection, request, { ...result, status: \"completed\" }),\n });\n await this.#drainFollowUps(lane);\n });\n\n await lane.queue;\n }\n\n async #handleRewriteQueue(connection: Connection, request: ClientRequest<\"rewrite_queue\">): Promise<void> {\n const lane = await this.#getLane(request.sessionId);\n await this.#appendQueueRewrite(lane, request.queue, request.items, {\n clientId: connection.clientId,\n anchorEventId: lane.session.activeLeafId,\n });\n await this.#appendDiagnostic(request.sessionId, \"queue_rewritten\", {\n clientId: connection.clientId,\n queue: request.queue,\n queueSize: request.items.length,\n });\n this.#respond(connection, request, {\n sessionId: request.sessionId,\n queue: request.queue,\n items: request.items,\n });\n }\n\n async #runUserTurn(\n lane: SessionLane,\n clientId: ClientId,\n input: {\n content: ScorelMessage[\"content\"];\n parentId?: EventId | null;\n source: \"user\" | \"follow_up\";\n queueItemId?: string;\n modelSelection?: ModelSelectionInput;\n channelContext?: RuntimeChannelContext;\n onComplete?: (result: Required<Pick<ClientRequestMap[\"send_message\"][\"response\"], \"userEventId\" | \"assistantEventId\">>) => void;\n },\n ): Promise<ClientRequestMap[\"send_message\"][\"response\"]> {\n this.#lastActiveWorkAt = this.#now();\n const sessionId = lane.session.header.sessionId;\n await this.#selectChatRuntime(lane, input.modelSelection);\n await this.#appendDiagnostic(sessionId, \"send_message_started\", {\n clientId,\n activeLeafId: lane.session.activeLeafId,\n source: input.source,\n selectedModelId: lane.selectedModel?.modelId,\n });\n const instructionSnapshot = await this.#ensureInstructionSnapshot(lane, clientId);\n await this.#syncSkillIndex(lane, clientId);\n await this.#ensureMemoryHarness(lane, clientId);\n await this.#syncMemoryTools(lane, clientId);\n await this.#autoCompactIfNeeded(lane, clientId);\n this.#syncChannelTool(lane, input.channelContext);\n let parentId = input.parentId === undefined ? lane.session.activeLeafId : input.parentId;\n if (input.channelContext) {\n const channelHarness = await this.#appendChannelHarness(lane, clientId, input.channelContext, parentId);\n parentId = channelHarness.id;\n }\n const userEventId = asEventId(this.#createId());\n const userEvent = await this.#appendPersistent(lane, {\n type: \"user_message\",\n id: userEventId,\n parentId,\n sessionId,\n clientId,\n ts: this.#now(),\n message: {\n role: \"user\",\n content: [...input.content, snipUserMessageIdBlock(userEventId)],\n ...(input.source === \"follow_up\"\n ? { meta: { source: \"follow_up\", queueItemId: input.queueItemId } }\n : {}),\n },\n }) as Extract<PersistentEvent, { type: \"user_message\" }>;\n const runAfterUserMessageHooks = this.#scheduleAfterUserMessageHooks(lane, clientId, userEvent);\n void runAfterUserMessageHooks().catch((cause) => {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n void this.#appendDiagnostic(sessionId, \"after_user_message_hook_failed\", {\n clientId,\n message: error.message,\n stack: shortStack(error),\n });\n });\n const firstAssistantEventId = asEventId(this.#createId());\n const state: RuntimeEventState = {\n parentId: userEvent.id,\n assistantEventId: firstAssistantEventId,\n finalAssistantEventId: firstAssistantEventId,\n };\n\n lane.channelContext = input.channelContext;\n lane.snipClientId = clientId;\n try {\n for await (const rawEvent of lane.runtime.executeTurn(\n buildContext(lane.session.tree, userEvent.id),\n renderSystemPrompt(instructionSnapshot),\n {\n refreshContext: async () => {\n await this.#consumeSteer(lane, clientId, state);\n return buildContext(lane.session.tree, lane.session.activeLeafId ?? state.parentId);\n },\n },\n )) {\n await this.#handleRuntimeEvent(lane, clientId, state, rawEvent);\n }\n } finally {\n lane.channelContext = undefined;\n lane.snipClientId = undefined;\n lane.runtime.unregisterTool(\"SendChannelMessage\");\n }\n\n const result = { userEventId, assistantEventId: state.finalAssistantEventId };\n await this.#appendDiagnostic(sessionId, \"send_message_finished\", {\n clientId,\n userEventId,\n assistantEventId: state.finalAssistantEventId,\n source: input.source,\n });\n this.#scheduleSessionMemoryUpdate(lane, clientId);\n input.onComplete?.(result);\n return { ...result, status: \"completed\" };\n }\n\n #scheduleAfterUserMessageHooks(\n lane: SessionLane,\n clientId: ClientId,\n userEvent: Extract<PersistentEvent, { type: \"user_message\" }>,\n ): () => Promise<void> {\n const hooks: AfterUserMessageHook[] = [\n ({ lane: hookLane, clientId: hookClientId, userEvent: hookUserEvent }) =>\n this.#runSessionTitleHook(hookLane, hookClientId, hookUserEvent),\n ];\n return async () => {\n for (const hook of hooks) {\n await hook({ lane, clientId, userEvent });\n }\n };\n }\n\n async #runSessionTitleHook(\n lane: SessionLane,\n clientId: ClientId,\n userEvent: Extract<PersistentEvent, { type: \"user_message\" }>,\n ): Promise<void> {\n const sessionId = lane.session.header.sessionId;\n const generatedTitle = await this.#maybeGenerateSessionTitle(lane, clientId, userEvent).catch((cause) => {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n void this.#appendDiagnostic(sessionId, \"session_title_generation_failed\", {\n clientId,\n message: error.message,\n stack: shortStack(error),\n });\n return undefined;\n });\n if (generatedTitle) {\n await this.#appendPersistent(lane, {\n type: \"session_title_updated\",\n id: asEventId(this.#createId()),\n parentId: null,\n sessionId,\n clientId,\n ts: this.#now(),\n title: generatedTitle.title,\n source: \"model\",\n model: generatedTitle.model,\n derivedFrom: {\n eventId: userEvent.id,\n seq: userEvent.seq,\n },\n });\n await this.#appendDiagnostic(sessionId, \"session_title_generated\", {\n clientId,\n title: generatedTitle.title,\n modelId: generatedTitle.model.modelId,\n });\n }\n }\n\n async #maybeGenerateSessionTitle(\n lane: SessionLane,\n clientId: ClientId,\n userEvent: Extract<PersistentEvent, { type: \"user_message\" }>,\n ): Promise<{ title: string; model: SelectedModelSummary } | undefined> {\n if (lane.session.header.meta.title?.trim()) {\n return undefined;\n }\n const text = inputText(userEvent.message).trim();\n if (!text) {\n return undefined;\n }\n let userMessages = 0;\n for (const event of lane.session.tree) {\n if (event.type === \"session_title_updated\") {\n return undefined;\n }\n if (event.type === \"user_message\") {\n userMessages += 1;\n }\n }\n if (userMessages !== 1) {\n return undefined;\n }\n const selectedModel = await this.#selectedModelFromMeta(\n { projectId: lane.project.projectId, modelSelection: { role: \"auxiliary\" } },\n lane.project,\n );\n if (!selectedModel) {\n return undefined;\n }\n const runtime = await this.#createRuntime({ sessionId: lane.session.header.sessionId, project: lane.project, selectedModel, purpose: \"title\" });\n let rawTitle = \"\";\n for await (const rawEvent of runtime.executeTurn(\n [\n {\n role: \"user\",\n content: [{\n type: \"text\",\n text: [\n \"Write a session title for the following first user request.\",\n \"\",\n \"Rules:\",\n \"- Return only the title text.\",\n \"- Do not answer the request.\",\n \"- Do not mention yourself.\",\n \"- Use the same language as the request when obvious.\",\n \"- Prefer a short noun phrase or task label, 4 to 12 Chinese characters or 4 to 8 English words.\",\n \"- No quotes, punctuation, or trailing period.\",\n \"\",\n \"<user_request>\",\n text.slice(0, 4_000),\n \"</user_request>\",\n ].join(\"\\n\"),\n }],\n },\n ],\n [\n \"You generate concise chat session titles.\",\n \"You are not answering the user request.\",\n \"You only summarize the user's intent as a short title.\",\n \"If the request is in Chinese, output Chinese.\",\n \"Output plain text only.\",\n ].join(\"\\n\"),\n {},\n )) {\n if (rawEvent.type === \"text_delta\") {\n rawTitle += rawEvent.delta;\n } else if (rawEvent.type === \"message_end\") {\n rawTitle = assistantText(rawEvent.message) || rawTitle;\n } else if (rawEvent.type === \"error\") {\n throw rawEvent.error;\n }\n }\n const title = sanitizeSessionTitle(rawTitle);\n if (!title) {\n return undefined;\n }\n await this.#appendDiagnostic(lane.session.header.sessionId, \"session_title_model_used\", {\n clientId,\n modelId: selectedModel.modelId,\n role: selectedModel.role,\n });\n return { title, model: selectedModel };\n }\n\n async #enqueueFollowUp(\n lane: SessionLane,\n connection: Connection,\n request: ClientRequest<\"send_message\">,\n ): Promise<void> {\n const now = this.#now();\n const item: QueueItem = {\n id: this.#createId(),\n content: normalizeContent(request.content),\n createdAt: now,\n updatedAt: now,\n clientId: connection.clientId,\n ...(request.options?.channelContext || request.options?.modelSelection\n ? { data: { channelContext: request.options.channelContext, modelSelection: request.options.modelSelection } }\n : {}),\n };\n lane.followUpWaiters.set(item.id, { connection, request });\n await this.#appendQueueRewrite(lane, \"follow_up\", [...lane.session.tree.controlState.queues.follow_up, item], {\n clientId: connection.clientId,\n anchorEventId: lane.session.activeLeafId,\n });\n await this.#appendDiagnostic(lane.session.header.sessionId, \"follow_up_queued\", {\n clientId: connection.clientId,\n queueItemId: item.id,\n queueSize: lane.session.tree.controlState.queues.follow_up.length,\n });\n }\n\n async #enqueueSteer(\n lane: SessionLane,\n connection: Connection,\n request: ClientRequest<\"send_message\">,\n ): Promise<void> {\n const now = this.#now();\n const item: QueueItem = {\n id: this.#createId(),\n content: normalizeContent(request.content),\n createdAt: now,\n updatedAt: now,\n clientId: connection.clientId,\n ...(request.options?.channelContext ? { data: { channelContext: request.options.channelContext } } : {}),\n };\n await this.#appendQueueRewrite(lane, \"steer\", [...lane.session.tree.controlState.queues.steer, item], {\n clientId: connection.clientId,\n anchorEventId: lane.session.activeLeafId,\n });\n await this.#appendDiagnostic(lane.session.header.sessionId, \"steer_queued\", {\n clientId: connection.clientId,\n queueItemId: item.id,\n queueSize: lane.session.tree.controlState.queues.steer.length,\n });\n this.#respond(connection, request, {\n status: \"queued\",\n queue: \"steer\",\n queueItemId: item.id,\n });\n }\n\n async #drainFollowUps(lane: SessionLane): Promise<void> {\n while (lane.session.tree.controlState.queues.follow_up.length > 0) {\n const item = lane.session.tree.controlState.queues.follow_up[0]!;\n const remaining = lane.session.tree.controlState.queues.follow_up.slice(1);\n await this.#appendQueueRewrite(lane, \"follow_up\", remaining, {\n clientId: item.clientId,\n anchorEventId: lane.session.activeLeafId,\n });\n const waiter = lane.followUpWaiters.get(item.id);\n lane.followUpWaiters.delete(item.id);\n await this.#runUserTurn(lane, item.clientId, {\n content: item.content,\n parentId: lane.session.activeLeafId,\n source: \"follow_up\",\n queueItemId: item.id,\n modelSelection: parseQueuedModelSelection(item.data?.modelSelection),\n channelContext: parseQueuedChannelContext(item.data?.channelContext),\n onComplete: waiter\n ? (result) => this.#respond(waiter.connection, waiter.request, { ...result, status: \"completed\" })\n : undefined,\n });\n }\n }\n\n async #consumeSteer(lane: SessionLane, clientId: ClientId, state: RuntimeEventState): Promise<void> {\n const item = lane.session.tree.controlState.queues.steer[0];\n if (!item) {\n return;\n }\n await this.#appendQueueRewrite(lane, \"steer\", lane.session.tree.controlState.queues.steer.slice(1), {\n clientId,\n anchorEventId: state.parentId,\n });\n const content = item.content\n .filter((block): block is Extract<ScorelMessage[\"content\"][number], { type: \"text\" }> => block.type === \"text\")\n .map((block) => block.text)\n .join(\"\\n\");\n const harnessEvent = await this.#appendPersistent(lane, {\n type: \"harness_item\",\n id: asEventId(this.#createId()),\n parentId: state.parentId,\n sessionId: lane.session.header.sessionId,\n clientId: item.clientId,\n ts: this.#now(),\n item: {\n kind: \"steer\",\n origin: \"user\",\n content,\n visibility: \"display\",\n data: { queueItemId: item.id },\n },\n });\n state.parentId = harnessEvent.id;\n }\n\n async #appendQueueRewrite(\n lane: SessionLane,\n queue: QueueName,\n items: QueueItem[],\n options: { clientId: ClientId; anchorEventId: EventId | null },\n ): Promise<void> {\n await this.#appendPersistent(lane, {\n type: \"queue_update\",\n id: asEventId(this.#createId()),\n parentId: null,\n sessionId: lane.session.header.sessionId,\n clientId: options.clientId,\n ts: this.#now(),\n queue,\n operation: \"rewrite\",\n items,\n anchorEventId: options.anchorEventId,\n });\n }\n\n async #handleCancel(connection: Connection, request: ClientRequest<\"cancel\">): Promise<void> {\n try {\n const lane = await this.#getLane(request.sessionId);\n const cancelled = lane.runtime.running;\n lane.runtime.cancel();\n await this.#appendDiagnostic(request.sessionId, \"cancel_requested\", {\n clientId: connection.clientId,\n cancelled,\n });\n this.#respond(connection, request, {\n sessionId: request.sessionId,\n cancelled,\n });\n } catch (cause) {\n connection.emit({\n type: \"error\",\n requestId: request.requestId,\n ok: false,\n code: \"session_not_found\",\n message: cause instanceof Error ? cause.message : String(cause),\n });\n }\n }\n\n #sessionSummaryOverrides(): Map<string, { currentSeq?: number; updatedAt?: number }> {\n const overrides = new Map<string, { currentSeq?: number; updatedAt?: number }>();\n for (const [sessionId, currentSeq] of this.#seqs.entries()) {\n overrides.set(String(sessionId), { currentSeq });\n }\n return overrides;\n }\n\n async #handleRuntimeEvent(\n lane: SessionLane,\n clientId: ClientId,\n state: RuntimeEventState,\n rawEvent: RawRuntimeEvent,\n ): Promise<void> {\n switch (rawEvent.type) {\n case \"turn_start\":\n this.#broadcastTransient(lane.session.header.sessionId, {\n type: \"turn_start\",\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n turnIndex: 0,\n });\n break;\n case \"message_start\":\n this.#broadcastTransient(lane.session.header.sessionId, {\n type: \"message_start\",\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n eventId: state.assistantEventId,\n parentId: state.parentId,\n role: rawEvent.role,\n });\n break;\n case \"text_delta\":\n this.#broadcastTransient(lane.session.header.sessionId, {\n type: \"text_delta\",\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n eventId: state.assistantEventId,\n delta: rawEvent.delta,\n });\n break;\n case \"thinking_delta\":\n this.#broadcastTransient(lane.session.header.sessionId, {\n type: \"thinking_delta\",\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n eventId: state.assistantEventId,\n delta: rawEvent.delta,\n });\n break;\n case \"message_end\": {\n await this.#appendDiagnostic(lane.session.header.sessionId, \"assistant_result\", {\n clientId,\n stopReason: rawEvent.message.stopReason,\n thinkingBlocks: countContentBlocks(rawEvent.message, \"thinking\"),\n textBlocks: countContentBlocks(rawEvent.message, \"text\"),\n toolCalls: countContentBlocks(rawEvent.message, \"tool_call\"),\n inputTokens: rawEvent.message.usage?.inputTokens,\n outputTokens: rawEvent.message.usage?.outputTokens,\n totalTokens: rawEvent.message.usage?.totalTokens,\n });\n const appended = (\n await this.#appendPersistent(lane, {\n type: \"assistant_message\",\n id: state.assistantEventId,\n parentId: state.parentId,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n message: rawEvent.message,\n })\n ).id;\n state.parentId = appended;\n state.finalAssistantEventId = appended;\n state.assistantEventId = asEventId(this.#createId());\n break;\n }\n case \"tool_execution_start\":\n break;\n case \"tool_execution_end\": {\n const toolResultId = asEventId(this.#createId());\n await this.#appendPersistent(lane, {\n type: \"tool_result\",\n id: toolResultId,\n parentId: state.parentId,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n message: {\n role: \"tool_result\",\n content: [\n {\n type: \"tool_result\",\n toolCallId: rawEvent.toolCallId,\n toolName: rawEvent.toolName,\n result: rawEvent.result,\n isError: rawEvent.isError,\n },\n ],\n },\n });\n const rtkSavings = rtkSavingsFromToolResult(rawEvent.result);\n if (rtkSavings) {\n await this.#recordRtkSavings({\n projectId: lane.project.projectId,\n sessionId: lane.session.header.sessionId,\n savings: rtkSavings,\n }).catch((cause) =>\n this.#appendDiagnostic(lane.session.header.sessionId, \"runtime_stats_update_failed\", {\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n );\n }\n state.parentId = toolResultId;\n break;\n }\n case \"turn_end\":\n void this.#appendDiagnostic(lane.session.header.sessionId, \"runtime_turn_end\", {\n clientId,\n stopReason: rawEvent.stopReason,\n });\n this.#broadcastTransient(lane.session.header.sessionId, {\n type: \"turn_end\",\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n turnIndex: 0,\n stopReason: rawEvent.stopReason,\n });\n break;\n case \"error\":\n void this.#appendDiagnostic(lane.session.header.sessionId, \"runtime_error\", {\n clientId,\n message: rawEvent.error.message,\n stack: shortStack(rawEvent.error),\n });\n this.#broadcastTransient(lane.session.header.sessionId, {\n type: \"error\",\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n code: \"internal_error\",\n message: rawEvent.error.message,\n });\n break;\n }\n }\n\n async #appendPersistent(\n lane: SessionLane,\n event: PersistentEventInput,\n ): Promise<PersistentEvent> {\n let appended: PersistentEvent | undefined;\n const appendTask = lane.appendQueue.then(async () => {\n const withSeq = { ...event, seq: this.#nextSeq(lane.session.header.sessionId) } as PersistentEvent;\n await lane.session.append(withSeq);\n this.#recordAndBroadcast(lane.session.header.sessionId, withSeq);\n appended = withSeq;\n });\n lane.appendQueue = appendTask.catch(() => {});\n await appendTask;\n return appended!;\n }\n\n async #ensureInstructionSnapshot(lane: SessionLane, clientId: ClientId) {\n const existing = lane.session.tree.controlState.instructionSnapshot;\n if (existing) {\n return existing;\n }\n\n const snapshot = await buildInstructionSnapshot({\n cwd: lane.project.workDir,\n now: this.#now,\n });\n await this.#appendPersistent(lane, {\n type: \"instruction_snapshot\",\n id: asEventId(this.#createId()),\n parentId: null,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n snapshot,\n });\n await this.#appendDiagnostic(lane.session.header.sessionId, \"instruction_snapshot_created\", {\n clientId,\n sections: snapshot.sections.length,\n });\n return snapshot;\n }\n\n async #syncSkillIndex(lane: SessionLane, clientId: ClientId): Promise<void> {\n const entries = await scanSkillIndex({ cwd: lane.project.workDir, extensionSkillRoots: this.#extensionSkillRoots() });\n if (!lane.session.tree.controlState.skillIndexInitialized) {\n await this.#appendPersistent(lane, {\n type: \"skill_index_snapshot\",\n id: asEventId(this.#createId()),\n parentId: null,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n anchorEventId: lane.session.activeLeafId,\n entries,\n });\n await this.#appendSkillHarness(lane, clientId, \"skill_listing\", renderSkillListing(entries));\n return;\n }\n\n const delta = diffSkillIndex(lane.session.tree.controlState.skillIndex, entries);\n if (!hasSkillIndexDelta(delta)) {\n return;\n }\n await this.#appendPersistent(lane, {\n type: \"skill_index_delta\",\n id: asEventId(this.#createId()),\n parentId: null,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n anchorEventId: lane.session.activeLeafId,\n added: delta.added,\n changed: delta.changed,\n removed: delta.removed,\n });\n await this.#appendSkillHarness(lane, clientId, \"skill_delta\", renderSkillDelta(delta));\n }\n\n async #ensureMemoryHarness(lane: SessionLane, clientId: ClientId): Promise<void> {\n const memory = await this.#safeMemorySettingsForRuntime(lane, clientId);\n if (!memory.enabled) {\n return;\n }\n for (const event of lane.session.tree) {\n if (\n event.type === \"harness_item\" &&\n event.item.kind === \"memory\"\n ) {\n return;\n }\n }\n const context = await buildMemoryContext({\n projectId: lane.project.projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n });\n await this.#appendPersistent(lane, {\n type: \"harness_item\",\n id: asEventId(this.#createId()),\n parentId: lane.session.activeLeafId,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n item: {\n kind: \"memory\",\n origin: \"system\",\n content: renderMemoryHarness(context),\n visibility: \"hidden\",\n data: {\n date: context.paths.today,\n projectId: lane.project.projectId,\n },\n },\n });\n }\n\n async #syncMemoryTools(lane: SessionLane, clientId: ClientId): Promise<void> {\n const memory = await this.#safeMemorySettingsForRuntime(lane, clientId);\n if (!memory.enabled || !memory.daily) {\n lane.runtime.unregisterTool(\"AppendDaily\");\n return;\n }\n lane.runtime.registerTool(\n createAppendDailyTool({\n projectId: lane.project.projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n onAppend: async (result) => {\n if (result.entry) {\n await this.#markMemoryDreamDirty(lane, clientId, result.path);\n }\n try {\n await this.#appendDiagnostic(lane.session.header.sessionId, \"memory_daily_appended\", {\n clientId,\n path: result.path,\n date: result.date,\n skippedReason: result.skippedReason,\n });\n } catch {\n // Diagnostics are observability only; daily append and dream scheduling must survive log failures.\n }\n if (result.entry) {\n await this.#scheduleMemoryDream(lane, clientId);\n }\n },\n }),\n );\n }\n\n async #autoCompactIfNeeded(lane: SessionLane, clientId: ClientId): Promise<void> {\n const memory = await this.#safeMemorySettingsForRuntime(lane, clientId);\n if (memory.autoCompactThreshold <= 0) {\n return;\n }\n const leafId = lane.session.activeLeafId;\n if (!leafId) {\n return;\n }\n const leaf = lane.session.tree.get(leafId)?.event;\n if (leaf?.type === \"compact\") {\n return;\n }\n const context = buildContext(lane.session.tree, leafId);\n const tokensBefore = estimateScorelMessagesTokens(context);\n const contextWindow = lane.session.header.meta.selectedModel?.contextWindow ?? 200_000;\n const threshold = Math.floor(contextWindow * memory.autoCompactThreshold);\n if (tokensBefore < threshold) {\n return;\n }\n await this.#waitForSessionMemoryUpdate(lane.session.header.sessionId, SESSION_MEMORY_COMPACT_WAIT_MS);\n const sessionMemory = memory.sessionMemory ? await this.#readSessionMemory(lane) : \"\";\n const compactSource = sessionMemory ? \"session_memory\" : \"foreground_compact\";\n const compactSummary = sessionMemory || await this.#generateForegroundCompactSummary(lane).catch((cause) => {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n void this.#appendDiagnostic(lane.session.header.sessionId, \"foreground_compact_failed\", {\n clientId,\n message: error.message,\n stack: shortStack(error),\n });\n return \"\";\n });\n const summary = [\n compactSummary || this.#fallbackSessionMemorySummary(lane).summary,\n ].join(\"\\n\").trim();\n const compacted = await this.#appendPersistent(lane, {\n type: \"compact\",\n id: asEventId(this.#createId()),\n parentId: leafId,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n summary,\n compactedThrough: leafId,\n tokensBefore,\n tokensAfter: estimateTextTokens(summary),\n retainedEventCount: AUTO_COMPACT_RETAINED_EVENTS,\n });\n await this.#appendDiagnostic(lane.session.header.sessionId, \"auto_compacted\", {\n clientId,\n compactEventId: compacted.id,\n source: compactSource,\n tokensBefore,\n tokensAfter: \"tokensAfter\" in compacted ? compacted.tokensAfter : undefined,\n threshold,\n });\n }\n\n #scheduleSessionMemoryUpdate(lane: SessionLane, clientId: ClientId): void {\n const sessionId = lane.session.header.sessionId;\n const previous = this.#sessionMemoryUpdates.get(sessionId) ?? Promise.resolve();\n const task = previous.catch(() => undefined).then(() => this.#maintainSessionMemory(lane, clientId));\n this.#sessionMemoryUpdates.set(sessionId, task);\n void task.catch((cause) => {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n void this.#appendDiagnostic(sessionId, \"session_memory_update_failed\", {\n clientId,\n message: error.message,\n stack: shortStack(error),\n });\n }).finally(() => {\n if (this.#sessionMemoryUpdates.get(sessionId) === task) {\n this.#sessionMemoryUpdates.delete(sessionId);\n }\n });\n }\n\n async #waitForSessionMemoryUpdate(sessionId: SessionId, timeoutMs: number): Promise<void> {\n const update = this.#sessionMemoryUpdates.get(sessionId);\n if (!update) {\n return;\n }\n await Promise.race([\n update.catch(() => undefined),\n new Promise<void>((resolve) => setTimeout(resolve, timeoutMs)),\n ]);\n }\n\n async #readSessionMemory(lane: SessionLane): Promise<string> {\n return (await readSessionMemory({\n projectId: lane.project.projectId,\n sessionId: lane.session.header.sessionId,\n homeDir: this.#memoryHomeDir,\n })).trim();\n }\n\n async #maintainSessionMemory(lane: SessionLane, clientId: ClientId): Promise<void> {\n const memory = await this.#safeMemorySettingsForRuntime(lane, clientId);\n if (!memory.sessionMemory) {\n return;\n }\n const current = await this.#readSessionMemory(lane);\n const generated = await this.#generateSessionMemory(lane, current).catch(() => undefined);\n const fallback = this.#fallbackSessionMemorySummary(lane);\n const result = await writeSessionMemory({\n projectId: lane.project.projectId,\n sessionId: lane.session.header.sessionId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n summary: generated?.summary ?? fallback.summary,\n recentMessages: generated?.recentMessages ?? fallback.recentMessages,\n decisions: generated?.decisions ?? fallback.decisions,\n followUps: generated?.followUps ?? fallback.followUps,\n });\n await this.#appendDiagnostic(lane.session.header.sessionId, \"session_memory_updated\", {\n clientId,\n path: result.path,\n bytes: result.content.length,\n });\n }\n\n async #generateForegroundCompactSummary(lane: SessionLane): Promise<string> {\n const selectedModel = await this.#selectedModelFromMeta(\n { projectId: lane.project.projectId, modelSelection: { role: \"auxiliary\" } },\n lane.project,\n );\n if (!selectedModel) {\n return \"\";\n }\n const runtime = await this.#createRuntime({\n sessionId: lane.session.header.sessionId,\n project: lane.project,\n selectedModel,\n purpose: \"memory\",\n });\n const prompt = [\n \"Compact the Scorel session context for continuation.\",\n \"Return a dense markdown summary only. Do not mention these instructions.\",\n \"Preserve current task, user requirements, decisions, important files/functions, errors, commands, and next steps.\",\n \"\",\n \"<recent_events>\",\n this.#recentConversationLines(lane, 40).join(\"\\n\"),\n \"</recent_events>\",\n ].join(\"\\n\");\n let raw = \"\";\n for await (const rawEvent of runtime.executeTurn(\n [{ role: \"user\", content: [{ type: \"text\", text: prompt }] }],\n \"You compact session context. Output markdown only.\",\n {},\n )) {\n if (rawEvent.type === \"text_delta\") {\n raw += rawEvent.delta;\n } else if (rawEvent.type === \"message_end\") {\n raw = assistantText(rawEvent.message) || raw;\n } else if (rawEvent.type === \"error\") {\n throw rawEvent.error;\n }\n }\n return raw.trim();\n }\n\n async #generateSessionMemory(\n lane: SessionLane,\n current: string,\n ): Promise<{ summary?: string; recentMessages?: string[]; decisions?: string[]; followUps?: string[] } | undefined> {\n const selectedModel = await this.#selectedModelFromMeta(\n { projectId: lane.project.projectId, modelSelection: { role: \"auxiliary\" } },\n lane.project,\n );\n if (!selectedModel) {\n return undefined;\n }\n const runtime = await this.#createRuntime({\n sessionId: lane.session.header.sessionId,\n project: lane.project,\n selectedModel,\n purpose: \"memory\",\n });\n const prompt = [\n \"Update Scorel session memory for context management. Return strict JSON only.\",\n \"This is not long-term memory. It is a compact current-session summary used by future auto compact.\",\n \"Keys: summary string, recentMessages string[], decisions string[], followUps string[].\",\n \"Keep it dense, current, and useful after old conversation history is replaced.\",\n \"\",\n \"<current_session_memory>\",\n current.trim() || \"(empty)\",\n \"</current_session_memory>\",\n \"\",\n \"<recent_events>\",\n this.#recentConversationLines(lane, 24).join(\"\\n\"),\n \"</recent_events>\",\n ].join(\"\\n\");\n let raw = \"\";\n for await (const rawEvent of runtime.executeTurn(\n [{ role: \"user\", content: [{ type: \"text\", text: prompt }] }],\n \"You maintain session memory for context compaction. Output strict JSON only.\",\n {},\n )) {\n if (rawEvent.type === \"text_delta\") {\n raw += rawEvent.delta;\n } else if (rawEvent.type === \"message_end\") {\n raw = assistantText(rawEvent.message) || raw;\n } else if (rawEvent.type === \"error\") {\n throw rawEvent.error;\n }\n }\n return parseSessionMemoryJson(raw);\n }\n\n #fallbackSessionMemorySummary(lane: SessionLane): {\n summary: string;\n recentMessages: string[];\n decisions: string[];\n followUps: string[];\n } {\n const recentMessages = this.#recentConversationLines(lane, 12);\n return {\n summary: recentMessages.at(-1) ?? \"Session is active. Continue from the latest visible user request.\",\n recentMessages,\n decisions: [],\n followUps: [],\n };\n }\n\n #recentConversationLines(lane: SessionLane, limit: number): string[] {\n const events = [...lane.session.tree]\n .filter((event) => \"message\" in event || event.type === \"compact\")\n .slice(-limit);\n return events.map((event) => {\n if (event.type === \"compact\") {\n return `[compact] ${compactLine(event.summary, 500)}`;\n }\n return `[${event.message.role}] ${compactLine(messageText(event.message), 500)}`;\n });\n }\n\n async #appendChannelHarness(\n lane: SessionLane,\n clientId: ClientId,\n context: RuntimeChannelContext,\n parentId: EventId | null,\n ): Promise<Extract<PersistentEvent, { type: \"harness_item\" }>> {\n const lines = [\n \"This message came from an IM channel.\",\n \"\",\n `channel: ${context.channel}`,\n ...(context.conversationType ? [`conversation_type: ${context.conversationType}`] : []),\n ...(context.senderDisplayName ? [`sender_display_name: ${context.senderDisplayName}`] : []),\n ...(context.mentionedBot !== undefined ? [`mentioned_bot: ${context.mentionedBot}`] : []),\n \"\",\n \"Use SendChannelMessage to reply to the current conversation when needed.\",\n \"In IM, send a short acknowledgement before long work so the user does not think the bot is stuck.\",\n \"For longer tasks, send concise progress updates instead of waiting until every tool call has finished.\",\n \"Keep replies conversational and avoid exposing internal tool names unless they help the user.\",\n ];\n return this.#appendPersistent(lane, {\n type: \"harness_item\",\n id: asEventId(this.#createId()),\n parentId,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n item: {\n kind: \"channel_context\",\n origin: \"system\",\n content: lines.join(\"\\n\"),\n visibility: \"hidden\",\n data: {\n extensionId: context.extensionId,\n channel: context.channel,\n externalConversationId: context.externalConversationId,\n ...(context.conversationType ? { conversationType: context.conversationType } : {}),\n ...(context.mentionedBot !== undefined ? { mentionedBot: context.mentionedBot } : {}),\n },\n },\n }) as Promise<Extract<PersistentEvent, { type: \"harness_item\" }>>;\n }\n\n async #scheduleMemoryDream(lane: SessionLane, clientId: ClientId): Promise<void> {\n const memory = await this.#safeMemorySettingsForRuntime(lane, clientId);\n if (!memory.enabled || !memory.autoDream) {\n return;\n }\n const projectId = lane.project.projectId;\n const existing = this.#memoryDreams.get(projectId);\n if (existing?.timer) {\n clearTimeout(existing.timer);\n }\n const schedule: MemoryDreamSchedule = {\n running: existing?.running ?? false,\n sessionId: lane.session.header.sessionId,\n clientId,\n lastActivityAt: this.#now(),\n };\n const delayMs = Math.max(0, memory.dreamIdleMinutes) * 60 * 1000;\n const scheduledFor = this.#now() + delayMs;\n const currentState = await readMemoryDreamState({\n projectId: lane.project.projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n });\n await this.#writeMemoryDreamState(lane.project.projectId, {\n ...(currentState ?? {}),\n projectId: String(lane.project.projectId),\n dirty: true,\n running: schedule.running,\n sessionId: String(lane.session.header.sessionId),\n clientId: String(clientId),\n lastDailyAppendAt: currentState?.lastDailyAppendAt ?? schedule.lastActivityAt,\n scheduledFor,\n });\n schedule.timer = setTimeout(() => {\n void this.#runIdleMemoryDream(projectId).catch((cause) => {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n void this.#appendDiagnostic(schedule.sessionId, \"idle_memory_dream_failed\", {\n clientId: schedule.clientId,\n message: error.message,\n stack: shortStack(error),\n });\n });\n }, delayMs);\n schedule.timer.unref?.();\n this.#memoryDreams.set(projectId, schedule);\n await this.#appendDiagnostic(lane.session.header.sessionId, \"idle_memory_dream_scheduled\", {\n clientId,\n projectId,\n idleMinutes: memory.dreamIdleMinutes,\n });\n }\n\n async #markMemoryDreamDirty(lane: SessionLane, clientId: ClientId, dailyPath: string): Promise<void> {\n const current = await readMemoryDreamState({\n projectId: lane.project.projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n });\n await this.#writeMemoryDreamState(lane.project.projectId, {\n projectId: String(lane.project.projectId),\n dirty: true,\n running: current?.running ?? false,\n sessionId: String(lane.session.header.sessionId),\n clientId: String(clientId),\n lastDailyAppendAt: this.#now(),\n lastDailyPath: dailyPath,\n lastFailure: current?.lastFailure,\n lastSuccessAt: current?.lastSuccessAt,\n lastProjectMemoryUpdateAt: current?.lastProjectMemoryUpdateAt,\n lastRootMemoryUpdateAt: current?.lastRootMemoryUpdateAt,\n });\n }\n\n async #runIdleMemoryDream(projectId: ProjectId): Promise<void> {\n const schedule = this.#memoryDreams.get(projectId);\n if (!schedule || schedule.running) {\n return;\n }\n schedule.running = true;\n schedule.timer = undefined;\n this.#memoryDreams.set(projectId, schedule);\n const beforeRun = await readMemoryDreamState({\n projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n });\n await this.#writeMemoryDreamState(projectId, {\n ...(beforeRun ?? { projectId: String(projectId), dirty: true }),\n projectId: String(projectId),\n running: true,\n lastAttemptAt: this.#now(),\n });\n try {\n const lane = await this.#getLane(schedule.sessionId);\n const memory = await this.#safeMemorySettingsForRuntime(lane, schedule.clientId);\n if (!memory.enabled || !memory.autoDream) {\n await this.#writeMemoryDreamState(projectId, {\n ...(beforeRun ?? { projectId: String(projectId) }),\n projectId: String(projectId),\n dirty: false,\n running: false,\n lastFailure: { at: this.#now(), message: \"Memory dream disabled\" },\n });\n return;\n }\n const generated = await this.#generateMemoryUpdate(lane, memory);\n const paths = scorelMemoryPaths({\n projectId: lane.project.projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n });\n if (generated?.projectMemory?.trim()) {\n await writeFile(paths.projectMemoryPath, normalizeMarkdownFile(generated.projectMemory), \"utf8\");\n await this.#appendDiagnostic(lane.session.header.sessionId, \"project_memory_updated\", {\n clientId: schedule.clientId,\n path: paths.projectMemoryPath,\n });\n }\n if (memory.promoteRoot && generated?.rootMemory?.trim()) {\n await writeFile(paths.rootMemoryPath, normalizeMarkdownFile(generated.rootMemory), \"utf8\");\n await this.#appendDiagnostic(lane.session.header.sessionId, \"root_memory_updated\", {\n clientId: schedule.clientId,\n path: paths.rootMemoryPath,\n });\n }\n const now = this.#now();\n const latestState = await readMemoryDreamState({ projectId, homeDir: this.#memoryHomeDir, now: this.#now });\n const hasNewDailyDuringRun =\n latestState?.lastDailyAppendAt !== undefined &&\n beforeRun?.lastDailyAppendAt !== undefined &&\n latestState.lastDailyAppendAt > beforeRun.lastDailyAppendAt;\n await this.#writeMemoryDreamState(projectId, {\n ...(latestState ?? { projectId: String(projectId) }),\n projectId: String(projectId),\n dirty: hasNewDailyDuringRun,\n running: false,\n ...(hasNewDailyDuringRun ? {} : { scheduledFor: undefined }),\n lastSuccessAt: now,\n lastFailure: undefined,\n ...(generated?.projectMemory?.trim() ? { lastProjectMemoryUpdateAt: now } : {}),\n ...(memory.promoteRoot && generated?.rootMemory?.trim() ? { lastRootMemoryUpdateAt: now } : {}),\n });\n if (hasNewDailyDuringRun) {\n await this.#scheduleMemoryDream(lane, schedule.clientId);\n }\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n await this.#writeMemoryDreamState(projectId, {\n ...(await readMemoryDreamState({ projectId, homeDir: this.#memoryHomeDir, now: this.#now }) ?? { projectId: String(projectId) }),\n projectId: String(projectId),\n dirty: true,\n running: false,\n lastFailure: { at: this.#now(), message },\n });\n throw cause;\n } finally {\n this.#memoryDreams.delete(projectId);\n }\n }\n\n async #memoryStatusForProject(projectId: ProjectId): Promise<MemoryStatus> {\n const state = await readMemoryDreamState({\n projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n });\n await this.#recoverMemoryDream(projectId, state);\n const recovered = await readMemoryDreamState({\n projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n });\n return {\n projectId,\n dirty: recovered?.dirty ?? false,\n running: recovered?.running ?? false,\n ...(recovered?.lastDailyAppendAt !== undefined ? { lastDailyAppendAt: recovered.lastDailyAppendAt } : {}),\n ...(recovered?.lastDailyPath ? { lastDailyPath: recovered.lastDailyPath } : {}),\n ...(recovered?.scheduledFor !== undefined ? { scheduledFor: recovered.scheduledFor } : {}),\n ...(recovered?.lastAttemptAt !== undefined ? { lastAttemptAt: recovered.lastAttemptAt } : {}),\n ...(recovered?.lastSuccessAt !== undefined ? { lastSuccessAt: recovered.lastSuccessAt } : {}),\n ...(recovered?.lastFailure ? { lastFailure: recovered.lastFailure } : {}),\n ...(recovered?.lastProjectMemoryUpdateAt !== undefined ? { lastProjectMemoryUpdateAt: recovered.lastProjectMemoryUpdateAt } : {}),\n ...(recovered?.lastRootMemoryUpdateAt !== undefined ? { lastRootMemoryUpdateAt: recovered.lastRootMemoryUpdateAt } : {}),\n };\n }\n\n async #recoverMemoryDream(projectId: ProjectId, state: Awaited<ReturnType<typeof readMemoryDreamState>>): Promise<void> {\n if (!state?.dirty || this.#memoryDreams.has(projectId)) {\n return;\n }\n const lane = [...this.#sessions.values()].find((candidate) => candidate.project.projectId === projectId);\n if (!lane) {\n return;\n }\n const clientId = state.clientId ? asClientId(state.clientId) : asClientId(\"client_memory_recovery\");\n await this.#scheduleMemoryDream(lane, clientId);\n }\n\n async #writeMemoryDreamState(projectId: ProjectId, state: Parameters<typeof writeMemoryDreamState>[0][\"state\"]): Promise<void> {\n await writeMemoryDreamState({\n projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n state,\n });\n }\n\n async #generateMemoryUpdate(\n lane: SessionLane,\n memory: MemorySettings,\n ): Promise<{ projectMemory?: string; rootMemory?: string } | undefined> {\n const selectedModel = await this.#selectedModelFromMeta(\n { projectId: lane.project.projectId, modelSelection: { role: \"auxiliary\" } },\n lane.project,\n );\n if (!selectedModel) {\n return undefined;\n }\n const context = await buildMemoryContext({\n projectId: lane.project.projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n });\n const runtime = await this.#createRuntime({\n sessionId: lane.session.header.sessionId,\n project: lane.project,\n selectedModel,\n purpose: \"memory\",\n });\n let raw = \"\";\n for await (const rawEvent of runtime.executeTurn(\n [{\n role: \"user\",\n content: [{\n type: \"text\",\n text: [\n \"Consolidate Scorel filesystem memory from recent project daily notes.\",\n \"Return only strict JSON with optional keys: projectMemory, rootMemory.\",\n \"projectMemory: full replacement markdown for Project MEMORY.md, only durable project preferences/decisions/workflows/open questions.\",\n memory.promoteRoot\n ? \"rootMemory: full replacement markdown for root MEMORY.md, only cross-project stable user preferences. Omit if no global preference.\"\n : \"Do not return rootMemory.\",\n \"Do not store secrets, transient tool noise, or code facts that can be read from the repo.\",\n \"Use daily notes as recent evidence, but only promote stable facts and decisions into memory.\",\n \"\",\n \"<root_memory>\",\n context.rootMemory,\n \"</root_memory>\",\n \"<project_memory>\",\n context.projectMemory,\n \"</project_memory>\",\n \"<recent_daily>\",\n context.yesterdayDaily,\n \"\",\n context.todayDaily,\n \"</recent_daily>\",\n ].join(\"\\n\"),\n }],\n }],\n \"You are Scorel's automatic memory dreamer. Output strict JSON only.\",\n {},\n )) {\n if (rawEvent.type === \"text_delta\") {\n raw += rawEvent.delta;\n } else if (rawEvent.type === \"message_end\") {\n raw = assistantText(rawEvent.message) || raw;\n } else if (rawEvent.type === \"error\") {\n throw rawEvent.error;\n }\n }\n return parseMemoryUpdate(raw);\n }\n\n async #appendSkillHarness(\n lane: SessionLane,\n clientId: ClientId,\n kind: \"skill_listing\" | \"skill_delta\",\n content: string,\n ): Promise<void> {\n await this.#appendPersistent(lane, {\n type: \"harness_item\",\n id: asEventId(this.#createId()),\n parentId: lane.session.activeLeafId,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n item: {\n kind,\n origin: \"system\",\n content,\n visibility: \"hidden\",\n },\n });\n }\n\n #broadcastTransient(sessionId: SessionId, event: TransientEventInput): TransientEvent {\n const withSeq = { ...event, seq: this.#nextSeq(sessionId) } as TransientEvent;\n this.#recordAndBroadcast(sessionId, withSeq);\n return withSeq;\n }\n\n #recordAndBroadcast(sessionId: SessionId, event: ScorelEvent): void {\n const events = this.#events.get(sessionId) ?? [];\n events.push(event);\n this.#events.set(sessionId, events);\n for (const connection of this.#connections) {\n if (connection.sessionId === sessionId) {\n connection.emit({ type: \"event\", event });\n }\n }\n }\n\n #nextSeq(sessionId: SessionId): Seq {\n const next = (this.#seqs.get(sessionId) ?? 0) + 1;\n this.#seqs.set(sessionId, next);\n return asSeq(next);\n }\n\n #eventsAfter(sessionId: SessionId, fromSeq: Seq | undefined): ScorelEvent[] {\n const from = Number(fromSeq ?? 0);\n return (this.#events.get(sessionId) ?? []).filter((event) => Number(event.seq) > from);\n }\n\n async #resyncEvents(\n sessionId: SessionId,\n anchors: { persistentLastSeq?: Seq; streamLastSeq?: Seq },\n ): Promise<ResyncEventsResult> {\n // Cold attach: a client connected to a session id we have not yet loaded\n // into memory (typical when WebUI opens a historical session that lives\n // only on disk). Load the lane so #seqs reflects the persisted tail\n // before deciding whether to short-circuit on stream_resume \u2014 otherwise\n // currentSeq stays at 0 and the early return strands the caller with an\n // empty event list.\n if (!this.#seqs.has(sessionId)) {\n try {\n await this.#getLane(sessionId);\n } catch {\n // Session id unknown to disk; fall through with currentSeq=0.\n }\n }\n const currentSeq = asSeq(this.#seqs.get(sessionId) ?? 0);\n const persistentLastSeq = anchors.persistentLastSeq ?? asSeq(0);\n const streamLastSeq = anchors.streamLastSeq ?? persistentLastSeq;\n\n if (Number(streamLastSeq) >= Number(currentSeq)) {\n const result: ResyncEventsResult = {\n events: [],\n throughSeq: currentSeq,\n mode: \"stream_resume\",\n };\n await this.#appendDiagnostic(sessionId, \"resync_events\", {\n mode: result.mode,\n persistentLastSeq,\n streamLastSeq,\n throughSeq: result.throughSeq,\n eventCount: result.events.length,\n });\n return result;\n }\n\n const buffered = this.#eventsAfter(sessionId, streamLastSeq);\n if (hasContinuousCoverage(buffered, Number(streamLastSeq) + 1)) {\n const result: ResyncEventsResult = {\n events: buffered,\n throughSeq: buffered.at(-1)?.seq ?? streamLastSeq,\n mode: \"stream_resume\",\n };\n await this.#appendDiagnostic(sessionId, \"resync_events\", {\n mode: result.mode,\n persistentLastSeq,\n streamLastSeq,\n throughSeq: result.throughSeq,\n eventCount: result.events.length,\n });\n return result;\n }\n\n const lane = await this.#getLane(sessionId);\n const events = [...lane.session.tree].filter((event) => Number(event.seq) > Number(persistentLastSeq));\n const throughSeq = events.at(-1)?.seq ?? persistentLastSeq;\n const mode: ResyncEventsResult[\"mode\"] =\n Number(persistentLastSeq) === 0 && Number(streamLastSeq) === 0 ? \"full_reload\" : \"persistent_fallback\";\n const result: ResyncEventsResult = {\n events,\n throughSeq,\n mode,\n gapFromSeq: asSeq(Number(streamLastSeq) + 1),\n gapToSeq: currentSeq,\n };\n await this.#appendDiagnostic(sessionId, \"resync_events\", {\n mode: result.mode,\n persistentLastSeq,\n streamLastSeq,\n throughSeq: result.throughSeq,\n eventCount: result.events.length,\n gapFromSeq: result.gapFromSeq,\n gapToSeq: result.gapToSeq,\n });\n return result;\n }\n\n async #getLane(sessionId: SessionId): Promise<SessionLane> {\n const existing = this.#sessions.get(sessionId);\n if (existing) {\n return existing;\n }\n const loaded = await loadSession({ sessionsDir: this.#sessionsDir, sessionId });\n const project = await this.#resolveProject(sessionId, loaded.header.meta.projectId);\n const selectedModel = await this.#selectedModelFromMeta(loaded.header.meta, project);\n const runtime = await this.#createRuntime({ sessionId, project, selectedModel, purpose: \"chat\" });\n await this.#appendDiagnostic(sessionId, \"runtime_created\", {\n projectId: project.projectId,\n workDir: project.workDir,\n selectedModelId: selectedModel?.modelId,\n });\n const lane = {\n session: loaded,\n project,\n runtime,\n ...(selectedModel ? { selectedModel } : {}),\n queue: Promise.resolve(),\n appendQueue: Promise.resolve(),\n followUpWaiters: new Map(),\n };\n this.#registerLaneTools(lane);\n this.#sessions.set(sessionId, lane);\n this.#seqs.set(sessionId, Number(loaded.currentSeq));\n return lane;\n }\n\n async #loadExistingLaneIfPresent(sessionId: SessionId): Promise<boolean> {\n if (this.#sessions.has(sessionId)) {\n return true;\n }\n try {\n await this.#getLane(sessionId);\n return true;\n } catch (cause) {\n if (isNodeErrorCode(cause, \"ENOENT\")) {\n return false;\n }\n throw cause;\n }\n }\n\n async #createLane(sessionId: SessionId, meta: CreateSessionMeta, project: HostProject): Promise<SessionLane> {\n const selectedModel = await this.#selectedModelFromMeta(meta, project);\n const session = await createSession({\n sessionsDir: this.#sessionsDir,\n header: {\n version: 1,\n sessionId,\n deviceId: this.#deviceId,\n createdAt: this.#now(),\n meta: {\n ...meta,\n ...(selectedModel\n ? {\n model: selectedModel.displayName,\n selectedModel,\n }\n : {}),\n },\n },\n });\n const runtime = await this.#createRuntime({ sessionId, project, selectedModel, purpose: \"chat\" });\n await this.#appendDiagnostic(sessionId, \"runtime_created\", {\n projectId: project.projectId,\n workDir: project.workDir,\n selectedModelId: selectedModel?.modelId,\n });\n const lane = {\n session,\n project,\n runtime,\n ...(selectedModel ? { selectedModel } : {}),\n queue: Promise.resolve(),\n appendQueue: Promise.resolve(),\n followUpWaiters: new Map(),\n };\n this.#registerLaneTools(lane);\n return lane;\n }\n\n #registerLaneTools(lane: SessionLane): void {\n lane.runtime.registerTool(\n createSkillTool({\n getEntry: (name) => lane.session.tree.controlState.skillIndex[name],\n listNames: () => Object.keys(lane.session.tree.controlState.skillIndex).sort(),\n }),\n );\n lane.runtime.registerTool(\n createSnipTool({\n snip: async (input) => this.#snipUserTurn(lane, input.userMessageId, input.reason),\n }),\n );\n }\n\n async #snipUserTurn(\n lane: SessionLane,\n userMessageId: string,\n reason: string | undefined,\n ): Promise<{ anchorUserEventId: EventId; throughEventId: EventId; hiddenEventCount: number }> {\n const leafId = lane.session.activeLeafId;\n if (!leafId) {\n throw new Error(\"snip requires an active conversation\");\n }\n const path = lane.session.tree.getPath(leafId);\n const anchorUserEventId = this.#resolveSnipUserMessageId(lane, path, userMessageId);\n const anchorIndex = path.findIndex((id) => id === anchorUserEventId);\n if (anchorIndex < 0) {\n throw new Error(`snip target is not on the active conversation path: ${anchorUserEventId}`);\n }\n const anchor = lane.session.tree.get(anchorUserEventId)?.event;\n if (anchor?.type !== \"user_message\") {\n throw new Error(`snip target must be a user_message: ${anchorUserEventId}`);\n }\n const nextUserIndex = path.findIndex((id, index) =>\n index > anchorIndex && lane.session.tree.get(id)?.event.type === \"user_message\"\n );\n if (nextUserIndex < 0) {\n throw new Error(\"snip cannot hide the current user turn before the next user message exists\");\n }\n const throughEventId = path[nextUserIndex - 1];\n if (!throughEventId || throughEventId === anchorUserEventId) {\n throw new Error(`snip target has no completed turn content: ${anchorUserEventId}`);\n }\n const clientId = lane.snipClientId;\n if (!clientId) {\n throw new Error(\"snip is only available while a user turn is running\");\n }\n await this.#appendPersistent(lane, {\n type: \"context_control\",\n id: asEventId(this.#createId()),\n parentId: null,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n operation: \"hide_user_turn\",\n anchorUserEventId,\n throughEventId,\n actor: \"agent\",\n ...(reason ? { reason } : {}),\n });\n await this.#appendDiagnostic(lane.session.header.sessionId, \"context_snipped\", {\n anchorUserEventId,\n throughEventId,\n hiddenEventCount: nextUserIndex - anchorIndex,\n });\n return {\n anchorUserEventId,\n throughEventId,\n hiddenEventCount: nextUserIndex - anchorIndex,\n };\n }\n\n #resolveSnipUserMessageId(lane: SessionLane, path: EventId[], userMessageId: string): EventId {\n if (path.includes(userMessageId as EventId)) {\n return userMessageId as EventId;\n }\n const matches = path.filter((id) => {\n const event = lane.session.tree.get(id)?.event;\n return event?.type === \"user_message\" && snipUserMessageAlias(id) === userMessageId;\n });\n if (matches.length === 1) {\n return matches[0];\n }\n if (matches.length > 1) {\n throw new Error(`snip target short id is ambiguous: ${userMessageId}`);\n }\n return asEventId(userMessageId);\n }\n\n async #selectChatRuntime(lane: SessionLane, modelSelection: ModelSelectionInput | undefined): Promise<void> {\n if (!modelSelection) {\n return;\n }\n const selectedModel = await this.#selectedModelFromMeta(\n { projectId: lane.project.projectId, modelSelection },\n lane.project,\n );\n if (!selectedModel || lane.selectedModel?.modelId === selectedModel.modelId) {\n return;\n }\n lane.runtime = await this.#createRuntime({\n sessionId: lane.session.header.sessionId,\n project: lane.project,\n selectedModel,\n purpose: \"chat\",\n });\n lane.selectedModel = selectedModel;\n this.#registerLaneTools(lane);\n await this.#appendDiagnostic(lane.session.header.sessionId, \"chat_model_selected\", {\n projectId: lane.project.projectId,\n workDir: lane.project.workDir,\n selectedModelId: selectedModel.modelId,\n role: selectedModel.role,\n });\n }\n\n #syncChannelTool(lane: SessionLane, channelContext: RuntimeChannelContext | undefined): void {\n if (!channelContext) {\n lane.runtime.unregisterTool(\"SendChannelMessage\");\n return;\n }\n lane.runtime.registerTool(\n createSendChannelMessageTool({\n sendCurrent: async (input) => {\n const current = lane.channelContext;\n if (!current) {\n throw new Error(\"no_channel_context\");\n }\n if (input.channel && input.channel !== current.channel) {\n throw new Error(`channel_mismatch: current channel is ${current.channel}`);\n }\n const extension = this.#imExtensions.get(current.extensionId);\n if (!extension) {\n throw new Error(`channel_adapter_unavailable: ${current.extensionId}`);\n }\n await extension.adapter.sendMessage(current.target, {\n ...(input.text ? { text: input.text } : {}),\n ...(input.attachments ? { attachments: input.attachments } : {}),\n });\n await this.#appendDiagnostic(lane.session.header.sessionId, \"channel_message_sent\", {\n extensionId: current.extensionId,\n channel: current.channel,\n externalConversationId: current.externalConversationId,\n attachments: input.attachments?.length ?? 0,\n });\n return { channel: current.channel, target: \"current\", attachments: input.attachments?.length ?? 0 };\n },\n }),\n );\n }\n\n async #startEnabledImExtensions(): Promise<void> {\n const config = await this.#loadUserConfigProfile();\n const enabled = Object.entries(config?.extensions ?? {})\n .filter(([, extension]) => extension.enabled && extension.kind === \"im\")\n .map(([extensionId]) => extensionId);\n if (enabled.length === 0) {\n return;\n }\n const manifests = await this.#discoverExtensionManifests();\n for (const extensionId of enabled) {\n const manifest = manifests.get(extensionId);\n if (!manifest) {\n await this.#appendHostDiagnostic(\"im_extension_missing\", { extensionId });\n continue;\n }\n let adapter: ImAdapter;\n try {\n adapter = await this.#loadImAdapter(manifest, config?.extensions[extensionId]?.config ?? {});\n } catch (cause) {\n await this.#appendHostDiagnostic(\"im_extension_load_failed\", {\n extensionId,\n message: cause instanceof Error ? cause.message : String(cause),\n });\n continue;\n }\n const extension: LoadedImExtension = {\n manifest,\n adapter,\n skillRoots: manifest.skills.map((path) => resolve(manifest.rootDir, path)),\n };\n let started = false;\n await adapter.start({\n onMessage: async (message) => {\n await this.#handleImMessage(extension, message);\n },\n logger: {\n info: (message, data) => void this.#appendHostDiagnostic(\"im_extension_info\", { extensionId, message, ...data }),\n error: (message, data) => void this.#appendHostDiagnostic(\"im_extension_error\", { extensionId, message, ...data }),\n },\n }).then(() => {\n started = true;\n }).catch(async (cause) => {\n await this.#appendHostDiagnostic(\"im_extension_start_failed\", {\n extensionId,\n message: cause instanceof Error ? cause.message : String(cause),\n });\n return undefined;\n });\n if (!started) {\n continue;\n }\n this.#imExtensions.set(extensionId, extension);\n await this.#appendHostDiagnostic(\"im_extension_started\", { extensionId });\n }\n }\n\n async #stopImExtensions(): Promise<void> {\n for (const extension of this.#imExtensions.values()) {\n await extension.adapter.stop().catch((cause) => {\n void this.#appendHostDiagnostic(\"im_extension_stop_failed\", {\n extensionId: extension.manifest.id,\n message: cause instanceof Error ? cause.message : String(cause),\n });\n });\n }\n this.#imExtensions.clear();\n }\n\n async #discoverExtensionManifests(): Promise<Map<string, ExtensionManifest>> {\n const roots = [\n this.#builtinExtensionsDir,\n join(this.#scorelHomeDir, \"extensions\"),\n ];\n const manifests = new Map<string, ExtensionManifest>();\n for (const root of roots) {\n let children: string[];\n try {\n children = await readdir(root);\n } catch (cause) {\n if (isNodeErrorCode(cause, \"ENOENT\") || isNodeErrorCode(cause, \"ENOTDIR\")) {\n continue;\n }\n throw cause;\n }\n for (const child of children.sort()) {\n const manifestPath = join(root, child, \"scorel.extension.json\");\n try {\n const manifest = await loadExtensionManifest(manifestPath);\n manifests.set(manifest.id, manifest);\n } catch (cause) {\n await this.#appendHostDiagnostic(\"extension_manifest_invalid\", {\n path: manifestPath,\n message: cause instanceof Error ? cause.message : String(cause),\n });\n }\n }\n }\n return manifests;\n }\n\n async #loadImAdapter(manifest: ExtensionManifest, config: Record<string, string | number | boolean>): Promise<ImAdapter> {\n const adapterPath = resolve(manifest.rootDir, manifest.adapter);\n const mod = await import(pathToFileURL(adapterPath).href) as {\n createAdapter?: (options: { config: Record<string, string | number | boolean>; manifest: ExtensionManifest }) => ImAdapter | Promise<ImAdapter>;\n default?: ImAdapter;\n };\n const adapter = mod.createAdapter ? await mod.createAdapter({ config, manifest }) : mod.default;\n if (!adapter || typeof adapter.start !== \"function\" || typeof adapter.stop !== \"function\" || typeof adapter.sendMessage !== \"function\") {\n throw new Error(`IM adapter ${adapterPath} must export createAdapter() or default adapter with start/stop/sendMessage`);\n }\n return adapter;\n }\n\n async #handleImMessage(extension: LoadedImExtension, message: ImIncomingMessage): Promise<SessionId> {\n const binding = await this.#ensureImBinding(extension.manifest.id, message.externalConversationId);\n const lane = await this.#getLane(binding.sessionId);\n const runningBehavior = isSteerMessage(message.text) ? \"steer\" : \"follow_up\";\n const content = stripImCommandPrefix(message.text);\n const channelContext: ChannelContext = {\n channel: extension.manifest.id,\n externalConversationId: message.externalConversationId,\n ...(message.conversationType ? { conversationType: message.conversationType } : {}),\n ...(message.senderDisplayName ? { senderDisplayName: message.senderDisplayName } : {}),\n ...(message.mentionedBot !== undefined ? { mentionedBot: message.mentionedBot } : {}),\n data: message.target?.data ?? message.data ?? {},\n };\n await this.#handleSendMessage(\n { clientId: asClientId(`im_${extension.manifest.id}`), emit: () => undefined },\n {\n type: \"send_message\",\n requestId: asRequestId(`req_im_${this.#createId()}`),\n sessionId: lane.session.header.sessionId,\n content,\n options: {\n runningBehavior,\n channelContext,\n },\n },\n );\n return lane.session.header.sessionId;\n }\n\n async #ensureImBinding(extensionId: string, externalConversationId: string): Promise<ImSessionBinding> {\n const key = imBindingKey(extensionId, externalConversationId);\n const existing = this.#imBindings.get(key);\n if (existing) {\n existing.updatedAt = this.#now();\n await this.#saveImBindings();\n return existing;\n }\n const project = await this.#ensureDefaultWorkspaceProject();\n const sessionId = asSessionId(`ses_${this.#createId()}`);\n const lane = await this.#createLane(sessionId, {\n projectId: project.projectId,\n title: `${extensionId}: ${externalConversationId}`,\n }, project);\n this.#sessions.set(sessionId, lane);\n this.#events.set(sessionId, []);\n this.#seqs.set(sessionId, 0);\n const binding: ImSessionBinding = {\n extensionId,\n externalConversationId,\n projectId: project.projectId,\n sessionId,\n createdAt: this.#now(),\n updatedAt: this.#now(),\n };\n this.#imBindings.set(key, binding);\n await this.#saveImBindings();\n await this.#appendDiagnostic(sessionId, \"im_session_bound\", {\n extensionId,\n externalConversationId,\n projectId: project.projectId,\n });\n this.#onSessionListChanged?.({ projectId: project.projectId, sessionId });\n return binding;\n }\n\n async #ensureDefaultWorkspaceProject(): Promise<HostProject> {\n const workspace = join(this.#scorelHomeDir, \"workspace\");\n await mkdir(workspace, { recursive: true });\n return this.registerProject(workspace);\n }\n\n #extensionSkillRoots(): Array<{ path: string; extensionId: string }> {\n return [...this.#imExtensions.values()].flatMap((extension) =>\n extension.skillRoots.map((path) => ({ path, extensionId: extension.manifest.id })),\n );\n }\n\n async #loadImBindings(): Promise<void> {\n try {\n const text = await readFile(this.#imBindingsPath(), \"utf8\");\n const value = JSON.parse(text) as { bindings?: ImSessionBinding[] };\n for (const binding of value.bindings ?? []) {\n this.#imBindings.set(imBindingKey(binding.extensionId, binding.externalConversationId), binding);\n }\n } catch (cause) {\n if (!isNodeErrorCode(cause, \"ENOENT\")) {\n throw cause;\n }\n }\n }\n\n async #saveImBindings(): Promise<void> {\n const path = this.#imBindingsPath();\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify({ bindings: [...this.#imBindings.values()] }, null, 2)}\\n`, \"utf8\");\n }\n\n #imBindingsPath(): string {\n return join(this.#scorelHomeDir, \"channels\", \"im-bindings.json\");\n }\n\n async #loadUserConfigProfile(options: { includeSecrets?: boolean } = {}): Promise<ScorelConfigProfile | undefined> {\n try {\n return await loadScorelConfigProfile({\n cwd: this.#userHomeDir,\n scorelHomeDir: this.#scorelHomeDir,\n includeSecrets: options.includeSecrets ?? false,\n });\n } catch (cause) {\n if (isMissingConfigError(cause)) {\n return undefined;\n }\n throw cause;\n }\n }\n\n #configWriteTarget(): {\n configDir: string;\n configPath: string;\n workDir: string;\n } {\n return {\n configDir: this.#scorelHomeDir,\n configPath: join(this.#scorelHomeDir, \"config.toml\"),\n workDir: this.#userHomeDir,\n };\n }\n\n async #listModels(projectId?: ProjectId): Promise<{\n providers: ProviderConnectionSummary[];\n providerModels: ProviderModelSummary[];\n models: AvailableModelSummary[];\n roles: Record<\"primary\" | \"standard\" | \"auxiliary\", string>;\n warnings?: string[];\n }> {\n let config: ScorelConfig | ScorelConfigProfile | undefined;\n try {\n config = projectId ? await this.#configProfileForProject(projectId) : await this.#loadUserConfigProfile();\n } catch (cause) {\n if (!isMissingConfigError(cause)) {\n throw cause;\n }\n config = undefined;\n }\n config ??= projectId ? undefined : this.#modelProfile;\n if (!config) {\n return {\n providers: [],\n providerModels: [],\n models: [],\n roles: {\n primary: \"\",\n standard: \"\",\n auxiliary: \"\",\n },\n };\n }\n const configWarnings = \"warnings\" in config ? config.warnings : undefined;\n return {\n providers: listProviderConnections(config),\n providerModels: listProviderModels(config),\n models: listAvailableModels(config),\n roles: config.modelProfile.roles,\n ...(configWarnings ? { warnings: configWarnings } : {}),\n };\n }\n\n async #handleUpsertModelProfile(\n request: ClientRequest<\"upsert_model_profile\">,\n ): Promise<{\n providers: ProviderConnectionSummary[];\n providerModels: ProviderModelSummary[];\n models: AvailableModelSummary[];\n roles: Record<\"primary\" | \"standard\" | \"auxiliary\", string>;\n warnings?: string[];\n }> {\n const target = this.#configWriteTarget();\n let existingConfigText: string | undefined;\n try {\n existingConfigText = await readFile(target.configPath, \"utf8\");\n } catch (cause) {\n if (!isNodeErrorCode(cause, \"ENOENT\")) {\n throw cause;\n }\n }\n await mkdir(target.configDir, { recursive: true });\n await writeFile(\n target.configPath,\n renderModelProfileConfig({\n providerId: request.providerId,\n providerType: request.providerType,\n provider: request.provider,\n apiKeyEnv: request.apiKeyEnv,\n apiKey: request.apiKey,\n api: request.api,\n baseUrl: request.baseUrl,\n modelId: request.modelId,\n providerModelKey: request.providerModelKey,\n availableModelId: request.availableModelId,\n addToAvailable: request.addToAvailable,\n removeAvailableModelId: request.removeAvailableModelId,\n providerModelId: request.providerModelId,\n displayName: request.displayName,\n contextWindow: request.contextWindow,\n maxTokens: request.maxTokens,\n reasoning: request.reasoning,\n supportsDeveloperRole: request.supportsDeveloperRole,\n supportsImageInput: request.supportsImageInput,\n roles: request.roles,\n existingConfigText,\n }),\n \"utf8\",\n );\n await this.#appendHostDiagnostic(\"model_profile_upserted\", {\n ...(request.projectId ? { ignoredProjectId: request.projectId } : {}),\n scope: \"device\",\n workDir: target.workDir,\n providerId: request.providerId,\n modelId: request.modelId,\n });\n return this.#listModels();\n }\n\n async #handleRemoveModelProvider(\n request: ClientRequest<\"remove_model_provider\">,\n ): Promise<{\n providers: ProviderConnectionSummary[];\n providerModels: ProviderModelSummary[];\n models: AvailableModelSummary[];\n roles: Record<\"primary\" | \"standard\" | \"auxiliary\", string>;\n warnings?: string[];\n removed: boolean;\n }> {\n const target = this.#configWriteTarget();\n let existingConfigText: string | undefined;\n try {\n existingConfigText = await readFile(target.configPath, \"utf8\");\n } catch (cause) {\n if (!isNodeErrorCode(cause, \"ENOENT\")) {\n throw cause;\n }\n }\n await mkdir(target.configDir, { recursive: true });\n await writeFile(\n target.configPath,\n renderModelProfileConfig({\n removeProviderId: request.providerId,\n existingConfigText,\n }),\n \"utf8\",\n );\n const profile = await this.#listModels();\n return { ...profile, removed: true };\n }\n\n async #memorySettingsForProject(projectId: ProjectId): Promise<MemorySettings> {\n return this.#memorySettings(projectId);\n }\n\n async #memorySettings(projectId?: ProjectId): Promise<MemorySettings> {\n const config = await (projectId ? this.#configProfileForProject(projectId) : this.#loadUserConfigProfile()).catch((cause) => {\n if (isMissingConfigError(cause)) {\n return undefined;\n }\n throw cause;\n });\n return config?.memory ?? disabledMemorySettings();\n }\n\n async #safeMemorySettingsForRuntime(lane: SessionLane, clientId: ClientId): Promise<MemorySettings> {\n try {\n return await this.#memorySettingsForProject(lane.project.projectId);\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n await this.#appendDiagnostic(lane.session.header.sessionId, \"memory_settings_unavailable\", {\n clientId,\n message: error.message,\n stack: shortStack(error),\n });\n return disabledMemorySettings();\n }\n }\n\n async #handleUpsertMemorySettings(request: ClientRequest<\"upsert_memory_settings\">): Promise<MemorySettings> {\n const target = this.#configWriteTarget();\n let existingConfigText: string | undefined;\n try {\n existingConfigText = await readFile(target.configPath, \"utf8\");\n } catch (cause) {\n if (!isNodeErrorCode(cause, \"ENOENT\")) {\n throw cause;\n }\n }\n await mkdir(target.configDir, { recursive: true });\n await writeFile(\n target.configPath,\n renderMemoryConfig({\n enabled: request.enabled,\n daily: request.daily,\n sessionMemory: request.sessionMemory,\n autoDream: request.autoDream,\n promoteRoot: request.promoteRoot,\n dreamIdleMinutes: request.dreamIdleMinutes,\n autoCompactThreshold: request.autoCompactThreshold,\n existingConfigText,\n }),\n \"utf8\",\n );\n await this.#appendHostDiagnostic(\"memory_settings_upserted\", {\n ...(request.projectId ? { ignoredProjectId: request.projectId } : {}),\n scope: \"device\",\n workDir: target.workDir,\n });\n return this.#memorySettings();\n }\n\n async #runtimeSettingsForProject(projectId: ProjectId, installStatus?: Pick<RuntimeSettings, \"installStatus\" | \"installMessage\">): Promise<RuntimeSettings> {\n return this.#runtimeSettings(projectId, installStatus);\n }\n\n async #runtimeSettings(projectId?: ProjectId, installStatus?: Pick<RuntimeSettings, \"installStatus\" | \"installMessage\">): Promise<RuntimeSettings> {\n const config = await (projectId ? this.#configProfileForProject(projectId) : this.#loadUserConfigProfile()).catch((cause) => {\n if (isMissingConfigError(cause)) {\n return undefined;\n }\n throw cause;\n });\n const detected = await detectRtk();\n const savings = await readRuntimeStats(this.#runtimeStatsPath());\n return {\n tokenSavingRtk: config?.runtime.tokenSavingRtk ?? false,\n rtkAvailable: detected.available,\n ...(detected.executable ? { rtkExecutable: detected.executable } : {}),\n ...(detected.version ? { rtkVersion: detected.version } : {}),\n ...(installStatus?.installStatus ? { installStatus: installStatus.installStatus } : {}),\n ...(installStatus?.installMessage ? { installMessage: installStatus.installMessage } : {}),\n estimatedOutputTokens: savings.rtk.outputTokens,\n estimatedSavedTokens: savings.rtk.savedTokens,\n };\n }\n\n async #handleUpsertRuntimeSettings(request: ClientRequest<\"upsert_runtime_settings\">): Promise<RuntimeSettings> {\n const target = this.#configWriteTarget();\n let existingConfigText: string | undefined;\n try {\n existingConfigText = await readFile(target.configPath, \"utf8\");\n } catch (cause) {\n if (!isNodeErrorCode(cause, \"ENOENT\")) {\n throw cause;\n }\n }\n await mkdir(target.configDir, { recursive: true });\n await writeFile(\n target.configPath,\n renderRuntimeConfig({\n tokenSavingRtk: request.tokenSavingRtk,\n existingConfigText,\n }),\n \"utf8\",\n );\n const installResult = request.tokenSavingRtk === true ? await ensureRtkAvailable() : { status: \"idle\" as const };\n await this.#appendHostDiagnostic(\"runtime_settings_upserted\", {\n ...(request.projectId ? { ignoredProjectId: request.projectId } : {}),\n scope: \"device\",\n workDir: target.workDir,\n tokenSavingRtk: request.tokenSavingRtk,\n installStatus: installResult.status,\n });\n return this.#runtimeSettings(undefined, {\n installStatus: installResult.status,\n ...(installResult.message ? { installMessage: installResult.message } : {}),\n });\n }\n\n async #extensionSettings(extensionId: string): Promise<ExtensionSettings> {\n const config = await this.#loadUserConfigProfile().catch((cause) => {\n if (isMissingConfigError(cause)) {\n return undefined;\n }\n throw cause;\n });\n const extension = config?.extensions[extensionId];\n return {\n extensionId,\n enabled: extension?.enabled ?? false,\n kind: \"im\",\n config: extension?.config ?? {},\n active: this.#imExtensions.has(extensionId),\n };\n }\n\n async #handleUpsertExtensionSettings(request: ClientRequest<\"upsert_extension_settings\">): Promise<ExtensionSettings> {\n const configPath = join(this.#scorelHomeDir, \"config.toml\");\n let existingConfigText: string | undefined;\n try {\n existingConfigText = await readFile(configPath, \"utf8\");\n } catch (cause) {\n if (!isNodeErrorCode(cause, \"ENOENT\")) {\n throw cause;\n }\n }\n await mkdir(this.#scorelHomeDir, { recursive: true });\n await writeFile(\n configPath,\n renderExtensionConfig({\n extensionId: request.extensionId,\n enabled: request.enabled,\n kind: request.kind,\n config: request.config,\n existingConfigText,\n }),\n \"utf8\",\n );\n await this.#appendHostDiagnostic(\"extension_settings_upserted\", {\n extensionId: request.extensionId,\n enabled: request.enabled,\n });\n await this.refreshImExtensions();\n return this.#extensionSettings(request.extensionId);\n }\n\n async #fetchProviderModels(projectId: ProjectId | undefined, providerId: string): Promise<ProviderCatalogModelSummary[]> {\n const config = projectId\n ? await loadScorelConfigProfile({\n cwd: (await this.#registry.require(projectId)).workDir,\n scorelHomeDir: this.#scorelHomeDir,\n includeSecrets: true,\n })\n : await this.#loadUserConfigProfile({ includeSecrets: true });\n if (!config) {\n throw new Error(\"Model profile config is not configured\");\n }\n const provider = config.providers[providerId];\n if (!provider) {\n throw new Error(`Provider is not configured: ${providerId}`);\n }\n if (provider.type !== \"custom\" || (provider.api !== \"openai-completions\" && provider.api !== \"openai-responses\")) {\n throw new Error(\"Provider catalog fetch currently supports custom OpenAI-compatible providers only\");\n }\n if (!provider.baseUrl) {\n throw new Error(`providers.${providerId}.baseUrl is required`);\n }\n const apiKeyEnv = \"apiKeyEnv\" in provider ? provider.apiKeyEnv : undefined;\n const apiKey = provider.apiKey || (apiKeyEnv ? process.env[apiKeyEnv] : undefined);\n if (!apiKey) {\n throw new Error(apiKeyEnv ? `${apiKeyEnv} is not set` : \"Provider API key is not configured\");\n }\n const endpoint = `${provider.baseUrl.replace(/\\/+$/, \"\")}/models`;\n const response = await fetch(endpoint, {\n headers: {\n authorization: `Bearer ${apiKey}`,\n },\n });\n if (!response.ok) {\n throw new Error(`Provider /models request failed: ${response.status} ${response.statusText}`);\n }\n const payload = await response.json() as {\n data?: Array<{ id?: unknown; name?: unknown }>;\n models?: Array<{ id?: unknown; name?: unknown }>;\n };\n const rawModels = Array.isArray(payload.data) ? payload.data : Array.isArray(payload.models) ? payload.models : [];\n return rawModels\n .map((model) => {\n const id = typeof model.id === \"string\" ? model.id : \"\";\n const name = typeof model.name === \"string\" ? model.name : id;\n return id ? { id, displayName: name || id } : undefined;\n })\n .filter((model): model is ProviderCatalogModelSummary => Boolean(model))\n .sort((left, right) => left.id.localeCompare(right.id));\n }\n\n async #selectedModelFromMeta(meta: CreateSessionMeta | SessionMeta, project: HostProject): Promise<SelectedModelSummary | undefined> {\n const config = await this.#configForProject(project.projectId);\n if (!config) {\n return \"selectedModel\" in meta ? meta.selectedModel : undefined;\n }\n const persistedSelection = \"selectedModel\" in meta ? meta.selectedModel : undefined;\n const requestedSelection = \"modelSelection\" in meta ? meta.modelSelection : undefined;\n const selectionInput = persistedSelection\n ? config.models[persistedSelection.modelId]\n ? { modelId: persistedSelection.modelId, role: persistedSelection.role }\n : persistedSelection.role\n ? { role: persistedSelection.role }\n : undefined\n : requestedSelection;\n const selection = resolveModelSelection(\n config,\n selectionInput,\n );\n const model = resolvePiAiModel(selection.config);\n return {\n modelId: selection.modelId,\n role: selection.role,\n providerId: selection.providerId,\n provider: model.provider,\n id: model.id,\n displayName: selection.displayName,\n contextWindow: model.contextWindow,\n maxTokens: model.maxTokens,\n reasoning: model.reasoning,\n supportsImageInput: model.input.includes(\"image\"),\n };\n }\n\n async #configForProject(projectId?: ProjectId): Promise<ScorelConfig | undefined> {\n if (this.#loadConfig) {\n if (!projectId) {\n return this.#modelProfile;\n }\n const project = await this.#registry.require(projectId);\n return this.#loadConfig({ project });\n }\n return this.#modelProfile;\n }\n\n async #configProfileForProject(projectId?: ProjectId): Promise<ScorelConfigProfile | ScorelConfig | undefined> {\n if (this.#loadConfigProfile) {\n if (!projectId) {\n return this.#modelProfile;\n }\n const project = await this.#registry.require(projectId);\n return this.#loadConfigProfile({ project });\n }\n if (this.#loadConfig) {\n if (!projectId) {\n return this.#modelProfile;\n }\n const project = await this.#registry.require(projectId);\n try {\n return await loadScorelConfigProfile({ cwd: project.workDir, scorelHomeDir: this.#scorelHomeDir });\n } catch (cause) {\n if (!isMissingConfigError(cause)) {\n throw cause;\n }\n }\n }\n return this.#modelProfile;\n }\n\n #respond<TRequest extends ClientRequest>(\n connection: Connection,\n request: TRequest,\n data: unknown,\n ): void {\n connection.emit({\n type: \"response\",\n requestType: request.type,\n requestId: request.requestId,\n ok: true,\n data,\n } as DaemonMessage);\n }\n\n #assertStarted(): void {\n if (!this.#started) {\n throw new Error(\"ScorelHost is not started\");\n }\n }\n\n async #appendDiagnostic(sessionId: SessionId, event: string, fields: Record<string, unknown> = {}): Promise<void> {\n const line = formatDiagnosticLine({\n ts: this.#now(),\n level: event.endsWith(\"_error\") || event.endsWith(\"_failed\") ? \"error\" : \"info\",\n event,\n sessionId,\n ...fields,\n });\n await mkdir(this.#sessionsDir, { recursive: true });\n await appendFile(sessionLogFilePath(this.#sessionsDir, sessionId), `${line}\\n`, \"utf8\");\n }\n\n async #appendHostDiagnostic(event: string, fields: Record<string, unknown> = {}): Promise<void> {\n const line = formatDiagnosticLine({ ts: this.#now(), level: \"info\", event, ...fields });\n await mkdir(this.#sessionsDir, { recursive: true });\n await appendFile(join(this.#sessionsDir, \"host.log\"), `${line}\\n`, \"utf8\");\n }\n\n #runtimeStatsPath(): string {\n return join(this.#scorelHomeDir, \"runtime-stats.json\");\n }\n\n async #recordRtkSavings(input: { projectId: ProjectId; sessionId: SessionId; savings: RtkSavingsDelta }): Promise<void> {\n const updateTask = this.#runtimeStatsQueue.then(async () => {\n const path = this.#runtimeStatsPath();\n const stats = await readRuntimeStats(path);\n addRtkSavings(stats, String(input.projectId), String(input.sessionId), input.savings);\n await writeRuntimeStats(path, stats);\n });\n this.#runtimeStatsQueue = updateTask.catch(() => {});\n await updateTask;\n }\n\n async #resolveProject(sessionId: SessionId, projectId: ProjectId): Promise<HostProject> {\n const project = await this.#registry.require(projectId);\n await this.#appendDiagnostic(sessionId, \"project_resolved\", {\n projectId: project.projectId,\n workDir: project.workDir,\n });\n return project;\n }\n}\n\nconst isMissingConfigError = (cause: unknown): boolean =>\n cause instanceof Error && cause.message.startsWith(\"Scorel config not found:\");\n\nexport const createEmbeddedTransport = (host: ScorelHost): DaemonTransport => {\n const handlers = new Set<(message: DaemonMessage) => void>();\n const connection: Connection = {\n clientId: asClientId(\"embedded_unconnected\"),\n emit: (message) => {\n for (const handler of handlers) {\n handler(message);\n }\n },\n };\n\n return {\n async connect(params) {\n connection.clientId = params.clientId;\n const result = host.connect(connection, params.sessionId);\n connection.emit({\n type: \"connected\",\n clientId: params.clientId,\n sessionId: result.sessionId,\n currentSeq: result.currentSeq,\n deviceId: result.deviceId,\n deviceDisplayName: result.deviceDisplayName,\n });\n return {\n clientId: params.clientId,\n sessionId: result.sessionId,\n currentSeq: result.currentSeq,\n deviceId: result.deviceId,\n deviceDisplayName: result.deviceDisplayName,\n };\n },\n send(message) {\n return host.handleMessage(connection, message);\n },\n onMessage(handler) {\n handlers.add(handler);\n return () => {\n handlers.delete(handler);\n };\n },\n close() {\n host.disconnect(connection);\n handlers.clear();\n },\n };\n};\n\nconst isNodeErrorCode = (cause: unknown, code: string): boolean =>\n cause instanceof Error && \"code\" in cause && cause.code === code;\n\nconst wireErrorCode = (cause: unknown): \"project_not_found\" | \"project_has_sessions\" | \"filesystem_error\" | \"conflict\" | \"internal_error\" => {\n if (!(cause instanceof ProjectRegistryError)) {\n return \"internal_error\";\n }\n return cause.code;\n};\n\nconst hasContinuousCoverage = (events: ScorelEvent[], expectedFirstSeq: number): boolean => {\n if (events.length === 0) {\n return false;\n }\n let expected = expectedFirstSeq;\n for (const event of events) {\n if (Number(event.seq) !== expected) {\n return false;\n }\n expected += 1;\n }\n return true;\n};\n\nconst countContentBlocks = (message: ScorelMessage, type: string): number =>\n message.content.filter((block) => block.type === type).length;\n\nconst normalizeContent = (content: string | ScorelMessage[\"content\"]): ScorelMessage[\"content\"] =>\n typeof content === \"string\" ? [{ type: \"text\", text: content }] : content;\n\nconst snipUserMessageIdBlock = (userEventId: EventId): ScorelMessage[\"content\"][number] => ({\n ...createSystemReminderBlock({\n kind: \"message_ref\",\n origin: \"system\",\n text: `snip.userMessageId: ${snipUserMessageAlias(userEventId)}`,\n visibility: \"model\",\n scope: \"message\",\n data: { userMessageId: snipUserMessageAlias(userEventId) },\n }),\n});\n\nconst inputText = (message: ScorelMessage): string =>\n message.content\n .flatMap((block) => block.type === \"text\" && block.visibility !== \"model\" ? [block.text] : [])\n .join(\"\\n\")\n .trim();\n\nconst assistantText = (message: ScorelMessage): string =>\n message.content\n .filter((block) => block.type === \"text\")\n .map((block) => block.text)\n .join(\"\\n\")\n .trim();\n\nconst messageText = (message: ScorelMessage): string => {\n const text = message.content\n .map((block) => {\n if (block.type === \"text\") {\n return block.text;\n }\n if (block.type === \"thinking\") {\n return `[thinking] ${block.text}`;\n }\n if (block.type === \"tool_call\") {\n return `[tool_call:${block.toolName}] ${JSON.stringify(block.args)}`;\n }\n if (block.type === \"tool_result\") {\n return `[tool_result:${block.toolName}] ${JSON.stringify(block.result)}`;\n }\n if (block.type === \"system_reminder\") {\n return `[system_reminder:${block.kind}] ${block.text}`;\n }\n return \"\";\n })\n .filter(Boolean)\n .join(\"\\n\")\n .trim();\n return text || \"(empty)\";\n};\n\nconst estimateScorelMessagesTokens = (messages: ScorelMessage[]): number =>\n estimateTextTokens(messages.map(messageText).join(\"\\n\"));\n\nconst estimateTextTokens = (value: string): number => Math.ceil(value.length / 3);\n\nconst compactLine = (value: string, maxChars: number): string =>\n value.replace(/\\s+/g, \" \").trim().slice(0, maxChars);\n\nconst parseSessionMemoryJson = (\n raw: string,\n): { summary?: string; recentMessages?: string[]; decisions?: string[]; followUps?: string[] } | undefined => {\n const text = raw.trim().replace(/^```(?:json)?\\s*/i, \"\").replace(/\\s*```$/i, \"\");\n if (!text) {\n return undefined;\n }\n const parsed = JSON.parse(text) as unknown;\n if (!isRecord(parsed)) {\n return undefined;\n }\n return {\n summary: typeof parsed.summary === \"string\" ? parsed.summary : undefined,\n recentMessages: stringArray(parsed.recentMessages),\n decisions: stringArray(parsed.decisions),\n followUps: stringArray(parsed.followUps),\n };\n};\n\nconst stringArray = (value: unknown): string[] | undefined =>\n Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : undefined;\n\nconst disabledMemorySettings = (): MemorySettings => ({\n enabled: false,\n daily: false,\n sessionMemory: false,\n autoDream: false,\n promoteRoot: false,\n dreamIdleMinutes: 60,\n autoCompactThreshold: 0.8,\n});\n\nconst detectRtk = async (): Promise<{ available: boolean; executable?: string; version?: string }> => {\n try {\n const shell = resolveDefaultShell();\n const path = (await execFileAsync(shell, shellCommandArgs(shell, \"command -v rtk\"), { timeout: 5_000 })).stdout.trim();\n if (!path) {\n return { available: false };\n }\n const version = await execFileAsync(path, [\"--version\"], { timeout: 5_000 })\n .then((result) => result.stdout.trim() || result.stderr.trim())\n .catch(() => undefined);\n return {\n available: true,\n executable: path,\n ...(version ? { version } : {}),\n };\n } catch {\n return { available: false };\n }\n};\n\nconst ensureRtkAvailable = async (): Promise<{ status: \"idle\" | \"installed\" | \"failed\"; message?: string }> => {\n const existing = await detectRtk();\n if (existing.available) {\n return { status: \"installed\", message: existing.version ?? existing.executable };\n }\n const shell = resolveDefaultShell();\n const brew = await execFileAsync(shell, shellCommandArgs(shell, \"command -v brew\"), { timeout: 5_000 })\n .then((result) => result.stdout.trim())\n .catch(() => \"\");\n if (!brew) {\n return { status: \"failed\", message: \"Homebrew is not available; install RTK manually with `brew install rtk`.\" };\n }\n try {\n await execFileAsync(brew, [\"install\", \"rtk\"], { timeout: 120_000, maxBuffer: 20_000_000 });\n const installed = await detectRtk();\n return installed.available\n ? { status: \"installed\", message: installed.version ?? installed.executable }\n : { status: \"failed\", message: \"RTK install finished but `rtk` is still not on PATH.\" };\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n return { status: \"failed\", message };\n }\n};\n\ntype RtkSavingsDelta = {\n outputTokens: number;\n savedTokens: number;\n};\n\ntype RuntimeStatsBucket = RtkSavingsDelta;\n\ntype RuntimeStats = {\n version: 1;\n rtk: RuntimeStatsBucket & {\n byProject: Record<string, RuntimeStatsBucket>;\n bySession: Record<string, RuntimeStatsBucket>;\n };\n};\n\nconst emptyRuntimeStats = (): RuntimeStats => ({\n version: 1,\n rtk: {\n outputTokens: 0,\n savedTokens: 0,\n byProject: {},\n bySession: {},\n },\n});\n\nconst readRuntimeStats = async (path: string): Promise<RuntimeStats> => {\n try {\n return parseRuntimeStats(JSON.parse(await readFile(path, \"utf8\")));\n } catch (cause) {\n if (isNodeErrorCode(cause, \"ENOENT\")) {\n return emptyRuntimeStats();\n }\n return emptyRuntimeStats();\n }\n};\n\nconst writeRuntimeStats = async (path: string, stats: RuntimeStats): Promise<void> => {\n await mkdir(dirname(path), { recursive: true });\n const tempPath = join(dirname(path), `.runtime-stats-${process.pid}-${Date.now()}.tmp`);\n try {\n await writeFile(tempPath, `${JSON.stringify(stats, null, 2)}\\n`, \"utf8\");\n await rename(tempPath, path);\n } catch (cause) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw cause;\n }\n};\n\nconst parseRuntimeStats = (value: unknown): RuntimeStats => {\n if (!isRecord(value) || !isRecord(value.rtk)) {\n return emptyRuntimeStats();\n }\n return {\n version: 1,\n rtk: {\n outputTokens: nonNegativeInteger(value.rtk.outputTokens),\n savedTokens: nonNegativeInteger(value.rtk.savedTokens),\n byProject: parseRuntimeStatsBuckets(value.rtk.byProject),\n bySession: parseRuntimeStatsBuckets(value.rtk.bySession),\n },\n };\n};\n\nconst parseRuntimeStatsBuckets = (value: unknown): Record<string, RuntimeStatsBucket> => {\n if (!isRecord(value)) {\n return {};\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, bucket]) => [\n key,\n isRecord(bucket)\n ? {\n outputTokens: nonNegativeInteger(bucket.outputTokens),\n savedTokens: nonNegativeInteger(bucket.savedTokens),\n }\n : { outputTokens: 0, savedTokens: 0 },\n ]),\n );\n};\n\nconst addRtkSavings = (stats: RuntimeStats, projectId: string, sessionId: string, savings: RtkSavingsDelta): void => {\n addRuntimeStatsBucket(stats.rtk, savings);\n stats.rtk.byProject[projectId] = addRuntimeStatsBucket(stats.rtk.byProject[projectId] ?? { outputTokens: 0, savedTokens: 0 }, savings);\n stats.rtk.bySession[sessionId] = addRuntimeStatsBucket(stats.rtk.bySession[sessionId] ?? { outputTokens: 0, savedTokens: 0 }, savings);\n};\n\nconst addRuntimeStatsBucket = <T extends RuntimeStatsBucket>(bucket: T, savings: RtkSavingsDelta): T => {\n bucket.outputTokens += savings.outputTokens;\n bucket.savedTokens += savings.savedTokens;\n return bucket;\n};\n\nconst rtkSavingsFromToolResult = (result: unknown): RtkSavingsDelta | undefined => {\n if (!isRecord(result) || !isRecord(result.details)) {\n return undefined;\n }\n const rtk = result.details.rtk;\n if (!isRecord(rtk) || rtk.applied !== true) {\n return undefined;\n }\n const outputTokens = nonNegativeInteger(rtk.estimatedOutputTokens);\n const savedTokens = nonNegativeInteger(rtk.estimatedSavedTokens);\n return outputTokens > 0 || savedTokens > 0 ? { outputTokens, savedTokens } : undefined;\n};\n\nconst nonNegativeInteger = (value: unknown): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return 0;\n }\n return Math.floor(value);\n};\n\nconst resolveDefaultShell = (): string => {\n const shell = process.env.SHELL || userShell() || \"/bin/sh\";\n return shell.trim() || \"/bin/sh\";\n};\n\nconst shellCommandArgs = (shell: string, command: string): string[] => {\n const name = basename(shell).toLowerCase();\n if (name === \"csh\" || name === \"tcsh\" || name === \"fish\") {\n return [\"-c\", command];\n }\n return [\"-lc\", command];\n};\n\nconst userShell = (): string | undefined => {\n try {\n return userInfo().shell ?? undefined;\n } catch {\n return undefined;\n }\n};\n\nconst runtimeChannelContextFromWire = (context: ChannelContext): RuntimeChannelContext => ({\n extensionId: context.channel,\n channel: context.channel,\n externalConversationId: context.externalConversationId,\n target: {\n externalConversationId: context.externalConversationId,\n data: context.data,\n },\n ...(context.conversationType ? { conversationType: context.conversationType } : {}),\n ...(context.senderDisplayName ? { senderDisplayName: context.senderDisplayName } : {}),\n ...(context.mentionedBot !== undefined ? { mentionedBot: context.mentionedBot } : {}),\n ...(context.data ? { data: context.data } : {}),\n});\n\nconst parseQueuedChannelContext = (value: unknown): RuntimeChannelContext | undefined => {\n if (!isRecord(value)) {\n return undefined;\n }\n if (typeof value.channel !== \"string\" || typeof value.externalConversationId !== \"string\") {\n return undefined;\n }\n return runtimeChannelContextFromWire({\n channel: value.channel,\n externalConversationId: value.externalConversationId,\n ...(typeof value.conversationType === \"string\" ? { conversationType: value.conversationType } : {}),\n ...(typeof value.senderDisplayName === \"string\" ? { senderDisplayName: value.senderDisplayName } : {}),\n ...(typeof value.mentionedBot === \"boolean\" ? { mentionedBot: value.mentionedBot } : {}),\n ...(isRecord(value.data) ? { data: value.data } : {}),\n });\n};\n\nconst parseQueuedModelSelection = (value: unknown): ModelSelectionInput | undefined => {\n if (!isRecord(value)) {\n return undefined;\n }\n const selection: ModelSelectionInput = {};\n if (typeof value.modelId === \"string\") {\n selection.modelId = value.modelId;\n }\n if (value.role === \"primary\" || value.role === \"standard\" || value.role === \"auxiliary\") {\n selection.role = value.role;\n }\n return selection.modelId || selection.role ? selection : undefined;\n};\n\nconst imBindingKey = (extensionId: string, externalConversationId: string): string =>\n `${extensionId}:${externalConversationId}`;\n\nconst defaultBuiltinExtensionsDir = (): string =>\n findBuiltinExtensionsDir([\n runtimeModuleDir(),\n process.cwd(),\n ]);\n\nconst runtimeModuleDir = (): string => {\n if (typeof __dirname === \"string\") {\n return __dirname;\n }\n return process.argv[1] ? dirname(process.argv[1]) : process.cwd();\n};\n\nconst findBuiltinExtensionsDir = (starts: string[]): string => {\n for (const start of starts) {\n let current = resolve(start);\n while (true) {\n const candidate = join(current, \"extensions\", \"builtin\");\n if (existsSync(candidate)) {\n return candidate;\n }\n const next = dirname(current);\n if (next === current) {\n break;\n }\n current = next;\n }\n }\n return join(starts[0] ?? process.cwd(), \"extensions\", \"builtin\");\n};\n\nconst isSteerMessage = (text: string): boolean =>\n /^\\/(?:steer|interrupt)\\b/i.test(text.trim());\n\nconst stripImCommandPrefix = (text: string): string =>\n text.trim().replace(/^\\/(?:steer|interrupt)\\s*/i, \"\").trim() || text;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst parseMemoryUpdate = (raw: string): { projectMemory?: string; rootMemory?: string } | undefined => {\n const text = raw.trim().replace(/^```(?:json)?\\s*/i, \"\").replace(/\\s*```$/, \"\").trim();\n if (!text) {\n return undefined;\n }\n const parsed = JSON.parse(text) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return undefined;\n }\n const record = parsed as Record<string, unknown>;\n return {\n ...(typeof record.projectMemory === \"string\" && record.projectMemory.trim() ? { projectMemory: record.projectMemory.trim() } : {}),\n ...(typeof record.rootMemory === \"string\" && record.rootMemory.trim() ? { rootMemory: record.rootMemory.trim() } : {}),\n };\n};\n\nconst normalizeMarkdownFile = (value: string): string => `${value.trimEnd()}\\n`;\n\nconst sanitizeSessionTitle = (value: string): string => {\n const title = value\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find(Boolean)\n ?.replace(/^[\"'`\u201C\u201D\u2018\u2019]+|[\"'`\u201C\u201D\u2018\u2019]+$/g, \"\")\n .replace(/[.!?\u3002\uFF01\uFF1F]+$/g, \"\")\n .trim();\n if (!title) {\n return \"\";\n }\n return title.slice(0, 80);\n};\n\nconst shortStack = (error: Error): string | undefined => error.stack?.split(\"\\n\").slice(0, 3).join(\" | \");\n\nconst formatDiagnosticLine = (fields: Record<string, unknown>): string =>\n Object.entries(fields)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${key}=${formatDiagnosticValue(value)}`)\n .join(\" \");\n\nconst formatDiagnosticValue = (value: unknown): string => {\n const text = typeof value === \"string\" ? value : String(value);\n return /^[A-Za-z0-9_./:@+-]+$/.test(text) ? text : JSON.stringify(text);\n};\n", "import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { loadOrCreateHostDeviceIdentity, redeemRelayPair } from \"@scorel/daemon\";\n\nexport const DEFAULT_SCOREL_RELAY_URL = \"wss://scorel-relay.chanler.dev\";\nexport const DEFAULT_SCOREL_WEBUI_URL = \"https://scorel.chanler.dev\";\n\nexport type PairCommandOptions = {\n stateDir?: string;\n output: NodeJS.WritableStream;\n error: NodeJS.WritableStream;\n env?: NodeJS.ProcessEnv;\n};\n\nconst defaultStateDir = (): string => join(homedir(), \".scorel\");\n\nexport const runCliPair = async (\n argv: string[],\n options: PairCommandOptions,\n): Promise<number> => {\n let flags: { pairCode: string; relayUrl: string };\n try {\n flags = parsePairFlags(argv, options.env ?? process.env);\n } catch (cause) {\n options.error.write(`scorel pair error: ${(cause as Error).message}\\n`);\n writePairUsage(options.error);\n return 1;\n }\n const stateDir = options.stateDir ?? defaultStateDir();\n const identity = await loadOrCreateHostDeviceIdentity({ stateDir });\n try {\n const result = await redeemRelayPair({\n relayUrl: flags.relayUrl,\n pairCode: flags.pairCode,\n deviceId: identity.deviceId,\n label: identity.displayName,\n stateDir,\n });\n options.output.write(`scorel pair authorized client=${result.clientId} device=${identity.deviceId}\\n`);\n return 0;\n } catch (cause) {\n options.error.write(`scorel pair error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n }\n};\n\nexport const resolveDefaultRelayUrl = (env: NodeJS.ProcessEnv = process.env): string =>\n env.SCOREL_RELAY_URL?.trim() || DEFAULT_SCOREL_RELAY_URL;\n\nconst parsePairFlags = (argv: string[], env: NodeJS.ProcessEnv): { pairCode: string; relayUrl: string } => {\n const pairCode = argv[0];\n if (!pairCode || pairCode.startsWith(\"-\")) {\n throw new Error(\"pair code is required\");\n }\n let relayUrl = resolveDefaultRelayUrl(env);\n for (let index = 1; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--relay\") {\n relayUrl = requireValue(argv, index, \"--relay\");\n index += 1;\n continue;\n }\n throw new Error(`Unknown pair option: ${arg}`);\n }\n return { pairCode, relayUrl };\n};\n\nconst requireValue = (argv: string[], index: number, flag: string): string => {\n const value = argv[index + 1];\n if (!value) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n};\n\nconst writePairUsage = (output: NodeJS.WritableStream): void => {\n output.write(\"Usage: scorel pair <pair-code> [--relay <relay-url>]\\n\");\n};\n", "import { execFile as execFileCallback } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { promisify } from \"node:util\";\n\nexport const SCOREL_PACKAGE_NAME = \"@chanlerdev/scorel\";\nexport const AUTO_UPDATE_INTERVAL_MS = 60 * 60 * 1000;\nexport const ACTIVE_WORK_STALE_MS = 3 * 60 * 60 * 1000;\n\nconst execFileAsync = promisify(execFileCallback);\n\nexport type ExecFile = (command: string, argv: string[]) => Promise<{ stdout: string; stderr: string }>;\n\nexport type PackageUpdateResult =\n | { status: \"current\"; currentVersion: string; latestVersion: string }\n | { status: \"updated\"; currentVersion: string; latestVersion: string };\n\nexport type PackageUpdater = {\n checkLatest(): Promise<string>;\n update(): Promise<PackageUpdateResult>;\n};\n\nexport type AutoUpdateActivity = {\n activeWork: boolean;\n lastActiveWorkAt: number;\n now: number;\n};\n\nexport const compareSemver = (a: string, b: string): number => {\n const left = parseSemver(a);\n const right = parseSemver(b);\n for (let index = 0; index < 3; index += 1) {\n const delta = left[index] - right[index];\n if (delta !== 0) return delta;\n }\n return 0;\n};\n\nexport const shouldRunAutoUpdate = (activity: AutoUpdateActivity): boolean =>\n !activity.activeWork || activity.now - activity.lastActiveWorkAt >= ACTIVE_WORK_STALE_MS;\n\nexport const createNpmPackageUpdater = (options: {\n packageName?: string;\n currentVersion: string;\n execFile?: ExecFile;\n}): PackageUpdater => {\n const packageName = options.packageName ?? SCOREL_PACKAGE_NAME;\n const execFile = options.execFile ?? ((command, argv) => execFileAsync(command, argv));\n return {\n async checkLatest() {\n const result = await execFile(\"npm\", [\"view\", packageName, \"version\"]);\n const latest = result.stdout.trim();\n if (!latest) {\n throw new Error(`npm did not return a latest version for ${packageName}`);\n }\n parseSemver(latest);\n return latest;\n },\n async update() {\n const latestVersion = await this.checkLatest();\n if (compareSemver(options.currentVersion, latestVersion) >= 0) {\n return { status: \"current\", currentVersion: options.currentVersion, latestVersion };\n }\n await execFile(\"npm\", [\"install\", \"-g\", `${packageName}@${latestVersion}`]);\n return { status: \"updated\", currentVersion: options.currentVersion, latestVersion };\n },\n };\n};\n\nexport const readInstalledScorelVersion = async (): Promise<string> => {\n const here = dirname(fileURLToPath(import.meta.url));\n for (const candidate of [\n join(here, \"..\", \"package.json\"),\n join(here, \"..\", \"..\", \"package.json\"),\n join(process.cwd(), \"package.json\"),\n ]) {\n try {\n const parsed = JSON.parse(await readFile(candidate, \"utf8\")) as { name?: string; version?: string };\n if (typeof parsed.version === \"string\" && (parsed.name === SCOREL_PACKAGE_NAME || parsed.name === \"@scorel/app-cli\")) {\n return parsed.version;\n }\n } catch {\n // Try the next likely package root.\n }\n }\n return \"0.0.0\";\n};\n\nexport const runCliUpdate = async (\n argv: string[],\n io: { output: NodeJS.WritableStream; error: NodeJS.WritableStream },\n options: { currentVersion?: string; updater?: PackageUpdater } = {},\n): Promise<number> => {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n writeUpdateUsage(io.output);\n return 0;\n }\n if (argv.length > 0) {\n writeUpdateUsage(io.error);\n return 1;\n }\n const currentVersion = options.currentVersion ?? await readInstalledScorelVersion();\n const updater = options.updater ?? createNpmPackageUpdater({ currentVersion });\n try {\n const result = await updater.update();\n if (result.status === \"current\") {\n io.output.write(`scorel is current (${result.currentVersion})\\n`);\n } else {\n io.output.write(`updated scorel ${result.currentVersion} -> ${result.latestVersion}\\n`);\n }\n return 0;\n } catch (cause) {\n io.error.write(`scorel update error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n }\n};\n\nexport const writeUpdateUsage = (output: NodeJS.WritableStream): void => {\n output.write(\"Usage: scorel update\\n scorel upgrade\\n\");\n};\n\nconst parseSemver = (version: string): [number, number, number] => {\n const match = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+].*)?$/.exec(version);\n if (!match) {\n throw new Error(`Invalid semver version: ${version}`);\n }\n return [Number(match[1]), Number(match[2]), Number(match[3])];\n};\n", "import { randomUUID } from \"node:crypto\";\nimport { spawn, type ChildProcess, type SpawnOptions } from \"node:child_process\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n ScorelHost,\n createLocalDaemonState,\n createRealRuntime,\n daemonStateLiveness,\n loadOrCreateHostDeviceIdentity,\n loadScorelConfig,\n loadScorelConfigProfile,\n markDaemonStopped,\n readLocalDaemonState,\n removeLocalDaemonState,\n scorelSessionsDir,\n startHostRelayClient,\n startScorelHostWebSocketServer,\n type DaemonStateLiveness,\n type HostRelayClient,\n type LocalDaemonState,\n} from \"@scorel/daemon\";\n\nimport { DEFAULT_SCOREL_WEBUI_URL, resolveDefaultRelayUrl } from \"./relay-cli.js\";\nimport {\n AUTO_UPDATE_INTERVAL_MS,\n createNpmPackageUpdater,\n readInstalledScorelVersion,\n shouldRunAutoUpdate,\n type PackageUpdater,\n} from \"./update-cli.js\";\n\nexport type DaemonCommandIo = {\n output: NodeJS.WritableStream;\n error: NodeJS.WritableStream;\n};\n\nexport type DaemonCommandOptions = DaemonCommandIo & {\n stateDir?: string;\n sessionsDir?: string;\n cwd?: string;\n /**\n * Optional override for `serve` shutdown so tests don't have to wire up\n * real OS signals. When set, the embedded daemon stops as soon as the\n * signal aborts.\n */\n serveSignal?: AbortSignal;\n env?: NodeJS.ProcessEnv;\n spawn?: (command: string, argv: string[], opts: SpawnOptions) => ChildProcess;\n cliEntrypoint?: string;\n daemonReadyTimeoutMs?: number;\n readState?: (stateDir: string) => Promise<LocalDaemonState | null>;\n packageUpdater?: PackageUpdater;\n autoUpdateIntervalMs?: number;\n};\n\nconst DEFAULT_HOST = \"127.0.0.1\";\nconst DEFAULT_PORT = 7777;\nconst STOP_POLL_INTERVAL_MS = 200;\nconst STOP_GRACE_MS = 5000;\nconst START_READY_TIMEOUT_MS = 30_000;\nexport const AUTO_STARTED_IDLE_SHUTDOWN_MS = 15 * 60 * 1000;\nconst FOREGROUND_IDLE_SHUTDOWN_MS = 0;\n\nconst defaultStateDir = (): string => join(homedir(), \".scorel\");\n\nconst isLoopbackHost = (host: string): boolean =>\n host === \"127.0.0.1\" || host === \"::1\" || host === \"localhost\";\n\nconst formatTimestamp = (epochMs: number): string => new Date(epochMs).toISOString();\n\nexport const runCliDaemon = async (\n argv: string[],\n options: DaemonCommandOptions,\n): Promise<number> => {\n const [command, ...rest] = argv;\n const stateDir = options.stateDir ?? defaultStateDir();\n switch (command) {\n case \"start\":\n return runStartCommand(rest, { ...options, stateDir });\n case \"serve\":\n return runServeCommand(rest, { ...options, stateDir });\n case \"status\":\n return runStatusCommand(rest, { ...options, stateDir });\n case \"stop\":\n return runStopCommand(rest, { ...options, stateDir });\n case \"reset\":\n return runResetCommand({ ...options, stateDir });\n case \"--help\":\n case \"-h\":\n writeDaemonUsage(options.output);\n return 0;\n default:\n writeDaemonUsage(options.error);\n return 1;\n }\n};\n\nconst runStartCommand = async (\n argv: string[],\n options: DaemonCommandOptions & { stateDir: string },\n): Promise<number> => {\n let flags: ServeFlags;\n try {\n flags = parseServeFlags(argv, options.cwd ?? process.cwd(), options.env ?? process.env, FOREGROUND_IDLE_SHUTDOWN_MS);\n } catch (cause) {\n options.error.write(`scorel daemon start error: ${(cause as Error).message}\\n`);\n return 1;\n }\n\n const readState = options.readState ?? ((stateDir: string) => readLocalDaemonState({ stateDir }));\n const existing = await readState(options.stateDir);\n if (existing && daemonStateLiveness(existing) === \"running\") {\n options.output.write(`scorel host already running url=${existing.wsUrl} pid=${existing.pid}\\n`);\n return 0;\n }\n\n const cliEntrypoint = options.cliEntrypoint ?? fileURLToPath(import.meta.url).replace(/daemon-cli\\.ts$/, \"index.ts\");\n const child = (options.spawn ?? spawn)(process.execPath, [\n ...nodeEntrypointArgs(cliEntrypoint),\n \"host\",\n \"serve\",\n \"--host\",\n flags.host,\n \"--port\",\n String(flags.port),\n \"--cwd\",\n flags.cwd,\n \"--idle-timeout-ms\",\n String(flags.idleShutdownMs),\n ...(flags.token ? [\"--token\", flags.token] : []),\n ...(flags.relayUrl ? [\"--relay\", flags.relayUrl] : [\"--no-relay\"]),\n ...(flags.replace ? [\"--replace\"] : []),\n ], {\n cwd: dirname(cliEntrypoint),\n env: { ...process.env, ...(options.env ?? {}) },\n detached: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n try {\n await waitForDaemonReady(child, options.daemonReadyTimeoutMs ?? START_READY_TIMEOUT_MS);\n } catch (cause) {\n options.error.write(`scorel daemon start error: ${(cause as Error).message}\\n`);\n child.kill(\"SIGTERM\");\n return 1;\n }\n\n const state = await readState(options.stateDir);\n if (!state || daemonStateLiveness(state) !== \"running\") {\n options.error.write(\"scorel daemon start error: daemon state missing after start\\n\");\n child.kill(\"SIGTERM\");\n return 1;\n }\n detachBackgroundDaemon(child);\n options.output.write(`scorel host started url=${state.wsUrl} pid=${state.pid}\\n`);\n return 0;\n};\n\ntype ServeFlags = {\n host: string;\n port: number;\n token?: string;\n cwd: string;\n relayUrl?: string;\n replace: boolean;\n idleShutdownMs: number;\n};\n\nconst runServeCommand = async (\n argv: string[],\n options: DaemonCommandOptions & { stateDir: string },\n): Promise<number> => {\n let flags: ServeFlags;\n try {\n flags = parseServeFlags(argv, options.cwd ?? process.cwd(), options.env ?? process.env, FOREGROUND_IDLE_SHUTDOWN_MS);\n } catch (cause) {\n options.error.write(`scorel daemon serve error: ${(cause as Error).message}\\n`);\n return 1;\n }\n\n const existing = await readLocalDaemonState({ stateDir: options.stateDir });\n if (existing) {\n const liveness = daemonStateLiveness(existing);\n if (liveness === \"running\") {\n if (flags.replace) {\n await stopRunningDaemon(existing, options);\n } else {\n options.error.write(\n `scorel host already running pid=${existing.pid} url=${existing.wsUrl}\\nUse --replace to stop it and start a new one.\\n`,\n );\n return 1;\n }\n }\n }\n\n const token = flags.token ?? existing?.token ?? randomUUID();\n const identity = await loadOrCreateHostDeviceIdentity({ stateDir: options.stateDir });\n const configScope = { scorelHomeDir: options.stateDir };\n let signalReason: string = \"natural\";\n let resolveStopWaiter: (() => void) | undefined;\n let stopRequested = false;\n const requestStop = (reason: string): void => {\n signalReason = reason;\n stopRequested = true;\n resolveStopWaiter?.();\n };\n const sessionsDir = options.sessionsDir ?? scorelSessionsDir(homedir());\n const daemon = new ScorelHost({\n sessionsDir,\n projectsPath: join(options.stateDir, \"projects.json\"),\n deviceId: identity.deviceId,\n deviceDisplayName: identity.displayName,\n idleShutdownMs: flags.idleShutdownMs,\n onIdleShutdown: () => requestStop(\"idle\"),\n scorelHomeDir: options.stateDir,\n loadConfig: async ({ project }) => loadScorelConfig({ cwd: project.workDir, ...configScope }),\n loadConfigProfile: async ({ project }) => loadScorelConfigProfile({ cwd: project.workDir, ...configScope }),\n createRuntime: async ({ sessionId, project, selectedModel, purpose }) => createRealRuntime({\n cwd: project.workDir,\n config: await loadScorelConfig({ cwd: project.workDir, ...configScope }),\n sessionsDir,\n sessionId,\n modelSelection: selectedModel ? { modelId: selectedModel.modelId, role: selectedModel.role } : undefined,\n includeTools: purpose === \"chat\",\n }),\n });\n await daemon.start();\n await daemon.registerProject(flags.cwd);\n const autoUpdater = await startAutoUpdateLoop({\n host: daemon,\n requestStop,\n output: options.output,\n error: options.error,\n updater: options.packageUpdater,\n intervalMs: options.autoUpdateIntervalMs ?? AUTO_UPDATE_INTERVAL_MS,\n });\n\n const server = await startScorelHostWebSocketServer({\n hostService: daemon,\n host: flags.host,\n port: flags.port,\n token,\n });\n\n const startedAt = Date.now();\n // Persist with the actual bound port (server.port reflects 0 \u2192 ephemeral\n // assignment) so `status` and clients always see the truth.\n const persistedState: LocalDaemonState = {\n host: flags.host,\n port: server.port,\n wsUrl: server.url,\n token,\n pid: process.pid,\n startedAt,\n stoppedAt: null,\n };\n await createLocalDaemonState({ stateDir: options.stateDir, ...persistedState });\n\n options.output.write(`scorel host serving url=${server.url}\\n`);\n options.output.write(`scorel host initial project cwd=${flags.cwd}\\n`);\n let relayClient: HostRelayClient | undefined;\n if (flags.relayUrl) {\n relayClient = await startHostRelayClient({\n relayUrl: flags.relayUrl,\n hostService: daemon,\n deviceId: identity.deviceId,\n deviceDisplayName: identity.displayName,\n stateDir: options.stateDir,\n onDiagnostic: (type) => {\n if (type === \"relay_host_connected\") {\n options.output.write(`scorel host relay connected url=${flags.relayUrl} device=${identity.deviceId}\\n`);\n options.output.write(`scorel hosted webui ${DEFAULT_SCOREL_WEBUI_URL}\\n`);\n }\n if (type === \"relay_host_reconnecting\") {\n options.output.write(`scorel host relay reconnecting url=${flags.relayUrl} device=${identity.deviceId}\\n`);\n }\n },\n });\n }\n\n const shutdown = async (): Promise<void> => {\n try {\n autoUpdater.stop();\n relayClient?.close();\n await server.close();\n } finally {\n await daemon.shutdown();\n await markDaemonStopped({ stateDir: options.stateDir, stoppedAt: Date.now() });\n }\n };\n\n const signalHandlers = new Map<NodeJS.Signals, () => void>();\n const stopWaiter = new Promise<void>((resolve) => {\n resolveStopWaiter = resolve;\n if (stopRequested) {\n resolve();\n return;\n }\n if (options.serveSignal) {\n if (options.serveSignal.aborted) {\n requestStop(\"abort\");\n return;\n }\n options.serveSignal.addEventListener(\n \"abort\",\n () => {\n requestStop(\"abort\");\n },\n { once: true },\n );\n return;\n }\n const installSignal = (signal: NodeJS.Signals) => {\n const handler = () => {\n requestStop(signal);\n };\n signalHandlers.set(signal, handler);\n process.once(signal, handler);\n };\n installSignal(\"SIGINT\");\n installSignal(\"SIGTERM\");\n });\n\n try {\n await stopWaiter;\n } finally {\n for (const [signal, handler] of signalHandlers) {\n process.off(signal, handler);\n }\n await shutdown();\n }\n\n options.output.write(`scorel host serve stopped reason=${signalReason}\\n`);\n return 0;\n};\n\nconst startAutoUpdateLoop = async (options: {\n host: ScorelHost;\n requestStop: (reason: string) => void;\n output: NodeJS.WritableStream;\n error: NodeJS.WritableStream;\n updater?: PackageUpdater;\n intervalMs: number;\n}): Promise<{ stop(): void }> => {\n const updater = options.updater ?? createNpmPackageUpdater({ currentVersion: await readInstalledScorelVersion() });\n let timer: ReturnType<typeof setInterval> | undefined;\n let running = false;\n const tick = async () => {\n if (running) return;\n running = true;\n try {\n const activity = options.host.activityStatus();\n if (!shouldRunAutoUpdate({ ...activity, now: Date.now() })) {\n return;\n }\n const result = await updater.update();\n if (result.status === \"updated\") {\n options.output.write(`scorel auto-updated ${result.currentVersion} -> ${result.latestVersion}; restarting host\\n`);\n options.requestStop(\"auto-update\");\n }\n } catch (cause) {\n options.error.write(`scorel auto-update error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n } finally {\n running = false;\n }\n };\n timer = setInterval(() => void tick(), options.intervalMs);\n timer.unref?.();\n return {\n stop() {\n if (timer) {\n clearInterval(timer);\n timer = undefined;\n }\n },\n };\n};\n\nconst stopRunningDaemon = async (\n state: LocalDaemonState,\n options: DaemonCommandOptions & { stateDir: string },\n): Promise<void> => {\n try {\n process.kill(state.pid, \"SIGTERM\");\n } catch {\n return;\n }\n const deadline = Date.now() + STOP_GRACE_MS;\n while (Date.now() < deadline) {\n await sleep(STOP_POLL_INTERVAL_MS);\n const refreshed = await readLocalDaemonState({ stateDir: options.stateDir });\n if (!refreshed || refreshed.stoppedAt !== null || daemonStateLiveness(refreshed) !== \"running\") {\n return;\n }\n }\n try {\n process.kill(state.pid, \"SIGKILL\");\n } catch {\n // The process may have exited after the grace timeout.\n }\n};\n\ntype StatusFlags = {\n showToken: boolean;\n};\n\nconst runStatusCommand = async (\n argv: string[],\n options: DaemonCommandOptions & { stateDir: string },\n): Promise<number> => {\n let flags: StatusFlags;\n try {\n flags = parseStatusFlags(argv);\n } catch (cause) {\n options.error.write(`scorel daemon status error: ${(cause as Error).message}\\n`);\n return 1;\n }\n const state = await readLocalDaemonState({ stateDir: options.stateDir });\n if (!state) {\n options.error.write(\"scorel daemon not configured\\n\");\n return 1;\n }\n const liveness = daemonStateLiveness(state);\n options.output.write(`${formatStatusLine(state, liveness, flags.showToken)}\\n`);\n return 0;\n};\n\nconst runStopCommand = async (\n _argv: string[],\n options: DaemonCommandOptions & { stateDir: string },\n): Promise<number> => {\n const state = await readLocalDaemonState({ stateDir: options.stateDir });\n if (!state) {\n options.error.write(\"scorel daemon not configured\\n\");\n return 1;\n }\n const liveness = daemonStateLiveness(state);\n if (liveness !== \"running\") {\n options.output.write(\n `scorel daemon already stopped pid=${state.pid} liveness=${liveness}\\n`,\n );\n return 0;\n }\n try {\n process.kill(state.pid, \"SIGTERM\");\n } catch (cause) {\n options.error.write(\n `scorel daemon stop error: ${cause instanceof Error ? cause.message : String(cause)}\\n`,\n );\n return 1;\n }\n // Wait for graceful shutdown to flip stoppedAt; force-kill after 5s.\n const deadline = Date.now() + STOP_GRACE_MS;\n while (Date.now() < deadline) {\n await sleep(STOP_POLL_INTERVAL_MS);\n const refreshed = await readLocalDaemonState({ stateDir: options.stateDir });\n if (!refreshed) {\n break;\n }\n if (refreshed.stoppedAt !== null) {\n options.output.write(`scorel daemon stopped pid=${refreshed.pid}\\n`);\n return 0;\n }\n const refreshedLiveness = daemonStateLiveness(refreshed);\n if (refreshedLiveness !== \"running\") {\n options.output.write(\n `scorel daemon stopped pid=${refreshed.pid} liveness=${refreshedLiveness}\\n`,\n );\n return 0;\n }\n }\n try {\n process.kill(state.pid, \"SIGKILL\");\n } catch {\n // Process may have exited between SIGTERM and the timeout.\n }\n options.output.write(`scorel daemon stopped pid=${state.pid} via=SIGKILL\\n`);\n return 0;\n};\n\nconst runResetCommand = async (\n options: DaemonCommandOptions & { stateDir: string },\n): Promise<number> => {\n await removeLocalDaemonState({ stateDir: options.stateDir });\n options.output.write(\"scorel daemon state reset; next serve will generate a new token\\n\");\n return 0;\n};\n\nconst formatStatusLine = (\n state: LocalDaemonState,\n liveness: DaemonStateLiveness,\n showToken: boolean,\n): string => {\n if (liveness === \"running\") {\n const tokenSuffix = isLoopbackHost(state.host) || showToken ? ` token=${state.token}` : \"\";\n return `running url=${state.wsUrl} pid=${state.pid}${tokenSuffix}`;\n }\n const stoppedAt =\n state.stoppedAt !== null ? formatTimestamp(state.stoppedAt) : \"unknown\";\n return `stopped url=${state.wsUrl} last-pid=${state.pid} stoppedAt=${stoppedAt} liveness=${liveness}`;\n};\n\nconst parseServeFlags = (argv: string[], defaultCwd: string, env: NodeJS.ProcessEnv, defaultIdleShutdownMs: number): ServeFlags => {\n let host = DEFAULT_HOST;\n let port = DEFAULT_PORT;\n let cwd = defaultCwd;\n let token: string | undefined;\n let relayUrl: string | undefined = resolveDefaultRelayUrl(env);\n let replace = false;\n let idleShutdownMs = defaultIdleShutdownMs;\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--host\") {\n host = requireValue(argv, index, \"--host\");\n index += 1;\n continue;\n }\n if (arg === \"--port\") {\n port = Number(requireValue(argv, index, \"--port\"));\n if (!Number.isInteger(port) || port < 0 || port > 65535) {\n throw new Error(\"--port must be an integer from 0 to 65535\");\n }\n index += 1;\n continue;\n }\n if (arg === \"--token\") {\n token = requireValue(argv, index, \"--token\");\n index += 1;\n continue;\n }\n if (arg === \"--cwd\") {\n cwd = requireValue(argv, index, \"--cwd\");\n index += 1;\n continue;\n }\n if (arg === \"--project\" || arg === \"--bootstrap-project\") {\n cwd = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n if (arg === \"--relay\") {\n relayUrl = requireValue(argv, index, \"--relay\");\n index += 1;\n continue;\n }\n if (arg === \"--no-relay\") {\n relayUrl = undefined;\n continue;\n }\n if (arg === \"--replace\") {\n replace = true;\n continue;\n }\n if (arg === \"--idle-timeout-ms\") {\n idleShutdownMs = Number(requireValue(argv, index, \"--idle-timeout-ms\"));\n if (!Number.isInteger(idleShutdownMs) || idleShutdownMs < 0) {\n throw new Error(\"--idle-timeout-ms must be a non-negative integer\");\n }\n index += 1;\n continue;\n }\n throw new Error(`Unknown serve option: ${arg}`);\n }\n return { host, port, token, cwd, relayUrl, replace, idleShutdownMs };\n};\n\nconst parseStatusFlags = (argv: string[]): StatusFlags => {\n let showToken = false;\n for (const arg of argv) {\n if (arg === \"--show-token\") {\n showToken = true;\n continue;\n }\n throw new Error(`Unknown status option: ${arg}`);\n }\n return { showToken };\n};\n\nconst requireValue = (argv: string[], index: number, flag: string): string => {\n const value = argv[index + 1];\n if (!value) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n};\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\nconst waitForDaemonReady = (child: ChildProcess, timeoutMs: number): Promise<void> =>\n new Promise((resolveReady, rejectReady) => {\n if (!child.stdout) {\n rejectReady(new Error(\"daemon child has no stdout stream\"));\n return;\n }\n let buffer = \"\";\n let stderrBuffer = \"\";\n let settled = false;\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n cleanup();\n rejectReady(new Error(\"timed out waiting for daemon ready line\"));\n }, timeoutMs);\n const onData = (chunk: Buffer | string) => {\n buffer += chunk.toString();\n if (!buffer.includes(\"\\n\")) return;\n if (buffer.includes(\"scorel daemon serving url=\") || buffer.includes(\"scorel host serving url=\")) {\n if (settled) return;\n settled = true;\n cleanup();\n resolveReady();\n }\n const newlineIndex = buffer.lastIndexOf(\"\\n\");\n buffer = newlineIndex >= 0 ? buffer.slice(newlineIndex + 1) : buffer;\n };\n const onStderr = (chunk: Buffer | string) => {\n stderrBuffer += chunk.toString();\n };\n const onExit = (code: number | null) => {\n if (settled) return;\n settled = true;\n cleanup();\n const trimmed = stderrBuffer.trim();\n const detail = trimmed ? `: ${trimmed}` : \"\";\n rejectReady(new Error(`daemon exited before ready code=${code}${detail}`));\n };\n const cleanup = () => {\n clearTimeout(timer);\n child.stdout?.off(\"data\", onData);\n child.stderr?.off(\"data\", onStderr);\n child.off(\"exit\", onExit);\n };\n child.stdout.on(\"data\", onData);\n child.stderr?.on(\"data\", onStderr);\n child.once(\"exit\", onExit);\n });\n\nconst detachBackgroundDaemon = (child: ChildProcess): void => {\n child.stdout?.destroy();\n child.stderr?.destroy();\n child.unref();\n};\n\nconst nodeEntrypointArgs = (entrypoint: string): string[] =>\n entrypoint.endsWith(\".ts\") ? [\"--import\", \"tsx\", entrypoint] : [entrypoint];\n\nconst writeDaemonUsage = (output: NodeJS.WritableStream): void => {\n output.write(\n [\n \"Usage: scorel host serve [--host <h>] [--port <p>] [--token <t>] [--project <dir>]\",\n \" [--relay <relay-url> | --no-relay] [--replace] [--idle-timeout-ms <ms>]\",\n \" scorel host start [--host <h>] [--port <p>] [--token <t>] [--project <dir>]\",\n \" [--relay <relay-url> | --no-relay] [--replace] [--idle-timeout-ms <ms>]\",\n \" scorel host status [--show-token]\",\n \" scorel host stop\",\n \" scorel host reset\",\n \" scorel daemon ... # pre-1.0 alias\",\n ].join(\"\\n\") + \"\\n\",\n );\n};\n", "export type RelayDiagnosticEvent = {\n type: string;\n ts: number;\n data: Record<string, unknown>;\n};\n\nexport type RelayDiagnostics = {\n record(type: string, data?: Record<string, unknown>): void;\n};\n\nexport class MemoryRelayDiagnostics implements RelayDiagnostics {\n readonly events: RelayDiagnosticEvent[] = [];\n readonly #now: () => number;\n\n constructor(options: { now?: () => number } = {}) {\n this.#now = options.now ?? Date.now;\n }\n\n record(type: string, data: Record<string, unknown> = {}): void {\n this.events.push({ type, ts: this.#now(), data: sanitizeDiagnosticData(data) });\n }\n}\n\nexport const createConsoleRelayDiagnostics = (): RelayDiagnostics => ({\n record(type, data = {}) {\n // Payload bodies are intentionally excluded by callers; this guard keeps\n // diagnostics useful if a future caller passes a full frame by mistake.\n console.log(JSON.stringify({ type, ts: Date.now(), data: sanitizeDiagnosticData(data) }));\n },\n});\n\nconst forbiddenKeys = new Set([\"payload\", \"content\", \"message\", \"prompt\", \"result\", \"data\"]);\n\nconst sanitizeDiagnosticData = (input: Record<string, unknown>): Record<string, unknown> => {\n const output: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(input)) {\n output[key] = forbiddenKeys.has(key) ? \"[redacted]\" : value;\n }\n return output;\n};\n", "import { randomInt } from \"node:crypto\";\n\nimport type { ClientId } from \"@scorel/protocol\";\n\nexport type PairSession = {\n pairCode: string;\n clientId: ClientId;\n expiresAt: number;\n};\n\nexport class RelayPairing {\n readonly #sessions = new Map<string, PairSession>();\n readonly #ttlMs: number;\n readonly #now: () => number;\n readonly #createPairCode: () => string;\n\n constructor(options: { ttlMs?: number; now?: () => number; createPairCode?: () => string } = {}) {\n this.#ttlMs = options.ttlMs ?? 5 * 60_000;\n this.#now = options.now ?? Date.now;\n this.#createPairCode = options.createPairCode ?? defaultPairCode;\n }\n\n create(clientId: ClientId): PairSession {\n this.#pruneExpired();\n let pairCode = this.#createPairCode();\n while (this.#sessions.has(pairCode)) {\n pairCode = this.#createPairCode();\n }\n const session = { pairCode, clientId, expiresAt: this.#now() + this.#ttlMs };\n this.#sessions.set(pairCode, session);\n return session;\n }\n\n consume(pairCode: string): { ok: true; clientId: ClientId } | { ok: false; reason: \"not_found\" | \"expired\" } {\n const session = this.#sessions.get(pairCode);\n if (!session) {\n return { ok: false, reason: \"not_found\" };\n }\n this.#sessions.delete(pairCode);\n if (session.expiresAt <= this.#now()) {\n return { ok: false, reason: \"expired\" };\n }\n return { ok: true, clientId: session.clientId };\n }\n\n #pruneExpired(): void {\n const now = this.#now();\n for (const [pairCode, session] of this.#sessions) {\n if (session.expiresAt <= now) {\n this.#sessions.delete(pairCode);\n }\n }\n }\n}\n\nconst defaultPairCode = (): string => `${randomInt(100_000, 1_000_000)}`;\n", "import type { ClientId, DeviceId } from \"@scorel/protocol\";\nimport type { WebSocket } from \"ws\";\n\nexport class RelayPresence {\n readonly #devices = new Map<DeviceId, Set<WebSocket>>();\n readonly #clients = new Map<ClientId, Set<WebSocket>>();\n\n setDevice(deviceId: DeviceId, socket: WebSocket): void {\n let sockets = this.#devices.get(deviceId);\n if (!sockets) {\n sockets = new Set();\n this.#devices.set(deviceId, sockets);\n }\n sockets.add(socket);\n socket.once(\"close\", () => {\n sockets.delete(socket);\n if (sockets.size === 0) {\n this.#devices.delete(deviceId);\n }\n });\n }\n\n addClient(clientId: ClientId, socket: WebSocket): void {\n let sockets = this.#clients.get(clientId);\n if (!sockets) {\n sockets = new Set();\n this.#clients.set(clientId, sockets);\n }\n sockets.add(socket);\n socket.once(\"close\", () => {\n sockets.delete(socket);\n if (sockets.size === 0) {\n this.#clients.delete(clientId);\n }\n });\n }\n\n deviceSocket(deviceId: DeviceId): WebSocket | undefined {\n const sockets = this.#devices.get(deviceId) ?? new Set<WebSocket>();\n return [...sockets].find((socket) => socket.readyState === socket.OPEN);\n }\n\n clientSockets(clientId: ClientId): WebSocket[] {\n return [...(this.#clients.get(clientId) ?? [])].filter((socket) => socket.readyState === socket.OPEN);\n }\n\n isDeviceOnline(deviceId: DeviceId): boolean {\n return this.deviceSocket(deviceId) !== undefined;\n }\n}\n", "import type { ClientId, DaemonMessage, DeviceId, RelayClientPayload, RelayToEntryFrame, RelayToHostFrame } from \"@scorel/protocol\";\nimport type { WebSocket } from \"ws\";\n\nimport type { RelayDiagnostics } from \"./diagnostics.js\";\nimport type { RelayPresence } from \"./presence.js\";\nimport type { RelayStore } from \"./store.js\";\n\nexport type RelayRouteResult =\n | { ok: true }\n | { ok: false; code: \"unauthorized\" | \"device_offline\" | \"client_offline\"; message: string };\n\nexport const routeEntryToDevice = async (\n input: {\n store: RelayStore;\n presence: RelayPresence;\n diagnostics: RelayDiagnostics;\n clientId: ClientId;\n deviceId: DeviceId;\n payload: RelayClientPayload;\n },\n): Promise<RelayRouteResult> => {\n if (!(await input.store.isBound({ clientId: input.clientId, deviceId: input.deviceId }))) {\n input.diagnostics.record(\"entry_route_rejected\", {\n clientId: input.clientId,\n deviceId: input.deviceId,\n reason: \"unauthorized\",\n });\n return { ok: false, code: \"unauthorized\", message: \"entry is not authorized for device\" };\n }\n const socket = input.presence.deviceSocket(input.deviceId);\n if (!socket) {\n input.diagnostics.record(\"entry_route_rejected\", {\n clientId: input.clientId,\n deviceId: input.deviceId,\n reason: \"device_offline\",\n });\n return { ok: false, code: \"device_offline\", message: \"device is offline\" };\n }\n sendJson(socket, {\n type: \"relay_to_host\",\n clientId: input.clientId,\n payload: input.payload,\n } satisfies RelayToHostFrame);\n input.diagnostics.record(\"entry_route_forwarded\", {\n clientId: input.clientId,\n deviceId: input.deviceId,\n payloadType: input.payload.type,\n });\n return { ok: true };\n};\n\nexport const routeHostToEntry = (\n input: {\n presence: RelayPresence;\n diagnostics: RelayDiagnostics;\n deviceId: DeviceId;\n clientId: ClientId;\n payload: DaemonMessage;\n },\n): RelayRouteResult => {\n const sockets = input.presence.clientSockets(input.clientId);\n if (sockets.length === 0) {\n input.diagnostics.record(\"host_route_rejected\", {\n clientId: input.clientId,\n deviceId: input.deviceId,\n reason: \"client_offline\",\n });\n return { ok: false, code: \"client_offline\", message: \"entry is offline\" };\n }\n for (const socket of sockets) {\n sendJson(socket, {\n type: \"device_to_entry\",\n deviceId: input.deviceId,\n payload: input.payload,\n } satisfies RelayToEntryFrame);\n }\n input.diagnostics.record(\"host_route_forwarded\", {\n clientId: input.clientId,\n deviceId: input.deviceId,\n payloadType: input.payload.type,\n clientSocketCount: sockets.length,\n });\n return { ok: true };\n};\n\nconst sendJson = (socket: WebSocket, value: unknown): void => {\n if (socket.readyState === socket.OPEN) {\n socket.send(JSON.stringify(value));\n }\n};\n", "import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport type {\n ClientId,\n DeviceId,\n RelayBindingRecord,\n RelayClientRecord,\n RelayDeviceRecord,\n} from \"@scorel/protocol\";\n\nexport interface RelayStore {\n upsertDevice(record: RelayDeviceRecord): Promise<void>;\n upsertClient(record: RelayClientRecord): Promise<void>;\n bind(input: { deviceId: DeviceId; clientId: ClientId }): Promise<void>;\n isBound(input: { deviceId: DeviceId; clientId: ClientId }): Promise<boolean>;\n listDevicesForClient(clientId: ClientId): Promise<RelayDeviceRecord[]>;\n}\n\ntype RelayStoreFile = {\n version: 1;\n devices: RelayDeviceRecord[];\n clients: RelayClientRecord[];\n bindings: RelayBindingRecord[];\n};\n\nexport class FileRelayStore implements RelayStore {\n readonly #filePath: string;\n readonly #now: () => number;\n #queue = Promise.resolve();\n\n constructor(options: { dataDir: string; now?: () => number }) {\n this.#filePath = join(options.dataDir, \"relay-store.json\");\n this.#now = options.now ?? Date.now;\n }\n\n async upsertDevice(record: RelayDeviceRecord): Promise<void> {\n await this.#mutate((file) => {\n const existing = file.devices.find((candidate) => candidate.deviceId === record.deviceId);\n if (existing) {\n Object.assign(existing, { ...record, createdAt: existing.createdAt, updatedAt: record.updatedAt });\n } else {\n file.devices.push(record);\n }\n });\n }\n\n async upsertClient(record: RelayClientRecord): Promise<void> {\n await this.#mutate((file) => {\n const existing = file.clients.find((candidate) => candidate.clientId === record.clientId);\n if (existing) {\n Object.assign(existing, { ...record, createdAt: existing.createdAt, updatedAt: record.updatedAt });\n } else {\n file.clients.push(record);\n }\n });\n }\n\n async bind(input: { deviceId: DeviceId; clientId: ClientId }): Promise<void> {\n await this.#mutate((file) => {\n if (!file.bindings.some((binding) => binding.deviceId === input.deviceId && binding.clientId === input.clientId)) {\n file.bindings.push({ ...input, createdAt: this.#now() });\n }\n });\n }\n\n async isBound(input: { deviceId: DeviceId; clientId: ClientId }): Promise<boolean> {\n const file = await this.#read();\n return file.bindings.some((binding) => binding.deviceId === input.deviceId && binding.clientId === input.clientId);\n }\n\n async listDevicesForClient(clientId: ClientId): Promise<RelayDeviceRecord[]> {\n const file = await this.#read();\n const deviceIds = new Set(file.bindings.filter((binding) => binding.clientId === clientId).map((binding) => binding.deviceId));\n return file.devices.filter((device) => deviceIds.has(device.deviceId));\n }\n\n async #mutate(mutator: (file: RelayStoreFile) => void): Promise<void> {\n this.#queue = this.#queue.then(async () => {\n const file = await this.#read();\n mutator(file);\n await mkdir(join(this.#filePath, \"..\"), { recursive: true });\n await writeFile(this.#filePath, `${JSON.stringify(file, null, 2)}\\n`);\n });\n await this.#queue;\n }\n\n async #read(): Promise<RelayStoreFile> {\n try {\n const raw = JSON.parse(await readFile(this.#filePath, \"utf8\")) as Partial<RelayStoreFile>;\n if (raw.version !== 1 || !Array.isArray(raw.devices) || !Array.isArray(raw.clients) || !Array.isArray(raw.bindings)) {\n return emptyStoreFile();\n }\n return {\n version: 1,\n devices: raw.devices,\n clients: raw.clients,\n bindings: raw.bindings,\n };\n } catch (cause) {\n if (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") {\n return emptyStoreFile();\n }\n throw cause;\n }\n }\n}\n\nconst emptyStoreFile = (): RelayStoreFile => ({\n version: 1,\n devices: [],\n clients: [],\n bindings: [],\n});\n", "import { WebSocketServer, type WebSocket } from \"ws\";\n\nimport {\n type ClientId,\n type DeviceId,\n type RelayEntryFrame,\n type RelayHostFrame,\n type RelayResponse,\n type RequestId,\n} from \"@scorel/protocol\";\n\nimport { createConsoleRelayDiagnostics, type RelayDiagnostics } from \"./diagnostics.js\";\nimport { RelayPairing } from \"./pairing.js\";\nimport { RelayPresence } from \"./presence.js\";\nimport { routeEntryToDevice, routeHostToEntry } from \"./routing.js\";\nimport type { RelayStore } from \"./store.js\";\n\nexport type RelayServerOptions = {\n host: string;\n port: number;\n store: RelayStore;\n diagnostics?: RelayDiagnostics;\n pairing?: RelayPairing;\n now?: () => number;\n};\n\nexport type RelayServer = {\n host: string;\n port: number;\n url: string;\n close(): Promise<void>;\n};\n\ntype SocketState = {\n clientId?: ClientId;\n deviceId?: DeviceId;\n};\n\nexport const startRelayServer = async (options: RelayServerOptions): Promise<RelayServer> => {\n const diagnostics = options.diagnostics ?? createConsoleRelayDiagnostics();\n const pairing = options.pairing ?? new RelayPairing();\n const presence = new RelayPresence();\n const socketStates = new WeakMap<WebSocket, SocketState>();\n const now = options.now ?? Date.now;\n const server = new WebSocketServer({ host: options.host, port: options.port });\n\n server.on(\"connection\", (socket) => {\n socketStates.set(socket, {});\n diagnostics.record(\"socket_connected\");\n let queue = Promise.resolve();\n\n socket.on(\"message\", (data) => {\n queue = queue.then(async () => {\n const state = socketStates.get(socket) ?? {};\n const frame = parseFrame(data);\n if (!frame) {\n sendError(socket, undefined, \"invalid_request\", \"invalid relay frame\");\n return;\n }\n if (isEntryFrame(frame)) {\n await handleEntryFrame({ frame, socket, state, store: options.store, diagnostics, pairing, presence, now });\n return;\n }\n await handleHostFrame({ frame, socket, state, store: options.store, diagnostics, pairing, presence, now });\n }).catch((cause) => {\n diagnostics.record(\"relay_internal_error\", {\n error: cause instanceof Error ? cause.message : String(cause),\n });\n sendError(socket, undefined, \"internal_error\", cause instanceof Error ? cause.message : String(cause));\n });\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.once(\"listening\", () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n\n const address = server.address();\n if (!address || typeof address === \"string\") {\n await closeWebSocketServer(server);\n throw new Error(\"relay server did not expose a TCP address\");\n }\n const host = options.host === \"0.0.0.0\" ? \"127.0.0.1\" : options.host;\n return {\n host: options.host,\n port: address.port,\n url: `ws://${host}:${address.port}`,\n close: () => closeWebSocketServer(server),\n };\n};\n\nconst handleEntryFrame = async (\n input: {\n frame: RelayEntryFrame;\n socket: WebSocket;\n state: SocketState;\n store: RelayStore;\n diagnostics: RelayDiagnostics;\n pairing: RelayPairing;\n presence: RelayPresence;\n now: () => number;\n },\n): Promise<void> => {\n switch (input.frame.type) {\n case \"entry_hello\": {\n input.state.clientId = input.frame.clientId;\n input.presence.addClient(input.frame.clientId, input.socket);\n const ts = input.now();\n await input.store.upsertClient({\n clientId: input.frame.clientId,\n label: input.frame.label,\n publicKey: input.frame.publicKey,\n createdAt: ts,\n updatedAt: ts,\n });\n input.diagnostics.record(\"entry_online\", { clientId: input.frame.clientId });\n return;\n }\n case \"create_pair_session\": {\n const clientId = input.frame.clientId ?? input.state.clientId;\n if (!clientId) {\n sendError(input.socket, input.frame.requestId, \"not_announced\", \"entry must announce clientId before pairing\");\n return;\n }\n const session = input.pairing.create(clientId);\n input.diagnostics.record(\"pair_session_created\", { clientId, pairCode: session.pairCode });\n sendResponse(input.socket, input.frame.requestId, {\n pairCode: session.pairCode,\n expiresAt: session.expiresAt,\n });\n return;\n }\n case \"list_authorized_devices\": {\n if (!input.state.clientId) {\n sendError(input.socket, input.frame.requestId, \"not_announced\", \"entry must announce clientId before listing devices\");\n return;\n }\n const devices = await input.store.listDevicesForClient(input.state.clientId);\n sendResponse(input.socket, input.frame.requestId, {\n devices: devices.map((device) => ({\n ...device,\n online: input.presence.isDeviceOnline(device.deviceId),\n })),\n });\n return;\n }\n case \"entry_to_device\": {\n if (!input.state.clientId) {\n sendError(input.socket, undefined, \"not_announced\", \"entry must announce clientId before routing\");\n return;\n }\n const result = await routeEntryToDevice({\n store: input.store,\n presence: input.presence,\n diagnostics: input.diagnostics,\n clientId: input.state.clientId,\n deviceId: input.frame.deviceId,\n payload: input.frame.payload,\n });\n if (!result.ok) {\n sendError(input.socket, \"requestId\" in input.frame.payload ? input.frame.payload.requestId : undefined, result.code, result.message);\n }\n return;\n }\n }\n};\n\nconst handleHostFrame = async (\n input: {\n frame: RelayHostFrame;\n socket: WebSocket;\n state: SocketState;\n store: RelayStore;\n diagnostics: RelayDiagnostics;\n pairing: RelayPairing;\n presence: RelayPresence;\n now: () => number;\n },\n): Promise<void> => {\n switch (input.frame.type) {\n case \"host_hello\": {\n input.state.deviceId = input.frame.deviceId;\n input.presence.setDevice(input.frame.deviceId, input.socket);\n const ts = input.now();\n await input.store.upsertDevice({\n deviceId: input.frame.deviceId,\n label: input.frame.label,\n publicKey: input.frame.publicKey,\n createdAt: ts,\n updatedAt: ts,\n });\n input.diagnostics.record(\"device_online\", { deviceId: input.frame.deviceId });\n return;\n }\n case \"redeem_pair\": {\n const result = input.pairing.consume(input.frame.pairCode);\n if (!result.ok) {\n sendError(\n input.socket,\n input.frame.requestId,\n result.reason === \"expired\" ? \"pair_expired\" : \"pair_not_found\",\n result.reason === \"expired\" ? \"pair code expired\" : \"pair code not found\",\n );\n return;\n }\n await input.store.bind({ deviceId: input.frame.deviceId, clientId: result.clientId });\n input.diagnostics.record(\"pair_session_redeemed\", {\n deviceId: input.frame.deviceId,\n clientId: result.clientId,\n });\n sendResponse(input.socket, input.frame.requestId, { clientId: result.clientId });\n return;\n }\n case \"host_to_entry\": {\n if (!input.state.deviceId) {\n sendError(input.socket, undefined, \"not_announced\", \"host must announce deviceId before routing\");\n return;\n }\n const result = routeHostToEntry({\n presence: input.presence,\n diagnostics: input.diagnostics,\n deviceId: input.state.deviceId,\n clientId: input.frame.clientId,\n payload: input.frame.payload,\n });\n if (!result.ok) {\n sendError(input.socket, undefined, result.code, result.message);\n }\n return;\n }\n }\n};\n\nconst isEntryFrame = (frame: RelayEntryFrame | RelayHostFrame): frame is RelayEntryFrame =>\n frame.type === \"entry_hello\" ||\n frame.type === \"create_pair_session\" ||\n frame.type === \"entry_to_device\" ||\n frame.type === \"list_authorized_devices\";\n\nconst parseFrame = (data: unknown): RelayEntryFrame | RelayHostFrame | null => {\n try {\n const text = Buffer.isBuffer(data) ? data.toString(\"utf8\") : String(data);\n const frame = JSON.parse(text) as { type?: unknown };\n return typeof frame.type === \"string\" ? (frame as RelayEntryFrame | RelayHostFrame) : null;\n } catch {\n return null;\n }\n};\n\nconst sendResponse = (\n socket: WebSocket,\n requestId: RequestId,\n data: Extract<RelayResponse, { ok: true }>[\"data\"],\n): void => {\n sendJson(socket, { type: \"relay_response\", requestId, ok: true, data } satisfies RelayResponse);\n};\n\nconst sendError = (\n socket: WebSocket,\n requestId: RequestId | undefined,\n code: Extract<RelayResponse, { ok: false }>[\"code\"],\n message: string,\n): void => {\n sendJson(socket, { type: \"relay_error\", requestId, ok: false, code, message } satisfies RelayResponse);\n};\n\nconst sendJson = (socket: WebSocket, value: unknown): void => {\n if (socket.readyState === socket.OPEN) {\n socket.send(JSON.stringify(value));\n }\n};\n\nconst closeWebSocketServer = (server: WebSocketServer): Promise<void> =>\n new Promise((resolve, reject) => {\n for (const client of server.clients) {\n client.close();\n }\n server.close((error) => (error ? reject(error) : resolve()));\n });\n", "import { protocolPackageName, protocolVersion } from \"@scorel/protocol\";\n\nimport { createConsoleRelayDiagnostics, MemoryRelayDiagnostics } from \"./diagnostics.js\";\nimport { RelayPairing } from \"./pairing.js\";\nimport { RelayPresence } from \"./presence.js\";\nimport { routeEntryToDevice, routeHostToEntry } from \"./routing.js\";\nimport { FileRelayStore, type RelayStore } from \"./store.js\";\nimport { startRelayServer, type RelayServer } from \"./server.js\";\n\nexport const relayPackageName = \"@scorel/relay\" as const;\nexport const relayProtocolDependency = protocolPackageName;\nexport const relayProtocolVersion = protocolVersion;\n\nexport {\n createConsoleRelayDiagnostics,\n FileRelayStore,\n MemoryRelayDiagnostics,\n RelayPairing,\n RelayPresence,\n routeEntryToDevice,\n routeHostToEntry,\n startRelayServer,\n type RelayServer,\n type RelayStore,\n};\n", "import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { createConsoleRelayDiagnostics, FileRelayStore, startRelayServer, type RelayServer } from \"../../../apps/relay/src/library.js\";\n\nexport type RelayServerCommandOptions = {\n output: NodeJS.WritableStream;\n error: NodeJS.WritableStream;\n serveSignal?: AbortSignal;\n};\n\ntype RelayServeFlags = {\n host: string;\n port: number;\n dataDir: string;\n};\n\nconst DEFAULT_HOST = \"127.0.0.1\";\nconst DEFAULT_PORT = 8787;\n\nexport const runCliRelay = async (argv: string[], options: RelayServerCommandOptions): Promise<number> => {\n const [command, ...rest] = argv;\n if (command === \"serve\") {\n return runRelayServe(rest, options);\n }\n if (command === \"--help\" || command === \"-h\") {\n writeRelayUsage(options.output);\n return 0;\n }\n writeRelayUsage(options.error);\n return 1;\n};\n\nconst runRelayServe = async (argv: string[], options: RelayServerCommandOptions): Promise<number> => {\n let flags: RelayServeFlags;\n try {\n flags = parseRelayServeFlags(argv);\n } catch (cause) {\n options.error.write(`scorel relay serve error: ${(cause as Error).message}\\n`);\n return 1;\n }\n let server: RelayServer;\n try {\n server = await startRelayServer({\n host: flags.host,\n port: flags.port,\n store: new FileRelayStore({ dataDir: flags.dataDir }),\n diagnostics: createConsoleRelayDiagnostics(),\n });\n } catch (cause) {\n options.error.write(`scorel relay serve error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n }\n options.output.write(`scorel relay serving url=${server.url}\\n`);\n await waitForStop(options.serveSignal);\n await server.close();\n options.output.write(\"scorel relay serve stopped\\n\");\n return 0;\n};\n\nconst parseRelayServeFlags = (argv: string[]): RelayServeFlags => {\n let host = DEFAULT_HOST;\n let port = DEFAULT_PORT;\n let dataDir = join(homedir(), \".scorel\", \"relay\");\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--host\") {\n host = requireValue(argv, index, \"--host\");\n index += 1;\n continue;\n }\n if (arg === \"--port\") {\n port = Number(requireValue(argv, index, \"--port\"));\n if (!Number.isInteger(port) || port < 0 || port > 65535) {\n throw new Error(\"--port must be an integer from 0 to 65535\");\n }\n index += 1;\n continue;\n }\n if (arg === \"--data-dir\") {\n dataDir = requireValue(argv, index, \"--data-dir\");\n index += 1;\n continue;\n }\n throw new Error(`Unknown relay serve option: ${arg}`);\n }\n return { host, port, dataDir };\n};\n\nconst waitForStop = (signal?: AbortSignal): Promise<void> =>\n new Promise((resolve) => {\n if (signal) {\n if (signal.aborted) {\n resolve();\n return;\n }\n signal.addEventListener(\"abort\", () => resolve(), { once: true });\n return;\n }\n const onSignal = () => {\n process.off(\"SIGINT\", onSignal);\n process.off(\"SIGTERM\", onSignal);\n resolve();\n };\n process.once(\"SIGINT\", onSignal);\n process.once(\"SIGTERM\", onSignal);\n });\n\nconst requireValue = (argv: string[], index: number, flag: string): string => {\n const value = argv[index + 1];\n if (!value) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n};\n\nconst writeRelayUsage = (output: NodeJS.WritableStream): void => {\n output.write(\"Usage: scorel relay serve [--host <h>] [--port <p>] [--data-dir <dir>]\\n\");\n};\n", "import { spawn, type ChildProcess, type SpawnOptions } from \"node:child_process\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n daemonStateLiveness,\n readLocalDaemonState,\n type LocalDaemonState,\n} from \"@scorel/daemon\";\nimport { AUTO_STARTED_IDLE_SHUTDOWN_MS } from \"./daemon-cli.js\";\n\nexport type UpCommandOptions = {\n output: NodeJS.WritableStream;\n error: NodeJS.WritableStream;\n stateDir?: string;\n cwd?: string;\n /**\n * Optional override for tests; takes the same shape as `child_process.spawn`\n * so tests can swap a stubbed lifecycle in without spawning real processes.\n */\n spawn?: (command: string, argv: string[], opts: SpawnOptions) => ChildProcess;\n /**\n * Optional path to the CLI entrypoint (apps/cli/src/index.ts). Defaults to\n * the running script. Tests provide a fake path so spawn args are\n * deterministic.\n */\n cliEntrypoint?: string;\n /**\n * Optional reader so tests can deliver the existing daemon state without\n * touching the filesystem.\n */\n readState?: (stateDir: string) => Promise<LocalDaemonState | null>;\n /**\n * Hook into SIGINT delivery so tests can drive the propagation path\n * deterministically. Returns a teardown that removes the listener.\n */\n attachSigint?: (listener: () => void) => () => void;\n /**\n * Maximum time to wait for the daemon to print its ready line before\n * aborting `up`. Tests shorten this to avoid 10s sleeps.\n */\n daemonReadyTimeoutMs?: number;\n};\n\ntype UpFlags = {\n daemonPort: number;\n webuiPort: number;\n cwd: string;\n};\n\nconst DEFAULT_DAEMON_PORT = 7777;\nconst DEFAULT_WEBUI_PORT = 3000;\nconst DEFAULT_DAEMON_READY_TIMEOUT_MS = 30_000;\n\nconst defaultStateDir = (): string => join(homedir(), \".scorel\");\n\nconst defaultAttachSigint = (listener: () => void): (() => void) => {\n process.on(\"SIGINT\", listener);\n return () => process.off(\"SIGINT\", listener);\n};\n\nexport const runCliUp = async (argv: string[], options: UpCommandOptions): Promise<number> => {\n let flags: UpFlags;\n try {\n flags = parseUpFlags(argv, options.cwd ?? process.cwd());\n } catch (cause) {\n options.error.write(`scorel up error: ${(cause as Error).message}\\n`);\n return 1;\n }\n\n const stateDir = options.stateDir ?? defaultStateDir();\n const cliEntrypoint = options.cliEntrypoint ?? fileURLToPath(import.meta.url).replace(/up-cli\\.ts$/, \"index.ts\");\n const spawnFn = options.spawn ?? spawn;\n const readState = options.readState ?? ((dir: string) => readLocalDaemonState({ stateDir: dir }));\n const attachSigint = options.attachSigint ?? defaultAttachSigint;\n const readyTimeout = options.daemonReadyTimeoutMs ?? DEFAULT_DAEMON_READY_TIMEOUT_MS;\n\n const existingState = await readState(stateDir);\n const existingLiveness = existingState ? daemonStateLiveness(existingState) : null;\n const reuseDaemon = existingState && existingLiveness === \"running\";\n\n let daemonChild: ChildProcess | undefined;\n let daemonState: LocalDaemonState | null = existingState;\n if (!reuseDaemon) {\n const daemonArgs = [\n ...nodeEntrypointArgs(cliEntrypoint),\n \"daemon\",\n \"serve\",\n \"--port\",\n String(flags.daemonPort),\n \"--cwd\",\n flags.cwd,\n \"--idle-timeout-ms\",\n String(AUTO_STARTED_IDLE_SHUTDOWN_MS),\n \"--no-relay\",\n ];\n daemonChild = spawnFn(process.execPath, daemonArgs, {\n cwd: dirname(cliEntrypoint),\n env: { ...process.env },\n detached: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n try {\n await waitForDaemonReady(daemonChild, readyTimeout);\n } catch (cause) {\n options.error.write(`scorel up error: ${(cause as Error).message}\\n`);\n daemonChild.kill(\"SIGTERM\");\n return 1;\n }\n // Re-read state \u2014 serve has now written daemon.json with the bound port,\n // token, and pid we need for the unified header.\n daemonState = await readState(stateDir);\n }\n\n if (!daemonState) {\n options.error.write(\"scorel up error: daemon state missing after start\\n\");\n daemonChild?.kill(\"SIGTERM\");\n return 1;\n }\n if (daemonChild) {\n detachBackgroundDaemon(daemonChild);\n }\n\n const webuiArgs = [\n ...nodeEntrypointArgs(cliEntrypoint),\n \"webui\",\n \"--port\",\n String(flags.webuiPort),\n ];\n const webuiChild = spawnFn(process.execPath, webuiArgs, {\n cwd: dirname(cliEntrypoint),\n env: { ...process.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n pipeWithPrefix(webuiChild, \"[webui] \", options.output, options.error);\n\n options.output.write(`scorel up\\n`);\n options.output.write(` daemon ${daemonState.wsUrl} token=${daemonState.token}\\n`);\n options.output.write(` webui http://127.0.0.1:${flags.webuiPort}\\n`);\n\n let shuttingDown = false;\n const detachSigint = attachSigint(() => {\n if (shuttingDown) {\n return;\n }\n shuttingDown = true;\n webuiChild.kill(\"SIGTERM\");\n });\n\n const webuiExit = once(webuiChild);\n\n const webuiDeathWatcher = webuiExit.then((code) => {\n if (!shuttingDown) {\n shuttingDown = true;\n options.error.write(`scorel up webui exited code=${code}\\n`);\n }\n return code;\n });\n\n const webuiCode = await webuiDeathWatcher;\n detachSigint();\n options.output.write(\"scorel up stopped\\n\");\n return webuiCode === 0 ? 0 : 1;\n};\n\nconst parseUpFlags = (argv: string[], defaultCwd: string): UpFlags => {\n let daemonPort = DEFAULT_DAEMON_PORT;\n let webuiPort = DEFAULT_WEBUI_PORT;\n let cwd = defaultCwd;\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--daemon-port\") {\n daemonPort = Number(requireValue(argv, index, \"--daemon-port\"));\n if (!Number.isInteger(daemonPort) || daemonPort < 0 || daemonPort > 65535) {\n throw new Error(\"--daemon-port must be an integer from 0 to 65535\");\n }\n index += 1;\n continue;\n }\n if (arg === \"--webui-port\") {\n webuiPort = Number(requireValue(argv, index, \"--webui-port\"));\n if (!Number.isInteger(webuiPort) || webuiPort < 0 || webuiPort > 65535) {\n throw new Error(\"--webui-port must be an integer from 0 to 65535\");\n }\n index += 1;\n continue;\n }\n if (arg === \"--cwd\") {\n cwd = requireValue(argv, index, \"--cwd\");\n index += 1;\n continue;\n }\n throw new Error(`Unknown up option: ${arg}`);\n }\n return { daemonPort, webuiPort, cwd };\n};\n\nconst requireValue = (argv: string[], index: number, flag: string): string => {\n const value = argv[index + 1];\n if (!value) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n};\n\nconst waitForDaemonReady = (child: ChildProcess, timeoutMs: number): Promise<void> =>\n new Promise((resolveReady, rejectReady) => {\n if (!child.stdout) {\n rejectReady(new Error(\"daemon child has no stdout stream\"));\n return;\n }\n let buffer = \"\";\n let stderrBuffer = \"\";\n let settled = false;\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n cleanup();\n rejectReady(new Error(\"timed out waiting for daemon ready line\"));\n }, timeoutMs);\n const onData = (chunk: Buffer | string) => {\n buffer += chunk.toString();\n const newlineIndex = buffer.lastIndexOf(\"\\n\");\n if (newlineIndex < 0) {\n return;\n }\n if (buffer.includes(\"scorel daemon serving url=\") || buffer.includes(\"scorel host serving url=\")) {\n if (settled) return;\n settled = true;\n cleanup();\n resolveReady();\n }\n buffer = buffer.slice(newlineIndex + 1);\n };\n // Capture stderr while we wait so a daemon that bails before printing the\n // ready line (e.g. missing SCOREL_API_KEY env, port collision, malformed\n // config) reports the actual cause instead of \"exited before ready\".\n const onStderr = (chunk: Buffer | string) => {\n stderrBuffer += chunk.toString();\n };\n const onExit = (code: number | null) => {\n if (settled) return;\n settled = true;\n cleanup();\n const trimmed = stderrBuffer.trim();\n const detail = trimmed ? `: ${trimmed}` : \"\";\n rejectReady(new Error(`daemon exited before ready code=${code}${detail}`));\n };\n const cleanup = () => {\n clearTimeout(timer);\n child.stdout?.off(\"data\", onData);\n child.stderr?.off(\"data\", onStderr);\n child.off(\"exit\", onExit);\n };\n child.stdout.on(\"data\", onData);\n child.stderr?.on(\"data\", onStderr);\n child.once(\"exit\", onExit);\n });\n\nconst pipeWithPrefix = (\n child: ChildProcess,\n prefix: string,\n output: NodeJS.WritableStream,\n error: NodeJS.WritableStream,\n): void => {\n if (child.stdout) {\n pipeStreamLines(child.stdout, prefix, output);\n }\n if (child.stderr) {\n pipeStreamLines(child.stderr, prefix, error);\n }\n};\n\nconst detachBackgroundDaemon = (child: ChildProcess): void => {\n child.stdout?.destroy();\n child.stderr?.destroy();\n child.unref();\n};\n\nconst nodeEntrypointArgs = (entrypoint: string): string[] =>\n entrypoint.endsWith(\".ts\") ? [\"--import\", \"tsx\", entrypoint] : [entrypoint];\n\nconst pipeStreamLines = (\n stream: NodeJS.ReadableStream,\n prefix: string,\n destination: NodeJS.WritableStream,\n): void => {\n let buffer = \"\";\n stream.setEncoding?.(\"utf8\");\n stream.on(\"data\", (chunk: string | Buffer) => {\n buffer += chunk.toString();\n let newlineIndex = buffer.indexOf(\"\\n\");\n while (newlineIndex >= 0) {\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n destination.write(`${prefix} ${line}\\n`);\n newlineIndex = buffer.indexOf(\"\\n\");\n }\n });\n stream.on(\"end\", () => {\n if (buffer.length > 0) {\n destination.write(`${prefix} ${buffer}\\n`);\n buffer = \"\";\n }\n });\n};\n\nconst once = (child: ChildProcess): Promise<number> =>\n new Promise((resolveExit) => {\n child.once(\"exit\", (code) => resolveExit(typeof code === \"number\" ? code : 0));\n });\n", "import { spawn, type ChildProcess, type SpawnOptions } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport type WebUiCommandOptions = {\n output: NodeJS.WritableStream;\n error: NodeJS.WritableStream;\n /**\n * Optional override; tests inject a fake spawner so they can assert on\n * argv, env, and cwd without booting Next.js.\n */\n spawn?: (command: string, argv: string[], opts: SpawnOptions) => ChildProcess;\n /**\n * Optional override for `apps/webui` resolution; tests pass an absolute\n * path so they don't depend on the real workspace layout.\n */\n webuiAppDir?: string;\n};\n\nexport type WebUiSpawnPlan = {\n command: string;\n argv: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n};\n\nconst DEFAULT_PORT = 3000;\nconst DEFAULT_HOST = \"127.0.0.1\";\n\ntype WebUiFlags = {\n host: string;\n port: number;\n};\n\nexport const runCliWebUi = async (\n argv: string[],\n options: WebUiCommandOptions,\n): Promise<number> => {\n let flags: WebUiFlags;\n try {\n flags = parseWebUiFlags(argv);\n } catch (cause) {\n options.error.write(`scorel webui error: ${(cause as Error).message}\\n`);\n return 1;\n }\n const webuiAppDir = options.webuiAppDir ?? findWebuiAppDir();\n if (!webuiAppDir) {\n options.error.write(\"scorel webui error: could not locate apps/webui\\n\");\n return 1;\n }\n const plan = buildWebUiSpawnPlan(flags, webuiAppDir);\n const spawnFn = options.spawn ?? spawn;\n const child = spawnFn(plan.command, plan.argv, {\n cwd: plan.cwd,\n env: plan.env,\n stdio: \"inherit\",\n });\n return await waitForChildExit(child, options);\n};\n\n/**\n * Locate the `apps/webui` package directory by walking up from the CLI\n * source location until we find a workspace root that contains it. Done\n * eagerly (synchronously) so spawn args are deterministic; the workspace\n * layout never changes inside a single process.\n */\nconst findWebuiAppDir = (): string | undefined => {\n let cursor = dirname(fileURLToPath(import.meta.url));\n for (let depth = 0; depth < 8; depth += 1) {\n const candidate = resolve(cursor, \"apps/webui/package.json\");\n if (existsSync(candidate)) {\n return resolve(cursor, \"apps/webui\");\n }\n const parent = resolve(cursor, \"..\");\n if (parent === cursor) {\n return undefined;\n }\n cursor = parent;\n }\n return undefined;\n};\n\nexport const buildWebUiSpawnPlan = (flags: WebUiFlags, webuiAppDir: string): WebUiSpawnPlan => {\n const env = {\n ...process.env,\n PORT: String(flags.port),\n HOST: flags.host,\n };\n // Prefer the directly-bundled Next CLI to avoid a recursive pnpm hop and to\n // keep the spawn graph small (parent \u2192 node \u2192 next, no shell).\n const nextBin = resolve(webuiAppDir, \"node_modules/next/dist/bin/next\");\n if (existsSync(nextBin)) {\n return {\n command: process.execPath,\n argv: [nextBin, \"dev\", \"-p\", String(flags.port), \"-H\", flags.host],\n cwd: webuiAppDir,\n env,\n };\n }\n // Fallback: pnpm filter command. Keeps the path working before\n // `pnpm install` has hydrated the inner node_modules.\n return {\n command: \"pnpm\",\n argv: [\"--filter\", \"@scorel/app-webui\", \"dev\"],\n cwd: webuiAppDir,\n env,\n };\n};\n\nconst parseWebUiFlags = (argv: string[]): WebUiFlags => {\n let host = DEFAULT_HOST;\n let port = DEFAULT_PORT;\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--host\") {\n host = requireValue(argv, index, \"--host\");\n index += 1;\n continue;\n }\n if (arg === \"--port\") {\n port = Number(requireValue(argv, index, \"--port\"));\n if (!Number.isInteger(port) || port < 0 || port > 65535) {\n throw new Error(\"--port must be an integer from 0 to 65535\");\n }\n index += 1;\n continue;\n }\n throw new Error(`Unknown webui option: ${arg}`);\n }\n return { host, port };\n};\n\nconst requireValue = (argv: string[], index: number, flag: string): string => {\n const value = argv[index + 1];\n if (!value) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n};\n\nconst waitForChildExit = (\n child: ChildProcess,\n options: WebUiCommandOptions,\n): Promise<number> =>\n new Promise((resolveExit) => {\n child.once(\"error\", (cause) => {\n options.error.write(`scorel webui error: ${cause.message}\\n`);\n resolveExit(1);\n });\n child.once(\"exit\", (code) => {\n resolveExit(typeof code === \"number\" ? code : 1);\n });\n });\n", "#!/usr/bin/env -S node --import tsx\nimport { createHash } from \"node:crypto\";\nimport { appendFile, mkdir, readFile, realpath, readdir, writeFile } from \"node:fs/promises\";\nimport { createInterface } from \"node:readline/promises\";\nimport { homedir } from \"node:os\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Readable, Writable } from \"node:stream\";\nimport { basename, dirname, join } from \"node:path\";\n\nimport { DaemonClient, WsTransport, clientPackageName } from \"@scorel/client\";\nimport {\n ScorelHost,\n createEmbeddedTransport,\n createRealRuntime,\n daemonPackageName,\n loadScorelConfig,\n loadScorelConfigProfile,\n readLocalDaemonState,\n scorelSessionsDir,\n type ScorelConfig,\n} from \"@scorel/daemon\";\nimport {\n asClientId,\n asDeviceId,\n asProjectId,\n asSeq,\n asSessionId,\n type ContentBlock,\n type DeviceId,\n type ErrorEvent,\n type PersistentEvent,\n type ScorelEvent,\n} from \"@scorel/protocol\";\n\nimport { runCliDaemon } from \"./daemon-cli.js\";\nimport { runCliPair } from \"./relay-cli.js\";\nimport { runCliRelay } from \"./relay-server-cli.js\";\nimport { runCliUp } from \"./up-cli.js\";\nimport { runCliWebUi } from \"./webui-cli.js\";\nimport { readInstalledScorelVersion, runCliUpdate } from \"./update-cli.js\";\n\nexport const cliAppName = \"@scorel/app-cli\" as const;\nexport const cliClientDependency = clientPackageName;\nexport const cliDaemonDependency = daemonPackageName;\n\nexport type CliIo = {\n input: NodeJS.ReadableStream;\n output: NodeJS.WritableStream;\n error: NodeJS.WritableStream;\n};\n\nexport type CliRunOptions = {\n config?: ScorelConfig;\n sessionsDir?: string;\n};\n\ntype ChatOptions = {\n sessionsDir: string;\n stateDir: string;\n sessionId: ReturnType<typeof asSessionId>;\n cwd: string;\n config?: ScorelConfig;\n};\n\nconst defaultSessionsDir = (): string => scorelSessionsDir(homedir());\n\nconst defaultStateDir = (): string => join(homedir(), \".scorel\");\n\nexport const runCli = async (\n argv: string[],\n io: CliIo = { input: process.stdin, output: process.stdout, error: process.stderr },\n runOptions: CliRunOptions = {},\n): Promise<number> => {\n const [command, ...rest] = argv;\n if (command === \"--version\" || command === \"-v\" || command === \"version\") {\n io.output.write(`${await readInstalledScorelVersion()}\\n`);\n return 0;\n }\n if (!command || command === \"chat\") {\n if (rest.includes(\"--help\") || rest.includes(\"-h\")) {\n writeUsage(io.output);\n return 0;\n }\n const chatOptions = parseChatOptions(rest);\n const sessionsDir = runOptions.sessionsDir ?? chatOptions.sessionsDir;\n return runChat({ ...chatOptions, config: runOptions.config, sessionsDir, stateDir: stateDirFromSessionsDir(sessionsDir) }, io);\n }\n if (command === \"daemon\") {\n return runCliDaemon(rest, {\n stateDir: stateDirFromSessionsDir(runOptions.sessionsDir),\n sessionsDir: runOptions.sessionsDir,\n output: io.output,\n error: io.error,\n });\n }\n if (command === \"host\") {\n return runCliDaemon(rest, {\n stateDir: stateDirFromSessionsDir(runOptions.sessionsDir),\n sessionsDir: runOptions.sessionsDir,\n output: io.output,\n error: io.error,\n });\n }\n if (command === \"relay\") {\n return runCliRelay(rest, { output: io.output, error: io.error });\n }\n if (command === \"pair\") {\n return runCliPair(rest, {\n stateDir: stateDirFromSessionsDir(runOptions.sessionsDir),\n output: io.output,\n error: io.error,\n });\n }\n if (command === \"webui\") {\n return runCliWebUi(rest, { output: io.output, error: io.error });\n }\n if (command === \"up\") {\n return runCliUp(rest, {\n stateDir: stateDirFromSessionsDir(runOptions.sessionsDir),\n output: io.output,\n error: io.error,\n });\n }\n if (command === \"update\" || command === \"upgrade\") {\n return runCliUpdate(rest, { output: io.output, error: io.error });\n }\n if (command === \"attach\") {\n try {\n return runAttach(parseAttachOptions(rest), {\n stateDir: stateDirFromSessionsDir(runOptions.sessionsDir),\n cwd: process.cwd(),\n input: io.input,\n output: io.output,\n error: io.error,\n });\n } catch (cause) {\n io.error.write(`scorel attach error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n }\n }\n if (command === \"project\") {\n return runProject(rest, {\n stateDir: stateDirFromSessionsDir(runOptions.sessionsDir),\n output: io.output,\n error: io.error,\n });\n }\n if (command === \"logs\") {\n try {\n return runLogs(parseLogsOptions(rest), {\n sessionsDir: runOptions.sessionsDir ?? defaultSessionsDir(),\n stateDir: stateDirFromSessionsDir(runOptions.sessionsDir),\n output: io.output,\n error: io.error,\n });\n } catch (cause) {\n io.error.write(`scorel logs error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n }\n }\n writeUsage(io.error);\n return command === \"--help\" || command === \"-h\" ? 0 : 1;\n};\n\ntype LogsOptions = {\n sessionId: ReturnType<typeof asSessionId>;\n tail?: number;\n attach: boolean;\n remoteUrl?: string;\n};\n\nconst runProject = async (\n argv: string[],\n io: { stateDir: string; output: NodeJS.WritableStream; error: NodeJS.WritableStream },\n): Promise<number> => {\n const [command, value, ...extra] = argv;\n if (extra.length > 0 || ![\"list\", \"add\", \"remove\"].includes(command ?? \"\")) {\n writeProjectUsage(io.error);\n return 1;\n }\n if ((command === \"add\" || command === \"remove\") && !value) {\n writeProjectUsage(io.error);\n return 1;\n }\n if (command === \"list\" && value) {\n writeProjectUsage(io.error);\n return 1;\n }\n const state = await readLocalDaemonState({ stateDir: io.stateDir });\n if (!state || state.stoppedAt !== null) {\n io.error.write(\"scorel project error: local daemon is not running\\n\");\n return 1;\n }\n const client = new DaemonClient(new WsTransport({ url: state.wsUrl, token: state.token }), {\n clientId: asClientId(\"client_cli_project\"),\n });\n try {\n await client.connect();\n if (command === \"list\") {\n for (const project of await client.listProjects()) {\n io.output.write(`${project.projectId}\\t${project.displayName}\\t${project.workDir}\\n`);\n }\n } else if (command === \"add\") {\n const project = await client.registerProject(value!);\n io.output.write(`${project.projectId}\\t${project.displayName}\\t${project.workDir}\\n`);\n } else {\n await client.removeProject(asProjectId(value!));\n io.output.write(`removed ${value}\\n`);\n }\n return 0;\n } catch (cause) {\n io.error.write(`scorel project error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n } finally {\n client.disconnect();\n }\n};\n\nconst runLogs = async (\n options: LogsOptions,\n io: { sessionsDir: string; stateDir: string; output: NodeJS.WritableStream; error: NodeJS.WritableStream },\n): Promise<number> => {\n const filePath = options.attach\n ? await findAttachDiagnosticsFilePath(io.stateDir, options.sessionId, options.remoteUrl)\n : join(io.sessionsDir, `${options.sessionId}.log`);\n let content: string;\n try {\n content = await readFile(filePath, \"utf8\");\n } catch (cause) {\n io.error.write(`scorel logs error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n }\n const lines = content.split(/\\r?\\n/).filter((line) => line.length > 0);\n const selected = options.tail === undefined ? lines : lines.slice(-options.tail);\n if (selected.length > 0) {\n io.output.write(`${selected.join(\"\\n\")}\\n`);\n }\n return 0;\n};\n\ntype AttachOptions = {\n sessionId: ReturnType<typeof asSessionId>;\n remoteUrl: string;\n token: string;\n};\n\nconst runAttach = async (\n options: AttachOptions,\n io: { stateDir: string; cwd: string; input: NodeJS.ReadableStream; output: NodeJS.WritableStream; error: NodeJS.WritableStream },\n): Promise<number> => {\n const transport = new WsTransport({ url: options.remoteUrl, token: options.token });\n const client = new DaemonClient(transport, {\n clientId: asClientId(\"client_cli_attach\"),\n });\n const diagnostics = new AttachDiagnostics(io.stateDir, options.sessionId);\n try {\n diagnostics.record(\"attach_connect_started\", {\n remoteUrl: options.remoteUrl,\n });\n await client.connect();\n const loaded = await client.loadSession(options.sessionId);\n const renderer = new AttachEventRenderer(io.output, io.error);\n const cacheScope = attachCacheScope(client.connectionIdentity, loaded.meta.projectId);\n diagnostics.setScope(cacheScope);\n diagnostics.record(\"attach_connect_succeeded\", {\n scopeKind: cacheScope.kind,\n scopeLocator: cacheScope.locator,\n deviceId: client.connectionIdentity?.deviceId,\n deviceDisplayName: client.connectionIdentity?.deviceDisplayName,\n projectId: loaded.meta.projectId,\n });\n diagnostics.record(\"attach_cache_scope_resolved\", {\n scopeKind: cacheScope.kind,\n scopeLocator: cacheScope.locator,\n displayName: cacheScope.displayName,\n });\n const cacheSnapshot = await readAttachCache(io.stateDir, cacheScope, options.sessionId);\n diagnostics.record(\"attach_cache_read\", {\n persistentEvents: cacheSnapshot.events.length,\n transients: cacheSnapshot.transients.length,\n });\n const persistCache = async (): Promise<void> => {\n await writeAttachCache(io.stateDir, cacheScope, options.sessionId, cacheSnapshot);\n diagnostics.record(\"attach_cache_written\", {\n persistentEvents: cacheSnapshot.events.length,\n transients: cacheSnapshot.transients.length,\n });\n };\n const unsubscribe = client.subscribe((event) => {\n renderer.renderLive(event);\n updateAttachCacheSnapshot(cacheSnapshot, event);\n diagnostics.record(\"attach_event_rendered\", {\n type: event.type,\n seq: \"seq\" in event ? event.seq : undefined,\n });\n void persistCache();\n });\n diagnostics.record(\"attach_session_loaded\");\n renderer.writeLine(`scorel attach resumed session ${options.sessionId}`);\n renderer.renderBacklog(cacheSnapshot.events);\n renderer.renderTransientBacklog(cacheSnapshot.transients);\n const persistentLastSeq = highestSeq(cacheSnapshot.events);\n const resync = await client.resync({\n persistentLastSeq,\n streamLastSeq: highestCachedStreamSeq(cacheSnapshot),\n });\n diagnostics.record(\"attach_resync_finished\", {\n mode: resync.mode,\n throughSeq: resync.throughSeq,\n persistentLastSeq,\n streamLastSeq: highestCachedStreamSeq(cacheSnapshot),\n receivedEvents: client.getEvents().length,\n });\n if (resync.mode === \"full_reload\" && cacheSnapshot.events.length > 0) {\n renderer.writeLine(\"scorel attach authoritative reload follows cached history\");\n }\n renderer.renderBacklog(client.getEvents());\n cacheSnapshot.events = mergePersistentEvents([...cacheSnapshot.events, ...client.getEvents()]);\n cacheSnapshot.transients = removeCompletedTransients(cacheSnapshot.transients, cacheSnapshot.events);\n await persistCache();\n renderer.promptIfInteractive();\n const rl = createInterface({ input: io.input as Readable, crlfDelay: Infinity });\n const inputQueue = new AsyncInputQueue();\n const inputWorker = (async () => {\n for (;;) {\n const line = await inputQueue.next();\n if (line === null) {\n return;\n }\n if (line === \".exit\" || line === \".quit\") {\n return;\n }\n diagnostics.record(\"attach_send_message_started\", { contentLength: line.length });\n try {\n await client.sendMessage(line);\n diagnostics.record(\"attach_send_message_finished\", { contentLength: line.length });\n } catch (cause) {\n diagnostics.record(\"attach_send_message_error\", {\n message: cause instanceof Error ? cause.message : String(cause),\n });\n throw cause;\n }\n renderer.endLine();\n renderer.promptIfInteractive();\n }\n })();\n try {\n for await (const rawLine of rl) {\n const line = rawLine.trim();\n if (line.length === 0) {\n continue;\n }\n inputQueue.push(line);\n if (line === \".exit\" || line === \".quit\") {\n break;\n }\n }\n inputQueue.close();\n await inputWorker;\n } finally {\n inputQueue.close();\n unsubscribe();\n rl.close();\n await persistCache();\n }\n diagnostics.record(\"attach_disconnected\");\n await diagnostics.flush();\n client.disconnect();\n return 0;\n } catch (cause) {\n diagnostics.record(\"attach_failed\", { message: cause instanceof Error ? cause.message : String(cause) });\n await diagnostics.flush();\n io.error.write(`scorel attach error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n }\n};\n\ntype AttachCacheScope = {\n kind: \"remote\";\n locator: string;\n displayName?: string;\n};\n\ntype AttachCacheFile = {\n version: 1;\n scope: AttachCacheScope;\n sessionId: string;\n events: PersistentEvent[];\n transients?: CachedTransientMessage[];\n};\n\ntype CachedTransientMessage = {\n eventId: string;\n seq: number;\n text: string;\n};\n\ntype AttachCacheSnapshot = {\n events: PersistentEvent[];\n transients: CachedTransientMessage[];\n};\n\nconst attachCacheScope = (\n identity: { deviceId?: DeviceId; deviceDisplayName?: string },\n projectId: string,\n): AttachCacheScope => {\n if (!identity.deviceId) {\n throw new Error(\"Remote daemon handshake is missing deviceId\");\n }\n return {\n kind: \"remote\",\n locator: `device:${identity.deviceId}/project:${projectId}`,\n displayName: identity.deviceDisplayName,\n };\n};\n\nconst attachCacheFilePath = (stateDir: string, scope: AttachCacheScope, sessionId: ReturnType<typeof asSessionId>): string => {\n const scopeKey = createHash(\"sha256\").update(`${scope.kind}\\0${scope.locator}`).digest(\"hex\").slice(0, 24);\n return join(stateDir, \"attach-cache\", scopeKey, `${sessionId}.json`);\n};\n\nconst attachDiagnosticsFilePath = (\n stateDir: string,\n scope: AttachCacheScope,\n sessionId: ReturnType<typeof asSessionId>,\n): string => {\n const scopeKey = createHash(\"sha256\").update(`${scope.kind}\\0${scope.locator}`).digest(\"hex\").slice(0, 24);\n return join(stateDir, \"attach-cache\", scopeKey, `${sessionId}.log`);\n};\n\nconst findAttachDiagnosticsFilePath = async (\n stateDir: string,\n sessionId: ReturnType<typeof asSessionId>,\n _remoteUrl?: string,\n): Promise<string> => {\n const root = join(stateDir, \"attach-cache\");\n const scopes = await readdir(root).catch(() => []);\n for (const scope of scopes) {\n const candidate = join(root, scope, `${sessionId}.log`);\n try {\n await readFile(candidate, \"utf8\");\n return candidate;\n } catch {\n continue;\n }\n }\n return join(root, \"__missing__\", `${sessionId}.log`);\n};\n\nconst stateDirFromSessionsDir = (sessionsDir: string | undefined): string => {\n if (!sessionsDir) {\n return defaultStateDir();\n }\n return basename(sessionsDir) === \"sessions\" ? dirname(sessionsDir) : sessionsDir;\n};\n\nclass AttachDiagnostics {\n readonly #stateDir: string;\n readonly #sessionId: ReturnType<typeof asSessionId>;\n readonly #pendingLines: string[] = [];\n readonly #writes: Array<Promise<void>> = [];\n #scope: AttachCacheScope | undefined;\n\n constructor(stateDir: string, sessionId: ReturnType<typeof asSessionId>) {\n this.#stateDir = stateDir;\n this.#sessionId = sessionId;\n }\n\n setScope(scope: AttachCacheScope): void {\n this.#scope = scope;\n for (const line of this.#pendingLines.splice(0)) {\n this.#append(line);\n }\n }\n\n ensureScope(scope: AttachCacheScope): void {\n if (!this.#scope) {\n this.setScope(scope);\n }\n }\n\n record(event: string, fields: Record<string, unknown> = {}): void {\n const line = formatDiagnosticLine({\n ts: Date.now(),\n level: event.endsWith(\"_error\") || event.endsWith(\"_failed\") ? \"error\" : \"info\",\n event,\n sessionId: this.#sessionId,\n ...redactDiagnosticFields(fields),\n });\n if (!this.#scope) {\n this.#pendingLines.push(line);\n return;\n }\n this.#append(line);\n }\n\n async flush(): Promise<void> {\n if (this.#scope) {\n for (const line of this.#pendingLines.splice(0)) {\n this.#append(line);\n }\n }\n await Promise.allSettled(this.#writes);\n }\n\n #append(line: string): void {\n if (!this.#scope) {\n this.#pendingLines.push(line);\n return;\n }\n const filePath = attachDiagnosticsFilePath(this.#stateDir, this.#scope, this.#sessionId);\n this.#writes.push(\n mkdir(dirname(filePath), { recursive: true }).then(() => appendFile(filePath, `${line}\\n`, \"utf8\")),\n );\n }\n}\n\nconst readAttachCache = async (\n stateDir: string,\n scope: AttachCacheScope,\n sessionId: ReturnType<typeof asSessionId>,\n): Promise<AttachCacheSnapshot> => {\n try {\n const raw = JSON.parse(await readFile(attachCacheFilePath(stateDir, scope, sessionId), \"utf8\")) as AttachCacheFile;\n if (\n raw.version !== 1 ||\n raw.sessionId !== String(sessionId) ||\n raw.scope.kind !== scope.kind ||\n raw.scope.locator !== scope.locator ||\n !Array.isArray(raw.events)\n ) {\n return emptyAttachCacheSnapshot();\n }\n const events = mergePersistentEvents(raw.events);\n return {\n events,\n transients: removeCompletedTransients(\n Array.isArray(raw.transients) ? raw.transients.filter(isCachedTransientMessage) : [],\n events,\n ),\n };\n } catch (cause) {\n if (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") {\n return emptyAttachCacheSnapshot();\n }\n return emptyAttachCacheSnapshot();\n }\n};\n\nconst writeAttachCache = async (\n stateDir: string,\n scope: AttachCacheScope,\n sessionId: ReturnType<typeof asSessionId>,\n snapshot: AttachCacheSnapshot,\n): Promise<void> => {\n const filePath = attachCacheFilePath(stateDir, scope, sessionId);\n const uniqueEvents = mergePersistentEvents(snapshot.events);\n const transients = removeCompletedTransients(snapshot.transients, uniqueEvents);\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(\n filePath,\n `${JSON.stringify({ version: 1, scope, sessionId: String(sessionId), events: uniqueEvents, transients } satisfies AttachCacheFile, null, 2)}\\n`,\n );\n};\n\nconst emptyAttachCacheSnapshot = (): AttachCacheSnapshot => ({ events: [], transients: [] });\n\nconst mergePersistentEvents = (events: PersistentEvent[]): PersistentEvent[] => {\n const byId = new Map<string, PersistentEvent>();\n for (const event of events) {\n byId.set(String(event.id), event);\n }\n return [...byId.values()].sort((left, right) => Number(left.seq) - Number(right.seq));\n};\n\nconst highestSeq = (events: PersistentEvent[]): ReturnType<typeof asSeq> =>\n asSeq(events.reduce((max, event) => Math.max(max, Number(event.seq)), 0));\n\nconst highestCachedStreamSeq = (snapshot: AttachCacheSnapshot): ReturnType<typeof asSeq> =>\n asSeq(Math.max(Number(highestSeq(snapshot.events)), ...snapshot.transients.map((event) => event.seq), 0));\n\nconst updateAttachCacheSnapshot = (snapshot: AttachCacheSnapshot, event: ScorelEvent): void => {\n if (\"id\" in event) {\n snapshot.events = mergePersistentEvents([...snapshot.events, event]);\n snapshot.transients = removeCompletedTransients(snapshot.transients, snapshot.events);\n return;\n }\n if (event.type !== \"text_delta\") {\n return;\n }\n const existing = snapshot.transients.find((candidate) => candidate.eventId === String(event.eventId));\n if (existing) {\n existing.seq = Math.max(existing.seq, Number(event.seq));\n existing.text += event.delta;\n } else {\n snapshot.transients.push({\n eventId: String(event.eventId),\n seq: Number(event.seq),\n text: event.delta,\n });\n }\n};\n\nconst removeCompletedTransients = (\n transients: CachedTransientMessage[],\n events: PersistentEvent[],\n): CachedTransientMessage[] => {\n const persistentIds = new Set(events.map((event) => String(event.id)));\n return transients.filter((transient) => !persistentIds.has(transient.eventId) && transient.text.length > 0);\n};\n\nconst isCachedTransientMessage = (value: unknown): value is CachedTransientMessage =>\n typeof value === \"object\" &&\n value !== null &&\n \"eventId\" in value &&\n \"seq\" in value &&\n \"text\" in value &&\n typeof value.eventId === \"string\" &&\n typeof value.seq === \"number\" &&\n typeof value.text === \"string\";\n\nclass AsyncInputQueue {\n readonly #items: string[] = [];\n #closed = false;\n #notify: (() => void) | undefined;\n\n push(line: string): void {\n if (this.#closed) {\n return;\n }\n this.#items.push(line);\n this.#notify?.();\n this.#notify = undefined;\n }\n\n close(): void {\n this.#closed = true;\n this.#notify?.();\n this.#notify = undefined;\n }\n\n async next(): Promise<string | null> {\n while (this.#items.length === 0 && !this.#closed) {\n await new Promise<void>((resolve) => {\n this.#notify = resolve;\n });\n }\n return this.#items.shift() ?? null;\n }\n}\n\nconst parseAttachOptions = (argv: string[]): AttachOptions => {\n let sessionId = asSessionId(\"ses_default\");\n let remoteUrl: string | undefined;\n let token: string | undefined;\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--session\") {\n sessionId = asSessionId(requireValue(argv, index, \"--session\"));\n index += 1;\n continue;\n }\n if (arg === \"--remote\") {\n remoteUrl = requireValue(argv, index, \"--remote\");\n index += 1;\n continue;\n }\n if (arg === \"--token\") {\n token = requireValue(argv, index, \"--token\");\n index += 1;\n continue;\n }\n throw new Error(`Unknown attach option: ${arg}`);\n }\n if (!remoteUrl) {\n throw new Error(\"--remote is required (e.g. --remote ws://127.0.0.1:7777)\");\n }\n if (!token) {\n throw new Error(\"--token is required with --remote\");\n }\n return { sessionId, remoteUrl, token };\n};\n\nconst parseLogsOptions = (argv: string[]): LogsOptions => {\n let sessionId: ReturnType<typeof asSessionId> | undefined;\n let tail: number | undefined;\n let attach = false;\n let remoteUrl: string | undefined;\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--attach\") {\n attach = true;\n continue;\n }\n if (arg === \"--remote\") {\n remoteUrl = requireValue(argv, index, \"--remote\");\n index += 1;\n continue;\n }\n if (arg === \"--session\") {\n sessionId = asSessionId(requireValue(argv, index, \"--session\"));\n index += 1;\n continue;\n }\n if (arg === \"--tail\") {\n tail = Number(requireValue(argv, index, \"--tail\"));\n if (!Number.isInteger(tail) || tail < 0) {\n throw new Error(\"--tail must be a non-negative integer\");\n }\n index += 1;\n continue;\n }\n throw new Error(`Unknown logs option: ${arg}`);\n }\n if (!sessionId) {\n throw new Error(\"--session requires a value\");\n }\n return { sessionId, tail, attach, remoteUrl };\n};\n\nexport const runChat = async (options: ChatOptions, io: CliIo): Promise<number> => {\n const configScope = { scorelHomeDir: options.stateDir };\n const loadProjectConfig = async (project: { workDir: string }) =>\n options.config ?? (await loadScorelConfig({ cwd: project.workDir, ...configScope }));\n const loadProjectConfigProfile = async (project: { workDir: string }) =>\n options.config ?? (await loadScorelConfigProfile({ cwd: project.workDir, ...configScope }));\n const daemon = new ScorelHost({\n sessionsDir: options.sessionsDir,\n projectsPath: join(options.stateDir, \"projects.json\"),\n deviceId: asDeviceId(\"device_local\"),\n scorelHomeDir: options.stateDir,\n loadConfig: async ({ project }) => loadProjectConfig(project),\n loadConfigProfile: async ({ project }) => loadProjectConfigProfile(project),\n createRuntime: async ({ sessionId, project, selectedModel, purpose }) => createRealRuntime({\n cwd: project.workDir,\n config: await loadProjectConfig(project),\n sessionsDir: options.sessionsDir,\n sessionId,\n modelSelection: selectedModel ? { modelId: selectedModel.modelId, role: selectedModel.role } : undefined,\n includeTools: purpose === \"chat\",\n }),\n });\n const client = new DaemonClient(createEmbeddedTransport(daemon), {\n clientId: asClientId(\"client_cli\"),\n });\n\n await daemon.start();\n const project = await daemon.registerProject(options.cwd);\n let inFlight = false;\n let rlClose = (): void => undefined;\n const sigintHandler = createSigintHandler({\n isInFlight: () => inFlight,\n cancel: () => client.cancel().then(() => undefined).catch(() => undefined),\n output: io.output,\n exit: () => rlClose(),\n });\n process.on(\"SIGINT\", sigintHandler);\n try {\n await client.connect(options.sessionId);\n const resumed = await loadOrCreateSession(client, options, project.projectId);\n io.error.write(`scorel chat ${resumed ? \"resumed\" : \"created\"} session ${options.sessionId}\\n`);\n\n const rl = createInterface({ input: io.input as Readable, crlfDelay: Infinity });\n rlClose = () => rl.close();\n promptIfInteractive(io.output);\n for await (const rawLine of rl) {\n const line = rawLine.trim();\n if (line.length === 0) {\n promptIfInteractive(io.output);\n continue;\n }\n if (line === \".exit\" || line === \".quit\") {\n break;\n }\n\n const unsubscribe = client.subscribe((event) => {\n if (event.type === \"text_delta\") {\n io.output.write(event.delta);\n }\n if (event.type === \"tool_result\") {\n writeToolResult(io.output, event);\n }\n if (event.type === \"error\") {\n writeEventError(io.error, event);\n }\n });\n inFlight = true;\n try {\n await client.sendMessage(line);\n io.output.write(\"\\n\");\n } finally {\n inFlight = false;\n unsubscribe();\n }\n promptIfInteractive(io.output);\n }\n rl.close();\n return 0;\n } catch (cause) {\n io.error.write(`scorel chat error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n } finally {\n process.off(\"SIGINT\", sigintHandler);\n client.disconnect();\n await daemon.shutdown();\n }\n};\n\nexport type SigintHandlerOptions = {\n /** Returns true when a chat turn is mid-flight; daemon should be cancelled. */\n isInFlight: () => boolean;\n /** Best-effort daemon cancel (no rejection surfaces). */\n cancel: () => Promise<void>;\n /** Stream to write the cancellation marker to. */\n output: NodeJS.WritableStream;\n /** Called when the handler decides to exit the REPL (idle Ctrl-C). */\n exit: () => void;\n};\n\n/**\n * Build a SIGINT handler that cancels in-flight turns without exiting; a\n * subsequent SIGINT during idle exits via `exit`. Factored out so unit tests\n * can drive it without poking real process signals.\n */\nexport const createSigintHandler = (options: SigintHandlerOptions): () => void => {\n return () => {\n if (options.isInFlight()) {\n options.output.write(\"\\n[cancelled]\\n\");\n void options.cancel().catch(() => undefined);\n return;\n }\n options.exit();\n };\n};\n\nconst loadOrCreateSession = async (\n client: DaemonClient,\n options: ChatOptions,\n projectId: ReturnType<typeof asProjectId>,\n): Promise<boolean> => {\n try {\n await client.loadSession(options.sessionId);\n return true;\n } catch {\n await client.createSession({\n sessionId: options.sessionId,\n meta: { projectId },\n });\n return false;\n }\n};\n\nconst parseChatOptions = (argv: string[]): ChatOptions => {\n let sessionId = asSessionId(\"ses_default\");\n let cwd = process.cwd();\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--session\") {\n sessionId = asSessionId(requireValue(argv, index, \"--session\"));\n index += 1;\n continue;\n }\n if (arg === \"--cwd\") {\n cwd = requireValue(argv, index, \"--cwd\");\n index += 1;\n continue;\n }\n throw new Error(`Unknown chat option: ${arg}`);\n }\n\n const sessionsDir = defaultSessionsDir();\n return { sessionId, sessionsDir, stateDir: stateDirFromSessionsDir(sessionsDir), cwd };\n};\n\nconst requireValue = (argv: string[], index: number, flag: string): string => {\n const value = argv[index + 1];\n if (!value) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n};\n\nconst promptIfInteractive = (output: NodeJS.WritableStream): void => {\n if ((output as Writable & { isTTY?: boolean }).isTTY) {\n output.write(\"> \");\n }\n};\n\nconst writeUsage = (output: NodeJS.WritableStream): void => {\n output.write(\n [\n \"Usage: scorel chat [--session <id>] [--cwd <dir>]\",\n \" scorel [--session <id>] [--cwd <dir>]\",\n \" scorel attach --session <id> --remote <ws-url> --token <token>\",\n \" scorel host start [--host <h>] [--port <p>] [--token <t>] [--project <dir>]\",\n \" [--relay <relay-url> | --no-relay] [--replace] [--idle-timeout-ms <ms>]\",\n \" scorel host serve [--host <h>] [--port <p>] [--token <t>] [--project <dir>]\",\n \" [--relay <relay-url> | --no-relay] [--replace] [--idle-timeout-ms <ms>]\",\n \" scorel host status [--show-token]\",\n \" scorel host stop\",\n \" scorel host reset\",\n \" scorel pair <pair-code> [--relay <relay-url>]\",\n \" scorel relay serve [--host <h>] [--port <p>] [--data-dir <dir>]\",\n \" scorel webui [--port <p>] [--host <h>]\",\n \" scorel up [--daemon-port <p>] [--webui-port <p>] [--cwd <d>]\",\n \" scorel update\",\n \" scorel upgrade\",\n \" scorel version\",\n \" scorel logs [--attach] --session <id> [--remote <ws-url>] [--tail <n>]\",\n \" scorel project list\",\n \" scorel project add <dir>\",\n \" scorel project remove <project-id>\",\n ].join(\"\\n\") + \"\\n\",\n );\n};\n\nconst writeProjectUsage = (output: NodeJS.WritableStream): void => {\n output.write(\"Usage: scorel project list | add <dir> | remove <project-id>\\n\");\n};\n\nconst writeEventError = (output: NodeJS.WritableStream, event: ErrorEvent): void => {\n output.write(`scorel event error: ${event.message}\\n`);\n};\n\nconst writeToolResult = (output: NodeJS.WritableStream, event: Extract<ScorelEvent, { type: \"tool_result\" }>): void => {\n const block = event.message.content.find((candidate) => candidate.type === \"tool_result\");\n if (!block || typeof block.result !== \"object\" || block.result === null) {\n return;\n }\n const result = block.result as { content?: Array<{ type: string; text?: string }> };\n const text = result.content?.find((candidate) => candidate.type === \"text\")?.text ?? \"\";\n output.write(`\\n[tool:${block.toolName}]${block.isError ? \" error\" : \"\"}\\n${text}\\n`);\n};\n\nconst redactDiagnosticFields = (fields: Record<string, unknown>): Record<string, unknown> =>\n Object.fromEntries(\n Object.entries(fields).map(([key, value]) => [\n key,\n /token|secret|api[-_]?key|authorization/i.test(key) ? \"[redacted]\" : value,\n ]),\n );\n\nconst formatDiagnosticLine = (fields: Record<string, unknown>): string =>\n Object.entries(fields)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${key}=${formatDiagnosticValue(value)}`)\n .join(\" \");\n\nconst formatDiagnosticValue = (value: unknown): string => {\n const text = typeof value === \"string\" ? value : String(value);\n return /^[A-Za-z0-9_./:@+-]+$/.test(text) ? text : JSON.stringify(text);\n};\n\nclass AttachEventRenderer {\n readonly #output: NodeJS.WritableStream;\n readonly #error: NodeJS.WritableStream;\n readonly #printedPersistentIds = new Set<string>();\n readonly #streamedMessageIds = new Set<string>();\n #atLineStart = true;\n\n constructor(output: NodeJS.WritableStream, error: NodeJS.WritableStream) {\n this.#output = output;\n this.#error = error;\n }\n\n renderBacklog(events: PersistentEvent[]): void {\n for (const event of events) {\n this.#render(event);\n }\n }\n\n renderTransientBacklog(transients: CachedTransientMessage[]): void {\n for (const transient of transients) {\n this.#streamedMessageIds.add(transient.eventId);\n this.#write(transient.text);\n }\n }\n\n renderLive(event: ScorelEvent): void {\n this.#render(event);\n }\n\n endLine(): void {\n if (!this.#atLineStart) {\n this.#write(\"\\n\");\n }\n }\n\n writeLine(text: string): void {\n this.#ensureLineStart();\n this.#write(`${text}\\n`);\n }\n\n promptIfInteractive(): void {\n if ((this.#output as Writable & { isTTY?: boolean }).isTTY) {\n this.#write(\"> \");\n }\n }\n\n #render(event: ScorelEvent): void {\n if (event.type === \"text_delta\") {\n this.#streamedMessageIds.add(String(event.eventId));\n this.#write(event.delta);\n return;\n }\n if (event.type === \"error\") {\n this.endLine();\n writeEventError(this.#error, event);\n return;\n }\n if (!(\"id\" in event) || this.#printedPersistentIds.has(String(event.id))) {\n return;\n }\n this.#printedPersistentIds.add(String(event.id));\n\n if (event.type === \"user_message\") {\n this.#ensureLineStart();\n this.#write(`[user] ${blocksToText(event.message.content)}\\n`);\n return;\n }\n if (event.type === \"assistant_message\") {\n if (this.#streamedMessageIds.has(String(event.id))) {\n this.endLine();\n return;\n }\n const text = blocksToText(event.message.content);\n if (text.length > 0) {\n this.#ensureLineStart();\n this.#write(`${text}\\n`);\n }\n return;\n }\n if (event.type === \"tool_result\") {\n this.#ensureLineStart();\n writeToolResult(this.#output, event);\n this.#atLineStart = true;\n }\n }\n\n #ensureLineStart(): void {\n if (!this.#atLineStart) {\n this.#write(\"\\n\");\n }\n }\n\n #write(text: string): void {\n this.#output.write(text);\n this.#atLineStart = text.endsWith(\"\\n\");\n }\n}\n\nconst blocksToText = (blocks: ContentBlock[]): string =>\n blocks\n .flatMap((block): string[] => {\n if (block.type === \"text\") {\n if (block.visibility === \"model\") {\n return [];\n }\n return [block.text];\n }\n if (block.type === \"system_reminder\" && block.visibility !== \"model\") {\n return [block.text];\n }\n return [];\n })\n .join(\"\");\n\nconst isCliEntrypoint = async (): Promise<boolean> => {\n if (!process.argv[1]) return false;\n const [argvPath, modulePath] = await Promise.all([\n realpath(process.argv[1]).catch(() => process.argv[1]),\n realpath(fileURLToPath(import.meta.url)).catch(() => fileURLToPath(import.meta.url)),\n ]);\n return argvPath === modulePath;\n};\n\nif (process.env.SCOREL_SKIP_INDEX_ENTRY !== \"1\" && await isCliEntrypoint()) {\n runCli(process.argv.slice(2)).then((code) => {\n process.exitCode = code;\n });\n}\n", "#!/usr/bin/env node\nprocess.env.SCOREL_SKIP_INDEX_ENTRY = \"1\";\n\nconst { runCli } = await import(\"./index.js\");\n\nrunCli(process.argv.slice(2)).then((code) => {\n process.exitCode = code;\n});\n"],
5
- "mappings": "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",
6
- "names": ["init_src", "resolve", "project", "dirname", "join", "readdir", "realpath", "stat", "errorMessage", "readFile", "readdir", "join", "isRecord", "isNodeError", "readFile", "join", "section", "randomUUID", "mkdir", "readFile", "rename", "stat", "writeFile", "basename", "dirname", "isRecord", "selected", "Type", "isRecord", "Type", "optionalString", "isRecord", "readFile", "dirname", "resolve", "requireString", "requireIdentifier", "isRecord", "readdir", "readFile", "homedir", "dirname", "join", "resolve", "isNodeErrorCode", "section", "mkdir", "readFile", "writeFile", "homedir", "join", "Type", "requireString", "optionalNumber", "optionalString", "isRecord", "isNodeErrorCode", "createHash", "appendFile", "mkdir", "readFile", "writeFile", "dirname", "join", "isRecord", "section", "createHash", "existsSync", "readdir", "readFile", "stat", "homedir", "dirname", "join", "resolve", "Type", "findGitRoot", "isNodeErrorCode", "init_src", "randomUUID", "mkdir", "readFile", "writeFile", "join", "WebSocket", "resolve", "WebSocket", "waitForOpen", "resolve", "execFile", "existsSync", "appendFile", "mkdir", "readFile", "readdir", "rename", "rm", "writeFile", "userInfo", "basename", "dirname", "join", "resolve", "promisify", "execFileAsync", "isNodeErrorCode", "compactLine", "nonNegativeInteger", "resolveDefaultShell", "shellCommandArgs", "userShell", "isRecord", "normalizeMarkdownFile", "init_src", "result", "homedir", "join", "init_src", "readFile", "dirname", "join", "promisify", "execFileAsync", "execFile", "randomUUID", "homedir", "dirname", "join", "fileURLToPath", "defaultStateDir", "requireValue", "init_src", "resolve", "mkdir", "readFile", "writeFile", "join", "WebSocketServer", "sendJson", "closeWebSocketServer", "resolve", "homedir", "join", "DEFAULT_HOST", "DEFAULT_PORT", "requireValue", "resolve", "spawn", "homedir", "dirname", "join", "fileURLToPath", "defaultStateDir", "requireValue", "waitForDaemonReady", "detachBackgroundDaemon", "nodeEntrypointArgs", "init_src", "spawn", "existsSync", "dirname", "resolve", "fileURLToPath", "DEFAULT_PORT", "DEFAULT_HOST", "requireValue", "createHash", "appendFile", "mkdir", "readFile", "realpath", "readdir", "writeFile", "homedir", "fileURLToPath", "basename", "dirname", "join", "defaultStateDir", "requireValue", "formatDiagnosticLine", "formatDiagnosticValue", "init_src", "resolve", "project", "runCli"]
4
+ "sourcesContent": ["export type Brand<TValue, TBrand extends string> = TValue & { readonly __brand: TBrand };\n\nexport type SessionId = Brand<string, \"SessionId\">;\nexport type EventId = Brand<string, \"EventId\">;\nexport type ClientId = Brand<string, \"ClientId\">;\nexport type DeviceId = Brand<string, \"DeviceId\">;\nexport type ProjectId = Brand<string, \"ProjectId\">;\nexport type RequestId = Brand<string, \"RequestId\">;\nexport type Seq = Brand<number, \"Seq\">;\n\nexport const protocolVersion = 5 as const;\n\nexport const asSessionId = (value: string): SessionId => value as SessionId;\nexport const asEventId = (value: string): EventId => value as EventId;\nexport const asClientId = (value: string): ClientId => value as ClientId;\nexport const asDeviceId = (value: string): DeviceId => value as DeviceId;\nexport const asProjectId = (value: string): ProjectId => value as ProjectId;\nexport const asRequestId = (value: string): RequestId => value as RequestId;\nexport const asSeq = (value: number): Seq => value as Seq;\n", "export type MessageRole = \"system\" | \"user\" | \"assistant\" | \"tool_result\";\n\nexport type TextContentBlock = {\n type: \"text\";\n text: string;\n visibility?: \"display\" | \"model\";\n};\n\nexport type ThinkingContentBlock = {\n type: \"thinking\";\n text: string;\n};\n\nexport type ToolCallContentBlock = {\n type: \"tool_call\";\n toolCallId: string;\n toolName: string;\n args: unknown;\n};\n\nexport type ToolResultContentBlock = {\n type: \"tool_result\";\n toolCallId: string;\n toolName: string;\n result: unknown;\n isError?: boolean;\n};\n\nexport type SystemReminderKind =\n | \"attachment\"\n | \"time\"\n | \"message_ref\"\n | \"skill_listing\"\n | \"skill_delta\"\n | \"memory\"\n | \"channel_context\"\n | \"steer\"\n | \"todo_nudge\"\n | \"runtime_notice\"\n | \"compact_summary\";\n\nexport type SystemReminderOrigin = \"system\" | \"user\" | \"tool\" | \"skill\";\n\nexport type SystemReminderVisibility = \"model\" | \"display\" | \"compact\";\n\nexport type SystemReminderScope = \"message\" | \"turn\" | \"next_model_call\" | \"session\";\n\nexport type SystemReminderContentBlock = {\n type: \"system_reminder\";\n kind: SystemReminderKind;\n origin: SystemReminderOrigin;\n text: string;\n visibility: SystemReminderVisibility;\n scope: SystemReminderScope;\n data?: Record<string, unknown>;\n};\n\nexport type ContentBlock =\n | TextContentBlock\n | ThinkingContentBlock\n | ToolCallContentBlock\n | ToolResultContentBlock\n | SystemReminderContentBlock;\n\nexport type Usage = {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n};\n\nexport type StopReason = \"end_turn\" | \"tool_call\" | \"cancelled\" | \"max_tokens\" | \"error\" | \"unknown\";\n\nexport type ScorelMessage = {\n role: MessageRole;\n content: ContentBlock[];\n usage?: Usage;\n stopReason?: StopReason;\n meta?: Record<string, unknown>;\n};\n", "import type { ClientId, EventId, ProjectId, Seq, SessionId } from \"./ids.js\";\nimport type { ScorelMessage, StopReason, Usage } from \"./messages.js\";\n\nexport type CreateSessionMeta = {\n projectId: ProjectId;\n title?: string;\n model?: string;\n modelSelection?: ModelSelectionInput;\n};\n\nexport type SessionMeta = {\n projectId: ProjectId;\n title?: string;\n model?: string;\n selectedModel?: SelectedModelSummary;\n createdAt?: number;\n updatedAt?: number;\n};\n\nexport type ModelRole = \"primary\" | \"standard\" | \"auxiliary\";\n\nexport type ModelSelectionInput = {\n modelId?: string;\n role?: ModelRole;\n};\n\nexport type AvailableModelSummary = {\n modelId: string;\n providerModelId: string;\n providerId: string;\n provider: string;\n id: string;\n displayName: string;\n roles: ModelRole[];\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsDeveloperRole?: boolean;\n supportsImageInput?: boolean;\n};\n\nexport type ProviderConnectionSummary = {\n providerId: string;\n type: \"builtin\" | \"custom\";\n provider: string;\n api?: \"openai-completions\" | \"openai-responses\" | \"google-generative-ai\" | \"anthropic-messages\";\n baseUrl?: string;\n apiKeyEnv?: string;\n credentialSource: \"env\" | \"direct\";\n credentialStatus: \"available\" | \"missing\";\n};\n\nexport type ProviderModelSummary = {\n providerModelId: string;\n providerId: string;\n provider: string;\n id: string;\n displayName: string;\n availableModelIds: string[];\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsDeveloperRole?: boolean;\n supportsImageInput?: boolean;\n};\n\nexport type ProviderCatalogModelSummary = {\n id: string;\n displayName: string;\n};\n\nexport type UpsertModelProfileInput = {\n projectId?: ProjectId;\n providerId?: string;\n providerType?: \"builtin\" | \"custom\";\n provider?: string;\n apiKeyEnv?: string;\n apiKey?: string;\n api?: \"openai-completions\" | \"openai-responses\" | \"google-generative-ai\" | \"anthropic-messages\";\n baseUrl?: string;\n modelId?: string;\n providerModelId?: string;\n providerModelKey?: string;\n availableModelId?: string;\n addToAvailable?: boolean;\n removeAvailableModelId?: string;\n displayName?: string;\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsDeveloperRole?: boolean;\n supportsImageInput?: boolean;\n roles?: Partial<Record<ModelRole, string>>;\n};\n\nexport type RemoveModelProviderInput = {\n projectId?: ProjectId;\n providerId: string;\n};\n\nexport type MemorySettings = {\n enabled: boolean;\n daily: boolean;\n sessionMemory: boolean;\n autoDream: boolean;\n promoteRoot: boolean;\n dreamIdleMinutes: number;\n autoCompactThreshold: number;\n};\n\nexport type RuntimeSettings = {\n tokenSavingRtk: boolean;\n rtkAvailable: boolean;\n rtkExecutable?: string;\n rtkVersion?: string;\n installStatus?: \"idle\" | \"installed\" | \"failed\";\n installMessage?: string;\n estimatedOutputTokens: number;\n estimatedSavedTokens: number;\n};\n\nexport type MemoryStatus = {\n projectId: ProjectId;\n dirty: boolean;\n running: boolean;\n lastDailyAppendAt?: number;\n lastDailyPath?: string;\n scheduledFor?: number;\n lastAttemptAt?: number;\n lastSuccessAt?: number;\n lastFailure?: {\n at: number;\n message: string;\n };\n lastProjectMemoryUpdateAt?: number;\n lastRootMemoryUpdateAt?: number;\n};\n\nexport type UpsertMemorySettingsInput = Partial<MemorySettings> & {\n projectId?: ProjectId;\n};\n\nexport type UpsertRuntimeSettingsInput = {\n projectId?: ProjectId;\n tokenSavingRtk?: boolean;\n};\n\nexport type ExtensionSettings = {\n extensionId: string;\n enabled: boolean;\n kind: \"im\";\n config: Record<string, string | number | boolean>;\n active: boolean;\n};\n\nexport type UpsertExtensionSettingsInput = {\n extensionId: string;\n enabled?: boolean;\n kind?: \"im\";\n config?: Record<string, string | number | boolean | undefined>;\n};\n\nexport type SelectedModelSummary = {\n modelId: string;\n role?: ModelRole;\n providerId: string;\n provider: string;\n id: string;\n displayName: string;\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsImageInput?: boolean;\n};\n\nexport type PersistentEventBase = {\n id: EventId;\n parentId: EventId | null;\n seq: Seq;\n sessionId: SessionId;\n clientId: ClientId;\n ts: number;\n};\n\nexport type SessionHeaderEvent = PersistentEventBase & {\n type: \"session_header\";\n protocolVersion: 5;\n meta: SessionMeta;\n};\n\nexport type UserMessageEvent = PersistentEventBase & {\n type: \"user_message\";\n message: ScorelMessage & { role: \"user\" };\n};\n\nexport type AssistantMessageEvent = PersistentEventBase & {\n type: \"assistant_message\";\n message: ScorelMessage & { role: \"assistant\" };\n};\n\nexport type ToolResultEvent = PersistentEventBase & {\n type: \"tool_result\";\n message: ScorelMessage & { role: \"tool_result\" };\n};\n\nexport type SessionTitleUpdatedEvent = PersistentEventBase & {\n type: \"session_title_updated\";\n title: string;\n source: \"model\" | \"user\";\n model?: SelectedModelSummary;\n derivedFrom?: {\n eventId: EventId;\n seq: Seq;\n };\n};\n\nexport type InstructionSectionKind = \"baseline\" | \"agents\" | \"memory\" | \"workspace\" | \"environment\" | \"time\";\n\nexport type InstructionSource = {\n sourceType: \"builtin\" | \"agents_md\" | \"memory\";\n path?: string;\n scope?: \"global_user\" | \"project\";\n priority?: number;\n content?: string;\n};\n\nexport type InstructionSection = {\n kind: InstructionSectionKind;\n frozenAt: number;\n sources?: InstructionSource[];\n renderedBlock: string;\n data?: Record<string, unknown>;\n};\n\nexport type InstructionSnapshot = {\n version: 1;\n cwd: string;\n sections: InstructionSection[];\n};\n\nexport type InstructionSnapshotEvent = PersistentEventBase & {\n type: \"instruction_snapshot\";\n snapshot: InstructionSnapshot;\n};\n\nexport type HarnessItemKind =\n | \"attachment\"\n | \"skill_listing\"\n | \"skill_delta\"\n | \"memory\"\n | \"channel_context\"\n | \"date_change\"\n | \"steer\"\n | \"runtime_notice\";\n\nexport type HarnessItemOrigin = \"user\" | \"system\" | \"tool\" | \"skill\";\n\nexport type HarnessItem = {\n kind: HarnessItemKind;\n origin: HarnessItemOrigin;\n content: string;\n visibility: \"display\" | \"hidden\" | \"compact\";\n data?: Record<string, unknown>;\n};\n\nexport type HarnessItemEvent = PersistentEventBase & {\n type: \"harness_item\";\n item: HarnessItem;\n};\n\nexport type CompactEvent = PersistentEventBase & {\n type: \"compact\";\n summary: string;\n compactedThrough: EventId;\n tokensBefore: number;\n tokensAfter: number;\n retainedEventCount: number;\n};\n\nexport type ContextControlEvent = PersistentEventBase & {\n type: \"context_control\";\n operation: \"hide_user_turn\";\n anchorUserEventId: EventId;\n throughEventId: EventId;\n actor: \"agent\" | \"user\" | \"system\";\n reason?: string;\n};\n\nexport type QueueName = \"follow_up\" | \"steer\";\n\nexport type QueueItem = {\n id: string;\n content: ScorelMessage[\"content\"];\n createdAt: number;\n updatedAt: number;\n clientId: ClientId;\n data?: Record<string, unknown>;\n};\n\nexport type QueueUpdateEvent = PersistentEventBase & {\n type: \"queue_update\";\n queue: QueueName;\n operation: \"rewrite\";\n items: QueueItem[];\n anchorEventId: EventId | null;\n};\n\nexport type SkillIndexEntry = {\n name: string;\n path: string;\n scope: \"user\" | \"project\" | \"extension\";\n description: string;\n displayName?: string;\n mtimeMs: number;\n size: number;\n contentHash: string;\n priority: number;\n shadowed?: boolean;\n diagnostics?: string[];\n};\n\nexport type SkillIndexSnapshotEvent = PersistentEventBase & {\n type: \"skill_index_snapshot\";\n anchorEventId: EventId | null;\n entries: SkillIndexEntry[];\n};\n\nexport type SkillIndexDeltaEvent = PersistentEventBase & {\n type: \"skill_index_delta\";\n anchorEventId: EventId | null;\n added: SkillIndexEntry[];\n changed: SkillIndexEntry[];\n removed: { name: string; previousPath: string }[];\n};\n\nexport type PersistentEvent =\n | SessionHeaderEvent\n | UserMessageEvent\n | AssistantMessageEvent\n | ToolResultEvent\n | SessionTitleUpdatedEvent\n | InstructionSnapshotEvent\n | HarnessItemEvent\n | CompactEvent\n | ContextControlEvent\n | QueueUpdateEvent\n | SkillIndexSnapshotEvent\n | SkillIndexDeltaEvent;\n\nexport type TransientEventBase = {\n seq: Seq;\n sessionId: SessionId;\n clientId: ClientId;\n ts: number;\n};\n\nexport type TurnStartEvent = TransientEventBase & {\n type: \"turn_start\";\n turnIndex: number;\n};\n\nexport type TurnEndEvent = TransientEventBase & {\n type: \"turn_end\";\n turnIndex: number;\n usage?: Usage;\n stopReason?: StopReason;\n};\n\nexport type MessageStartEvent = TransientEventBase & {\n type: \"message_start\";\n eventId: EventId;\n parentId: EventId | null;\n role: \"assistant\" | \"tool_result\";\n model?: string;\n};\n\nexport type MessageEndEvent = TransientEventBase & {\n type: \"message_end\";\n eventId: EventId;\n stopReason?: StopReason;\n usage?: Usage;\n};\n\nexport type TextDeltaEvent = TransientEventBase & {\n type: \"text_delta\";\n eventId: EventId;\n delta: string;\n};\n\nexport type ThinkingDeltaEvent = TransientEventBase & {\n type: \"thinking_delta\";\n eventId: EventId;\n delta: string;\n};\n\nexport type ErrorEvent = TransientEventBase & {\n type: \"error\";\n code: ErrorCode;\n message: string;\n requestId?: string;\n};\n\nexport type TransientEvent =\n | TurnStartEvent\n | TurnEndEvent\n | MessageStartEvent\n | MessageEndEvent\n | TextDeltaEvent\n | ThinkingDeltaEvent\n | ErrorEvent;\n\nexport type ScorelEvent = PersistentEvent | TransientEvent;\n\nexport type ErrorCode =\n | \"session_not_found\"\n | \"project_not_found\"\n | \"project_has_sessions\"\n | \"filesystem_error\"\n | \"runtime_busy\"\n | \"invalid_request\"\n | \"auth_failed\"\n | \"protocol_mismatch\"\n | \"resync_failed\"\n | \"invalid_event_id\"\n | \"conflict\"\n | \"transport_closed\"\n | \"internal_error\";\n\nexport type DaemonStatus = {\n running: boolean;\n model?: string;\n activeClients: ClientId[];\n sessionCount: number;\n uptimeMs: number;\n};\n\nexport type SessionSummary = {\n sessionId: SessionId;\n projectId: ProjectId;\n title?: string;\n model?: string;\n updatedAt: number;\n currentSeq: Seq;\n};\n\nexport type HostProject = {\n projectId: ProjectId;\n displayName: string;\n workDir: string;\n createdAt: number;\n updatedAt: number;\n};\n\nexport type DirectoryEntry = {\n name: string;\n path: string;\n kind: \"directory\";\n};\n\nexport type DirectoryListing = {\n path: string;\n parentPath?: string;\n entries: DirectoryEntry[];\n};\n", "import type { ClientId, DeviceId, EventId, ProjectId, RequestId, Seq, SessionId } from \"./ids.js\";\nimport type {\n CreateSessionMeta,\n DaemonStatus,\n DirectoryListing,\n ErrorCode,\n ExtensionSettings,\n HostProject,\n AvailableModelSummary,\n ModelRole,\n ProviderConnectionSummary,\n ProviderCatalogModelSummary,\n ProviderModelSummary,\n RemoveModelProviderInput,\n UpsertModelProfileInput,\n MemoryStatus,\n MemorySettings,\n ModelSelectionInput,\n RuntimeSettings,\n UpsertExtensionSettingsInput,\n UpsertMemorySettingsInput,\n UpsertRuntimeSettingsInput,\n PersistentEvent,\n QueueItem,\n QueueName,\n ScorelEvent,\n SessionMeta,\n SessionSummary,\n} from \"./events.js\";\nimport type { ContentBlock } from \"./messages.js\";\n\nexport type SendMessageOptions = {\n parentId?: EventId | null;\n runningBehavior?: QueueName;\n channelContext?: ChannelContext;\n modelSelection?: ModelSelectionInput;\n};\n\nexport type ChannelContext = {\n channel: string;\n externalConversationId: string;\n conversationType?: string;\n senderDisplayName?: string;\n mentionedBot?: boolean;\n data?: Record<string, unknown>;\n};\n\nexport type SendMessageResponse = {\n status: \"completed\" | \"queued\";\n userEventId?: EventId;\n assistantEventId?: EventId;\n queue?: QueueName;\n queueItemId?: string;\n};\n\nexport type ClientRequestMap = {\n create_session: {\n request: { sessionId?: SessionId; meta: CreateSessionMeta };\n response: { sessionId: SessionId };\n };\n load_session: {\n request: { sessionId: SessionId; lastSeq?: Seq };\n response: {\n sessionId: SessionId;\n activeLeafId: EventId | null;\n currentSeq: Seq;\n events: PersistentEvent[];\n meta: SessionMeta;\n };\n };\n list_sessions: {\n request: { projectId?: ProjectId; limit?: number };\n response: { sessions: SessionSummary[] };\n };\n list_projects: {\n request: Record<never, never>;\n response: { projects: HostProject[] };\n };\n list_models: {\n request: { projectId?: ProjectId };\n response: { providers: ProviderConnectionSummary[]; providerModels: ProviderModelSummary[]; models: AvailableModelSummary[]; roles: Record<ModelRole, string>; warnings?: string[] };\n };\n upsert_model_profile: {\n request: UpsertModelProfileInput;\n response: { providers: ProviderConnectionSummary[]; providerModels: ProviderModelSummary[]; models: AvailableModelSummary[]; roles: Record<ModelRole, string>; warnings?: string[] };\n };\n fetch_provider_models: {\n request: { projectId?: ProjectId; providerId: string };\n response: { models: ProviderCatalogModelSummary[] };\n };\n remove_model_provider: {\n request: RemoveModelProviderInput;\n response: { providers: ProviderConnectionSummary[]; providerModels: ProviderModelSummary[]; models: AvailableModelSummary[]; roles: Record<ModelRole, string>; warnings?: string[]; removed: boolean };\n };\n get_memory_settings: {\n request: { projectId?: ProjectId };\n response: { memory: MemorySettings };\n };\n get_memory_status: {\n request: { projectId: ProjectId };\n response: { status: MemoryStatus };\n };\n upsert_memory_settings: {\n request: UpsertMemorySettingsInput;\n response: { memory: MemorySettings };\n };\n get_runtime_settings: {\n request: { projectId?: ProjectId };\n response: { runtime: RuntimeSettings };\n };\n upsert_runtime_settings: {\n request: UpsertRuntimeSettingsInput;\n response: { runtime: RuntimeSettings };\n };\n get_extension_settings: {\n request: { extensionId: string };\n response: { extension: ExtensionSettings };\n };\n upsert_extension_settings: {\n request: UpsertExtensionSettingsInput;\n response: { extension: ExtensionSettings };\n };\n list_directories: {\n request: { path?: string };\n response: DirectoryListing;\n };\n register_project: {\n request: { workDir: string };\n response: { project: HostProject };\n };\n remove_project: {\n request: { projectId: ProjectId };\n response: { projectId: ProjectId; removed: boolean };\n };\n cancel: {\n request: { sessionId: SessionId };\n response: { sessionId: SessionId; cancelled: boolean };\n };\n send_message: {\n request: { sessionId: SessionId; content: string | ContentBlock[]; options?: SendMessageOptions };\n response: SendMessageResponse;\n };\n rewrite_queue: {\n request: { sessionId: SessionId; queue: QueueName; items: QueueItem[] };\n response: { sessionId: SessionId; queue: QueueName; items: QueueItem[] };\n };\n get_status: {\n request: { sessionId?: SessionId };\n response: DaemonStatus;\n };\n subscribe_events: {\n request: { sessionId: SessionId; lastSeq?: Seq };\n response: { currentSeq: Seq };\n };\n resync_events: {\n request: { sessionId: SessionId; persistentLastSeq?: Seq; streamLastSeq?: Seq; fromSeq?: Seq };\n response: {\n events: ScorelEvent[];\n throughSeq: Seq;\n mode: \"stream_resume\" | \"persistent_fallback\" | \"full_reload\";\n gapFromSeq?: Seq;\n gapToSeq?: Seq;\n };\n };\n};\n\nexport type ClientRequestType = keyof ClientRequestMap;\n\nexport type ClientRequest<TType extends ClientRequestType = ClientRequestType> = {\n [K in TType]: {\n type: K;\n requestId: RequestId;\n } & ClientRequestMap[K][\"request\"];\n}[TType];\n\nexport type ClientMessage =\n | ClientRequest\n | { type: \"disconnect\"; sessionId?: SessionId }\n | { type: \"ping\"; requestId?: RequestId };\n\nexport type ResponseFor<TRequest extends ClientRequest> =\n ClientResponse<TRequest[\"type\"]>;\n\nexport type ClientResponse<TType extends ClientRequestType = ClientRequestType> = {\n [K in TType]: {\n type: \"response\";\n requestType: K;\n requestId: RequestId;\n ok: true;\n data: ClientRequestMap[K][\"response\"];\n };\n}[TType];\n\nexport type ErrorResponse = {\n type: \"error\";\n requestId?: RequestId;\n ok: false;\n code: ErrorCode;\n message: string;\n};\n\nexport type DaemonMessage =\n | {\n type: \"connected\";\n clientId: ClientId;\n sessionId?: SessionId;\n currentSeq?: Seq;\n deviceId: DeviceId;\n deviceDisplayName?: string;\n }\n | { type: \"disconnected\"; reason: string }\n | { type: \"pong\"; requestId?: RequestId }\n | { type: \"event\"; event: ScorelEvent }\n | ClientResponse\n | ErrorResponse;\n\nexport const okResponse = <TRequest extends ClientRequest>(\n request: TRequest,\n data: ClientRequestMap[TRequest[\"type\"]][\"response\"],\n): ResponseFor<TRequest> => ({\n type: \"response\",\n requestType: request.type,\n requestId: request.requestId,\n ok: true,\n data,\n}) as ResponseFor<TRequest>;\n", "import type { ClientId, DeviceId, Seq, SessionId } from \"./ids.js\";\nimport type { ClientMessage, DaemonMessage } from \"./wire.js\";\n\nexport type ConnectParams = {\n clientId: ClientId;\n sessionId?: SessionId;\n persistentLastSeq?: Seq;\n streamLastSeq?: Seq;\n lastSeq?: Seq;\n};\n\nexport type ConnectResult = {\n clientId: ClientId;\n sessionId?: SessionId;\n currentSeq?: Seq;\n deviceId: DeviceId;\n deviceDisplayName?: string;\n};\n\nexport type RemoteEndpoint = {\n url: string;\n token: string;\n};\n\nexport type Unsubscribe = () => void;\n\nexport interface DaemonTransport {\n connect(params: ConnectParams): Promise<ConnectResult>;\n send(message: ClientMessage): void | Promise<void>;\n onMessage(handler: (message: DaemonMessage) => void): Unsubscribe;\n close(): void;\n}\n", "import type { ClientId, DeviceId, RequestId } from \"./ids.js\";\nimport type { ConnectParams } from \"./transport.js\";\nimport type { ClientMessage, DaemonMessage } from \"./wire.js\";\n\nexport type RelayDeviceRecord = {\n deviceId: DeviceId;\n label?: string;\n publicKey?: string;\n createdAt: number;\n updatedAt: number;\n};\n\nexport type RelayClientRecord = {\n clientId: ClientId;\n label?: string;\n publicKey?: string;\n createdAt: number;\n updatedAt: number;\n};\n\nexport type RelayBindingRecord = {\n deviceId: DeviceId;\n clientId: ClientId;\n createdAt: number;\n};\n\nexport type RelayAuthorizedDevice = RelayDeviceRecord & {\n online: boolean;\n};\n\nexport type RelayConnectPayload = ConnectParams & {\n type: \"connect\";\n};\n\nexport type RelayClientPayload = ClientMessage | RelayConnectPayload;\n\nexport type RelayEntryFrame =\n | { type: \"entry_hello\"; clientId: ClientId; label?: string; publicKey?: string }\n | { type: \"create_pair_session\"; requestId: RequestId; clientId?: ClientId }\n | { type: \"entry_to_device\"; deviceId: DeviceId; payload: RelayClientPayload }\n | { type: \"list_authorized_devices\"; requestId: RequestId };\n\nexport type RelayHostFrame =\n | { type: \"host_hello\"; deviceId: DeviceId; label?: string; publicKey?: string }\n | { type: \"redeem_pair\"; requestId: RequestId; pairCode: string; deviceId: DeviceId }\n | { type: \"host_to_entry\"; clientId: ClientId; payload: DaemonMessage };\n\nexport type RelayErrorCode =\n | \"invalid_request\"\n | \"not_announced\"\n | \"pair_not_found\"\n | \"pair_expired\"\n | \"unauthorized\"\n | \"device_offline\"\n | \"client_offline\"\n | \"internal_error\";\n\nexport type RelayResponse =\n | {\n type: \"relay_response\";\n requestId: RequestId;\n ok: true;\n data:\n | { pairCode: string; expiresAt: number }\n | { clientId: ClientId }\n | { devices: RelayAuthorizedDevice[] };\n }\n | {\n type: \"relay_error\";\n requestId?: RequestId;\n ok: false;\n code: RelayErrorCode;\n message: string;\n };\n\nexport type RelayToHostFrame = {\n type: \"relay_to_host\";\n clientId: ClientId;\n payload: RelayClientPayload;\n};\n\nexport type RelayToEntryFrame = {\n type: \"device_to_entry\";\n deviceId: DeviceId;\n payload: DaemonMessage;\n};\n\nexport type RelayServerFrame = RelayResponse | RelayToHostFrame | RelayToEntryFrame;\n", "export const protocolPackageName = \"@scorel/protocol\" as const;\n\nexport * from \"./ids.js\";\nexport * from \"./messages.js\";\nexport * from \"./events.js\";\nexport * from \"./wire.js\";\nexport * from \"./transport.js\";\nexport * from \"./relay.js\";\n", "import {\n type ClientId,\n type ClientMessage,\n type ConnectParams,\n type ConnectResult,\n type DaemonMessage,\n type DaemonTransport,\n type DeviceId,\n type RelayEntryFrame,\n type RelayServerFrame,\n type Unsubscribe,\n} from \"@scorel/protocol\";\n\nexport type RelayTransportOptions = {\n relayUrl: string;\n deviceId: DeviceId;\n clientId: ClientId;\n createWebSocket?: (url: string) => WebSocketLike;\n};\n\ntype WebSocketLike = {\n readyState: number;\n send(data: string): void;\n close(): void;\n addEventListener(type: \"open\", listener: () => void, options?: { once?: boolean }): void;\n addEventListener(type: \"message\", listener: (event: { data: unknown }) => void): void;\n addEventListener(type: \"error\", listener: (event: unknown) => void, options?: { once?: boolean }): void;\n removeEventListener(type: \"error\", listener: (event: unknown) => void): void;\n};\n\nconst websocketOpenState = 1;\n\nexport class RelayTransport implements DaemonTransport {\n readonly relayUrl: string;\n readonly deviceId: DeviceId;\n readonly clientId: ClientId;\n readonly #createWebSocket: (url: string) => WebSocketLike;\n readonly #handlers = new Set<(message: DaemonMessage) => void>();\n #socket: WebSocketLike | undefined;\n\n constructor(options: RelayTransportOptions) {\n this.relayUrl = options.relayUrl;\n this.deviceId = options.deviceId;\n this.clientId = options.clientId;\n this.#createWebSocket =\n options.createWebSocket ??\n ((url) => {\n if (typeof WebSocket === \"undefined\") {\n throw new Error(\"WebSocket is not available in this runtime\");\n }\n return new WebSocket(url);\n });\n }\n\n connect(params: ConnectParams): Promise<ConnectResult> {\n return new Promise((resolve, reject) => {\n const socket = this.#createWebSocket(this.relayUrl);\n this.#socket = socket;\n const rejectOnError = (event: unknown) => {\n socket.removeEventListener(\"error\", rejectOnError);\n reject(event instanceof Error ? event : new Error(\"Relay WebSocket connection failed\"));\n };\n socket.addEventListener(\"error\", rejectOnError, { once: true });\n socket.addEventListener(\"message\", (event) => {\n const frame = parseRelayFrame(event.data);\n if (frame.type === \"relay_error\") {\n reject(new Error(frame.message));\n return;\n }\n if (frame.type !== \"device_to_entry\") {\n return;\n }\n this.#emit(frame.payload);\n if (frame.payload.type === \"connected\") {\n socket.removeEventListener(\"error\", rejectOnError);\n resolve({\n clientId: frame.payload.clientId,\n sessionId: frame.payload.sessionId,\n currentSeq: frame.payload.currentSeq,\n deviceId: frame.payload.deviceId,\n deviceDisplayName: frame.payload.deviceDisplayName,\n });\n }\n });\n socket.addEventListener(\n \"open\",\n () => {\n this.#write({ type: \"entry_hello\", clientId: this.clientId });\n this.#write({\n type: \"entry_to_device\",\n deviceId: this.deviceId,\n payload: { type: \"connect\", ...params },\n });\n },\n { once: true },\n );\n });\n }\n\n send(message: ClientMessage): void {\n this.#write({\n type: \"entry_to_device\",\n deviceId: this.deviceId,\n payload: message,\n });\n }\n\n onMessage(handler: (message: DaemonMessage) => void): Unsubscribe {\n this.#handlers.add(handler);\n return () => {\n this.#handlers.delete(handler);\n };\n }\n\n close(): void {\n this.#socket?.close();\n this.#socket = undefined;\n this.#handlers.clear();\n }\n\n #write(frame: RelayEntryFrame): void {\n if (!this.#socket || this.#socket.readyState !== websocketOpenState) {\n throw new Error(\"RelayTransport is not connected\");\n }\n this.#socket.send(JSON.stringify(frame));\n }\n\n #emit(message: DaemonMessage): void {\n for (const handler of this.#handlers) {\n handler(message);\n }\n }\n}\n\nconst parseRelayFrame = (data: unknown): RelayServerFrame => {\n const text = typeof data === \"string\" ? data : data instanceof ArrayBuffer ? new TextDecoder().decode(data) : String(data);\n return JSON.parse(text) as RelayServerFrame;\n};\n", "import {\n asRequestId,\n asSeq,\n type ClientMessage,\n type ConnectParams,\n type ConnectResult,\n protocolPackageName,\n protocolVersion,\n type ClientId,\n type ClientRequest,\n type ClientRequestMap,\n type ClientRequestType,\n type ContentBlock,\n type CreateSessionMeta,\n type DaemonMessage,\n type DirectoryListing,\n type DaemonTransport,\n type DeviceId,\n type EventId,\n type ExtensionSettings,\n type HostProject,\n type AvailableModelSummary,\n type ModelRole,\n type MemoryStatus,\n type RuntimeSettings,\n type ProviderCatalogModelSummary,\n type ProviderConnectionSummary,\n type ProviderModelSummary,\n type UpsertModelProfileInput,\n type MemorySettings,\n type UpsertExtensionSettingsInput,\n type UpsertMemorySettingsInput,\n type UpsertRuntimeSettingsInput,\n type PersistentEvent,\n type ProjectId,\n type QueueItem,\n type QueueName,\n type ScorelEvent,\n type SendMessageOptions,\n type SendMessageResponse,\n type Seq,\n type SessionId,\n type SessionSummary,\n type Unsubscribe,\n} from \"@scorel/protocol\";\n\nexport const clientPackageName = \"@scorel/client\" as const;\nexport const clientProtocolDependency = protocolPackageName;\nexport const clientProtocolVersion = protocolVersion;\nexport type ClientDaemonTransport = DaemonTransport;\nexport { RelayTransport, type RelayTransportOptions } from \"./relay-transport.js\";\n\n/**\n * Public marker error for \"the underlying transport tried to write while not\n * connected\" (S0045). Every public DaemonClient method that funnels through\n * the transport catches synchronous transport throws and re-emits them as a\n * rejected Promise carrying this error class, so callers in browser /\n * React effect paths can handle a stale-token / closed-socket scenario as a\n * normal rejection instead of an unhandled runtime error.\n *\n * `code` is a const literal for stable string-based dispatch in webui\n * (`session.ts` classifyError, `sidebar.tsx` etc).\n */\nexport class TransportDisconnectedError extends Error {\n readonly code = \"transport_disconnected\" as const;\n constructor(message: string) {\n super(message);\n this.name = \"TransportDisconnectedError\";\n }\n}\n\nfunction isTransportDisconnectedError(\n cause: unknown,\n): cause is TransportDisconnectedError {\n if (cause instanceof TransportDisconnectedError) return true;\n if (typeof cause !== \"object\" || cause === null) return false;\n return (cause as { code?: unknown }).code === \"transport_disconnected\";\n}\n\nfunction toTransportError(cause: unknown): TransportDisconnectedError {\n if (cause instanceof TransportDisconnectedError) return cause;\n const message = cause instanceof Error ? cause.message : String(cause);\n return new TransportDisconnectedError(message);\n}\n\n/**\n * Heuristic: synchronous throws from `WsTransport.#write` carry the literal\n * \"WsTransport is not connected\" message. Other transport implementations\n * may throw for unrelated reasons (parse, schema, etc); only the\n * not-connected case is mapped to `TransportDisconnectedError` so daemon-\n * side errors keep their existing reason.\n */\nfunction isTransportNotConnected(cause: unknown): boolean {\n if (cause instanceof TransportDisconnectedError) return true;\n if (cause instanceof Error) {\n return /not connected/i.test(cause.message) && /transport/i.test(cause.message);\n }\n const text = String(cause);\n return /not connected/i.test(text) && /transport/i.test(text);\n}\n\nfunction wrapTransportThrow(cause: unknown): never {\n if (isTransportDisconnectedError(cause) || isTransportNotConnected(cause)) {\n throw toTransportError(cause);\n }\n throw cause;\n}\n\nexport type WsTransportOptions = {\n url: string;\n token: string;\n createWebSocket?: (url: string) => WebSocketLike;\n};\n\ntype WebSocketLike = {\n readyState: number;\n send(data: string): void;\n close(): void;\n addEventListener(type: \"open\", listener: () => void, options?: { once?: boolean }): void;\n addEventListener(type: \"message\", listener: (event: { data: unknown }) => void): void;\n addEventListener(type: \"error\", listener: (event: unknown) => void, options?: { once?: boolean }): void;\n addEventListener(type: \"close\", listener: () => void, options?: { once?: boolean }): void;\n removeEventListener(type: \"error\", listener: (event: unknown) => void): void;\n};\n\nconst websocketOpenState = 1;\n\nexport type DaemonClientOptions = {\n clientId: ClientId;\n createRequestId?: () => ReturnType<typeof asRequestId>;\n};\n\nexport type DaemonConnectionIdentity = {\n deviceId?: DeviceId;\n deviceDisplayName?: string;\n};\n\ntype PendingRequest<TType extends ClientRequestType = ClientRequestType> = {\n resolve: (data: ClientRequestMap[TType][\"response\"]) => void;\n reject: (error: Error) => void;\n};\n\nexport class DaemonClient {\n readonly clientId: ClientId;\n readonly #transport: DaemonTransport;\n readonly #createRequestId: () => ReturnType<typeof asRequestId>;\n readonly #pending = new Map<string, PendingRequest>();\n readonly #subscribers = new Set<(event: ScorelEvent) => void>();\n readonly #events: PersistentEvent[] = [];\n #unsubscribe: Unsubscribe | undefined;\n #state: \"disconnected\" | \"connecting\" | \"connected\" = \"disconnected\";\n #sessionId: SessionId | null = null;\n #persistentLastSeq: Seq = asSeq(0);\n #streamLastSeq: Seq = asSeq(0);\n #connectionIdentity: DaemonConnectionIdentity = {};\n #requestCounter = 0;\n\n constructor(transport: DaemonTransport, options: DaemonClientOptions) {\n this.#transport = transport;\n this.clientId = options.clientId;\n this.#createRequestId =\n options.createRequestId ??\n (() => {\n this.#requestCounter += 1;\n return asRequestId(`req_${this.#requestCounter}`);\n });\n }\n\n get state(): \"disconnected\" | \"connecting\" | \"connected\" {\n return this.#state;\n }\n\n get sessionId(): SessionId | null {\n return this.#sessionId;\n }\n\n get lastSeq(): Seq {\n return this.#streamLastSeq;\n }\n\n get persistentLastSeq(): Seq {\n return this.#persistentLastSeq;\n }\n\n get streamLastSeq(): Seq {\n return this.#streamLastSeq;\n }\n\n get connectionIdentity(): DaemonConnectionIdentity {\n return { ...this.#connectionIdentity };\n }\n\n async connect(sessionId?: SessionId): Promise<void> {\n try {\n this.#state = \"connecting\";\n this.#unsubscribe ??= this.#transport.onMessage((message) => this.#handleMessage(message));\n const result = await this.#transport.connect({\n clientId: this.clientId,\n sessionId,\n persistentLastSeq: this.#persistentLastSeq,\n streamLastSeq: this.#streamLastSeq,\n lastSeq: this.#streamLastSeq,\n });\n this.#sessionId = result.sessionId ?? sessionId ?? null;\n this.#connectionIdentity = {\n deviceId: result.deviceId,\n deviceDisplayName: result.deviceDisplayName,\n };\n this.#state = \"connected\";\n } catch (cause) {\n // Map transport-level not-connected throws to the public marker error\n // so callers in React effect paths see a rejection rather than an\n // unhandled runtime error (S0045 \u00A74.1).\n wrapTransportThrow(cause);\n }\n }\n\n disconnect(): void {\n try {\n this.#transport.send({ type: \"disconnect\", sessionId: this.#sessionId ?? undefined });\n } catch (cause) {\n // Disconnect is a fire-and-forget cleanup; if the socket is already\n // closed we still want to flush local state. Re-throwing would force\n // every caller to wrap a try/catch that has no useful recovery path.\n if (!isTransportNotConnected(cause)) {\n // Non-transport errors are unexpected; log and continue cleanup.\n // eslint-disable-next-line no-console\n console.warn(\"[scorel/client] transport.send(disconnect) threw:\", cause);\n }\n }\n try {\n this.#transport.close();\n } catch {\n /* ignore */\n }\n this.#unsubscribe?.();\n this.#unsubscribe = undefined;\n this.#state = \"disconnected\";\n }\n\n async createSession(input: { sessionId?: SessionId; meta: CreateSessionMeta }): Promise<SessionId> {\n const response = await this.#request(\"create_session\", { meta: input.meta, sessionId: input.sessionId });\n return response.sessionId;\n }\n\n async loadSession(sessionId: SessionId): Promise<ClientRequestMap[\"load_session\"][\"response\"]> {\n const response = await this.#request(\"load_session\", { sessionId, lastSeq: this.#persistentLastSeq });\n this.#sessionId = response.sessionId;\n for (const event of response.events) {\n this.#recordEvent(event);\n }\n this.#persistentLastSeq = maxSeq(this.#persistentLastSeq, response.currentSeq);\n this.#streamLastSeq = maxSeq(this.#streamLastSeq, response.currentSeq);\n return response;\n }\n\n async sendMessage(\n content: string | ContentBlock[],\n options?: SendMessageOptions,\n ): Promise<SendMessageResponse> {\n if (!this.#sessionId) {\n throw new Error(\"DaemonClient is not connected to a session\");\n }\n return this.#request(\"send_message\", { sessionId: this.#sessionId, content, options });\n }\n\n async cancel(): Promise<{ sessionId: SessionId; cancelled: boolean }> {\n if (!this.#sessionId) {\n throw new Error(\"DaemonClient is not connected to a session\");\n }\n return this.#request(\"cancel\", { sessionId: this.#sessionId });\n }\n\n async rewriteQueue(queue: QueueName, items: QueueItem[]): Promise<QueueItem[]> {\n if (!this.#sessionId) {\n throw new Error(\"DaemonClient is not connected to a session\");\n }\n return (await this.#request(\"rewrite_queue\", {\n sessionId: this.#sessionId,\n queue,\n items,\n })).items;\n }\n\n async listSessions(filter?: { projectId?: ProjectId; limit?: number }): Promise<SessionSummary[]> {\n this.#assertDaemonConnected();\n const response = await this.#request(\"list_sessions\", {\n projectId: filter?.projectId,\n limit: filter?.limit,\n });\n return response.sessions;\n }\n\n async listProjects(): Promise<HostProject[]> {\n this.#assertDaemonConnected();\n const response = await this.#request(\"list_projects\", {});\n return response.projects;\n }\n\n async listModels(filter?: { projectId?: ProjectId }): Promise<{ providers: ProviderConnectionSummary[]; providerModels: ProviderModelSummary[]; models: AvailableModelSummary[]; roles: Record<ModelRole, string>; warnings?: string[] }> {\n this.#assertDaemonConnected();\n return this.#request(\"list_models\", { projectId: filter?.projectId });\n }\n\n async upsertModelProfile(input: UpsertModelProfileInput): Promise<{ providers: ProviderConnectionSummary[]; providerModels: ProviderModelSummary[]; models: AvailableModelSummary[]; roles: Record<ModelRole, string>; warnings?: string[] }> {\n this.#assertDaemonConnected();\n return this.#request(\"upsert_model_profile\", input);\n }\n\n async fetchProviderModels(input: { projectId?: ProjectId; providerId: string }): Promise<ProviderCatalogModelSummary[]> {\n this.#assertDaemonConnected();\n return (await this.#request(\"fetch_provider_models\", input)).models;\n }\n\n async removeModelProvider(input: { projectId?: ProjectId; providerId: string }): Promise<{ providers: ProviderConnectionSummary[]; providerModels: ProviderModelSummary[]; models: AvailableModelSummary[]; roles: Record<ModelRole, string>; warnings?: string[]; removed: boolean }> {\n this.#assertDaemonConnected();\n return this.#request(\"remove_model_provider\", input);\n }\n\n async getMemorySettings(input: { projectId?: ProjectId } = {}): Promise<MemorySettings> {\n this.#assertDaemonConnected();\n return (await this.#request(\"get_memory_settings\", input)).memory;\n }\n\n async getMemoryStatus(input: { projectId: ProjectId }): Promise<MemoryStatus> {\n this.#assertDaemonConnected();\n return (await this.#request(\"get_memory_status\", input)).status;\n }\n\n async upsertMemorySettings(input: UpsertMemorySettingsInput): Promise<MemorySettings> {\n this.#assertDaemonConnected();\n return (await this.#request(\"upsert_memory_settings\", input)).memory;\n }\n\n async getRuntimeSettings(input: { projectId?: ProjectId } = {}): Promise<RuntimeSettings> {\n this.#assertDaemonConnected();\n return (await this.#request(\"get_runtime_settings\", input)).runtime;\n }\n\n async upsertRuntimeSettings(input: UpsertRuntimeSettingsInput): Promise<RuntimeSettings> {\n this.#assertDaemonConnected();\n return (await this.#request(\"upsert_runtime_settings\", input)).runtime;\n }\n\n async getExtensionSettings(input: { extensionId: string }): Promise<ExtensionSettings> {\n this.#assertDaemonConnected();\n return (await this.#request(\"get_extension_settings\", input)).extension;\n }\n\n async upsertExtensionSettings(input: UpsertExtensionSettingsInput): Promise<ExtensionSettings> {\n this.#assertDaemonConnected();\n return (await this.#request(\"upsert_extension_settings\", input)).extension;\n }\n\n async listDirectories(path?: string): Promise<DirectoryListing> {\n this.#assertDaemonConnected();\n return this.#request(\"list_directories\", { path });\n }\n\n async registerProject(workDir: string): Promise<HostProject> {\n this.#assertDaemonConnected();\n return (await this.#request(\"register_project\", { workDir })).project;\n }\n\n async removeProject(projectId: ProjectId): Promise<boolean> {\n this.#assertDaemonConnected();\n return (await this.#request(\"remove_project\", { projectId })).removed;\n }\n\n #assertDaemonConnected(): void {\n if (this.#state !== \"connected\") {\n throw new Error(\"DaemonClient is not connected to a daemon\");\n }\n }\n\n async resync(anchors?: Seq | { persistentLastSeq?: Seq; streamLastSeq?: Seq }): Promise<ClientRequestMap[\"resync_events\"][\"response\"]> {\n if (!this.#sessionId) {\n throw new Error(\"DaemonClient is not connected to a session\");\n }\n const legacyFromSeq = typeof anchors === \"number\" ? anchors : undefined;\n const response = await this.#request(\"resync_events\", {\n sessionId: this.#sessionId,\n fromSeq: legacyFromSeq,\n persistentLastSeq: typeof anchors === \"object\" ? anchors.persistentLastSeq : this.#persistentLastSeq,\n streamLastSeq: typeof anchors === \"object\" ? anchors.streamLastSeq : legacyFromSeq ?? this.#streamLastSeq,\n });\n if (response.mode === \"full_reload\") {\n this.#events.length = 0;\n this.#persistentLastSeq = asSeq(0);\n }\n for (const event of response.events) {\n this.#recordEvent(event);\n for (const subscriber of this.#subscribers) {\n subscriber(event);\n }\n }\n if (response.mode === \"persistent_fallback\" || response.mode === \"full_reload\") {\n this.#persistentLastSeq = maxSeq(this.#persistentLastSeq, response.throughSeq);\n this.#streamLastSeq = maxSeq(this.#streamLastSeq, response.throughSeq);\n } else {\n this.#streamLastSeq = maxSeq(this.#streamLastSeq, response.throughSeq);\n }\n return response;\n }\n\n subscribe(handler: (event: ScorelEvent) => void): Unsubscribe {\n this.#subscribers.add(handler);\n return () => {\n this.#subscribers.delete(handler);\n };\n }\n\n getEvents(): PersistentEvent[] {\n return [...this.#events];\n }\n\n getActiveLeaf(): EventId | null {\n return this.#events.at(-1)?.id ?? null;\n }\n\n #request<TType extends ClientRequestType>(\n type: TType,\n payload: ClientRequestMap[TType][\"request\"],\n ): Promise<ClientRequestMap[TType][\"response\"]> {\n const requestId = this.#createRequestId();\n const request = {\n type,\n requestId,\n ...payload,\n } as ClientRequest<TType>;\n\n return new Promise((resolve, reject) => {\n this.#pending.set(String(requestId), { resolve, reject } as PendingRequest);\n try {\n this.#transport.send(request as ClientRequest);\n } catch (cause) {\n // Synchronous throw from transport.send (e.g. socket already\n // closed). The Promise body would auto-reject, but we drop the\n // pending entry first so a late `error` message doesn't try to\n // reject the same request twice. Map to the public marker error\n // so webui can classify it as `transport_disconnected` (S0045).\n this.#pending.delete(String(requestId));\n if (isTransportDisconnectedError(cause) || isTransportNotConnected(cause)) {\n reject(toTransportError(cause));\n } else {\n reject(cause instanceof Error ? cause : new Error(String(cause)));\n }\n }\n });\n }\n\n #handleMessage(message: DaemonMessage): void {\n switch (message.type) {\n case \"event\":\n this.#recordEvent(message.event);\n for (const subscriber of this.#subscribers) {\n subscriber(message.event);\n }\n break;\n case \"response\": {\n const pending = this.#pending.get(String(message.requestId));\n if (pending) {\n this.#pending.delete(String(message.requestId));\n pending.resolve(message.data);\n }\n break;\n }\n case \"error\": {\n if (message.requestId) {\n const pending = this.#pending.get(String(message.requestId));\n if (pending) {\n this.#pending.delete(String(message.requestId));\n pending.reject(new Error(message.message));\n }\n }\n break;\n }\n case \"connected\":\n this.#sessionId = message.sessionId ?? this.#sessionId;\n // Merge: a follow-up `connected` (e.g. duplicate ack from a server that\n // sends one manually plus the default) must not blank out identity\n // fields the first message established.\n this.#connectionIdentity = {\n deviceId: message.deviceId ?? this.#connectionIdentity.deviceId,\n deviceDisplayName:\n message.deviceDisplayName ?? this.#connectionIdentity.deviceDisplayName,\n };\n break;\n case \"disconnected\":\n this.#state = \"disconnected\";\n break;\n case \"pong\":\n break;\n }\n }\n\n #recordEvent(event: ScorelEvent): void {\n this.#streamLastSeq = maxSeq(this.#streamLastSeq, event.seq);\n if (\"id\" in event) {\n this.#persistentLastSeq = maxSeq(this.#persistentLastSeq, event.seq);\n const existingIndex = this.#events.findIndex((candidate) => candidate.id === event.id);\n if (existingIndex >= 0) {\n this.#events[existingIndex] = event;\n } else {\n this.#events.push(event);\n }\n }\n }\n}\n\nconst maxSeq = (left: Seq, right: Seq): Seq => asSeq(Math.max(Number(left), Number(right)));\n\nexport class WsTransport implements DaemonTransport {\n readonly url: string;\n readonly #token: string;\n readonly #createWebSocket: (url: string) => WebSocketLike;\n readonly #handlers = new Set<(message: DaemonMessage) => void>();\n #socket: WebSocketLike | undefined;\n\n constructor(options: WsTransportOptions) {\n this.url = options.url;\n this.#token = options.token;\n this.#createWebSocket =\n options.createWebSocket ??\n ((url) => {\n if (typeof WebSocket === \"undefined\") {\n throw new Error(\"WebSocket is not available in this runtime\");\n }\n return new WebSocket(url);\n });\n }\n\n connect(params: ConnectParams): Promise<ConnectResult> {\n return new Promise((resolve, reject) => {\n const socket = this.#createWebSocket(this.url);\n this.#socket = socket;\n const rejectOnError = (event: unknown) => {\n socket.removeEventListener(\"error\", rejectOnError);\n reject(event instanceof Error ? event : new Error(\"WebSocket connection failed\"));\n };\n socket.addEventListener(\"error\", rejectOnError, { once: true });\n socket.addEventListener(\"message\", (event) => this.#handleMessageData(event.data));\n const unsubscribe = this.onMessage((message) => {\n if (message.type === \"error\") {\n unsubscribe();\n socket.removeEventListener(\"error\", rejectOnError);\n reject(new Error(message.message));\n return;\n }\n if (message.type !== \"connected\") {\n return;\n }\n unsubscribe();\n socket.removeEventListener(\"error\", rejectOnError);\n resolve({\n clientId: message.clientId,\n sessionId: message.sessionId,\n currentSeq: message.currentSeq,\n deviceId: message.deviceId,\n deviceDisplayName: message.deviceDisplayName,\n });\n });\n socket.addEventListener(\n \"open\",\n () => {\n this.#write({ type: \"connect\", ...params, token: this.#token });\n },\n { once: true },\n );\n });\n }\n\n send(message: ClientMessage): void {\n this.#write(message);\n }\n\n onMessage(handler: (message: DaemonMessage) => void): Unsubscribe {\n this.#handlers.add(handler);\n return () => {\n this.#handlers.delete(handler);\n };\n }\n\n close(): void {\n this.#socket?.close();\n this.#socket = undefined;\n this.#handlers.clear();\n }\n\n #write(message: ClientMessage | (ConnectParams & { type: \"connect\"; token: string })): void {\n if (!this.#socket || this.#socket.readyState !== websocketOpenState) {\n throw new Error(\"WsTransport is not connected\");\n }\n this.#socket.send(JSON.stringify(message));\n }\n\n #handleMessageData(data: unknown): void {\n const text = typeof data === \"string\" ? data : data instanceof ArrayBuffer ? new TextDecoder().decode(data) : String(data);\n const message = JSON.parse(text) as DaemonMessage;\n for (const handler of this.#handlers) {\n handler(message);\n }\n }\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, readdir, realpath, rename, stat, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\n\nimport { asProjectId, type HostProject, type ProjectId } from \"@scorel/protocol\";\n\ntype ProjectRegistryFile = {\n version: 1;\n projects: HostProject[];\n};\n\nexport type ProjectRegistryOptions = {\n projectsPath: string;\n sessionsDir: string;\n createId?: () => string;\n now?: () => number;\n};\n\nexport class ProjectRegistryError extends Error {\n readonly code: \"project_not_found\" | \"project_has_sessions\" | \"filesystem_error\" | \"conflict\";\n\n constructor(code: ProjectRegistryError[\"code\"], message: string) {\n super(message);\n this.name = \"ProjectRegistryError\";\n this.code = code;\n }\n}\n\nexport class ProjectRegistry {\n readonly #projectsPath: string;\n readonly #sessionsDir: string;\n readonly #createId: () => string;\n readonly #now: () => number;\n #mutation = Promise.resolve();\n\n constructor(options: ProjectRegistryOptions) {\n this.#projectsPath = options.projectsPath;\n this.#sessionsDir = options.sessionsDir;\n this.#createId = options.createId ?? randomUUID;\n this.#now = options.now ?? Date.now;\n }\n\n async list(): Promise<HostProject[]> {\n const file = await this.#read();\n return sortProjects(file.projects);\n }\n\n async get(projectId: ProjectId): Promise<HostProject | undefined> {\n return (await this.list()).find((project) => project.projectId === projectId);\n }\n\n async require(projectId: ProjectId): Promise<HostProject> {\n const project = await this.get(projectId);\n if (!project) {\n throw new ProjectRegistryError(\"project_not_found\", `Unknown project: ${projectId}`);\n }\n return project;\n }\n\n async register(workDir: string): Promise<HostProject> {\n return this.#mutate(async (file) => {\n const canonical = await canonicalDirectory(workDir);\n const existing = file.projects.find((project) => project.workDir === canonical);\n if (existing) {\n return { result: existing, changed: false };\n }\n const now = this.#now();\n const project: HostProject = {\n projectId: asProjectId(`prj_${this.#createId()}`),\n displayName: basename(canonical) || canonical,\n workDir: canonical,\n createdAt: now,\n updatedAt: now,\n };\n file.projects.push(project);\n return { result: project, changed: true };\n });\n }\n\n async remove(projectId: ProjectId): Promise<boolean> {\n return this.#mutate(async (file) => {\n const index = file.projects.findIndex((project) => project.projectId === projectId);\n if (index < 0) {\n throw new ProjectRegistryError(\"project_not_found\", `Unknown project: ${projectId}`);\n }\n if (await sessionReferencesProject(this.#sessionsDir, projectId)) {\n throw new ProjectRegistryError(\"project_has_sessions\", `Project still has sessions: ${projectId}`);\n }\n file.projects.splice(index, 1);\n return { result: true, changed: true };\n });\n }\n\n async #mutate<TResult>(\n mutation: (file: ProjectRegistryFile) => Promise<{ result: TResult; changed: boolean }>,\n ): Promise<TResult> {\n const operation = this.#mutation.then(async () => {\n const file = await this.#read();\n const { result, changed } = await mutation(file);\n if (changed) {\n await this.#write({ version: 1, projects: sortProjects(file.projects) });\n }\n return result;\n });\n this.#mutation = operation.then(\n () => undefined,\n () => undefined,\n );\n return operation;\n }\n\n async #read(): Promise<ProjectRegistryFile> {\n try {\n const parsed = JSON.parse(await readFile(this.#projectsPath, \"utf8\")) as unknown;\n if (!isRegistryFile(parsed)) {\n throw new ProjectRegistryError(\"filesystem_error\", `Invalid project registry: ${this.#projectsPath}`);\n }\n return { version: 1, projects: parsed.projects.map((project) => ({ ...project })) };\n } catch (cause) {\n if (isNodeError(cause, \"ENOENT\")) {\n return { version: 1, projects: [] };\n }\n if (cause instanceof ProjectRegistryError) {\n throw cause;\n }\n throw new ProjectRegistryError(\"filesystem_error\", errorMessage(cause));\n }\n }\n\n async #write(file: ProjectRegistryFile): Promise<void> {\n await mkdir(dirname(this.#projectsPath), { recursive: true });\n const temporaryPath = `${this.#projectsPath}.${process.pid}.${randomUUID()}.tmp`;\n try {\n await writeFile(temporaryPath, `${JSON.stringify(file, null, 2)}\\n`, \"utf8\");\n await rename(temporaryPath, this.#projectsPath);\n } catch (cause) {\n throw new ProjectRegistryError(\"filesystem_error\", errorMessage(cause));\n }\n }\n}\n\nconst canonicalDirectory = async (workDir: string): Promise<string> => {\n try {\n const canonical = await realpath(workDir);\n if (!(await stat(canonical)).isDirectory()) {\n throw new ProjectRegistryError(\"filesystem_error\", `Project path is not a directory: ${workDir}`);\n }\n return canonical;\n } catch (cause) {\n if (cause instanceof ProjectRegistryError) {\n throw cause;\n }\n throw new ProjectRegistryError(\"filesystem_error\", errorMessage(cause));\n }\n};\n\nconst sessionReferencesProject = async (sessionsDir: string, projectId: ProjectId): Promise<boolean> => {\n let names: string[];\n try {\n names = await readdir(sessionsDir);\n } catch (cause) {\n if (isNodeError(cause, \"ENOENT\")) {\n return false;\n }\n throw new ProjectRegistryError(\"filesystem_error\", errorMessage(cause));\n }\n for (const name of names) {\n if (!name.endsWith(\".jsonl\") || name.startsWith(\".\")) {\n continue;\n }\n try {\n const firstLine = (await readFile(join(sessionsDir, name), \"utf8\")).split(/\\r?\\n/, 1)[0];\n const parsed = firstLine ? (JSON.parse(firstLine) as unknown) : undefined;\n if (isRecord(parsed) && isRecord(parsed.meta) && parsed.meta.projectId === projectId) {\n return true;\n }\n } catch (cause) {\n if (!isNodeError(cause, \"ENOENT\")) {\n throw new ProjectRegistryError(\"filesystem_error\", errorMessage(cause));\n }\n }\n }\n return false;\n};\n\nconst sortProjects = (projects: HostProject[]): HostProject[] =>\n [...projects].sort((left, right) => String(left.projectId).localeCompare(String(right.projectId)));\n\nconst isRegistryFile = (value: unknown): value is ProjectRegistryFile =>\n isRecord(value) &&\n value.version === 1 &&\n Array.isArray(value.projects) &&\n value.projects.every(\n (project) =>\n isRecord(project) &&\n typeof project.projectId === \"string\" &&\n typeof project.displayName === \"string\" &&\n typeof project.workDir === \"string\" &&\n typeof project.createdAt === \"number\" &&\n typeof project.updatedAt === \"number\",\n );\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isNodeError = (cause: unknown, code: string): boolean =>\n cause instanceof Error && \"code\" in cause && cause.code === code;\n\nconst errorMessage = (cause: unknown): string => cause instanceof Error ? cause.message : String(cause);\n", "import { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { readdir, realpath, stat } from \"node:fs/promises\";\n\nimport type { DirectoryEntry, DirectoryListing } from \"@scorel/protocol\";\n\nimport { ProjectRegistryError } from \"./registry.js\";\n\nexport const listDirectories = async (path = homedir()): Promise<DirectoryListing> => {\n try {\n const canonical = await realpath(path);\n if (!(await stat(canonical)).isDirectory()) {\n throw new ProjectRegistryError(\"filesystem_error\", `Path is not a directory: ${path}`);\n }\n const entries = await directoryEntries(canonical);\n const parent = dirname(canonical);\n return {\n path: canonical,\n parentPath: parent === canonical ? undefined : parent,\n entries,\n };\n } catch (cause) {\n if (cause instanceof ProjectRegistryError) {\n throw cause;\n }\n throw new ProjectRegistryError(\"filesystem_error\", errorMessage(cause));\n }\n};\n\nconst directoryEntries = async (path: string): Promise<DirectoryEntry[]> => {\n const entries = await readdir(path, { withFileTypes: true });\n const directories = await Promise.all(\n entries.map(async (entry): Promise<DirectoryEntry | undefined> => {\n const candidate = join(path, entry.name);\n if (!entry.isDirectory() && !entry.isSymbolicLink()) {\n return undefined;\n }\n try {\n const canonical = await realpath(candidate);\n return (await stat(canonical)).isDirectory()\n ? { name: entry.name, path: canonical, kind: \"directory\" }\n : undefined;\n } catch {\n return undefined;\n }\n }),\n );\n return directories\n .filter((entry): entry is DirectoryEntry => entry !== undefined)\n .sort((left, right) => left.name.localeCompare(right.name) || left.path.localeCompare(right.path));\n};\n\nconst errorMessage = (cause: unknown): string => cause instanceof Error ? cause.message : String(cause);\n", "import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { asProjectId, asSeq, asSessionId, type ProjectId, type SessionSummary } from \"@scorel/protocol\";\n\nexport type SessionSummaryOverrides = Map<string, { currentSeq?: number; updatedAt?: number }>;\n\nexport const listSessionSummaries = async (\n sessionsDir: string,\n filter: { projectId?: ProjectId; limit?: number } = {},\n overrides?: SessionSummaryOverrides,\n): Promise<SessionSummary[]> => {\n let names: string[];\n try {\n names = await readdir(sessionsDir);\n } catch (cause) {\n if (isNodeError(cause, \"ENOENT\")) {\n return [];\n }\n throw cause;\n }\n const sessions = (\n await Promise.all(\n names\n .filter((name) => name.endsWith(\".jsonl\") && !name.startsWith(\".\"))\n .map((name) => readSummary(join(sessionsDir, name), overrides)),\n )\n )\n .filter((session): session is SessionSummary => session !== undefined)\n .filter((session) => filter.projectId === undefined || session.projectId === filter.projectId)\n .sort((left, right) => right.updatedAt - left.updatedAt || String(left.sessionId).localeCompare(String(right.sessionId)));\n return sessions.slice(0, clampLimit(filter.limit));\n};\n\nconst readSummary = async (\n filePath: string,\n overrides?: SessionSummaryOverrides,\n): Promise<SessionSummary | undefined> => {\n let content: string;\n try {\n content = await readFile(filePath, \"utf8\");\n } catch (cause) {\n if (isNodeError(cause, \"ENOENT\")) {\n return undefined;\n }\n throw cause;\n }\n const lines = content.split(/\\r?\\n/).filter(Boolean);\n const header = parseRecord(lines[0]);\n if (\n header?.version !== 1 ||\n typeof header.sessionId !== \"string\" ||\n typeof header.createdAt !== \"number\" ||\n !isRecord(header.meta) ||\n typeof header.meta.projectId !== \"string\"\n ) {\n return undefined;\n }\n const override = overrides?.get(header.sessionId);\n const title = latestTitle(lines.slice(1)) ?? (typeof header.meta.title === \"string\" ? header.meta.title : undefined);\n return {\n sessionId: asSessionId(header.sessionId),\n projectId: asProjectId(header.meta.projectId),\n title,\n model: typeof header.meta.model === \"string\" ? header.meta.model : undefined,\n updatedAt: override?.updatedAt ?? (typeof header.meta.updatedAt === \"number\" ? header.meta.updatedAt : header.createdAt),\n currentSeq: asSeq(override?.currentSeq ?? tailSeq(lines.slice(1))),\n };\n};\n\nconst tailSeq = (lines: string[]): number => {\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const event = parseRecord(lines[index]);\n if (typeof event?.seq === \"number\") {\n return event.seq;\n }\n }\n return 0;\n};\n\nconst latestTitle = (lines: string[]): string | undefined => {\n let title: string | undefined;\n for (const line of lines) {\n const event = parseRecord(line);\n if (event?.type === \"session_title_updated\" && typeof event.title === \"string\" && event.title.trim()) {\n title = event.title.trim();\n }\n }\n return title;\n};\n\nconst clampLimit = (limit: number | undefined): number =>\n limit === undefined || !Number.isFinite(limit) || limit <= 0 ? 200 : Math.min(Math.floor(limit), 1_000);\n\nconst parseRecord = (line: string | undefined): Record<string, unknown> | undefined => {\n try {\n const value = line === undefined ? undefined : JSON.parse(line) as unknown;\n return isRecord(value) ? value : undefined;\n } catch {\n return undefined;\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isNodeError = (cause: unknown, code: string): boolean =>\n cause instanceof Error && \"code\" in cause && cause.code === code;\n", "import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport const SCOREL_CONFIG_SCHEMA = {\n fixedPaths: {\n userRoot: \"~/.scorel\",\n userConfig: \"~/.scorel/config.toml\",\n sessionsDir: \"~/.scorel/sessions\",\n },\n sections: {\n root: {\n keys: [],\n },\n provider: {\n keys: [\"type\", \"provider\", \"api\", \"baseUrl\", \"apiKeyEnv\", \"apiKey\"],\n },\n providerModel: {\n keys: [\"provider\", \"id\", \"displayName\", \"contextWindow\", \"maxTokens\", \"reasoning\", \"supportsDeveloperRole\", \"supportsImageInput\"],\n },\n availableModel: {\n keys: [\"model\", \"displayName\"],\n },\n modelProfileRoles: {\n keys: [\"primary\", \"standard\", \"auxiliary\"],\n },\n memory: {\n keys: [\"enabled\", \"daily\", \"sessionMemory\", \"autoDream\", \"promoteRoot\", \"dreamIdleMinutes\", \"autoCompactThreshold\"],\n },\n runtime: {\n keys: [\"tokenSavingRtk\"],\n },\n extension: {\n keys: [\"enabled\", \"kind\"],\n },\n extensionConfig: {\n keys: [],\n },\n },\n} as const;\n\nexport type ModelRole = \"primary\" | \"standard\" | \"auxiliary\";\n\nexport type BuiltinPiAiProviderConfig = {\n type: \"builtin\";\n provider: string;\n apiKey: string;\n baseUrl?: string;\n};\n\nexport type CustomPiAiApi = \"openai-completions\" | \"openai-responses\" | \"google-generative-ai\" | \"anthropic-messages\";\n\nexport type CustomPiAiProviderConfig = {\n type: \"custom\";\n api: CustomPiAiApi;\n provider: string;\n baseUrl: string;\n apiKey: string;\n};\n\nexport type ScorelProviderConfig = BuiltinPiAiProviderConfig | CustomPiAiProviderConfig;\n\nexport type ProviderModelConfig = {\n provider: string;\n id: string;\n displayName: string;\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsImageInput?: boolean;\n compat?: {\n supportsDeveloperRole?: boolean;\n };\n};\n\nexport type AvailableModelConfig = {\n model: string;\n displayName?: string;\n};\n\nexport type BuiltinPiAiModelConfig = BuiltinPiAiProviderConfig & {\n id: string;\n displayName?: string;\n};\n\nexport type CustomPiAiModelConfig = CustomPiAiProviderConfig & {\n id: string;\n displayName?: string;\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsImageInput?: boolean;\n compat?: {\n supportsDeveloperRole?: boolean;\n };\n};\n\nexport type ScorelConfig = {\n providers: Record<string, ScorelProviderConfig>;\n providerModels: Record<string, ProviderModelConfig>;\n models: Record<string, AvailableModelConfig>;\n modelProfile: {\n roles: Record<ModelRole, string>;\n };\n memory: MemoryConfig;\n runtime: RuntimeConfig;\n extensions: Record<string, ExtensionConfig>;\n};\n\nexport type MemoryConfig = {\n enabled: boolean;\n daily: boolean;\n sessionMemory: boolean;\n autoDream: boolean;\n promoteRoot: boolean;\n dreamIdleMinutes: number;\n autoCompactThreshold: number;\n};\n\nexport type RuntimeConfig = {\n tokenSavingRtk: boolean;\n};\n\nexport type ExtensionConfig = {\n enabled: boolean;\n kind: \"im\";\n config: Record<string, string | number | boolean>;\n};\n\nexport type ProviderConnectionSummary = {\n providerId: string;\n type: \"builtin\" | \"custom\";\n provider: string;\n api?: CustomPiAiApi;\n baseUrl?: string;\n apiKeyEnv?: string;\n credentialSource: \"env\" | \"direct\";\n credentialStatus: \"available\" | \"missing\";\n};\n\ntype ProviderProfileConfig = ProviderConnectionSummary & {\n apiKey?: string;\n};\n\nexport type ScorelConfigProfile = {\n providers: Record<string, ProviderProfileConfig>;\n providerModels: Record<string, ProviderModelConfig>;\n models: Record<string, AvailableModelConfig>;\n modelProfile: {\n roles: Record<ModelRole, string>;\n };\n memory: MemoryConfig;\n runtime: RuntimeConfig;\n extensions: Record<string, ExtensionConfig>;\n warnings?: string[];\n};\n\nexport type AvailableModelSummary = {\n modelId: string;\n providerModelId: string;\n providerId: string;\n provider: string;\n id: string;\n displayName: string;\n roles: ModelRole[];\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsDeveloperRole?: boolean;\n supportsImageInput?: boolean;\n};\n\nexport type ProviderModelSummary = {\n providerModelId: string;\n providerId: string;\n provider: string;\n id: string;\n displayName: string;\n availableModelIds: string[];\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsDeveloperRole?: boolean;\n supportsImageInput?: boolean;\n};\n\nexport type ResolvedModelSelection = {\n modelId: string;\n role?: ModelRole;\n displayName: string;\n providerId: string;\n config: BuiltinPiAiModelConfig | CustomPiAiModelConfig;\n};\n\nexport type UpsertModelProfileConfigInput = {\n providerId?: string;\n removeProviderId?: string;\n providerType?: \"builtin\" | \"custom\";\n provider?: string;\n apiKeyEnv?: string;\n apiKey?: string;\n api?: CustomPiAiApi;\n baseUrl?: string;\n modelId?: string;\n providerModelKey?: string;\n availableModelId?: string;\n addToAvailable?: boolean;\n removeAvailableModelId?: string;\n providerModelId?: string;\n displayName?: string;\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsDeveloperRole?: boolean;\n supportsImageInput?: boolean;\n roles?: Partial<Record<ModelRole, string>>;\n existingConfigText?: string;\n};\n\nexport type UpsertMemoryConfigInput = Partial<MemoryConfig> & {\n existingConfigText?: string;\n};\n\nexport type UpsertRuntimeConfigInput = Partial<RuntimeConfig> & {\n existingConfigText?: string;\n};\n\nexport type ConfigValue = string | number | boolean;\n\nexport type UpsertExtensionConfigInput = {\n extensionId: string;\n enabled?: boolean;\n kind?: \"im\";\n config?: Record<string, ConfigValue | undefined>;\n existingConfigText?: string;\n};\n\nexport const scorelUserRoot = (homeDir: string): string => join(homeDir, \".scorel\");\n\nexport const scorelUserConfigPath = (homeDir: string): string => join(scorelUserRoot(homeDir), \"config.toml\");\n\nexport const scorelSessionsDir = (homeDir: string): string => join(scorelUserRoot(homeDir), \"sessions\");\n\nexport type LoadScorelConfigOptions = {\n cwd: string;\n homeDir?: string;\n scorelHomeDir?: string;\n env?: Record<string, string | undefined>;\n};\n\ntype RawConfig = {\n providers: Record<string, {\n type?: string;\n provider?: string;\n api?: string;\n baseUrl?: string;\n apiKeyEnv?: string;\n apiKey?: string;\n }>;\n providerModels: Record<string, {\n provider?: string;\n id?: string;\n displayName?: string;\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n supportsDeveloperRole?: boolean;\n supportsImageInput?: boolean;\n }>;\n availableModels: Record<string, {\n model?: string;\n displayName?: string;\n }>;\n modelProfile?: {\n roles?: Partial<Record<ModelRole, string>>;\n };\n memory?: Partial<MemoryConfig>;\n runtime?: Partial<RuntimeConfig>;\n extensions: Record<string, {\n enabled?: boolean;\n kind?: string;\n config?: Record<string, ConfigValue>;\n }>;\n};\n\ntype ConfigSection =\n | { kind: \"root\" }\n | { kind: \"provider\"; id: string }\n | { kind: \"providerModel\"; id: string }\n | { kind: \"availableModel\"; id: string }\n | { kind: \"modelProfileRoles\" }\n | { kind: \"memory\" }\n | { kind: \"runtime\" }\n | { kind: \"extension\"; id: string }\n | { kind: \"extensionConfig\"; id: string };\nexport const loadScorelConfig = async (options: LoadScorelConfigOptions): Promise<ScorelConfig> => {\n const env = options.env ?? process.env;\n const raw = parseToml(await readConfigText(options));\n const providers = loadProviders(raw, env);\n const providerModels = loadProviderModels(raw, providers);\n const models = loadAvailableModels(raw, providerModels);\n const roles = loadRoles(raw, models);\n\n return {\n providers,\n providerModels,\n models,\n modelProfile: { roles },\n memory: loadMemory(raw),\n runtime: loadRuntime(raw),\n extensions: loadExtensions(raw),\n };\n};\n\nexport const loadScorelConfigProfile = async (options: LoadScorelConfigOptions & { includeSecrets?: boolean }): Promise<ScorelConfigProfile> => {\n const env = options.env ?? process.env;\n const raw = parseToml(await readConfigText(options));\n const providers = loadProviderProfiles(raw, env, { includeSecrets: options.includeSecrets ?? false });\n const providerModels = loadProviderModels(raw, providers, { requireAny: false });\n const models = loadAvailableModels(raw, providerModels, { requireAny: false, includeAllProviderModels: false });\n const roles = loadRoles(raw, models, { requireComplete: false });\n\n return {\n providers,\n providerModels,\n models,\n modelProfile: { roles },\n memory: loadMemory(raw),\n runtime: loadRuntime(raw),\n extensions: loadExtensions(raw),\n };\n};\n\nexport const listProviderConnections = (config: ScorelConfig | ScorelConfigProfile): ProviderConnectionSummary[] =>\n Object.entries(config.providers).map(([providerId, provider]) => ({\n providerId,\n type: provider.type,\n provider: provider.provider,\n ...(provider.type === \"custom\" ? { api: provider.api, baseUrl: provider.baseUrl } : {}),\n ...(provider.type === \"builtin\" && provider.baseUrl ? { baseUrl: provider.baseUrl } : {}),\n ...(\"apiKeyEnv\" in provider && provider.apiKeyEnv ? { apiKeyEnv: provider.apiKeyEnv } : {}),\n credentialSource: \"credentialSource\" in provider ? provider.credentialSource : \"apiKey\" in provider ? \"direct\" : \"env\",\n credentialStatus: \"credentialStatus\" in provider ? provider.credentialStatus : \"available\",\n }));\n\nexport const listAvailableModels = (config: ScorelConfig | ScorelConfigProfile): AvailableModelSummary[] =>\n Object.entries(config.models).map(([modelId, available]) => {\n const providerModel = config.providerModels[available.model];\n if (!providerModel) {\n throw new Error(`available_models.${modelId}.model must reference a configured provider model`);\n }\n const provider = config.providers[providerModel.provider];\n if (!provider) {\n throw new Error(`provider_models.${available.model}.provider must reference a configured provider`);\n }\n return {\n modelId,\n providerModelId: available.model,\n providerId: providerModel.provider,\n provider: normalizeProviderName(provider.provider),\n id: providerModel.id,\n displayName: available.displayName ?? providerModel.displayName,\n roles: modelRoles(config, modelId),\n ...(providerModel.contextWindow !== undefined ? { contextWindow: providerModel.contextWindow } : {}),\n ...(providerModel.maxTokens !== undefined ? { maxTokens: providerModel.maxTokens } : {}),\n ...(providerModel.reasoning !== undefined ? { reasoning: providerModel.reasoning } : {}),\n ...(providerModel.compat?.supportsDeveloperRole !== undefined ? { supportsDeveloperRole: providerModel.compat.supportsDeveloperRole } : {}),\n ...(providerModel.supportsImageInput !== undefined ? { supportsImageInput: providerModel.supportsImageInput } : {}),\n };\n });\n\nexport const listProviderModels = (config: ScorelConfig | ScorelConfigProfile): ProviderModelSummary[] =>\n Object.entries(config.providerModels).map(([providerModelId, model]) => {\n const provider = config.providers[model.provider];\n if (!provider) {\n throw new Error(`provider_models.${providerModelId}.provider must reference a configured provider`);\n }\n return {\n providerModelId,\n providerId: model.provider,\n provider: normalizeProviderName(provider.provider),\n id: model.id,\n displayName: model.displayName,\n availableModelIds: Object.entries(config.models)\n .filter(([, available]) => available.model === providerModelId)\n .map(([modelId]) => modelId),\n ...(model.contextWindow !== undefined ? { contextWindow: model.contextWindow } : {}),\n ...(model.maxTokens !== undefined ? { maxTokens: model.maxTokens } : {}),\n ...(model.reasoning !== undefined ? { reasoning: model.reasoning } : {}),\n ...(model.compat?.supportsDeveloperRole !== undefined ? { supportsDeveloperRole: model.compat.supportsDeveloperRole } : {}),\n ...(model.supportsImageInput !== undefined ? { supportsImageInput: model.supportsImageInput } : {}),\n };\n });\n\nexport const resolveModelSelection = (\n config: ScorelConfig,\n selection?: { modelId?: string; role?: ModelRole },\n): ResolvedModelSelection => {\n const role = selection?.role ?? (selection?.modelId ? undefined : \"standard\");\n const modelId = selection?.modelId ?? config.modelProfile.roles[role ?? \"standard\"];\n const model = config.models[modelId];\n if (!model) {\n throw new Error(`Unknown configured model: ${modelId}`);\n }\n const providerModel = config.providerModels[model.model];\n if (!providerModel) {\n throw new Error(`available_models.${modelId}.model must reference a configured provider model`);\n }\n const provider = config.providers[providerModel.provider];\n if (!provider) {\n throw new Error(`provider_models.${model.model}.provider must reference a configured provider`);\n }\n const displayName = model.displayName ?? providerModel.displayName;\n if (provider.type === \"builtin\") {\n return {\n modelId,\n role,\n displayName,\n providerId: providerModel.provider,\n config: {\n ...provider,\n id: providerModel.id,\n displayName,\n },\n };\n }\n return {\n modelId,\n role,\n displayName,\n providerId: providerModel.provider,\n config: {\n ...provider,\n id: providerModel.id,\n displayName,\n ...(providerModel.contextWindow !== undefined ? { contextWindow: providerModel.contextWindow } : {}),\n ...(providerModel.maxTokens !== undefined ? { maxTokens: providerModel.maxTokens } : {}),\n ...(providerModel.reasoning !== undefined ? { reasoning: providerModel.reasoning } : {}),\n ...(providerModel.supportsImageInput !== undefined ? { supportsImageInput: providerModel.supportsImageInput } : {}),\n ...(providerModel.compat ? { compat: providerModel.compat } : {}),\n },\n };\n};\n\nexport const renderModelProfileConfig = (input: UpsertModelProfileConfigInput): string => {\n const raw = parseEditableConfig(input.existingConfigText);\n\n if (input.removeProviderId) {\n removeProvider(raw, requireIdentifier(input.removeProviderId, \"removeProviderId\"));\n }\n\n if (input.providerType || input.provider || input.apiKeyEnv || input.apiKey || input.api || input.baseUrl) {\n const providerId = requireIdentifier(input.providerId, \"providerId\");\n const providerType = requireProviderType(input.providerType, \"providerType\");\n const existingProvider = raw.providers[providerId];\n raw.providers[providerId] = {\n type: providerType,\n provider: normalizeProviderName(requireString(input.provider, \"provider\")),\n };\n if (input.apiKey !== undefined) {\n raw.providers[providerId].apiKey = input.apiKey ? requireString(input.apiKey, \"apiKey\") : existingProvider?.apiKey;\n } else if (existingProvider?.apiKey) {\n raw.providers[providerId].apiKey = existingProvider.apiKey;\n }\n if (input.apiKeyEnv !== undefined) {\n raw.providers[providerId].apiKeyEnv = input.apiKeyEnv ? requireString(input.apiKeyEnv, \"apiKeyEnv\") : existingProvider?.apiKeyEnv;\n } else if (existingProvider?.apiKeyEnv) {\n raw.providers[providerId].apiKeyEnv = existingProvider.apiKeyEnv;\n }\n requireProviderCredential(raw.providers[providerId], `providers.${providerId}`);\n if (providerType === \"custom\") {\n raw.providers[providerId].api = requireCustomApi(input.api, \"api\");\n raw.providers[providerId].baseUrl = stripTrailingSlashes(requireString(input.baseUrl, \"baseUrl\"));\n } else {\n delete raw.providers[providerId].api;\n if (input.baseUrl) {\n raw.providers[providerId].baseUrl = stripTrailingSlashes(input.baseUrl);\n } else {\n delete raw.providers[providerId].baseUrl;\n }\n }\n }\n\n if (input.providerModelKey || input.providerModelId || input.displayName || input.contextWindow !== undefined || input.maxTokens !== undefined || input.reasoning !== undefined || input.supportsDeveloperRole !== undefined || input.supportsImageInput !== undefined) {\n const providerId = requireIdentifier(input.providerId, \"providerId\");\n const providerModelKey = requireIdentifier(input.providerModelKey ?? `${providerId}_${input.availableModelId ?? input.modelId ?? \"main\"}`, \"providerModelKey\");\n const providerType = raw.providers[providerId]?.type ?? input.providerType;\n raw.providerModels[providerModelKey] = {\n provider: providerId,\n id: requireString(input.providerModelId, \"providerModelId\"),\n displayName: requireString(input.displayName, \"displayName\"),\n };\n if (providerType === \"custom\" && input.contextWindow !== undefined) {\n raw.providerModels[providerModelKey].contextWindow = requireNumber(input.contextWindow, \"contextWindow\");\n }\n if (providerType === \"custom\" && input.maxTokens !== undefined) {\n raw.providerModels[providerModelKey].maxTokens = requireNumber(input.maxTokens, \"maxTokens\");\n }\n if (providerType === \"custom\" && input.reasoning !== undefined) {\n raw.providerModels[providerModelKey].reasoning = requireBoolean(input.reasoning, \"reasoning\");\n }\n if (providerType === \"custom\" && input.supportsImageInput !== undefined) {\n raw.providerModels[providerModelKey].supportsImageInput = requireBoolean(input.supportsImageInput, \"supportsImageInput\");\n }\n if (providerType === \"custom\" && input.supportsDeveloperRole !== undefined) {\n raw.providerModels[providerModelKey].supportsDeveloperRole = requireBoolean(input.supportsDeveloperRole, \"supportsDeveloperRole\");\n }\n if (providerType !== \"custom\") {\n delete raw.providerModels[providerModelKey].contextWindow;\n delete raw.providerModels[providerModelKey].maxTokens;\n delete raw.providerModels[providerModelKey].reasoning;\n delete raw.providerModels[providerModelKey].supportsDeveloperRole;\n delete raw.providerModels[providerModelKey].supportsImageInput;\n }\n }\n\n if (input.addToAvailable === true || input.availableModelId || input.modelId) {\n const providerId = input.providerId ? requireIdentifier(input.providerId, \"providerId\") : undefined;\n const providerModelKey = requireIdentifier(input.providerModelKey ?? (providerId ? `${providerId}_${input.availableModelId ?? input.modelId ?? \"main\"}` : undefined), \"providerModelKey\");\n const availableModelId = requireIdentifier(input.availableModelId ?? input.modelId, \"availableModelId\");\n raw.availableModels[availableModelId] = {\n model: providerModelKey,\n ...(input.displayName ? { displayName: input.displayName } : {}),\n };\n }\n\n if (input.removeAvailableModelId) {\n const availableModelId = requireIdentifier(input.removeAvailableModelId, \"removeAvailableModelId\");\n delete raw.availableModels[availableModelId];\n if (raw.modelProfile?.roles) {\n const fallbackModelId = Object.keys(raw.availableModels).sort()[0];\n if (!fallbackModelId) {\n delete raw.modelProfile;\n } else {\n for (const role of [\"primary\", \"standard\", \"auxiliary\"] as const) {\n if (raw.modelProfile.roles[role] === availableModelId) {\n raw.modelProfile.roles[role] = fallbackModelId;\n }\n }\n }\n }\n }\n\n if (input.roles) {\n raw.modelProfile ??= {};\n raw.modelProfile.roles = {\n primary: requireIdentifier(input.roles.primary, \"roles.primary\"),\n standard: requireIdentifier(input.roles.standard, \"roles.standard\"),\n auxiliary: requireIdentifier(input.roles.auxiliary, \"roles.auxiliary\"),\n };\n } else if (!raw.modelProfile?.roles && Object.keys(raw.availableModels).length > 0) {\n const firstAvailableModel = Object.keys(raw.availableModels).sort()[0]!;\n raw.modelProfile = {\n roles: {\n primary: firstAvailableModel,\n standard: firstAvailableModel,\n auxiliary: firstAvailableModel,\n },\n };\n }\n\n return renderRawConfig(raw);\n};\n\nconst removeProvider = (raw: RawConfig, providerId: string): void => {\n delete raw.providers[providerId];\n const removedProviderModels = new Set<string>();\n for (const [providerModelId, providerModel] of Object.entries(raw.providerModels)) {\n if (providerModel.provider === providerId) {\n delete raw.providerModels[providerModelId];\n removedProviderModels.add(providerModelId);\n }\n }\n const removedAvailableModels = new Set<string>();\n for (const [availableModelId, availableModel] of Object.entries(raw.availableModels)) {\n if (availableModel.model && removedProviderModels.has(availableModel.model)) {\n delete raw.availableModels[availableModelId];\n removedAvailableModels.add(availableModelId);\n }\n }\n if (!raw.modelProfile?.roles) return;\n const fallbackModelId = Object.keys(raw.availableModels).sort()[0];\n if (!fallbackModelId) {\n delete raw.modelProfile;\n return;\n }\n for (const role of [\"primary\", \"standard\", \"auxiliary\"] as const) {\n if (!raw.modelProfile.roles[role] || removedAvailableModels.has(raw.modelProfile.roles[role])) {\n raw.modelProfile.roles[role] = fallbackModelId;\n }\n }\n};\n\nexport const renderMemoryConfig = (input: UpsertMemoryConfigInput): string => {\n const raw = parseEditableConfig(input.existingConfigText);\n raw.memory = {\n ...loadMemory(raw),\n ...(input.enabled !== undefined ? { enabled: requireBoolean(input.enabled, \"memory.enabled\") } : {}),\n ...(input.daily !== undefined ? { daily: requireBoolean(input.daily, \"memory.daily\") } : {}),\n ...(input.sessionMemory !== undefined ? { sessionMemory: requireBoolean(input.sessionMemory, \"memory.sessionMemory\") } : {}),\n ...(input.autoDream !== undefined ? { autoDream: requireBoolean(input.autoDream, \"memory.autoDream\") } : {}),\n ...(input.promoteRoot !== undefined ? { promoteRoot: requireBoolean(input.promoteRoot, \"memory.promoteRoot\") } : {}),\n ...(input.dreamIdleMinutes !== undefined ? { dreamIdleMinutes: requireNonNegativeNumber(input.dreamIdleMinutes, \"memory.dreamIdleMinutes\") } : {}),\n ...(input.autoCompactThreshold !== undefined ? { autoCompactThreshold: requireCompactThreshold(input.autoCompactThreshold) } : {}),\n };\n return renderRawConfig(raw);\n};\n\nexport const renderRuntimeConfig = (input: UpsertRuntimeConfigInput): string => {\n const raw = parseEditableConfig(input.existingConfigText);\n raw.runtime = {\n ...loadRuntime(raw),\n ...(input.tokenSavingRtk !== undefined ? { tokenSavingRtk: requireBoolean(input.tokenSavingRtk, \"runtime.tokenSavingRtk\") } : {}),\n };\n return renderRawConfig(raw);\n};\n\nexport const renderExtensionConfig = (input: UpsertExtensionConfigInput): string => {\n const raw = parseEditableConfig(input.existingConfigText);\n const extensionId = requireIdentifier(input.extensionId, \"extensionId\");\n const existing = raw.extensions[extensionId] ?? {};\n const config = { ...(existing.config ?? {}) };\n for (const [key, value] of Object.entries(input.config ?? {})) {\n if (!/^[A-Za-z0-9_-]+$/.test(key)) {\n throw new Error(`Unsupported config key: ${key}`);\n }\n if (value === undefined || value === \"\") {\n delete config[key];\n } else {\n config[key] = value;\n }\n }\n raw.extensions[extensionId] = {\n enabled: input.enabled ?? existing.enabled ?? false,\n kind: input.kind ?? (existing.kind === \"im\" ? \"im\" : \"im\"),\n ...(Object.keys(config).length > 0 ? { config } : {}),\n };\n return renderRawConfig(raw);\n};\n\nconst DEFAULT_MEMORY_CONFIG: MemoryConfig = {\n enabled: true,\n daily: true,\n sessionMemory: true,\n autoDream: true,\n promoteRoot: true,\n dreamIdleMinutes: 60,\n autoCompactThreshold: 0.8,\n};\n\nconst DEFAULT_RUNTIME_CONFIG: RuntimeConfig = {\n tokenSavingRtk: false,\n};\n\nconst loadMemory = (raw: RawConfig): MemoryConfig => ({\n enabled: raw.memory?.enabled ?? DEFAULT_MEMORY_CONFIG.enabled,\n daily: raw.memory?.daily ?? DEFAULT_MEMORY_CONFIG.daily,\n sessionMemory: raw.memory?.sessionMemory ?? DEFAULT_MEMORY_CONFIG.sessionMemory,\n autoDream: raw.memory?.autoDream ?? DEFAULT_MEMORY_CONFIG.autoDream,\n promoteRoot: raw.memory?.promoteRoot ?? DEFAULT_MEMORY_CONFIG.promoteRoot,\n dreamIdleMinutes: requireNonNegativeNumber(raw.memory?.dreamIdleMinutes ?? DEFAULT_MEMORY_CONFIG.dreamIdleMinutes, \"memory.dreamIdleMinutes\"),\n autoCompactThreshold: requireCompactThreshold(raw.memory?.autoCompactThreshold ?? DEFAULT_MEMORY_CONFIG.autoCompactThreshold),\n});\n\nconst loadRuntime = (raw: RawConfig): RuntimeConfig => ({\n tokenSavingRtk: raw.runtime?.tokenSavingRtk ?? DEFAULT_RUNTIME_CONFIG.tokenSavingRtk,\n});\n\nconst loadExtensions = (raw: RawConfig): Record<string, ExtensionConfig> => {\n const extensions: Record<string, ExtensionConfig> = {};\n for (const [extensionId, extension] of Object.entries(raw.extensions)) {\n if (extension.kind !== \"im\") {\n throw new Error(`extensions.${extensionId}.kind must be im`);\n }\n extensions[extensionId] = {\n enabled: extension.enabled === true,\n kind: \"im\",\n config: extension.config ?? {},\n };\n }\n return extensions;\n};\n\nconst loadProviders = (raw: RawConfig, env: Record<string, string | undefined>): Record<string, ScorelProviderConfig> => {\n const providers: Record<string, ScorelProviderConfig> = {};\n for (const [providerId, provider] of Object.entries(raw.providers)) {\n const apiKey = resolveProviderApiKey(provider, env, `providers.${providerId}`);\n\n if (provider.type === \"builtin\") {\n providers[providerId] = {\n type: \"builtin\",\n provider: normalizeProviderName(requireString(provider.provider, `providers.${providerId}.provider`)),\n ...(provider.baseUrl ? { baseUrl: stripTrailingSlashes(provider.baseUrl) } : {}),\n apiKey,\n };\n continue;\n }\n\n if (provider.type === \"custom\") {\n providers[providerId] = {\n type: \"custom\",\n api: requireCustomApi(provider.api, `providers.${providerId}.api`),\n provider: normalizeProviderName(requireString(provider.provider, `providers.${providerId}.provider`)),\n baseUrl: stripTrailingSlashes(requireString(provider.baseUrl, `providers.${providerId}.baseUrl`)),\n apiKey,\n };\n continue;\n }\n\n throw new Error(`providers.${providerId}.type must be builtin or custom`);\n }\n if (Object.keys(providers).length === 0) {\n throw new Error(\"at least one provider config is required\");\n }\n return providers;\n};\n\nconst loadProviderProfiles = (\n raw: RawConfig,\n env: Record<string, string | undefined>,\n options: { includeSecrets?: boolean } = {},\n): Record<string, ProviderProfileConfig> => {\n const providers: Record<string, ProviderProfileConfig> = {};\n for (const [providerId, provider] of Object.entries(raw.providers)) {\n const credential = providerCredentialSummary(provider, env);\n const base = {\n providerId,\n provider: normalizeProviderName(requireString(provider.provider, `providers.${providerId}.provider`)),\n ...credential,\n ...(options.includeSecrets && provider.apiKey ? { apiKey: provider.apiKey } : {}),\n } as const;\n\n if (provider.type === \"builtin\") {\n providers[providerId] = {\n ...base,\n type: \"builtin\",\n ...(provider.baseUrl ? { baseUrl: stripTrailingSlashes(provider.baseUrl) } : {}),\n };\n continue;\n }\n\n if (provider.type === \"custom\") {\n providers[providerId] = {\n ...base,\n type: \"custom\",\n api: requireCustomApi(provider.api, `providers.${providerId}.api`),\n baseUrl: stripTrailingSlashes(requireString(provider.baseUrl, `providers.${providerId}.baseUrl`)),\n };\n continue;\n }\n\n throw new Error(`providers.${providerId}.type must be builtin or custom`);\n }\n return providers;\n};\n\nconst loadProviderModels = (\n raw: RawConfig,\n providers: Record<string, { type: \"builtin\" | \"custom\" }>,\n options: { requireAny?: boolean } = { requireAny: true },\n): Record<string, ProviderModelConfig> => {\n const models: Record<string, ProviderModelConfig> = {};\n for (const [modelId, model] of Object.entries(raw.providerModels)) {\n const providerId = requireString(model.provider, `provider_models.${modelId}.provider`);\n const provider = providers[providerId];\n if (!provider) {\n throw new Error(`provider_models.${modelId}.provider must reference a configured provider`);\n }\n const loaded: ProviderModelConfig = {\n provider: providerId,\n id: requireString(model.id, `provider_models.${modelId}.id`),\n displayName: requireString(model.displayName, `provider_models.${modelId}.displayName`),\n };\n if (provider.type === \"custom\") {\n if (model.contextWindow !== undefined) {\n loaded.contextWindow = requireNumber(model.contextWindow, `provider_models.${modelId}.contextWindow`);\n }\n if (model.maxTokens !== undefined) {\n loaded.maxTokens = requireNumber(model.maxTokens, `provider_models.${modelId}.maxTokens`);\n }\n if (model.reasoning !== undefined) {\n loaded.reasoning = requireBoolean(model.reasoning, `provider_models.${modelId}.reasoning`);\n }\n if (model.supportsImageInput !== undefined) {\n loaded.supportsImageInput = requireBoolean(model.supportsImageInput, `provider_models.${modelId}.supportsImageInput`);\n }\n if (model.supportsDeveloperRole !== undefined) {\n loaded.compat = {\n supportsDeveloperRole: requireBoolean(model.supportsDeveloperRole, `provider_models.${modelId}.supportsDeveloperRole`),\n };\n }\n }\n models[modelId] = loaded;\n }\n if (options.requireAny !== false && Object.keys(models).length === 0) {\n throw new Error(\"at least one provider model config is required\");\n }\n return models;\n};\n\nconst loadAvailableModels = (\n raw: RawConfig,\n providerModels: Record<string, ProviderModelConfig>,\n options: { requireAny?: boolean; includeAllProviderModels?: boolean } = { requireAny: true, includeAllProviderModels: true },\n): Record<string, AvailableModelConfig> => {\n const models: Record<string, AvailableModelConfig> = {};\n if (options.includeAllProviderModels !== false && Object.keys(raw.availableModels).length === 0) {\n for (const [modelId, providerModel] of Object.entries(providerModels)) {\n models[modelId] = {\n model: modelId,\n displayName: providerModel.displayName,\n };\n }\n return models;\n }\n for (const [modelId, model] of Object.entries(raw.availableModels)) {\n const providerModelId = requireString(model.model, `available_models.${modelId}.model`);\n if (!providerModels[providerModelId]) {\n throw new Error(`available_models.${modelId}.model must reference a configured provider model`);\n }\n models[modelId] = {\n model: providerModelId,\n ...(model.displayName ? { displayName: model.displayName } : {}),\n };\n }\n if (options.requireAny !== false && Object.keys(models).length === 0) {\n throw new Error(\"at least one available model config is required\");\n }\n return models;\n};\n\nconst loadRoles = (\n raw: RawConfig,\n models: Record<string, AvailableModelConfig>,\n options: { requireComplete?: boolean } = { requireComplete: true },\n): Record<ModelRole, string> => {\n const roles = raw.modelProfile?.roles;\n if (!roles) {\n if (options.requireComplete === false) {\n return { primary: \"\", standard: \"\", auxiliary: \"\" };\n }\n throw new Error(\"model_profile.roles is required\");\n }\n if (options.requireComplete === false) {\n return {\n primary: roles.primary ? requireModelRole(roles.primary, \"primary\", models) : \"\",\n standard: roles.standard ? requireModelRole(roles.standard, \"standard\", models) : \"\",\n auxiliary: roles.auxiliary ? requireModelRole(roles.auxiliary, \"auxiliary\", models) : \"\",\n };\n }\n return {\n primary: requireModelRole(roles.primary, \"primary\", models),\n standard: requireModelRole(roles.standard, \"standard\", models),\n auxiliary: requireModelRole(roles.auxiliary, \"auxiliary\", models),\n };\n};\n\nconst readConfigText = async (options: LoadScorelConfigOptions): Promise<string> => {\n const userPath = configPathForDevice(options);\n try {\n return await readFile(userPath, \"utf8\");\n } catch (cause) {\n if (isNodeErrorCode(cause, \"ENOENT\")) {\n throw new Error(`Scorel config not found: ${userPath}`);\n }\n throw cause;\n }\n};\n\nconst configPathForDevice = (options: LoadScorelConfigOptions): string => {\n if (options.scorelHomeDir) {\n return join(options.scorelHomeDir, \"config.toml\");\n }\n const home = options.homeDir ?? process.env.HOME;\n if (!home) {\n throw new Error(\"Scorel config not found: HOME is not set\");\n }\n return scorelUserConfigPath(home);\n};\n\nconst parseToml = (text: string): RawConfig => {\n const result: RawConfig = emptyRawConfig();\n let section: ConfigSection = { kind: \"root\" };\n\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = stripComment(rawLine).trim();\n if (line.length === 0) {\n continue;\n }\n\n const sectionMatch = /^\\[([A-Za-z0-9_.-]+)\\]$/.exec(line);\n if (sectionMatch) {\n section = requireSection(sectionMatch[1] ?? \"\");\n ensureSection(result, section);\n continue;\n }\n\n const match = /^([A-Za-z0-9_-]+)\\s*=\\s*(.+?)\\s*$/.exec(line);\n if (!match) {\n throw new Error(`Unsupported config line: ${rawLine.trim()}`);\n }\n const [, key, rawValue] = match;\n if (!key || rawValue === undefined) {\n throw new Error(`Unsupported config line: ${rawLine.trim()}`);\n }\n setConfigValue(result, section, key, parseTomlValue(rawValue));\n }\n\n return result;\n};\n\nconst parseEditableConfig = (text: string | undefined): RawConfig => {\n if (!text?.trim()) {\n return emptyRawConfig();\n }\n return parseToml(text);\n};\n\nconst renderRawConfig = (raw: RawConfig): string => {\n const lines: string[] = [];\n for (const [providerId, provider] of Object.entries(raw.providers).sort(([left], [right]) => left.localeCompare(right))) {\n lines.push(`[providers.${providerId}]`);\n lines.push(`type = ${tomlString(requireProviderType(provider.type, `providers.${providerId}.type`))}`);\n lines.push(`provider = ${tomlString(normalizeProviderName(requireString(provider.provider, `providers.${providerId}.provider`)))}`);\n if (provider.type === \"custom\") {\n lines.push(`api = ${tomlString(requireCustomApi(provider.api, `providers.${providerId}.api`))}`);\n lines.push(`baseUrl = ${tomlString(stripTrailingSlashes(requireString(provider.baseUrl, `providers.${providerId}.baseUrl`)))}`);\n } else if (provider.baseUrl) {\n lines.push(`baseUrl = ${tomlString(stripTrailingSlashes(provider.baseUrl))}`);\n }\n if (provider.apiKey) {\n lines.push(`apiKey = ${tomlString(requireString(provider.apiKey, `providers.${providerId}.apiKey`))}`);\n } else {\n lines.push(`apiKeyEnv = ${tomlString(requireString(provider.apiKeyEnv, `providers.${providerId}.apiKeyEnv`))}`);\n }\n lines.push(\"\");\n }\n\n for (const [modelId, model] of Object.entries(raw.providerModels).sort(([left], [right]) => left.localeCompare(right))) {\n lines.push(`[provider_models.${modelId}]`);\n lines.push(`provider = ${tomlString(requireString(model.provider, `provider_models.${modelId}.provider`))}`);\n lines.push(`id = ${tomlString(requireString(model.id, `provider_models.${modelId}.id`))}`);\n lines.push(`displayName = ${tomlString(requireString(model.displayName, `provider_models.${modelId}.displayName`))}`);\n const provider = raw.providers[model.provider ?? \"\"];\n if (provider?.type === \"custom\" && model.contextWindow !== undefined) {\n lines.push(`contextWindow = ${requireNumber(model.contextWindow, `provider_models.${modelId}.contextWindow`)}`);\n }\n if (provider?.type === \"custom\" && model.maxTokens !== undefined) {\n lines.push(`maxTokens = ${requireNumber(model.maxTokens, `provider_models.${modelId}.maxTokens`)}`);\n }\n if (provider?.type === \"custom\" && model.reasoning !== undefined) {\n lines.push(`reasoning = ${requireBoolean(model.reasoning, `provider_models.${modelId}.reasoning`)}`);\n }\n if (provider?.type === \"custom\" && model.supportsImageInput !== undefined) {\n lines.push(`supportsImageInput = ${requireBoolean(model.supportsImageInput, `provider_models.${modelId}.supportsImageInput`)}`);\n }\n if (provider?.type === \"custom\" && model.supportsDeveloperRole !== undefined) {\n lines.push(`supportsDeveloperRole = ${requireBoolean(model.supportsDeveloperRole, `provider_models.${modelId}.supportsDeveloperRole`)}`);\n }\n lines.push(\"\");\n }\n\n for (const [modelId, model] of Object.entries(raw.availableModels).sort(([left], [right]) => left.localeCompare(right))) {\n lines.push(`[available_models.${modelId}]`);\n lines.push(`model = ${tomlString(requireString(model.model, `available_models.${modelId}.model`))}`);\n if (model.displayName) {\n lines.push(`displayName = ${tomlString(model.displayName)}`);\n }\n lines.push(\"\");\n }\n\n if (raw.modelProfile?.roles) {\n lines.push(\"[model_profile.roles]\");\n lines.push(`primary = ${tomlString(requireIdentifier(raw.modelProfile.roles.primary, \"model_profile.roles.primary\"))}`);\n lines.push(`standard = ${tomlString(requireIdentifier(raw.modelProfile.roles.standard, \"model_profile.roles.standard\"))}`);\n lines.push(`auxiliary = ${tomlString(requireIdentifier(raw.modelProfile.roles.auxiliary, \"model_profile.roles.auxiliary\"))}`);\n lines.push(\"\");\n }\n if (raw.memory) {\n const memory = loadMemory(raw);\n lines.push(\"[memory]\");\n lines.push(`enabled = ${memory.enabled}`);\n lines.push(`daily = ${memory.daily}`);\n lines.push(`sessionMemory = ${memory.sessionMemory}`);\n lines.push(`autoDream = ${memory.autoDream}`);\n lines.push(`promoteRoot = ${memory.promoteRoot}`);\n lines.push(`dreamIdleMinutes = ${memory.dreamIdleMinutes}`);\n lines.push(`autoCompactThreshold = ${memory.autoCompactThreshold}`);\n lines.push(\"\");\n }\n if (raw.runtime) {\n const runtime = loadRuntime(raw);\n lines.push(\"[runtime]\");\n lines.push(`tokenSavingRtk = ${runtime.tokenSavingRtk}`);\n lines.push(\"\");\n }\n for (const [extensionId, extension] of Object.entries(raw.extensions).sort(([left], [right]) => left.localeCompare(right))) {\n lines.push(`[extensions.${extensionId}]`);\n lines.push(`enabled = ${extension.enabled === true}`);\n lines.push(`kind = ${tomlString(extension.kind === \"im\" ? \"im\" : requireString(extension.kind, `extensions.${extensionId}.kind`))}`);\n lines.push(\"\");\n if (extension.config && Object.keys(extension.config).length > 0) {\n lines.push(`[extensions.${extensionId}.config]`);\n for (const [key, value] of Object.entries(extension.config).sort(([left], [right]) => left.localeCompare(right))) {\n lines.push(`${key} = ${renderTomlValue(value)}`);\n }\n lines.push(\"\");\n }\n }\n return lines.join(\"\\n\");\n};\n\nconst emptyRawConfig = (): RawConfig => ({\n providers: {},\n providerModels: {},\n availableModels: {},\n extensions: {},\n});\n\nconst stripComment = (line: string): string => {\n const index = line.indexOf(\"#\");\n return index === -1 ? line : line.slice(0, index);\n};\n\nconst requireString = (value: string | undefined, name: string): string => {\n if (!value) {\n throw new Error(`${name} is required`);\n }\n return value;\n};\n\nconst normalizeProviderName = (value: string): string => {\n const provider = value.split(\"/\")[0]?.trim();\n return provider || value.trim();\n};\n\nconst requireProviderCredential = (provider: { apiKeyEnv?: string; apiKey?: string }, name: string): void => {\n if (!provider.apiKeyEnv && !provider.apiKey) {\n throw new Error(`${name}.apiKeyEnv or ${name}.apiKey is required`);\n }\n};\n\nconst resolveProviderApiKey = (\n provider: { apiKeyEnv?: string; apiKey?: string },\n env: Record<string, string | undefined>,\n name: string,\n): string => {\n if (provider.apiKey) {\n return provider.apiKey;\n }\n const apiKeyEnv = requireString(provider.apiKeyEnv, `${name}.apiKeyEnv`);\n const apiKey = env[apiKeyEnv];\n if (!apiKey) {\n throw new Error(`${apiKeyEnv} is not set`);\n }\n return apiKey;\n};\n\nconst providerCredentialSummary = (\n provider: { apiKeyEnv?: string; apiKey?: string },\n env: Record<string, string | undefined>,\n): Pick<ProviderConnectionSummary, \"apiKeyEnv\" | \"credentialSource\" | \"credentialStatus\"> => {\n if (provider.apiKey) {\n return {\n credentialSource: \"direct\",\n credentialStatus: \"available\",\n };\n }\n const apiKeyEnv = provider.apiKeyEnv;\n if (!apiKeyEnv) {\n return {\n credentialSource: \"env\",\n credentialStatus: \"missing\",\n };\n }\n return {\n apiKeyEnv,\n credentialSource: \"env\",\n credentialStatus: env[apiKeyEnv] ? \"available\" : \"missing\",\n };\n};\n\nconst requireNumber = (value: number | undefined, name: string): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(`${name} is required`);\n }\n return value;\n};\n\nconst requireNonNegativeNumber = (value: number | undefined, name: string): number => {\n const number = requireNumber(value, name);\n if (number < 0) {\n throw new Error(`${name} must be non-negative`);\n }\n return number;\n};\n\nconst requireCompactThreshold = (value: number | undefined): number => {\n const number = requireNumber(value, \"memory.autoCompactThreshold\");\n if (number <= 0 || number >= 1) {\n throw new Error(\"memory.autoCompactThreshold must be greater than 0 and less than 1\");\n }\n return number;\n};\n\nconst requireBoolean = (value: boolean | undefined, name: string): boolean => {\n if (typeof value !== \"boolean\") {\n throw new Error(`${name} is required`);\n }\n return value;\n};\n\nconst requireCustomApi = (value: string | undefined, name: string): CustomPiAiApi => {\n if (\n value === \"openai-completions\" ||\n value === \"openai-responses\" ||\n value === \"google-generative-ai\" ||\n value === \"anthropic-messages\"\n ) {\n return value;\n }\n throw new Error(`${name} must be openai-completions, openai-responses, google-generative-ai, or anthropic-messages`);\n};\n\nconst requireProviderType = (value: string | undefined, name: string): \"builtin\" | \"custom\" => {\n if (value === \"builtin\" || value === \"custom\") {\n return value;\n }\n throw new Error(`${name} must be builtin or custom`);\n};\n\nconst requireSection = (section: string): ConfigSection => {\n if (section === \"root\") {\n return { kind: \"root\" };\n }\n const providerMatch = /^providers\\.([A-Za-z0-9_-]+)$/.exec(section);\n if (providerMatch?.[1]) {\n return { kind: \"provider\", id: providerMatch[1] };\n }\n const providerModelMatch = /^provider_models\\.([A-Za-z0-9_-]+)$/.exec(section);\n if (providerModelMatch?.[1]) {\n return { kind: \"providerModel\", id: providerModelMatch[1] };\n }\n const availableModelMatch = /^available_models\\.([A-Za-z0-9_-]+)$/.exec(section);\n if (availableModelMatch?.[1]) {\n return { kind: \"availableModel\", id: availableModelMatch[1] };\n }\n if (section === \"model_profile.roles\") {\n return { kind: \"modelProfileRoles\" };\n }\n if (section === \"memory\") {\n return { kind: \"memory\" };\n }\n if (section === \"runtime\") {\n return { kind: \"runtime\" };\n }\n const extensionConfigMatch = /^extensions\\.([A-Za-z0-9_-]+)\\.config$/.exec(section);\n if (extensionConfigMatch?.[1]) {\n return { kind: \"extensionConfig\", id: extensionConfigMatch[1] };\n }\n const extensionMatch = /^extensions\\.([A-Za-z0-9_-]+)$/.exec(section);\n if (extensionMatch?.[1]) {\n return { kind: \"extension\", id: extensionMatch[1] };\n }\n throw new Error(`Unsupported config section: ${section}`);\n};\n\nconst ensureSection = (config: RawConfig, section: ConfigSection): void => {\n if (section.kind === \"provider\") {\n config.providers[section.id] ??= {};\n } else if (section.kind === \"providerModel\") {\n config.providerModels[section.id] ??= {};\n } else if (section.kind === \"availableModel\") {\n config.availableModels[section.id] ??= {};\n } else if (section.kind === \"modelProfileRoles\") {\n config.modelProfile ??= {};\n config.modelProfile.roles ??= {};\n } else if (section.kind === \"memory\") {\n config.memory ??= {};\n } else if (section.kind === \"runtime\") {\n config.runtime ??= {};\n } else if (section.kind === \"extension\") {\n config.extensions[section.id] ??= {};\n } else if (section.kind === \"extensionConfig\") {\n config.extensions[section.id] ??= {};\n config.extensions[section.id].config ??= {};\n }\n};\n\nconst setConfigValue = (config: RawConfig, section: ConfigSection, key: string, value: ConfigValue): void => {\n assertKnownKey(section, key);\n if (section.kind === \"provider\") {\n config.providers[section.id] ??= {};\n setValue(config.providers[section.id], key, value);\n } else if (section.kind === \"providerModel\") {\n config.providerModels[section.id] ??= {};\n setValue(config.providerModels[section.id], key, value);\n } else if (section.kind === \"availableModel\") {\n config.availableModels[section.id] ??= {};\n setValue(config.availableModels[section.id], key, value);\n } else if (section.kind === \"modelProfileRoles\") {\n config.modelProfile ??= {};\n config.modelProfile.roles ??= {};\n setValue(config.modelProfile.roles, key, value);\n } else if (section.kind === \"memory\") {\n config.memory ??= {};\n setValue(config.memory, key, value);\n } else if (section.kind === \"runtime\") {\n config.runtime ??= {};\n setValue(config.runtime, key, value);\n } else if (section.kind === \"extension\") {\n config.extensions[section.id] ??= {};\n setValue(config.extensions[section.id], key, value);\n } else if (section.kind === \"extensionConfig\") {\n config.extensions[section.id] ??= {};\n const extensionConfig = config.extensions[section.id].config ?? {};\n config.extensions[section.id].config = extensionConfig;\n setValue(extensionConfig, key, value);\n }\n};\n\nconst assertKnownKey = (section: ConfigSection, key: string): void => {\n const schemaSection = section.kind;\n if (schemaSection === \"extensionConfig\") {\n if (!/^[A-Za-z0-9_-]+$/.test(key)) {\n throw new Error(`Unsupported config key: ${key}`);\n }\n return;\n }\n const allowed = SCOREL_CONFIG_SCHEMA.sections[schemaSection].keys;\n if (!(allowed as readonly string[]).includes(key)) {\n throw new Error(`Unsupported config key: ${key}`);\n }\n};\n\nconst setValue = (target: object, key: string, value: ConfigValue): void => {\n (target as Record<string, ConfigValue | undefined>)[key] = value;\n};\n\nconst parseTomlValue = (value: string): ConfigValue => {\n const stringMatch = /^\"([^\"]*)\"$/.exec(value);\n if (stringMatch) {\n return stringMatch[1] ?? \"\";\n }\n if (value === \"true\") {\n return true;\n }\n if (value === \"false\") {\n return false;\n }\n const number = Number(value);\n if (Number.isFinite(number)) {\n return number;\n }\n throw new Error(`Unsupported config value: ${value}`);\n};\n\nconst stripTrailingSlashes = (value: string): string => value.replace(/\\/+$/, \"\");\n\nconst requireIdentifier = (value: string | undefined, name: string): string => {\n const text = requireString(value, name);\n if (!/^[A-Za-z0-9_-]+$/.test(text)) {\n throw new Error(`${name} must contain only letters, numbers, underscores, or hyphens`);\n }\n return text;\n};\n\nconst tomlString = (value: string): string => `\"${value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"\\\"\", \"\\\\\\\"\")}\"`;\n\nconst renderTomlValue = (value: ConfigValue): string =>\n typeof value === \"string\" ? tomlString(value) : String(value);\n\nconst isNodeErrorCode = (cause: unknown, code: string): boolean =>\n typeof cause === \"object\" && cause !== null && \"code\" in cause && cause.code === code;\n\nconst requireModelRole = (\n value: string | undefined,\n role: ModelRole,\n models: Record<string, AvailableModelConfig>,\n): string => {\n const modelId = requireString(value, `model_profile.roles.${role}`);\n if (!models[modelId]) {\n throw new Error(`model_profile.roles.${role} must reference a configured model`);\n }\n return modelId;\n};\n\nconst modelRoles = (config: ScorelConfig | ScorelConfigProfile, modelId: string): ModelRole[] =>\n ([\"primary\", \"standard\", \"auxiliary\"] as const).filter((role) => config.modelProfile.roles[role] === modelId);\n", "import { createHash, randomUUID } from \"node:crypto\";\nimport { execFile } from \"node:child_process\";\nimport { mkdir, readFile, rename, rm, stat, writeFile } from \"node:fs/promises\";\nimport { userInfo } from \"node:os\";\nimport { basename, dirname, extname, isAbsolute, relative, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nimport { Type } from \"@mariozechner/pi-ai\";\n\nimport type { AgentTool, ToolResult } from \"./index.js\";\nimport { defineTool } from \"./index.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport type CodingToolsOptions = {\n cwd: string;\n defaultTimeoutMs?: number;\n maxTimeoutMs?: number;\n maxOutputBytes?: number;\n maxReadTokens?: number;\n contextWindow?: number;\n defaultShell?: string;\n toolResultArtifacts?: {\n dir: string;\n };\n tokenSaving?: {\n rtk?: {\n enabled: boolean;\n executable?: string;\n };\n };\n};\n\ntype FileReadSnapshot = {\n content: string;\n hash: string;\n mtimeMs: number;\n ranges: ReadRange[];\n size: number;\n totalLines: number;\n};\n\ntype ReadRange = {\n startLine: number;\n endLine: number;\n};\n\ntype CodingToolsState = {\n reads: Map<string, FileReadSnapshot>;\n todos: TodoItem[];\n};\n\ntype ReadArgs = {\n path: string;\n offset?: number;\n limit?: number;\n full?: boolean;\n};\n\ntype WriteArgs = {\n path: string;\n content: string;\n};\n\ntype EditArgs = {\n path: string;\n old_string: string;\n new_string: string;\n replace_all?: boolean;\n};\n\ntype BashArgs = {\n command: string;\n cwd?: string;\n timeoutMs?: number;\n maxOutputBytes?: number;\n description?: string;\n};\n\ntype GlobArgs = {\n pattern: string;\n path?: string;\n head_limit?: number;\n offset?: number;\n};\n\ntype GrepArgs = {\n pattern: string;\n path?: string;\n glob?: string;\n output_mode?: \"files\" | \"content\" | \"count\";\n before_context?: number;\n after_context?: number;\n context?: number;\n line_numbers?: boolean;\n case_insensitive?: boolean;\n type?: string;\n head_limit?: number;\n offset?: number;\n multiline?: boolean;\n};\n\ntype TodoStatus = \"pending\" | \"in_progress\" | \"completed\";\n\ntype TodoItem = {\n content: string;\n status: TodoStatus;\n activeForm?: string;\n};\n\ntype TodoWriteArgs = {\n todos: TodoItem[];\n};\n\nconst DEFAULT_SEARCH_LIMIT = 100;\nconst DEFAULT_GREP_LIMIT = 250;\nconst DEFAULT_READ_LIMIT = 2_000;\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\nconst READ_TOKEN_BUDGET_RATIO = 0.01;\nconst FULL_READ_TOKEN_BUDGET_RATIO = 0.1;\n\nexport const createCodingTools = (options: CodingToolsOptions): AgentTool[] => {\n const root = resolve(options.cwd);\n const state: CodingToolsState = { reads: new Map(), todos: [] };\n const defaultTimeoutMs = options.defaultTimeoutMs ?? 30_000;\n const maxTimeoutMs = options.maxTimeoutMs ?? 120_000;\n const maxOutputBytes = options.maxOutputBytes ?? 16_000;\n const normalReadTokens = options.maxReadTokens ?? readTokenBudget(options.contextWindow, READ_TOKEN_BUDGET_RATIO);\n const fullReadTokens = options.maxReadTokens ?? readTokenBudget(options.contextWindow, FULL_READ_TOKEN_BUDGET_RATIO);\n const defaultShell = resolveDefaultShell(options.defaultShell);\n\n const resolveWorkspacePath = (input: string): string => {\n if (input.length === 0) {\n throw new Error(\"path must not be empty\");\n }\n const candidate = isAbsolute(input) ? resolve(input) : resolve(root, input);\n if (!isWithin(root, candidate)) {\n throw new Error(`path escapes workspace: ${input}`);\n }\n return candidate;\n };\n\n const workspaceTarget = (input: string | undefined): string => {\n const target = input ? resolveWorkspacePath(input) : root;\n return relative(root, target) || \".\";\n };\n\n const assertFreshReadableCoverage = async (path: string, toolName: string): Promise<FileReadSnapshot> => {\n const snapshot = state.reads.get(path);\n if (!snapshot) {\n throw new Error(`Read must be used before ${toolName} on existing file: ${path}`);\n }\n if (!hasCompleteCoverage(snapshot.ranges, snapshot.totalLines)) {\n throw new Error(`The complete file must be read before ${toolName} on existing file: ${path}`);\n }\n const current = await snapshotFile(path);\n if (!sameSnapshot(snapshot, current)) {\n throw new Error(`File changed since last Read: ${path}`);\n }\n return snapshot;\n };\n\n return [\n defineTool({\n name: \"Read\",\n description:\n \"Read a text file from the workspace. Long reads are truncated by complete lines; accumulated coverage unlocks Write/Edit.\",\n parameters: Type.Object({\n file_path: Type.String(),\n offset: Type.Optional(Type.Number()),\n limit: Type.Optional(Type.Number()),\n full: Type.Optional(Type.Boolean()),\n }),\n execute: async (_toolCallId, args) => {\n const input = parseReadArgs(args);\n if (input.full && (input.offset !== undefined || input.limit !== undefined)) {\n throw new Error(\"full cannot be combined with offset or limit\");\n }\n const path = resolveWorkspacePath(input.path);\n assertReadableFileKind(path);\n const fileStat = await stat(path);\n if (fileStat.isDirectory()) {\n throw new Error(`Read cannot read a directory: ${input.path}. Use Glob to find files.`);\n }\n\n const buffer = await readFile(path);\n assertTextBuffer(buffer, input.path);\n const content = buffer.toString(\"utf8\");\n const lines = linesOf(content);\n const offset = input.offset ?? 1;\n const limit = input.full ? Math.max(lines.length, 1) : (input.limit ?? DEFAULT_READ_LIMIT);\n if (!Number.isInteger(offset) || offset < 1) {\n throw new Error(\"offset must be a positive integer\");\n }\n if (!Number.isInteger(limit) || limit < 1) {\n throw new Error(\"limit must be a positive integer\");\n }\n\n const startIndex = offset - 1;\n const candidate = lines.slice(startIndex, startIndex + limit);\n const tokenBudget = input.full ? fullReadTokens : normalReadTokens;\n const selected = selectCompleteLinesWithinBudget(candidate, offset, tokenBudget);\n const endLine = selected.length === 0 ? offset - 1 : offset + selected.length - 1;\n const truncated = startIndex + selected.length < lines.length;\n const nextOffset = truncated ? endLine + 1 : null;\n const current = await snapshotFile(path, content);\n const previous = state.reads.get(path);\n const previousRanges = previous && sameSnapshot(previous, current) ? previous.ranges : [];\n const currentRange = selected.length > 0 ? [{ startLine: offset, endLine }] : [];\n const ranges = mergeRanges([...previousRanges, ...currentRange]);\n const canWrite = hasCompleteCoverage(ranges, lines.length);\n state.reads.set(path, { ...current, ranges });\n\n const rendered = renderReadLines(selected, offset);\n const truncationNotice = truncated\n ? `\\n\\n[Showing lines ${offset}-${endLine}/${lines.length}. Next offset: ${nextOffset}.]`\n : \"\";\n const text = `${rendered}${truncationNotice}`;\n\n return textResult(text, {\n path,\n startLine: offset,\n endLine,\n totalLines: lines.length,\n truncated,\n nextOffset,\n size: fileStat.size,\n estimatedTokens: estimateTokens(rendered),\n tokenBudget,\n canWrite,\n });\n },\n }),\n defineTool({\n name: \"Write\",\n description:\n \"Create a new file or fully overwrite an existing file. Existing files require complete read coverage of the current file.\",\n parameters: Type.Object({\n file_path: Type.String(),\n content: Type.String(),\n }),\n execute: async (_toolCallId, args) => {\n const input = parseWriteArgs(args);\n const path = resolveWorkspacePath(input.path);\n const previous = (await exists(path)) ? await assertFreshReadableCoverage(path, \"Write\") : undefined;\n\n await mkdir(dirname(path), { recursive: true });\n await atomicWriteFile(path, input.content);\n state.reads.set(path, await snapshotFile(path, input.content, completeRanges(linesOf(input.content).length)));\n\n const type = previous ? \"update\" : \"create\";\n return textResult(\n type === \"create\" ? `File created successfully at: ${path}` : `The file ${path} has been updated successfully.`,\n {\n type,\n filePath: path,\n bytes: byteLength(input.content),\n },\n );\n },\n }),\n defineTool({\n name: \"Edit\",\n description:\n \"Perform an exact string replacement in an existing file. Requires complete read coverage and a unique old_string unless replace_all is true.\",\n parameters: Type.Object({\n file_path: Type.String(),\n old_string: Type.String(),\n new_string: Type.String(),\n replace_all: Type.Optional(Type.Boolean()),\n }),\n execute: async (_toolCallId, args) => {\n const input = parseEditArgs(args);\n const path = resolveWorkspacePath(input.path);\n await assertFreshReadableCoverage(path, \"Edit\");\n if (input.old_string === input.new_string) {\n throw new Error(\"old_string and new_string must differ\");\n }\n\n const content = await readFile(path, \"utf8\");\n const count = countOccurrences(content, input.old_string);\n if (count === 0) {\n throw new Error(`String to replace not found in file.\\nString: ${input.old_string}`);\n }\n if (count > 1 && !input.replace_all) {\n throw new Error(\n `Found ${count} matches of the string to replace, but replace_all is false. Provide more context or set replace_all to true.\\nString: ${input.old_string}`,\n );\n }\n\n const next = input.replace_all\n ? content.split(input.old_string).join(input.new_string)\n : content.replace(input.old_string, input.new_string);\n await atomicWriteFile(path, next);\n state.reads.set(path, await snapshotFile(path, next, completeRanges(linesOf(next).length)));\n return textResult(\n input.replace_all\n ? `The file ${path} has been updated. All occurrences were successfully replaced.`\n : `The file ${path} has been updated successfully.`,\n {\n filePath: path,\n replacements: input.replace_all ? count : 1,\n replaceAll: input.replace_all ?? false,\n },\n );\n },\n }),\n defineTool({\n name: \"Bash\",\n description: \"Execute a shell command in the workspace with timeout and output truncation.\",\n parameters: Type.Object({\n command: Type.String(),\n cwd: Type.Optional(Type.String()),\n timeout: Type.Optional(Type.Number()),\n description: Type.Optional(Type.String()),\n maxOutputBytes: Type.Optional(Type.Number()),\n }),\n execute: async (toolCallId, args, signal) => {\n const input = parseBashArgs(args);\n const commandCwd = input.cwd ? resolveWorkspacePath(input.cwd) : root;\n const timeoutMs = Math.min(input.timeoutMs ?? defaultTimeoutMs, maxTimeoutMs);\n const outputLimit = input.maxOutputBytes ?? maxOutputBytes;\n const rtk = options.tokenSaving?.rtk;\n const rtkCommand = await resolveRtkCommand(rtk, input.command);\n const command = rtkCommand.rewrittenCommand ?? input.command;\n const executionCommand = rtkCommand.executionCommand ?? input.command;\n const executable = defaultShell;\n const argv = shellCommandArgs(defaultShell, executionCommand);\n const rtkGainBefore = rtkCommand.applied && rtk?.executable ? await readRtkGain(rtk.executable, commandCwd) : undefined;\n const rtkResult = {\n enabled: rtk?.enabled === true,\n applied: rtkCommand.applied,\n ...(rtk?.executable ? { executable: rtk.executable } : {}),\n ...(rtkCommand.rewrittenCommand ? { rewrittenCommand: rtkCommand.rewrittenCommand } : {}),\n };\n\n try {\n const result = await execFileAsync(executable, argv, {\n cwd: commandCwd,\n timeout: timeoutMs,\n signal,\n maxBuffer: Math.max(outputLimit * 4, 1024 * 1024),\n });\n const rtkSavedTokens = rtk?.executable ? await rtkSavedTokenDelta(rtk.executable, commandCwd, rtkGainBefore) : undefined;\n return await bashResult({\n exitCode: 0,\n stdout: result.stdout,\n stderr: result.stderr,\n cwd: commandCwd,\n outputLimit,\n artifactDir: options.toolResultArtifacts?.dir,\n toolCallId,\n shell: defaultShell,\n command,\n rtk: withRtkSavings(rtkResult, rtkSavedTokens),\n });\n } catch (cause) {\n if (isTimeoutError(cause)) {\n throw new Error(`Bash command timed out after ${timeoutMs}ms`);\n }\n if (isExecError(cause)) {\n const rtkSavedTokens = rtk?.executable ? await rtkSavedTokenDelta(rtk.executable, commandCwd, rtkGainBefore) : undefined;\n return await bashResult({\n exitCode: typeof cause.code === \"number\" ? cause.code : 1,\n stdout: String(cause.stdout ?? \"\"),\n stderr: String(cause.stderr ?? cause.message),\n cwd: commandCwd,\n outputLimit,\n artifactDir: options.toolResultArtifacts?.dir,\n toolCallId,\n shell: defaultShell,\n command,\n rtk: withRtkSavings(rtkResult, rtkSavedTokens),\n });\n }\n throw cause;\n }\n },\n }),\n defineTool({\n name: \"Glob\",\n description: \"Find files by glob pattern using ripgrep file discovery.\",\n parameters: Type.Object({\n pattern: Type.String(),\n path: Type.Optional(Type.String()),\n head_limit: Type.Optional(Type.Number()),\n offset: Type.Optional(Type.Number()),\n }),\n execute: async (_toolCallId, args, signal) => {\n const input = parseGlobArgs(args);\n const limit = input.head_limit ?? DEFAULT_SEARCH_LIMIT;\n const offset = input.offset ?? 0;\n const all = (await runRipgrep([\"--files\", \"--hidden\", \"--glob\", input.pattern, ...vcsExcludes()], workspaceTarget(input.path), root, signal))\n .sort((left, right) => toWorkspaceRelative(root)(left).localeCompare(toWorkspaceRelative(root)(right)));\n const selected = paginate(all, limit, offset);\n const text = selected.items.map(toWorkspaceRelative(root)).join(\"\\n\");\n return textResult(text || \"No files found\", {\n filenames: selected.items.map(toWorkspaceRelative(root)),\n numFiles: selected.items.length,\n totalFiles: all.length,\n truncated: selected.truncated,\n ...(selected.appliedLimit !== undefined ? { appliedLimit: selected.appliedLimit } : {}),\n ...(offset > 0 ? { appliedOffset: offset } : {}),\n });\n },\n }),\n defineTool({\n name: \"Grep\",\n description:\n 'Search file contents with ripgrep. Default output_mode is \"files\" for matching paths; use \"content\" for matching lines or \"count\" for match counts.',\n parameters: Type.Object({\n pattern: Type.String(),\n path: Type.Optional(Type.String()),\n glob: Type.Optional(Type.String()),\n output_mode: Type.Optional(Type.Union([Type.Literal(\"files\"), Type.Literal(\"content\"), Type.Literal(\"count\")])),\n \"-B\": Type.Optional(Type.Number()),\n \"-A\": Type.Optional(Type.Number()),\n \"-C\": Type.Optional(Type.Number()),\n context: Type.Optional(Type.Number()),\n \"-n\": Type.Optional(Type.Boolean()),\n \"-i\": Type.Optional(Type.Boolean()),\n type: Type.Optional(Type.String()),\n head_limit: Type.Optional(Type.Number()),\n offset: Type.Optional(Type.Number()),\n multiline: Type.Optional(Type.Boolean()),\n }),\n execute: async (_toolCallId, args, signal) => {\n const input = parseGrepArgs(args);\n const mode = input.output_mode ?? \"files\";\n const limit = input.head_limit ?? DEFAULT_GREP_LIMIT;\n const offset = input.offset ?? 0;\n const rgArgs = grepArgs(input, mode);\n const raw = await runRipgrep(rgArgs, workspaceTarget(input.path), root, signal);\n\n if (mode === \"content\") {\n const selected = paginate(raw, limit, offset);\n const lines = selected.items.map(relativizeGrepLine(root));\n return textResult(formatPaginatedText(lines, selected, offset), {\n mode,\n content: lines.join(\"\\n\"),\n numLines: lines.length,\n filenames: [],\n numFiles: 0,\n ...(selected.appliedLimit !== undefined ? { appliedLimit: selected.appliedLimit } : {}),\n ...(offset > 0 ? { appliedOffset: offset } : {}),\n });\n }\n\n if (mode === \"count\") {\n const selected = paginate(raw, limit, offset);\n const lines = selected.items.map(relativizeCountLine(root));\n const counts = parseCountLines(lines);\n return textResult(formatPaginatedText(lines, selected, offset), {\n mode,\n content: lines.join(\"\\n\"),\n filenames: [],\n numFiles: counts.files,\n numMatches: counts.matches,\n ...(selected.appliedLimit !== undefined ? { appliedLimit: selected.appliedLimit } : {}),\n ...(offset > 0 ? { appliedOffset: offset } : {}),\n });\n }\n\n const sorted = await sortPathsByMtime(root, raw);\n const selected = paginate(sorted, limit, offset);\n const filenames = selected.items.map(toWorkspaceRelative(root));\n return textResult(\n filenames.length === 0\n ? \"No files found\"\n : `Found ${filenames.length} ${filenames.length === 1 ? \"file\" : \"files\"}${formatLimitSuffix(selected, offset)}\\n${filenames.join(\"\\n\")}`,\n {\n mode,\n filenames,\n numFiles: filenames.length,\n ...(selected.appliedLimit !== undefined ? { appliedLimit: selected.appliedLimit } : {}),\n ...(offset > 0 ? { appliedOffset: offset } : {}),\n },\n );\n },\n }),\n defineTool({\n name: \"TodoWrite\",\n description: \"Replace the current session todo list with a complete updated list.\",\n parameters: Type.Object({\n todos: Type.Array(\n Type.Object({\n content: Type.String(),\n status: Type.Union([Type.Literal(\"pending\"), Type.Literal(\"in_progress\"), Type.Literal(\"completed\")]),\n activeForm: Type.Optional(Type.String()),\n }),\n ),\n }),\n execute: async (_toolCallId, args) => {\n const input = parseTodoWriteArgs(args);\n const oldTodos = state.todos;\n const allDone = input.todos.length > 0 && input.todos.every((todo) => todo.status === \"completed\");\n state.todos = allDone ? [] : input.todos;\n const message = allDone\n ? \"Todos have been modified successfully. All items are completed, so the current todo list has been cleared.\"\n : \"Todos have been modified successfully. Continue using the todo list to track progress.\";\n return textResult(message, { oldTodos, currentTodos: state.todos });\n },\n }),\n ];\n};\n\nconst parseReadArgs = (args: unknown): ReadArgs => {\n const input = expectRecord(args);\n return {\n path: expectPath(input),\n offset: optionalNumber(input.offset, \"offset\"),\n limit: optionalNumber(input.limit, \"limit\"),\n full: optionalBoolean(input.full, \"full\"),\n };\n};\n\nconst parseWriteArgs = (args: unknown): WriteArgs => {\n const input = expectRecord(args);\n return {\n path: expectPath(input),\n content: expectString(input.content, \"content\"),\n };\n};\n\nconst parseEditArgs = (args: unknown): EditArgs => {\n const input = expectRecord(args);\n return {\n path: expectPath(input),\n old_string: expectString(input.old_string, \"old_string\"),\n new_string: expectString(input.new_string, \"new_string\"),\n replace_all: optionalBoolean(input.replace_all, \"replace_all\"),\n };\n};\n\nconst parseBashArgs = (args: unknown): BashArgs => {\n const input = expectRecord(args);\n return {\n command: expectString(input.command, \"command\"),\n cwd: optionalString(input.cwd, \"cwd\"),\n timeoutMs: optionalNumber(input.timeoutMs ?? input.timeout, \"timeout\"),\n maxOutputBytes: optionalNumber(input.maxOutputBytes, \"maxOutputBytes\"),\n description: optionalString(input.description, \"description\"),\n };\n};\n\nconst parseGlobArgs = (args: unknown): GlobArgs => {\n const input = expectRecord(args);\n return {\n pattern: expectString(input.pattern, \"pattern\"),\n path: optionalString(input.path ?? input.cwd, \"path\"),\n head_limit: optionalNumber(input.head_limit ?? input.maxResults, \"head_limit\"),\n offset: optionalNumber(input.offset, \"offset\"),\n };\n};\n\nconst parseGrepArgs = (args: unknown): GrepArgs => {\n const input = expectRecord(args);\n const outputMode = optionalString(input.output_mode ?? input.outputMode, \"output_mode\");\n if (\n outputMode !== undefined &&\n outputMode !== \"files\" &&\n outputMode !== \"content\" &&\n outputMode !== \"count\"\n ) {\n throw new Error(\"output_mode must be files, content, or count\");\n }\n return {\n pattern: expectString(input.pattern, \"pattern\"),\n path: optionalString(input.path ?? input.cwd, \"path\"),\n glob: optionalString(input.glob, \"glob\"),\n output_mode: outputMode,\n before_context: optionalNumber(input[\"-B\"], \"-B\"),\n after_context: optionalNumber(input[\"-A\"], \"-A\"),\n context: optionalNumber(input.context ?? input[\"-C\"], \"context\"),\n line_numbers: optionalBoolean(input[\"-n\"], \"-n\"),\n case_insensitive: optionalBoolean(input[\"-i\"] ?? input.case_insensitive, \"-i\"),\n type: optionalString(input.type, \"type\"),\n head_limit: optionalNumber(input.head_limit ?? input.maxResults, \"head_limit\"),\n offset: optionalNumber(input.offset, \"offset\"),\n multiline: optionalBoolean(input.multiline, \"multiline\"),\n };\n};\n\nconst parseTodoWriteArgs = (args: unknown): TodoWriteArgs => {\n const input = expectRecord(args);\n if (!Array.isArray(input.todos)) {\n throw new Error(\"todos must be an array\");\n }\n const todos = input.todos.map(parseTodoItem);\n const inProgressCount = todos.filter((todo) => todo.status === \"in_progress\").length;\n if (inProgressCount > 1) {\n throw new Error(\"TodoWrite allows at most one in_progress item\");\n }\n return { todos };\n};\n\nconst parseTodoItem = (value: unknown): TodoItem => {\n const input = expectRecord(value);\n const status = expectString(input.status, \"status\");\n if (status !== \"pending\" && status !== \"in_progress\" && status !== \"completed\") {\n throw new Error(\"status must be pending, in_progress, or completed\");\n }\n return {\n content: expectString(input.content, \"content\"),\n status,\n activeForm: optionalString(input.activeForm, \"activeForm\"),\n };\n};\n\nconst expectRecord = (value: unknown): Record<string, unknown> => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(\"tool args must be an object\");\n }\n return value as Record<string, unknown>;\n};\n\nconst expectPath = (input: Record<string, unknown>): string => expectString(input.file_path ?? input.path, \"file_path\");\n\nconst expectString = (value: unknown, name: string): string => {\n if (typeof value !== \"string\") {\n throw new Error(`${name} must be a string`);\n }\n return value;\n};\n\nconst optionalString = (value: unknown, name: string): string | undefined => {\n if (value === undefined) {\n return undefined;\n }\n return expectString(value, name);\n};\n\nconst optionalNumber = (value: unknown, name: string): number | undefined => {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(`${name} must be a finite number`);\n }\n return value;\n};\n\nconst optionalBoolean = (value: unknown, name: string): boolean | undefined => {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"boolean\") {\n throw new Error(`${name} must be a boolean`);\n }\n return value;\n};\n\nconst snapshotFile = async (path: string, content?: string, ranges?: ReadRange[]): Promise<FileReadSnapshot> => {\n const [fileStat, fileContent] = await Promise.all([stat(path), content ?? readFile(path, \"utf8\")]);\n const totalLines = linesOf(fileContent).length;\n return {\n content: fileContent,\n hash: createHash(\"sha256\").update(fileContent).digest(\"hex\"),\n mtimeMs: fileStat.mtimeMs,\n ranges: ranges ?? [],\n size: fileStat.size,\n totalLines,\n };\n};\n\nconst sameSnapshot = (left: FileReadSnapshot, right: FileReadSnapshot): boolean =>\n left.hash === right.hash && left.size === right.size && left.mtimeMs === right.mtimeMs;\n\nconst exists = async (path: string): Promise<boolean> => {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n};\n\nconst isWithin = (root: string, path: string): boolean => {\n const rel = relative(root, path);\n return rel === \"\" || (!rel.startsWith(\"..\") && !isAbsolute(rel));\n};\n\nconst linesOf = (content: string): string[] => {\n const lines = content.split(/\\r?\\n/);\n if (lines.at(-1) === \"\") {\n lines.pop();\n }\n return lines;\n};\n\nconst IMAGE_EXTENSIONS = new Set([\".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\", \".bmp\", \".tiff\", \".ico\"]);\nconst DOCUMENT_EXTENSIONS = new Set([\".pdf\", \".doc\", \".docx\", \".ppt\", \".pptx\", \".xls\", \".xlsx\"]);\nconst BINARY_EXTENSIONS = new Set([\n \".zip\",\n \".tar\",\n \".gz\",\n \".bz2\",\n \".xz\",\n \".7z\",\n \".rar\",\n \".dmg\",\n \".pkg\",\n \".exe\",\n \".dll\",\n \".so\",\n \".dylib\",\n \".class\",\n \".jar\",\n \".wasm\",\n \".pyc\",\n \".sqlite\",\n \".db\",\n]);\n\nconst assertReadableFileKind = (path: string): void => {\n const ext = extname(path).toLowerCase();\n if (IMAGE_EXTENSIONS.has(ext)) {\n throw new Error(`Read does not yet support image files (${ext}). A dedicated image Read path is planned; do not read this file as text.`);\n }\n if (DOCUMENT_EXTENSIONS.has(ext)) {\n throw new Error(`Read does not yet support document files (${ext}). PDF/page and document-aware Read support is planned; do not read this file as text.`);\n }\n if (BINARY_EXTENSIONS.has(ext)) {\n throw new Error(`Read cannot read binary files (${ext}). Use an appropriate binary/document tool instead.`);\n }\n};\n\nconst assertTextBuffer = (buffer: Buffer, path: string): void => {\n if (buffer.includes(0)) {\n throw new Error(`Read cannot read binary file as text: ${path}`);\n }\n const decoded = buffer.toString(\"utf8\");\n const replacementChars = decoded.match(/\\uFFFD/g)?.length ?? 0;\n if (replacementChars > 0 && replacementChars / Math.max(decoded.length, 1) > 0.01) {\n throw new Error(`Read cannot safely decode file as UTF-8 text: ${path}`);\n }\n};\n\nconst selectCompleteLinesWithinBudget = (\n lines: string[],\n offset: number,\n maxTokens: number,\n): string[] => {\n let selected = lines;\n while (selected.length > 0 && estimateTokens(renderReadLines(selected, offset)) > maxTokens) {\n selected = selected.slice(0, -1);\n }\n if (selected.length === 0 && lines.length > 0) {\n throw new Error(\n `Line ${offset} exceeds Read output token budget (${maxTokens} estimated tokens). Use Grep or a more specific tool; Read will not return partial lines.`,\n );\n }\n return selected;\n};\n\nconst estimateTokens = (value: string): number => Math.ceil(value.length / 3);\n\nconst renderReadLines = (lines: string[], offset: number): string =>\n lines.map((line, index) => `${String(offset + index).padStart(6, \" \")}\\t${line}`).join(\"\\n\");\n\nconst readTokenBudget = (contextWindow: number | undefined, ratio: number): number => {\n const window = contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n if (!Number.isFinite(window) || window <= 0) {\n return Math.max(1, Math.floor(DEFAULT_CONTEXT_WINDOW * ratio));\n }\n return Math.max(1, Math.floor(window * ratio));\n};\n\nconst completeRanges = (totalLines: number): ReadRange[] => (totalLines === 0 ? [] : [{ startLine: 1, endLine: totalLines }]);\n\nconst hasCompleteCoverage = (ranges: ReadRange[], totalLines: number): boolean => {\n if (totalLines === 0) {\n return true;\n }\n const merged = mergeRanges(ranges);\n return merged.length === 1 && merged[0]?.startLine === 1 && merged[0].endLine >= totalLines;\n};\n\nconst mergeRanges = (ranges: ReadRange[]): ReadRange[] => {\n const sorted = ranges\n .filter((range) => range.startLine <= range.endLine)\n .sort((left, right) => left.startLine - right.startLine || left.endLine - right.endLine);\n const merged: ReadRange[] = [];\n for (const range of sorted) {\n const last = merged.at(-1);\n if (!last || range.startLine > last.endLine + 1) {\n merged.push({ ...range });\n continue;\n }\n last.endLine = Math.max(last.endLine, range.endLine);\n }\n return merged;\n};\n\nconst countOccurrences = (content: string, needle: string): number => {\n if (needle.length === 0) {\n throw new Error(\"old_string must not be empty\");\n }\n let count = 0;\n let index = 0;\n while (true) {\n const found = content.indexOf(needle, index);\n if (found === -1) {\n return count;\n }\n count += 1;\n index = found + needle.length;\n }\n};\n\nconst atomicWriteFile = async (path: string, content: string): Promise<void> => {\n const temp = resolve(dirname(path), `.${randomUUID()}.tmp`);\n try {\n await writeFile(temp, content, \"utf8\");\n await rename(temp, path);\n } catch (cause) {\n await rm(temp, { force: true }).catch(() => undefined);\n throw cause;\n }\n};\n\nconst bashResult = async (input: {\n exitCode: number;\n stdout: string;\n stderr: string;\n cwd: string;\n outputLimit: number;\n artifactDir?: string;\n toolCallId: string;\n shell?: string;\n command?: string;\n rtk?: {\n enabled: boolean;\n applied: boolean;\n executable?: string;\n rewrittenCommand?: string;\n estimatedSavedTokens?: number;\n };\n}): Promise<ToolResult> => {\n const stdoutBytes = Buffer.byteLength(input.stdout);\n const stderrBytes = Buffer.byteLength(input.stderr);\n const fullResult = renderFullBashResult(input);\n const resultBytes = Buffer.byteLength(fullResult);\n const shouldArchive = Boolean(input.artifactDir) && resultBytes > input.outputLimit;\n const artifactPath = shouldArchive && input.artifactDir\n ? await writeBashArtifact(input.artifactDir, input.toolCallId, fullResult)\n : undefined;\n const projection = artifactPath\n ? projectBashStreams(input.stdout, input.stderr, input.outputLimit)\n : undefined;\n const stdout = projection?.stdout ?? truncate(input.stdout, input.outputLimit, \"stdout\");\n const stderr = projection?.stderr ?? truncate(input.stderr, input.outputLimit, \"stderr\");\n const text = artifactPath\n ? [\n `exitCode: ${input.exitCode}`,\n `cwd: ${input.cwd}`,\n `artifact: ${artifactPath}`,\n `resultBytes: ${resultBytes}`,\n `stdoutBytes: ${stdoutBytes}`,\n `stderrBytes: ${stderrBytes}`,\n ...(projection?.lines ?? []),\n ].join(\"\\n\")\n : `exitCode: ${input.exitCode}\\ncwd: ${input.cwd}\\nstdout:\\n${stdout}\\nstderr:\\n${stderr}`;\n return textResult(text, {\n exitCode: input.exitCode,\n cwd: input.cwd,\n ...(artifactPath ? {\n artifact: {\n path: artifactPath,\n resultBytes,\n stdoutBytes,\n stderrBytes,\n },\n } : {}),\n ...(input.shell ? { shell: input.shell } : {}),\n ...(input.command ? { command: input.command } : {}),\n ...(input.rtk ? {\n rtk: {\n ...input.rtk,\n estimatedOutputTokens: estimateTokens(`${stdout}\\n${stderr}`),\n },\n } : {}),\n });\n};\n\nconst renderFullBashResult = (input: { exitCode: number; cwd: string; stdout: string; stderr: string }): string =>\n `exitCode: ${input.exitCode}\\ncwd: ${input.cwd}\\nstdout:\\n${input.stdout}\\nstderr:\\n${input.stderr}`;\n\nconst writeBashArtifact = async (artifactDir: string, toolCallId: string, content: string): Promise<string> => {\n const directory = resolve(artifactDir, safeArtifactSegment(toolCallId));\n await mkdir(directory, { recursive: true });\n const path = resolve(directory, \"result.txt\");\n await writeFile(path, content, { encoding: \"utf8\", mode: 0o600 });\n return path;\n};\n\nconst safeArtifactSegment = (value: string): string =>\n value.replace(/[^A-Za-z0-9._-]/g, \"_\").slice(0, 120) || \"tool_call\";\n\nconst projectBashStreams = (\n stdout: string,\n stderr: string,\n maxBytes: number,\n): { lines: string[]; stdout: string; stderr: string } => {\n const streams = [\n { label: \"stdout\", value: stdout },\n { label: \"stderr\", value: stderr },\n ].filter((stream) => Buffer.byteLength(stream.value) > 0);\n if (streams.length === 0) {\n return { lines: [\"stdout:\", \"\", \"stderr:\", \"\"], stdout: \"\", stderr: \"\" };\n }\n const perStreamBudget = Math.max(1, Math.floor(maxBytes / streams.length));\n const projected = streams.map((stream) => projectOutputStream(stream.value, perStreamBudget, stream.label));\n const stdoutText = projected.find((stream) => stream.label === \"stdout\")?.text ?? \"stdout:\\n\";\n const stderrText = projected.find((stream) => stream.label === \"stderr\")?.text ?? \"stderr:\\n\";\n return {\n lines: projected.map((stream) => stream.text),\n stdout: stdoutText,\n stderr: stderrText,\n };\n};\n\nconst projectOutputStream = (value: string, maxBytes: number, label: string): { label: string; text: string } => {\n const bytes = Buffer.byteLength(value);\n if (bytes <= maxBytes) {\n return { label, text: `${label}:\\n${value}` };\n }\n const headBytes = Math.max(1, Math.floor(maxBytes / 2));\n const tailBytes = Math.max(1, maxBytes - headBytes);\n return {\n label,\n text: [\n `${label} head:`,\n sliceBytes(value, 0, headBytes),\n `${label} tail:`,\n sliceBytes(value, Math.max(0, bytes - tailBytes), bytes),\n `[${label} archived: ${bytes} bytes; projection budget ${maxBytes} bytes]`,\n ].join(\"\\n\"),\n };\n};\n\nconst resolveDefaultShell = (input: string | undefined): string => {\n const shell = input || process.env.SHELL || userShell() || \"/bin/sh\";\n return shell.trim() || \"/bin/sh\";\n};\n\nconst resolveRtkCommand = async (\n rtk: NonNullable<CodingToolsOptions[\"tokenSaving\"]>[\"rtk\"] | undefined,\n command: string,\n): Promise<{ applied: boolean; rewrittenCommand?: string; executionCommand?: string }> => {\n if (rtk?.enabled !== true || typeof rtk.executable !== \"string\" || rtk.executable.length === 0) {\n return { applied: false };\n }\n try {\n const result = await execFileAsync(rtk.executable, [\"rewrite\", command], {\n timeout: 5_000,\n maxBuffer: 1024 * 1024,\n });\n return rtkRewriteResult(result.stdout, rtk.executable);\n } catch (cause) {\n if (isExecError(cause) && typeof cause.stdout === \"string\") {\n return rtkRewriteResult(cause.stdout, rtk.executable);\n }\n return { applied: false };\n }\n};\n\nconst rtkRewriteResult = (\n stdout: string,\n executable: string,\n): { applied: boolean; rewrittenCommand?: string; executionCommand?: string } => {\n const rewrittenCommand = stdout.trim();\n return rewrittenCommand\n ? { applied: true, rewrittenCommand, executionCommand: executableRewriteCommand(rewrittenCommand, executable) }\n : { applied: false };\n};\n\nconst executableRewriteCommand = (command: string, executable: string): string =>\n command.replace(/^rtk(?=\\s|$)/, shellQuote(executable));\n\nconst readRtkGain = async (rtkExecutable: string, cwd: string): Promise<{ savedTokens: number } | undefined> => {\n try {\n const { stdout } = await execFileAsync(rtkExecutable, [\"gain\", \"--project\", \"--format\", \"json\"], {\n cwd,\n timeout: 5_000,\n maxBuffer: 5_000_000,\n });\n const parsed = JSON.parse(stdout) as unknown;\n if (!isRecord(parsed) || !isRecord(parsed.summary)) {\n return undefined;\n }\n return { savedTokens: nonNegativeInteger(parsed.summary.total_saved) };\n } catch {\n return undefined;\n }\n};\n\nconst rtkSavedTokenDelta = async (\n rtkExecutable: string,\n cwd: string,\n before: { savedTokens: number } | undefined,\n): Promise<number | undefined> => {\n if (!before) {\n return undefined;\n }\n const after = await readRtkGain(rtkExecutable, cwd);\n if (!after) {\n return undefined;\n }\n return Math.max(0, after.savedTokens - before.savedTokens);\n};\n\nconst withRtkSavings = <T extends { applied: boolean }>(rtk: T, savedTokens: number | undefined): T & { estimatedSavedTokens?: number } => ({\n ...rtk,\n ...(rtk.applied && savedTokens !== undefined ? { estimatedSavedTokens: savedTokens } : {}),\n});\n\nconst nonNegativeInteger = (value: unknown): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return 0;\n }\n return Math.floor(value);\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst shellQuote = (value: string): string =>\n `'${value.replace(/'/g, \"'\\\\''\")}'`;\n\nconst shellCommandArgs = (shell: string, command: string): string[] => {\n const name = basename(shell).toLowerCase();\n if (name === \"csh\" || name === \"tcsh\" || name === \"fish\") {\n return [\"-c\", command];\n }\n return [\"-lc\", command];\n};\n\nconst userShell = (): string | undefined => {\n try {\n return userInfo().shell ?? undefined;\n } catch {\n return undefined;\n }\n};\n\nconst truncate = (value: string, maxBytes: number, label: string): string => {\n const bytes = Buffer.byteLength(value);\n if (bytes <= maxBytes) {\n return value;\n }\n const truncated = sliceBytes(value, 0, maxBytes);\n return `${truncated}\\n[${label} truncated: ${bytes} bytes > ${maxBytes} bytes]`;\n};\n\nconst sliceBytes = (value: string, start: number, end: number): string =>\n Buffer.from(value).subarray(start, end).toString(\"utf8\");\n\nconst textResult = (text: string, details?: unknown): ToolResult => ({\n content: [{ type: \"text\", text }],\n details,\n});\n\nconst byteLength = (value: string): number => Buffer.byteLength(value);\n\nconst isTimeoutError = (cause: unknown): boolean =>\n typeof cause === \"object\" &&\n cause !== null &&\n (\"killed\" in cause || \"signal\" in cause) &&\n ((cause as { killed?: unknown }).killed === true || (cause as { signal?: unknown }).signal === \"SIGTERM\");\n\nconst isExecError = (cause: unknown): cause is Error & { code?: number | string; stdout?: string; stderr?: string } =>\n cause instanceof Error && (\"stdout\" in cause || \"stderr\" in cause || \"code\" in cause);\n\nconst runRipgrep = async (args: string[], target: string, cwd: string, signal: AbortSignal): Promise<string[]> => {\n try {\n const result = await execFileAsync(\"rg\", [...args, target], {\n cwd,\n signal,\n maxBuffer: 20_000_000,\n });\n return splitOutput(result.stdout);\n } catch (cause) {\n if (isExecError(cause) && cause.code === 1) {\n return [];\n }\n if (isExecError(cause) && typeof cause.stdout === \"string\" && cause.stdout.trim().length > 0) {\n return splitOutput(cause.stdout);\n }\n const message = cause instanceof Error ? cause.message : String(cause);\n throw new Error(`ripgrep failed: ${message}`);\n }\n};\n\nconst splitOutput = (output: string): string[] =>\n output\n .trim()\n .split(\"\\n\")\n .map((line) => line.replace(/\\r$/, \"\"))\n .filter(Boolean);\n\nconst vcsExcludes = (): string[] =>\n [\".git\", \".svn\", \".hg\", \".bzr\", \".jj\", \".sl\"].flatMap((dir) => [\"--glob\", `!${dir}`]);\n\nconst grepArgs = (input: GrepArgs, mode: NonNullable<GrepArgs[\"output_mode\"]>): string[] => {\n const args = [\"--hidden\", \"--max-columns\", \"500\", ...vcsExcludes()];\n if (input.multiline) {\n args.push(\"-U\", \"--multiline-dotall\");\n }\n if (input.case_insensitive) {\n args.push(\"-i\");\n }\n if (mode === \"files\") {\n args.push(\"-l\");\n } else if (mode === \"count\") {\n args.push(\"-c\");\n } else {\n if (input.line_numbers ?? true) {\n args.push(\"-n\");\n }\n if (input.context !== undefined) {\n args.push(\"-C\", String(input.context));\n } else {\n if (input.before_context !== undefined) {\n args.push(\"-B\", String(input.before_context));\n }\n if (input.after_context !== undefined) {\n args.push(\"-A\", String(input.after_context));\n }\n }\n }\n if (input.type) {\n args.push(\"--type\", input.type);\n }\n if (input.glob) {\n for (const pattern of splitGlobPatterns(input.glob)) {\n args.push(\"--glob\", pattern);\n }\n }\n if (input.pattern.startsWith(\"-\")) {\n args.push(\"-e\", input.pattern);\n } else {\n args.push(input.pattern);\n }\n return args;\n};\n\nconst splitGlobPatterns = (value: string): string[] =>\n value\n .split(/\\s+/)\n .flatMap((part) => (part.includes(\"{\") && part.includes(\"}\") ? [part] : part.split(\",\")))\n .filter(Boolean);\n\nconst paginate = <T>(items: T[], limit: number, offset: number): { items: T[]; truncated: boolean; appliedLimit?: number } => {\n if (!Number.isInteger(limit) || limit < 0) {\n throw new Error(\"head_limit must be a non-negative integer\");\n }\n if (!Number.isInteger(offset) || offset < 0) {\n throw new Error(\"offset must be a non-negative integer\");\n }\n if (limit === 0) {\n return { items: items.slice(offset), truncated: false };\n }\n const selected = items.slice(offset, offset + limit);\n const truncated = items.length - offset > limit;\n return {\n items: selected,\n truncated,\n ...(truncated ? { appliedLimit: limit } : {}),\n };\n};\n\nconst toWorkspaceRelative = (root: string): ((path: string) => string) => (path) => {\n const absolute = isAbsolute(path) ? path : resolve(root, path);\n return relative(root, absolute) || \".\";\n};\n\nconst relativizeGrepLine = (root: string): ((line: string) => string) => (line) => {\n const colon = line.indexOf(\":\");\n if (colon <= 0) {\n return line;\n }\n const file = line.slice(0, colon);\n const rest = line.slice(colon);\n return `${toWorkspaceRelative(root)(file)}${rest}`;\n};\n\nconst relativizeCountLine = (root: string): ((line: string) => string) => (line) => {\n const colon = line.lastIndexOf(\":\");\n if (colon <= 0) {\n return line;\n }\n const file = line.slice(0, colon);\n const rest = line.slice(colon);\n return `${toWorkspaceRelative(root)(file)}${rest}`;\n};\n\nconst sortPathsByMtime = async (root: string, paths: string[]): Promise<string[]> => {\n const entries = await Promise.all(\n paths.map(async (path) => {\n try {\n const info = await stat(isAbsolute(path) ? path : resolve(root, path));\n return { path, mtimeMs: info.mtimeMs };\n } catch {\n return { path, mtimeMs: 0 };\n }\n }),\n );\n return entries\n .sort((left, right) => {\n const time = right.mtimeMs - left.mtimeMs;\n return time === 0 ? left.path.localeCompare(right.path) : time;\n })\n .map((entry) => entry.path);\n};\n\nconst formatPaginatedText = <T>(lines: string[], page: { appliedLimit?: number }, offset: number): string => {\n const body = lines.length > 0 ? lines.join(\"\\n\") : \"No matches found\";\n const suffix = formatLimitSuffix(page, offset);\n return suffix ? `${body}\\n\\n[Showing results with pagination =${suffix}]` : body;\n};\n\nconst formatLimitSuffix = <T>(page: { appliedLimit?: number }, offset: number): string => {\n const parts = [];\n if (page.appliedLimit !== undefined) {\n parts.push(`limit: ${page.appliedLimit}`);\n }\n if (offset > 0) {\n parts.push(`offset: ${offset}`);\n }\n return parts.length > 0 ? ` ${parts.join(\", \")}` : \"\";\n};\n\nconst parseCountLines = (lines: string[]): { files: number; matches: number } => {\n let files = 0;\n let matches = 0;\n for (const line of lines) {\n const colon = line.lastIndexOf(\":\");\n if (colon <= 0) {\n continue;\n }\n const count = Number.parseInt(line.slice(colon + 1), 10);\n if (Number.isFinite(count)) {\n files += 1;\n matches += count;\n }\n }\n return { files, matches };\n};\n", "import { Type, type TSchema } from \"@mariozechner/pi-ai\";\n\nimport type { ContentBlock, EventId } from \"@scorel/protocol\";\n\nexport type ToolResult = {\n content: ContentBlock[];\n details?: unknown;\n};\n\nexport type AgentTool = {\n name: string;\n description: string;\n parameters: TSchema;\n execute: (\n toolCallId: string,\n args: unknown,\n signal: AbortSignal,\n onUpdate: (partial: unknown) => void,\n ) => Promise<ToolResult>;\n};\n\nexport const defineTool = (tool: AgentTool): AgentTool => tool;\n\nexport type SnipToolInput = {\n userMessageId: string;\n reason?: string;\n};\n\nexport type SnipToolResult = {\n anchorUserEventId: EventId;\n throughEventId: EventId;\n hiddenEventCount: number;\n};\n\nexport const createSnipTool = (options: {\n snip(input: SnipToolInput): Promise<SnipToolResult>;\n}): AgentTool =>\n defineTool({\n name: \"snip\",\n description: [\n \"Hide a completed user turn from future model context.\",\n \"Use only when an earlier user turn is obsolete or noisy.\",\n \"The session JSONL evidence is preserved; the hidden turn disappears from the next context build.\",\n \"Input: { userMessageId: string, reason?: string }.\",\n ].join(\" \"),\n parameters: Type.Object({\n userMessageId: Type.String(),\n reason: Type.Optional(Type.String()),\n }),\n execute: async (_toolCallId, args) => {\n const input = parseSnipToolInput(args);\n const result = await options.snip(input);\n return {\n content: [{\n type: \"text\",\n text: \"Snipped the selected user turn. It will be omitted from future model context.\",\n }],\n details: result,\n };\n },\n });\n\nexport * from \"./coding-tools.js\";\n\nconst parseSnipToolInput = (args: unknown): SnipToolInput => {\n if (!isRecord(args) || typeof args.userMessageId !== \"string\") {\n throw new Error(\"snip requires { userMessageId: string }\");\n }\n return {\n userMessageId: args.userMessageId as EventId,\n ...(typeof args.reason === \"string\" && args.reason.trim() ? { reason: args.reason.trim() } : {}),\n };\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n", "import { Type } from \"@mariozechner/pi-ai\";\n\nimport { defineTool, type AgentTool } from \"../tools/index.js\";\n\nexport type SendChannelMessageInput = {\n text?: string;\n attachments?: SendChannelMessageAttachment[];\n channel?: string;\n target?: \"current\";\n};\n\nexport type SendChannelMessageAttachment = {\n type: \"image\" | \"file\";\n path?: string;\n url?: string;\n mimeType?: string;\n caption?: string;\n};\n\nexport type CreateSendChannelMessageToolOptions = {\n sendCurrent: (input: SendChannelMessageInput) => Promise<{ channel: string; target: string; attachments?: number }>;\n};\n\nexport const createSendChannelMessageTool = (options: CreateSendChannelMessageToolOptions): AgentTool =>\n defineTool({\n name: \"SendChannelMessage\",\n description: \"Send a text reply to the current IM channel conversation. Do not provide raw platform user ids or group ids.\",\n parameters: Type.Object({\n text: Type.Optional(Type.String()),\n attachments: Type.Optional(Type.Array(Type.Object({\n type: Type.Union([Type.Literal(\"image\"), Type.Literal(\"file\")]),\n path: Type.Optional(Type.String()),\n url: Type.Optional(Type.String()),\n mimeType: Type.Optional(Type.String()),\n caption: Type.Optional(Type.String()),\n }))),\n channel: Type.Optional(Type.String()),\n target: Type.Optional(Type.Literal(\"current\")),\n }),\n execute: async (_toolCallId, args) => {\n const input = parseSendChannelMessageInput(args);\n const result = await options.sendCurrent(input);\n return {\n content: [{ type: \"text\", text: `Channel message sent to ${result.channel}:${result.target}` }],\n details: { ...result, attachments: result.attachments ?? input.attachments?.length ?? 0 },\n };\n },\n });\n\nconst parseSendChannelMessageInput = (value: unknown): SendChannelMessageInput => {\n if (!isRecord(value)) {\n throw new Error(\"SendChannelMessage args must be an object\");\n }\n const text = typeof value.text === \"string\" && value.text.trim().length > 0 ? value.text : undefined;\n const attachments = parseAttachments(value.attachments);\n if (!text && attachments.length === 0) {\n throw new Error(\"SendChannelMessage requires text or attachments\");\n }\n if (value.channel !== undefined && (typeof value.channel !== \"string\" || value.channel.trim().length === 0)) {\n throw new Error(\"SendChannelMessage.channel must be a non-empty string when provided\");\n }\n if (value.target !== undefined && value.target !== \"current\") {\n throw new Error(\"SendChannelMessage.target must be current when provided\");\n }\n return {\n ...(text ? { text } : {}),\n ...(attachments.length > 0 ? { attachments } : {}),\n ...(typeof value.channel === \"string\" ? { channel: value.channel } : {}),\n ...(value.target === \"current\" ? { target: \"current\" as const } : {}),\n };\n};\n\nconst parseAttachments = (value: unknown): SendChannelMessageAttachment[] => {\n if (value === undefined) {\n return [];\n }\n if (!Array.isArray(value)) {\n throw new Error(\"SendChannelMessage.attachments must be an array\");\n }\n return value.map((item, index) => {\n if (!isRecord(item)) {\n throw new Error(`SendChannelMessage.attachments.${index} must be an object`);\n }\n if (item.type !== \"image\" && item.type !== \"file\") {\n throw new Error(`SendChannelMessage.attachments.${index}.type must be image or file`);\n }\n const path = optionalString(item.path, `SendChannelMessage.attachments.${index}.path`);\n const url = optionalString(item.url, `SendChannelMessage.attachments.${index}.url`);\n if (!path && !url) {\n throw new Error(`SendChannelMessage.attachments.${index} requires path or url`);\n }\n return {\n type: item.type,\n ...(path ? { path } : {}),\n ...(url ? { url } : {}),\n ...(optionalString(item.mimeType, `SendChannelMessage.attachments.${index}.mimeType`) ? { mimeType: optionalString(item.mimeType, `SendChannelMessage.attachments.${index}.mimeType`) } : {}),\n ...(optionalString(item.caption, `SendChannelMessage.attachments.${index}.caption`) ? { caption: optionalString(item.caption, `SendChannelMessage.attachments.${index}.caption`) } : {}),\n };\n });\n};\n\nconst optionalString = (value: unknown, name: string): string | undefined => {\n if (value === undefined || value === \"\") {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new Error(`${name} must be a string`);\n }\n return value;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n", "import { readFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nexport type ExtensionKind = \"im\";\n\nexport type ExtensionManifest = {\n id: string;\n kind: ExtensionKind;\n displayName: string;\n adapter: string;\n skills: string[];\n mcp: unknown[];\n manifestPath: string;\n rootDir: string;\n};\n\nexport const loadExtensionManifest = async (manifestPath: string): Promise<ExtensionManifest> =>\n parseExtensionManifest(await readFile(manifestPath, \"utf8\"), manifestPath);\n\nexport const parseExtensionManifest = (text: string, manifestPath = \"scorel.extension.json\"): ExtensionManifest => {\n let value: unknown;\n try {\n value = JSON.parse(text);\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n throw new Error(`Invalid extension manifest JSON at ${manifestPath}: ${message}`);\n }\n if (!isRecord(value)) {\n throw new Error(`Extension manifest at ${manifestPath} must be an object`);\n }\n const rootDir = dirname(resolve(manifestPath));\n const id = requireIdentifier(value.id, \"id\", manifestPath);\n const kind = requireKind(value.kind, manifestPath);\n const displayName = requireString(value.displayName, \"displayName\", manifestPath);\n const adapter = requireRelativePath(value.adapter, \"adapter\", manifestPath);\n const skills = optionalRelativePaths(value.skills, \"skills\", manifestPath);\n const mcp = Array.isArray(value.mcp) ? value.mcp : [];\n return {\n id,\n kind,\n displayName,\n adapter,\n skills,\n mcp,\n manifestPath: resolve(manifestPath),\n rootDir,\n };\n};\n\nconst requireString = (value: unknown, name: string, manifestPath: string): string => {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`Extension manifest ${manifestPath} field ${name} must be a non-empty string`);\n }\n return value;\n};\n\nconst requireIdentifier = (value: unknown, name: string, manifestPath: string): string => {\n const text = requireString(value, name, manifestPath);\n if (!/^[A-Za-z0-9_-]+$/.test(text)) {\n throw new Error(`Extension manifest ${manifestPath} field ${name} must contain only letters, numbers, underscores, or hyphens`);\n }\n return text;\n};\n\nconst requireKind = (value: unknown, manifestPath: string): ExtensionKind => {\n if (value === \"im\") {\n return value;\n }\n throw new Error(`Extension manifest ${manifestPath} field kind must be im`);\n};\n\nconst requireRelativePath = (value: unknown, name: string, manifestPath: string): string => {\n const text = requireString(value, name, manifestPath);\n if (text.startsWith(\"/\") || text.includes(\"..\")) {\n throw new Error(`Extension manifest ${manifestPath} field ${name} must be a relative path inside the extension`);\n }\n return text;\n};\n\nconst optionalRelativePaths = (value: unknown, name: string, manifestPath: string): string[] => {\n if (value === undefined) {\n return [];\n }\n if (!Array.isArray(value)) {\n throw new Error(`Extension manifest ${manifestPath} field ${name} must be an array`);\n }\n return value.map((item, index) => requireRelativePath(item, `${name}.${index}`, manifestPath));\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n", "import { existsSync } from \"node:fs\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { homedir, platform, release } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\n\nimport type {\n InstructionSection,\n InstructionSnapshot,\n InstructionSource,\n} from \"@scorel/protocol\";\n\nexport type BuildInstructionSnapshotOptions = {\n cwd: string;\n now?: () => number;\n homeDir?: string;\n env?: NodeJS.ProcessEnv;\n};\n\ntype AgentsSource = Required<Pick<InstructionSource, \"sourceType\" | \"path\" | \"scope\" | \"priority\" | \"content\">>;\n\nconst BASELINE_PROMPT = [\n \"You are Scorel, a coding agent running inside a recoverable local workspace.\",\n \"Follow the user's request, respect the project instructions, use tools deliberately, and keep changes scoped to the active task.\",\n \"Tool results and user messages may include <system-reminder> tags. These tags contain information automatically added by Scorel's harness. They are not part of the specific tool result or user message in which they appear.\",\n \"If the AppendDaily tool is available, use it once near the end of meaningful completed work to record durable progress, decisions, and follow-ups. Do not use it for empty turns or transient noise.\",\n].join(\"\\n\");\n\nexport const buildInstructionSnapshot = async (\n options: BuildInstructionSnapshotOptions,\n): Promise<InstructionSnapshot> => {\n const cwd = resolve(options.cwd);\n const now = options.now ?? Date.now;\n const frozenAt = now();\n const homeDir = resolve(options.homeDir ?? homedir());\n const agentsSources = await discoverAgentsSources({ cwd, homeDir });\n const repoRoot = findGitRoot(cwd);\n\n return {\n version: 1,\n cwd,\n sections: [\n section(\"baseline\", frozenAt, BASELINE_PROMPT, [{ sourceType: \"builtin\" }]),\n section(\"agents\", frozenAt, renderAgentsBlock(agentsSources), agentsSources),\n section(\"memory\", frozenAt, \"No memory sources are configured for this session.\", []),\n section(\"workspace\", frozenAt, await renderWorkspaceBlock(cwd, repoRoot), undefined, {\n cwd,\n repoRoot,\n }),\n section(\"environment\", frozenAt, renderEnvironmentBlock(options.env ?? process.env), undefined, {\n platform: platform(),\n release: release(),\n shell: (options.env ?? process.env).SHELL,\n }),\n section(\"time\", frozenAt, renderTimeBlock(frozenAt), undefined, {\n timestamp: frozenAt,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n }),\n ],\n };\n};\n\nexport const renderSystemPrompt = (snapshot: InstructionSnapshot): string =>\n snapshot.sections\n .map((section) => section.renderedBlock.trim())\n .filter(Boolean)\n .join(\"\\n\\n\");\n\nconst section = (\n kind: InstructionSection[\"kind\"],\n frozenAt: number,\n renderedBlock: string,\n sources?: InstructionSource[],\n data?: Record<string, unknown>,\n): InstructionSection => ({\n kind,\n frozenAt,\n ...(sources ? { sources } : {}),\n renderedBlock,\n ...(data ? { data } : {}),\n});\n\nconst discoverAgentsSources = async (options: { cwd: string; homeDir: string }): Promise<AgentsSource[]> => {\n const projectFiles = projectAgentsPaths(options.cwd, options.homeDir);\n const globalPath = join(options.homeDir, \".scorel\", \"AGENTS.md\");\n const candidates = [...projectFiles.map((path) => ({ path, scope: \"project\" as const })), { path: globalPath, scope: \"global_user\" as const }];\n const sources: AgentsSource[] = [];\n\n for (const candidate of candidates) {\n try {\n const content = await readFile(candidate.path, \"utf8\");\n sources.push({\n sourceType: \"agents_md\",\n path: candidate.path,\n scope: candidate.scope,\n priority: candidate.scope === \"global_user\" ? 0 : sources.length + 1,\n content,\n });\n } catch (cause) {\n if (!isNodeErrorCode(cause, \"ENOENT\") && !isNodeErrorCode(cause, \"ENOTDIR\")) {\n throw cause;\n }\n }\n }\n\n return sources;\n};\n\nconst projectAgentsPaths = (cwd: string, homeDir: string): string[] => {\n const gitRoot = findGitRoot(cwd);\n const stopAt = gitRoot ?? homeDir;\n const paths: string[] = [];\n let current = cwd;\n\n while (true) {\n if (current !== homeDir) {\n paths.push(join(current, \"AGENTS.md\"));\n }\n if (current === stopAt || current === dirname(current)) {\n break;\n }\n const next = dirname(current);\n if (!gitRoot && next === homeDir) {\n break;\n }\n current = next;\n }\n\n return paths.reverse();\n};\n\nconst findGitRoot = (cwd: string): string | undefined => {\n let current = cwd;\n while (true) {\n if (existsSync(join(current, \".git\"))) {\n return current;\n }\n const next = dirname(current);\n if (next === current) {\n return undefined;\n }\n current = next;\n }\n};\n\nconst renderAgentsBlock = (sources: AgentsSource[]): string => {\n if (sources.length === 0) {\n return \"No AGENTS.md instructions were found for this session.\";\n }\n return [\n \"AGENTS.md instructions loaded for this session:\",\n ...sources.map((source) =>\n [`Source: ${source.path}`, `Scope: ${source.scope}`, \"Content:\", source.content.trimEnd()].join(\"\\n\"),\n ),\n ].join(\"\\n\\n\");\n};\n\nconst renderWorkspaceBlock = async (cwd: string, repoRoot: string | undefined): Promise<string> => {\n const root = repoRoot ?? cwd;\n let entries: string[] = [];\n try {\n entries = (await readdir(root, { withFileTypes: true }))\n .filter((entry) => !entry.name.startsWith(\".\"))\n .slice(0, 20)\n .map((entry) => `${entry.isDirectory() ? \"dir\" : \"file\"}:${entry.name}`);\n } catch {\n entries = [];\n }\n return [`Workspace cwd: ${cwd}`, `Repository root: ${repoRoot ?? \"not detected\"}`, `Top-level entries: ${entries.join(\", \") || \"none\"}`].join(\"\\n\");\n};\n\nconst renderEnvironmentBlock = (env: NodeJS.ProcessEnv): string =>\n [`Platform: ${platform()} ${release()}`, `Shell: ${env.SHELL ?? \"unknown\"}`].join(\"\\n\");\n\nconst renderTimeBlock = (timestamp: number): string =>\n [`Session started at: ${new Date(timestamp).toISOString()}`, `Timezone: ${Intl.DateTimeFormat().resolvedOptions().timeZone}`].join(\"\\n\");\n\nconst isNodeErrorCode = (cause: unknown, code: string): boolean =>\n cause instanceof Error && \"code\" in cause && cause.code === code;\n", "import { appendFile, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { Type } from \"@mariozechner/pi-ai\";\n\nimport { defineTool, type AgentTool } from \"../tools/index.js\";\n\nexport type MemoryPaths = {\n rootDir: string;\n rootMemoryPath: string;\n projectDir: string;\n projectMemoryPath: string;\n dailyDir: string;\n todayDailyPath: string;\n yesterdayDailyPath: string;\n dreamStatePath: string;\n today: string;\n yesterday: string;\n};\n\nexport type MemoryContext = {\n paths: MemoryPaths;\n rootMemory: string;\n projectMemory: string;\n todayDaily: string;\n yesterdayDaily: string;\n};\n\nexport type SessionMemoryPaths = {\n sessionsDir: string;\n sessionMemoryPath: string;\n};\n\nexport type BuildMemoryContextOptions = {\n projectId: string;\n homeDir?: string;\n now?: () => number;\n};\n\nexport type AppendDailyOptions = BuildMemoryContextOptions & {\n text: string;\n};\n\nexport type AppendDailyResult = {\n path: string;\n entry: string;\n date: string;\n skippedReason?: \"empty\" | \"duplicate\";\n};\n\nexport type AppendDailyInput = {\n summary: string;\n completed?: string[];\n decisions?: string[];\n followUps?: string[];\n memoryCandidates?: string[];\n evidence?: string[];\n};\n\nexport type CreateAppendDailyToolOptions = BuildMemoryContextOptions & {\n onAppend?: (result: AppendDailyResult) => void | Promise<void>;\n};\n\nexport type MemoryDreamState = {\n projectId: string;\n dirty: boolean;\n running: boolean;\n sessionId?: string;\n clientId?: string;\n lastDailyAppendAt?: number;\n lastDailyPath?: string;\n scheduledFor?: number;\n lastAttemptAt?: number;\n lastSuccessAt?: number;\n lastFailure?: { at: number; message: string };\n lastProjectMemoryUpdateAt?: number;\n lastRootMemoryUpdateAt?: number;\n};\n\nexport type SessionMemoryInput = {\n sessionId: string;\n projectId: string;\n summary: string;\n recentMessages?: string[];\n decisions?: string[];\n followUps?: string[];\n now?: () => number;\n homeDir?: string;\n};\n\nexport const memoryDate = (timestamp: number): string => new Date(timestamp).toISOString().slice(0, 10);\n\nexport const scorelMemoryPaths = (options: BuildMemoryContextOptions): MemoryPaths => {\n const home = options.homeDir ?? homedir();\n const now = options.now ?? Date.now;\n const today = memoryDate(now());\n const yesterday = memoryDate(now() - 24 * 60 * 60 * 1000);\n const rootDir = join(home, \".scorel\", \"memory\");\n const projectDir = join(rootDir, \"projects\", safeProjectId(options.projectId));\n const dailyDir = join(projectDir, \"daily\");\n return {\n rootDir,\n rootMemoryPath: join(rootDir, \"MEMORY.md\"),\n projectDir,\n projectMemoryPath: join(projectDir, \"MEMORY.md\"),\n dailyDir,\n todayDailyPath: join(dailyDir, `${today}.md`),\n yesterdayDailyPath: join(dailyDir, `${yesterday}.md`),\n dreamStatePath: join(projectDir, \"dream-state.json\"),\n today,\n yesterday,\n };\n};\n\nexport const scorelSessionMemoryPaths = (options: {\n projectId: string;\n sessionId: string;\n homeDir?: string;\n}): SessionMemoryPaths => {\n const home = options.homeDir ?? homedir();\n const sessionsDir = join(home, \".scorel\", \"context\", \"session-memory\", safeProjectId(options.projectId));\n return {\n sessionsDir,\n sessionMemoryPath: join(sessionsDir, `${safeProjectId(options.sessionId)}.md`),\n };\n};\n\nexport const buildMemoryContext = async (options: BuildMemoryContextOptions): Promise<MemoryContext> => {\n const paths = scorelMemoryPaths(options);\n await ensureMemoryFiles(paths);\n return {\n paths,\n rootMemory: trimForContext(await readOptional(paths.rootMemoryPath), 8_000),\n projectMemory: trimForContext(await readOptional(paths.projectMemoryPath), 12_000),\n todayDaily: trimForContext(await readOptional(paths.todayDailyPath), 8_000, \"tail\"),\n yesterdayDaily: trimForContext(await readOptional(paths.yesterdayDailyPath), 8_000, \"tail\"),\n };\n};\n\nexport const renderMemoryHarness = (context: MemoryContext): string => [\n \"Memory context for this session.\",\n \"\",\n \"Root MEMORY.md:\",\n context.rootMemory.trim() || \"(empty)\",\n \"\",\n \"Project MEMORY.md:\",\n context.projectMemory.trim() || \"(empty)\",\n \"\",\n `Recent daily (${context.paths.yesterday}, ${context.paths.today}):`,\n context.yesterdayDaily.trim() || \"(yesterday empty)\",\n \"\",\n context.todayDaily.trim() || \"(today empty)\",\n \"\",\n \"Memory rules:\",\n \"- Treat memory as point-in-time context; verify current code facts from the repo before acting.\",\n \"- Project MEMORY overrides root MEMORY for project-specific decisions.\",\n \"- Daily notes are recent progress context, not long-term truth.\",\n].join(\"\\n\");\n\nexport const appendDailyEntry = async (options: AppendDailyOptions): Promise<AppendDailyResult> => {\n const paths = scorelMemoryPaths(options);\n await ensureMemoryFiles(paths);\n const text = options.text.trim();\n if (!text) {\n return { path: paths.todayDailyPath, entry: \"\", date: paths.today, skippedReason: \"empty\" };\n }\n const existing = await readOptional(paths.todayDailyPath);\n if (containsNormalizedDailyEntry(existing, text)) {\n return { path: paths.todayDailyPath, entry: \"\", date: paths.today, skippedReason: \"duplicate\" };\n }\n const time = new Date((options.now ?? Date.now)()).toISOString().slice(11, 16);\n const entry = `- ${time} ${text.replace(/\\s+/g, \" \")}\\n`;\n await appendFile(paths.todayDailyPath, entry, \"utf8\");\n return { path: paths.todayDailyPath, entry: entry.trimEnd(), date: paths.today };\n};\n\nexport const createAppendDailyTool = (options: CreateAppendDailyToolOptions): AgentTool =>\n defineTool({\n name: \"AppendDaily\",\n description: [\n \"Append a compact hidden project daily journal entry after meaningful work.\",\n \"Use this once near the end of a completed user turn when there is progress, a decision, or a follow-up worth preserving.\",\n \"Do not include secrets, raw logs, speculation, or facts that should be re-read from the repository.\",\n ].join(\" \"),\n parameters: Type.Object({\n summary: Type.String(),\n completed: Type.Optional(Type.Array(Type.String())),\n decisions: Type.Optional(Type.Array(Type.String())),\n followUps: Type.Optional(Type.Array(Type.String())),\n memoryCandidates: Type.Optional(Type.Array(Type.String())),\n evidence: Type.Optional(Type.Array(Type.String())),\n }),\n execute: async (_toolCallId, args) => {\n const input = parseAppendDailyInput(args);\n validateAppendDailyInput(input);\n const result = await appendDailyEntry({\n projectId: options.projectId,\n homeDir: options.homeDir,\n now: options.now,\n text: renderDailyEntry(input),\n });\n await options.onAppend?.(result);\n return {\n content: [{\n type: \"text\",\n text: result.entry\n ? `Daily appended: ${result.date}`\n : `Daily append skipped: ${result.skippedReason ?? \"empty\"}`,\n }],\n details: {\n path: result.path,\n date: result.date,\n skippedReason: result.skippedReason,\n },\n };\n },\n });\n\nexport const renderDailyEntry = (input: AppendDailyInput): string => {\n const sections = [\n `Summary: ${compactLine(input.summary, 500)}`,\n renderList(\"Completed\", input.completed),\n renderList(\"Decisions\", input.decisions),\n renderList(\"Follow-ups\", input.followUps),\n renderList(\"Memory candidates\", input.memoryCandidates),\n renderList(\"Evidence\", input.evidence),\n ].filter(Boolean);\n return sections.join(\" \");\n};\n\nexport const readMemoryDreamState = async (options: BuildMemoryContextOptions): Promise<MemoryDreamState | undefined> => {\n const paths = scorelMemoryPaths(options);\n const text = await readOptional(paths.dreamStatePath);\n if (!text.trim()) return undefined;\n try {\n const parsed = JSON.parse(text) as Partial<MemoryDreamState>;\n if (parsed.projectId !== options.projectId) return undefined;\n return {\n projectId: options.projectId,\n dirty: Boolean(parsed.dirty),\n running: Boolean(parsed.running),\n sessionId: optionalString(parsed.sessionId),\n clientId: optionalString(parsed.clientId),\n lastDailyAppendAt: optionalNumber(parsed.lastDailyAppendAt),\n lastDailyPath: optionalString(parsed.lastDailyPath),\n scheduledFor: optionalNumber(parsed.scheduledFor),\n lastAttemptAt: optionalNumber(parsed.lastAttemptAt),\n lastSuccessAt: optionalNumber(parsed.lastSuccessAt),\n lastFailure: parseLastFailure(parsed.lastFailure),\n lastProjectMemoryUpdateAt: optionalNumber(parsed.lastProjectMemoryUpdateAt),\n lastRootMemoryUpdateAt: optionalNumber(parsed.lastRootMemoryUpdateAt),\n };\n } catch {\n return undefined;\n }\n};\n\nexport const writeMemoryDreamState = async (\n options: BuildMemoryContextOptions & { state: MemoryDreamState },\n): Promise<MemoryDreamState> => {\n const paths = scorelMemoryPaths(options);\n await mkdir(paths.projectDir, { recursive: true, mode: 0o700 });\n const state = { ...options.state, projectId: options.projectId };\n await writeFile(paths.dreamStatePath, `${JSON.stringify(state, null, 2)}\\n`, { encoding: \"utf8\", mode: 0o600 });\n return state;\n};\n\nexport const mergeMemoryMarkdown = (current: string, addition: string): string => {\n const text = addition.trim();\n if (!text) {\n return current;\n }\n const normalized = current.trim() || \"# Memory\\n\";\n if (normalized.includes(text)) {\n return `${normalized.trimEnd()}\\n`;\n }\n return `${normalized.trimEnd()}\\n\\n- ${text.replace(/^-+\\s*/, \"\")}\\n`;\n};\n\nexport const readSessionMemory = async (options: {\n projectId: string;\n sessionId: string;\n homeDir?: string;\n}): Promise<string> => {\n const paths = scorelSessionMemoryPaths(options);\n return trimForContext(await readOptional(paths.sessionMemoryPath), 12_000, \"tail\");\n};\n\nexport const writeSessionMemory = async (input: SessionMemoryInput): Promise<{ path: string; content: string }> => {\n const paths = scorelSessionMemoryPaths(input);\n await mkdir(paths.sessionsDir, { recursive: true, mode: 0o700 });\n const content = renderSessionMemory(input);\n await writeFile(paths.sessionMemoryPath, content, { encoding: \"utf8\", mode: 0o600 });\n return { path: paths.sessionMemoryPath, content };\n};\n\nexport const renderSessionMemory = (input: SessionMemoryInput): string => {\n const timestamp = new Date((input.now ?? Date.now)()).toISOString();\n return normalizeMarkdownFile([\n `# Session Memory: ${input.sessionId}`,\n \"\",\n `Updated: ${timestamp}`,\n \"\",\n \"## Current State\",\n compactLine(input.summary, 1_200) || \"- No durable session state captured yet.\",\n \"\",\n \"## Recent Work\",\n renderBullets(input.recentMessages, 360) || \"- No recent work captured.\",\n \"\",\n \"## Decisions\",\n renderBullets(input.decisions, 360) || \"- No session decisions captured.\",\n \"\",\n \"## Follow-ups\",\n renderBullets(input.followUps, 360) || \"- No follow-ups captured.\",\n ].join(\"\\n\"));\n};\n\nconst ensureMemoryFiles = async (paths: MemoryPaths): Promise<void> => {\n await mkdir(paths.rootDir, { recursive: true, mode: 0o700 });\n await mkdir(paths.projectDir, { recursive: true, mode: 0o700 });\n await mkdir(paths.dailyDir, { recursive: true, mode: 0o700 });\n await ensureFile(paths.rootMemoryPath, \"# Memory\\n\");\n await ensureFile(paths.projectMemoryPath, \"# Project Memory\\n\");\n await ensureFile(paths.todayDailyPath, `# ${paths.today}\\n\\n`);\n};\n\nconst ensureFile = async (path: string, content: string): Promise<void> => {\n try {\n await writeFile(path, content, { encoding: \"utf8\", flag: \"wx\", mode: 0o600 });\n } catch (cause) {\n if (!isNodeErrorCode(cause, \"EEXIST\")) {\n throw cause;\n }\n }\n};\n\nconst readOptional = async (path: string): Promise<string> => {\n try {\n return await readFile(path, \"utf8\");\n } catch (cause) {\n if (isNodeErrorCode(cause, \"ENOENT\")) {\n return \"\";\n }\n throw cause;\n }\n};\n\nconst trimForContext = (text: string, maxChars: number, mode: \"head\" | \"tail\" = \"head\"): string => {\n if (text.length <= maxChars) {\n return text;\n }\n return mode === \"tail\" ? text.slice(-maxChars) : text.slice(0, maxChars);\n};\n\nconst compactLine = (value: string, maxChars: number): string =>\n value.replace(/\\s+/g, \" \").trim().slice(0, maxChars);\n\nconst renderList = (label: string, values: string[] | undefined): string => {\n const items = (values ?? []).map((value) => compactLine(value, 240)).filter(Boolean);\n return items.length > 0 ? `${label}: ${items.join(\"; \")}` : \"\";\n};\n\nconst renderBullets = (values: string[] | undefined, maxChars: number): string =>\n (values ?? [])\n .map((value) => compactLine(value, maxChars))\n .filter(Boolean)\n .map((value) => `- ${value}`)\n .join(\"\\n\");\n\nexport const normalizeMarkdownFile = (value: string): string => `${value.trimEnd()}\\n`;\n\nconst parseAppendDailyInput = (value: unknown): AppendDailyInput => {\n if (!isRecord(value)) {\n throw new Error(\"AppendDaily args must be an object\");\n }\n const summary = requireString(value.summary, \"summary\");\n return {\n summary,\n completed: optionalStringArray(value.completed, \"completed\"),\n decisions: optionalStringArray(value.decisions, \"decisions\"),\n followUps: optionalStringArray(value.followUps, \"followUps\"),\n memoryCandidates: optionalStringArray(value.memoryCandidates, \"memoryCandidates\"),\n evidence: optionalStringArray(value.evidence, \"evidence\"),\n };\n};\n\nconst validateAppendDailyInput = (input: AppendDailyInput): void => {\n const summary = compactLine(input.summary, 500);\n if (isLowSignalSummary(summary)) {\n throw new Error(\"AppendDaily.summary is too generic; include concrete durable progress or a decision\");\n }\n const details = [\n ...(input.completed ?? []),\n ...(input.decisions ?? []),\n ...(input.followUps ?? []),\n ...(input.memoryCandidates ?? []),\n ...(input.evidence ?? []),\n ].map((value) => compactLine(value, 240)).filter(Boolean);\n if (details.length === 0) {\n throw new Error(\"AppendDaily requires at least one completed item, decision, follow-up, memory candidate, or evidence item\");\n }\n};\n\nconst isLowSignalSummary = (value: string): boolean => {\n const normalized = value.toLowerCase().replace(/\\s+/g, \"\");\n return [\n \"done\",\n \"completed\",\n \"finished\",\n \"updated\",\n \"\u7EE7\u7EED\u63A8\u8FDB\",\n \"\u5B8C\u6210\u4EFB\u52A1\",\n \"\u5DF2\u5904\u7406\",\n \"\u5904\u7406\u5B8C\u6210\",\n \"\u505A\u4E86\u4E00\u4E9B\u4FEE\u6539\",\n ].includes(normalized);\n};\n\nconst containsNormalizedDailyEntry = (daily: string, text: string): boolean => {\n const needle = normalizeDailyText(text);\n return daily\n .split(\"\\n\")\n .map((line) => line.replace(/^-\\s+\\d\\d:\\d\\d\\s+/, \"\"))\n .some((line) => normalizeDailyText(line) === needle);\n};\n\nconst normalizeDailyText = (value: string): string =>\n value.replace(/\\s+/g, \" \").trim().toLowerCase();\n\nconst requireString = (value: unknown, name: string): string => {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`AppendDaily.${name} must be a non-empty string`);\n }\n return value.trim();\n};\n\nconst optionalStringArray = (value: unknown, name: string): string[] | undefined => {\n if (value === undefined) {\n return undefined;\n }\n if (!Array.isArray(value) || !value.every((item) => typeof item === \"string\")) {\n throw new Error(`AppendDaily.${name} must be an array of strings`);\n }\n return value.map((item) => item.trim()).filter(Boolean);\n};\n\nconst optionalNumber = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n\nconst optionalString = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.trim() ? value : undefined;\n\nconst parseLastFailure = (value: unknown): MemoryDreamState[\"lastFailure\"] => {\n if (!isRecord(value)) return undefined;\n const at = optionalNumber(value.at);\n const message = optionalString(value.message);\n return at !== undefined && message ? { at, message } : undefined;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst safeProjectId = (projectId: string): string => {\n if (!/^[A-Za-z0-9_-]+$/.test(projectId)) {\n throw new Error(\"projectId must contain only letters, numbers, underscores, or hyphens\");\n }\n return projectId;\n};\n\nconst isNodeErrorCode = (cause: unknown, code: string): boolean =>\n cause instanceof Error && \"code\" in cause && cause.code === code;\n", "import type {\n ScorelMessage,\n SystemReminderContentBlock,\n SystemReminderKind,\n SystemReminderOrigin,\n SystemReminderScope,\n SystemReminderVisibility,\n ToolResultContentBlock,\n} from \"@scorel/protocol\";\n\nexport type CreateSystemReminderBlockInput = {\n kind: SystemReminderKind;\n origin: SystemReminderOrigin;\n text: string;\n visibility: SystemReminderVisibility;\n scope: SystemReminderScope;\n data?: Record<string, unknown>;\n};\n\nexport const createSystemReminderBlock = (\n input: CreateSystemReminderBlockInput,\n): SystemReminderContentBlock => ({\n type: \"system_reminder\",\n kind: input.kind,\n origin: input.origin,\n text: input.text,\n visibility: input.visibility,\n scope: input.scope,\n ...(input.data ? { data: { ...input.data } } : {}),\n});\n\nexport const renderSystemReminderText = (text: string): string =>\n `<system-reminder>\\n${text}\\n</system-reminder>`;\n\nexport const renderSystemReminder = (input: SystemReminderContentBlock | string): string =>\n renderSystemReminderText(typeof input === \"string\" ? input : input.text);\n\nexport const systemReminderMessage = (\n block: SystemReminderContentBlock,\n meta?: Record<string, unknown>,\n): ScorelMessage => ({\n role: \"user\",\n content: [cloneSystemReminderBlock(block)],\n ...(meta ? { meta: { ...meta } } : {}),\n});\n\nexport const appendSystemReminderToToolResult = (\n message: ScorelMessage,\n block: SystemReminderContentBlock,\n): boolean => {\n for (let i = message.content.length - 1; i >= 0; i -= 1) {\n const candidate = message.content[i];\n if (candidate?.type !== \"tool_result\" || !isToolResultWithContent(candidate.result)) {\n continue;\n }\n const mergedResult = {\n ...candidate.result,\n content: [...candidate.result.content, cloneSystemReminderBlock(block)],\n };\n message.content[i] = {\n ...candidate,\n result: mergedResult,\n } satisfies ToolResultContentBlock;\n return true;\n }\n return false;\n};\n\nexport const cloneSystemReminderBlock = (\n block: SystemReminderContentBlock,\n): SystemReminderContentBlock => ({\n ...block,\n ...(block.data ? { data: { ...block.data } } : {}),\n});\n\nconst isToolResultWithContent = (value: unknown): value is { content: unknown[] } =>\n typeof value === \"object\" &&\n value !== null &&\n \"content\" in value &&\n Array.isArray((value as { content?: unknown }).content);\n", "import {\n getModels,\n streamSimple,\n type Api,\n type Context,\n type KnownProvider,\n type Message,\n type Model,\n type TextContent,\n type ThinkingContent,\n type Tool,\n type ToolCall,\n type Usage as PiUsage,\n} from \"@mariozechner/pi-ai\";\n\nimport type {\n ContentBlock,\n ScorelMessage,\n StopReason,\n SystemReminderContentBlock,\n ToolCallContentBlock,\n ToolResultContentBlock,\n Usage,\n} from \"@scorel/protocol\";\n\nimport type { BuiltinPiAiModelConfig, CustomPiAiApi, CustomPiAiModelConfig } from \"../config/index.js\";\nimport type { RuntimeProvider } from \"../runtime/index.js\";\nimport { renderSystemReminder } from \"../reminders/index.js\";\nimport type { AgentTool } from \"../tools/index.js\";\n\nexport type PiAiProviderOptions = {\n model: Model<Api>;\n apiKey: string;\n reasoning?: \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n onPayload?: (payload: unknown, model: Model<Api>) => unknown | undefined | Promise<unknown | undefined>;\n};\n\nconst DEFAULT_CUSTOM_MODEL_CONTEXT_WINDOW = 200_000;\nconst DEFAULT_CUSTOM_MODEL_MAX_TOKENS = 64_000;\n\nexport const createPiAiProvider = (options: PiAiProviderOptions): RuntimeProvider => ({\n streamTurn: async function* ({ context, systemPrompt, tools, signal }) {\n const stream = streamSimple(options.model, toPiContext(context, systemPrompt, tools), {\n apiKey: options.apiKey,\n signal,\n ...(options.reasoning ? { reasoning: options.reasoning } : {}),\n ...(options.onPayload ? { onPayload: options.onPayload } : {}),\n });\n\n for await (const event of stream) {\n if (event.type === \"text_delta\") {\n yield { type: \"text_delta\", delta: event.delta };\n } else if (event.type === \"thinking_delta\") {\n yield { type: \"thinking_delta\", delta: event.delta };\n }\n }\n\n return fromPiAssistant(await stream.result());\n },\n});\n\nexport const resolvePiAiModel = (config: BuiltinPiAiModelConfig | CustomPiAiModelConfig): Model<Api> => {\n if (config.type === \"custom\") {\n return {\n id: config.id,\n name: config.id,\n api: config.api,\n provider: config.provider,\n baseUrl: config.baseUrl,\n input: config.supportsImageInput ? [\"text\", \"image\"] : [\"text\"],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n reasoning: config.reasoning ?? false,\n contextWindow: config.contextWindow ?? DEFAULT_CUSTOM_MODEL_CONTEXT_WINDOW,\n maxTokens: config.maxTokens ?? DEFAULT_CUSTOM_MODEL_MAX_TOKENS,\n ...(config.api === \"openai-completions\"\n ? { compat: { supportsDeveloperRole: config.compat?.supportsDeveloperRole ?? false } }\n : {}),\n } satisfies Model<CustomPiAiApi>;\n }\n\n const model = getModels(config.provider as KnownProvider).find((candidate) => candidate.id === config.id);\n if (!model) {\n throw new Error(`Unknown pi-ai model: ${config.provider}/${config.id}`);\n }\n return {\n ...model,\n ...(config.baseUrl ? { baseUrl: config.baseUrl } : {}),\n };\n};\n\nconst toPiContext = (context: ScorelMessage[], systemPrompt: string | undefined, tools: AgentTool[]): Context => ({\n ...(systemPrompt ? { systemPrompt } : {}),\n messages: context.flatMap(toPiMessage),\n tools: tools.map(toPiTool),\n});\n\nconst toPiMessage = (message: ScorelMessage): Message[] => {\n if (message.role === \"system\") {\n return [{ role: \"user\", content: textContent(message), timestamp: Date.now() }];\n }\n if (message.role === \"user\") {\n return [{ role: \"user\", content: textContent(message), timestamp: Date.now() }];\n }\n if (message.role === \"assistant\") {\n return [\n {\n role: \"assistant\",\n content: message.content.flatMap(toPiAssistantBlock),\n api: stringMeta(message, \"api\") ?? \"openai-completions\",\n provider: stringMeta(message, \"provider\") ?? \"scorel\",\n model: stringMeta(message, \"model\") ?? \"unknown\",\n usage: {\n input: message.usage?.inputTokens ?? 0,\n output: message.usage?.outputTokens ?? 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: message.usage?.totalTokens ?? 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: toPiStopReason(message.stopReason),\n timestamp: Date.now(),\n },\n ];\n }\n\n return message.content.flatMap((block): Message[] => {\n if (block.type !== \"tool_result\") {\n return [];\n }\n return [\n {\n role: \"toolResult\",\n toolCallId: block.toolCallId,\n toolName: block.toolName,\n content: [{ type: \"text\", text: toolResultText(block.result) }],\n isError: block.isError ?? false,\n timestamp: Date.now(),\n },\n ];\n });\n};\n\nconst toPiAssistantBlock = (block: ContentBlock): Array<TextContent | ThinkingContent | ToolCall> => {\n if (block.type === \"text\") {\n return [{ type: \"text\", text: block.text }];\n }\n if (block.type === \"system_reminder\") {\n return [{ type: \"text\", text: renderSystemReminder(block) }];\n }\n if (block.type === \"thinking\") {\n return [{ type: \"thinking\", thinking: block.text }];\n }\n if (block.type === \"tool_call\") {\n return [{ type: \"toolCall\", id: block.toolCallId, name: block.toolName, arguments: block.args as Record<string, unknown> }];\n }\n return [];\n};\n\nconst fromPiAssistant = (message: Extract<Message, { role: \"assistant\" }>): ScorelMessage & { role: \"assistant\" } => ({\n role: \"assistant\",\n content: message.content.map(fromPiContentBlock),\n stopReason: fromPiStopReason(message.stopReason),\n usage: fromPiUsage(message.usage),\n meta: {\n api: message.api,\n provider: message.provider,\n model: message.model,\n },\n});\n\nconst fromPiContentBlock = (block: Extract<Message, { role: \"assistant\" }>[\"content\"][number]): ContentBlock => {\n if (block.type === \"text\") {\n return { type: \"text\", text: block.text };\n }\n if (block.type === \"thinking\") {\n return { type: \"thinking\", text: block.thinking };\n }\n return {\n type: \"tool_call\",\n toolCallId: block.id,\n toolName: block.name,\n args: block.arguments,\n };\n};\n\nconst toPiTool = (tool: AgentTool): Tool => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n});\n\nconst textContent = (message: ScorelMessage): string =>\n message.content.flatMap((block) => {\n if (block.type === \"text\") {\n return [block.text];\n }\n if (block.type === \"system_reminder\") {\n return [renderSystemReminder(block)];\n }\n return [];\n }).join(\"\\n\");\n\nconst toolResultText = (result: ToolResultContentBlock[\"result\"]): string => {\n if (typeof result === \"object\" && result !== null && \"content\" in result) {\n const content = (result as { content?: unknown }).content;\n if (Array.isArray(content)) {\n return content\n .flatMap((block): string[] => {\n if (block?.type === \"text\" && typeof block.text === \"string\") {\n return [block.text];\n }\n if (isSystemReminderContentBlock(block)) {\n return [renderSystemReminder(block)];\n }\n return [];\n })\n .join(\"\\n\");\n }\n }\n return JSON.stringify(result);\n};\n\nconst isSystemReminderContentBlock = (value: unknown): value is SystemReminderContentBlock =>\n typeof value === \"object\" &&\n value !== null &&\n (value as { type?: unknown }).type === \"system_reminder\" &&\n typeof (value as { text?: unknown }).text === \"string\";\n\nconst stringMeta = (message: ScorelMessage, key: string): string | undefined => {\n const value = message.meta?.[key];\n return typeof value === \"string\" ? value : undefined;\n};\n\nconst toPiStopReason = (reason: StopReason | undefined): Extract<Message, { role: \"assistant\" }>[\"stopReason\"] => {\n if (reason === \"tool_call\") {\n return \"toolUse\";\n }\n if (reason === \"max_tokens\") {\n return \"length\";\n }\n if (reason === \"cancelled\") {\n return \"aborted\";\n }\n if (reason === \"error\") {\n return \"error\";\n }\n return \"stop\";\n};\n\nconst fromPiStopReason = (reason: Extract<Message, { role: \"assistant\" }>[\"stopReason\"]): StopReason => {\n if (reason === \"toolUse\") {\n return \"tool_call\";\n }\n if (reason === \"length\") {\n return \"max_tokens\";\n }\n if (reason === \"aborted\") {\n return \"cancelled\";\n }\n if (reason === \"error\") {\n return \"error\";\n }\n return \"end_turn\";\n};\n\nconst fromPiUsage = (usage: PiUsage | undefined): Usage | undefined => {\n if (!usage) {\n return undefined;\n }\n return {\n inputTokens: usage.input,\n outputTokens: usage.output,\n totalTokens: usage.totalTokens,\n };\n};\n", "import type {\n ScorelMessage,\n StopReason,\n ToolCallContentBlock,\n ToolResultContentBlock,\n Usage,\n} from \"@scorel/protocol\";\n\nimport type { AgentTool, ToolResult } from \"../tools/index.js\";\n\nexport type RuntimeTurnOptions = {\n refreshContext?: (context: ScorelMessage[]) => ScorelMessage[] | Promise<ScorelMessage[]>;\n};\n\nexport type ProviderStreamChunk = {\n type: \"text_delta\" | \"thinking_delta\";\n delta: string;\n};\n\nexport type RuntimeProviderTurn = {\n context: ScorelMessage[];\n systemPrompt: string | undefined;\n tools: AgentTool[];\n signal: AbortSignal;\n options: RuntimeTurnOptions;\n};\n\nexport type RuntimeProvider = {\n streamTurn(turn: RuntimeProviderTurn): AsyncGenerator<ProviderStreamChunk, ScorelMessage | void, undefined>;\n};\n\nexport type RawRuntimeEvent =\n | { type: \"turn_start\" }\n | { type: \"turn_end\"; usage?: Usage; stopReason?: StopReason }\n | { type: \"message_start\"; role: \"assistant\" | \"tool_result\" }\n | { type: \"text_delta\"; delta: string }\n | { type: \"thinking_delta\"; delta: string }\n | { type: \"message_end\"; message: ScorelMessage & { role: \"assistant\" } }\n | { type: \"tool_execution_start\"; toolCallId: string; toolName: string; args: unknown }\n | {\n type: \"tool_execution_end\";\n toolCallId: string;\n toolName: string;\n durationMs: number;\n isError: boolean;\n result: ToolResult;\n }\n | { type: \"error\"; error: Error };\n\ntype ProviderTurnResult = {\n message?: ScorelMessage & { role: \"assistant\" };\n finished?: boolean;\n stopReason?: StopReason;\n};\n\nexport class ScorelRuntime {\n readonly #provider: RuntimeProvider;\n readonly #tools = new Map<string, AgentTool>();\n #controller: AbortController | undefined;\n\n constructor({ provider }: { provider: RuntimeProvider }) {\n this.#provider = provider;\n }\n\n get running(): boolean {\n return this.#controller !== undefined;\n }\n\n registerTool(tool: AgentTool): void {\n this.#tools.set(tool.name, tool);\n }\n\n unregisterTool(name: string): void {\n this.#tools.delete(name);\n }\n\n cancel(): void {\n this.#controller?.abort();\n }\n\n async *executeTurn(\n context: ScorelMessage[],\n systemPrompt: string | undefined,\n options: RuntimeTurnOptions,\n ): AsyncGenerator<RawRuntimeEvent, void, undefined> {\n if (this.#controller) {\n throw new Error(\"Runtime is already running\");\n }\n\n const controller = new AbortController();\n this.#controller = controller;\n\n yield { type: \"turn_start\" };\n\n try {\n let nextContext = [...context];\n\n while (!controller.signal.aborted) {\n const result = yield* this.#runProviderTurn(nextContext, systemPrompt, options, controller.signal);\n if (result.finished) {\n return;\n }\n\n const assistant = result.message;\n if (!assistant) {\n yield { type: \"turn_end\", stopReason: result.stopReason ?? \"end_turn\" };\n return;\n }\n\n const toolCalls = assistant.content.filter(\n (block): block is ToolCallContentBlock => block.type === \"tool_call\",\n );\n\n if (controller.signal.aborted || toolCalls.length === 0 || assistant.stopReason !== \"tool_call\") {\n yield { type: \"turn_end\", stopReason: controller.signal.aborted ? \"cancelled\" : assistant.stopReason };\n return;\n }\n\n const toolMessages: ScorelMessage[] = [];\n for (const toolCall of toolCalls) {\n if (controller.signal.aborted) {\n break;\n }\n toolMessages.push(yield* this.#executeTool(toolCall, controller.signal));\n }\n\n if (controller.signal.aborted) {\n yield { type: \"turn_end\", stopReason: \"cancelled\" };\n return;\n }\n\n const contextAfterTools = [...nextContext, assistant, ...toolMessages];\n nextContext = options.refreshContext ? await options.refreshContext(contextAfterTools) : contextAfterTools;\n }\n\n yield { type: \"turn_end\", stopReason: \"cancelled\" };\n } finally {\n this.#controller = undefined;\n }\n }\n\n async *#runProviderTurn(\n context: ScorelMessage[],\n systemPrompt: string | undefined,\n options: RuntimeTurnOptions,\n signal: AbortSignal,\n ): AsyncGenerator<RawRuntimeEvent, ProviderTurnResult, undefined> {\n let text = \"\";\n let thinking = \"\";\n\n yield { type: \"message_start\", role: \"assistant\" };\n\n try {\n const stream = this.#provider.streamTurn({\n context,\n systemPrompt,\n tools: [...this.#tools.values()],\n signal,\n options,\n });\n\n while (true) {\n if (signal.aborted) {\n break;\n }\n\n const next = await stream.next();\n if (next.done) {\n const message = normalizeAssistantMessage(next.value, { thinking, text }, signal.aborted ? \"cancelled\" : \"end_turn\");\n if (message) {\n yield { type: \"message_end\", message };\n }\n return { message, stopReason: message?.stopReason ?? \"end_turn\" };\n }\n\n if (next.value.type === \"text_delta\") {\n text += next.value.delta;\n yield next.value;\n } else if (next.value.type === \"thinking_delta\") {\n thinking += next.value.delta;\n yield next.value;\n }\n }\n\n const cancelledMessage = partialAssistantMessage({ thinking, text }, \"cancelled\");\n if (cancelledMessage) {\n yield { type: \"message_end\", message: cancelledMessage };\n }\n return { stopReason: \"cancelled\" };\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n const partial = partialAssistantMessage({ thinking, text }, \"error\");\n if (partial) {\n yield { type: \"message_end\", message: partial };\n }\n yield { type: \"error\", error };\n yield { type: \"turn_end\", stopReason: \"error\" };\n return { finished: true };\n }\n }\n\n async *#executeTool(\n toolCall: ToolCallContentBlock,\n signal: AbortSignal,\n ): AsyncGenerator<RawRuntimeEvent, ScorelMessage, undefined> {\n const start = Date.now();\n const tool = this.#tools.get(toolCall.toolName);\n yield {\n type: \"tool_execution_start\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: toolCall.args,\n };\n\n let result: ToolResult;\n let isError = false;\n try {\n if (!tool) {\n throw new Error(`Unknown tool: ${toolCall.toolName}`);\n }\n result = await tool.execute(toolCall.toolCallId, toolCall.args, signal, () => undefined);\n } catch (cause) {\n isError = true;\n const message = cause instanceof Error ? cause.message : String(cause);\n result = { content: [{ type: \"text\", text: message }] };\n }\n\n yield {\n type: \"tool_execution_end\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n durationMs: Date.now() - start,\n isError,\n result,\n };\n\n const block: ToolResultContentBlock = {\n type: \"tool_result\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n result: toolResultForContext(result),\n isError,\n };\n\n return {\n role: \"tool_result\",\n content: [block],\n };\n }\n}\n\nconst toolResultForContext = (result: ToolResult): ToolResult => ({\n content: result.content,\n});\n\nconst normalizeAssistantMessage = (\n value: ScorelMessage | void,\n streamed: StreamedAssistantContent,\n fallbackStopReason: StopReason,\n): (ScorelMessage & { role: \"assistant\" }) | undefined => {\n if (value) {\n if (!isAssistantMessage(value)) {\n throw new Error(`Provider returned ${value.role} message instead of assistant`);\n }\n return value;\n }\n return partialAssistantMessage(streamed, fallbackStopReason);\n};\n\nconst isAssistantMessage = (message: ScorelMessage): message is ScorelMessage & { role: \"assistant\" } =>\n message.role === \"assistant\";\n\ntype StreamedAssistantContent = {\n thinking: string;\n text: string;\n};\n\nconst partialAssistantMessage = (\n streamed: StreamedAssistantContent,\n stopReason: StopReason,\n): (ScorelMessage & { role: \"assistant\" }) | undefined => {\n if (streamed.thinking.length === 0 && streamed.text.length === 0) {\n return undefined;\n }\n return {\n role: \"assistant\",\n content: [\n ...(streamed.thinking ? [{ type: \"thinking\" as const, text: streamed.thinking }] : []),\n ...(streamed.text ? [{ type: \"text\" as const, text: streamed.text }] : []),\n ],\n stopReason,\n meta: stopReason === \"end_turn\" ? undefined : { partial: true },\n };\n};\n", "import { createHash } from \"node:crypto\";\nimport { appendFile, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport {\n asSeq,\n type DeviceId,\n type EventId,\n type HarnessItemEvent,\n type InstructionSnapshot,\n type PersistentEvent,\n type QueueItem,\n type QueueName,\n type ScorelMessage,\n type SystemReminderKind,\n type SystemReminderScope,\n type SystemReminderVisibility,\n type SkillIndexEntry,\n type Seq,\n type SessionId,\n type SessionMeta,\n} from \"@scorel/protocol\";\n\nimport {\n appendSystemReminderToToolResult,\n cloneSystemReminderBlock,\n createSystemReminderBlock,\n systemReminderMessage,\n} from \"../reminders/index.js\";\n\ntype MessagePersistentEvent = Extract<PersistentEvent, { message: ScorelMessage }>;\ntype CompactPersistentEvent = Extract<PersistentEvent, { type: \"compact\" }>;\ntype ConversationPersistentEvent = MessagePersistentEvent | HarnessItemEvent | CompactPersistentEvent;\n\nexport const snipUserMessageAlias = (eventId: EventId): string =>\n `u_${createHash(\"sha256\").update(eventId).digest(\"hex\").slice(0, 8)}`;\n\nexport type HiddenUserTurnSpan = {\n anchorUserEventId: EventId;\n throughEventId: EventId;\n};\n\nexport type SessionControlState = {\n instructionSnapshot?: InstructionSnapshot;\n queues: Record<QueueName, QueueItem[]>;\n skillIndexInitialized: boolean;\n skillIndex: Record<string, SkillIndexEntry>;\n hiddenUserTurnSpans: HiddenUserTurnSpan[];\n};\n\nexport type SessionHeader = {\n version: 1;\n sessionId: SessionId;\n deviceId: DeviceId;\n createdAt: number;\n clonedFrom?: {\n sessionId: SessionId;\n deviceId: DeviceId;\n eventId: EventId;\n };\n meta: SessionMeta;\n};\n\nexport type SessionStoreErrorCode =\n | \"missing_header\"\n | \"invalid_header\"\n | \"invalid_event\"\n | \"invalid_json\"\n | \"duplicate_event_id\"\n | \"invalid_parent\"\n | \"non_monotonic_seq\"\n | \"session_mismatch\";\n\nexport class SessionStoreError extends Error {\n readonly code: SessionStoreErrorCode;\n readonly line?: number;\n\n constructor(code: SessionStoreErrorCode, message: string, options?: { line?: number }) {\n super(message);\n this.name = \"SessionStoreError\";\n this.code = code;\n this.line = options?.line;\n }\n}\n\nexport type TreeNode = {\n readonly event: PersistentEvent;\n readonly children: readonly EventId[];\n};\n\ntype MutableTreeNode = {\n event: PersistentEvent;\n children: EventId[];\n};\n\nexport class SessionTree implements Iterable<PersistentEvent> {\n #nodes = new Map<EventId, MutableTreeNode>();\n #events = new Map<EventId, PersistentEvent>();\n #order: EventId[] = [];\n #conversationOrder: EventId[] = [];\n #rootId: EventId | null = null;\n #currentSeq = asSeq(0);\n readonly controlState: SessionControlState = {\n queues: {\n follow_up: [],\n steer: [],\n },\n skillIndexInitialized: false,\n skillIndex: {},\n hiddenUserTurnSpans: [],\n };\n\n get rootId(): EventId | null {\n return this.#rootId;\n }\n\n get size(): number {\n return this.#events.size;\n }\n\n get currentSeq(): Seq {\n return this.#currentSeq;\n }\n\n get(id: EventId): TreeNode | undefined {\n const node = this.#nodes.get(id);\n if (!node) {\n return undefined;\n }\n return {\n event: node.event,\n children: [...node.children],\n };\n }\n\n has(id: EventId): boolean {\n return this.#events.has(id);\n }\n\n append(event: PersistentEvent): void {\n this.assertCanAppend(event);\n\n this.#events.set(event.id, event);\n this.#order.push(event.id);\n this.#currentSeq = event.seq;\n this.#applyControlEvent(event);\n\n if (!isConversationEvent(event)) {\n return;\n }\n\n if (event.parentId !== null) {\n this.#nodes.get(event.parentId)?.children.push(event.id);\n } else {\n this.#rootId = event.id;\n }\n this.#nodes.set(event.id, { event, children: [] });\n this.#conversationOrder.push(event.id);\n }\n\n assertCanAppend(event: PersistentEvent): void {\n assertTreeEvent(event);\n\n if (this.#events.has(event.id)) {\n throw new SessionStoreError(\"duplicate_event_id\", `Duplicate event id: ${event.id}`);\n }\n\n if (Number(event.seq) <= Number(this.#currentSeq)) {\n throw new SessionStoreError(\n \"non_monotonic_seq\",\n `Event seq ${String(event.seq)} must be greater than ${String(this.#currentSeq)}`,\n );\n }\n\n if (!isConversationEvent(event)) {\n return;\n }\n\n if (event.parentId === null) {\n if (this.#rootId !== null) {\n throw new SessionStoreError(\"invalid_parent\", \"Only the first event can have a null parentId\");\n }\n } else {\n const parent = this.#nodes.get(event.parentId);\n if (!parent) {\n throw new SessionStoreError(\"invalid_parent\", `Missing parent event: ${event.parentId}`);\n }\n }\n }\n\n getLeaves(): EventId[] {\n return this.#conversationOrder.filter((id) => this.#nodes.get(id)?.children.length === 0);\n }\n\n getChildren(id: EventId): EventId[] {\n return [...(this.#nodes.get(id)?.children ?? [])];\n }\n\n getPath(id: EventId): EventId[] {\n if (!this.#nodes.has(id)) {\n throw new SessionStoreError(\"invalid_parent\", `Unknown event id: ${id}`);\n }\n\n const path: EventId[] = [];\n let current: EventId | null = id;\n while (current !== null) {\n const node = this.#nodes.get(current);\n if (!node) {\n throw new SessionStoreError(\"invalid_parent\", `Broken path at event id: ${current}`);\n }\n path.push(current);\n current = node.event.parentId;\n }\n return path.reverse();\n }\n\n getBranchPoints(): EventId[] {\n return this.#conversationOrder.filter((id) => (this.#nodes.get(id)?.children.length ?? 0) > 1);\n }\n\n *[Symbol.iterator](): Iterator<PersistentEvent> {\n for (const id of this.#order) {\n const event = this.#events.get(id);\n if (event) {\n yield event;\n }\n }\n }\n\n #applyControlEvent(event: PersistentEvent): void {\n if (event.type === \"instruction_snapshot\") {\n this.controlState.instructionSnapshot = event.snapshot;\n } else if (event.type === \"queue_update\") {\n this.controlState.queues[event.queue] = [...event.items];\n } else if (event.type === \"skill_index_snapshot\") {\n this.controlState.skillIndexInitialized = true;\n this.controlState.skillIndex = Object.fromEntries(event.entries.map((entry) => [entry.name, entry]));\n } else if (event.type === \"skill_index_delta\") {\n this.controlState.skillIndexInitialized = true;\n const next = { ...this.controlState.skillIndex };\n for (const entry of event.added) {\n next[entry.name] = entry;\n }\n for (const entry of event.changed) {\n next[entry.name] = entry;\n }\n for (const removed of event.removed) {\n delete next[removed.name];\n }\n this.controlState.skillIndex = next;\n } else if (event.type === \"context_control\") {\n this.controlState.hiddenUserTurnSpans = [\n ...this.controlState.hiddenUserTurnSpans.filter(\n (span) => span.anchorUserEventId !== event.anchorUserEventId,\n ),\n {\n anchorUserEventId: event.anchorUserEventId,\n throughEventId: event.throughEventId,\n },\n ];\n }\n }\n}\n\nexport type CreateSessionOptions = {\n sessionsDir: string;\n header: SessionHeader;\n};\n\nexport type LoadSessionOptions =\n | {\n sessionsDir: string;\n sessionId: SessionId;\n filePath?: never;\n }\n | {\n filePath: string;\n sessionsDir?: never;\n sessionId?: never;\n };\n\nexport class JsonlSession {\n readonly filePath: string;\n readonly header: SessionHeader;\n readonly tree: SessionTree;\n\n constructor(filePath: string, header: SessionHeader, tree = new SessionTree()) {\n this.filePath = filePath;\n this.header = header;\n this.tree = tree;\n }\n\n get activeLeafId(): EventId | null {\n const leaves = this.tree.getLeaves();\n return leaves.at(-1) ?? null;\n }\n\n get currentSeq(): Seq {\n return this.tree.currentSeq;\n }\n\n async append(event: PersistentEvent): Promise<PersistentEvent> {\n validateSessionMatch(this.header, event);\n this.tree.assertCanAppend(event);\n await appendFile(this.filePath, `${JSON.stringify(event)}\\n`, \"utf8\");\n this.tree.append(event);\n return event;\n }\n\n async close(): Promise<void> {\n return Promise.resolve();\n }\n}\n\nexport const sessionFilePath = (sessionsDir: string, sessionId: SessionId): string =>\n join(sessionsDir, `${sessionId}.jsonl`);\n\nexport const sessionLogFilePath = (sessionsDir: string, sessionId: SessionId): string =>\n join(sessionsDir, `${sessionId}.log`);\n\nexport const sessionArtifactsDirPath = (sessionsDir: string, sessionId: SessionId): string =>\n join(sessionsDir, `${sessionId}.artifacts`);\n\nexport const createSession = async ({ sessionsDir, header }: CreateSessionOptions): Promise<JsonlSession> => {\n const validHeader = parseHeader(header);\n await mkdir(sessionsDir, { recursive: true });\n const filePath = sessionFilePath(sessionsDir, validHeader.sessionId);\n await writeFile(filePath, `${JSON.stringify(validHeader)}\\n`, { encoding: \"utf8\", flag: \"wx\" });\n return new JsonlSession(filePath, validHeader);\n};\n\nexport const loadSession = async (options: LoadSessionOptions): Promise<JsonlSession> => {\n const filePath =\n options.filePath !== undefined ? options.filePath : sessionFilePath(options.sessionsDir, options.sessionId);\n const content = await readFile(filePath, \"utf8\");\n const lines: string[] = content.split(/\\r?\\n/);\n const headerLine = lines[0];\n\n if (!headerLine) {\n throw new SessionStoreError(\"missing_header\", \"Session file is missing a header\");\n }\n\n const parsedLines = lines\n .map((line: string, index: number) => ({ line, lineNumber: index + 1 }))\n .filter(({ line }) => line.length > 0)\n .map(({ line, lineNumber }) => parseJsonLine(line, lineNumber));\n\n const header = parseHeader(parsedLines[0]);\n\n const tree = new SessionTree();\n for (const event of parsedLines.slice(1)) {\n tree.append(parseSessionEvent(header, event));\n }\n\n await mkdir(dirname(filePath), { recursive: true });\n return new JsonlSession(filePath, header, tree);\n};\n\nexport const buildContext = (tree: SessionTree, leafId: EventId): ScorelMessage[] => {\n const path = tree.getPath(leafId);\n const hiddenIds = hiddenContextEventIds(tree, path, leafId);\n return path.reduce<ScorelMessage[]>((messages, id, index) => {\n if (hiddenIds.has(id)) {\n return messages;\n }\n const event = tree.get(id)?.event;\n if (!event) {\n return messages;\n }\n if (\"message\" in event) {\n messages.push(cloneMessage(event.message));\n return messages;\n }\n if (event.type === \"harness_item\") {\n appendHarnessItemToContext(messages, event);\n }\n if (event.type === \"compact\") {\n const retained = retainedMessagesBeforeCompact(tree, path.slice(0, index), event.retainedEventCount, hiddenIds);\n messages.length = 0;\n messages.push(compactSummaryMessage(event));\n messages.push(...retained);\n }\n return messages;\n }, []);\n};\n\nconst hiddenContextEventIds = (tree: SessionTree, path: EventId[], leafId: EventId): Set<EventId> => {\n const leaf = tree.get(leafId)?.event;\n if (!leaf) {\n return new Set();\n }\n const pathIndexes = new Map(path.map((id, index) => [id, index]));\n const hidden = new Set<EventId>();\n for (const event of tree) {\n if (event.type !== \"context_control\" || Number(event.seq) > Number(leaf.seq)) {\n continue;\n }\n const start = pathIndexes.get(event.anchorUserEventId);\n const end = pathIndexes.get(event.throughEventId);\n if (start === undefined || end === undefined || end < start) {\n continue;\n }\n for (const id of path.slice(start, end + 1)) {\n hidden.add(id);\n }\n }\n return hidden;\n};\n\nconst retainedMessagesBeforeCompact = (\n tree: SessionTree,\n pathBeforeCompact: EventId[],\n retainedEventCount: number,\n hiddenIds = new Set<EventId>(),\n): ScorelMessage[] => {\n if (retainedEventCount <= 0) {\n return [];\n }\n const candidateStart = Math.max(0, pathBeforeCompact.length - retainedEventCount);\n let start = pathBeforeCompact.length;\n for (let index = candidateStart; index < pathBeforeCompact.length; index += 1) {\n const event = tree.get(pathBeforeCompact[index])?.event;\n if (isRetainedContextStart(event)) {\n start = index;\n break;\n }\n }\n const retained: ScorelMessage[] = [];\n for (const id of pathBeforeCompact.slice(start)) {\n if (hiddenIds.has(id)) {\n continue;\n }\n const event = tree.get(id)?.event;\n if (!event) {\n continue;\n }\n if (\"message\" in event) {\n retained.push(cloneMessage(event.message));\n } else if (event.type === \"harness_item\") {\n appendHarnessItemToContext(retained, event);\n } else if (event.type === \"compact\") {\n retained.length = 0;\n retained.push(compactSummaryMessage(event));\n }\n }\n return retained;\n};\n\nconst isRetainedContextStart = (event: PersistentEvent | undefined): boolean =>\n event?.type === \"user_message\" ||\n event?.type === \"compact\" ||\n (\n event?.type === \"assistant_message\" &&\n event.message.content.some((block) => block.type === \"tool_call\")\n );\n\nconst parseJsonLine = (line: string, lineNumber: number): unknown => {\n try {\n return JSON.parse(line);\n } catch (cause) {\n throw new SessionStoreError(\"invalid_json\", `Invalid JSON at line ${lineNumber}`, { line: lineNumber });\n }\n};\n\nconst parseHeader = (value: unknown): SessionHeader => {\n if (!isRecord(value)) {\n throw new SessionStoreError(\"invalid_header\", \"Session header must be an object\");\n }\n if (value.version !== 1 || typeof value.sessionId !== \"string\" || typeof value.deviceId !== \"string\") {\n throw new SessionStoreError(\"invalid_header\", \"Session header is missing required identity fields\");\n }\n if (typeof value.createdAt !== \"number\" || !isRecord(value.meta)) {\n throw new SessionStoreError(\"invalid_header\", \"Session header is missing createdAt or meta\");\n }\n if (typeof value.meta.projectId !== \"string\" || value.meta.projectId.length === 0) {\n throw new SessionStoreError(\"invalid_header\", \"Session header is missing meta.projectId\");\n }\n return value as SessionHeader;\n};\n\nconst parseSessionEvent = (header: SessionHeader, value: unknown): PersistentEvent => {\n validateSessionMatch(header, value);\n assertTreeEvent(value);\n return value;\n};\n\nconst validateSessionMatch = (header: SessionHeader, value: unknown): void => {\n if (!isRecord(value) || typeof value.sessionId !== \"string\") {\n throw new SessionStoreError(\"invalid_header\", \"Event must be an object with a sessionId\");\n }\n if (value.sessionId !== header.sessionId) {\n throw new SessionStoreError(\"session_mismatch\", `Event belongs to ${value.sessionId}, expected ${header.sessionId}`);\n }\n};\n\nfunction assertTreeEvent(value: unknown): asserts value is PersistentEvent {\n if (!isRecord(value)) {\n throw new SessionStoreError(\"invalid_event\", \"Event must be an object\");\n }\n if (value.type === \"session_header\") {\n throw new SessionStoreError(\"invalid_event\", \"Session header must be stored as the JSONL header line\");\n }\n if (\n value.type !== \"user_message\" &&\n value.type !== \"assistant_message\" &&\n value.type !== \"tool_result\" &&\n value.type !== \"session_title_updated\" &&\n value.type !== \"instruction_snapshot\" &&\n value.type !== \"harness_item\" &&\n value.type !== \"compact\" &&\n value.type !== \"context_control\" &&\n value.type !== \"queue_update\" &&\n value.type !== \"skill_index_snapshot\" &&\n value.type !== \"skill_index_delta\"\n ) {\n throw new SessionStoreError(\"invalid_event\", \"Unsupported session event type\");\n }\n if (\n typeof value.id !== \"string\" ||\n (value.parentId !== null && typeof value.parentId !== \"string\") ||\n typeof value.seq !== \"number\" ||\n typeof value.clientId !== \"string\" ||\n typeof value.ts !== \"number\"\n ) {\n throw new SessionStoreError(\"invalid_event\", \"Event is missing required base fields\");\n }\n if (\n (value.type === \"user_message\" || value.type === \"assistant_message\" || value.type === \"tool_result\") &&\n !isRecord(value.message)\n ) {\n throw new SessionStoreError(\"invalid_event\", \"Message event is missing message payload\");\n }\n if (value.type === \"session_title_updated\" && !isSessionTitleUpdated(value)) {\n throw new SessionStoreError(\"invalid_event\", \"session_title_updated is missing title payload\");\n }\n if (value.type === \"instruction_snapshot\" && !isInstructionSnapshot(value.snapshot)) {\n throw new SessionStoreError(\"invalid_event\", \"instruction_snapshot is missing snapshot payload\");\n }\n if (value.type === \"harness_item\" && !isHarnessItem(value.item)) {\n throw new SessionStoreError(\"invalid_event\", \"harness_item is missing item payload\");\n }\n if (value.type === \"compact\" && !isCompactEvent(value)) {\n throw new SessionStoreError(\"invalid_event\", \"compact is missing summary payload\");\n }\n if (value.type === \"context_control\" && !isContextControlEvent(value)) {\n throw new SessionStoreError(\"invalid_event\", \"context_control is missing hide_user_turn payload\");\n }\n if (value.type === \"queue_update\" && !isQueueUpdate(value)) {\n throw new SessionStoreError(\"invalid_event\", \"queue_update is missing queue payload\");\n }\n if (value.type === \"skill_index_snapshot\" && !isSkillIndexSnapshot(value)) {\n throw new SessionStoreError(\"invalid_event\", \"skill_index_snapshot is missing entries\");\n }\n if (value.type === \"skill_index_delta\" && !isSkillIndexDelta(value)) {\n throw new SessionStoreError(\"invalid_event\", \"skill_index_delta is missing delta payload\");\n }\n}\n\nconst isConversationEvent = (event: PersistentEvent): event is ConversationPersistentEvent =>\n event.type === \"user_message\" ||\n event.type === \"assistant_message\" ||\n event.type === \"tool_result\" ||\n event.type === \"harness_item\" ||\n event.type === \"compact\";\n\nconst isInstructionSnapshot = (value: unknown): value is InstructionSnapshot => {\n if (!isRecord(value) || value.version !== 1 || typeof value.cwd !== \"string\" || !Array.isArray(value.sections)) {\n return false;\n }\n return value.sections.every(\n (section) =>\n isRecord(section) &&\n typeof section.kind === \"string\" &&\n typeof section.frozenAt === \"number\" &&\n typeof section.renderedBlock === \"string\",\n );\n};\n\nconst isHarnessItem = (value: unknown): boolean =>\n isRecord(value) &&\n typeof value.kind === \"string\" &&\n typeof value.origin === \"string\" &&\n typeof value.content === \"string\" &&\n (value.visibility === \"display\" || value.visibility === \"hidden\" || value.visibility === \"compact\");\n\nconst isCompactEvent = (value: Record<string, unknown>): boolean =>\n typeof value.summary === \"string\" &&\n typeof value.compactedThrough === \"string\" &&\n typeof value.tokensBefore === \"number\" &&\n typeof value.tokensAfter === \"number\" &&\n typeof value.retainedEventCount === \"number\";\n\nconst isContextControlEvent = (value: Record<string, unknown>): boolean =>\n value.operation === \"hide_user_turn\" &&\n typeof value.anchorUserEventId === \"string\" &&\n typeof value.throughEventId === \"string\" &&\n (value.actor === \"agent\" || value.actor === \"user\" || value.actor === \"system\") &&\n (value.reason === undefined || typeof value.reason === \"string\");\n\nconst isQueueUpdate = (value: Record<string, unknown>): boolean =>\n (value.queue === \"follow_up\" || value.queue === \"steer\") &&\n value.operation === \"rewrite\" &&\n Array.isArray(value.items) &&\n (value.anchorEventId === null || typeof value.anchorEventId === \"string\") &&\n value.items.every(\n (item) =>\n isRecord(item) &&\n typeof item.id === \"string\" &&\n Array.isArray(item.content) &&\n typeof item.createdAt === \"number\" &&\n typeof item.updatedAt === \"number\" &&\n typeof item.clientId === \"string\",\n );\n\nconst isSessionTitleUpdated = (value: Record<string, unknown>): boolean =>\n typeof value.title === \"string\" &&\n value.title.length > 0 &&\n (value.source === \"model\" || value.source === \"user\") &&\n (value.derivedFrom === undefined ||\n (isRecord(value.derivedFrom) &&\n typeof value.derivedFrom.eventId === \"string\" &&\n typeof value.derivedFrom.seq === \"number\"));\n\nconst isSkillIndexSnapshot = (value: Record<string, unknown>): boolean =>\n (value.anchorEventId === null || typeof value.anchorEventId === \"string\") &&\n Array.isArray(value.entries) &&\n value.entries.every(isSkillIndexEntry);\n\nconst isSkillIndexDelta = (value: Record<string, unknown>): boolean =>\n (value.anchorEventId === null || typeof value.anchorEventId === \"string\") &&\n Array.isArray(value.added) &&\n Array.isArray(value.changed) &&\n Array.isArray(value.removed) &&\n value.added.every(isSkillIndexEntry) &&\n value.changed.every(isSkillIndexEntry) &&\n value.removed.every(\n (item) => isRecord(item) && typeof item.name === \"string\" && typeof item.previousPath === \"string\",\n );\n\nconst isSkillIndexEntry = (value: unknown): value is SkillIndexEntry =>\n isRecord(value) &&\n typeof value.name === \"string\" &&\n typeof value.path === \"string\" &&\n (value.scope === \"user\" || value.scope === \"project\" || value.scope === \"extension\") &&\n typeof value.description === \"string\" &&\n typeof value.mtimeMs === \"number\" &&\n typeof value.size === \"number\" &&\n typeof value.contentHash === \"string\" &&\n typeof value.priority === \"number\";\n\nconst appendHarnessItemToContext = (messages: ScorelMessage[], event: HarnessItemEvent): void => {\n const reminder = createSystemReminderBlock({\n kind: reminderKindFromHarness(event.item.kind),\n origin: event.item.origin,\n text: event.item.content,\n visibility: reminderVisibilityFromHarness(event.item.visibility),\n scope: reminderScopeFromHarness(event.item.kind),\n ...(event.item.data ? { data: event.item.data } : {}),\n });\n const last = messages.at(-1);\n if (last?.role === \"tool_result\" && appendSystemReminderToToolResult(last, reminder)) {\n return;\n }\n messages.push(systemReminderMessage(reminder, {\n source: \"harness_item\",\n harnessKind: event.item.kind,\n harnessOrigin: event.item.origin,\n }));\n};\n\nconst compactSummaryMessage = (event: CompactPersistentEvent): ScorelMessage => ({\n role: \"user\",\n content: [createSystemReminderBlock({\n kind: \"compact_summary\",\n origin: \"system\",\n text: [\n \"Earlier session context has been compacted.\",\n \"\",\n event.summary.trim(),\n \"\",\n \"Use this summary as continuity context. Verify current repository facts before acting.\",\n ].join(\"\\n\"),\n visibility: \"model\",\n scope: \"session\",\n })],\n meta: {\n source: \"compact\",\n compactedThrough: event.compactedThrough,\n },\n});\n\nconst reminderKindFromHarness = (kind: HarnessItemEvent[\"item\"][\"kind\"]): SystemReminderKind => {\n if (\n kind === \"attachment\" ||\n kind === \"skill_listing\" ||\n kind === \"skill_delta\" ||\n kind === \"memory\" ||\n kind === \"channel_context\" ||\n kind === \"steer\" ||\n kind === \"runtime_notice\"\n ) {\n return kind;\n }\n if (kind === \"date_change\") {\n return \"time\";\n }\n return \"runtime_notice\";\n};\n\nconst reminderVisibilityFromHarness = (\n visibility: HarnessItemEvent[\"item\"][\"visibility\"],\n): SystemReminderVisibility => {\n if (visibility === \"hidden\") {\n return \"model\";\n }\n return visibility;\n};\n\nconst reminderScopeFromHarness = (kind: HarnessItemEvent[\"item\"][\"kind\"]): SystemReminderScope => {\n if (kind === \"steer\" || kind === \"skill_delta\" || kind === \"runtime_notice\") {\n return \"next_model_call\";\n }\n if (kind === \"channel_context\" || kind === \"attachment\" || kind === \"date_change\") {\n return \"turn\";\n }\n return \"session\";\n};\n\nconst cloneMessage = (message: ScorelMessage): ScorelMessage => ({\n ...message,\n content: message.content.map((block) => {\n if (block.type === \"system_reminder\") {\n return cloneSystemReminderBlock(block);\n }\n if (block.type !== \"tool_result\" || !isRecord(block.result)) {\n return { ...block };\n }\n const content = Array.isArray(block.result.content)\n ? { content: block.result.content.map((item) => (isRecord(item) ? { ...item } : item)) }\n : {};\n return {\n ...block,\n result: {\n content: content.content ?? [],\n },\n };\n }),\n ...(message.meta ? { meta: { ...message.meta } } : {}),\n});\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n", "import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\n\nimport { Type } from \"@mariozechner/pi-ai\";\n\nimport type { SkillIndexEntry } from \"@scorel/protocol\";\n\nimport { defineTool, type AgentTool } from \"../tools/index.js\";\n\nexport type ScanSkillIndexOptions = {\n cwd: string;\n homeDir?: string;\n extensionSkillRoots?: Array<{ path: string; extensionId: string }>;\n};\n\nexport type SkillIndexDelta = {\n added: SkillIndexEntry[];\n changed: SkillIndexEntry[];\n removed: { name: string; previousPath: string }[];\n};\n\nexport type CreateSkillToolOptions = {\n getEntry: (name: string) => SkillIndexEntry | undefined;\n listNames: () => string[];\n};\n\nexport const scanSkillIndex = async (options: ScanSkillIndexOptions): Promise<SkillIndexEntry[]> => {\n const cwd = resolve(options.cwd);\n const homeDir = resolve(options.homeDir ?? homedir());\n const roots = [\n ...projectSkillRoots(cwd, homeDir),\n { path: join(homeDir, \".scorel\", \"skills\"), scope: \"user\" as const, priority: 0 },\n ...(options.extensionSkillRoots ?? []).map((root, index) => ({\n path: root.path,\n scope: \"extension\" as const,\n priority: -100 - index,\n })),\n ];\n const byName = new Map<string, SkillIndexEntry>();\n\n for (const root of roots) {\n let children: string[];\n try {\n children = await readdir(root.path);\n } catch (cause) {\n if (isNodeErrorCode(cause, \"ENOENT\") || isNodeErrorCode(cause, \"ENOTDIR\")) {\n continue;\n }\n throw cause;\n }\n for (const child of children.sort()) {\n const entry = await readSkillEntry({\n name: child,\n skillPath: join(root.path, child, \"SKILL.md\"),\n scope: root.scope,\n priority: root.priority,\n });\n if (!entry || byName.has(entry.name)) {\n continue;\n }\n byName.set(entry.name, entry);\n }\n }\n\n return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name));\n};\n\nexport const diffSkillIndex = (\n previous: Record<string, SkillIndexEntry>,\n nextEntries: SkillIndexEntry[],\n): SkillIndexDelta => {\n const next = Object.fromEntries(nextEntries.map((entry) => [entry.name, entry]));\n const added: SkillIndexEntry[] = [];\n const changed: SkillIndexEntry[] = [];\n const removed: { name: string; previousPath: string }[] = [];\n\n for (const entry of nextEntries) {\n const old = previous[entry.name];\n if (!old) {\n added.push(entry);\n } else if (\n old.path !== entry.path ||\n old.contentHash !== entry.contentHash ||\n old.mtimeMs !== entry.mtimeMs ||\n old.size !== entry.size\n ) {\n changed.push(entry);\n }\n }\n for (const old of Object.values(previous)) {\n if (!next[old.name]) {\n removed.push({ name: old.name, previousPath: old.path });\n }\n }\n\n return { added, changed, removed };\n};\n\nexport const hasSkillIndexDelta = (delta: SkillIndexDelta): boolean =>\n delta.added.length > 0 || delta.changed.length > 0 || delta.removed.length > 0;\n\nexport const renderSkillListing = (entries: SkillIndexEntry[]): string => {\n if (entries.length === 0) {\n return \"No skills are currently available for the Skill tool.\";\n }\n return [\n \"The following skills are available for use with the Skill tool:\",\n \"\",\n ...entries.map((entry) => `- ${entry.name}: ${entry.description}`),\n ].join(\"\\n\");\n};\n\nexport const renderSkillDelta = (delta: SkillIndexDelta): string => {\n const lines = [\"Skill updates detected:\"];\n if (delta.added.length > 0) {\n lines.push(\"\", \"Added:\", ...delta.added.map((entry) => `- ${entry.name}: ${entry.description}`));\n }\n if (delta.changed.length > 0) {\n lines.push(\"\", \"Changed:\", ...delta.changed.map((entry) => `- ${entry.name}: ${entry.description}`));\n }\n if (delta.removed.length > 0) {\n lines.push(\"\", \"Removed:\", ...delta.removed.map((entry) => `- ${entry.name}`));\n }\n return lines.join(\"\\n\");\n};\n\nexport const createSkillTool = (options: CreateSkillToolOptions): AgentTool =>\n defineTool({\n name: \"Skill\",\n description: \"Load the full SKILL.md instructions for an available session-indexed skill by name.\",\n parameters: Type.Object({\n name: Type.String(),\n args: Type.Optional(Type.String()),\n }),\n execute: async (_toolCallId, args) => {\n const input = parseSkillArgs(args);\n const entry = options.getEntry(input.name);\n if (!entry) {\n throw new Error(`Unknown skill: ${input.name}. Available skills: ${options.listNames().join(\", \") || \"none\"}`);\n }\n const content = await readFile(entry.path, \"utf8\");\n return {\n content: [{ type: \"text\", text: content }],\n details: {\n skill: {\n name: entry.name,\n path: entry.path,\n scope: entry.scope,\n args: input.args,\n },\n },\n };\n },\n });\n\nconst projectSkillRoots = (cwd: string, homeDir: string): Array<{ path: string; scope: \"project\"; priority: number }> => {\n const roots: string[] = [];\n const gitRoot = findGitRoot(cwd);\n const stopAt = gitRoot ?? homeDir;\n let current = cwd;\n\n while (true) {\n if (current !== homeDir) {\n roots.push(join(current, \".scorel\", \"skills\"));\n }\n if (current === stopAt || current === dirname(current)) {\n break;\n }\n const next = dirname(current);\n if (!gitRoot && next === homeDir) {\n break;\n }\n current = next;\n }\n\n return roots.map((path, index) => ({ path, scope: \"project\", priority: 100 + index }));\n};\n\nconst readSkillEntry = async (options: {\n name: string;\n skillPath: string;\n scope: \"user\" | \"project\" | \"extension\";\n priority: number;\n}): Promise<SkillIndexEntry | undefined> => {\n let fileStat;\n let content: string;\n try {\n [fileStat, content] = await Promise.all([stat(options.skillPath), readFile(options.skillPath, \"utf8\")]);\n } catch (cause) {\n if (isNodeErrorCode(cause, \"ENOENT\") || isNodeErrorCode(cause, \"ENOTDIR\")) {\n return undefined;\n }\n throw cause;\n }\n const parsed = parseSkillMetadata(content);\n const description = parsed.description ?? firstParagraph(content);\n if (!description) {\n return undefined;\n }\n return {\n name: options.name,\n path: options.skillPath,\n scope: options.scope,\n description,\n ...(parsed.displayName ? { displayName: parsed.displayName } : {}),\n mtimeMs: fileStat.mtimeMs,\n size: fileStat.size,\n contentHash: createHash(\"sha256\").update(content).digest(\"hex\"),\n priority: options.priority,\n };\n};\n\nconst parseSkillMetadata = (content: string): { displayName?: string; description?: string } => {\n if (!content.startsWith(\"---\\n\")) {\n return {};\n }\n const end = content.indexOf(\"\\n---\", 4);\n if (end < 0) {\n return {};\n }\n const frontmatter = content.slice(4, end).split(/\\r?\\n/);\n const metadata: { displayName?: string; description?: string } = {};\n for (const line of frontmatter) {\n const match = /^([A-Za-z_][A-Za-z0-9_-]*):\\s*(.*)$/.exec(line);\n if (!match) {\n continue;\n }\n const value = match[2]?.replace(/^[\"']|[\"']$/g, \"\").trim();\n if (!value) {\n continue;\n }\n if (match[1] === \"name\") {\n metadata.displayName = value;\n } else if (match[1] === \"description\") {\n metadata.description = value;\n }\n }\n return metadata;\n};\n\nconst firstParagraph = (content: string): string | undefined => {\n const frontmatterEnd = content.startsWith(\"---\\n\") ? content.indexOf(\"\\n---\", 4) : -1;\n const body = frontmatterEnd >= 0 ? content.slice(frontmatterEnd + 4) : content;\n return body\n .split(/\\n\\s*\\n/)\n .map((part) => part.trim().replace(/^#\\s+.+\\n?/, \"\").trim())\n .find((part) => part.length > 0);\n};\n\nconst parseSkillArgs = (args: unknown): { name: string; args?: string } => {\n if (typeof args !== \"object\" || args === null || Array.isArray(args)) {\n throw new Error(\"Skill args must be an object\");\n }\n const input = args as { name?: unknown; args?: unknown };\n if (typeof input.name !== \"string\" || input.name.length === 0) {\n throw new Error(\"Skill name must be a non-empty string\");\n }\n return {\n name: input.name,\n ...(typeof input.args === \"string\" ? { args: input.args } : {}),\n };\n};\n\nconst findGitRoot = (cwd: string): string | undefined => {\n let current = cwd;\n while (true) {\n if (existsSync(join(current, \".git\"))) {\n return current;\n }\n const next = dirname(current);\n if (next === current) {\n return undefined;\n }\n current = next;\n }\n};\n\nconst isNodeErrorCode = (cause: unknown, code: string): boolean =>\n cause instanceof Error && \"code\" in cause && cause.code === code;\n", "import { protocolPackageName, protocolVersion, type ScorelEvent } from \"@scorel/protocol\";\n\nexport const corePackageName = \"@scorel/core\" as const;\nexport const coreProtocolDependency = protocolPackageName;\nexport const coreProtocolVersion = protocolVersion;\nexport type CoreScorelEvent = ScorelEvent;\n\nexport * from \"./config/index.js\";\nexport * from \"./channel/index.js\";\nexport * from \"./extensions/index.js\";\nexport * from \"./instructions/index.js\";\nexport * from \"./memory/index.js\";\nexport * from \"./provider/pi-ai.js\";\nexport * from \"./reminders/index.js\";\nexport * from \"./runtime/index.js\";\nexport * from \"./session/index.js\";\nexport * from \"./skills/index.js\";\nexport * from \"./tools/index.js\";\n", "import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { asDeviceId, type ClientId, type DeviceId } from \"@scorel/protocol\";\n\nexport type HostDeviceIdentity = {\n version: 1;\n deviceId: DeviceId;\n displayName: string;\n};\n\nexport type HostRelayAuthFile = {\n version: 1;\n clients: Array<{\n clientId: ClientId;\n createdAt: number;\n label?: string;\n }>;\n};\n\nexport const hostDeviceIdentityPath = (stateDir: string): string => join(stateDir, \"device.json\");\n\nexport const hostRelayAuthPath = (stateDir: string): string => join(stateDir, \"relay-auth.json\");\n\nexport const loadOrCreateHostDeviceIdentity = async (\n options: { stateDir: string; displayName?: string; now?: () => number },\n): Promise<HostDeviceIdentity> => {\n const existing = await readHostDeviceIdentity(options.stateDir);\n if (existing) {\n return existing;\n }\n const identity: HostDeviceIdentity = {\n version: 1,\n deviceId: asDeviceId(`device_${randomUUID()}`),\n displayName: options.displayName ?? \"Local daemon\",\n };\n await mkdir(options.stateDir, { recursive: true });\n await writeFile(hostDeviceIdentityPath(options.stateDir), `${JSON.stringify(identity, null, 2)}\\n`);\n return identity;\n};\n\nexport const readHostDeviceIdentity = async (stateDir: string): Promise<HostDeviceIdentity | null> => {\n try {\n const raw = JSON.parse(await readFile(hostDeviceIdentityPath(stateDir), \"utf8\")) as Partial<HostDeviceIdentity>;\n if (raw.version !== 1 || typeof raw.deviceId !== \"string\" || typeof raw.displayName !== \"string\") {\n return null;\n }\n return {\n version: 1,\n deviceId: asDeviceId(raw.deviceId),\n displayName: raw.displayName,\n };\n } catch (cause) {\n if (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") {\n return null;\n }\n throw cause;\n }\n};\n\nexport const readHostRelayAuth = async (stateDir: string): Promise<HostRelayAuthFile> => {\n try {\n const raw = JSON.parse(await readFile(hostRelayAuthPath(stateDir), \"utf8\")) as Partial<HostRelayAuthFile>;\n if (raw.version !== 1 || !Array.isArray(raw.clients)) {\n return emptyAuthFile();\n }\n return {\n version: 1,\n clients: raw.clients.filter((client): client is HostRelayAuthFile[\"clients\"][number] => typeof client.clientId === \"string\" && typeof client.createdAt === \"number\"),\n };\n } catch (cause) {\n if (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") {\n return emptyAuthFile();\n }\n throw cause;\n }\n};\n\nexport const authorizeRelayClient = async (\n options: { stateDir: string; clientId: ClientId; label?: string; now?: () => number },\n): Promise<HostRelayAuthFile> => {\n const auth = await readHostRelayAuth(options.stateDir);\n const existing = auth.clients.find((client) => client.clientId === options.clientId);\n if (existing) {\n return auth;\n }\n auth.clients.push({\n clientId: options.clientId,\n createdAt: (options.now ?? Date.now)(),\n label: options.label,\n });\n await mkdir(options.stateDir, { recursive: true });\n await writeFile(hostRelayAuthPath(options.stateDir), `${JSON.stringify(auth, null, 2)}\\n`);\n return auth;\n};\n\nexport const isRelayClientAuthorized = async (\n options: { stateDir: string; clientId: ClientId },\n): Promise<boolean> => {\n const auth = await readHostRelayAuth(options.stateDir);\n return auth.clients.some((client) => client.clientId === options.clientId);\n};\n\nconst emptyAuthFile = (): HostRelayAuthFile => ({\n version: 1,\n clients: [],\n});\n", "import WebSocket from \"ws\";\n\nimport { asRequestId, type ClientId, type DeviceId, type RelayResponse } from \"@scorel/protocol\";\n\nimport { authorizeRelayClient } from \"./auth.js\";\n\nexport type RedeemRelayPairOptions = {\n relayUrl: string;\n pairCode: string;\n deviceId: DeviceId;\n stateDir: string;\n label?: string;\n createWebSocket?: (url: string) => WebSocket;\n};\n\nexport type RedeemRelayPairResult = {\n clientId: ClientId;\n};\n\nexport const redeemRelayPair = async (options: RedeemRelayPairOptions): Promise<RedeemRelayPairResult> => {\n const socket = options.createWebSocket?.(options.relayUrl) ?? new WebSocket(options.relayUrl);\n try {\n await waitForOpen(socket);\n socket.send(JSON.stringify({\n type: \"host_hello\",\n deviceId: options.deviceId,\n label: options.label,\n }));\n socket.send(JSON.stringify({\n type: \"redeem_pair\",\n requestId: asRequestId(\"relay_pair\"),\n pairCode: options.pairCode,\n deviceId: options.deviceId,\n }));\n const response = await waitForRelayResponse(socket);\n if (!response.ok) {\n throw new Error(`${response.code}: ${response.message}`);\n }\n if (!(\"clientId\" in response.data)) {\n throw new Error(\"relay pair response missing clientId\");\n }\n await authorizeRelayClient({\n stateDir: options.stateDir,\n clientId: response.data.clientId,\n });\n return { clientId: response.data.clientId };\n } finally {\n socket.close();\n }\n};\n\nconst waitForOpen = (socket: WebSocket): Promise<void> =>\n new Promise((resolve, reject) => {\n socket.once(\"open\", () => resolve());\n socket.once(\"error\", reject);\n });\n\nconst waitForRelayResponse = (socket: WebSocket): Promise<RelayResponse> =>\n new Promise((resolve, reject) => {\n socket.once(\"error\", reject);\n socket.on(\"message\", function handle(data) {\n const frame = JSON.parse(data.toString()) as RelayResponse | { type?: string };\n if (frame.type !== \"relay_response\" && frame.type !== \"relay_error\") {\n return;\n }\n socket.off(\"message\", handle);\n resolve(frame as RelayResponse);\n });\n });\n", "import WebSocket from \"ws\";\n\nimport {\n asSeq,\n type ClientId,\n type DaemonMessage,\n type DeviceId,\n type RelayClientPayload,\n type RelayHostFrame,\n type RelayServerFrame,\n} from \"@scorel/protocol\";\n\nimport type { ScorelHost } from \"../index.js\";\nimport { isRelayClientAuthorized } from \"./auth.js\";\n\ntype HostConnection = Parameters<ScorelHost[\"connect\"]>[0];\n\nexport type HostRelayClientOptions = {\n relayUrl: string;\n hostService: ScorelHost;\n deviceId: DeviceId;\n deviceDisplayName?: string;\n stateDir: string;\n createWebSocket?: (url: string) => WebSocket;\n isAuthorized?: (clientId: ClientId) => Promise<boolean>;\n reconnectDelayMs?: number;\n onDiagnostic?: (type: string, data?: Record<string, unknown>) => void;\n};\n\nexport type HostRelayClient = {\n close(): void;\n};\n\nexport const startHostRelayClient = async (options: HostRelayClientOptions): Promise<HostRelayClient> => {\n const client = new ReconnectingHostRelayClient(options);\n await client.start();\n return client;\n};\n\nclass ReconnectingHostRelayClient implements HostRelayClient {\n readonly #options: HostRelayClientOptions;\n #socket: WebSocket | undefined;\n #connections = new Map<ClientId, HostConnection>();\n #closed = false;\n #reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor(options: HostRelayClientOptions) {\n this.#options = options;\n }\n\n async start(): Promise<void> {\n await this.#connect();\n }\n\n close(): void {\n this.#closed = true;\n if (this.#reconnectTimer) {\n clearTimeout(this.#reconnectTimer);\n this.#reconnectTimer = undefined;\n }\n this.#disconnectHostConnections();\n this.#socket?.close();\n }\n\n async #connect(): Promise<void> {\n if (this.#closed) {\n return;\n }\n const socket = this.#options.createWebSocket?.(this.#options.relayUrl) ?? new WebSocket(this.#options.relayUrl);\n this.#socket = socket;\n await waitForOpen(socket);\n if (this.#closed) {\n socket.close();\n return;\n }\n sendHostFrame(socket, {\n type: \"host_hello\",\n deviceId: this.#options.deviceId,\n label: this.#options.deviceDisplayName,\n });\n this.#options.onDiagnostic?.(\"relay_host_connected\", { relayUrl: this.#options.relayUrl, deviceId: this.#options.deviceId });\n\n socket.on(\"message\", (data) => {\n void handleRelayFrame({\n frame: JSON.parse(data.toString()) as RelayServerFrame,\n socket,\n connections: this.#connections,\n options: this.#options,\n }).catch((cause) => {\n this.#options.onDiagnostic?.(\"relay_host_error\", {\n error: cause instanceof Error ? cause.message : String(cause),\n });\n });\n });\n socket.on(\"error\", (cause) => {\n this.#options.onDiagnostic?.(\"relay_host_error\", {\n error: cause instanceof Error ? cause.message : String(cause),\n });\n });\n\n socket.once(\"close\", () => {\n if (this.#socket === socket) {\n this.#socket = undefined;\n }\n this.#disconnectHostConnections();\n this.#options.onDiagnostic?.(\"relay_host_disconnected\", { relayUrl: this.#options.relayUrl, deviceId: this.#options.deviceId });\n this.#scheduleReconnect();\n });\n }\n\n #disconnectHostConnections(): void {\n for (const connection of this.#connections.values()) {\n this.#options.hostService.disconnect(connection);\n }\n this.#connections.clear();\n }\n\n #scheduleReconnect(): void {\n if (this.#closed || this.#reconnectTimer) {\n return;\n }\n const delayMs = this.#options.reconnectDelayMs ?? 1000;\n this.#options.onDiagnostic?.(\"relay_host_reconnecting\", {\n relayUrl: this.#options.relayUrl,\n deviceId: this.#options.deviceId,\n delayMs,\n });\n this.#reconnectTimer = setTimeout(() => {\n this.#reconnectTimer = undefined;\n void this.#connect().catch((cause) => {\n this.#options.onDiagnostic?.(\"relay_host_error\", {\n error: cause instanceof Error ? cause.message : String(cause),\n });\n this.#scheduleReconnect();\n });\n }, delayMs);\n }\n}\n\nconst handleRelayFrame = async (\n input: {\n frame: RelayServerFrame;\n socket: WebSocket;\n connections: Map<ClientId, HostConnection>;\n options: HostRelayClientOptions;\n },\n): Promise<void> => {\n if (input.frame.type !== \"relay_to_host\") {\n return;\n }\n const authorized = input.options.isAuthorized\n ? await input.options.isAuthorized(input.frame.clientId)\n : await isRelayClientAuthorized({ stateDir: input.options.stateDir, clientId: input.frame.clientId });\n if (!authorized) {\n sendHostFrame(input.socket, {\n type: \"host_to_entry\",\n clientId: input.frame.clientId,\n payload: relayAuthError(input.frame.payload),\n });\n input.options.onDiagnostic?.(\"relay_frame_rejected\", {\n clientId: input.frame.clientId,\n reason: \"unauthorized\",\n payloadType: input.frame.payload.type,\n });\n return;\n }\n\n const connection = connectionFor(input.connections, input.frame.clientId, input.socket);\n if (input.frame.payload.type === \"connect\") {\n const result = input.options.hostService.connect(connection, input.frame.payload.sessionId);\n sendHostFrame(input.socket, {\n type: \"host_to_entry\",\n clientId: input.frame.clientId,\n payload: {\n type: \"connected\",\n clientId: input.frame.clientId,\n sessionId: result.sessionId,\n currentSeq: result.currentSeq ?? asSeq(0),\n deviceId: result.deviceId,\n deviceDisplayName: result.deviceDisplayName,\n },\n });\n return;\n }\n\n await input.options.hostService.handleMessage(connection, input.frame.payload);\n};\n\nconst connectionFor = (\n connections: Map<ClientId, HostConnection>,\n clientId: ClientId,\n socket: WebSocket,\n): HostConnection => {\n const existing = connections.get(clientId);\n if (existing) {\n return existing;\n }\n const connection: HostConnection = {\n clientId,\n emit(message: DaemonMessage) {\n sendHostFrame(socket, {\n type: \"host_to_entry\",\n clientId,\n payload: message,\n });\n },\n };\n connections.set(clientId, connection);\n return connection;\n};\n\nconst relayAuthError = (payload: RelayClientPayload): DaemonMessage => ({\n type: \"error\",\n requestId: \"requestId\" in payload ? payload.requestId : undefined,\n ok: false,\n code: \"auth_failed\",\n message: \"relay client is not authorized by host\",\n});\n\nconst sendHostFrame = (socket: WebSocket, frame: RelayHostFrame): void => {\n if (socket.readyState === socket.OPEN) {\n socket.send(JSON.stringify(frame));\n }\n};\n\nconst waitForOpen = (socket: WebSocket): Promise<void> =>\n new Promise((resolve, reject) => {\n socket.once(\"open\", () => resolve());\n socket.once(\"error\", reject);\n });\n", "import { execFile } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { appendFile, mkdir, readFile, readdir, rename, rm, writeFile } from \"node:fs/promises\";\nimport { userInfo } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { promisify } from \"node:util\";\nimport { WebSocketServer, type WebSocket } from \"ws\";\n\nimport { listDirectories as browseDirectories } from \"./projects/directories.js\";\nimport { ProjectRegistry, ProjectRegistryError } from \"./projects/registry.js\";\nimport { listSessionSummaries } from \"./projects/sessions.js\";\n\nimport {\n ScorelRuntime,\n buildContext,\n buildInstructionSnapshot,\n buildMemoryContext,\n corePackageName,\n createAppendDailyTool,\n createCodingTools,\n createSendChannelMessageTool,\n createSkillTool,\n createSnipTool,\n createSystemReminderBlock,\n diffSkillIndex,\n createPiAiProvider,\n createSession,\n hasSkillIndexDelta,\n listAvailableModels,\n listProviderConnections,\n listProviderModels,\n loadScorelConfig,\n loadScorelConfigProfile,\n loadExtensionManifest,\n loadSession,\n renderMemoryConfig,\n renderRuntimeConfig,\n renderExtensionConfig,\n renderMemoryHarness,\n renderSkillDelta,\n renderSkillListing,\n renderSystemPrompt,\n renderModelProfileConfig,\n readMemoryDreamState,\n readSessionMemory,\n resolveModelSelection,\n resolvePiAiModel,\n scanSkillIndex,\n sessionArtifactsDirPath,\n sessionLogFilePath,\n snipUserMessageAlias,\n scorelSessionsDir,\n scorelMemoryPaths,\n writeMemoryDreamState,\n writeSessionMemory,\n type ExtensionManifest,\n type ScorelConfig,\n type ScorelConfigProfile,\n type JsonlSession,\n type RawRuntimeEvent,\n} from \"@scorel/core\";\nimport {\n asClientId,\n asDeviceId,\n asEventId,\n asRequestId,\n asSeq,\n asSessionId,\n protocolPackageName,\n protocolVersion,\n type ClientId,\n type ClientMessage,\n type ClientRequest,\n type ConnectParams,\n type ConnectResult,\n type CreateSessionMeta,\n type DaemonTransport,\n type DaemonMessage,\n type DeviceId,\n type EventId,\n type AvailableModelSummary,\n type HostProject,\n type PersistentEvent,\n type ProjectId,\n type QueueItem,\n type QueueName,\n type ScorelEvent,\n type SelectedModelSummary,\n type ProviderCatalogModelSummary,\n type ProviderConnectionSummary,\n type ProviderModelSummary,\n type Seq,\n type SessionId,\n type SessionMeta,\n type ScorelMessage,\n type TransientEvent,\n type Unsubscribe,\n type ClientRequestMap,\n type ChannelContext,\n type MemoryStatus,\n type ModelSelectionInput,\n type ExtensionSettings,\n type MemorySettings,\n type RuntimeSettings,\n} from \"@scorel/protocol\";\n\nexport const daemonPackageName = \"@scorel/daemon\" as const;\nexport const daemonCoreDependency = corePackageName;\nexport const daemonProtocolDependency = protocolPackageName;\nexport const daemonProtocolVersion = protocolVersion;\nconst SESSION_MEMORY_COMPACT_WAIT_MS = 5_000;\nconst AUTO_COMPACT_RETAINED_EVENTS = 8;\nconst execFileAsync = promisify(execFile);\nexport type ScorelHostTransport = DaemonTransport;\nexport { loadScorelConfig, loadScorelConfigProfile, scorelSessionsDir, type ScorelConfig };\nexport {\n authorizeRelayClient,\n hostDeviceIdentityPath,\n hostRelayAuthPath,\n isRelayClientAuthorized,\n loadOrCreateHostDeviceIdentity,\n readHostDeviceIdentity,\n readHostRelayAuth,\n type HostDeviceIdentity,\n type HostRelayAuthFile,\n} from \"./relay/auth.js\";\nexport { redeemRelayPair, type RedeemRelayPairOptions, type RedeemRelayPairResult } from \"./relay/pair.js\";\nexport { startHostRelayClient, type HostRelayClient, type HostRelayClientOptions } from \"./relay/host-client.js\";\n\n/**\n * On-disk shape of `~/.scorel/daemon.json` (S0043). The unix-socket era schema\n * (`socketPath` + `pid`-only) is removed; a single WS daemon owns the state\n * file across restarts. `token` persists so subsequent `serve` runs reuse it\n * without operator intervention; `stoppedAt` flips from `null` \u2192 epoch on\n * graceful shutdown so `daemonStateLiveness` can distinguish a clean stop\n * from a crashed/orphan pid.\n */\nexport type LocalDaemonState = {\n host: string;\n port: number;\n wsUrl: string;\n token: string;\n pid: number;\n startedAt: number;\n stoppedAt: number | null;\n};\n\nexport type LocalDaemonStateOptions = {\n stateDir: string;\n};\n\nexport type CreateLocalDaemonStateOptions = LocalDaemonStateOptions & LocalDaemonState;\n\nexport type DaemonStateLiveness = \"running\" | \"stopped\" | \"orphan\";\n\nexport type RemoteDaemonWebSocketConnection = {\n clientId?: ClientId;\n socket: WebSocket;\n send(message: DaemonMessage): void;\n};\n\nexport type RemoteDaemonWebSocketServerOptions = {\n host: string;\n port: number;\n token: string;\n onClientConnect?: (connection: RemoteDaemonWebSocketConnection, params: ConnectParams) => ConnectResult;\n onClientMessage: (connection: RemoteDaemonWebSocketConnection, message: ClientMessage) => DaemonMessage | void;\n};\n\nexport type RemoteDaemonWebSocketServer = {\n host: string;\n port: number;\n url: string;\n close(): Promise<void>;\n};\n\nconst localDaemonStateFile = (stateDir: string): string => join(stateDir, \"daemon.json\");\n\nexport const createLocalDaemonState = async (options: CreateLocalDaemonStateOptions): Promise<LocalDaemonState> => {\n const state: LocalDaemonState = {\n host: options.host,\n port: options.port,\n wsUrl: options.wsUrl,\n token: options.token,\n pid: options.pid,\n startedAt: options.startedAt,\n stoppedAt: options.stoppedAt,\n };\n await mkdir(options.stateDir, { recursive: true });\n await writeFile(localDaemonStateFile(options.stateDir), `${JSON.stringify(state, null, 2)}\\n`);\n return state;\n};\n\nexport const readLocalDaemonState = async (options: LocalDaemonStateOptions): Promise<LocalDaemonState | null> => {\n try {\n const raw = JSON.parse(await readFile(localDaemonStateFile(options.stateDir), \"utf8\")) as Partial<LocalDaemonState>;\n if (\n typeof raw.host !== \"string\" ||\n typeof raw.port !== \"number\" ||\n typeof raw.wsUrl !== \"string\" ||\n typeof raw.token !== \"string\" ||\n typeof raw.pid !== \"number\" ||\n typeof raw.startedAt !== \"number\" ||\n !(raw.stoppedAt === null || typeof raw.stoppedAt === \"number\")\n ) {\n return null;\n }\n return {\n host: raw.host,\n port: raw.port,\n wsUrl: raw.wsUrl,\n token: raw.token,\n pid: raw.pid,\n startedAt: raw.startedAt,\n stoppedAt: raw.stoppedAt,\n };\n } catch (cause) {\n if (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") {\n return null;\n }\n throw cause;\n }\n};\n\nexport const removeLocalDaemonState = async (options: LocalDaemonStateOptions): Promise<void> => {\n await rm(localDaemonStateFile(options.stateDir), { force: true });\n};\n\n/**\n * Partial in-place update used by `serve` graceful-shutdown to flip\n * `stoppedAt` from `null` to a timestamp without disturbing other fields.\n * Silently no-ops if the state file disappeared (e.g. operator ran `reset`\n * concurrently) \u2014 flipping `stoppedAt` is a best-effort marker.\n */\nexport const markDaemonStopped = async (\n options: LocalDaemonStateOptions & { stoppedAt: number },\n): Promise<void> => {\n const state = await readLocalDaemonState({ stateDir: options.stateDir });\n if (!state) {\n return;\n }\n await writeFile(\n localDaemonStateFile(options.stateDir),\n `${JSON.stringify({ ...state, stoppedAt: options.stoppedAt }, null, 2)}\\n`,\n );\n};\n\n/**\n * Classify a state file's owning process. The `pid` field is only meaningful\n * paired with `stoppedAt`: a dead pid + null `stoppedAt` is the orphan case\n * that `serve` is allowed to overwrite, while a dead pid + populated\n * `stoppedAt` is the normal \"previous run exited\" case.\n *\n * `process.kill(pid, 0)` on POSIX returns truthy for any process the caller\n * could signal \u2014 including unrelated processes that happen to have inherited\n * the pid after wraparound. The trade-off is documented in the spec; users\n * can always `scorel daemon reset` if they get a false-positive after a\n * reboot.\n */\nexport const daemonStateLiveness = (\n state: LocalDaemonState,\n options: { isPidAlive?: (pid: number) => boolean } = {},\n): DaemonStateLiveness => {\n const isAlive = options.isPidAlive ?? defaultIsPidAlive;\n const alive = isAlive(state.pid);\n if (alive && state.stoppedAt === null) {\n return \"running\";\n }\n if (!alive && state.stoppedAt === null) {\n return \"orphan\";\n }\n return \"stopped\";\n};\n\nconst defaultIsPidAlive = (pid: number): boolean => {\n try {\n process.kill(pid, 0);\n return true;\n } catch (cause) {\n if (cause instanceof Error && \"code\" in cause && cause.code === \"EPERM\") {\n // Pid exists but we can't signal it (different user). Treat as alive.\n return true;\n }\n return false;\n }\n};\n\nexport const startRemoteDaemonWebSocketServer = async (\n options: RemoteDaemonWebSocketServerOptions,\n): Promise<RemoteDaemonWebSocketServer> => {\n const server = new WebSocketServer({ host: options.host, port: options.port });\n server.on(\"connection\", (socket) => {\n const connection: RemoteDaemonWebSocketConnection = {\n socket,\n send(message) {\n if (socket.readyState === socket.OPEN) {\n socket.send(JSON.stringify(message));\n }\n },\n };\n\n socket.on(\"message\", (data) => {\n let message: ClientMessage | ({ type: \"connect\"; token: string } & ConnectParams);\n try {\n message = JSON.parse(data.toString()) as ClientMessage | ({ type: \"connect\"; token: string } & ConnectParams);\n } catch {\n connection.send({\n type: \"error\",\n ok: false,\n code: \"invalid_request\",\n message: \"invalid JSON message\",\n });\n return;\n }\n\n if (message.type === \"connect\") {\n if (message.token !== options.token) {\n connection.send({\n type: \"error\",\n ok: false,\n code: \"auth_failed\",\n message: \"invalid remote token\",\n });\n socket.close();\n return;\n }\n connection.clientId = message.clientId;\n const result: ConnectResult = options.onClientConnect?.(connection, message) ?? {\n clientId: message.clientId,\n sessionId: message.sessionId,\n currentSeq: message.streamLastSeq ?? message.lastSeq ?? asSeq(0),\n deviceId: asDeviceId(\"device_unknown\"),\n };\n connection.send({\n type: \"connected\",\n clientId: result.clientId,\n sessionId: result.sessionId,\n currentSeq: result.currentSeq,\n deviceId: result.deviceId,\n deviceDisplayName: result.deviceDisplayName,\n });\n return;\n }\n\n const response = options.onClientMessage(connection, message);\n if (response) {\n connection.send(response);\n }\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.once(\"listening\", () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n const address = server.address();\n if (!address || typeof address === \"string\") {\n await closeWebSocketServer(server);\n throw new Error(\"remote daemon WebSocket server did not expose a TCP address\");\n }\n const host = options.host === \"0.0.0.0\" ? \"127.0.0.1\" : options.host;\n return {\n host: options.host,\n port: address.port,\n url: `ws://${host}:${address.port}`,\n close: () => closeWebSocketServer(server),\n };\n};\n\nexport const startScorelHostWebSocketServer = async (\n options: { hostService: ScorelHost; host: string; port: number; token: string },\n): Promise<RemoteDaemonWebSocketServer> => {\n const connections = new WeakMap<RemoteDaemonWebSocketConnection, Connection>();\n const daemonConnectionFor = (webSocketConnection: RemoteDaemonWebSocketConnection, params?: ConnectParams): Connection => {\n const existing = connections.get(webSocketConnection);\n if (existing) {\n return existing;\n }\n const connection: Connection = {\n clientId: params?.clientId ?? asClientId(\"ws_unconnected\"),\n emit: (daemonMessage) => webSocketConnection.send(daemonMessage),\n };\n connections.set(webSocketConnection, connection);\n webSocketConnection.socket.once(\"close\", () => options.hostService.disconnect(connection));\n return connection;\n };\n\n return startRemoteDaemonWebSocketServer({\n host: options.host,\n port: options.port,\n token: options.token,\n onClientConnect: (webSocketConnection, params) => {\n const daemonConnection = daemonConnectionFor(webSocketConnection, params);\n daemonConnection.clientId = params.clientId;\n const result = options.hostService.connect(daemonConnection, params.sessionId);\n return {\n clientId: params.clientId,\n sessionId: result.sessionId,\n currentSeq: result.currentSeq,\n deviceId: result.deviceId,\n deviceDisplayName: result.deviceDisplayName,\n };\n },\n onClientMessage: (webSocketConnection, message) => {\n const daemonConnection = daemonConnectionFor(webSocketConnection);\n if (!daemonConnection.clientId) {\n return {\n type: \"error\",\n ok: false,\n code: \"invalid_request\",\n message: \"websocket is not connected\",\n };\n }\n void options.hostService.handleMessage(daemonConnection, message).catch((cause) => {\n webSocketConnection.send({\n type: \"error\",\n ok: false,\n code: \"internal_error\",\n message: cause instanceof Error ? cause.message : String(cause),\n });\n });\n return undefined;\n },\n });\n};\n\nconst closeWebSocketServer = (server: WebSocketServer): Promise<void> =>\n new Promise((resolve, reject) => {\n for (const client of server.clients) {\n client.close();\n }\n server.close((error) => (error ? reject(error) : resolve()));\n });\n\nexport type RuntimeFactoryOptions = {\n cwd: string;\n config: ScorelConfig;\n sessionsDir?: string;\n sessionId?: SessionId;\n modelSelection?: { modelId?: string; role?: \"primary\" | \"standard\" | \"auxiliary\" };\n includeTools?: boolean;\n rtkExecutable?: string;\n};\n\nexport type ScorelHostOptions = {\n sessionsDir: string;\n projectsPath: string;\n deviceId: DeviceId;\n deviceDisplayName?: string;\n scorelHomeDir?: string;\n builtinExtensionsDir?: string;\n modelProfile?: ScorelConfig;\n loadConfig?: (options: { project: HostProject }) => Promise<ScorelConfig>;\n loadConfigProfile?: (options: { project: HostProject }) => Promise<ScorelConfigProfile | ScorelConfig>;\n createRuntime: (options: { sessionId: SessionId; project: HostProject; selectedModel?: SelectedModelSummary; purpose: \"chat\" | \"title\" | \"memory\" }) => Promise<ScorelRuntime>;\n memoryHomeDir?: string;\n onSessionListChanged?: (change: { projectId: ProjectId; sessionId: SessionId }) => void;\n idleShutdownMs?: number;\n onIdleShutdown?: () => void;\n now?: () => number;\n createId?: () => string;\n};\n\nexport type ImIncomingMessage = {\n externalConversationId: string;\n text: string;\n conversationType?: string;\n senderDisplayName?: string;\n mentionedBot?: boolean;\n target?: ImTarget;\n data?: Record<string, unknown>;\n};\n\nexport type ImTarget = {\n externalConversationId: string;\n data?: Record<string, unknown>;\n};\n\nexport type ImOutgoingMessage = {\n text?: string;\n attachments?: Array<{\n type: \"image\" | \"file\";\n path?: string;\n url?: string;\n mimeType?: string;\n caption?: string;\n }>;\n};\n\nexport type ImAdapterContext = {\n onMessage(message: ImIncomingMessage): Promise<void>;\n logger: {\n info(message: string, data?: Record<string, unknown>): void;\n error(message: string, data?: Record<string, unknown>): void;\n };\n};\n\nexport type ImAdapter = {\n start(ctx: ImAdapterContext): Promise<void>;\n stop(): Promise<void>;\n sendMessage(target: ImTarget, message: ImOutgoingMessage): Promise<void>;\n setTyping?(target: ImTarget, typing: boolean): Promise<void>;\n getOutbox?(): ImOutgoingMessage[];\n};\n\nexport const createRealRuntime = async (options: RuntimeFactoryOptions): Promise<ScorelRuntime> => {\n const selection = resolveModelSelection(options.config, options.modelSelection);\n const model = resolvePiAiModel(selection.config);\n const rtkExecutable = options.rtkExecutable ?? (options.config.runtime.tokenSavingRtk ? (await detectRtk()).executable : undefined);\n const runtime = new ScorelRuntime({\n provider: createPiAiProvider({\n model,\n apiKey: selection.config.apiKey,\n }),\n });\n if (options.includeTools !== false) {\n for (const tool of createCodingTools({\n cwd: options.cwd,\n contextWindow: model.contextWindow,\n ...(options.sessionsDir && options.sessionId\n ? { toolResultArtifacts: { dir: sessionArtifactsDirPath(options.sessionsDir, options.sessionId) } }\n : {}),\n tokenSaving: {\n rtk: {\n enabled: options.config.runtime.tokenSavingRtk,\n executable: rtkExecutable,\n },\n },\n })) {\n runtime.registerTool(tool);\n }\n }\n return runtime;\n};\n\ntype SessionLane = {\n session: JsonlSession;\n project: HostProject;\n runtime: ScorelRuntime;\n selectedModel?: SelectedModelSummary;\n queue: Promise<unknown>;\n appendQueue: Promise<void>;\n followUpWaiters: Map<string, { connection: Connection; request: ClientRequest<\"send_message\"> }>;\n channelContext?: RuntimeChannelContext;\n snipClientId?: ClientId;\n};\n\ntype RuntimeChannelContext = ChannelContext & {\n extensionId: string;\n target: ImTarget;\n};\n\ntype LoadedImExtension = {\n manifest: ExtensionManifest;\n adapter: ImAdapter;\n skillRoots: string[];\n};\n\ntype ImSessionBinding = {\n extensionId: string;\n externalConversationId: string;\n projectId: ProjectId;\n sessionId: SessionId;\n createdAt: number;\n updatedAt: number;\n};\n\ntype MemoryDreamSchedule = {\n timer?: ReturnType<typeof setTimeout>;\n running: boolean;\n sessionId: SessionId;\n clientId: ClientId;\n lastActivityAt: number;\n};\n\ntype AfterUserMessageHook = (input: {\n lane: SessionLane;\n clientId: ClientId;\n userEvent: Extract<PersistentEvent, { type: \"user_message\" }>;\n}) => Promise<void>;\n\ntype PersistentEventInput =\n | Omit<Extract<PersistentEvent, { type: \"user_message\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"assistant_message\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"tool_result\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"session_title_updated\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"instruction_snapshot\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"harness_item\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"compact\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"context_control\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"queue_update\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"skill_index_snapshot\" }>, \"seq\">\n | Omit<Extract<PersistentEvent, { type: \"skill_index_delta\" }>, \"seq\">;\n\ntype TransientEventInput =\n | Omit<Extract<TransientEvent, { type: \"turn_start\" }>, \"seq\">\n | Omit<Extract<TransientEvent, { type: \"turn_end\" }>, \"seq\">\n | Omit<Extract<TransientEvent, { type: \"message_start\" }>, \"seq\">\n | Omit<Extract<TransientEvent, { type: \"text_delta\" }>, \"seq\">\n | Omit<Extract<TransientEvent, { type: \"thinking_delta\" }>, \"seq\">\n | Omit<Extract<TransientEvent, { type: \"error\" }>, \"seq\">;\n\ntype Connection = {\n clientId: ClientId;\n sessionId?: SessionId;\n emit: (message: DaemonMessage) => void;\n};\n\ntype RuntimeEventState = {\n parentId: EventId;\n assistantEventId: EventId;\n finalAssistantEventId: EventId;\n};\n\ntype ResyncEventsResult = ClientRequestMap[\"resync_events\"][\"response\"];\n\nexport class ScorelHost {\n readonly #sessionsDir: string;\n readonly #deviceId: DeviceId;\n readonly #deviceDisplayName: string | undefined;\n readonly #scorelHomeDir: string;\n readonly #userHomeDir: string;\n readonly #builtinExtensionsDir: string;\n readonly #modelProfile: ScorelConfig | undefined;\n readonly #loadConfig: ((options: { project: HostProject }) => Promise<ScorelConfig>) | undefined;\n readonly #loadConfigProfile: ((options: { project: HostProject }) => Promise<ScorelConfigProfile | ScorelConfig>) | undefined;\n readonly #createRuntime: ScorelHostOptions[\"createRuntime\"];\n readonly #memoryHomeDir: string | undefined;\n readonly #onSessionListChanged: ((change: { projectId: ProjectId; sessionId: SessionId }) => void) | undefined;\n readonly #idleShutdownMs: number | undefined;\n readonly #onIdleShutdown: (() => void) | undefined;\n readonly #now: () => number;\n readonly #createId: () => string;\n readonly #sessions = new Map<SessionId, SessionLane>();\n readonly #connections = new Set<Connection>();\n readonly #events = new Map<SessionId, ScorelEvent[]>();\n readonly #seqs = new Map<SessionId, number>();\n readonly #memoryDreams = new Map<ProjectId, MemoryDreamSchedule>();\n readonly #sessionMemoryUpdates = new Map<SessionId, Promise<void>>();\n readonly #imExtensions = new Map<string, LoadedImExtension>();\n readonly #imBindings = new Map<string, ImSessionBinding>();\n readonly #registry: ProjectRegistry;\n #runtimeStatsQueue: Promise<void> = Promise.resolve();\n #idleShutdownTimer: ReturnType<typeof setTimeout> | undefined;\n #lastActiveWorkAt: number;\n #started = false;\n\n constructor(options: ScorelHostOptions) {\n this.#sessionsDir = options.sessionsDir;\n this.#deviceId = options.deviceId;\n this.#deviceDisplayName = options.deviceDisplayName;\n this.#scorelHomeDir = resolve(options.scorelHomeDir ?? dirname(options.projectsPath));\n this.#userHomeDir = dirname(this.#scorelHomeDir);\n this.#builtinExtensionsDir = resolve(options.builtinExtensionsDir ?? defaultBuiltinExtensionsDir());\n this.#modelProfile = options.modelProfile;\n this.#loadConfig = options.loadConfig;\n this.#loadConfigProfile = options.loadConfigProfile;\n this.#createRuntime = options.createRuntime;\n this.#memoryHomeDir = options.memoryHomeDir;\n this.#onSessionListChanged = options.onSessionListChanged;\n this.#idleShutdownMs = options.idleShutdownMs;\n this.#onIdleShutdown = options.onIdleShutdown;\n this.#now = options.now ?? Date.now;\n this.#createId = options.createId ?? (() => crypto.randomUUID());\n this.#lastActiveWorkAt = this.#now();\n this.#registry = new ProjectRegistry({\n sessionsDir: this.#sessionsDir,\n projectsPath: options.projectsPath,\n createId: this.#createId,\n now: this.#now,\n });\n }\n\n async start(): Promise<void> {\n this.#started = true;\n await mkdir(this.#scorelHomeDir, { recursive: true });\n await this.#loadImBindings();\n await this.#startEnabledImExtensions();\n this.#scheduleIdleShutdownCheck();\n }\n\n async shutdown(): Promise<void> {\n this.#clearIdleShutdownTimer();\n for (const schedule of this.#memoryDreams.values()) {\n if (schedule.timer) {\n clearTimeout(schedule.timer);\n }\n }\n this.#memoryDreams.clear();\n await this.#stopImExtensions();\n this.#connections.clear();\n this.#started = false;\n }\n\n async refreshImExtensions(): Promise<void> {\n this.#assertStarted();\n await this.#stopImExtensions();\n await this.#startEnabledImExtensions();\n this.#scheduleIdleShutdownCheck();\n }\n\n connect(connection: Connection, sessionId?: SessionId): ConnectResult {\n this.#assertStarted();\n this.#clearIdleShutdownTimer();\n connection.sessionId = sessionId;\n this.#connections.add(connection);\n if (sessionId) {\n void this.#appendDiagnostic(sessionId, \"client_connected\", {\n clientId: connection.clientId,\n deviceId: this.#deviceId,\n deviceDisplayName: this.#deviceDisplayName,\n });\n }\n return {\n clientId: connection.clientId,\n sessionId,\n currentSeq: asSeq(sessionId ? (this.#seqs.get(sessionId) ?? 0) : 0),\n deviceId: this.#deviceId,\n deviceDisplayName: this.#deviceDisplayName,\n };\n }\n\n disconnect(connection: Connection): void {\n if (connection.sessionId) {\n void this.#appendDiagnostic(connection.sessionId, \"client_disconnected\", {\n clientId: connection.clientId,\n });\n }\n this.#connections.delete(connection);\n this.#scheduleIdleShutdownCheck();\n }\n\n releaseSessionEventBuffer(sessionId: SessionId): void {\n this.#events.delete(sessionId);\n }\n\n activityStatus(): { activeWork: boolean; lastActiveWorkAt: number } {\n const activeWork = this.#hasActiveWork();\n if (activeWork) {\n this.#lastActiveWorkAt = this.#now();\n }\n return { activeWork, lastActiveWorkAt: this.#lastActiveWorkAt };\n }\n\n async handleMessage(connection: Connection, message: ClientMessage): Promise<void> {\n this.#assertStarted();\n try {\n await this.#handleMessage(connection, message);\n } catch (cause) {\n if (\"requestId\" in message) {\n connection.emit({\n type: \"error\",\n requestId: message.requestId,\n ok: false,\n code: wireErrorCode(cause),\n message: cause instanceof Error ? cause.message : String(cause),\n });\n return;\n }\n throw cause;\n } finally {\n this.#scheduleIdleShutdownCheck();\n }\n }\n\n async listDirectories(path?: string) {\n const listing = await browseDirectories(path);\n await this.#appendHostDiagnostic(\"directory_listed\", { path: listing.path });\n return listing;\n }\n\n async registerProject(workDir: string): Promise<HostProject> {\n const project = await this.#registry.register(workDir);\n await this.#appendHostDiagnostic(\"project_registered\", {\n projectId: project.projectId,\n workDir: project.workDir,\n });\n return project;\n }\n\n async listProjects(): Promise<HostProject[]> {\n return this.#registry.list();\n }\n\n async removeProject(projectId: ProjectId): Promise<boolean> {\n const project = await this.#registry.require(projectId);\n const removed = await this.#registry.remove(projectId);\n await this.#appendHostDiagnostic(\"project_removed\", {\n projectId,\n workDir: project.workDir,\n });\n return removed;\n }\n\n async receiveImMessage(extensionId: string, message: ImIncomingMessage): Promise<SessionId> {\n this.#assertStarted();\n const extension = this.#imExtensions.get(extensionId);\n if (!extension) {\n throw new Error(`IM extension is not enabled: ${extensionId}`);\n }\n return this.#handleImMessage(extension, message);\n }\n\n loopbackOutbox(extensionId = \"loopback\"): ImOutgoingMessage[] {\n return this.#imExtensions.get(extensionId)?.adapter.getOutbox?.() ?? [];\n }\n\n async #handleMessage(connection: Connection, message: ClientMessage): Promise<void> {\n switch (message.type) {\n case \"create_session\":\n await this.#handleCreateSession(connection, message);\n break;\n case \"load_session\":\n await this.#handleLoadSession(connection, message);\n break;\n case \"send_message\":\n await this.#handleSendMessage(connection, message);\n break;\n case \"rewrite_queue\":\n await this.#handleRewriteQueue(connection, message);\n break;\n case \"resync_events\":\n this.#respond(connection, message, await this.#resyncEvents(message.sessionId, {\n persistentLastSeq: message.persistentLastSeq ?? message.fromSeq,\n streamLastSeq: message.streamLastSeq ?? message.fromSeq,\n }));\n break;\n case \"subscribe_events\":\n connection.sessionId = message.sessionId;\n this.#respond(connection, message, {\n currentSeq: asSeq(this.#seqs.get(message.sessionId) ?? 0),\n });\n break;\n case \"get_status\":\n this.#respond(connection, message, {\n running: false,\n activeClients: [...this.#connections].map((candidate) => candidate.clientId),\n sessionCount: this.#sessions.size,\n uptimeMs: 0,\n });\n break;\n case \"ping\":\n connection.emit({ type: \"pong\", requestId: message.requestId });\n break;\n case \"disconnect\":\n this.disconnect(connection);\n break;\n case \"list_sessions\": {\n const sessions = await listSessionSummaries(\n this.#sessionsDir,\n { projectId: message.projectId, limit: message.limit },\n this.#sessionSummaryOverrides(),\n );\n this.#respond(connection, message, { sessions });\n break;\n }\n case \"list_projects\": {\n this.#respond(connection, message, { projects: await this.listProjects() });\n break;\n }\n case \"list_models\": {\n this.#respond(connection, message, await this.#listModels(message.projectId));\n break;\n }\n case \"upsert_model_profile\": {\n this.#respond(connection, message, await this.#handleUpsertModelProfile(message));\n break;\n }\n case \"remove_model_provider\": {\n this.#respond(connection, message, await this.#handleRemoveModelProvider(message));\n break;\n }\n case \"fetch_provider_models\": {\n this.#respond(connection, message, { models: await this.#fetchProviderModels(message.projectId, message.providerId) });\n break;\n }\n case \"get_memory_settings\": {\n this.#respond(connection, message, { memory: await this.#memorySettings(message.projectId) });\n break;\n }\n case \"get_memory_status\": {\n this.#respond(connection, message, { status: await this.#memoryStatusForProject(message.projectId) });\n break;\n }\n case \"upsert_memory_settings\": {\n this.#respond(connection, message, { memory: await this.#handleUpsertMemorySettings(message) });\n break;\n }\n case \"get_runtime_settings\": {\n this.#respond(connection, message, { runtime: await this.#runtimeSettings(message.projectId) });\n break;\n }\n case \"upsert_runtime_settings\": {\n this.#respond(connection, message, { runtime: await this.#handleUpsertRuntimeSettings(message) });\n break;\n }\n case \"get_extension_settings\": {\n this.#respond(connection, message, { extension: await this.#extensionSettings(message.extensionId) });\n break;\n }\n case \"upsert_extension_settings\": {\n this.#respond(connection, message, { extension: await this.#handleUpsertExtensionSettings(message) });\n break;\n }\n case \"list_directories\": {\n this.#respond(connection, message, await this.listDirectories(message.path));\n break;\n }\n case \"register_project\": {\n this.#respond(connection, message, { project: await this.registerProject(message.workDir) });\n break;\n }\n case \"remove_project\": {\n this.#respond(connection, message, {\n projectId: message.projectId,\n removed: await this.removeProject(message.projectId),\n });\n break;\n }\n case \"cancel\":\n await this.#handleCancel(connection, message);\n break;\n }\n }\n\n #scheduleIdleShutdownCheck(): void {\n this.#clearIdleShutdownTimer();\n if (!this.#shouldIdleShutdown()) {\n return;\n }\n this.#idleShutdownTimer = setTimeout(() => {\n this.#idleShutdownTimer = undefined;\n if (this.#shouldIdleShutdown()) {\n this.#onIdleShutdown?.();\n }\n }, this.#idleShutdownMs);\n }\n\n #clearIdleShutdownTimer(): void {\n if (!this.#idleShutdownTimer) {\n return;\n }\n clearTimeout(this.#idleShutdownTimer);\n this.#idleShutdownTimer = undefined;\n }\n\n #shouldIdleShutdown(): boolean {\n return (\n this.#started &&\n this.#idleShutdownMs !== undefined &&\n this.#idleShutdownMs > 0 &&\n this.#connections.size === 0 &&\n this.#imExtensions.size === 0 &&\n !this.#hasActiveWork()\n );\n }\n\n #hasActiveWork(): boolean {\n for (const lane of this.#sessions.values()) {\n if (lane.runtime.running) {\n return true;\n }\n if (\n lane.session.tree.controlState.queues.follow_up.length > 0 ||\n lane.session.tree.controlState.queues.steer.length > 0\n ) {\n return true;\n }\n }\n return false;\n }\n\n async #handleCreateSession(connection: Connection, request: ClientRequest<\"create_session\">): Promise<void> {\n const sessionId = request.sessionId ?? asSessionId(`ses_${this.#createId()}`);\n const project = await this.#resolveProject(sessionId, request.meta.projectId);\n if (request.sessionId && (await this.#loadExistingLaneIfPresent(sessionId))) {\n if (this.#sessions.get(sessionId)?.project.projectId !== project.projectId) {\n throw new ProjectRegistryError(\"conflict\", `Session ${sessionId} belongs to another project`);\n }\n await this.#appendDiagnostic(sessionId, \"session_loaded\", { clientId: connection.clientId });\n this.#respond(connection, request, { sessionId });\n return;\n }\n let lane: SessionLane;\n let created = true;\n try {\n lane = await this.#createLane(sessionId, request.meta, project);\n } catch (cause) {\n if (!request.sessionId || !isNodeErrorCode(cause, \"EEXIST\")) {\n throw cause;\n }\n lane = await this.#getLane(sessionId);\n created = false;\n }\n this.#sessions.set(sessionId, lane);\n if (created) {\n this.#events.set(sessionId, []);\n this.#seqs.set(sessionId, 0);\n }\n await this.#appendDiagnostic(sessionId, created ? \"session_created\" : \"session_loaded\", {\n clientId: connection.clientId,\n projectId: lane.project.projectId,\n workDir: lane.project.workDir,\n model: request.meta.model,\n });\n if (created) {\n this.#onSessionListChanged?.({ projectId: lane.project.projectId, sessionId });\n }\n this.#respond(connection, request, { sessionId });\n }\n\n async #handleLoadSession(connection: Connection, request: ClientRequest<\"load_session\">): Promise<void> {\n try {\n const lane = this.#sessions.get(request.sessionId);\n const session = lane?.session ?? await loadSession({ sessionsDir: this.#sessionsDir, sessionId: request.sessionId });\n await this.#appendDiagnostic(request.sessionId, \"session_loaded\", { clientId: connection.clientId });\n connection.sessionId = request.sessionId;\n const persistentEvents = [...session.tree];\n const sessionEvents = this.#events.get(request.sessionId) ?? [];\n if (sessionEvents.length === 0 && persistentEvents.length > 0) {\n this.#events.set(request.sessionId, persistentEvents);\n }\n this.#seqs.set(request.sessionId, Number(session.currentSeq));\n this.#respond(connection, request, {\n sessionId: request.sessionId,\n activeLeafId: session.activeLeafId,\n currentSeq: session.currentSeq,\n events: persistentEvents,\n meta: session.header.meta,\n });\n } catch (cause) {\n connection.emit({\n type: \"error\",\n requestId: request.requestId,\n ok: false,\n code: \"session_not_found\",\n message: cause instanceof Error ? cause.message : String(cause),\n });\n }\n }\n\n async #handleSendMessage(connection: Connection, request: ClientRequest<\"send_message\">): Promise<void> {\n const lane = await this.#getLane(request.sessionId);\n if (lane.runtime.running) {\n const runningBehavior = request.options?.runningBehavior ?? \"follow_up\";\n if (runningBehavior === \"steer\") {\n await this.#enqueueSteer(lane, connection, request);\n return;\n }\n await this.#enqueueFollowUp(lane, connection, request);\n return;\n }\n\n lane.queue = lane.queue.then(async () => {\n await this.#drainFollowUps(lane);\n await this.#runUserTurn(lane, connection.clientId, {\n content: normalizeContent(request.content),\n parentId: request.options?.parentId,\n source: \"user\",\n modelSelection: request.options?.modelSelection,\n channelContext: request.options?.channelContext ? runtimeChannelContextFromWire(request.options.channelContext) : undefined,\n onComplete: (result) => this.#respond(connection, request, { ...result, status: \"completed\" }),\n });\n await this.#drainFollowUps(lane);\n });\n\n await lane.queue;\n }\n\n async #handleRewriteQueue(connection: Connection, request: ClientRequest<\"rewrite_queue\">): Promise<void> {\n const lane = await this.#getLane(request.sessionId);\n await this.#appendQueueRewrite(lane, request.queue, request.items, {\n clientId: connection.clientId,\n anchorEventId: lane.session.activeLeafId,\n });\n await this.#appendDiagnostic(request.sessionId, \"queue_rewritten\", {\n clientId: connection.clientId,\n queue: request.queue,\n queueSize: request.items.length,\n });\n this.#respond(connection, request, {\n sessionId: request.sessionId,\n queue: request.queue,\n items: request.items,\n });\n }\n\n async #runUserTurn(\n lane: SessionLane,\n clientId: ClientId,\n input: {\n content: ScorelMessage[\"content\"];\n parentId?: EventId | null;\n source: \"user\" | \"follow_up\";\n queueItemId?: string;\n modelSelection?: ModelSelectionInput;\n channelContext?: RuntimeChannelContext;\n onComplete?: (result: Required<Pick<ClientRequestMap[\"send_message\"][\"response\"], \"userEventId\" | \"assistantEventId\">>) => void;\n },\n ): Promise<ClientRequestMap[\"send_message\"][\"response\"]> {\n this.#lastActiveWorkAt = this.#now();\n const sessionId = lane.session.header.sessionId;\n await this.#selectChatRuntime(lane, input.modelSelection);\n await this.#appendDiagnostic(sessionId, \"send_message_started\", {\n clientId,\n activeLeafId: lane.session.activeLeafId,\n source: input.source,\n selectedModelId: lane.selectedModel?.modelId,\n });\n const instructionSnapshot = await this.#ensureInstructionSnapshot(lane, clientId);\n await this.#syncSkillIndex(lane, clientId);\n await this.#ensureMemoryHarness(lane, clientId);\n await this.#syncMemoryTools(lane, clientId);\n await this.#autoCompactIfNeeded(lane, clientId);\n this.#syncChannelTool(lane, input.channelContext);\n let parentId = input.parentId === undefined ? lane.session.activeLeafId : input.parentId;\n if (input.channelContext) {\n const channelHarness = await this.#appendChannelHarness(lane, clientId, input.channelContext, parentId);\n parentId = channelHarness.id;\n }\n const userEventId = asEventId(this.#createId());\n const userEvent = await this.#appendPersistent(lane, {\n type: \"user_message\",\n id: userEventId,\n parentId,\n sessionId,\n clientId,\n ts: this.#now(),\n message: {\n role: \"user\",\n content: [...input.content, snipUserMessageIdBlock(userEventId)],\n ...(input.source === \"follow_up\"\n ? { meta: { source: \"follow_up\", queueItemId: input.queueItemId } }\n : {}),\n },\n }) as Extract<PersistentEvent, { type: \"user_message\" }>;\n const runAfterUserMessageHooks = this.#scheduleAfterUserMessageHooks(lane, clientId, userEvent);\n void runAfterUserMessageHooks().catch((cause) => {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n void this.#appendDiagnostic(sessionId, \"after_user_message_hook_failed\", {\n clientId,\n message: error.message,\n stack: shortStack(error),\n });\n });\n const firstAssistantEventId = asEventId(this.#createId());\n const state: RuntimeEventState = {\n parentId: userEvent.id,\n assistantEventId: firstAssistantEventId,\n finalAssistantEventId: firstAssistantEventId,\n };\n\n lane.channelContext = input.channelContext;\n lane.snipClientId = clientId;\n try {\n for await (const rawEvent of lane.runtime.executeTurn(\n buildContext(lane.session.tree, userEvent.id),\n renderSystemPrompt(instructionSnapshot),\n {\n refreshContext: async () => {\n await this.#consumeSteer(lane, clientId, state);\n return buildContext(lane.session.tree, lane.session.activeLeafId ?? state.parentId);\n },\n },\n )) {\n await this.#handleRuntimeEvent(lane, clientId, state, rawEvent);\n }\n } finally {\n lane.channelContext = undefined;\n lane.snipClientId = undefined;\n lane.runtime.unregisterTool(\"SendChannelMessage\");\n }\n\n const result = { userEventId, assistantEventId: state.finalAssistantEventId };\n await this.#appendDiagnostic(sessionId, \"send_message_finished\", {\n clientId,\n userEventId,\n assistantEventId: state.finalAssistantEventId,\n source: input.source,\n });\n this.#scheduleSessionMemoryUpdate(lane, clientId);\n input.onComplete?.(result);\n return { ...result, status: \"completed\" };\n }\n\n #scheduleAfterUserMessageHooks(\n lane: SessionLane,\n clientId: ClientId,\n userEvent: Extract<PersistentEvent, { type: \"user_message\" }>,\n ): () => Promise<void> {\n const hooks: AfterUserMessageHook[] = [\n ({ lane: hookLane, clientId: hookClientId, userEvent: hookUserEvent }) =>\n this.#runSessionTitleHook(hookLane, hookClientId, hookUserEvent),\n ];\n return async () => {\n for (const hook of hooks) {\n await hook({ lane, clientId, userEvent });\n }\n };\n }\n\n async #runSessionTitleHook(\n lane: SessionLane,\n clientId: ClientId,\n userEvent: Extract<PersistentEvent, { type: \"user_message\" }>,\n ): Promise<void> {\n const sessionId = lane.session.header.sessionId;\n const generatedTitle = await this.#maybeGenerateSessionTitle(lane, clientId, userEvent).catch((cause) => {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n void this.#appendDiagnostic(sessionId, \"session_title_generation_failed\", {\n clientId,\n message: error.message,\n stack: shortStack(error),\n });\n return undefined;\n });\n if (generatedTitle) {\n await this.#appendPersistent(lane, {\n type: \"session_title_updated\",\n id: asEventId(this.#createId()),\n parentId: null,\n sessionId,\n clientId,\n ts: this.#now(),\n title: generatedTitle.title,\n source: \"model\",\n model: generatedTitle.model,\n derivedFrom: {\n eventId: userEvent.id,\n seq: userEvent.seq,\n },\n });\n await this.#appendDiagnostic(sessionId, \"session_title_generated\", {\n clientId,\n title: generatedTitle.title,\n modelId: generatedTitle.model.modelId,\n });\n }\n }\n\n async #maybeGenerateSessionTitle(\n lane: SessionLane,\n clientId: ClientId,\n userEvent: Extract<PersistentEvent, { type: \"user_message\" }>,\n ): Promise<{ title: string; model: SelectedModelSummary } | undefined> {\n if (lane.session.header.meta.title?.trim()) {\n return undefined;\n }\n const text = inputText(userEvent.message).trim();\n if (!text) {\n return undefined;\n }\n let userMessages = 0;\n for (const event of lane.session.tree) {\n if (event.type === \"session_title_updated\") {\n return undefined;\n }\n if (event.type === \"user_message\") {\n userMessages += 1;\n }\n }\n if (userMessages !== 1) {\n return undefined;\n }\n const selectedModel = await this.#selectedModelFromMeta(\n { projectId: lane.project.projectId, modelSelection: { role: \"auxiliary\" } },\n lane.project,\n );\n if (!selectedModel) {\n return undefined;\n }\n const runtime = await this.#createRuntime({ sessionId: lane.session.header.sessionId, project: lane.project, selectedModel, purpose: \"title\" });\n let rawTitle = \"\";\n for await (const rawEvent of runtime.executeTurn(\n [\n {\n role: \"user\",\n content: [{\n type: \"text\",\n text: [\n \"Write a session title for the following first user request.\",\n \"\",\n \"Rules:\",\n \"- Return only the title text.\",\n \"- Do not answer the request.\",\n \"- Do not mention yourself.\",\n \"- Use the same language as the request when obvious.\",\n \"- Prefer a short noun phrase or task label, 4 to 12 Chinese characters or 4 to 8 English words.\",\n \"- No quotes, punctuation, or trailing period.\",\n \"\",\n \"<user_request>\",\n text.slice(0, 4_000),\n \"</user_request>\",\n ].join(\"\\n\"),\n }],\n },\n ],\n [\n \"You generate concise chat session titles.\",\n \"You are not answering the user request.\",\n \"You only summarize the user's intent as a short title.\",\n \"If the request is in Chinese, output Chinese.\",\n \"Output plain text only.\",\n ].join(\"\\n\"),\n {},\n )) {\n if (rawEvent.type === \"text_delta\") {\n rawTitle += rawEvent.delta;\n } else if (rawEvent.type === \"message_end\") {\n rawTitle = assistantText(rawEvent.message) || rawTitle;\n } else if (rawEvent.type === \"error\") {\n throw rawEvent.error;\n }\n }\n const title = sanitizeSessionTitle(rawTitle);\n if (!title) {\n return undefined;\n }\n await this.#appendDiagnostic(lane.session.header.sessionId, \"session_title_model_used\", {\n clientId,\n modelId: selectedModel.modelId,\n role: selectedModel.role,\n });\n return { title, model: selectedModel };\n }\n\n async #enqueueFollowUp(\n lane: SessionLane,\n connection: Connection,\n request: ClientRequest<\"send_message\">,\n ): Promise<void> {\n const now = this.#now();\n const item: QueueItem = {\n id: this.#createId(),\n content: normalizeContent(request.content),\n createdAt: now,\n updatedAt: now,\n clientId: connection.clientId,\n ...(request.options?.channelContext || request.options?.modelSelection\n ? { data: { channelContext: request.options.channelContext, modelSelection: request.options.modelSelection } }\n : {}),\n };\n lane.followUpWaiters.set(item.id, { connection, request });\n await this.#appendQueueRewrite(lane, \"follow_up\", [...lane.session.tree.controlState.queues.follow_up, item], {\n clientId: connection.clientId,\n anchorEventId: lane.session.activeLeafId,\n });\n await this.#appendDiagnostic(lane.session.header.sessionId, \"follow_up_queued\", {\n clientId: connection.clientId,\n queueItemId: item.id,\n queueSize: lane.session.tree.controlState.queues.follow_up.length,\n });\n }\n\n async #enqueueSteer(\n lane: SessionLane,\n connection: Connection,\n request: ClientRequest<\"send_message\">,\n ): Promise<void> {\n const now = this.#now();\n const item: QueueItem = {\n id: this.#createId(),\n content: normalizeContent(request.content),\n createdAt: now,\n updatedAt: now,\n clientId: connection.clientId,\n ...(request.options?.channelContext ? { data: { channelContext: request.options.channelContext } } : {}),\n };\n await this.#appendQueueRewrite(lane, \"steer\", [...lane.session.tree.controlState.queues.steer, item], {\n clientId: connection.clientId,\n anchorEventId: lane.session.activeLeafId,\n });\n await this.#appendDiagnostic(lane.session.header.sessionId, \"steer_queued\", {\n clientId: connection.clientId,\n queueItemId: item.id,\n queueSize: lane.session.tree.controlState.queues.steer.length,\n });\n this.#respond(connection, request, {\n status: \"queued\",\n queue: \"steer\",\n queueItemId: item.id,\n });\n }\n\n async #drainFollowUps(lane: SessionLane): Promise<void> {\n while (lane.session.tree.controlState.queues.follow_up.length > 0) {\n const item = lane.session.tree.controlState.queues.follow_up[0]!;\n const remaining = lane.session.tree.controlState.queues.follow_up.slice(1);\n await this.#appendQueueRewrite(lane, \"follow_up\", remaining, {\n clientId: item.clientId,\n anchorEventId: lane.session.activeLeafId,\n });\n const waiter = lane.followUpWaiters.get(item.id);\n lane.followUpWaiters.delete(item.id);\n await this.#runUserTurn(lane, item.clientId, {\n content: item.content,\n parentId: lane.session.activeLeafId,\n source: \"follow_up\",\n queueItemId: item.id,\n modelSelection: parseQueuedModelSelection(item.data?.modelSelection),\n channelContext: parseQueuedChannelContext(item.data?.channelContext),\n onComplete: waiter\n ? (result) => this.#respond(waiter.connection, waiter.request, { ...result, status: \"completed\" })\n : undefined,\n });\n }\n }\n\n async #consumeSteer(lane: SessionLane, clientId: ClientId, state: RuntimeEventState): Promise<void> {\n const item = lane.session.tree.controlState.queues.steer[0];\n if (!item) {\n return;\n }\n await this.#appendQueueRewrite(lane, \"steer\", lane.session.tree.controlState.queues.steer.slice(1), {\n clientId,\n anchorEventId: state.parentId,\n });\n const content = item.content\n .filter((block): block is Extract<ScorelMessage[\"content\"][number], { type: \"text\" }> => block.type === \"text\")\n .map((block) => block.text)\n .join(\"\\n\");\n const harnessEvent = await this.#appendPersistent(lane, {\n type: \"harness_item\",\n id: asEventId(this.#createId()),\n parentId: state.parentId,\n sessionId: lane.session.header.sessionId,\n clientId: item.clientId,\n ts: this.#now(),\n item: {\n kind: \"steer\",\n origin: \"user\",\n content,\n visibility: \"display\",\n data: { queueItemId: item.id },\n },\n });\n state.parentId = harnessEvent.id;\n }\n\n async #appendQueueRewrite(\n lane: SessionLane,\n queue: QueueName,\n items: QueueItem[],\n options: { clientId: ClientId; anchorEventId: EventId | null },\n ): Promise<void> {\n await this.#appendPersistent(lane, {\n type: \"queue_update\",\n id: asEventId(this.#createId()),\n parentId: null,\n sessionId: lane.session.header.sessionId,\n clientId: options.clientId,\n ts: this.#now(),\n queue,\n operation: \"rewrite\",\n items,\n anchorEventId: options.anchorEventId,\n });\n }\n\n async #handleCancel(connection: Connection, request: ClientRequest<\"cancel\">): Promise<void> {\n try {\n const lane = await this.#getLane(request.sessionId);\n const cancelled = lane.runtime.running;\n lane.runtime.cancel();\n await this.#appendDiagnostic(request.sessionId, \"cancel_requested\", {\n clientId: connection.clientId,\n cancelled,\n });\n this.#respond(connection, request, {\n sessionId: request.sessionId,\n cancelled,\n });\n } catch (cause) {\n connection.emit({\n type: \"error\",\n requestId: request.requestId,\n ok: false,\n code: \"session_not_found\",\n message: cause instanceof Error ? cause.message : String(cause),\n });\n }\n }\n\n #sessionSummaryOverrides(): Map<string, { currentSeq?: number; updatedAt?: number }> {\n const overrides = new Map<string, { currentSeq?: number; updatedAt?: number }>();\n for (const [sessionId, currentSeq] of this.#seqs.entries()) {\n overrides.set(String(sessionId), { currentSeq });\n }\n return overrides;\n }\n\n async #handleRuntimeEvent(\n lane: SessionLane,\n clientId: ClientId,\n state: RuntimeEventState,\n rawEvent: RawRuntimeEvent,\n ): Promise<void> {\n switch (rawEvent.type) {\n case \"turn_start\":\n this.#broadcastTransient(lane.session.header.sessionId, {\n type: \"turn_start\",\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n turnIndex: 0,\n });\n break;\n case \"message_start\":\n this.#broadcastTransient(lane.session.header.sessionId, {\n type: \"message_start\",\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n eventId: state.assistantEventId,\n parentId: state.parentId,\n role: rawEvent.role,\n });\n break;\n case \"text_delta\":\n this.#broadcastTransient(lane.session.header.sessionId, {\n type: \"text_delta\",\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n eventId: state.assistantEventId,\n delta: rawEvent.delta,\n });\n break;\n case \"thinking_delta\":\n this.#broadcastTransient(lane.session.header.sessionId, {\n type: \"thinking_delta\",\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n eventId: state.assistantEventId,\n delta: rawEvent.delta,\n });\n break;\n case \"message_end\": {\n await this.#appendDiagnostic(lane.session.header.sessionId, \"assistant_result\", {\n clientId,\n stopReason: rawEvent.message.stopReason,\n thinkingBlocks: countContentBlocks(rawEvent.message, \"thinking\"),\n textBlocks: countContentBlocks(rawEvent.message, \"text\"),\n toolCalls: countContentBlocks(rawEvent.message, \"tool_call\"),\n inputTokens: rawEvent.message.usage?.inputTokens,\n outputTokens: rawEvent.message.usage?.outputTokens,\n totalTokens: rawEvent.message.usage?.totalTokens,\n });\n const appended = (\n await this.#appendPersistent(lane, {\n type: \"assistant_message\",\n id: state.assistantEventId,\n parentId: state.parentId,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n message: rawEvent.message,\n })\n ).id;\n state.parentId = appended;\n state.finalAssistantEventId = appended;\n state.assistantEventId = asEventId(this.#createId());\n break;\n }\n case \"tool_execution_start\":\n break;\n case \"tool_execution_end\": {\n const toolResultId = asEventId(this.#createId());\n await this.#appendPersistent(lane, {\n type: \"tool_result\",\n id: toolResultId,\n parentId: state.parentId,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n message: {\n role: \"tool_result\",\n content: [\n {\n type: \"tool_result\",\n toolCallId: rawEvent.toolCallId,\n toolName: rawEvent.toolName,\n result: rawEvent.result,\n isError: rawEvent.isError,\n },\n ],\n },\n });\n const rtkSavings = rtkSavingsFromToolResult(rawEvent.result);\n if (rtkSavings) {\n await this.#recordRtkSavings({\n projectId: lane.project.projectId,\n sessionId: lane.session.header.sessionId,\n savings: rtkSavings,\n }).catch((cause) =>\n this.#appendDiagnostic(lane.session.header.sessionId, \"runtime_stats_update_failed\", {\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n );\n }\n state.parentId = toolResultId;\n break;\n }\n case \"turn_end\":\n void this.#appendDiagnostic(lane.session.header.sessionId, \"runtime_turn_end\", {\n clientId,\n stopReason: rawEvent.stopReason,\n });\n this.#broadcastTransient(lane.session.header.sessionId, {\n type: \"turn_end\",\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n turnIndex: 0,\n stopReason: rawEvent.stopReason,\n });\n break;\n case \"error\":\n void this.#appendDiagnostic(lane.session.header.sessionId, \"runtime_error\", {\n clientId,\n message: rawEvent.error.message,\n stack: shortStack(rawEvent.error),\n });\n this.#broadcastTransient(lane.session.header.sessionId, {\n type: \"error\",\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n code: \"internal_error\",\n message: rawEvent.error.message,\n });\n break;\n }\n }\n\n async #appendPersistent(\n lane: SessionLane,\n event: PersistentEventInput,\n ): Promise<PersistentEvent> {\n let appended: PersistentEvent | undefined;\n const appendTask = lane.appendQueue.then(async () => {\n const withSeq = { ...event, seq: this.#nextSeq(lane.session.header.sessionId) } as PersistentEvent;\n await lane.session.append(withSeq);\n this.#recordAndBroadcast(lane.session.header.sessionId, withSeq);\n appended = withSeq;\n });\n lane.appendQueue = appendTask.catch(() => {});\n await appendTask;\n return appended!;\n }\n\n async #ensureInstructionSnapshot(lane: SessionLane, clientId: ClientId) {\n const existing = lane.session.tree.controlState.instructionSnapshot;\n if (existing) {\n return existing;\n }\n\n const snapshot = await buildInstructionSnapshot({\n cwd: lane.project.workDir,\n now: this.#now,\n });\n await this.#appendPersistent(lane, {\n type: \"instruction_snapshot\",\n id: asEventId(this.#createId()),\n parentId: null,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n snapshot,\n });\n await this.#appendDiagnostic(lane.session.header.sessionId, \"instruction_snapshot_created\", {\n clientId,\n sections: snapshot.sections.length,\n });\n return snapshot;\n }\n\n async #syncSkillIndex(lane: SessionLane, clientId: ClientId): Promise<void> {\n const entries = await scanSkillIndex({ cwd: lane.project.workDir, extensionSkillRoots: this.#extensionSkillRoots() });\n if (!lane.session.tree.controlState.skillIndexInitialized) {\n await this.#appendPersistent(lane, {\n type: \"skill_index_snapshot\",\n id: asEventId(this.#createId()),\n parentId: null,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n anchorEventId: lane.session.activeLeafId,\n entries,\n });\n await this.#appendSkillHarness(lane, clientId, \"skill_listing\", renderSkillListing(entries));\n return;\n }\n\n const delta = diffSkillIndex(lane.session.tree.controlState.skillIndex, entries);\n if (!hasSkillIndexDelta(delta)) {\n return;\n }\n await this.#appendPersistent(lane, {\n type: \"skill_index_delta\",\n id: asEventId(this.#createId()),\n parentId: null,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n anchorEventId: lane.session.activeLeafId,\n added: delta.added,\n changed: delta.changed,\n removed: delta.removed,\n });\n await this.#appendSkillHarness(lane, clientId, \"skill_delta\", renderSkillDelta(delta));\n }\n\n async #ensureMemoryHarness(lane: SessionLane, clientId: ClientId): Promise<void> {\n const memory = await this.#safeMemorySettingsForRuntime(lane, clientId);\n if (!memory.enabled) {\n return;\n }\n for (const event of lane.session.tree) {\n if (\n event.type === \"harness_item\" &&\n event.item.kind === \"memory\"\n ) {\n return;\n }\n }\n const context = await buildMemoryContext({\n projectId: lane.project.projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n });\n await this.#appendPersistent(lane, {\n type: \"harness_item\",\n id: asEventId(this.#createId()),\n parentId: lane.session.activeLeafId,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n item: {\n kind: \"memory\",\n origin: \"system\",\n content: renderMemoryHarness(context),\n visibility: \"hidden\",\n data: {\n date: context.paths.today,\n projectId: lane.project.projectId,\n },\n },\n });\n }\n\n async #syncMemoryTools(lane: SessionLane, clientId: ClientId): Promise<void> {\n const memory = await this.#safeMemorySettingsForRuntime(lane, clientId);\n if (!memory.enabled || !memory.daily) {\n lane.runtime.unregisterTool(\"AppendDaily\");\n return;\n }\n lane.runtime.registerTool(\n createAppendDailyTool({\n projectId: lane.project.projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n onAppend: async (result) => {\n if (result.entry) {\n await this.#markMemoryDreamDirty(lane, clientId, result.path);\n }\n try {\n await this.#appendDiagnostic(lane.session.header.sessionId, \"memory_daily_appended\", {\n clientId,\n path: result.path,\n date: result.date,\n skippedReason: result.skippedReason,\n });\n } catch {\n // Diagnostics are observability only; daily append and dream scheduling must survive log failures.\n }\n if (result.entry) {\n await this.#scheduleMemoryDream(lane, clientId);\n }\n },\n }),\n );\n }\n\n async #autoCompactIfNeeded(lane: SessionLane, clientId: ClientId): Promise<void> {\n const memory = await this.#safeMemorySettingsForRuntime(lane, clientId);\n if (memory.autoCompactThreshold <= 0) {\n return;\n }\n const leafId = lane.session.activeLeafId;\n if (!leafId) {\n return;\n }\n const leaf = lane.session.tree.get(leafId)?.event;\n if (leaf?.type === \"compact\") {\n return;\n }\n const context = buildContext(lane.session.tree, leafId);\n const tokensBefore = estimateScorelMessagesTokens(context);\n const contextWindow = lane.session.header.meta.selectedModel?.contextWindow ?? 200_000;\n const threshold = Math.floor(contextWindow * memory.autoCompactThreshold);\n if (tokensBefore < threshold) {\n return;\n }\n await this.#waitForSessionMemoryUpdate(lane.session.header.sessionId, SESSION_MEMORY_COMPACT_WAIT_MS);\n const sessionMemory = memory.sessionMemory ? await this.#readSessionMemory(lane) : \"\";\n const compactSource = sessionMemory ? \"session_memory\" : \"foreground_compact\";\n const compactSummary = sessionMemory || await this.#generateForegroundCompactSummary(lane).catch((cause) => {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n void this.#appendDiagnostic(lane.session.header.sessionId, \"foreground_compact_failed\", {\n clientId,\n message: error.message,\n stack: shortStack(error),\n });\n return \"\";\n });\n const summary = [\n compactSummary || this.#fallbackSessionMemorySummary(lane).summary,\n ].join(\"\\n\").trim();\n const compacted = await this.#appendPersistent(lane, {\n type: \"compact\",\n id: asEventId(this.#createId()),\n parentId: leafId,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n summary,\n compactedThrough: leafId,\n tokensBefore,\n tokensAfter: estimateTextTokens(summary),\n retainedEventCount: AUTO_COMPACT_RETAINED_EVENTS,\n });\n await this.#appendDiagnostic(lane.session.header.sessionId, \"auto_compacted\", {\n clientId,\n compactEventId: compacted.id,\n source: compactSource,\n tokensBefore,\n tokensAfter: \"tokensAfter\" in compacted ? compacted.tokensAfter : undefined,\n threshold,\n });\n }\n\n #scheduleSessionMemoryUpdate(lane: SessionLane, clientId: ClientId): void {\n const sessionId = lane.session.header.sessionId;\n const previous = this.#sessionMemoryUpdates.get(sessionId) ?? Promise.resolve();\n const task = previous.catch(() => undefined).then(() => this.#maintainSessionMemory(lane, clientId));\n this.#sessionMemoryUpdates.set(sessionId, task);\n void task.catch((cause) => {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n void this.#appendDiagnostic(sessionId, \"session_memory_update_failed\", {\n clientId,\n message: error.message,\n stack: shortStack(error),\n });\n }).finally(() => {\n if (this.#sessionMemoryUpdates.get(sessionId) === task) {\n this.#sessionMemoryUpdates.delete(sessionId);\n }\n });\n }\n\n async #waitForSessionMemoryUpdate(sessionId: SessionId, timeoutMs: number): Promise<void> {\n const update = this.#sessionMemoryUpdates.get(sessionId);\n if (!update) {\n return;\n }\n await Promise.race([\n update.catch(() => undefined),\n new Promise<void>((resolve) => setTimeout(resolve, timeoutMs)),\n ]);\n }\n\n async #readSessionMemory(lane: SessionLane): Promise<string> {\n return (await readSessionMemory({\n projectId: lane.project.projectId,\n sessionId: lane.session.header.sessionId,\n homeDir: this.#memoryHomeDir,\n })).trim();\n }\n\n async #maintainSessionMemory(lane: SessionLane, clientId: ClientId): Promise<void> {\n const memory = await this.#safeMemorySettingsForRuntime(lane, clientId);\n if (!memory.sessionMemory) {\n return;\n }\n const current = await this.#readSessionMemory(lane);\n const generated = await this.#generateSessionMemory(lane, current).catch(() => undefined);\n const fallback = this.#fallbackSessionMemorySummary(lane);\n const result = await writeSessionMemory({\n projectId: lane.project.projectId,\n sessionId: lane.session.header.sessionId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n summary: generated?.summary ?? fallback.summary,\n recentMessages: generated?.recentMessages ?? fallback.recentMessages,\n decisions: generated?.decisions ?? fallback.decisions,\n followUps: generated?.followUps ?? fallback.followUps,\n });\n await this.#appendDiagnostic(lane.session.header.sessionId, \"session_memory_updated\", {\n clientId,\n path: result.path,\n bytes: result.content.length,\n });\n }\n\n async #generateForegroundCompactSummary(lane: SessionLane): Promise<string> {\n const selectedModel = await this.#selectedModelFromMeta(\n { projectId: lane.project.projectId, modelSelection: { role: \"auxiliary\" } },\n lane.project,\n );\n if (!selectedModel) {\n return \"\";\n }\n const runtime = await this.#createRuntime({\n sessionId: lane.session.header.sessionId,\n project: lane.project,\n selectedModel,\n purpose: \"memory\",\n });\n const prompt = [\n \"Compact the Scorel session context for continuation.\",\n \"Return a dense markdown summary only. Do not mention these instructions.\",\n \"Preserve current task, user requirements, decisions, important files/functions, errors, commands, and next steps.\",\n \"\",\n \"<recent_events>\",\n this.#recentConversationLines(lane, 40).join(\"\\n\"),\n \"</recent_events>\",\n ].join(\"\\n\");\n let raw = \"\";\n for await (const rawEvent of runtime.executeTurn(\n [{ role: \"user\", content: [{ type: \"text\", text: prompt }] }],\n \"You compact session context. Output markdown only.\",\n {},\n )) {\n if (rawEvent.type === \"text_delta\") {\n raw += rawEvent.delta;\n } else if (rawEvent.type === \"message_end\") {\n raw = assistantText(rawEvent.message) || raw;\n } else if (rawEvent.type === \"error\") {\n throw rawEvent.error;\n }\n }\n return raw.trim();\n }\n\n async #generateSessionMemory(\n lane: SessionLane,\n current: string,\n ): Promise<{ summary?: string; recentMessages?: string[]; decisions?: string[]; followUps?: string[] } | undefined> {\n const selectedModel = await this.#selectedModelFromMeta(\n { projectId: lane.project.projectId, modelSelection: { role: \"auxiliary\" } },\n lane.project,\n );\n if (!selectedModel) {\n return undefined;\n }\n const runtime = await this.#createRuntime({\n sessionId: lane.session.header.sessionId,\n project: lane.project,\n selectedModel,\n purpose: \"memory\",\n });\n const prompt = [\n \"Update Scorel session memory for context management. Return strict JSON only.\",\n \"This is not long-term memory. It is a compact current-session summary used by future auto compact.\",\n \"Keys: summary string, recentMessages string[], decisions string[], followUps string[].\",\n \"Keep it dense, current, and useful after old conversation history is replaced.\",\n \"\",\n \"<current_session_memory>\",\n current.trim() || \"(empty)\",\n \"</current_session_memory>\",\n \"\",\n \"<recent_events>\",\n this.#recentConversationLines(lane, 24).join(\"\\n\"),\n \"</recent_events>\",\n ].join(\"\\n\");\n let raw = \"\";\n for await (const rawEvent of runtime.executeTurn(\n [{ role: \"user\", content: [{ type: \"text\", text: prompt }] }],\n \"You maintain session memory for context compaction. Output strict JSON only.\",\n {},\n )) {\n if (rawEvent.type === \"text_delta\") {\n raw += rawEvent.delta;\n } else if (rawEvent.type === \"message_end\") {\n raw = assistantText(rawEvent.message) || raw;\n } else if (rawEvent.type === \"error\") {\n throw rawEvent.error;\n }\n }\n return parseSessionMemoryJson(raw);\n }\n\n #fallbackSessionMemorySummary(lane: SessionLane): {\n summary: string;\n recentMessages: string[];\n decisions: string[];\n followUps: string[];\n } {\n const recentMessages = this.#recentConversationLines(lane, 12);\n return {\n summary: recentMessages.at(-1) ?? \"Session is active. Continue from the latest visible user request.\",\n recentMessages,\n decisions: [],\n followUps: [],\n };\n }\n\n #recentConversationLines(lane: SessionLane, limit: number): string[] {\n const events = [...lane.session.tree]\n .filter((event) => \"message\" in event || event.type === \"compact\")\n .slice(-limit);\n return events.map((event) => {\n if (event.type === \"compact\") {\n return `[compact] ${compactLine(event.summary, 500)}`;\n }\n return `[${event.message.role}] ${compactLine(messageText(event.message), 500)}`;\n });\n }\n\n async #appendChannelHarness(\n lane: SessionLane,\n clientId: ClientId,\n context: RuntimeChannelContext,\n parentId: EventId | null,\n ): Promise<Extract<PersistentEvent, { type: \"harness_item\" }>> {\n const lines = [\n \"This message came from an IM channel.\",\n \"\",\n `channel: ${context.channel}`,\n ...(context.conversationType ? [`conversation_type: ${context.conversationType}`] : []),\n ...(context.senderDisplayName ? [`sender_display_name: ${context.senderDisplayName}`] : []),\n ...(context.mentionedBot !== undefined ? [`mentioned_bot: ${context.mentionedBot}`] : []),\n \"\",\n \"Use SendChannelMessage to reply to the current conversation when needed.\",\n \"In IM, send a short acknowledgement before long work so the user does not think the bot is stuck.\",\n \"For longer tasks, send concise progress updates instead of waiting until every tool call has finished.\",\n \"Keep replies conversational and avoid exposing internal tool names unless they help the user.\",\n ];\n return this.#appendPersistent(lane, {\n type: \"harness_item\",\n id: asEventId(this.#createId()),\n parentId,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n item: {\n kind: \"channel_context\",\n origin: \"system\",\n content: lines.join(\"\\n\"),\n visibility: \"hidden\",\n data: {\n extensionId: context.extensionId,\n channel: context.channel,\n externalConversationId: context.externalConversationId,\n ...(context.conversationType ? { conversationType: context.conversationType } : {}),\n ...(context.mentionedBot !== undefined ? { mentionedBot: context.mentionedBot } : {}),\n },\n },\n }) as Promise<Extract<PersistentEvent, { type: \"harness_item\" }>>;\n }\n\n async #scheduleMemoryDream(lane: SessionLane, clientId: ClientId): Promise<void> {\n const memory = await this.#safeMemorySettingsForRuntime(lane, clientId);\n if (!memory.enabled || !memory.autoDream) {\n return;\n }\n const projectId = lane.project.projectId;\n const existing = this.#memoryDreams.get(projectId);\n if (existing?.timer) {\n clearTimeout(existing.timer);\n }\n const schedule: MemoryDreamSchedule = {\n running: existing?.running ?? false,\n sessionId: lane.session.header.sessionId,\n clientId,\n lastActivityAt: this.#now(),\n };\n const delayMs = Math.max(0, memory.dreamIdleMinutes) * 60 * 1000;\n const scheduledFor = this.#now() + delayMs;\n const currentState = await readMemoryDreamState({\n projectId: lane.project.projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n });\n await this.#writeMemoryDreamState(lane.project.projectId, {\n ...(currentState ?? {}),\n projectId: String(lane.project.projectId),\n dirty: true,\n running: schedule.running,\n sessionId: String(lane.session.header.sessionId),\n clientId: String(clientId),\n lastDailyAppendAt: currentState?.lastDailyAppendAt ?? schedule.lastActivityAt,\n scheduledFor,\n });\n schedule.timer = setTimeout(() => {\n void this.#runIdleMemoryDream(projectId).catch((cause) => {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n void this.#appendDiagnostic(schedule.sessionId, \"idle_memory_dream_failed\", {\n clientId: schedule.clientId,\n message: error.message,\n stack: shortStack(error),\n });\n });\n }, delayMs);\n schedule.timer.unref?.();\n this.#memoryDreams.set(projectId, schedule);\n await this.#appendDiagnostic(lane.session.header.sessionId, \"idle_memory_dream_scheduled\", {\n clientId,\n projectId,\n idleMinutes: memory.dreamIdleMinutes,\n });\n }\n\n async #markMemoryDreamDirty(lane: SessionLane, clientId: ClientId, dailyPath: string): Promise<void> {\n const current = await readMemoryDreamState({\n projectId: lane.project.projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n });\n await this.#writeMemoryDreamState(lane.project.projectId, {\n projectId: String(lane.project.projectId),\n dirty: true,\n running: current?.running ?? false,\n sessionId: String(lane.session.header.sessionId),\n clientId: String(clientId),\n lastDailyAppendAt: this.#now(),\n lastDailyPath: dailyPath,\n lastFailure: current?.lastFailure,\n lastSuccessAt: current?.lastSuccessAt,\n lastProjectMemoryUpdateAt: current?.lastProjectMemoryUpdateAt,\n lastRootMemoryUpdateAt: current?.lastRootMemoryUpdateAt,\n });\n }\n\n async #runIdleMemoryDream(projectId: ProjectId): Promise<void> {\n const schedule = this.#memoryDreams.get(projectId);\n if (!schedule || schedule.running) {\n return;\n }\n schedule.running = true;\n schedule.timer = undefined;\n this.#memoryDreams.set(projectId, schedule);\n const beforeRun = await readMemoryDreamState({\n projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n });\n await this.#writeMemoryDreamState(projectId, {\n ...(beforeRun ?? { projectId: String(projectId), dirty: true }),\n projectId: String(projectId),\n running: true,\n lastAttemptAt: this.#now(),\n });\n try {\n const lane = await this.#getLane(schedule.sessionId);\n const memory = await this.#safeMemorySettingsForRuntime(lane, schedule.clientId);\n if (!memory.enabled || !memory.autoDream) {\n await this.#writeMemoryDreamState(projectId, {\n ...(beforeRun ?? { projectId: String(projectId) }),\n projectId: String(projectId),\n dirty: false,\n running: false,\n lastFailure: { at: this.#now(), message: \"Memory dream disabled\" },\n });\n return;\n }\n const generated = await this.#generateMemoryUpdate(lane, memory);\n const paths = scorelMemoryPaths({\n projectId: lane.project.projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n });\n if (generated?.projectMemory?.trim()) {\n await writeFile(paths.projectMemoryPath, normalizeMarkdownFile(generated.projectMemory), \"utf8\");\n await this.#appendDiagnostic(lane.session.header.sessionId, \"project_memory_updated\", {\n clientId: schedule.clientId,\n path: paths.projectMemoryPath,\n });\n }\n if (memory.promoteRoot && generated?.rootMemory?.trim()) {\n await writeFile(paths.rootMemoryPath, normalizeMarkdownFile(generated.rootMemory), \"utf8\");\n await this.#appendDiagnostic(lane.session.header.sessionId, \"root_memory_updated\", {\n clientId: schedule.clientId,\n path: paths.rootMemoryPath,\n });\n }\n const now = this.#now();\n const latestState = await readMemoryDreamState({ projectId, homeDir: this.#memoryHomeDir, now: this.#now });\n const hasNewDailyDuringRun =\n latestState?.lastDailyAppendAt !== undefined &&\n beforeRun?.lastDailyAppendAt !== undefined &&\n latestState.lastDailyAppendAt > beforeRun.lastDailyAppendAt;\n await this.#writeMemoryDreamState(projectId, {\n ...(latestState ?? { projectId: String(projectId) }),\n projectId: String(projectId),\n dirty: hasNewDailyDuringRun,\n running: false,\n ...(hasNewDailyDuringRun ? {} : { scheduledFor: undefined }),\n lastSuccessAt: now,\n lastFailure: undefined,\n ...(generated?.projectMemory?.trim() ? { lastProjectMemoryUpdateAt: now } : {}),\n ...(memory.promoteRoot && generated?.rootMemory?.trim() ? { lastRootMemoryUpdateAt: now } : {}),\n });\n if (hasNewDailyDuringRun) {\n await this.#scheduleMemoryDream(lane, schedule.clientId);\n }\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n await this.#writeMemoryDreamState(projectId, {\n ...(await readMemoryDreamState({ projectId, homeDir: this.#memoryHomeDir, now: this.#now }) ?? { projectId: String(projectId) }),\n projectId: String(projectId),\n dirty: true,\n running: false,\n lastFailure: { at: this.#now(), message },\n });\n throw cause;\n } finally {\n this.#memoryDreams.delete(projectId);\n }\n }\n\n async #memoryStatusForProject(projectId: ProjectId): Promise<MemoryStatus> {\n const state = await readMemoryDreamState({\n projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n });\n await this.#recoverMemoryDream(projectId, state);\n const recovered = await readMemoryDreamState({\n projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n });\n return {\n projectId,\n dirty: recovered?.dirty ?? false,\n running: recovered?.running ?? false,\n ...(recovered?.lastDailyAppendAt !== undefined ? { lastDailyAppendAt: recovered.lastDailyAppendAt } : {}),\n ...(recovered?.lastDailyPath ? { lastDailyPath: recovered.lastDailyPath } : {}),\n ...(recovered?.scheduledFor !== undefined ? { scheduledFor: recovered.scheduledFor } : {}),\n ...(recovered?.lastAttemptAt !== undefined ? { lastAttemptAt: recovered.lastAttemptAt } : {}),\n ...(recovered?.lastSuccessAt !== undefined ? { lastSuccessAt: recovered.lastSuccessAt } : {}),\n ...(recovered?.lastFailure ? { lastFailure: recovered.lastFailure } : {}),\n ...(recovered?.lastProjectMemoryUpdateAt !== undefined ? { lastProjectMemoryUpdateAt: recovered.lastProjectMemoryUpdateAt } : {}),\n ...(recovered?.lastRootMemoryUpdateAt !== undefined ? { lastRootMemoryUpdateAt: recovered.lastRootMemoryUpdateAt } : {}),\n };\n }\n\n async #recoverMemoryDream(projectId: ProjectId, state: Awaited<ReturnType<typeof readMemoryDreamState>>): Promise<void> {\n if (!state?.dirty || this.#memoryDreams.has(projectId)) {\n return;\n }\n const lane = [...this.#sessions.values()].find((candidate) => candidate.project.projectId === projectId);\n if (!lane) {\n return;\n }\n const clientId = state.clientId ? asClientId(state.clientId) : asClientId(\"client_memory_recovery\");\n await this.#scheduleMemoryDream(lane, clientId);\n }\n\n async #writeMemoryDreamState(projectId: ProjectId, state: Parameters<typeof writeMemoryDreamState>[0][\"state\"]): Promise<void> {\n await writeMemoryDreamState({\n projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n state,\n });\n }\n\n async #generateMemoryUpdate(\n lane: SessionLane,\n memory: MemorySettings,\n ): Promise<{ projectMemory?: string; rootMemory?: string } | undefined> {\n const selectedModel = await this.#selectedModelFromMeta(\n { projectId: lane.project.projectId, modelSelection: { role: \"auxiliary\" } },\n lane.project,\n );\n if (!selectedModel) {\n return undefined;\n }\n const context = await buildMemoryContext({\n projectId: lane.project.projectId,\n homeDir: this.#memoryHomeDir,\n now: this.#now,\n });\n const runtime = await this.#createRuntime({\n sessionId: lane.session.header.sessionId,\n project: lane.project,\n selectedModel,\n purpose: \"memory\",\n });\n let raw = \"\";\n for await (const rawEvent of runtime.executeTurn(\n [{\n role: \"user\",\n content: [{\n type: \"text\",\n text: [\n \"Consolidate Scorel filesystem memory from recent project daily notes.\",\n \"Return only strict JSON with optional keys: projectMemory, rootMemory.\",\n \"projectMemory: full replacement markdown for Project MEMORY.md, only durable project preferences/decisions/workflows/open questions.\",\n memory.promoteRoot\n ? \"rootMemory: full replacement markdown for root MEMORY.md, only cross-project stable user preferences. Omit if no global preference.\"\n : \"Do not return rootMemory.\",\n \"Do not store secrets, transient tool noise, or code facts that can be read from the repo.\",\n \"Use daily notes as recent evidence, but only promote stable facts and decisions into memory.\",\n \"\",\n \"<root_memory>\",\n context.rootMemory,\n \"</root_memory>\",\n \"<project_memory>\",\n context.projectMemory,\n \"</project_memory>\",\n \"<recent_daily>\",\n context.yesterdayDaily,\n \"\",\n context.todayDaily,\n \"</recent_daily>\",\n ].join(\"\\n\"),\n }],\n }],\n \"You are Scorel's automatic memory dreamer. Output strict JSON only.\",\n {},\n )) {\n if (rawEvent.type === \"text_delta\") {\n raw += rawEvent.delta;\n } else if (rawEvent.type === \"message_end\") {\n raw = assistantText(rawEvent.message) || raw;\n } else if (rawEvent.type === \"error\") {\n throw rawEvent.error;\n }\n }\n return parseMemoryUpdate(raw);\n }\n\n async #appendSkillHarness(\n lane: SessionLane,\n clientId: ClientId,\n kind: \"skill_listing\" | \"skill_delta\",\n content: string,\n ): Promise<void> {\n await this.#appendPersistent(lane, {\n type: \"harness_item\",\n id: asEventId(this.#createId()),\n parentId: lane.session.activeLeafId,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n item: {\n kind,\n origin: \"system\",\n content,\n visibility: \"hidden\",\n },\n });\n }\n\n #broadcastTransient(sessionId: SessionId, event: TransientEventInput): TransientEvent {\n const withSeq = { ...event, seq: this.#nextSeq(sessionId) } as TransientEvent;\n this.#recordAndBroadcast(sessionId, withSeq);\n return withSeq;\n }\n\n #recordAndBroadcast(sessionId: SessionId, event: ScorelEvent): void {\n const events = this.#events.get(sessionId) ?? [];\n events.push(event);\n this.#events.set(sessionId, events);\n for (const connection of this.#connections) {\n if (connection.sessionId === sessionId) {\n connection.emit({ type: \"event\", event });\n }\n }\n }\n\n #nextSeq(sessionId: SessionId): Seq {\n const next = (this.#seqs.get(sessionId) ?? 0) + 1;\n this.#seqs.set(sessionId, next);\n return asSeq(next);\n }\n\n #eventsAfter(sessionId: SessionId, fromSeq: Seq | undefined): ScorelEvent[] {\n const from = Number(fromSeq ?? 0);\n return (this.#events.get(sessionId) ?? []).filter((event) => Number(event.seq) > from);\n }\n\n async #resyncEvents(\n sessionId: SessionId,\n anchors: { persistentLastSeq?: Seq; streamLastSeq?: Seq },\n ): Promise<ResyncEventsResult> {\n // Cold attach: a client connected to a session id we have not yet loaded\n // into memory (typical when WebUI opens a historical session that lives\n // only on disk). Load the lane so #seqs reflects the persisted tail\n // before deciding whether to short-circuit on stream_resume \u2014 otherwise\n // currentSeq stays at 0 and the early return strands the caller with an\n // empty event list.\n if (!this.#seqs.has(sessionId)) {\n try {\n await this.#getLane(sessionId);\n } catch {\n // Session id unknown to disk; fall through with currentSeq=0.\n }\n }\n const currentSeq = asSeq(this.#seqs.get(sessionId) ?? 0);\n const persistentLastSeq = anchors.persistentLastSeq ?? asSeq(0);\n const streamLastSeq = anchors.streamLastSeq ?? persistentLastSeq;\n\n if (Number(streamLastSeq) >= Number(currentSeq)) {\n const result: ResyncEventsResult = {\n events: [],\n throughSeq: currentSeq,\n mode: \"stream_resume\",\n };\n await this.#appendDiagnostic(sessionId, \"resync_events\", {\n mode: result.mode,\n persistentLastSeq,\n streamLastSeq,\n throughSeq: result.throughSeq,\n eventCount: result.events.length,\n });\n return result;\n }\n\n const buffered = this.#eventsAfter(sessionId, streamLastSeq);\n if (hasContinuousCoverage(buffered, Number(streamLastSeq) + 1)) {\n const result: ResyncEventsResult = {\n events: buffered,\n throughSeq: buffered.at(-1)?.seq ?? streamLastSeq,\n mode: \"stream_resume\",\n };\n await this.#appendDiagnostic(sessionId, \"resync_events\", {\n mode: result.mode,\n persistentLastSeq,\n streamLastSeq,\n throughSeq: result.throughSeq,\n eventCount: result.events.length,\n });\n return result;\n }\n\n const lane = await this.#getLane(sessionId);\n const events = [...lane.session.tree].filter((event) => Number(event.seq) > Number(persistentLastSeq));\n const throughSeq = events.at(-1)?.seq ?? persistentLastSeq;\n const mode: ResyncEventsResult[\"mode\"] =\n Number(persistentLastSeq) === 0 && Number(streamLastSeq) === 0 ? \"full_reload\" : \"persistent_fallback\";\n const result: ResyncEventsResult = {\n events,\n throughSeq,\n mode,\n gapFromSeq: asSeq(Number(streamLastSeq) + 1),\n gapToSeq: currentSeq,\n };\n await this.#appendDiagnostic(sessionId, \"resync_events\", {\n mode: result.mode,\n persistentLastSeq,\n streamLastSeq,\n throughSeq: result.throughSeq,\n eventCount: result.events.length,\n gapFromSeq: result.gapFromSeq,\n gapToSeq: result.gapToSeq,\n });\n return result;\n }\n\n async #getLane(sessionId: SessionId): Promise<SessionLane> {\n const existing = this.#sessions.get(sessionId);\n if (existing) {\n return existing;\n }\n const loaded = await loadSession({ sessionsDir: this.#sessionsDir, sessionId });\n const project = await this.#resolveProject(sessionId, loaded.header.meta.projectId);\n const selectedModel = await this.#selectedModelFromMeta(loaded.header.meta, project);\n const runtime = await this.#createRuntime({ sessionId, project, selectedModel, purpose: \"chat\" });\n await this.#appendDiagnostic(sessionId, \"runtime_created\", {\n projectId: project.projectId,\n workDir: project.workDir,\n selectedModelId: selectedModel?.modelId,\n });\n const lane = {\n session: loaded,\n project,\n runtime,\n ...(selectedModel ? { selectedModel } : {}),\n queue: Promise.resolve(),\n appendQueue: Promise.resolve(),\n followUpWaiters: new Map(),\n };\n this.#registerLaneTools(lane);\n this.#sessions.set(sessionId, lane);\n this.#seqs.set(sessionId, Number(loaded.currentSeq));\n return lane;\n }\n\n async #loadExistingLaneIfPresent(sessionId: SessionId): Promise<boolean> {\n if (this.#sessions.has(sessionId)) {\n return true;\n }\n try {\n await this.#getLane(sessionId);\n return true;\n } catch (cause) {\n if (isNodeErrorCode(cause, \"ENOENT\")) {\n return false;\n }\n throw cause;\n }\n }\n\n async #createLane(sessionId: SessionId, meta: CreateSessionMeta, project: HostProject): Promise<SessionLane> {\n const selectedModel = await this.#selectedModelFromMeta(meta, project);\n const session = await createSession({\n sessionsDir: this.#sessionsDir,\n header: {\n version: 1,\n sessionId,\n deviceId: this.#deviceId,\n createdAt: this.#now(),\n meta: {\n ...meta,\n ...(selectedModel\n ? {\n model: selectedModel.displayName,\n selectedModel,\n }\n : {}),\n },\n },\n });\n const runtime = await this.#createRuntime({ sessionId, project, selectedModel, purpose: \"chat\" });\n await this.#appendDiagnostic(sessionId, \"runtime_created\", {\n projectId: project.projectId,\n workDir: project.workDir,\n selectedModelId: selectedModel?.modelId,\n });\n const lane = {\n session,\n project,\n runtime,\n ...(selectedModel ? { selectedModel } : {}),\n queue: Promise.resolve(),\n appendQueue: Promise.resolve(),\n followUpWaiters: new Map(),\n };\n this.#registerLaneTools(lane);\n return lane;\n }\n\n #registerLaneTools(lane: SessionLane): void {\n lane.runtime.registerTool(\n createSkillTool({\n getEntry: (name) => lane.session.tree.controlState.skillIndex[name],\n listNames: () => Object.keys(lane.session.tree.controlState.skillIndex).sort(),\n }),\n );\n lane.runtime.registerTool(\n createSnipTool({\n snip: async (input) => this.#snipUserTurn(lane, input.userMessageId, input.reason),\n }),\n );\n }\n\n async #snipUserTurn(\n lane: SessionLane,\n userMessageId: string,\n reason: string | undefined,\n ): Promise<{ anchorUserEventId: EventId; throughEventId: EventId; hiddenEventCount: number }> {\n const leafId = lane.session.activeLeafId;\n if (!leafId) {\n throw new Error(\"snip requires an active conversation\");\n }\n const path = lane.session.tree.getPath(leafId);\n const anchorUserEventId = this.#resolveSnipUserMessageId(lane, path, userMessageId);\n const anchorIndex = path.findIndex((id) => id === anchorUserEventId);\n if (anchorIndex < 0) {\n throw new Error(`snip target is not on the active conversation path: ${anchorUserEventId}`);\n }\n const anchor = lane.session.tree.get(anchorUserEventId)?.event;\n if (anchor?.type !== \"user_message\") {\n throw new Error(`snip target must be a user_message: ${anchorUserEventId}`);\n }\n const nextUserIndex = path.findIndex((id, index) =>\n index > anchorIndex && lane.session.tree.get(id)?.event.type === \"user_message\"\n );\n if (nextUserIndex < 0) {\n throw new Error(\"snip cannot hide the current user turn before the next user message exists\");\n }\n const throughEventId = path[nextUserIndex - 1];\n if (!throughEventId || throughEventId === anchorUserEventId) {\n throw new Error(`snip target has no completed turn content: ${anchorUserEventId}`);\n }\n const clientId = lane.snipClientId;\n if (!clientId) {\n throw new Error(\"snip is only available while a user turn is running\");\n }\n await this.#appendPersistent(lane, {\n type: \"context_control\",\n id: asEventId(this.#createId()),\n parentId: null,\n sessionId: lane.session.header.sessionId,\n clientId,\n ts: this.#now(),\n operation: \"hide_user_turn\",\n anchorUserEventId,\n throughEventId,\n actor: \"agent\",\n ...(reason ? { reason } : {}),\n });\n await this.#appendDiagnostic(lane.session.header.sessionId, \"context_snipped\", {\n anchorUserEventId,\n throughEventId,\n hiddenEventCount: nextUserIndex - anchorIndex,\n });\n return {\n anchorUserEventId,\n throughEventId,\n hiddenEventCount: nextUserIndex - anchorIndex,\n };\n }\n\n #resolveSnipUserMessageId(lane: SessionLane, path: EventId[], userMessageId: string): EventId {\n if (path.includes(userMessageId as EventId)) {\n return userMessageId as EventId;\n }\n const matches = path.filter((id) => {\n const event = lane.session.tree.get(id)?.event;\n return event?.type === \"user_message\" && snipUserMessageAlias(id) === userMessageId;\n });\n if (matches.length === 1) {\n return matches[0];\n }\n if (matches.length > 1) {\n throw new Error(`snip target short id is ambiguous: ${userMessageId}`);\n }\n return asEventId(userMessageId);\n }\n\n async #selectChatRuntime(lane: SessionLane, modelSelection: ModelSelectionInput | undefined): Promise<void> {\n if (!modelSelection) {\n return;\n }\n const selectedModel = await this.#selectedModelFromMeta(\n { projectId: lane.project.projectId, modelSelection },\n lane.project,\n );\n if (!selectedModel || lane.selectedModel?.modelId === selectedModel.modelId) {\n return;\n }\n lane.runtime = await this.#createRuntime({\n sessionId: lane.session.header.sessionId,\n project: lane.project,\n selectedModel,\n purpose: \"chat\",\n });\n lane.selectedModel = selectedModel;\n this.#registerLaneTools(lane);\n await this.#appendDiagnostic(lane.session.header.sessionId, \"chat_model_selected\", {\n projectId: lane.project.projectId,\n workDir: lane.project.workDir,\n selectedModelId: selectedModel.modelId,\n role: selectedModel.role,\n });\n }\n\n #syncChannelTool(lane: SessionLane, channelContext: RuntimeChannelContext | undefined): void {\n if (!channelContext) {\n lane.runtime.unregisterTool(\"SendChannelMessage\");\n return;\n }\n lane.runtime.registerTool(\n createSendChannelMessageTool({\n sendCurrent: async (input) => {\n const current = lane.channelContext;\n if (!current) {\n throw new Error(\"no_channel_context\");\n }\n if (input.channel && input.channel !== current.channel) {\n throw new Error(`channel_mismatch: current channel is ${current.channel}`);\n }\n const extension = this.#imExtensions.get(current.extensionId);\n if (!extension) {\n throw new Error(`channel_adapter_unavailable: ${current.extensionId}`);\n }\n await extension.adapter.sendMessage(current.target, {\n ...(input.text ? { text: input.text } : {}),\n ...(input.attachments ? { attachments: input.attachments } : {}),\n });\n await this.#appendDiagnostic(lane.session.header.sessionId, \"channel_message_sent\", {\n extensionId: current.extensionId,\n channel: current.channel,\n externalConversationId: current.externalConversationId,\n attachments: input.attachments?.length ?? 0,\n });\n return { channel: current.channel, target: \"current\", attachments: input.attachments?.length ?? 0 };\n },\n }),\n );\n }\n\n async #startEnabledImExtensions(): Promise<void> {\n const config = await this.#loadUserConfigProfile();\n const enabled = Object.entries(config?.extensions ?? {})\n .filter(([, extension]) => extension.enabled && extension.kind === \"im\")\n .map(([extensionId]) => extensionId);\n if (enabled.length === 0) {\n return;\n }\n const manifests = await this.#discoverExtensionManifests();\n for (const extensionId of enabled) {\n const manifest = manifests.get(extensionId);\n if (!manifest) {\n await this.#appendHostDiagnostic(\"im_extension_missing\", { extensionId });\n continue;\n }\n let adapter: ImAdapter;\n try {\n adapter = await this.#loadImAdapter(manifest, config?.extensions[extensionId]?.config ?? {});\n } catch (cause) {\n await this.#appendHostDiagnostic(\"im_extension_load_failed\", {\n extensionId,\n message: cause instanceof Error ? cause.message : String(cause),\n });\n continue;\n }\n const extension: LoadedImExtension = {\n manifest,\n adapter,\n skillRoots: manifest.skills.map((path) => resolve(manifest.rootDir, path)),\n };\n let started = false;\n await adapter.start({\n onMessage: async (message) => {\n await this.#handleImMessage(extension, message);\n },\n logger: {\n info: (message, data) => void this.#appendHostDiagnostic(\"im_extension_info\", { extensionId, message, ...data }),\n error: (message, data) => void this.#appendHostDiagnostic(\"im_extension_error\", { extensionId, message, ...data }),\n },\n }).then(() => {\n started = true;\n }).catch(async (cause) => {\n await this.#appendHostDiagnostic(\"im_extension_start_failed\", {\n extensionId,\n message: cause instanceof Error ? cause.message : String(cause),\n });\n return undefined;\n });\n if (!started) {\n continue;\n }\n this.#imExtensions.set(extensionId, extension);\n await this.#appendHostDiagnostic(\"im_extension_started\", { extensionId });\n }\n }\n\n async #stopImExtensions(): Promise<void> {\n for (const extension of this.#imExtensions.values()) {\n await extension.adapter.stop().catch((cause) => {\n void this.#appendHostDiagnostic(\"im_extension_stop_failed\", {\n extensionId: extension.manifest.id,\n message: cause instanceof Error ? cause.message : String(cause),\n });\n });\n }\n this.#imExtensions.clear();\n }\n\n async #discoverExtensionManifests(): Promise<Map<string, ExtensionManifest>> {\n const roots = [\n this.#builtinExtensionsDir,\n join(this.#scorelHomeDir, \"extensions\"),\n ];\n const manifests = new Map<string, ExtensionManifest>();\n for (const root of roots) {\n let children: string[];\n try {\n children = await readdir(root);\n } catch (cause) {\n if (isNodeErrorCode(cause, \"ENOENT\") || isNodeErrorCode(cause, \"ENOTDIR\")) {\n continue;\n }\n throw cause;\n }\n for (const child of children.sort()) {\n const manifestPath = join(root, child, \"scorel.extension.json\");\n try {\n const manifest = await loadExtensionManifest(manifestPath);\n manifests.set(manifest.id, manifest);\n } catch (cause) {\n await this.#appendHostDiagnostic(\"extension_manifest_invalid\", {\n path: manifestPath,\n message: cause instanceof Error ? cause.message : String(cause),\n });\n }\n }\n }\n return manifests;\n }\n\n async #loadImAdapter(manifest: ExtensionManifest, config: Record<string, string | number | boolean>): Promise<ImAdapter> {\n const adapterPath = resolve(manifest.rootDir, manifest.adapter);\n const mod = await import(pathToFileURL(adapterPath).href) as {\n createAdapter?: (options: { config: Record<string, string | number | boolean>; manifest: ExtensionManifest }) => ImAdapter | Promise<ImAdapter>;\n default?: ImAdapter;\n };\n const adapter = mod.createAdapter ? await mod.createAdapter({ config, manifest }) : mod.default;\n if (!adapter || typeof adapter.start !== \"function\" || typeof adapter.stop !== \"function\" || typeof adapter.sendMessage !== \"function\") {\n throw new Error(`IM adapter ${adapterPath} must export createAdapter() or default adapter with start/stop/sendMessage`);\n }\n return adapter;\n }\n\n async #handleImMessage(extension: LoadedImExtension, message: ImIncomingMessage): Promise<SessionId> {\n const binding = await this.#ensureImBinding(extension.manifest.id, message.externalConversationId);\n const lane = await this.#getLane(binding.sessionId);\n const runningBehavior = isSteerMessage(message.text) ? \"steer\" : \"follow_up\";\n const content = stripImCommandPrefix(message.text);\n const channelContext: ChannelContext = {\n channel: extension.manifest.id,\n externalConversationId: message.externalConversationId,\n ...(message.conversationType ? { conversationType: message.conversationType } : {}),\n ...(message.senderDisplayName ? { senderDisplayName: message.senderDisplayName } : {}),\n ...(message.mentionedBot !== undefined ? { mentionedBot: message.mentionedBot } : {}),\n data: message.target?.data ?? message.data ?? {},\n };\n await this.#handleSendMessage(\n { clientId: asClientId(`im_${extension.manifest.id}`), emit: () => undefined },\n {\n type: \"send_message\",\n requestId: asRequestId(`req_im_${this.#createId()}`),\n sessionId: lane.session.header.sessionId,\n content,\n options: {\n runningBehavior,\n channelContext,\n },\n },\n );\n return lane.session.header.sessionId;\n }\n\n async #ensureImBinding(extensionId: string, externalConversationId: string): Promise<ImSessionBinding> {\n const key = imBindingKey(extensionId, externalConversationId);\n const existing = this.#imBindings.get(key);\n if (existing) {\n existing.updatedAt = this.#now();\n await this.#saveImBindings();\n return existing;\n }\n const project = await this.#ensureDefaultWorkspaceProject();\n const sessionId = asSessionId(`ses_${this.#createId()}`);\n const lane = await this.#createLane(sessionId, {\n projectId: project.projectId,\n title: `${extensionId}: ${externalConversationId}`,\n }, project);\n this.#sessions.set(sessionId, lane);\n this.#events.set(sessionId, []);\n this.#seqs.set(sessionId, 0);\n const binding: ImSessionBinding = {\n extensionId,\n externalConversationId,\n projectId: project.projectId,\n sessionId,\n createdAt: this.#now(),\n updatedAt: this.#now(),\n };\n this.#imBindings.set(key, binding);\n await this.#saveImBindings();\n await this.#appendDiagnostic(sessionId, \"im_session_bound\", {\n extensionId,\n externalConversationId,\n projectId: project.projectId,\n });\n this.#onSessionListChanged?.({ projectId: project.projectId, sessionId });\n return binding;\n }\n\n async #ensureDefaultWorkspaceProject(): Promise<HostProject> {\n const workspace = join(this.#scorelHomeDir, \"workspace\");\n await mkdir(workspace, { recursive: true });\n return this.registerProject(workspace);\n }\n\n #extensionSkillRoots(): Array<{ path: string; extensionId: string }> {\n return [...this.#imExtensions.values()].flatMap((extension) =>\n extension.skillRoots.map((path) => ({ path, extensionId: extension.manifest.id })),\n );\n }\n\n async #loadImBindings(): Promise<void> {\n try {\n const text = await readFile(this.#imBindingsPath(), \"utf8\");\n const value = JSON.parse(text) as { bindings?: ImSessionBinding[] };\n for (const binding of value.bindings ?? []) {\n this.#imBindings.set(imBindingKey(binding.extensionId, binding.externalConversationId), binding);\n }\n } catch (cause) {\n if (!isNodeErrorCode(cause, \"ENOENT\")) {\n throw cause;\n }\n }\n }\n\n async #saveImBindings(): Promise<void> {\n const path = this.#imBindingsPath();\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify({ bindings: [...this.#imBindings.values()] }, null, 2)}\\n`, \"utf8\");\n }\n\n #imBindingsPath(): string {\n return join(this.#scorelHomeDir, \"channels\", \"im-bindings.json\");\n }\n\n async #loadUserConfigProfile(options: { includeSecrets?: boolean } = {}): Promise<ScorelConfigProfile | undefined> {\n try {\n return await loadScorelConfigProfile({\n cwd: this.#userHomeDir,\n scorelHomeDir: this.#scorelHomeDir,\n includeSecrets: options.includeSecrets ?? false,\n });\n } catch (cause) {\n if (isMissingConfigError(cause)) {\n return undefined;\n }\n throw cause;\n }\n }\n\n #configWriteTarget(): {\n configDir: string;\n configPath: string;\n workDir: string;\n } {\n return {\n configDir: this.#scorelHomeDir,\n configPath: join(this.#scorelHomeDir, \"config.toml\"),\n workDir: this.#userHomeDir,\n };\n }\n\n async #listModels(projectId?: ProjectId): Promise<{\n providers: ProviderConnectionSummary[];\n providerModels: ProviderModelSummary[];\n models: AvailableModelSummary[];\n roles: Record<\"primary\" | \"standard\" | \"auxiliary\", string>;\n warnings?: string[];\n }> {\n let config: ScorelConfig | ScorelConfigProfile | undefined;\n try {\n config = projectId ? await this.#configProfileForProject(projectId) : await this.#loadUserConfigProfile();\n } catch (cause) {\n if (!isMissingConfigError(cause)) {\n throw cause;\n }\n config = undefined;\n }\n config ??= projectId ? undefined : this.#modelProfile;\n if (!config) {\n return {\n providers: [],\n providerModels: [],\n models: [],\n roles: {\n primary: \"\",\n standard: \"\",\n auxiliary: \"\",\n },\n };\n }\n const configWarnings = \"warnings\" in config ? config.warnings : undefined;\n return {\n providers: listProviderConnections(config),\n providerModels: listProviderModels(config),\n models: listAvailableModels(config),\n roles: config.modelProfile.roles,\n ...(configWarnings ? { warnings: configWarnings } : {}),\n };\n }\n\n async #handleUpsertModelProfile(\n request: ClientRequest<\"upsert_model_profile\">,\n ): Promise<{\n providers: ProviderConnectionSummary[];\n providerModels: ProviderModelSummary[];\n models: AvailableModelSummary[];\n roles: Record<\"primary\" | \"standard\" | \"auxiliary\", string>;\n warnings?: string[];\n }> {\n const target = this.#configWriteTarget();\n let existingConfigText: string | undefined;\n try {\n existingConfigText = await readFile(target.configPath, \"utf8\");\n } catch (cause) {\n if (!isNodeErrorCode(cause, \"ENOENT\")) {\n throw cause;\n }\n }\n await mkdir(target.configDir, { recursive: true });\n await writeFile(\n target.configPath,\n renderModelProfileConfig({\n providerId: request.providerId,\n providerType: request.providerType,\n provider: request.provider,\n apiKeyEnv: request.apiKeyEnv,\n apiKey: request.apiKey,\n api: request.api,\n baseUrl: request.baseUrl,\n modelId: request.modelId,\n providerModelKey: request.providerModelKey,\n availableModelId: request.availableModelId,\n addToAvailable: request.addToAvailable,\n removeAvailableModelId: request.removeAvailableModelId,\n providerModelId: request.providerModelId,\n displayName: request.displayName,\n contextWindow: request.contextWindow,\n maxTokens: request.maxTokens,\n reasoning: request.reasoning,\n supportsDeveloperRole: request.supportsDeveloperRole,\n supportsImageInput: request.supportsImageInput,\n roles: request.roles,\n existingConfigText,\n }),\n \"utf8\",\n );\n await this.#appendHostDiagnostic(\"model_profile_upserted\", {\n ...(request.projectId ? { ignoredProjectId: request.projectId } : {}),\n scope: \"device\",\n workDir: target.workDir,\n providerId: request.providerId,\n modelId: request.modelId,\n });\n return this.#listModels();\n }\n\n async #handleRemoveModelProvider(\n request: ClientRequest<\"remove_model_provider\">,\n ): Promise<{\n providers: ProviderConnectionSummary[];\n providerModels: ProviderModelSummary[];\n models: AvailableModelSummary[];\n roles: Record<\"primary\" | \"standard\" | \"auxiliary\", string>;\n warnings?: string[];\n removed: boolean;\n }> {\n const target = this.#configWriteTarget();\n let existingConfigText: string | undefined;\n try {\n existingConfigText = await readFile(target.configPath, \"utf8\");\n } catch (cause) {\n if (!isNodeErrorCode(cause, \"ENOENT\")) {\n throw cause;\n }\n }\n await mkdir(target.configDir, { recursive: true });\n await writeFile(\n target.configPath,\n renderModelProfileConfig({\n removeProviderId: request.providerId,\n existingConfigText,\n }),\n \"utf8\",\n );\n const profile = await this.#listModels();\n return { ...profile, removed: true };\n }\n\n async #memorySettingsForProject(projectId: ProjectId): Promise<MemorySettings> {\n return this.#memorySettings(projectId);\n }\n\n async #memorySettings(projectId?: ProjectId): Promise<MemorySettings> {\n const config = await (projectId ? this.#configProfileForProject(projectId) : this.#loadUserConfigProfile()).catch((cause) => {\n if (isMissingConfigError(cause)) {\n return undefined;\n }\n throw cause;\n });\n return config?.memory ?? disabledMemorySettings();\n }\n\n async #safeMemorySettingsForRuntime(lane: SessionLane, clientId: ClientId): Promise<MemorySettings> {\n try {\n return await this.#memorySettingsForProject(lane.project.projectId);\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n await this.#appendDiagnostic(lane.session.header.sessionId, \"memory_settings_unavailable\", {\n clientId,\n message: error.message,\n stack: shortStack(error),\n });\n return disabledMemorySettings();\n }\n }\n\n async #handleUpsertMemorySettings(request: ClientRequest<\"upsert_memory_settings\">): Promise<MemorySettings> {\n const target = this.#configWriteTarget();\n let existingConfigText: string | undefined;\n try {\n existingConfigText = await readFile(target.configPath, \"utf8\");\n } catch (cause) {\n if (!isNodeErrorCode(cause, \"ENOENT\")) {\n throw cause;\n }\n }\n await mkdir(target.configDir, { recursive: true });\n await writeFile(\n target.configPath,\n renderMemoryConfig({\n enabled: request.enabled,\n daily: request.daily,\n sessionMemory: request.sessionMemory,\n autoDream: request.autoDream,\n promoteRoot: request.promoteRoot,\n dreamIdleMinutes: request.dreamIdleMinutes,\n autoCompactThreshold: request.autoCompactThreshold,\n existingConfigText,\n }),\n \"utf8\",\n );\n await this.#appendHostDiagnostic(\"memory_settings_upserted\", {\n ...(request.projectId ? { ignoredProjectId: request.projectId } : {}),\n scope: \"device\",\n workDir: target.workDir,\n });\n return this.#memorySettings();\n }\n\n async #runtimeSettingsForProject(projectId: ProjectId, installStatus?: Pick<RuntimeSettings, \"installStatus\" | \"installMessage\">): Promise<RuntimeSettings> {\n return this.#runtimeSettings(projectId, installStatus);\n }\n\n async #runtimeSettings(projectId?: ProjectId, installStatus?: Pick<RuntimeSettings, \"installStatus\" | \"installMessage\">): Promise<RuntimeSettings> {\n const config = await (projectId ? this.#configProfileForProject(projectId) : this.#loadUserConfigProfile()).catch((cause) => {\n if (isMissingConfigError(cause)) {\n return undefined;\n }\n throw cause;\n });\n const detected = await detectRtk();\n const savings = await readRuntimeStats(this.#runtimeStatsPath());\n return {\n tokenSavingRtk: config?.runtime.tokenSavingRtk ?? false,\n rtkAvailable: detected.available,\n ...(detected.executable ? { rtkExecutable: detected.executable } : {}),\n ...(detected.version ? { rtkVersion: detected.version } : {}),\n ...(installStatus?.installStatus ? { installStatus: installStatus.installStatus } : {}),\n ...(installStatus?.installMessage ? { installMessage: installStatus.installMessage } : {}),\n estimatedOutputTokens: savings.rtk.outputTokens,\n estimatedSavedTokens: savings.rtk.savedTokens,\n };\n }\n\n async #handleUpsertRuntimeSettings(request: ClientRequest<\"upsert_runtime_settings\">): Promise<RuntimeSettings> {\n const target = this.#configWriteTarget();\n let existingConfigText: string | undefined;\n try {\n existingConfigText = await readFile(target.configPath, \"utf8\");\n } catch (cause) {\n if (!isNodeErrorCode(cause, \"ENOENT\")) {\n throw cause;\n }\n }\n await mkdir(target.configDir, { recursive: true });\n await writeFile(\n target.configPath,\n renderRuntimeConfig({\n tokenSavingRtk: request.tokenSavingRtk,\n existingConfigText,\n }),\n \"utf8\",\n );\n const installResult = request.tokenSavingRtk === true ? await ensureRtkAvailable() : { status: \"idle\" as const };\n await this.#appendHostDiagnostic(\"runtime_settings_upserted\", {\n ...(request.projectId ? { ignoredProjectId: request.projectId } : {}),\n scope: \"device\",\n workDir: target.workDir,\n tokenSavingRtk: request.tokenSavingRtk,\n installStatus: installResult.status,\n });\n return this.#runtimeSettings(undefined, {\n installStatus: installResult.status,\n ...(installResult.message ? { installMessage: installResult.message } : {}),\n });\n }\n\n async #extensionSettings(extensionId: string): Promise<ExtensionSettings> {\n const config = await this.#loadUserConfigProfile().catch((cause) => {\n if (isMissingConfigError(cause)) {\n return undefined;\n }\n throw cause;\n });\n const extension = config?.extensions[extensionId];\n return {\n extensionId,\n enabled: extension?.enabled ?? false,\n kind: \"im\",\n config: extension?.config ?? {},\n active: this.#imExtensions.has(extensionId),\n };\n }\n\n async #handleUpsertExtensionSettings(request: ClientRequest<\"upsert_extension_settings\">): Promise<ExtensionSettings> {\n const configPath = join(this.#scorelHomeDir, \"config.toml\");\n let existingConfigText: string | undefined;\n try {\n existingConfigText = await readFile(configPath, \"utf8\");\n } catch (cause) {\n if (!isNodeErrorCode(cause, \"ENOENT\")) {\n throw cause;\n }\n }\n await mkdir(this.#scorelHomeDir, { recursive: true });\n await writeFile(\n configPath,\n renderExtensionConfig({\n extensionId: request.extensionId,\n enabled: request.enabled,\n kind: request.kind,\n config: request.config,\n existingConfigText,\n }),\n \"utf8\",\n );\n await this.#appendHostDiagnostic(\"extension_settings_upserted\", {\n extensionId: request.extensionId,\n enabled: request.enabled,\n });\n await this.refreshImExtensions();\n return this.#extensionSettings(request.extensionId);\n }\n\n async #fetchProviderModels(projectId: ProjectId | undefined, providerId: string): Promise<ProviderCatalogModelSummary[]> {\n const config = projectId\n ? await loadScorelConfigProfile({\n cwd: (await this.#registry.require(projectId)).workDir,\n scorelHomeDir: this.#scorelHomeDir,\n includeSecrets: true,\n })\n : await this.#loadUserConfigProfile({ includeSecrets: true });\n if (!config) {\n throw new Error(\"Model profile config is not configured\");\n }\n const provider = config.providers[providerId];\n if (!provider) {\n throw new Error(`Provider is not configured: ${providerId}`);\n }\n if (provider.type !== \"custom\" || (provider.api !== \"openai-completions\" && provider.api !== \"openai-responses\")) {\n throw new Error(\"Provider catalog fetch currently supports custom OpenAI-compatible providers only\");\n }\n if (!provider.baseUrl) {\n throw new Error(`providers.${providerId}.baseUrl is required`);\n }\n const apiKeyEnv = \"apiKeyEnv\" in provider ? provider.apiKeyEnv : undefined;\n const apiKey = provider.apiKey || (apiKeyEnv ? process.env[apiKeyEnv] : undefined);\n if (!apiKey) {\n throw new Error(apiKeyEnv ? `${apiKeyEnv} is not set` : \"Provider API key is not configured\");\n }\n const endpoint = `${provider.baseUrl.replace(/\\/+$/, \"\")}/models`;\n const response = await fetch(endpoint, {\n headers: {\n authorization: `Bearer ${apiKey}`,\n },\n });\n if (!response.ok) {\n throw new Error(`Provider /models request failed: ${response.status} ${response.statusText}`);\n }\n const payload = await response.json() as {\n data?: Array<{ id?: unknown; name?: unknown }>;\n models?: Array<{ id?: unknown; name?: unknown }>;\n };\n const rawModels = Array.isArray(payload.data) ? payload.data : Array.isArray(payload.models) ? payload.models : [];\n return rawModels\n .map((model) => {\n const id = typeof model.id === \"string\" ? model.id : \"\";\n const name = typeof model.name === \"string\" ? model.name : id;\n return id ? { id, displayName: name || id } : undefined;\n })\n .filter((model): model is ProviderCatalogModelSummary => Boolean(model))\n .sort((left, right) => left.id.localeCompare(right.id));\n }\n\n async #selectedModelFromMeta(meta: CreateSessionMeta | SessionMeta, project: HostProject): Promise<SelectedModelSummary | undefined> {\n const config = await this.#configForProject(project.projectId);\n if (!config) {\n return \"selectedModel\" in meta ? meta.selectedModel : undefined;\n }\n const persistedSelection = \"selectedModel\" in meta ? meta.selectedModel : undefined;\n const requestedSelection = \"modelSelection\" in meta ? meta.modelSelection : undefined;\n const selectionInput = persistedSelection\n ? config.models[persistedSelection.modelId]\n ? { modelId: persistedSelection.modelId, role: persistedSelection.role }\n : persistedSelection.role\n ? { role: persistedSelection.role }\n : undefined\n : requestedSelection;\n const selection = resolveModelSelection(\n config,\n selectionInput,\n );\n const model = resolvePiAiModel(selection.config);\n return {\n modelId: selection.modelId,\n role: selection.role,\n providerId: selection.providerId,\n provider: model.provider,\n id: model.id,\n displayName: selection.displayName,\n contextWindow: model.contextWindow,\n maxTokens: model.maxTokens,\n reasoning: model.reasoning,\n supportsImageInput: model.input.includes(\"image\"),\n };\n }\n\n async #configForProject(projectId?: ProjectId): Promise<ScorelConfig | undefined> {\n if (this.#loadConfig) {\n if (!projectId) {\n return this.#modelProfile;\n }\n const project = await this.#registry.require(projectId);\n return this.#loadConfig({ project });\n }\n return this.#modelProfile;\n }\n\n async #configProfileForProject(projectId?: ProjectId): Promise<ScorelConfigProfile | ScorelConfig | undefined> {\n if (this.#loadConfigProfile) {\n if (!projectId) {\n return this.#modelProfile;\n }\n const project = await this.#registry.require(projectId);\n return this.#loadConfigProfile({ project });\n }\n if (this.#loadConfig) {\n if (!projectId) {\n return this.#modelProfile;\n }\n const project = await this.#registry.require(projectId);\n try {\n return await loadScorelConfigProfile({ cwd: project.workDir, scorelHomeDir: this.#scorelHomeDir });\n } catch (cause) {\n if (!isMissingConfigError(cause)) {\n throw cause;\n }\n }\n }\n return this.#modelProfile;\n }\n\n #respond<TRequest extends ClientRequest>(\n connection: Connection,\n request: TRequest,\n data: unknown,\n ): void {\n connection.emit({\n type: \"response\",\n requestType: request.type,\n requestId: request.requestId,\n ok: true,\n data,\n } as DaemonMessage);\n }\n\n #assertStarted(): void {\n if (!this.#started) {\n throw new Error(\"ScorelHost is not started\");\n }\n }\n\n async #appendDiagnostic(sessionId: SessionId, event: string, fields: Record<string, unknown> = {}): Promise<void> {\n const line = formatDiagnosticLine({\n ts: this.#now(),\n level: event.endsWith(\"_error\") || event.endsWith(\"_failed\") ? \"error\" : \"info\",\n event,\n sessionId,\n ...fields,\n });\n await mkdir(this.#sessionsDir, { recursive: true });\n await appendFile(sessionLogFilePath(this.#sessionsDir, sessionId), `${line}\\n`, \"utf8\");\n }\n\n async #appendHostDiagnostic(event: string, fields: Record<string, unknown> = {}): Promise<void> {\n const line = formatDiagnosticLine({ ts: this.#now(), level: \"info\", event, ...fields });\n await mkdir(this.#sessionsDir, { recursive: true });\n await appendFile(join(this.#sessionsDir, \"host.log\"), `${line}\\n`, \"utf8\");\n }\n\n #runtimeStatsPath(): string {\n return join(this.#scorelHomeDir, \"runtime-stats.json\");\n }\n\n async #recordRtkSavings(input: { projectId: ProjectId; sessionId: SessionId; savings: RtkSavingsDelta }): Promise<void> {\n const updateTask = this.#runtimeStatsQueue.then(async () => {\n const path = this.#runtimeStatsPath();\n const stats = await readRuntimeStats(path);\n addRtkSavings(stats, String(input.projectId), String(input.sessionId), input.savings);\n await writeRuntimeStats(path, stats);\n });\n this.#runtimeStatsQueue = updateTask.catch(() => {});\n await updateTask;\n }\n\n async #resolveProject(sessionId: SessionId, projectId: ProjectId): Promise<HostProject> {\n const project = await this.#registry.require(projectId);\n await this.#appendDiagnostic(sessionId, \"project_resolved\", {\n projectId: project.projectId,\n workDir: project.workDir,\n });\n return project;\n }\n}\n\nconst isMissingConfigError = (cause: unknown): boolean =>\n cause instanceof Error && cause.message.startsWith(\"Scorel config not found:\");\n\nexport const createEmbeddedTransport = (host: ScorelHost): DaemonTransport => {\n const handlers = new Set<(message: DaemonMessage) => void>();\n const connection: Connection = {\n clientId: asClientId(\"embedded_unconnected\"),\n emit: (message) => {\n for (const handler of handlers) {\n handler(message);\n }\n },\n };\n\n return {\n async connect(params) {\n connection.clientId = params.clientId;\n const result = host.connect(connection, params.sessionId);\n connection.emit({\n type: \"connected\",\n clientId: params.clientId,\n sessionId: result.sessionId,\n currentSeq: result.currentSeq,\n deviceId: result.deviceId,\n deviceDisplayName: result.deviceDisplayName,\n });\n return {\n clientId: params.clientId,\n sessionId: result.sessionId,\n currentSeq: result.currentSeq,\n deviceId: result.deviceId,\n deviceDisplayName: result.deviceDisplayName,\n };\n },\n send(message) {\n return host.handleMessage(connection, message);\n },\n onMessage(handler) {\n handlers.add(handler);\n return () => {\n handlers.delete(handler);\n };\n },\n close() {\n host.disconnect(connection);\n handlers.clear();\n },\n };\n};\n\nconst isNodeErrorCode = (cause: unknown, code: string): boolean =>\n cause instanceof Error && \"code\" in cause && cause.code === code;\n\nconst wireErrorCode = (cause: unknown): \"project_not_found\" | \"project_has_sessions\" | \"filesystem_error\" | \"conflict\" | \"internal_error\" => {\n if (!(cause instanceof ProjectRegistryError)) {\n return \"internal_error\";\n }\n return cause.code;\n};\n\nconst hasContinuousCoverage = (events: ScorelEvent[], expectedFirstSeq: number): boolean => {\n if (events.length === 0) {\n return false;\n }\n let expected = expectedFirstSeq;\n for (const event of events) {\n if (Number(event.seq) !== expected) {\n return false;\n }\n expected += 1;\n }\n return true;\n};\n\nconst countContentBlocks = (message: ScorelMessage, type: string): number =>\n message.content.filter((block) => block.type === type).length;\n\nconst normalizeContent = (content: string | ScorelMessage[\"content\"]): ScorelMessage[\"content\"] =>\n typeof content === \"string\" ? [{ type: \"text\", text: content }] : content;\n\nconst snipUserMessageIdBlock = (userEventId: EventId): ScorelMessage[\"content\"][number] => ({\n ...createSystemReminderBlock({\n kind: \"message_ref\",\n origin: \"system\",\n text: `snip.userMessageId: ${snipUserMessageAlias(userEventId)}`,\n visibility: \"model\",\n scope: \"message\",\n data: { userMessageId: snipUserMessageAlias(userEventId) },\n }),\n});\n\nconst inputText = (message: ScorelMessage): string =>\n message.content\n .flatMap((block) => block.type === \"text\" && block.visibility !== \"model\" ? [block.text] : [])\n .join(\"\\n\")\n .trim();\n\nconst assistantText = (message: ScorelMessage): string =>\n message.content\n .filter((block) => block.type === \"text\")\n .map((block) => block.text)\n .join(\"\\n\")\n .trim();\n\nconst messageText = (message: ScorelMessage): string => {\n const text = message.content\n .map((block) => {\n if (block.type === \"text\") {\n return block.text;\n }\n if (block.type === \"thinking\") {\n return `[thinking] ${block.text}`;\n }\n if (block.type === \"tool_call\") {\n return `[tool_call:${block.toolName}] ${JSON.stringify(block.args)}`;\n }\n if (block.type === \"tool_result\") {\n return `[tool_result:${block.toolName}] ${JSON.stringify(block.result)}`;\n }\n if (block.type === \"system_reminder\") {\n return `[system_reminder:${block.kind}] ${block.text}`;\n }\n return \"\";\n })\n .filter(Boolean)\n .join(\"\\n\")\n .trim();\n return text || \"(empty)\";\n};\n\nconst estimateScorelMessagesTokens = (messages: ScorelMessage[]): number =>\n estimateTextTokens(messages.map(messageText).join(\"\\n\"));\n\nconst estimateTextTokens = (value: string): number => Math.ceil(value.length / 3);\n\nconst compactLine = (value: string, maxChars: number): string =>\n value.replace(/\\s+/g, \" \").trim().slice(0, maxChars);\n\nconst parseSessionMemoryJson = (\n raw: string,\n): { summary?: string; recentMessages?: string[]; decisions?: string[]; followUps?: string[] } | undefined => {\n const text = raw.trim().replace(/^```(?:json)?\\s*/i, \"\").replace(/\\s*```$/i, \"\");\n if (!text) {\n return undefined;\n }\n const parsed = JSON.parse(text) as unknown;\n if (!isRecord(parsed)) {\n return undefined;\n }\n return {\n summary: typeof parsed.summary === \"string\" ? parsed.summary : undefined,\n recentMessages: stringArray(parsed.recentMessages),\n decisions: stringArray(parsed.decisions),\n followUps: stringArray(parsed.followUps),\n };\n};\n\nconst stringArray = (value: unknown): string[] | undefined =>\n Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : undefined;\n\nconst disabledMemorySettings = (): MemorySettings => ({\n enabled: false,\n daily: false,\n sessionMemory: false,\n autoDream: false,\n promoteRoot: false,\n dreamIdleMinutes: 60,\n autoCompactThreshold: 0.8,\n});\n\nconst detectRtk = async (): Promise<{ available: boolean; executable?: string; version?: string }> => {\n try {\n const shell = resolveDefaultShell();\n const path = (await execFileAsync(shell, shellCommandArgs(shell, \"command -v rtk\"), { timeout: 5_000 })).stdout.trim();\n if (!path) {\n return { available: false };\n }\n const version = await execFileAsync(path, [\"--version\"], { timeout: 5_000 })\n .then((result) => result.stdout.trim() || result.stderr.trim())\n .catch(() => undefined);\n return {\n available: true,\n executable: path,\n ...(version ? { version } : {}),\n };\n } catch {\n return { available: false };\n }\n};\n\nconst ensureRtkAvailable = async (): Promise<{ status: \"idle\" | \"installed\" | \"failed\"; message?: string }> => {\n const existing = await detectRtk();\n if (existing.available) {\n return { status: \"installed\", message: existing.version ?? existing.executable };\n }\n const shell = resolveDefaultShell();\n const brew = await execFileAsync(shell, shellCommandArgs(shell, \"command -v brew\"), { timeout: 5_000 })\n .then((result) => result.stdout.trim())\n .catch(() => \"\");\n if (!brew) {\n return { status: \"failed\", message: \"Homebrew is not available; install RTK manually with `brew install rtk`.\" };\n }\n try {\n await execFileAsync(brew, [\"install\", \"rtk\"], { timeout: 120_000, maxBuffer: 20_000_000 });\n const installed = await detectRtk();\n return installed.available\n ? { status: \"installed\", message: installed.version ?? installed.executable }\n : { status: \"failed\", message: \"RTK install finished but `rtk` is still not on PATH.\" };\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n return { status: \"failed\", message };\n }\n};\n\ntype RtkSavingsDelta = {\n outputTokens: number;\n savedTokens: number;\n};\n\ntype RuntimeStatsBucket = RtkSavingsDelta;\n\ntype RuntimeStats = {\n version: 1;\n rtk: RuntimeStatsBucket & {\n byProject: Record<string, RuntimeStatsBucket>;\n bySession: Record<string, RuntimeStatsBucket>;\n };\n};\n\nconst emptyRuntimeStats = (): RuntimeStats => ({\n version: 1,\n rtk: {\n outputTokens: 0,\n savedTokens: 0,\n byProject: {},\n bySession: {},\n },\n});\n\nconst readRuntimeStats = async (path: string): Promise<RuntimeStats> => {\n try {\n return parseRuntimeStats(JSON.parse(await readFile(path, \"utf8\")));\n } catch (cause) {\n if (isNodeErrorCode(cause, \"ENOENT\")) {\n return emptyRuntimeStats();\n }\n return emptyRuntimeStats();\n }\n};\n\nconst writeRuntimeStats = async (path: string, stats: RuntimeStats): Promise<void> => {\n await mkdir(dirname(path), { recursive: true });\n const tempPath = join(dirname(path), `.runtime-stats-${process.pid}-${Date.now()}.tmp`);\n try {\n await writeFile(tempPath, `${JSON.stringify(stats, null, 2)}\\n`, \"utf8\");\n await rename(tempPath, path);\n } catch (cause) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw cause;\n }\n};\n\nconst parseRuntimeStats = (value: unknown): RuntimeStats => {\n if (!isRecord(value) || !isRecord(value.rtk)) {\n return emptyRuntimeStats();\n }\n return {\n version: 1,\n rtk: {\n outputTokens: nonNegativeInteger(value.rtk.outputTokens),\n savedTokens: nonNegativeInteger(value.rtk.savedTokens),\n byProject: parseRuntimeStatsBuckets(value.rtk.byProject),\n bySession: parseRuntimeStatsBuckets(value.rtk.bySession),\n },\n };\n};\n\nconst parseRuntimeStatsBuckets = (value: unknown): Record<string, RuntimeStatsBucket> => {\n if (!isRecord(value)) {\n return {};\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, bucket]) => [\n key,\n isRecord(bucket)\n ? {\n outputTokens: nonNegativeInteger(bucket.outputTokens),\n savedTokens: nonNegativeInteger(bucket.savedTokens),\n }\n : { outputTokens: 0, savedTokens: 0 },\n ]),\n );\n};\n\nconst addRtkSavings = (stats: RuntimeStats, projectId: string, sessionId: string, savings: RtkSavingsDelta): void => {\n addRuntimeStatsBucket(stats.rtk, savings);\n stats.rtk.byProject[projectId] = addRuntimeStatsBucket(stats.rtk.byProject[projectId] ?? { outputTokens: 0, savedTokens: 0 }, savings);\n stats.rtk.bySession[sessionId] = addRuntimeStatsBucket(stats.rtk.bySession[sessionId] ?? { outputTokens: 0, savedTokens: 0 }, savings);\n};\n\nconst addRuntimeStatsBucket = <T extends RuntimeStatsBucket>(bucket: T, savings: RtkSavingsDelta): T => {\n bucket.outputTokens += savings.outputTokens;\n bucket.savedTokens += savings.savedTokens;\n return bucket;\n};\n\nconst rtkSavingsFromToolResult = (result: unknown): RtkSavingsDelta | undefined => {\n if (!isRecord(result) || !isRecord(result.details)) {\n return undefined;\n }\n const rtk = result.details.rtk;\n if (!isRecord(rtk) || rtk.applied !== true) {\n return undefined;\n }\n const outputTokens = nonNegativeInteger(rtk.estimatedOutputTokens);\n const savedTokens = nonNegativeInteger(rtk.estimatedSavedTokens);\n return outputTokens > 0 || savedTokens > 0 ? { outputTokens, savedTokens } : undefined;\n};\n\nconst nonNegativeInteger = (value: unknown): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return 0;\n }\n return Math.floor(value);\n};\n\nconst resolveDefaultShell = (): string => {\n const shell = process.env.SHELL || userShell() || \"/bin/sh\";\n return shell.trim() || \"/bin/sh\";\n};\n\nconst shellCommandArgs = (shell: string, command: string): string[] => {\n const name = basename(shell).toLowerCase();\n if (name === \"csh\" || name === \"tcsh\" || name === \"fish\") {\n return [\"-c\", command];\n }\n return [\"-lc\", command];\n};\n\nconst userShell = (): string | undefined => {\n try {\n return userInfo().shell ?? undefined;\n } catch {\n return undefined;\n }\n};\n\nconst runtimeChannelContextFromWire = (context: ChannelContext): RuntimeChannelContext => ({\n extensionId: context.channel,\n channel: context.channel,\n externalConversationId: context.externalConversationId,\n target: {\n externalConversationId: context.externalConversationId,\n data: context.data,\n },\n ...(context.conversationType ? { conversationType: context.conversationType } : {}),\n ...(context.senderDisplayName ? { senderDisplayName: context.senderDisplayName } : {}),\n ...(context.mentionedBot !== undefined ? { mentionedBot: context.mentionedBot } : {}),\n ...(context.data ? { data: context.data } : {}),\n});\n\nconst parseQueuedChannelContext = (value: unknown): RuntimeChannelContext | undefined => {\n if (!isRecord(value)) {\n return undefined;\n }\n if (typeof value.channel !== \"string\" || typeof value.externalConversationId !== \"string\") {\n return undefined;\n }\n return runtimeChannelContextFromWire({\n channel: value.channel,\n externalConversationId: value.externalConversationId,\n ...(typeof value.conversationType === \"string\" ? { conversationType: value.conversationType } : {}),\n ...(typeof value.senderDisplayName === \"string\" ? { senderDisplayName: value.senderDisplayName } : {}),\n ...(typeof value.mentionedBot === \"boolean\" ? { mentionedBot: value.mentionedBot } : {}),\n ...(isRecord(value.data) ? { data: value.data } : {}),\n });\n};\n\nconst parseQueuedModelSelection = (value: unknown): ModelSelectionInput | undefined => {\n if (!isRecord(value)) {\n return undefined;\n }\n const selection: ModelSelectionInput = {};\n if (typeof value.modelId === \"string\") {\n selection.modelId = value.modelId;\n }\n if (value.role === \"primary\" || value.role === \"standard\" || value.role === \"auxiliary\") {\n selection.role = value.role;\n }\n return selection.modelId || selection.role ? selection : undefined;\n};\n\nconst imBindingKey = (extensionId: string, externalConversationId: string): string =>\n `${extensionId}:${externalConversationId}`;\n\nconst defaultBuiltinExtensionsDir = (): string =>\n findBuiltinExtensionsDir([\n runtimeModuleDir(),\n process.cwd(),\n ]);\n\nconst runtimeModuleDir = (): string => {\n if (typeof __dirname === \"string\") {\n return __dirname;\n }\n return process.argv[1] ? dirname(process.argv[1]) : process.cwd();\n};\n\nconst findBuiltinExtensionsDir = (starts: string[]): string => {\n for (const start of starts) {\n let current = resolve(start);\n while (true) {\n const candidate = join(current, \"extensions\", \"builtin\");\n if (existsSync(candidate)) {\n return candidate;\n }\n const next = dirname(current);\n if (next === current) {\n break;\n }\n current = next;\n }\n }\n return join(starts[0] ?? process.cwd(), \"extensions\", \"builtin\");\n};\n\nconst isSteerMessage = (text: string): boolean =>\n /^\\/(?:steer|interrupt)\\b/i.test(text.trim());\n\nconst stripImCommandPrefix = (text: string): string =>\n text.trim().replace(/^\\/(?:steer|interrupt)\\s*/i, \"\").trim() || text;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst parseMemoryUpdate = (raw: string): { projectMemory?: string; rootMemory?: string } | undefined => {\n const text = raw.trim().replace(/^```(?:json)?\\s*/i, \"\").replace(/\\s*```$/, \"\").trim();\n if (!text) {\n return undefined;\n }\n const parsed = JSON.parse(text) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return undefined;\n }\n const record = parsed as Record<string, unknown>;\n return {\n ...(typeof record.projectMemory === \"string\" && record.projectMemory.trim() ? { projectMemory: record.projectMemory.trim() } : {}),\n ...(typeof record.rootMemory === \"string\" && record.rootMemory.trim() ? { rootMemory: record.rootMemory.trim() } : {}),\n };\n};\n\nconst normalizeMarkdownFile = (value: string): string => `${value.trimEnd()}\\n`;\n\nconst sanitizeSessionTitle = (value: string): string => {\n const title = value\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find(Boolean)\n ?.replace(/^[\"'`\u201C\u201D\u2018\u2019]+|[\"'`\u201C\u201D\u2018\u2019]+$/g, \"\")\n .replace(/[.!?\u3002\uFF01\uFF1F]+$/g, \"\")\n .trim();\n if (!title) {\n return \"\";\n }\n return title.slice(0, 80);\n};\n\nconst shortStack = (error: Error): string | undefined => error.stack?.split(\"\\n\").slice(0, 3).join(\" | \");\n\nconst formatDiagnosticLine = (fields: Record<string, unknown>): string =>\n Object.entries(fields)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${key}=${formatDiagnosticValue(value)}`)\n .join(\" \");\n\nconst formatDiagnosticValue = (value: unknown): string => {\n const text = typeof value === \"string\" ? value : String(value);\n return /^[A-Za-z0-9_./:@+-]+$/.test(text) ? text : JSON.stringify(text);\n};\n", "import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { loadOrCreateHostDeviceIdentity, redeemRelayPair } from \"@scorel/daemon\";\n\nexport const DEFAULT_SCOREL_RELAY_URL = \"wss://scorel-relay.chanler.dev\";\nexport const DEFAULT_SCOREL_WEBUI_URL = \"https://scorel.chanler.dev\";\n\nexport type PairCommandOptions = {\n stateDir?: string;\n output: NodeJS.WritableStream;\n error: NodeJS.WritableStream;\n env?: NodeJS.ProcessEnv;\n};\n\nconst defaultStateDir = (): string => join(homedir(), \".scorel\");\n\nexport const runCliPair = async (\n argv: string[],\n options: PairCommandOptions,\n): Promise<number> => {\n let flags: { pairCode: string; relayUrl: string };\n try {\n flags = parsePairFlags(argv, options.env ?? process.env);\n } catch (cause) {\n options.error.write(`scorel pair error: ${(cause as Error).message}\\n`);\n writePairUsage(options.error);\n return 1;\n }\n const stateDir = options.stateDir ?? defaultStateDir();\n const identity = await loadOrCreateHostDeviceIdentity({ stateDir });\n try {\n const result = await redeemRelayPair({\n relayUrl: flags.relayUrl,\n pairCode: flags.pairCode,\n deviceId: identity.deviceId,\n label: identity.displayName,\n stateDir,\n });\n options.output.write(`scorel pair authorized client=${result.clientId} device=${identity.deviceId}\\n`);\n return 0;\n } catch (cause) {\n options.error.write(`scorel pair error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n }\n};\n\nexport const resolveDefaultRelayUrl = (env: NodeJS.ProcessEnv = process.env): string =>\n env.SCOREL_RELAY_URL?.trim() || DEFAULT_SCOREL_RELAY_URL;\n\nconst parsePairFlags = (argv: string[], env: NodeJS.ProcessEnv): { pairCode: string; relayUrl: string } => {\n const pairCode = argv[0];\n if (!pairCode || pairCode.startsWith(\"-\")) {\n throw new Error(\"pair code is required\");\n }\n let relayUrl = resolveDefaultRelayUrl(env);\n for (let index = 1; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--relay\") {\n relayUrl = requireValue(argv, index, \"--relay\");\n index += 1;\n continue;\n }\n throw new Error(`Unknown pair option: ${arg}`);\n }\n return { pairCode, relayUrl };\n};\n\nconst requireValue = (argv: string[], index: number, flag: string): string => {\n const value = argv[index + 1];\n if (!value) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n};\n\nconst writePairUsage = (output: NodeJS.WritableStream): void => {\n output.write(\"Usage: scorel pair <pair-code> [--relay <relay-url>]\\n\");\n};\n", "import { execFile as execFileCallback } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { promisify } from \"node:util\";\n\nexport const SCOREL_PACKAGE_NAME = \"@chanlerdev/scorel\";\nexport const AUTO_UPDATE_INTERVAL_MS = 60 * 60 * 1000;\nexport const ACTIVE_WORK_STALE_MS = 3 * 60 * 60 * 1000;\n\nconst execFileAsync = promisify(execFileCallback);\n\nexport type ExecFile = (command: string, argv: string[]) => Promise<{ stdout: string; stderr: string }>;\n\nexport type PackageUpdateResult =\n | { status: \"current\"; currentVersion: string; latestVersion: string }\n | { status: \"updated\"; currentVersion: string; latestVersion: string };\n\nexport type PackageUpdater = {\n checkLatest(): Promise<string>;\n update(): Promise<PackageUpdateResult>;\n};\n\nexport type AutoUpdateActivity = {\n activeWork: boolean;\n lastActiveWorkAt: number;\n now: number;\n};\n\nexport const compareSemver = (a: string, b: string): number => {\n const left = parseSemver(a);\n const right = parseSemver(b);\n for (let index = 0; index < 3; index += 1) {\n const delta = left[index] - right[index];\n if (delta !== 0) return delta;\n }\n return 0;\n};\n\nexport const shouldRunAutoUpdate = (activity: AutoUpdateActivity): boolean =>\n !activity.activeWork || activity.now - activity.lastActiveWorkAt >= ACTIVE_WORK_STALE_MS;\n\nexport const createNpmPackageUpdater = (options: {\n packageName?: string;\n currentVersion: string;\n execFile?: ExecFile;\n}): PackageUpdater => {\n const packageName = options.packageName ?? SCOREL_PACKAGE_NAME;\n const execFile = options.execFile ?? ((command, argv) => execFileAsync(command, argv));\n return {\n async checkLatest() {\n const result = await execFile(\"npm\", [\"view\", packageName, \"version\"]);\n const latest = result.stdout.trim();\n if (!latest) {\n throw new Error(`npm did not return a latest version for ${packageName}`);\n }\n parseSemver(latest);\n return latest;\n },\n async update() {\n const latestVersion = await this.checkLatest();\n if (compareSemver(options.currentVersion, latestVersion) >= 0) {\n return { status: \"current\", currentVersion: options.currentVersion, latestVersion };\n }\n await execFile(\"npm\", [\"install\", \"-g\", `${packageName}@${latestVersion}`]);\n return { status: \"updated\", currentVersion: options.currentVersion, latestVersion };\n },\n };\n};\n\nexport const readInstalledScorelVersion = async (): Promise<string> => {\n const here = dirname(fileURLToPath(import.meta.url));\n for (const candidate of [\n join(here, \"..\", \"package.json\"),\n join(here, \"..\", \"..\", \"package.json\"),\n join(process.cwd(), \"package.json\"),\n ]) {\n try {\n const parsed = JSON.parse(await readFile(candidate, \"utf8\")) as { name?: string; version?: string };\n if (typeof parsed.version === \"string\" && (parsed.name === SCOREL_PACKAGE_NAME || parsed.name === \"@scorel/app-cli\")) {\n return parsed.version;\n }\n } catch {\n // Try the next likely package root.\n }\n }\n return \"0.0.0\";\n};\n\nexport const runCliUpdate = async (\n argv: string[],\n io: { output: NodeJS.WritableStream; error: NodeJS.WritableStream },\n options: { currentVersion?: string; updater?: PackageUpdater } = {},\n): Promise<number> => {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n writeUpdateUsage(io.output);\n return 0;\n }\n if (argv.length > 0) {\n writeUpdateUsage(io.error);\n return 1;\n }\n const currentVersion = options.currentVersion ?? await readInstalledScorelVersion();\n const updater = options.updater ?? createNpmPackageUpdater({ currentVersion });\n try {\n const result = await updater.update();\n if (result.status === \"current\") {\n io.output.write(`scorel is current (${result.currentVersion})\\n`);\n } else {\n io.output.write(`updated scorel ${result.currentVersion} -> ${result.latestVersion}\\n`);\n }\n return 0;\n } catch (cause) {\n io.error.write(`scorel update error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n }\n};\n\nexport const writeUpdateUsage = (output: NodeJS.WritableStream): void => {\n output.write(\"Usage: scorel update\\n scorel upgrade\\n\");\n};\n\nconst parseSemver = (version: string): [number, number, number] => {\n const match = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+].*)?$/.exec(version);\n if (!match) {\n throw new Error(`Invalid semver version: ${version}`);\n }\n return [Number(match[1]), Number(match[2]), Number(match[3])];\n};\n", "import { randomUUID } from \"node:crypto\";\nimport { spawn, type ChildProcess, type SpawnOptions } from \"node:child_process\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n ScorelHost,\n createLocalDaemonState,\n createRealRuntime,\n daemonStateLiveness,\n loadOrCreateHostDeviceIdentity,\n loadScorelConfig,\n loadScorelConfigProfile,\n markDaemonStopped,\n readLocalDaemonState,\n removeLocalDaemonState,\n scorelSessionsDir,\n startHostRelayClient,\n startScorelHostWebSocketServer,\n type DaemonStateLiveness,\n type HostRelayClient,\n type LocalDaemonState,\n} from \"@scorel/daemon\";\n\nimport { DEFAULT_SCOREL_WEBUI_URL, resolveDefaultRelayUrl } from \"./relay-cli.js\";\nimport {\n AUTO_UPDATE_INTERVAL_MS,\n createNpmPackageUpdater,\n readInstalledScorelVersion,\n shouldRunAutoUpdate,\n type PackageUpdater,\n} from \"./update-cli.js\";\n\nexport type DaemonCommandIo = {\n output: NodeJS.WritableStream;\n error: NodeJS.WritableStream;\n};\n\nexport type DaemonCommandOptions = DaemonCommandIo & {\n stateDir?: string;\n sessionsDir?: string;\n cwd?: string;\n /**\n * Optional override for `serve` shutdown so tests don't have to wire up\n * real OS signals. When set, the embedded daemon stops as soon as the\n * signal aborts.\n */\n serveSignal?: AbortSignal;\n env?: NodeJS.ProcessEnv;\n spawn?: (command: string, argv: string[], opts: SpawnOptions) => ChildProcess;\n cliEntrypoint?: string;\n daemonReadyTimeoutMs?: number;\n readState?: (stateDir: string) => Promise<LocalDaemonState | null>;\n packageUpdater?: PackageUpdater;\n autoUpdateIntervalMs?: number;\n};\n\nconst DEFAULT_HOST = \"127.0.0.1\";\nconst DEFAULT_PORT = 7777;\nconst STOP_POLL_INTERVAL_MS = 200;\nconst STOP_GRACE_MS = 5000;\nconst START_READY_TIMEOUT_MS = 30_000;\nexport const AUTO_STARTED_IDLE_SHUTDOWN_MS = 15 * 60 * 1000;\nconst FOREGROUND_IDLE_SHUTDOWN_MS = 0;\n\nconst defaultStateDir = (): string => join(homedir(), \".scorel\");\n\nconst isLoopbackHost = (host: string): boolean =>\n host === \"127.0.0.1\" || host === \"::1\" || host === \"localhost\";\n\nconst formatTimestamp = (epochMs: number): string => new Date(epochMs).toISOString();\n\nexport const runCliDaemon = async (\n argv: string[],\n options: DaemonCommandOptions,\n): Promise<number> => {\n const [command, ...rest] = argv;\n const stateDir = options.stateDir ?? defaultStateDir();\n switch (command) {\n case \"start\":\n return runStartCommand(rest, { ...options, stateDir });\n case \"serve\":\n return runServeCommand(rest, { ...options, stateDir });\n case \"status\":\n return runStatusCommand(rest, { ...options, stateDir });\n case \"stop\":\n return runStopCommand(rest, { ...options, stateDir });\n case \"reset\":\n return runResetCommand({ ...options, stateDir });\n case \"--help\":\n case \"-h\":\n writeDaemonUsage(options.output);\n return 0;\n default:\n writeDaemonUsage(options.error);\n return 1;\n }\n};\n\nconst runStartCommand = async (\n argv: string[],\n options: DaemonCommandOptions & { stateDir: string },\n): Promise<number> => {\n let flags: ServeFlags;\n try {\n flags = parseServeFlags(argv, options.cwd ?? process.cwd(), options.env ?? process.env, FOREGROUND_IDLE_SHUTDOWN_MS);\n } catch (cause) {\n options.error.write(`scorel daemon start error: ${(cause as Error).message}\\n`);\n return 1;\n }\n\n const readState = options.readState ?? ((stateDir: string) => readLocalDaemonState({ stateDir }));\n const existing = await readState(options.stateDir);\n if (existing && daemonStateLiveness(existing) === \"running\") {\n options.output.write(`scorel host already running url=${existing.wsUrl} pid=${existing.pid}\\n`);\n return 0;\n }\n\n const cliEntrypoint = options.cliEntrypoint ?? fileURLToPath(import.meta.url).replace(/daemon-cli\\.ts$/, \"index.ts\");\n const child = (options.spawn ?? spawn)(process.execPath, [\n ...nodeEntrypointArgs(cliEntrypoint),\n \"host\",\n \"serve\",\n \"--host\",\n flags.host,\n \"--port\",\n String(flags.port),\n \"--cwd\",\n flags.cwd,\n \"--idle-timeout-ms\",\n String(flags.idleShutdownMs),\n ...(flags.token ? [\"--token\", flags.token] : []),\n ...(flags.relayUrl ? [\"--relay\", flags.relayUrl] : [\"--no-relay\"]),\n ...(flags.replace ? [\"--replace\"] : []),\n ], {\n cwd: dirname(cliEntrypoint),\n env: { ...process.env, ...(options.env ?? {}) },\n detached: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n try {\n await waitForDaemonReady(child, options.daemonReadyTimeoutMs ?? START_READY_TIMEOUT_MS);\n } catch (cause) {\n options.error.write(`scorel daemon start error: ${(cause as Error).message}\\n`);\n child.kill(\"SIGTERM\");\n return 1;\n }\n\n const state = await readState(options.stateDir);\n if (!state || daemonStateLiveness(state) !== \"running\") {\n options.error.write(\"scorel daemon start error: daemon state missing after start\\n\");\n child.kill(\"SIGTERM\");\n return 1;\n }\n detachBackgroundDaemon(child);\n options.output.write(`scorel host started url=${state.wsUrl} pid=${state.pid}\\n`);\n return 0;\n};\n\ntype ServeFlags = {\n host: string;\n port: number;\n token?: string;\n cwd: string;\n relayUrl?: string;\n replace: boolean;\n idleShutdownMs: number;\n};\n\nconst runServeCommand = async (\n argv: string[],\n options: DaemonCommandOptions & { stateDir: string },\n): Promise<number> => {\n let flags: ServeFlags;\n try {\n flags = parseServeFlags(argv, options.cwd ?? process.cwd(), options.env ?? process.env, FOREGROUND_IDLE_SHUTDOWN_MS);\n } catch (cause) {\n options.error.write(`scorel daemon serve error: ${(cause as Error).message}\\n`);\n return 1;\n }\n\n const existing = await readLocalDaemonState({ stateDir: options.stateDir });\n if (existing) {\n const liveness = daemonStateLiveness(existing);\n if (liveness === \"running\") {\n if (flags.replace) {\n await stopRunningDaemon(existing, options);\n } else {\n options.error.write(\n `scorel host already running pid=${existing.pid} url=${existing.wsUrl}\\nUse --replace to stop it and start a new one.\\n`,\n );\n return 1;\n }\n }\n }\n\n const token = flags.token ?? existing?.token ?? randomUUID();\n const identity = await loadOrCreateHostDeviceIdentity({ stateDir: options.stateDir });\n const configScope = { scorelHomeDir: options.stateDir };\n let signalReason: string = \"natural\";\n let resolveStopWaiter: (() => void) | undefined;\n let stopRequested = false;\n const requestStop = (reason: string): void => {\n signalReason = reason;\n stopRequested = true;\n resolveStopWaiter?.();\n };\n const sessionsDir = options.sessionsDir ?? scorelSessionsDir(homedir());\n const daemon = new ScorelHost({\n sessionsDir,\n projectsPath: join(options.stateDir, \"projects.json\"),\n deviceId: identity.deviceId,\n deviceDisplayName: identity.displayName,\n idleShutdownMs: flags.idleShutdownMs,\n onIdleShutdown: () => requestStop(\"idle\"),\n scorelHomeDir: options.stateDir,\n loadConfig: async ({ project }) => loadScorelConfig({ cwd: project.workDir, ...configScope }),\n loadConfigProfile: async ({ project }) => loadScorelConfigProfile({ cwd: project.workDir, ...configScope }),\n createRuntime: async ({ sessionId, project, selectedModel, purpose }) => createRealRuntime({\n cwd: project.workDir,\n config: await loadScorelConfig({ cwd: project.workDir, ...configScope }),\n sessionsDir,\n sessionId,\n modelSelection: selectedModel ? { modelId: selectedModel.modelId, role: selectedModel.role } : undefined,\n includeTools: purpose === \"chat\",\n }),\n });\n await daemon.start();\n await daemon.registerProject(flags.cwd);\n const autoUpdater = await startAutoUpdateLoop({\n host: daemon,\n requestStop,\n output: options.output,\n error: options.error,\n updater: options.packageUpdater,\n intervalMs: options.autoUpdateIntervalMs ?? AUTO_UPDATE_INTERVAL_MS,\n });\n\n const server = await startScorelHostWebSocketServer({\n hostService: daemon,\n host: flags.host,\n port: flags.port,\n token,\n });\n\n const startedAt = Date.now();\n // Persist with the actual bound port (server.port reflects 0 \u2192 ephemeral\n // assignment) so `status` and clients always see the truth.\n const persistedState: LocalDaemonState = {\n host: flags.host,\n port: server.port,\n wsUrl: server.url,\n token,\n pid: process.pid,\n startedAt,\n stoppedAt: null,\n };\n await createLocalDaemonState({ stateDir: options.stateDir, ...persistedState });\n\n options.output.write(`scorel host serving url=${server.url}\\n`);\n options.output.write(`scorel host initial project cwd=${flags.cwd}\\n`);\n let relayClient: HostRelayClient | undefined;\n if (flags.relayUrl) {\n relayClient = await startHostRelayClient({\n relayUrl: flags.relayUrl,\n hostService: daemon,\n deviceId: identity.deviceId,\n deviceDisplayName: identity.displayName,\n stateDir: options.stateDir,\n onDiagnostic: (type) => {\n if (type === \"relay_host_connected\") {\n options.output.write(`scorel host relay connected url=${flags.relayUrl} device=${identity.deviceId}\\n`);\n options.output.write(`scorel hosted webui ${DEFAULT_SCOREL_WEBUI_URL}\\n`);\n }\n if (type === \"relay_host_reconnecting\") {\n options.output.write(`scorel host relay reconnecting url=${flags.relayUrl} device=${identity.deviceId}\\n`);\n }\n },\n });\n }\n\n const shutdown = async (): Promise<void> => {\n try {\n autoUpdater.stop();\n relayClient?.close();\n await server.close();\n } finally {\n await daemon.shutdown();\n await markDaemonStopped({ stateDir: options.stateDir, stoppedAt: Date.now() });\n }\n };\n\n const signalHandlers = new Map<NodeJS.Signals, () => void>();\n const stopWaiter = new Promise<void>((resolve) => {\n resolveStopWaiter = resolve;\n if (stopRequested) {\n resolve();\n return;\n }\n if (options.serveSignal) {\n if (options.serveSignal.aborted) {\n requestStop(\"abort\");\n return;\n }\n options.serveSignal.addEventListener(\n \"abort\",\n () => {\n requestStop(\"abort\");\n },\n { once: true },\n );\n return;\n }\n const installSignal = (signal: NodeJS.Signals) => {\n const handler = () => {\n requestStop(signal);\n };\n signalHandlers.set(signal, handler);\n process.once(signal, handler);\n };\n installSignal(\"SIGINT\");\n installSignal(\"SIGTERM\");\n });\n\n try {\n await stopWaiter;\n } finally {\n for (const [signal, handler] of signalHandlers) {\n process.off(signal, handler);\n }\n await shutdown();\n }\n\n options.output.write(`scorel host serve stopped reason=${signalReason}\\n`);\n return 0;\n};\n\nconst startAutoUpdateLoop = async (options: {\n host: ScorelHost;\n requestStop: (reason: string) => void;\n output: NodeJS.WritableStream;\n error: NodeJS.WritableStream;\n updater?: PackageUpdater;\n intervalMs: number;\n}): Promise<{ stop(): void }> => {\n const updater = options.updater ?? createNpmPackageUpdater({ currentVersion: await readInstalledScorelVersion() });\n let timer: ReturnType<typeof setInterval> | undefined;\n let running = false;\n const tick = async () => {\n if (running) return;\n running = true;\n try {\n const activity = options.host.activityStatus();\n if (!shouldRunAutoUpdate({ ...activity, now: Date.now() })) {\n return;\n }\n const result = await updater.update();\n if (result.status === \"updated\") {\n options.output.write(`scorel auto-updated ${result.currentVersion} -> ${result.latestVersion}; restarting host\\n`);\n options.requestStop(\"auto-update\");\n }\n } catch (cause) {\n options.error.write(`scorel auto-update error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n } finally {\n running = false;\n }\n };\n timer = setInterval(() => void tick(), options.intervalMs);\n timer.unref?.();\n return {\n stop() {\n if (timer) {\n clearInterval(timer);\n timer = undefined;\n }\n },\n };\n};\n\nconst stopRunningDaemon = async (\n state: LocalDaemonState,\n options: DaemonCommandOptions & { stateDir: string },\n): Promise<void> => {\n try {\n process.kill(state.pid, \"SIGTERM\");\n } catch {\n return;\n }\n const deadline = Date.now() + STOP_GRACE_MS;\n while (Date.now() < deadline) {\n await sleep(STOP_POLL_INTERVAL_MS);\n const refreshed = await readLocalDaemonState({ stateDir: options.stateDir });\n if (!refreshed || refreshed.stoppedAt !== null || daemonStateLiveness(refreshed) !== \"running\") {\n return;\n }\n }\n try {\n process.kill(state.pid, \"SIGKILL\");\n } catch {\n // The process may have exited after the grace timeout.\n }\n};\n\ntype StatusFlags = {\n showToken: boolean;\n};\n\nconst runStatusCommand = async (\n argv: string[],\n options: DaemonCommandOptions & { stateDir: string },\n): Promise<number> => {\n let flags: StatusFlags;\n try {\n flags = parseStatusFlags(argv);\n } catch (cause) {\n options.error.write(`scorel daemon status error: ${(cause as Error).message}\\n`);\n return 1;\n }\n const state = await readLocalDaemonState({ stateDir: options.stateDir });\n if (!state) {\n options.error.write(\"scorel daemon not configured\\n\");\n return 1;\n }\n const liveness = daemonStateLiveness(state);\n options.output.write(`${formatStatusLine(state, liveness, flags.showToken)}\\n`);\n return 0;\n};\n\nconst runStopCommand = async (\n _argv: string[],\n options: DaemonCommandOptions & { stateDir: string },\n): Promise<number> => {\n const state = await readLocalDaemonState({ stateDir: options.stateDir });\n if (!state) {\n options.error.write(\"scorel daemon not configured\\n\");\n return 1;\n }\n const liveness = daemonStateLiveness(state);\n if (liveness !== \"running\") {\n options.output.write(\n `scorel daemon already stopped pid=${state.pid} liveness=${liveness}\\n`,\n );\n return 0;\n }\n try {\n process.kill(state.pid, \"SIGTERM\");\n } catch (cause) {\n options.error.write(\n `scorel daemon stop error: ${cause instanceof Error ? cause.message : String(cause)}\\n`,\n );\n return 1;\n }\n // Wait for graceful shutdown to flip stoppedAt; force-kill after 5s.\n const deadline = Date.now() + STOP_GRACE_MS;\n while (Date.now() < deadline) {\n await sleep(STOP_POLL_INTERVAL_MS);\n const refreshed = await readLocalDaemonState({ stateDir: options.stateDir });\n if (!refreshed) {\n break;\n }\n if (refreshed.stoppedAt !== null) {\n options.output.write(`scorel daemon stopped pid=${refreshed.pid}\\n`);\n return 0;\n }\n const refreshedLiveness = daemonStateLiveness(refreshed);\n if (refreshedLiveness !== \"running\") {\n options.output.write(\n `scorel daemon stopped pid=${refreshed.pid} liveness=${refreshedLiveness}\\n`,\n );\n return 0;\n }\n }\n try {\n process.kill(state.pid, \"SIGKILL\");\n } catch {\n // Process may have exited between SIGTERM and the timeout.\n }\n options.output.write(`scorel daemon stopped pid=${state.pid} via=SIGKILL\\n`);\n return 0;\n};\n\nconst runResetCommand = async (\n options: DaemonCommandOptions & { stateDir: string },\n): Promise<number> => {\n await removeLocalDaemonState({ stateDir: options.stateDir });\n options.output.write(\"scorel daemon state reset; next serve will generate a new token\\n\");\n return 0;\n};\n\nconst formatStatusLine = (\n state: LocalDaemonState,\n liveness: DaemonStateLiveness,\n showToken: boolean,\n): string => {\n if (liveness === \"running\") {\n const tokenSuffix = isLoopbackHost(state.host) || showToken ? ` token=${state.token}` : \"\";\n return `running url=${state.wsUrl} pid=${state.pid}${tokenSuffix}`;\n }\n const stoppedAt =\n state.stoppedAt !== null ? formatTimestamp(state.stoppedAt) : \"unknown\";\n return `stopped url=${state.wsUrl} last-pid=${state.pid} stoppedAt=${stoppedAt} liveness=${liveness}`;\n};\n\nconst parseServeFlags = (argv: string[], defaultCwd: string, env: NodeJS.ProcessEnv, defaultIdleShutdownMs: number): ServeFlags => {\n let host = DEFAULT_HOST;\n let port = DEFAULT_PORT;\n let cwd = defaultCwd;\n let token: string | undefined;\n let relayUrl: string | undefined = resolveDefaultRelayUrl(env);\n let replace = false;\n let idleShutdownMs = defaultIdleShutdownMs;\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--host\") {\n host = requireValue(argv, index, \"--host\");\n index += 1;\n continue;\n }\n if (arg === \"--port\") {\n port = Number(requireValue(argv, index, \"--port\"));\n if (!Number.isInteger(port) || port < 0 || port > 65535) {\n throw new Error(\"--port must be an integer from 0 to 65535\");\n }\n index += 1;\n continue;\n }\n if (arg === \"--token\") {\n token = requireValue(argv, index, \"--token\");\n index += 1;\n continue;\n }\n if (arg === \"--cwd\") {\n cwd = requireValue(argv, index, \"--cwd\");\n index += 1;\n continue;\n }\n if (arg === \"--project\" || arg === \"--bootstrap-project\") {\n cwd = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n if (arg === \"--relay\") {\n relayUrl = requireValue(argv, index, \"--relay\");\n index += 1;\n continue;\n }\n if (arg === \"--no-relay\") {\n relayUrl = undefined;\n continue;\n }\n if (arg === \"--replace\") {\n replace = true;\n continue;\n }\n if (arg === \"--idle-timeout-ms\") {\n idleShutdownMs = Number(requireValue(argv, index, \"--idle-timeout-ms\"));\n if (!Number.isInteger(idleShutdownMs) || idleShutdownMs < 0) {\n throw new Error(\"--idle-timeout-ms must be a non-negative integer\");\n }\n index += 1;\n continue;\n }\n throw new Error(`Unknown serve option: ${arg}`);\n }\n return { host, port, token, cwd, relayUrl, replace, idleShutdownMs };\n};\n\nconst parseStatusFlags = (argv: string[]): StatusFlags => {\n let showToken = false;\n for (const arg of argv) {\n if (arg === \"--show-token\") {\n showToken = true;\n continue;\n }\n throw new Error(`Unknown status option: ${arg}`);\n }\n return { showToken };\n};\n\nconst requireValue = (argv: string[], index: number, flag: string): string => {\n const value = argv[index + 1];\n if (!value) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n};\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\nconst waitForDaemonReady = (child: ChildProcess, timeoutMs: number): Promise<void> =>\n new Promise((resolveReady, rejectReady) => {\n if (!child.stdout) {\n rejectReady(new Error(\"daemon child has no stdout stream\"));\n return;\n }\n let buffer = \"\";\n let stderrBuffer = \"\";\n let settled = false;\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n cleanup();\n rejectReady(new Error(\"timed out waiting for daemon ready line\"));\n }, timeoutMs);\n const onData = (chunk: Buffer | string) => {\n buffer += chunk.toString();\n if (!buffer.includes(\"\\n\")) return;\n if (buffer.includes(\"scorel daemon serving url=\") || buffer.includes(\"scorel host serving url=\")) {\n if (settled) return;\n settled = true;\n cleanup();\n resolveReady();\n }\n const newlineIndex = buffer.lastIndexOf(\"\\n\");\n buffer = newlineIndex >= 0 ? buffer.slice(newlineIndex + 1) : buffer;\n };\n const onStderr = (chunk: Buffer | string) => {\n stderrBuffer += chunk.toString();\n };\n const onExit = (code: number | null) => {\n if (settled) return;\n settled = true;\n cleanup();\n const trimmed = stderrBuffer.trim();\n const detail = trimmed ? `: ${trimmed}` : \"\";\n rejectReady(new Error(`daemon exited before ready code=${code}${detail}`));\n };\n const cleanup = () => {\n clearTimeout(timer);\n child.stdout?.off(\"data\", onData);\n child.stderr?.off(\"data\", onStderr);\n child.off(\"exit\", onExit);\n };\n child.stdout.on(\"data\", onData);\n child.stderr?.on(\"data\", onStderr);\n child.once(\"exit\", onExit);\n });\n\nconst detachBackgroundDaemon = (child: ChildProcess): void => {\n child.stdout?.destroy();\n child.stderr?.destroy();\n child.unref();\n};\n\nconst nodeEntrypointArgs = (entrypoint: string): string[] =>\n entrypoint.endsWith(\".ts\") ? [\"--import\", \"tsx\", entrypoint] : [entrypoint];\n\nconst writeDaemonUsage = (output: NodeJS.WritableStream): void => {\n output.write(\n [\n \"Usage: scorel host serve [--host <h>] [--port <p>] [--token <t>] [--project <dir>]\",\n \" [--relay <relay-url> | --no-relay] [--replace] [--idle-timeout-ms <ms>]\",\n \" scorel host start [--host <h>] [--port <p>] [--token <t>] [--project <dir>]\",\n \" [--relay <relay-url> | --no-relay] [--replace] [--idle-timeout-ms <ms>]\",\n \" scorel host status [--show-token]\",\n \" scorel host stop\",\n \" scorel host reset\",\n \" scorel daemon ... # pre-1.0 alias\",\n ].join(\"\\n\") + \"\\n\",\n );\n};\n", "export type RelayDiagnosticEvent = {\n type: string;\n ts: number;\n data: Record<string, unknown>;\n};\n\nexport type RelayDiagnostics = {\n record(type: string, data?: Record<string, unknown>): void;\n};\n\nexport class MemoryRelayDiagnostics implements RelayDiagnostics {\n readonly events: RelayDiagnosticEvent[] = [];\n readonly #now: () => number;\n\n constructor(options: { now?: () => number } = {}) {\n this.#now = options.now ?? Date.now;\n }\n\n record(type: string, data: Record<string, unknown> = {}): void {\n this.events.push({ type, ts: this.#now(), data: sanitizeDiagnosticData(data) });\n }\n}\n\nexport const createConsoleRelayDiagnostics = (): RelayDiagnostics => ({\n record(type, data = {}) {\n // Payload bodies are intentionally excluded by callers; this guard keeps\n // diagnostics useful if a future caller passes a full frame by mistake.\n console.log(JSON.stringify({ type, ts: Date.now(), data: sanitizeDiagnosticData(data) }));\n },\n});\n\nconst forbiddenKeys = new Set([\"payload\", \"content\", \"message\", \"prompt\", \"result\", \"data\"]);\n\nconst sanitizeDiagnosticData = (input: Record<string, unknown>): Record<string, unknown> => {\n const output: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(input)) {\n output[key] = forbiddenKeys.has(key) ? \"[redacted]\" : value;\n }\n return output;\n};\n", "import { randomInt } from \"node:crypto\";\n\nimport type { ClientId } from \"@scorel/protocol\";\n\nexport type PairSession = {\n pairCode: string;\n clientId: ClientId;\n expiresAt: number;\n};\n\nexport class RelayPairing {\n readonly #sessions = new Map<string, PairSession>();\n readonly #ttlMs: number;\n readonly #now: () => number;\n readonly #createPairCode: () => string;\n\n constructor(options: { ttlMs?: number; now?: () => number; createPairCode?: () => string } = {}) {\n this.#ttlMs = options.ttlMs ?? 5 * 60_000;\n this.#now = options.now ?? Date.now;\n this.#createPairCode = options.createPairCode ?? defaultPairCode;\n }\n\n create(clientId: ClientId): PairSession {\n this.#pruneExpired();\n let pairCode = this.#createPairCode();\n while (this.#sessions.has(pairCode)) {\n pairCode = this.#createPairCode();\n }\n const session = { pairCode, clientId, expiresAt: this.#now() + this.#ttlMs };\n this.#sessions.set(pairCode, session);\n return session;\n }\n\n consume(pairCode: string): { ok: true; clientId: ClientId } | { ok: false; reason: \"not_found\" | \"expired\" } {\n const session = this.#sessions.get(pairCode);\n if (!session) {\n return { ok: false, reason: \"not_found\" };\n }\n this.#sessions.delete(pairCode);\n if (session.expiresAt <= this.#now()) {\n return { ok: false, reason: \"expired\" };\n }\n return { ok: true, clientId: session.clientId };\n }\n\n #pruneExpired(): void {\n const now = this.#now();\n for (const [pairCode, session] of this.#sessions) {\n if (session.expiresAt <= now) {\n this.#sessions.delete(pairCode);\n }\n }\n }\n}\n\nconst defaultPairCode = (): string => `${randomInt(100_000, 1_000_000)}`;\n", "import type { ClientId, DeviceId } from \"@scorel/protocol\";\nimport type { WebSocket } from \"ws\";\n\nexport class RelayPresence {\n readonly #devices = new Map<DeviceId, Set<WebSocket>>();\n readonly #clients = new Map<ClientId, Set<WebSocket>>();\n\n setDevice(deviceId: DeviceId, socket: WebSocket): void {\n let sockets = this.#devices.get(deviceId);\n if (!sockets) {\n sockets = new Set();\n this.#devices.set(deviceId, sockets);\n }\n sockets.add(socket);\n socket.once(\"close\", () => {\n sockets.delete(socket);\n if (sockets.size === 0) {\n this.#devices.delete(deviceId);\n }\n });\n }\n\n addClient(clientId: ClientId, socket: WebSocket): void {\n let sockets = this.#clients.get(clientId);\n if (!sockets) {\n sockets = new Set();\n this.#clients.set(clientId, sockets);\n }\n sockets.add(socket);\n socket.once(\"close\", () => {\n sockets.delete(socket);\n if (sockets.size === 0) {\n this.#clients.delete(clientId);\n }\n });\n }\n\n deviceSocket(deviceId: DeviceId): WebSocket | undefined {\n const sockets = this.#devices.get(deviceId) ?? new Set<WebSocket>();\n return [...sockets].find((socket) => socket.readyState === socket.OPEN);\n }\n\n clientSockets(clientId: ClientId): WebSocket[] {\n return [...(this.#clients.get(clientId) ?? [])].filter((socket) => socket.readyState === socket.OPEN);\n }\n\n isDeviceOnline(deviceId: DeviceId): boolean {\n return this.deviceSocket(deviceId) !== undefined;\n }\n}\n", "import type { ClientId, DaemonMessage, DeviceId, RelayClientPayload, RelayToEntryFrame, RelayToHostFrame } from \"@scorel/protocol\";\nimport type { WebSocket } from \"ws\";\n\nimport type { RelayDiagnostics } from \"./diagnostics.js\";\nimport type { RelayPresence } from \"./presence.js\";\nimport type { RelayStore } from \"./store.js\";\n\nexport type RelayRouteResult =\n | { ok: true }\n | { ok: false; code: \"unauthorized\" | \"device_offline\" | \"client_offline\"; message: string };\n\nexport const routeEntryToDevice = async (\n input: {\n store: RelayStore;\n presence: RelayPresence;\n diagnostics: RelayDiagnostics;\n clientId: ClientId;\n deviceId: DeviceId;\n payload: RelayClientPayload;\n },\n): Promise<RelayRouteResult> => {\n if (!(await input.store.isBound({ clientId: input.clientId, deviceId: input.deviceId }))) {\n input.diagnostics.record(\"entry_route_rejected\", {\n clientId: input.clientId,\n deviceId: input.deviceId,\n reason: \"unauthorized\",\n });\n return { ok: false, code: \"unauthorized\", message: \"entry is not authorized for device\" };\n }\n const socket = input.presence.deviceSocket(input.deviceId);\n if (!socket) {\n input.diagnostics.record(\"entry_route_rejected\", {\n clientId: input.clientId,\n deviceId: input.deviceId,\n reason: \"device_offline\",\n });\n return { ok: false, code: \"device_offline\", message: \"device is offline\" };\n }\n sendJson(socket, {\n type: \"relay_to_host\",\n clientId: input.clientId,\n payload: input.payload,\n } satisfies RelayToHostFrame);\n input.diagnostics.record(\"entry_route_forwarded\", {\n clientId: input.clientId,\n deviceId: input.deviceId,\n payloadType: input.payload.type,\n });\n return { ok: true };\n};\n\nexport const routeHostToEntry = (\n input: {\n presence: RelayPresence;\n diagnostics: RelayDiagnostics;\n deviceId: DeviceId;\n clientId: ClientId;\n payload: DaemonMessage;\n },\n): RelayRouteResult => {\n const sockets = input.presence.clientSockets(input.clientId);\n if (sockets.length === 0) {\n input.diagnostics.record(\"host_route_rejected\", {\n clientId: input.clientId,\n deviceId: input.deviceId,\n reason: \"client_offline\",\n });\n return { ok: false, code: \"client_offline\", message: \"entry is offline\" };\n }\n for (const socket of sockets) {\n sendJson(socket, {\n type: \"device_to_entry\",\n deviceId: input.deviceId,\n payload: input.payload,\n } satisfies RelayToEntryFrame);\n }\n input.diagnostics.record(\"host_route_forwarded\", {\n clientId: input.clientId,\n deviceId: input.deviceId,\n payloadType: input.payload.type,\n clientSocketCount: sockets.length,\n });\n return { ok: true };\n};\n\nconst sendJson = (socket: WebSocket, value: unknown): void => {\n if (socket.readyState === socket.OPEN) {\n socket.send(JSON.stringify(value));\n }\n};\n", "import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport type {\n ClientId,\n DeviceId,\n RelayBindingRecord,\n RelayClientRecord,\n RelayDeviceRecord,\n} from \"@scorel/protocol\";\n\nexport interface RelayStore {\n upsertDevice(record: RelayDeviceRecord): Promise<void>;\n upsertClient(record: RelayClientRecord): Promise<void>;\n bind(input: { deviceId: DeviceId; clientId: ClientId }): Promise<void>;\n isBound(input: { deviceId: DeviceId; clientId: ClientId }): Promise<boolean>;\n listDevicesForClient(clientId: ClientId): Promise<RelayDeviceRecord[]>;\n}\n\ntype RelayStoreFile = {\n version: 1;\n devices: RelayDeviceRecord[];\n clients: RelayClientRecord[];\n bindings: RelayBindingRecord[];\n};\n\nexport class FileRelayStore implements RelayStore {\n readonly #filePath: string;\n readonly #now: () => number;\n #queue = Promise.resolve();\n\n constructor(options: { dataDir: string; now?: () => number }) {\n this.#filePath = join(options.dataDir, \"relay-store.json\");\n this.#now = options.now ?? Date.now;\n }\n\n async upsertDevice(record: RelayDeviceRecord): Promise<void> {\n await this.#mutate((file) => {\n const existing = file.devices.find((candidate) => candidate.deviceId === record.deviceId);\n if (existing) {\n Object.assign(existing, { ...record, createdAt: existing.createdAt, updatedAt: record.updatedAt });\n } else {\n file.devices.push(record);\n }\n });\n }\n\n async upsertClient(record: RelayClientRecord): Promise<void> {\n await this.#mutate((file) => {\n const existing = file.clients.find((candidate) => candidate.clientId === record.clientId);\n if (existing) {\n Object.assign(existing, { ...record, createdAt: existing.createdAt, updatedAt: record.updatedAt });\n } else {\n file.clients.push(record);\n }\n });\n }\n\n async bind(input: { deviceId: DeviceId; clientId: ClientId }): Promise<void> {\n await this.#mutate((file) => {\n if (!file.bindings.some((binding) => binding.deviceId === input.deviceId && binding.clientId === input.clientId)) {\n file.bindings.push({ ...input, createdAt: this.#now() });\n }\n });\n }\n\n async isBound(input: { deviceId: DeviceId; clientId: ClientId }): Promise<boolean> {\n const file = await this.#read();\n return file.bindings.some((binding) => binding.deviceId === input.deviceId && binding.clientId === input.clientId);\n }\n\n async listDevicesForClient(clientId: ClientId): Promise<RelayDeviceRecord[]> {\n const file = await this.#read();\n const deviceIds = new Set(file.bindings.filter((binding) => binding.clientId === clientId).map((binding) => binding.deviceId));\n return file.devices.filter((device) => deviceIds.has(device.deviceId));\n }\n\n async #mutate(mutator: (file: RelayStoreFile) => void): Promise<void> {\n this.#queue = this.#queue.then(async () => {\n const file = await this.#read();\n mutator(file);\n await mkdir(join(this.#filePath, \"..\"), { recursive: true });\n await writeFile(this.#filePath, `${JSON.stringify(file, null, 2)}\\n`);\n });\n await this.#queue;\n }\n\n async #read(): Promise<RelayStoreFile> {\n try {\n const raw = JSON.parse(await readFile(this.#filePath, \"utf8\")) as Partial<RelayStoreFile>;\n if (raw.version !== 1 || !Array.isArray(raw.devices) || !Array.isArray(raw.clients) || !Array.isArray(raw.bindings)) {\n return emptyStoreFile();\n }\n return {\n version: 1,\n devices: raw.devices,\n clients: raw.clients,\n bindings: raw.bindings,\n };\n } catch (cause) {\n if (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") {\n return emptyStoreFile();\n }\n throw cause;\n }\n }\n}\n\nconst emptyStoreFile = (): RelayStoreFile => ({\n version: 1,\n devices: [],\n clients: [],\n bindings: [],\n});\n", "import { WebSocketServer, type WebSocket } from \"ws\";\n\nimport {\n type ClientId,\n type DeviceId,\n type RelayEntryFrame,\n type RelayHostFrame,\n type RelayResponse,\n type RequestId,\n} from \"@scorel/protocol\";\n\nimport { createConsoleRelayDiagnostics, type RelayDiagnostics } from \"./diagnostics.js\";\nimport { RelayPairing } from \"./pairing.js\";\nimport { RelayPresence } from \"./presence.js\";\nimport { routeEntryToDevice, routeHostToEntry } from \"./routing.js\";\nimport type { RelayStore } from \"./store.js\";\n\nexport type RelayServerOptions = {\n host: string;\n port: number;\n store: RelayStore;\n diagnostics?: RelayDiagnostics;\n pairing?: RelayPairing;\n now?: () => number;\n};\n\nexport type RelayServer = {\n host: string;\n port: number;\n url: string;\n close(): Promise<void>;\n};\n\ntype SocketState = {\n clientId?: ClientId;\n deviceId?: DeviceId;\n};\n\nexport const startRelayServer = async (options: RelayServerOptions): Promise<RelayServer> => {\n const diagnostics = options.diagnostics ?? createConsoleRelayDiagnostics();\n const pairing = options.pairing ?? new RelayPairing();\n const presence = new RelayPresence();\n const socketStates = new WeakMap<WebSocket, SocketState>();\n const now = options.now ?? Date.now;\n const server = new WebSocketServer({ host: options.host, port: options.port });\n\n server.on(\"connection\", (socket) => {\n socketStates.set(socket, {});\n diagnostics.record(\"socket_connected\");\n let queue = Promise.resolve();\n\n socket.on(\"message\", (data) => {\n queue = queue.then(async () => {\n const state = socketStates.get(socket) ?? {};\n const frame = parseFrame(data);\n if (!frame) {\n sendError(socket, undefined, \"invalid_request\", \"invalid relay frame\");\n return;\n }\n if (isEntryFrame(frame)) {\n await handleEntryFrame({ frame, socket, state, store: options.store, diagnostics, pairing, presence, now });\n return;\n }\n await handleHostFrame({ frame, socket, state, store: options.store, diagnostics, pairing, presence, now });\n }).catch((cause) => {\n diagnostics.record(\"relay_internal_error\", {\n error: cause instanceof Error ? cause.message : String(cause),\n });\n sendError(socket, undefined, \"internal_error\", cause instanceof Error ? cause.message : String(cause));\n });\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.once(\"listening\", () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n\n const address = server.address();\n if (!address || typeof address === \"string\") {\n await closeWebSocketServer(server);\n throw new Error(\"relay server did not expose a TCP address\");\n }\n const host = options.host === \"0.0.0.0\" ? \"127.0.0.1\" : options.host;\n return {\n host: options.host,\n port: address.port,\n url: `ws://${host}:${address.port}`,\n close: () => closeWebSocketServer(server),\n };\n};\n\nconst handleEntryFrame = async (\n input: {\n frame: RelayEntryFrame;\n socket: WebSocket;\n state: SocketState;\n store: RelayStore;\n diagnostics: RelayDiagnostics;\n pairing: RelayPairing;\n presence: RelayPresence;\n now: () => number;\n },\n): Promise<void> => {\n switch (input.frame.type) {\n case \"entry_hello\": {\n input.state.clientId = input.frame.clientId;\n input.presence.addClient(input.frame.clientId, input.socket);\n const ts = input.now();\n await input.store.upsertClient({\n clientId: input.frame.clientId,\n label: input.frame.label,\n publicKey: input.frame.publicKey,\n createdAt: ts,\n updatedAt: ts,\n });\n input.diagnostics.record(\"entry_online\", { clientId: input.frame.clientId });\n return;\n }\n case \"create_pair_session\": {\n const clientId = input.frame.clientId ?? input.state.clientId;\n if (!clientId) {\n sendError(input.socket, input.frame.requestId, \"not_announced\", \"entry must announce clientId before pairing\");\n return;\n }\n const session = input.pairing.create(clientId);\n input.diagnostics.record(\"pair_session_created\", { clientId, pairCode: session.pairCode });\n sendResponse(input.socket, input.frame.requestId, {\n pairCode: session.pairCode,\n expiresAt: session.expiresAt,\n });\n return;\n }\n case \"list_authorized_devices\": {\n if (!input.state.clientId) {\n sendError(input.socket, input.frame.requestId, \"not_announced\", \"entry must announce clientId before listing devices\");\n return;\n }\n const devices = await input.store.listDevicesForClient(input.state.clientId);\n sendResponse(input.socket, input.frame.requestId, {\n devices: devices.map((device) => ({\n ...device,\n online: input.presence.isDeviceOnline(device.deviceId),\n })),\n });\n return;\n }\n case \"entry_to_device\": {\n if (!input.state.clientId) {\n sendError(input.socket, undefined, \"not_announced\", \"entry must announce clientId before routing\");\n return;\n }\n const result = await routeEntryToDevice({\n store: input.store,\n presence: input.presence,\n diagnostics: input.diagnostics,\n clientId: input.state.clientId,\n deviceId: input.frame.deviceId,\n payload: input.frame.payload,\n });\n if (!result.ok) {\n sendError(input.socket, \"requestId\" in input.frame.payload ? input.frame.payload.requestId : undefined, result.code, result.message);\n }\n return;\n }\n }\n};\n\nconst handleHostFrame = async (\n input: {\n frame: RelayHostFrame;\n socket: WebSocket;\n state: SocketState;\n store: RelayStore;\n diagnostics: RelayDiagnostics;\n pairing: RelayPairing;\n presence: RelayPresence;\n now: () => number;\n },\n): Promise<void> => {\n switch (input.frame.type) {\n case \"host_hello\": {\n input.state.deviceId = input.frame.deviceId;\n input.presence.setDevice(input.frame.deviceId, input.socket);\n const ts = input.now();\n await input.store.upsertDevice({\n deviceId: input.frame.deviceId,\n label: input.frame.label,\n publicKey: input.frame.publicKey,\n createdAt: ts,\n updatedAt: ts,\n });\n input.diagnostics.record(\"device_online\", { deviceId: input.frame.deviceId });\n return;\n }\n case \"redeem_pair\": {\n const result = input.pairing.consume(input.frame.pairCode);\n if (!result.ok) {\n sendError(\n input.socket,\n input.frame.requestId,\n result.reason === \"expired\" ? \"pair_expired\" : \"pair_not_found\",\n result.reason === \"expired\" ? \"pair code expired\" : \"pair code not found\",\n );\n return;\n }\n await input.store.bind({ deviceId: input.frame.deviceId, clientId: result.clientId });\n input.diagnostics.record(\"pair_session_redeemed\", {\n deviceId: input.frame.deviceId,\n clientId: result.clientId,\n });\n sendResponse(input.socket, input.frame.requestId, { clientId: result.clientId });\n return;\n }\n case \"host_to_entry\": {\n if (!input.state.deviceId) {\n sendError(input.socket, undefined, \"not_announced\", \"host must announce deviceId before routing\");\n return;\n }\n const result = routeHostToEntry({\n presence: input.presence,\n diagnostics: input.diagnostics,\n deviceId: input.state.deviceId,\n clientId: input.frame.clientId,\n payload: input.frame.payload,\n });\n if (!result.ok) {\n sendError(input.socket, undefined, result.code, result.message);\n }\n return;\n }\n }\n};\n\nconst isEntryFrame = (frame: RelayEntryFrame | RelayHostFrame): frame is RelayEntryFrame =>\n frame.type === \"entry_hello\" ||\n frame.type === \"create_pair_session\" ||\n frame.type === \"entry_to_device\" ||\n frame.type === \"list_authorized_devices\";\n\nconst parseFrame = (data: unknown): RelayEntryFrame | RelayHostFrame | null => {\n try {\n const text = Buffer.isBuffer(data) ? data.toString(\"utf8\") : String(data);\n const frame = JSON.parse(text) as { type?: unknown };\n return typeof frame.type === \"string\" ? (frame as RelayEntryFrame | RelayHostFrame) : null;\n } catch {\n return null;\n }\n};\n\nconst sendResponse = (\n socket: WebSocket,\n requestId: RequestId,\n data: Extract<RelayResponse, { ok: true }>[\"data\"],\n): void => {\n sendJson(socket, { type: \"relay_response\", requestId, ok: true, data } satisfies RelayResponse);\n};\n\nconst sendError = (\n socket: WebSocket,\n requestId: RequestId | undefined,\n code: Extract<RelayResponse, { ok: false }>[\"code\"],\n message: string,\n): void => {\n sendJson(socket, { type: \"relay_error\", requestId, ok: false, code, message } satisfies RelayResponse);\n};\n\nconst sendJson = (socket: WebSocket, value: unknown): void => {\n if (socket.readyState === socket.OPEN) {\n socket.send(JSON.stringify(value));\n }\n};\n\nconst closeWebSocketServer = (server: WebSocketServer): Promise<void> =>\n new Promise((resolve, reject) => {\n for (const client of server.clients) {\n client.close();\n }\n server.close((error) => (error ? reject(error) : resolve()));\n });\n", "import { protocolPackageName, protocolVersion } from \"@scorel/protocol\";\n\nimport { createConsoleRelayDiagnostics, MemoryRelayDiagnostics } from \"./diagnostics.js\";\nimport { RelayPairing } from \"./pairing.js\";\nimport { RelayPresence } from \"./presence.js\";\nimport { routeEntryToDevice, routeHostToEntry } from \"./routing.js\";\nimport { FileRelayStore, type RelayStore } from \"./store.js\";\nimport { startRelayServer, type RelayServer } from \"./server.js\";\n\nexport const relayPackageName = \"@scorel/relay\" as const;\nexport const relayProtocolDependency = protocolPackageName;\nexport const relayProtocolVersion = protocolVersion;\n\nexport {\n createConsoleRelayDiagnostics,\n FileRelayStore,\n MemoryRelayDiagnostics,\n RelayPairing,\n RelayPresence,\n routeEntryToDevice,\n routeHostToEntry,\n startRelayServer,\n type RelayServer,\n type RelayStore,\n};\n", "import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { createConsoleRelayDiagnostics, FileRelayStore, startRelayServer, type RelayServer } from \"../../../apps/relay/src/library.js\";\n\nexport type RelayServerCommandOptions = {\n output: NodeJS.WritableStream;\n error: NodeJS.WritableStream;\n serveSignal?: AbortSignal;\n};\n\ntype RelayServeFlags = {\n host: string;\n port: number;\n dataDir: string;\n};\n\nconst DEFAULT_HOST = \"127.0.0.1\";\nconst DEFAULT_PORT = 8787;\n\nexport const runCliRelay = async (argv: string[], options: RelayServerCommandOptions): Promise<number> => {\n const [command, ...rest] = argv;\n if (command === \"serve\") {\n return runRelayServe(rest, options);\n }\n if (command === \"--help\" || command === \"-h\") {\n writeRelayUsage(options.output);\n return 0;\n }\n writeRelayUsage(options.error);\n return 1;\n};\n\nconst runRelayServe = async (argv: string[], options: RelayServerCommandOptions): Promise<number> => {\n let flags: RelayServeFlags;\n try {\n flags = parseRelayServeFlags(argv);\n } catch (cause) {\n options.error.write(`scorel relay serve error: ${(cause as Error).message}\\n`);\n return 1;\n }\n let server: RelayServer;\n try {\n server = await startRelayServer({\n host: flags.host,\n port: flags.port,\n store: new FileRelayStore({ dataDir: flags.dataDir }),\n diagnostics: createConsoleRelayDiagnostics(),\n });\n } catch (cause) {\n options.error.write(`scorel relay serve error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n }\n options.output.write(`scorel relay serving url=${server.url}\\n`);\n await waitForStop(options.serveSignal);\n await server.close();\n options.output.write(\"scorel relay serve stopped\\n\");\n return 0;\n};\n\nconst parseRelayServeFlags = (argv: string[]): RelayServeFlags => {\n let host = DEFAULT_HOST;\n let port = DEFAULT_PORT;\n let dataDir = join(homedir(), \".scorel\", \"relay\");\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--host\") {\n host = requireValue(argv, index, \"--host\");\n index += 1;\n continue;\n }\n if (arg === \"--port\") {\n port = Number(requireValue(argv, index, \"--port\"));\n if (!Number.isInteger(port) || port < 0 || port > 65535) {\n throw new Error(\"--port must be an integer from 0 to 65535\");\n }\n index += 1;\n continue;\n }\n if (arg === \"--data-dir\") {\n dataDir = requireValue(argv, index, \"--data-dir\");\n index += 1;\n continue;\n }\n throw new Error(`Unknown relay serve option: ${arg}`);\n }\n return { host, port, dataDir };\n};\n\nconst waitForStop = (signal?: AbortSignal): Promise<void> =>\n new Promise((resolve) => {\n if (signal) {\n if (signal.aborted) {\n resolve();\n return;\n }\n signal.addEventListener(\"abort\", () => resolve(), { once: true });\n return;\n }\n const onSignal = () => {\n process.off(\"SIGINT\", onSignal);\n process.off(\"SIGTERM\", onSignal);\n resolve();\n };\n process.once(\"SIGINT\", onSignal);\n process.once(\"SIGTERM\", onSignal);\n });\n\nconst requireValue = (argv: string[], index: number, flag: string): string => {\n const value = argv[index + 1];\n if (!value) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n};\n\nconst writeRelayUsage = (output: NodeJS.WritableStream): void => {\n output.write(\"Usage: scorel relay serve [--host <h>] [--port <p>] [--data-dir <dir>]\\n\");\n};\n", "import { spawn, type ChildProcess, type SpawnOptions } from \"node:child_process\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n daemonStateLiveness,\n readLocalDaemonState,\n type LocalDaemonState,\n} from \"@scorel/daemon\";\nimport { AUTO_STARTED_IDLE_SHUTDOWN_MS } from \"./daemon-cli.js\";\n\nexport type UpCommandOptions = {\n output: NodeJS.WritableStream;\n error: NodeJS.WritableStream;\n stateDir?: string;\n cwd?: string;\n /**\n * Optional override for tests; takes the same shape as `child_process.spawn`\n * so tests can swap a stubbed lifecycle in without spawning real processes.\n */\n spawn?: (command: string, argv: string[], opts: SpawnOptions) => ChildProcess;\n /**\n * Optional path to the CLI entrypoint (apps/cli/src/index.ts). Defaults to\n * the running script. Tests provide a fake path so spawn args are\n * deterministic.\n */\n cliEntrypoint?: string;\n /**\n * Optional reader so tests can deliver the existing daemon state without\n * touching the filesystem.\n */\n readState?: (stateDir: string) => Promise<LocalDaemonState | null>;\n /**\n * Hook into SIGINT delivery so tests can drive the propagation path\n * deterministically. Returns a teardown that removes the listener.\n */\n attachSigint?: (listener: () => void) => () => void;\n /**\n * Maximum time to wait for the daemon to print its ready line before\n * aborting `up`. Tests shorten this to avoid 10s sleeps.\n */\n daemonReadyTimeoutMs?: number;\n};\n\ntype UpFlags = {\n daemonPort: number;\n webuiPort: number;\n cwd: string;\n};\n\nconst DEFAULT_DAEMON_PORT = 7777;\nconst DEFAULT_WEBUI_PORT = 3000;\nconst DEFAULT_DAEMON_READY_TIMEOUT_MS = 30_000;\n\nconst defaultStateDir = (): string => join(homedir(), \".scorel\");\n\nconst defaultAttachSigint = (listener: () => void): (() => void) => {\n process.on(\"SIGINT\", listener);\n return () => process.off(\"SIGINT\", listener);\n};\n\nexport const runCliUp = async (argv: string[], options: UpCommandOptions): Promise<number> => {\n let flags: UpFlags;\n try {\n flags = parseUpFlags(argv, options.cwd ?? process.cwd());\n } catch (cause) {\n options.error.write(`scorel up error: ${(cause as Error).message}\\n`);\n return 1;\n }\n\n const stateDir = options.stateDir ?? defaultStateDir();\n const cliEntrypoint = options.cliEntrypoint ?? fileURLToPath(import.meta.url).replace(/up-cli\\.ts$/, \"index.ts\");\n const spawnFn = options.spawn ?? spawn;\n const readState = options.readState ?? ((dir: string) => readLocalDaemonState({ stateDir: dir }));\n const attachSigint = options.attachSigint ?? defaultAttachSigint;\n const readyTimeout = options.daemonReadyTimeoutMs ?? DEFAULT_DAEMON_READY_TIMEOUT_MS;\n\n const existingState = await readState(stateDir);\n const existingLiveness = existingState ? daemonStateLiveness(existingState) : null;\n const reuseDaemon = existingState && existingLiveness === \"running\";\n\n let daemonChild: ChildProcess | undefined;\n let daemonState: LocalDaemonState | null = existingState;\n if (!reuseDaemon) {\n const daemonArgs = [\n ...nodeEntrypointArgs(cliEntrypoint),\n \"daemon\",\n \"serve\",\n \"--port\",\n String(flags.daemonPort),\n \"--cwd\",\n flags.cwd,\n \"--idle-timeout-ms\",\n String(AUTO_STARTED_IDLE_SHUTDOWN_MS),\n \"--no-relay\",\n ];\n daemonChild = spawnFn(process.execPath, daemonArgs, {\n cwd: dirname(cliEntrypoint),\n env: { ...process.env },\n detached: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n try {\n await waitForDaemonReady(daemonChild, readyTimeout);\n } catch (cause) {\n options.error.write(`scorel up error: ${(cause as Error).message}\\n`);\n daemonChild.kill(\"SIGTERM\");\n return 1;\n }\n // Re-read state \u2014 serve has now written daemon.json with the bound port,\n // token, and pid we need for the unified header.\n daemonState = await readState(stateDir);\n }\n\n if (!daemonState) {\n options.error.write(\"scorel up error: daemon state missing after start\\n\");\n daemonChild?.kill(\"SIGTERM\");\n return 1;\n }\n if (daemonChild) {\n detachBackgroundDaemon(daemonChild);\n }\n\n const webuiArgs = [\n ...nodeEntrypointArgs(cliEntrypoint),\n \"webui\",\n \"--port\",\n String(flags.webuiPort),\n ];\n const webuiChild = spawnFn(process.execPath, webuiArgs, {\n cwd: dirname(cliEntrypoint),\n env: { ...process.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n pipeWithPrefix(webuiChild, \"[webui] \", options.output, options.error);\n\n options.output.write(`scorel up\\n`);\n options.output.write(` daemon ${daemonState.wsUrl} token=${daemonState.token}\\n`);\n options.output.write(` webui http://127.0.0.1:${flags.webuiPort}\\n`);\n\n let shuttingDown = false;\n const detachSigint = attachSigint(() => {\n if (shuttingDown) {\n return;\n }\n shuttingDown = true;\n webuiChild.kill(\"SIGTERM\");\n });\n\n const webuiExit = once(webuiChild);\n\n const webuiDeathWatcher = webuiExit.then((code) => {\n if (!shuttingDown) {\n shuttingDown = true;\n options.error.write(`scorel up webui exited code=${code}\\n`);\n }\n return code;\n });\n\n const webuiCode = await webuiDeathWatcher;\n detachSigint();\n options.output.write(\"scorel up stopped\\n\");\n return webuiCode === 0 ? 0 : 1;\n};\n\nconst parseUpFlags = (argv: string[], defaultCwd: string): UpFlags => {\n let daemonPort = DEFAULT_DAEMON_PORT;\n let webuiPort = DEFAULT_WEBUI_PORT;\n let cwd = defaultCwd;\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--daemon-port\") {\n daemonPort = Number(requireValue(argv, index, \"--daemon-port\"));\n if (!Number.isInteger(daemonPort) || daemonPort < 0 || daemonPort > 65535) {\n throw new Error(\"--daemon-port must be an integer from 0 to 65535\");\n }\n index += 1;\n continue;\n }\n if (arg === \"--webui-port\") {\n webuiPort = Number(requireValue(argv, index, \"--webui-port\"));\n if (!Number.isInteger(webuiPort) || webuiPort < 0 || webuiPort > 65535) {\n throw new Error(\"--webui-port must be an integer from 0 to 65535\");\n }\n index += 1;\n continue;\n }\n if (arg === \"--cwd\") {\n cwd = requireValue(argv, index, \"--cwd\");\n index += 1;\n continue;\n }\n throw new Error(`Unknown up option: ${arg}`);\n }\n return { daemonPort, webuiPort, cwd };\n};\n\nconst requireValue = (argv: string[], index: number, flag: string): string => {\n const value = argv[index + 1];\n if (!value) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n};\n\nconst waitForDaemonReady = (child: ChildProcess, timeoutMs: number): Promise<void> =>\n new Promise((resolveReady, rejectReady) => {\n if (!child.stdout) {\n rejectReady(new Error(\"daemon child has no stdout stream\"));\n return;\n }\n let buffer = \"\";\n let stderrBuffer = \"\";\n let settled = false;\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n cleanup();\n rejectReady(new Error(\"timed out waiting for daemon ready line\"));\n }, timeoutMs);\n const onData = (chunk: Buffer | string) => {\n buffer += chunk.toString();\n const newlineIndex = buffer.lastIndexOf(\"\\n\");\n if (newlineIndex < 0) {\n return;\n }\n if (buffer.includes(\"scorel daemon serving url=\") || buffer.includes(\"scorel host serving url=\")) {\n if (settled) return;\n settled = true;\n cleanup();\n resolveReady();\n }\n buffer = buffer.slice(newlineIndex + 1);\n };\n // Capture stderr while we wait so a daemon that bails before printing the\n // ready line (e.g. missing SCOREL_API_KEY env, port collision, malformed\n // config) reports the actual cause instead of \"exited before ready\".\n const onStderr = (chunk: Buffer | string) => {\n stderrBuffer += chunk.toString();\n };\n const onExit = (code: number | null) => {\n if (settled) return;\n settled = true;\n cleanup();\n const trimmed = stderrBuffer.trim();\n const detail = trimmed ? `: ${trimmed}` : \"\";\n rejectReady(new Error(`daemon exited before ready code=${code}${detail}`));\n };\n const cleanup = () => {\n clearTimeout(timer);\n child.stdout?.off(\"data\", onData);\n child.stderr?.off(\"data\", onStderr);\n child.off(\"exit\", onExit);\n };\n child.stdout.on(\"data\", onData);\n child.stderr?.on(\"data\", onStderr);\n child.once(\"exit\", onExit);\n });\n\nconst pipeWithPrefix = (\n child: ChildProcess,\n prefix: string,\n output: NodeJS.WritableStream,\n error: NodeJS.WritableStream,\n): void => {\n if (child.stdout) {\n pipeStreamLines(child.stdout, prefix, output);\n }\n if (child.stderr) {\n pipeStreamLines(child.stderr, prefix, error);\n }\n};\n\nconst detachBackgroundDaemon = (child: ChildProcess): void => {\n child.stdout?.destroy();\n child.stderr?.destroy();\n child.unref();\n};\n\nconst nodeEntrypointArgs = (entrypoint: string): string[] =>\n entrypoint.endsWith(\".ts\") ? [\"--import\", \"tsx\", entrypoint] : [entrypoint];\n\nconst pipeStreamLines = (\n stream: NodeJS.ReadableStream,\n prefix: string,\n destination: NodeJS.WritableStream,\n): void => {\n let buffer = \"\";\n stream.setEncoding?.(\"utf8\");\n stream.on(\"data\", (chunk: string | Buffer) => {\n buffer += chunk.toString();\n let newlineIndex = buffer.indexOf(\"\\n\");\n while (newlineIndex >= 0) {\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n destination.write(`${prefix} ${line}\\n`);\n newlineIndex = buffer.indexOf(\"\\n\");\n }\n });\n stream.on(\"end\", () => {\n if (buffer.length > 0) {\n destination.write(`${prefix} ${buffer}\\n`);\n buffer = \"\";\n }\n });\n};\n\nconst once = (child: ChildProcess): Promise<number> =>\n new Promise((resolveExit) => {\n child.once(\"exit\", (code) => resolveExit(typeof code === \"number\" ? code : 0));\n });\n", "import { spawn, type ChildProcess, type SpawnOptions } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport type WebUiCommandOptions = {\n output: NodeJS.WritableStream;\n error: NodeJS.WritableStream;\n /**\n * Optional override; tests inject a fake spawner so they can assert on\n * argv, env, and cwd without booting Next.js.\n */\n spawn?: (command: string, argv: string[], opts: SpawnOptions) => ChildProcess;\n /**\n * Optional override for `apps/webui` resolution; tests pass an absolute\n * path so they don't depend on the real workspace layout.\n */\n webuiAppDir?: string;\n};\n\nexport type WebUiSpawnPlan = {\n command: string;\n argv: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n};\n\nconst DEFAULT_PORT = 3000;\nconst DEFAULT_HOST = \"127.0.0.1\";\n\ntype WebUiFlags = {\n host: string;\n port: number;\n};\n\nexport const runCliWebUi = async (\n argv: string[],\n options: WebUiCommandOptions,\n): Promise<number> => {\n let flags: WebUiFlags;\n try {\n flags = parseWebUiFlags(argv);\n } catch (cause) {\n options.error.write(`scorel webui error: ${(cause as Error).message}\\n`);\n return 1;\n }\n const webuiAppDir = options.webuiAppDir ?? findWebuiAppDir();\n if (!webuiAppDir) {\n options.error.write(\"scorel webui error: could not locate apps/webui\\n\");\n return 1;\n }\n const plan = buildWebUiSpawnPlan(flags, webuiAppDir);\n const spawnFn = options.spawn ?? spawn;\n const child = spawnFn(plan.command, plan.argv, {\n cwd: plan.cwd,\n env: plan.env,\n stdio: \"inherit\",\n });\n return await waitForChildExit(child, options);\n};\n\n/**\n * Locate the `apps/webui` package directory by walking up from the CLI\n * source location until we find a workspace root that contains it. Done\n * eagerly (synchronously) so spawn args are deterministic; the workspace\n * layout never changes inside a single process.\n */\nconst findWebuiAppDir = (): string | undefined => {\n let cursor = dirname(fileURLToPath(import.meta.url));\n for (let depth = 0; depth < 8; depth += 1) {\n const candidate = resolve(cursor, \"apps/webui/package.json\");\n if (existsSync(candidate)) {\n return resolve(cursor, \"apps/webui\");\n }\n const parent = resolve(cursor, \"..\");\n if (parent === cursor) {\n return undefined;\n }\n cursor = parent;\n }\n return undefined;\n};\n\nexport const buildWebUiSpawnPlan = (flags: WebUiFlags, webuiAppDir: string): WebUiSpawnPlan => {\n const env = {\n ...process.env,\n PORT: String(flags.port),\n HOST: flags.host,\n };\n // Prefer the directly-bundled Next CLI to avoid a recursive pnpm hop and to\n // keep the spawn graph small (parent \u2192 node \u2192 next, no shell).\n const nextBin = resolve(webuiAppDir, \"node_modules/next/dist/bin/next\");\n if (existsSync(nextBin)) {\n return {\n command: process.execPath,\n argv: [nextBin, \"dev\", \"-p\", String(flags.port), \"-H\", flags.host],\n cwd: webuiAppDir,\n env,\n };\n }\n // Fallback: pnpm filter command. Keeps the path working before\n // `pnpm install` has hydrated the inner node_modules.\n return {\n command: \"pnpm\",\n argv: [\"--filter\", \"@scorel/app-webui\", \"dev\"],\n cwd: webuiAppDir,\n env,\n };\n};\n\nconst parseWebUiFlags = (argv: string[]): WebUiFlags => {\n let host = DEFAULT_HOST;\n let port = DEFAULT_PORT;\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--host\") {\n host = requireValue(argv, index, \"--host\");\n index += 1;\n continue;\n }\n if (arg === \"--port\") {\n port = Number(requireValue(argv, index, \"--port\"));\n if (!Number.isInteger(port) || port < 0 || port > 65535) {\n throw new Error(\"--port must be an integer from 0 to 65535\");\n }\n index += 1;\n continue;\n }\n throw new Error(`Unknown webui option: ${arg}`);\n }\n return { host, port };\n};\n\nconst requireValue = (argv: string[], index: number, flag: string): string => {\n const value = argv[index + 1];\n if (!value) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n};\n\nconst waitForChildExit = (\n child: ChildProcess,\n options: WebUiCommandOptions,\n): Promise<number> =>\n new Promise((resolveExit) => {\n child.once(\"error\", (cause) => {\n options.error.write(`scorel webui error: ${cause.message}\\n`);\n resolveExit(1);\n });\n child.once(\"exit\", (code) => {\n resolveExit(typeof code === \"number\" ? code : 1);\n });\n });\n", "#!/usr/bin/env -S node --import tsx\nimport { createHash } from \"node:crypto\";\nimport { appendFile, mkdir, readFile, realpath, readdir, writeFile } from \"node:fs/promises\";\nimport { createInterface } from \"node:readline/promises\";\nimport { homedir } from \"node:os\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Readable, Writable } from \"node:stream\";\nimport { basename, dirname, join } from \"node:path\";\n\nimport { DaemonClient, WsTransport, clientPackageName } from \"@scorel/client\";\nimport {\n ScorelHost,\n createEmbeddedTransport,\n createRealRuntime,\n daemonPackageName,\n loadScorelConfig,\n loadScorelConfigProfile,\n readLocalDaemonState,\n scorelSessionsDir,\n type ScorelConfig,\n} from \"@scorel/daemon\";\nimport {\n asClientId,\n asDeviceId,\n asProjectId,\n asSeq,\n asSessionId,\n type ContentBlock,\n type DeviceId,\n type ErrorEvent,\n type ModelRole,\n type ModelSelectionInput,\n type PersistentEvent,\n type ProjectId,\n type ScorelEvent,\n type SessionId,\n} from \"@scorel/protocol\";\n\nimport { runCliDaemon } from \"./daemon-cli.js\";\nimport { runCliPair } from \"./relay-cli.js\";\nimport { runCliRelay } from \"./relay-server-cli.js\";\nimport { runCliUp } from \"./up-cli.js\";\nimport { runCliWebUi } from \"./webui-cli.js\";\nimport { readInstalledScorelVersion, runCliUpdate } from \"./update-cli.js\";\n\nexport const cliAppName = \"@scorel/app-cli\" as const;\nexport const cliClientDependency = clientPackageName;\nexport const cliDaemonDependency = daemonPackageName;\n\nexport type CliIo = {\n input: NodeJS.ReadableStream;\n output: NodeJS.WritableStream;\n error: NodeJS.WritableStream;\n};\n\nexport type CliRunOptions = {\n config?: ScorelConfig;\n sessionsDir?: string;\n};\n\ntype ChatOptions = {\n sessionsDir: string;\n stateDir: string;\n sessionId: SessionId;\n cwd: string;\n config?: ScorelConfig;\n};\n\ntype RunOutputFormat = \"text\" | \"json\" | \"stream-json\" | \"none\";\ntype RunProviderApi = \"openai-completions\" | \"openai-responses\" | \"google-generative-ai\" | \"anthropic-messages\";\n\ntype RunProviderOverride = {\n provider?: string;\n api?: RunProviderApi;\n baseUrl?: string;\n apiKey?: string;\n};\n\ntype RunOptions = {\n promptSource: \"argument\" | \"prompt\" | \"prompt-file\" | \"stdin\";\n prompt?: string;\n promptFile?: string;\n sessionsDir: string;\n stateDir: string;\n sessionId: SessionId;\n cwd: string;\n timeoutMs?: number;\n outputFormat: RunOutputFormat;\n summaryPath?: string;\n quiet: boolean;\n modelSelection?: ModelSelectionInput;\n providerOverride?: RunProviderOverride;\n config?: ScorelConfig;\n};\n\ntype RunSummary = {\n status: \"completed\" | \"error\" | \"timeout\";\n sessionId: string;\n projectId?: string;\n cwd: string;\n stateDir: string;\n sessionsDir: string;\n sessionJsonl: string;\n outputFormat: RunOutputFormat;\n elapsedMs: number;\n exitReason: \"completed\" | \"error\" | \"timeout\";\n assistantEventId?: string;\n userEventId?: string;\n error?: { message: string };\n};\n\nconst defaultSessionsDir = (): string => scorelSessionsDir(homedir());\n\nconst defaultStateDir = (): string => join(homedir(), \".scorel\");\n\nexport const runCli = async (\n argv: string[],\n io: CliIo = { input: process.stdin, output: process.stdout, error: process.stderr },\n runOptions: CliRunOptions = {},\n): Promise<number> => {\n const [command, ...rest] = argv;\n if (command === \"--version\" || command === \"-v\" || command === \"version\") {\n io.output.write(`${await readInstalledScorelVersion()}\\n`);\n return 0;\n }\n if (!command || command === \"chat\") {\n if (rest.includes(\"--help\") || rest.includes(\"-h\")) {\n writeUsage(io.output);\n return 0;\n }\n const chatOptions = parseChatOptions(rest);\n const sessionsDir = runOptions.sessionsDir ?? chatOptions.sessionsDir;\n return runChat({ ...chatOptions, config: runOptions.config, sessionsDir, stateDir: stateDirFromSessionsDir(sessionsDir) }, io);\n }\n if (command === \"run\") {\n if (rest.includes(\"--help\") || rest.includes(\"-h\")) {\n writeRunUsage(io.output);\n return 0;\n }\n try {\n return runHeadless(parseRunOptions(rest, runOptions), io);\n } catch (cause) {\n io.error.write(`scorel run error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 2;\n }\n }\n if (command === \"daemon\") {\n return runCliDaemon(rest, {\n stateDir: stateDirFromSessionsDir(runOptions.sessionsDir),\n sessionsDir: runOptions.sessionsDir,\n output: io.output,\n error: io.error,\n });\n }\n if (command === \"host\") {\n return runCliDaemon(rest, {\n stateDir: stateDirFromSessionsDir(runOptions.sessionsDir),\n sessionsDir: runOptions.sessionsDir,\n output: io.output,\n error: io.error,\n });\n }\n if (command === \"relay\") {\n return runCliRelay(rest, { output: io.output, error: io.error });\n }\n if (command === \"pair\") {\n return runCliPair(rest, {\n stateDir: stateDirFromSessionsDir(runOptions.sessionsDir),\n output: io.output,\n error: io.error,\n });\n }\n if (command === \"webui\") {\n return runCliWebUi(rest, { output: io.output, error: io.error });\n }\n if (command === \"up\") {\n return runCliUp(rest, {\n stateDir: stateDirFromSessionsDir(runOptions.sessionsDir),\n output: io.output,\n error: io.error,\n });\n }\n if (command === \"update\" || command === \"upgrade\") {\n return runCliUpdate(rest, { output: io.output, error: io.error });\n }\n if (command === \"attach\") {\n try {\n return runAttach(parseAttachOptions(rest), {\n stateDir: stateDirFromSessionsDir(runOptions.sessionsDir),\n cwd: process.cwd(),\n input: io.input,\n output: io.output,\n error: io.error,\n });\n } catch (cause) {\n io.error.write(`scorel attach error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n }\n }\n if (command === \"project\") {\n return runProject(rest, {\n stateDir: stateDirFromSessionsDir(runOptions.sessionsDir),\n output: io.output,\n error: io.error,\n });\n }\n if (command === \"logs\") {\n try {\n return runLogs(parseLogsOptions(rest), {\n sessionsDir: runOptions.sessionsDir ?? defaultSessionsDir(),\n stateDir: stateDirFromSessionsDir(runOptions.sessionsDir),\n output: io.output,\n error: io.error,\n });\n } catch (cause) {\n io.error.write(`scorel logs error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n }\n }\n writeUsage(io.error);\n return command === \"--help\" || command === \"-h\" ? 0 : 1;\n};\n\ntype LogsOptions = {\n sessionId: ReturnType<typeof asSessionId>;\n tail?: number;\n attach: boolean;\n remoteUrl?: string;\n};\n\nconst runProject = async (\n argv: string[],\n io: { stateDir: string; output: NodeJS.WritableStream; error: NodeJS.WritableStream },\n): Promise<number> => {\n const [command, value, ...extra] = argv;\n if (extra.length > 0 || ![\"list\", \"add\", \"remove\"].includes(command ?? \"\")) {\n writeProjectUsage(io.error);\n return 1;\n }\n if ((command === \"add\" || command === \"remove\") && !value) {\n writeProjectUsage(io.error);\n return 1;\n }\n if (command === \"list\" && value) {\n writeProjectUsage(io.error);\n return 1;\n }\n const state = await readLocalDaemonState({ stateDir: io.stateDir });\n if (!state || state.stoppedAt !== null) {\n io.error.write(\"scorel project error: local daemon is not running\\n\");\n return 1;\n }\n const client = new DaemonClient(new WsTransport({ url: state.wsUrl, token: state.token }), {\n clientId: asClientId(\"client_cli_project\"),\n });\n try {\n await client.connect();\n if (command === \"list\") {\n for (const project of await client.listProjects()) {\n io.output.write(`${project.projectId}\\t${project.displayName}\\t${project.workDir}\\n`);\n }\n } else if (command === \"add\") {\n const project = await client.registerProject(value!);\n io.output.write(`${project.projectId}\\t${project.displayName}\\t${project.workDir}\\n`);\n } else {\n await client.removeProject(asProjectId(value!));\n io.output.write(`removed ${value}\\n`);\n }\n return 0;\n } catch (cause) {\n io.error.write(`scorel project error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n } finally {\n client.disconnect();\n }\n};\n\nconst runLogs = async (\n options: LogsOptions,\n io: { sessionsDir: string; stateDir: string; output: NodeJS.WritableStream; error: NodeJS.WritableStream },\n): Promise<number> => {\n const filePath = options.attach\n ? await findAttachDiagnosticsFilePath(io.stateDir, options.sessionId, options.remoteUrl)\n : join(io.sessionsDir, `${options.sessionId}.log`);\n let content: string;\n try {\n content = await readFile(filePath, \"utf8\");\n } catch (cause) {\n io.error.write(`scorel logs error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n }\n const lines = content.split(/\\r?\\n/).filter((line) => line.length > 0);\n const selected = options.tail === undefined ? lines : lines.slice(-options.tail);\n if (selected.length > 0) {\n io.output.write(`${selected.join(\"\\n\")}\\n`);\n }\n return 0;\n};\n\ntype AttachOptions = {\n sessionId: ReturnType<typeof asSessionId>;\n remoteUrl: string;\n token: string;\n};\n\nconst runAttach = async (\n options: AttachOptions,\n io: { stateDir: string; cwd: string; input: NodeJS.ReadableStream; output: NodeJS.WritableStream; error: NodeJS.WritableStream },\n): Promise<number> => {\n const transport = new WsTransport({ url: options.remoteUrl, token: options.token });\n const client = new DaemonClient(transport, {\n clientId: asClientId(\"client_cli_attach\"),\n });\n const diagnostics = new AttachDiagnostics(io.stateDir, options.sessionId);\n try {\n diagnostics.record(\"attach_connect_started\", {\n remoteUrl: options.remoteUrl,\n });\n await client.connect();\n const loaded = await client.loadSession(options.sessionId);\n const renderer = new AttachEventRenderer(io.output, io.error);\n const cacheScope = attachCacheScope(client.connectionIdentity, loaded.meta.projectId);\n diagnostics.setScope(cacheScope);\n diagnostics.record(\"attach_connect_succeeded\", {\n scopeKind: cacheScope.kind,\n scopeLocator: cacheScope.locator,\n deviceId: client.connectionIdentity?.deviceId,\n deviceDisplayName: client.connectionIdentity?.deviceDisplayName,\n projectId: loaded.meta.projectId,\n });\n diagnostics.record(\"attach_cache_scope_resolved\", {\n scopeKind: cacheScope.kind,\n scopeLocator: cacheScope.locator,\n displayName: cacheScope.displayName,\n });\n const cacheSnapshot = await readAttachCache(io.stateDir, cacheScope, options.sessionId);\n diagnostics.record(\"attach_cache_read\", {\n persistentEvents: cacheSnapshot.events.length,\n transients: cacheSnapshot.transients.length,\n });\n const persistCache = async (): Promise<void> => {\n await writeAttachCache(io.stateDir, cacheScope, options.sessionId, cacheSnapshot);\n diagnostics.record(\"attach_cache_written\", {\n persistentEvents: cacheSnapshot.events.length,\n transients: cacheSnapshot.transients.length,\n });\n };\n const unsubscribe = client.subscribe((event) => {\n renderer.renderLive(event);\n updateAttachCacheSnapshot(cacheSnapshot, event);\n diagnostics.record(\"attach_event_rendered\", {\n type: event.type,\n seq: \"seq\" in event ? event.seq : undefined,\n });\n void persistCache();\n });\n diagnostics.record(\"attach_session_loaded\");\n renderer.writeLine(`scorel attach resumed session ${options.sessionId}`);\n renderer.renderBacklog(cacheSnapshot.events);\n renderer.renderTransientBacklog(cacheSnapshot.transients);\n const persistentLastSeq = highestSeq(cacheSnapshot.events);\n const resync = await client.resync({\n persistentLastSeq,\n streamLastSeq: highestCachedStreamSeq(cacheSnapshot),\n });\n diagnostics.record(\"attach_resync_finished\", {\n mode: resync.mode,\n throughSeq: resync.throughSeq,\n persistentLastSeq,\n streamLastSeq: highestCachedStreamSeq(cacheSnapshot),\n receivedEvents: client.getEvents().length,\n });\n if (resync.mode === \"full_reload\" && cacheSnapshot.events.length > 0) {\n renderer.writeLine(\"scorel attach authoritative reload follows cached history\");\n }\n renderer.renderBacklog(client.getEvents());\n cacheSnapshot.events = mergePersistentEvents([...cacheSnapshot.events, ...client.getEvents()]);\n cacheSnapshot.transients = removeCompletedTransients(cacheSnapshot.transients, cacheSnapshot.events);\n await persistCache();\n renderer.promptIfInteractive();\n const rl = createInterface({ input: io.input as Readable, crlfDelay: Infinity });\n const inputQueue = new AsyncInputQueue();\n const inputWorker = (async () => {\n for (;;) {\n const line = await inputQueue.next();\n if (line === null) {\n return;\n }\n if (line === \".exit\" || line === \".quit\") {\n return;\n }\n diagnostics.record(\"attach_send_message_started\", { contentLength: line.length });\n try {\n await client.sendMessage(line);\n diagnostics.record(\"attach_send_message_finished\", { contentLength: line.length });\n } catch (cause) {\n diagnostics.record(\"attach_send_message_error\", {\n message: cause instanceof Error ? cause.message : String(cause),\n });\n throw cause;\n }\n renderer.endLine();\n renderer.promptIfInteractive();\n }\n })();\n try {\n for await (const rawLine of rl) {\n const line = rawLine.trim();\n if (line.length === 0) {\n continue;\n }\n inputQueue.push(line);\n if (line === \".exit\" || line === \".quit\") {\n break;\n }\n }\n inputQueue.close();\n await inputWorker;\n } finally {\n inputQueue.close();\n unsubscribe();\n rl.close();\n await persistCache();\n }\n diagnostics.record(\"attach_disconnected\");\n await diagnostics.flush();\n client.disconnect();\n return 0;\n } catch (cause) {\n diagnostics.record(\"attach_failed\", { message: cause instanceof Error ? cause.message : String(cause) });\n await diagnostics.flush();\n io.error.write(`scorel attach error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n }\n};\n\ntype AttachCacheScope = {\n kind: \"remote\";\n locator: string;\n displayName?: string;\n};\n\ntype AttachCacheFile = {\n version: 1;\n scope: AttachCacheScope;\n sessionId: string;\n events: PersistentEvent[];\n transients?: CachedTransientMessage[];\n};\n\ntype CachedTransientMessage = {\n eventId: string;\n seq: number;\n text: string;\n};\n\ntype AttachCacheSnapshot = {\n events: PersistentEvent[];\n transients: CachedTransientMessage[];\n};\n\nconst attachCacheScope = (\n identity: { deviceId?: DeviceId; deviceDisplayName?: string },\n projectId: string,\n): AttachCacheScope => {\n if (!identity.deviceId) {\n throw new Error(\"Remote daemon handshake is missing deviceId\");\n }\n return {\n kind: \"remote\",\n locator: `device:${identity.deviceId}/project:${projectId}`,\n displayName: identity.deviceDisplayName,\n };\n};\n\nconst attachCacheFilePath = (stateDir: string, scope: AttachCacheScope, sessionId: ReturnType<typeof asSessionId>): string => {\n const scopeKey = createHash(\"sha256\").update(`${scope.kind}\\0${scope.locator}`).digest(\"hex\").slice(0, 24);\n return join(stateDir, \"attach-cache\", scopeKey, `${sessionId}.json`);\n};\n\nconst attachDiagnosticsFilePath = (\n stateDir: string,\n scope: AttachCacheScope,\n sessionId: ReturnType<typeof asSessionId>,\n): string => {\n const scopeKey = createHash(\"sha256\").update(`${scope.kind}\\0${scope.locator}`).digest(\"hex\").slice(0, 24);\n return join(stateDir, \"attach-cache\", scopeKey, `${sessionId}.log`);\n};\n\nconst findAttachDiagnosticsFilePath = async (\n stateDir: string,\n sessionId: ReturnType<typeof asSessionId>,\n _remoteUrl?: string,\n): Promise<string> => {\n const root = join(stateDir, \"attach-cache\");\n const scopes = await readdir(root).catch(() => []);\n for (const scope of scopes) {\n const candidate = join(root, scope, `${sessionId}.log`);\n try {\n await readFile(candidate, \"utf8\");\n return candidate;\n } catch {\n continue;\n }\n }\n return join(root, \"__missing__\", `${sessionId}.log`);\n};\n\nconst stateDirFromSessionsDir = (sessionsDir: string | undefined): string => {\n if (!sessionsDir) {\n return defaultStateDir();\n }\n return basename(sessionsDir) === \"sessions\" ? dirname(sessionsDir) : sessionsDir;\n};\n\nclass AttachDiagnostics {\n readonly #stateDir: string;\n readonly #sessionId: ReturnType<typeof asSessionId>;\n readonly #pendingLines: string[] = [];\n readonly #writes: Array<Promise<void>> = [];\n #scope: AttachCacheScope | undefined;\n\n constructor(stateDir: string, sessionId: ReturnType<typeof asSessionId>) {\n this.#stateDir = stateDir;\n this.#sessionId = sessionId;\n }\n\n setScope(scope: AttachCacheScope): void {\n this.#scope = scope;\n for (const line of this.#pendingLines.splice(0)) {\n this.#append(line);\n }\n }\n\n ensureScope(scope: AttachCacheScope): void {\n if (!this.#scope) {\n this.setScope(scope);\n }\n }\n\n record(event: string, fields: Record<string, unknown> = {}): void {\n const line = formatDiagnosticLine({\n ts: Date.now(),\n level: event.endsWith(\"_error\") || event.endsWith(\"_failed\") ? \"error\" : \"info\",\n event,\n sessionId: this.#sessionId,\n ...redactDiagnosticFields(fields),\n });\n if (!this.#scope) {\n this.#pendingLines.push(line);\n return;\n }\n this.#append(line);\n }\n\n async flush(): Promise<void> {\n if (this.#scope) {\n for (const line of this.#pendingLines.splice(0)) {\n this.#append(line);\n }\n }\n await Promise.allSettled(this.#writes);\n }\n\n #append(line: string): void {\n if (!this.#scope) {\n this.#pendingLines.push(line);\n return;\n }\n const filePath = attachDiagnosticsFilePath(this.#stateDir, this.#scope, this.#sessionId);\n this.#writes.push(\n mkdir(dirname(filePath), { recursive: true }).then(() => appendFile(filePath, `${line}\\n`, \"utf8\")),\n );\n }\n}\n\nconst readAttachCache = async (\n stateDir: string,\n scope: AttachCacheScope,\n sessionId: ReturnType<typeof asSessionId>,\n): Promise<AttachCacheSnapshot> => {\n try {\n const raw = JSON.parse(await readFile(attachCacheFilePath(stateDir, scope, sessionId), \"utf8\")) as AttachCacheFile;\n if (\n raw.version !== 1 ||\n raw.sessionId !== String(sessionId) ||\n raw.scope.kind !== scope.kind ||\n raw.scope.locator !== scope.locator ||\n !Array.isArray(raw.events)\n ) {\n return emptyAttachCacheSnapshot();\n }\n const events = mergePersistentEvents(raw.events);\n return {\n events,\n transients: removeCompletedTransients(\n Array.isArray(raw.transients) ? raw.transients.filter(isCachedTransientMessage) : [],\n events,\n ),\n };\n } catch (cause) {\n if (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") {\n return emptyAttachCacheSnapshot();\n }\n return emptyAttachCacheSnapshot();\n }\n};\n\nconst writeAttachCache = async (\n stateDir: string,\n scope: AttachCacheScope,\n sessionId: ReturnType<typeof asSessionId>,\n snapshot: AttachCacheSnapshot,\n): Promise<void> => {\n const filePath = attachCacheFilePath(stateDir, scope, sessionId);\n const uniqueEvents = mergePersistentEvents(snapshot.events);\n const transients = removeCompletedTransients(snapshot.transients, uniqueEvents);\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(\n filePath,\n `${JSON.stringify({ version: 1, scope, sessionId: String(sessionId), events: uniqueEvents, transients } satisfies AttachCacheFile, null, 2)}\\n`,\n );\n};\n\nconst emptyAttachCacheSnapshot = (): AttachCacheSnapshot => ({ events: [], transients: [] });\n\nconst mergePersistentEvents = (events: PersistentEvent[]): PersistentEvent[] => {\n const byId = new Map<string, PersistentEvent>();\n for (const event of events) {\n byId.set(String(event.id), event);\n }\n return [...byId.values()].sort((left, right) => Number(left.seq) - Number(right.seq));\n};\n\nconst highestSeq = (events: PersistentEvent[]): ReturnType<typeof asSeq> =>\n asSeq(events.reduce((max, event) => Math.max(max, Number(event.seq)), 0));\n\nconst highestCachedStreamSeq = (snapshot: AttachCacheSnapshot): ReturnType<typeof asSeq> =>\n asSeq(Math.max(Number(highestSeq(snapshot.events)), ...snapshot.transients.map((event) => event.seq), 0));\n\nconst updateAttachCacheSnapshot = (snapshot: AttachCacheSnapshot, event: ScorelEvent): void => {\n if (\"id\" in event) {\n snapshot.events = mergePersistentEvents([...snapshot.events, event]);\n snapshot.transients = removeCompletedTransients(snapshot.transients, snapshot.events);\n return;\n }\n if (event.type !== \"text_delta\") {\n return;\n }\n const existing = snapshot.transients.find((candidate) => candidate.eventId === String(event.eventId));\n if (existing) {\n existing.seq = Math.max(existing.seq, Number(event.seq));\n existing.text += event.delta;\n } else {\n snapshot.transients.push({\n eventId: String(event.eventId),\n seq: Number(event.seq),\n text: event.delta,\n });\n }\n};\n\nconst removeCompletedTransients = (\n transients: CachedTransientMessage[],\n events: PersistentEvent[],\n): CachedTransientMessage[] => {\n const persistentIds = new Set(events.map((event) => String(event.id)));\n return transients.filter((transient) => !persistentIds.has(transient.eventId) && transient.text.length > 0);\n};\n\nconst isCachedTransientMessage = (value: unknown): value is CachedTransientMessage =>\n typeof value === \"object\" &&\n value !== null &&\n \"eventId\" in value &&\n \"seq\" in value &&\n \"text\" in value &&\n typeof value.eventId === \"string\" &&\n typeof value.seq === \"number\" &&\n typeof value.text === \"string\";\n\nclass AsyncInputQueue {\n readonly #items: string[] = [];\n #closed = false;\n #notify: (() => void) | undefined;\n\n push(line: string): void {\n if (this.#closed) {\n return;\n }\n this.#items.push(line);\n this.#notify?.();\n this.#notify = undefined;\n }\n\n close(): void {\n this.#closed = true;\n this.#notify?.();\n this.#notify = undefined;\n }\n\n async next(): Promise<string | null> {\n while (this.#items.length === 0 && !this.#closed) {\n await new Promise<void>((resolve) => {\n this.#notify = resolve;\n });\n }\n return this.#items.shift() ?? null;\n }\n}\n\nconst parseAttachOptions = (argv: string[]): AttachOptions => {\n let sessionId = asSessionId(\"ses_default\");\n let remoteUrl: string | undefined;\n let token: string | undefined;\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--session\") {\n sessionId = asSessionId(requireValue(argv, index, \"--session\"));\n index += 1;\n continue;\n }\n if (arg === \"--remote\") {\n remoteUrl = requireValue(argv, index, \"--remote\");\n index += 1;\n continue;\n }\n if (arg === \"--token\") {\n token = requireValue(argv, index, \"--token\");\n index += 1;\n continue;\n }\n throw new Error(`Unknown attach option: ${arg}`);\n }\n if (!remoteUrl) {\n throw new Error(\"--remote is required (e.g. --remote ws://127.0.0.1:7777)\");\n }\n if (!token) {\n throw new Error(\"--token is required with --remote\");\n }\n return { sessionId, remoteUrl, token };\n};\n\nconst parseLogsOptions = (argv: string[]): LogsOptions => {\n let sessionId: ReturnType<typeof asSessionId> | undefined;\n let tail: number | undefined;\n let attach = false;\n let remoteUrl: string | undefined;\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--attach\") {\n attach = true;\n continue;\n }\n if (arg === \"--remote\") {\n remoteUrl = requireValue(argv, index, \"--remote\");\n index += 1;\n continue;\n }\n if (arg === \"--session\") {\n sessionId = asSessionId(requireValue(argv, index, \"--session\"));\n index += 1;\n continue;\n }\n if (arg === \"--tail\") {\n tail = Number(requireValue(argv, index, \"--tail\"));\n if (!Number.isInteger(tail) || tail < 0) {\n throw new Error(\"--tail must be a non-negative integer\");\n }\n index += 1;\n continue;\n }\n throw new Error(`Unknown logs option: ${arg}`);\n }\n if (!sessionId) {\n throw new Error(\"--session requires a value\");\n }\n return { sessionId, tail, attach, remoteUrl };\n};\n\nexport const runChat = async (options: ChatOptions, io: CliIo): Promise<number> => {\n const configScope = { scorelHomeDir: options.stateDir };\n const loadProjectConfig = async (project: { workDir: string }) =>\n options.config ?? (await loadScorelConfig({ cwd: project.workDir, ...configScope }));\n const loadProjectConfigProfile = async (project: { workDir: string }) =>\n options.config ?? (await loadScorelConfigProfile({ cwd: project.workDir, ...configScope }));\n const daemon = new ScorelHost({\n sessionsDir: options.sessionsDir,\n projectsPath: join(options.stateDir, \"projects.json\"),\n deviceId: asDeviceId(\"device_local\"),\n scorelHomeDir: options.stateDir,\n loadConfig: async ({ project }) => loadProjectConfig(project),\n loadConfigProfile: async ({ project }) => loadProjectConfigProfile(project),\n createRuntime: async ({ sessionId, project, selectedModel, purpose }) => createRealRuntime({\n cwd: project.workDir,\n config: await loadProjectConfig(project),\n sessionsDir: options.sessionsDir,\n sessionId,\n modelSelection: selectedModel ? { modelId: selectedModel.modelId, role: selectedModel.role } : undefined,\n includeTools: purpose === \"chat\",\n }),\n });\n const client = new DaemonClient(createEmbeddedTransport(daemon), {\n clientId: asClientId(\"client_cli\"),\n });\n\n await daemon.start();\n const project = await daemon.registerProject(options.cwd);\n let inFlight = false;\n let rlClose = (): void => undefined;\n const sigintHandler = createSigintHandler({\n isInFlight: () => inFlight,\n cancel: () => client.cancel().then(() => undefined).catch(() => undefined),\n output: io.output,\n exit: () => rlClose(),\n });\n process.on(\"SIGINT\", sigintHandler);\n try {\n await client.connect(options.sessionId);\n const resumed = await loadOrCreateSession(client, options.sessionId, project.projectId);\n io.error.write(`scorel chat ${resumed ? \"resumed\" : \"created\"} session ${options.sessionId}\\n`);\n\n const rl = createInterface({ input: io.input as Readable, crlfDelay: Infinity });\n rlClose = () => rl.close();\n promptIfInteractive(io.output);\n for await (const rawLine of rl) {\n const line = rawLine.trim();\n if (line.length === 0) {\n promptIfInteractive(io.output);\n continue;\n }\n if (line === \".exit\" || line === \".quit\") {\n break;\n }\n\n const unsubscribe = client.subscribe((event) => {\n if (event.type === \"text_delta\") {\n io.output.write(event.delta);\n }\n if (event.type === \"tool_result\") {\n writeToolResult(io.output, event);\n }\n if (event.type === \"error\") {\n writeEventError(io.error, event);\n }\n });\n inFlight = true;\n try {\n await client.sendMessage(line);\n io.output.write(\"\\n\");\n } finally {\n inFlight = false;\n unsubscribe();\n }\n promptIfInteractive(io.output);\n }\n rl.close();\n return 0;\n } catch (cause) {\n io.error.write(`scorel chat error: ${cause instanceof Error ? cause.message : String(cause)}\\n`);\n return 1;\n } finally {\n process.off(\"SIGINT\", sigintHandler);\n client.disconnect();\n await daemon.shutdown();\n }\n};\n\nconst runHeadless = async (options: RunOptions, io: CliIo): Promise<number> => {\n const startedAt = Date.now();\n let projectId: ProjectId | undefined;\n const textParts: string[] = [];\n const prompt = await readRunPrompt(options, io);\n const runConfig = resolveRunConfig(options);\n const configScope = { scorelHomeDir: options.stateDir };\n const loadProjectConfig = async (project: { workDir: string }) =>\n runConfig ?? options.config ?? (await loadScorelConfig({ cwd: project.workDir, ...configScope }));\n const loadProjectConfigProfile = async (project: { workDir: string }) =>\n runConfig ?? options.config ?? (await loadScorelConfigProfile({ cwd: project.workDir, ...configScope }));\n const daemon = new ScorelHost({\n sessionsDir: options.sessionsDir,\n projectsPath: join(options.stateDir, \"projects.json\"),\n deviceId: asDeviceId(\"device_local\"),\n scorelHomeDir: options.stateDir,\n loadConfig: async ({ project }) => loadProjectConfig(project),\n loadConfigProfile: async ({ project }) => loadProjectConfigProfile(project),\n createRuntime: async ({ sessionId, project, selectedModel, purpose }) => createRealRuntime({\n cwd: project.workDir,\n config: await loadProjectConfig(project),\n sessionsDir: options.sessionsDir,\n sessionId,\n modelSelection: selectedModel ? { modelId: selectedModel.modelId, role: selectedModel.role } : undefined,\n includeTools: purpose === \"chat\",\n }),\n });\n const client = new DaemonClient(createEmbeddedTransport(daemon), {\n clientId: asClientId(\"client_cli_run\"),\n });\n let unsubscribe: (() => void) | undefined;\n\n try {\n await daemon.start();\n const project = await daemon.registerProject(options.cwd);\n projectId = project.projectId;\n await client.connect(options.sessionId);\n await loadOrCreateSession(client, options.sessionId, project.projectId, options.modelSelection);\n unsubscribe = client.subscribe((event) => {\n if (event.type === \"text_delta\") {\n textParts.push(event.delta);\n }\n renderRunEvent(options, io, event);\n });\n const send = client.sendMessage(prompt, options.modelSelection ? { modelSelection: options.modelSelection } : undefined);\n const result = options.timeoutMs === undefined\n ? await send\n : await withRunTimeout(send, options.timeoutMs, async () => {\n await client.cancel().catch(() => undefined);\n });\n const summary = makeRunSummary({\n options,\n startedAt,\n projectId,\n status: \"completed\",\n exitReason: \"completed\",\n userEventId: String(result.userEventId),\n assistantEventId: String(result.assistantEventId),\n });\n await writeRunSummary(options.summaryPath, summary);\n renderRunFinal(options, io, summary, textParts.join(\"\"));\n return 0;\n } catch (cause) {\n const isTimeout = cause instanceof RunTimeoutError;\n const summary = makeRunSummary({\n options,\n startedAt,\n projectId,\n status: isTimeout ? \"timeout\" : \"error\",\n exitReason: isTimeout ? \"timeout\" : \"error\",\n error: cause instanceof Error ? cause : new Error(String(cause)),\n });\n await writeRunSummary(options.summaryPath, summary).catch(() => undefined);\n renderRunFinal(options, io, summary, textParts.join(\"\"));\n if (!options.quiet && options.outputFormat === \"text\") {\n io.error.write(`scorel run error: ${summary.error?.message ?? \"unknown error\"}\\n`);\n }\n return isTimeout ? 124 : 1;\n } finally {\n unsubscribe?.();\n client.disconnect();\n await daemon.shutdown();\n }\n};\n\nconst renderRunEvent = (options: RunOptions, io: CliIo, event: ScorelEvent): void => {\n if (options.outputFormat === \"none\" || options.outputFormat === \"json\") {\n return;\n }\n if (options.outputFormat === \"stream-json\") {\n writeJsonLine(io.output, { type: \"event\", event });\n return;\n }\n if (event.type === \"text_delta\") {\n io.output.write(event.delta);\n }\n if (event.type === \"tool_result\") {\n writeToolResult(io.output, event);\n }\n if (event.type === \"error\") {\n writeEventError(io.error, event);\n }\n};\n\nconst renderRunFinal = (options: RunOptions, io: CliIo, summary: RunSummary, text: string): void => {\n if (options.outputFormat === \"none\") {\n return;\n }\n if (options.outputFormat === \"json\") {\n io.output.write(`${JSON.stringify({ ...summary, result: text })}\\n`);\n return;\n }\n if (options.outputFormat === \"stream-json\") {\n writeJsonLine(io.output, { type: \"result\", summary, result: text });\n return;\n }\n if (!text.endsWith(\"\\n\")) {\n io.output.write(\"\\n\");\n }\n};\n\nconst writeJsonLine = (output: NodeJS.WritableStream, value: unknown): void => {\n output.write(`${JSON.stringify(value)}\\n`);\n};\n\nclass RunTimeoutError extends Error {\n constructor(timeoutMs: number) {\n super(`run timed out after ${timeoutMs}ms`);\n this.name = \"RunTimeoutError\";\n }\n}\n\nconst withRunTimeout = async <T,>(promise: Promise<T>, timeoutMs: number, onTimeout: () => Promise<void>): Promise<T> => {\n let timeout: NodeJS.Timeout | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_resolve, reject) => {\n timeout = setTimeout(() => {\n void onTimeout().finally(() => reject(new RunTimeoutError(timeoutMs)));\n }, timeoutMs);\n }),\n ]);\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n};\n\nconst makeRunSummary = (input: {\n options: RunOptions;\n startedAt: number;\n projectId?: ProjectId;\n status: RunSummary[\"status\"];\n exitReason: RunSummary[\"exitReason\"];\n userEventId?: string;\n assistantEventId?: string;\n error?: Error;\n}): RunSummary => ({\n status: input.status,\n sessionId: String(input.options.sessionId),\n ...(input.projectId ? { projectId: String(input.projectId) } : {}),\n cwd: input.options.cwd,\n stateDir: input.options.stateDir,\n sessionsDir: input.options.sessionsDir,\n sessionJsonl: join(input.options.sessionsDir, `${input.options.sessionId}.jsonl`),\n outputFormat: input.options.outputFormat,\n elapsedMs: Date.now() - input.startedAt,\n exitReason: input.exitReason,\n ...(input.userEventId ? { userEventId: input.userEventId } : {}),\n ...(input.assistantEventId ? { assistantEventId: input.assistantEventId } : {}),\n ...(input.error ? { error: { message: input.error.message } } : {}),\n});\n\nconst writeRunSummary = async (path: string | undefined, summary: RunSummary): Promise<void> => {\n if (!path) {\n return;\n }\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify(summary, null, 2)}\\n`);\n};\n\nconst readRunPrompt = async (options: RunOptions, io: CliIo): Promise<string> => {\n if (options.promptSource === \"prompt-file\") {\n return (await readFile(options.promptFile!, \"utf8\")).trim();\n }\n if (options.promptSource === \"stdin\") {\n const chunks: Buffer[] = [];\n for await (const chunk of io.input) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n }\n return Buffer.concat(chunks).toString(\"utf8\").trim();\n }\n return (options.prompt ?? \"\").trim();\n};\n\nconst resolveRunConfig = (options: RunOptions): ScorelConfig | undefined => {\n const override = options.providerOverride;\n if (!override || (!override.provider && !override.api && !override.baseUrl && !override.apiKey)) {\n return undefined;\n }\n if (!override.baseUrl) {\n throw new Error(\"--base-url is required when overriding the run provider\");\n }\n if (!override.apiKey) {\n throw new Error(\"--api-key is required when overriding the run provider\");\n }\n if (!options.modelSelection?.modelId) {\n throw new Error(\"--model <model-id> is required when overriding the run provider\");\n }\n const providerId = \"run\";\n const providerModelId = \"run_model\";\n const availableModelId = options.modelSelection.modelId;\n return {\n providers: {\n [providerId]: {\n type: \"custom\",\n api: override.api ?? \"openai-completions\",\n provider: override.provider ?? \"openai\",\n baseUrl: stripTrailingSlashes(override.baseUrl),\n apiKey: override.apiKey,\n },\n },\n providerModels: {\n [providerModelId]: {\n provider: providerId,\n id: availableModelId,\n displayName: availableModelId,\n },\n },\n models: {\n [availableModelId]: {\n model: providerModelId,\n displayName: availableModelId,\n },\n },\n modelProfile: {\n roles: {\n primary: availableModelId,\n standard: availableModelId,\n auxiliary: availableModelId,\n },\n },\n memory: {\n enabled: false,\n daily: false,\n sessionMemory: false,\n autoDream: false,\n promoteRoot: false,\n dreamIdleMinutes: 60,\n autoCompactThreshold: 0.8,\n },\n runtime: {\n tokenSavingRtk: false,\n },\n extensions: {},\n };\n};\n\nconst stripTrailingSlashes = (value: string): string => value.replace(/\\/+$/, \"\");\n\nexport type SigintHandlerOptions = {\n /** Returns true when a chat turn is mid-flight; daemon should be cancelled. */\n isInFlight: () => boolean;\n /** Best-effort daemon cancel (no rejection surfaces). */\n cancel: () => Promise<void>;\n /** Stream to write the cancellation marker to. */\n output: NodeJS.WritableStream;\n /** Called when the handler decides to exit the REPL (idle Ctrl-C). */\n exit: () => void;\n};\n\n/**\n * Build a SIGINT handler that cancels in-flight turns without exiting; a\n * subsequent SIGINT during idle exits via `exit`. Factored out so unit tests\n * can drive it without poking real process signals.\n */\nexport const createSigintHandler = (options: SigintHandlerOptions): () => void => {\n return () => {\n if (options.isInFlight()) {\n options.output.write(\"\\n[cancelled]\\n\");\n void options.cancel().catch(() => undefined);\n return;\n }\n options.exit();\n };\n};\n\nconst loadOrCreateSession = async (\n client: DaemonClient,\n sessionId: SessionId,\n projectId: ReturnType<typeof asProjectId>,\n modelSelection?: ModelSelectionInput,\n): Promise<boolean> => {\n try {\n await client.loadSession(sessionId);\n return true;\n } catch {\n await client.createSession({\n sessionId,\n meta: { projectId, ...(modelSelection ? { modelSelection } : {}) },\n });\n return false;\n }\n};\n\nconst parseChatOptions = (argv: string[]): ChatOptions => {\n let sessionId = asSessionId(\"ses_default\");\n let cwd = process.cwd();\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--session\") {\n sessionId = asSessionId(requireValue(argv, index, \"--session\"));\n index += 1;\n continue;\n }\n if (arg === \"--cwd\") {\n cwd = requireValue(argv, index, \"--cwd\");\n index += 1;\n continue;\n }\n throw new Error(`Unknown chat option: ${arg}`);\n }\n\n const sessionsDir = defaultSessionsDir();\n return { sessionId, sessionsDir, stateDir: stateDirFromSessionsDir(sessionsDir), cwd };\n};\n\nconst parseRunOptions = (argv: string[], runOptions: CliRunOptions): RunOptions => {\n const promptSources: Array<Pick<RunOptions, \"promptSource\" | \"prompt\" | \"promptFile\">> = [];\n let sessionId = asSessionId(`ses_run_${Date.now().toString(36)}`);\n let cwd = process.cwd();\n let stateDir: string | undefined;\n let sessionsDir: string | undefined = runOptions.sessionsDir;\n let timeoutMs: number | undefined;\n let outputFormat: RunOutputFormat = \"text\";\n let summaryPath: string | undefined;\n let quiet = false;\n let modelSelection: ModelSelectionInput | undefined;\n const providerOverride: RunProviderOverride = {};\n const positional: string[] = [];\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--prompt\") {\n promptSources.push({ promptSource: \"prompt\", prompt: requireValue(argv, index, \"--prompt\") });\n index += 1;\n continue;\n }\n if (arg === \"--prompt-file\") {\n promptSources.push({ promptSource: \"prompt-file\", promptFile: requireValue(argv, index, \"--prompt-file\") });\n index += 1;\n continue;\n }\n if (arg === \"--stdin\") {\n promptSources.push({ promptSource: \"stdin\" });\n continue;\n }\n if (arg === \"--session\") {\n sessionId = asSessionId(requireValue(argv, index, \"--session\"));\n index += 1;\n continue;\n }\n if (arg === \"--cwd\") {\n cwd = requireValue(argv, index, \"--cwd\");\n index += 1;\n continue;\n }\n if (arg === \"--state-dir\") {\n stateDir = requireValue(argv, index, \"--state-dir\");\n index += 1;\n continue;\n }\n if (arg === \"--sessions-dir\") {\n sessionsDir = requireValue(argv, index, \"--sessions-dir\");\n index += 1;\n continue;\n }\n if (arg === \"--timeout-ms\") {\n timeoutMs = parsePositiveInteger(requireValue(argv, index, \"--timeout-ms\"), \"--timeout-ms\");\n index += 1;\n continue;\n }\n if (arg === \"--output-format\") {\n outputFormat = parseRunOutputFormat(requireValue(argv, index, \"--output-format\"));\n index += 1;\n continue;\n }\n if (arg === \"--summary\") {\n summaryPath = requireValue(argv, index, \"--summary\");\n index += 1;\n continue;\n }\n if (arg === \"--quiet\") {\n quiet = true;\n continue;\n }\n if (arg === \"--model\") {\n modelSelection = parseModelSelection(requireValue(argv, index, \"--model\"));\n index += 1;\n continue;\n }\n if (arg === \"--provider\") {\n providerOverride.provider = requireValue(argv, index, \"--provider\");\n index += 1;\n continue;\n }\n if (arg === \"--api\" || arg === \"--protocol\") {\n providerOverride.api = parseRunProviderApi(requireValue(argv, index, arg));\n index += 1;\n continue;\n }\n if (arg === \"--base-url\" || arg === \"--baseurl\") {\n providerOverride.baseUrl = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n if (arg === \"--api-key\" || arg === \"--apikey\") {\n providerOverride.apiKey = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n if (arg.startsWith(\"-\")) {\n throw new Error(`Unknown run option: ${arg}`);\n }\n positional.push(arg);\n }\n\n if (positional.length > 0) {\n promptSources.unshift({ promptSource: \"argument\", prompt: positional.join(\" \") });\n }\n if (promptSources.length !== 1) {\n throw new Error(\"scorel run requires exactly one prompt source\");\n }\n\n const resolvedStateDir = stateDir ?? stateDirFromSessionsDir(sessionsDir);\n const resolvedSessionsDir = sessionsDir ?? join(resolvedStateDir, \"sessions\");\n return {\n ...promptSources[0],\n sessionId,\n cwd,\n stateDir: resolvedStateDir,\n sessionsDir: resolvedSessionsDir,\n timeoutMs,\n outputFormat,\n summaryPath,\n quiet,\n modelSelection,\n providerOverride,\n config: runOptions.config,\n };\n};\n\nconst parseRunOutputFormat = (value: string): RunOutputFormat => {\n if (value === \"text\" || value === \"json\" || value === \"stream-json\" || value === \"none\") {\n return value;\n }\n throw new Error(\"--output-format must be text, json, stream-json, or none\");\n};\n\nconst parsePositiveInteger = (value: string, flag: string): number => {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`${flag} must be a positive integer`);\n }\n return parsed;\n};\n\nconst parseModelSelection = (value: string): ModelSelectionInput => {\n if (value === \"primary\" || value === \"standard\" || value === \"auxiliary\") {\n return { role: value as ModelRole };\n }\n return { modelId: value };\n};\n\nconst parseRunProviderApi = (value: string): RunProviderApi => {\n if (\n value === \"openai-completions\" ||\n value === \"openai-responses\" ||\n value === \"google-generative-ai\" ||\n value === \"anthropic-messages\"\n ) {\n return value;\n }\n throw new Error(\"--api must be openai-completions, openai-responses, google-generative-ai, or anthropic-messages\");\n};\n\nconst requireValue = (argv: string[], index: number, flag: string): string => {\n const value = argv[index + 1];\n if (!value) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n};\n\nconst promptIfInteractive = (output: NodeJS.WritableStream): void => {\n if ((output as Writable & { isTTY?: boolean }).isTTY) {\n output.write(\"> \");\n }\n};\n\nconst writeUsage = (output: NodeJS.WritableStream): void => {\n output.write(\n [\n \"Usage: scorel chat [--session <id>] [--cwd <dir>]\",\n \" scorel [--session <id>] [--cwd <dir>]\",\n \" scorel run [prompt] [--prompt <text> | --prompt-file <path> | --stdin]\",\n \" [--cwd <dir>] [--state-dir <dir>] [--sessions-dir <dir>]\",\n \" [--session <id>] [--timeout-ms <ms>]\",\n \" [--output-format text|json|stream-json|none] [--summary <path>]\",\n \" [--provider <name>] [--api|--protocol <protocol>]\",\n \" [--base-url|--baseurl <url>] [--api-key|--apikey <key>] [--model <id>]\",\n \" scorel attach --session <id> --remote <ws-url> --token <token>\",\n \" scorel host start [--host <h>] [--port <p>] [--token <t>] [--project <dir>]\",\n \" [--relay <relay-url> | --no-relay] [--replace] [--idle-timeout-ms <ms>]\",\n \" scorel host serve [--host <h>] [--port <p>] [--token <t>] [--project <dir>]\",\n \" [--relay <relay-url> | --no-relay] [--replace] [--idle-timeout-ms <ms>]\",\n \" scorel host status [--show-token]\",\n \" scorel host stop\",\n \" scorel host reset\",\n \" scorel pair <pair-code> [--relay <relay-url>]\",\n \" scorel relay serve [--host <h>] [--port <p>] [--data-dir <dir>]\",\n \" scorel webui [--port <p>] [--host <h>]\",\n \" scorel up [--daemon-port <p>] [--webui-port <p>] [--cwd <d>]\",\n \" scorel update\",\n \" scorel upgrade\",\n \" scorel version\",\n \" scorel logs [--attach] --session <id> [--remote <ws-url>] [--tail <n>]\",\n \" scorel project list\",\n \" scorel project add <dir>\",\n \" scorel project remove <project-id>\",\n ].join(\"\\n\") + \"\\n\",\n );\n};\n\nconst writeRunUsage = (output: NodeJS.WritableStream): void => {\n output.write(\n [\n \"Usage: scorel run [prompt]\",\n \" scorel run --prompt <text>\",\n \" scorel run --prompt-file <path>\",\n \" scorel run --stdin\",\n \"\",\n \"Options:\",\n \" --cwd <dir>\",\n \" --state-dir <dir>\",\n \" --sessions-dir <dir>\",\n \" --session <id>\",\n \" --timeout-ms <ms>\",\n \" --output-format text|json|stream-json|none\",\n \" --summary <path>\",\n \" --quiet\",\n \" --model <primary|standard|auxiliary|model-id>\",\n \" --provider <name>\",\n \" --api, --protocol <openai-completions|openai-responses|google-generative-ai|anthropic-messages>\",\n \" --base-url, --baseurl <url>\",\n \" --api-key, --apikey <key>\",\n \"\",\n \"Examples:\",\n ' scorel run --prompt \"Summarize this project\" --output-format json',\n \" scorel run --prompt-file /tmp/instruction.txt --cwd /workspace --state-dir /tmp/scorel-state \\\\\",\n \" --api openai-completions --baseurl http://127.0.0.1:4000/v1 --apikey \\\"$API_KEY\\\" \\\\\",\n \" --model gpt-5.4-mini --output-format none --summary /logs/agent/scorel-summary.json\",\n ].join(\"\\n\") + \"\\n\",\n );\n};\n\nconst writeProjectUsage = (output: NodeJS.WritableStream): void => {\n output.write(\"Usage: scorel project list | add <dir> | remove <project-id>\\n\");\n};\n\nconst writeEventError = (output: NodeJS.WritableStream, event: ErrorEvent): void => {\n output.write(`scorel event error: ${event.message}\\n`);\n};\n\nconst writeToolResult = (output: NodeJS.WritableStream, event: Extract<ScorelEvent, { type: \"tool_result\" }>): void => {\n const block = event.message.content.find((candidate) => candidate.type === \"tool_result\");\n if (!block || typeof block.result !== \"object\" || block.result === null) {\n return;\n }\n const result = block.result as { content?: Array<{ type: string; text?: string }> };\n const text = result.content?.find((candidate) => candidate.type === \"text\")?.text ?? \"\";\n output.write(`\\n[tool:${block.toolName}]${block.isError ? \" error\" : \"\"}\\n${text}\\n`);\n};\n\nconst redactDiagnosticFields = (fields: Record<string, unknown>): Record<string, unknown> =>\n Object.fromEntries(\n Object.entries(fields).map(([key, value]) => [\n key,\n /token|secret|api[-_]?key|authorization/i.test(key) ? \"[redacted]\" : value,\n ]),\n );\n\nconst formatDiagnosticLine = (fields: Record<string, unknown>): string =>\n Object.entries(fields)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${key}=${formatDiagnosticValue(value)}`)\n .join(\" \");\n\nconst formatDiagnosticValue = (value: unknown): string => {\n const text = typeof value === \"string\" ? value : String(value);\n return /^[A-Za-z0-9_./:@+-]+$/.test(text) ? text : JSON.stringify(text);\n};\n\nclass AttachEventRenderer {\n readonly #output: NodeJS.WritableStream;\n readonly #error: NodeJS.WritableStream;\n readonly #printedPersistentIds = new Set<string>();\n readonly #streamedMessageIds = new Set<string>();\n #atLineStart = true;\n\n constructor(output: NodeJS.WritableStream, error: NodeJS.WritableStream) {\n this.#output = output;\n this.#error = error;\n }\n\n renderBacklog(events: PersistentEvent[]): void {\n for (const event of events) {\n this.#render(event);\n }\n }\n\n renderTransientBacklog(transients: CachedTransientMessage[]): void {\n for (const transient of transients) {\n this.#streamedMessageIds.add(transient.eventId);\n this.#write(transient.text);\n }\n }\n\n renderLive(event: ScorelEvent): void {\n this.#render(event);\n }\n\n endLine(): void {\n if (!this.#atLineStart) {\n this.#write(\"\\n\");\n }\n }\n\n writeLine(text: string): void {\n this.#ensureLineStart();\n this.#write(`${text}\\n`);\n }\n\n promptIfInteractive(): void {\n if ((this.#output as Writable & { isTTY?: boolean }).isTTY) {\n this.#write(\"> \");\n }\n }\n\n #render(event: ScorelEvent): void {\n if (event.type === \"text_delta\") {\n this.#streamedMessageIds.add(String(event.eventId));\n this.#write(event.delta);\n return;\n }\n if (event.type === \"error\") {\n this.endLine();\n writeEventError(this.#error, event);\n return;\n }\n if (!(\"id\" in event) || this.#printedPersistentIds.has(String(event.id))) {\n return;\n }\n this.#printedPersistentIds.add(String(event.id));\n\n if (event.type === \"user_message\") {\n this.#ensureLineStart();\n this.#write(`[user] ${blocksToText(event.message.content)}\\n`);\n return;\n }\n if (event.type === \"assistant_message\") {\n if (this.#streamedMessageIds.has(String(event.id))) {\n this.endLine();\n return;\n }\n const text = blocksToText(event.message.content);\n if (text.length > 0) {\n this.#ensureLineStart();\n this.#write(`${text}\\n`);\n }\n return;\n }\n if (event.type === \"tool_result\") {\n this.#ensureLineStart();\n writeToolResult(this.#output, event);\n this.#atLineStart = true;\n }\n }\n\n #ensureLineStart(): void {\n if (!this.#atLineStart) {\n this.#write(\"\\n\");\n }\n }\n\n #write(text: string): void {\n this.#output.write(text);\n this.#atLineStart = text.endsWith(\"\\n\");\n }\n}\n\nconst blocksToText = (blocks: ContentBlock[]): string =>\n blocks\n .flatMap((block): string[] => {\n if (block.type === \"text\") {\n if (block.visibility === \"model\") {\n return [];\n }\n return [block.text];\n }\n if (block.type === \"system_reminder\" && block.visibility !== \"model\") {\n return [block.text];\n }\n return [];\n })\n .join(\"\");\n\nconst isCliEntrypoint = async (): Promise<boolean> => {\n if (!process.argv[1]) return false;\n const [argvPath, modulePath] = await Promise.all([\n realpath(process.argv[1]).catch(() => process.argv[1]),\n realpath(fileURLToPath(import.meta.url)).catch(() => fileURLToPath(import.meta.url)),\n ]);\n return argvPath === modulePath;\n};\n\nif (process.env.SCOREL_SKIP_INDEX_ENTRY !== \"1\" && await isCliEntrypoint()) {\n runCli(process.argv.slice(2)).then((code) => {\n process.exitCode = code;\n });\n}\n", "#!/usr/bin/env node\nprocess.env.SCOREL_SKIP_INDEX_ENTRY = \"1\";\n\nconst { runCli } = await import(\"./index.js\");\n\nrunCli(process.argv.slice(2)).then((code) => {\n process.exitCode = code;\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["init_src", "resolve", "project", "dirname", "join", "readdir", "realpath", "stat", "errorMessage", "readFile", "readdir", "join", "isRecord", "isNodeError", "readFile", "join", "section", "randomUUID", "mkdir", "readFile", "rename", "stat", "writeFile", "basename", "dirname", "isRecord", "selected", "Type", "isRecord", "Type", "optionalString", "isRecord", "readFile", "dirname", "resolve", "requireString", "requireIdentifier", "isRecord", "readdir", "readFile", "homedir", "dirname", "join", "resolve", "isNodeErrorCode", "section", "mkdir", "readFile", "writeFile", "homedir", "join", "Type", "requireString", "optionalNumber", "optionalString", "isRecord", "isNodeErrorCode", "createHash", "appendFile", "mkdir", "readFile", "writeFile", "dirname", "join", "isRecord", "section", "createHash", "existsSync", "readdir", "readFile", "stat", "homedir", "dirname", "join", "resolve", "Type", "findGitRoot", "isNodeErrorCode", "init_src", "randomUUID", "mkdir", "readFile", "writeFile", "join", "WebSocket", "resolve", "WebSocket", "waitForOpen", "resolve", "execFile", "existsSync", "appendFile", "mkdir", "readFile", "readdir", "rename", "rm", "writeFile", "userInfo", "basename", "dirname", "join", "resolve", "promisify", "execFileAsync", "isNodeErrorCode", "compactLine", "nonNegativeInteger", "resolveDefaultShell", "shellCommandArgs", "userShell", "isRecord", "normalizeMarkdownFile", "init_src", "result", "homedir", "join", "init_src", "readFile", "dirname", "join", "promisify", "execFileAsync", "execFile", "randomUUID", "homedir", "dirname", "join", "fileURLToPath", "defaultStateDir", "requireValue", "init_src", "resolve", "mkdir", "readFile", "writeFile", "join", "WebSocketServer", "sendJson", "closeWebSocketServer", "resolve", "homedir", "join", "DEFAULT_HOST", "DEFAULT_PORT", "requireValue", "resolve", "spawn", "homedir", "dirname", "join", "fileURLToPath", "defaultStateDir", "requireValue", "waitForDaemonReady", "detachBackgroundDaemon", "nodeEntrypointArgs", "init_src", "spawn", "existsSync", "dirname", "resolve", "fileURLToPath", "DEFAULT_PORT", "DEFAULT_HOST", "requireValue", "createHash", "appendFile", "mkdir", "readFile", "realpath", "readdir", "writeFile", "homedir", "fileURLToPath", "basename", "dirname", "join", "defaultStateDir", "stripTrailingSlashes", "requireValue", "formatDiagnosticLine", "formatDiagnosticValue", "init_src", "resolve", "project", "runCli"]
7
7
  }