@dreb/dashboard 2.55.1 → 2.55.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/shared/protocol.d.ts +16 -5
- package/dist/shared/protocol.d.ts.map +1 -1
- package/dist/shared/protocol.js.map +1 -1
- package/dist/static/assets/{index-DhXUx51e.js → index-MJ5nXWOn.js} +5 -5
- package/dist/static/index.html +1 -1
- package/dist/static/sw.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -47,7 +47,7 @@ Open `http://127.0.0.1:5343`.
|
|
|
47
47
|
settings/model/scoped-models, import/export, session tree, fork, new/compact/dream,
|
|
48
48
|
resume/reload, and quit), image attach/paste with sent-image previews retained in user transcript entries,
|
|
49
49
|
queued-message restore, persistent session-header live indicator, footer-parity info bar (branch, tokens, cost, ctx%,
|
|
50
|
-
median tok/s), stats/loaded-context/fork modals, steer/follow-up composer
|
|
50
|
+
latest-100 median tok/s with sample count and long-term delta), stats/loaded-context/fork modals, steer/follow-up composer
|
|
51
51
|
modes, ■ abort, model/thinking switchers, extension-UI modals, export HTML,
|
|
52
52
|
and live auto-naming.
|
|
53
53
|
- **Subagent drill-in** — read-only transcript of a background agent: live
|
|
@@ -117,14 +117,25 @@ export interface SessionStatsDto {
|
|
|
117
117
|
cost: number;
|
|
118
118
|
contextUsage?: ContextUsageDto;
|
|
119
119
|
}
|
|
120
|
-
export interface
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
120
|
+
export interface PerformanceModelSummaryDto {
|
|
121
|
+
provider: string;
|
|
122
|
+
modelId: string;
|
|
123
|
+
rolling: {
|
|
124
124
|
median: number;
|
|
125
125
|
mean: number;
|
|
126
126
|
count: number;
|
|
127
|
-
}
|
|
127
|
+
};
|
|
128
|
+
delta: {
|
|
129
|
+
baselineMedian: number;
|
|
130
|
+
recentMedian: number;
|
|
131
|
+
percentDelta: number;
|
|
132
|
+
direction: "above" | "below" | "stable";
|
|
133
|
+
baselineCount: number;
|
|
134
|
+
recentCount: number;
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
export interface PerformanceStatsDto {
|
|
138
|
+
models: PerformanceModelSummaryDto[];
|
|
128
139
|
}
|
|
129
140
|
export interface ResourcesDto {
|
|
130
141
|
contextFiles: Array<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/shared/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Wire types shared between the dashboard server and the browser client.\n *\n * These are standalone definitions (not imports from @dreb/coding-agent) so the\n * client bundle stays free of node-flavored type resolution. Server code maps\n * RPC DTOs onto these shapes; TypeScript structural typing enforces\n * compatibility at the mapping sites.\n */\n\n/** Session metadata (mirrors RpcSessionInfo). */\nexport interface SessionInfoDto {\n\tpath: string;\n\tid: string;\n\tcwd: string;\n\tname?: string;\n\tcreated: string;\n\tmodified: string;\n\tmessageCount: number;\n\tfirstMessage: string;\n}\n\n/** On-disk session inventory, independent of live runtime state. */\nexport interface SessionInventoryDto {\n\tsessions: SessionInfoDto[];\n}\n\nexport interface ArbitrationRouteDto {\n\tagent: string;\n\tmodel: string;\n\tthinking: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n}\n\nexport interface SubagentArbitrationDto {\n\tstatus: \"success\" | \"failure\";\n\tproposed: ArbitrationRouteDto;\n\tfinal: ArbitrationRouteDto | null;\n\tchanged: Array<\"agent\" | \"model\" | \"thinking\">;\n\tstep?: number;\n\terrorCode?: string;\n\terrorMessage?: string;\n}\n\n/** Background agent metadata (mirrors RpcBackgroundAgentInfo). */\nexport interface BackgroundAgentDto {\n\tagentId: string;\n\tagentType: string;\n\ttaskSummary: string;\n\tstartedAt: string;\n\tstatus: \"running\" | \"completed\" | \"failed\";\n\tsessionDir?: string;\n\tsessionFile?: string;\n\tcwd?: string;\n\tarbitrations?: SubagentArbitrationDto[];\n}\n\n/**\n * Shared eviction cap for completed/failed background agents. The server\n * prunes its registry to this bound and the client applies the same cap as\n * defense-in-depth — the two sides must agree on how many completed agents\n * survive, so the constant lives here.\n */\nexport const MAX_COMPLETED_BACKGROUND_AGENTS = 20;\n\n/** Maximum JSON prompt request body accepted by the dashboard server. */\nexport const MAX_PROMPT_BODY_BYTES = 25 * 1024 * 1024;\n\n/** Maximum accepted JSON body for optional, payload-free SSE client diagnostics. */\nexport const MAX_CLIENT_DIAGNOSTIC_BYTES = 4 * 1024;\n\nexport type EventConnectionState =\n\t| \"connecting\"\n\t| \"connected\"\n\t| \"retrying\"\n\t| \"resyncing\"\n\t| \"disconnected\"\n\t| \"auth_failed\";\n\n/**\n * Deliberately payload-free client connection telemetry. It is useful for\n * correlating stream failures with server logs, without sending prompts,\n * cookies, tool data, or SSE event contents back to the server.\n */\nexport interface ClientConnectionDiagnosticDto {\n\tconnectionId: string;\n\tstate: EventConnectionState;\n\tpreviousState?: EventConnectionState;\n\tattempt: number;\n\tdelayMs?: number;\n\tvisibility: \"visible\" | \"hidden\";\n\tlastAppliedSeq?: number;\n\theartbeatAgeMs?: number;\n\teventCount: number;\n\teventRatePerMinute: number;\n\tprocessingLagTotalMs: number;\n\tprocessingLagMaxMs: number;\n}\n\n/**\n * Inline images are base64-encoded inside the JSON prompt body. Base64 expands\n * raw bytes by 4/3, so a 25 MiB body can carry at most floor(25 MiB * 3/4) =\n * 18.75 MiB of raw image data before JSON syntax and prompt text. Reserve the\n * remaining 0.75 MiB for that overhead and advertise an 18 MiB aggregate raw\n * image budget to the browser.\n */\nexport const MAX_TOTAL_IMAGE_BYTES = Math.floor((MAX_PROMPT_BODY_BYTES * 3) / 4) - 768 * 1024;\n\n/** Context usage (mirrors ContextUsage — the numbers the TUI footer shows). */\nexport interface ContextUsageDto {\n\ttokens: number | null;\n\tcontextWindow: number;\n\tpercent: number | null;\n}\n\nexport interface ScopedModelDto {\n\tprovider: string;\n\tid: string;\n\tname?: string;\n\treasoning?: boolean;\n\tthinkingLevel?: string;\n}\n\nexport interface SessionStatsDto {\n\tsessionFile?: string;\n\tsessionId: string;\n\tuserMessages: number;\n\tassistantMessages: number;\n\ttoolCalls: number;\n\ttoolResults: number;\n\ttotalMessages: number;\n\ttokens: {\n\t\tinput: number;\n\t\toutput: number;\n\t\tcacheRead: number;\n\t\tcacheWrite: number;\n\t\ttotal: number;\n\t};\n\tcost: number;\n\tcontextUsage?: ContextUsageDto;\n}\n\nexport interface PerformanceStatsDto {\n\tmodels: Array<{ provider: string; modelId: string; median: number; mean: number; count: number }>;\n}\n\nexport interface ResourcesDto {\n\tcontextFiles: Array<{ path: string }>;\n\tskills: Array<{ name: string; description: string }>;\n\textensions: Array<{ name?: string; path: string }>;\n\tpromptTemplates: Array<{ name: string; description?: string }>;\n\tsystemPromptPresent: boolean;\n}\n\nexport interface ImageAttachmentDto {\n\tdata: string;\n\tmimeType: string;\n}\n\n/**\n * Browser-facing reference to a validated tool-result raster image. Original\n * bytes remain behind authenticated runtime routes and never cross transcript\n * JSON or SSE payloads.\n */\nexport interface DashboardImageReferenceDto {\n\ttype: \"image_reference\";\n\t/** SHA-256 of the exact MIME type plus decoded original bytes. */\n\tid: string;\n\t/** Exact allowlisted original MIME type. */\n\tmimeType: \"image/png\" | \"image/jpeg\" | \"image/gif\" | \"image/webp\";\n\t/** Decoded original binary byte size. */\n\tsize: number;\n}\n\nexport const DASHBOARD_IMAGE_DISPLAY_MODES = [\"placeholders\", \"previews\", \"originals\"] as const;\nexport type DashboardImageDisplayMode = (typeof DASHBOARD_IMAGE_DISPLAY_MODES)[number];\n\nexport interface QueuedMessageDto {\n\ttext: string;\n\timages?: ImageAttachmentDto[];\n}\n\nexport interface PendingMessagesDto {\n\t/** Text-only compatibility view. */\n\tsteering: string[];\n\t/** Text-only compatibility view. */\n\tfollowUp: string[];\n\t/** Full queued payloads, including inline image attachments. */\n\tsteeringMessages?: QueuedMessageDto[];\n\t/** Full queued payloads, including inline image attachments. */\n\tfollowUpMessages?: QueuedMessageDto[];\n}\n\nexport interface CommandDto {\n\tname: string;\n\tdescription?: string;\n\tsource: \"extension\" | \"prompt\" | \"skill\" | \"builtin\";\n\t/** Built-ins with false are intercepted when typed but omitted from autocomplete. */\n\tdashboard?: boolean;\n}\n\nexport interface SessionTreeNodeDto {\n\tid: string;\n\tparentId: string | null;\n\ttype: string;\n\trole?: string;\n\tpreview: string;\n\ttimestamp: string;\n\tlabel?: string;\n\tchildren: SessionTreeNodeDto[];\n}\n\nexport interface RuntimeStatsSummaryDto {\n\ttokensTotal: number;\n\tcost: number;\n}\n\n/** Current task list (mirrors RpcSessionTask). */\nexport interface SessionTaskDto {\n\tid: string;\n\ttitle: string;\n\tstatus: \"pending\" | \"in_progress\" | \"completed\";\n}\n\n/** Live session state (mirrors RpcSessionState, model reduced to id fields). */\nexport interface SessionStateDto {\n\tmodel?: { provider: string; id: string; name?: string; reasoning?: boolean };\n\tscopedModels?: ScopedModelDto[];\n\tusingSubscription?: boolean;\n\t/** Current task list, atomically replaced by tasks_update events. */\n\ttasks: SessionTaskDto[];\n\tthinkingLevel: string;\n\tisStreaming: boolean;\n\t/** True while automatic retry classification, backoff, or execution is active. */\n\tisRetrying?: boolean;\n\t/** Current automatic retry attempt, or 0 outside an emitted retry attempt. */\n\tretryAttempt?: number;\n\tisCompacting: boolean;\n\tsteeringMode: \"all\" | \"one-at-a-time\";\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\tsessionFile?: string;\n\tsessionId: string;\n\tsessionName?: string;\n\tautoCompactionEnabled: boolean;\n\tmessageCount: number;\n\tpendingMessageCount: number;\n\tcontextUsage?: ContextUsageDto;\n\tmodelFallbackMessage?: string;\n}\n\n/** A live runtime managed by the dashboard server's pool. */\nexport interface RuntimeInfoDto {\n\t/** Pool key — stable identity for API calls and SSE envelopes. */\n\tkey: string;\n\tcwd: string;\n\tstate: SessionStateDto;\n\t/** Lean session stats for fleet cards; omitted when the runtime stats call fails. */\n\tstats?: RuntimeStatsSummaryDto;\n\t/** Background agents known to this runtime. */\n\tbackgroundAgents: BackgroundAgentDto[];\n\t/** Server-derived needs-attention flag (extension UI pending, paused, error). */\n\tneedsAttention: boolean;\n\t/** Runtime-level error that should survive browser reloads. */\n\terror?: string;\n\t/** Last assistant text, truncated for fleet-card previews. */\n\tlastAssistantText?: string;\n\t/** Session start timestamp (ISO) — stable tiebreak for deterministic fleet ordering. */\n\tcreatedAt: string;\n\t/** Last activity timestamp (ISO). */\n\tlastActivity: string;\n}\n\n/**\n * Lightweight, event-derived live-runtime view for fleet SSE updates.\n *\n * Unlike RuntimeInfoDto, this deliberately excludes RPC-fetched stats and\n * assistant preview text: RuntimePool can build it synchronously from its\n * in-memory runtime registry.\n */\nexport interface FleetRuntimeSnapshotDto {\n\tkey: string;\n\tcwd: string;\n\tstate: SessionStateDto;\n\tbackgroundAgents: BackgroundAgentDto[];\n\tneedsAttention: boolean;\n\terror?: string;\n\tcreatedAt: string;\n\tlastActivity: string;\n}\n\n/** Coalesced fleet update published on the dashboard SSE stream. */\nexport interface FleetSnapshotEventDto {\n\ttype: \"fleet_snapshot\";\n\truntimes: FleetRuntimeSnapshotDto[];\n}\n\n/** Fleet snapshot: live runtimes + on-disk inventory. */\nexport interface FleetDto {\n\truntimes: RuntimeInfoDto[];\n\tdiskSessions: SessionInfoDto[];\n}\n\n/** A single question inside an `ask` extension-UI request (mirrors RpcAskQuestion). */\nexport interface AskUiQuestionDto {\n\tquestion: string;\n\ttitle?: string;\n\toptions?: string[];\n\tallowFreeText?: boolean;\n\tmultiSelect?: boolean;\n\tmultiline?: boolean;\n}\n\n/** A blocking extension UI request that can be restored from a runtime snapshot. */\nexport interface ExtensionUiRequestDto {\n\ttype: \"extension_ui_request\";\n\tid: string;\n\tmethod: \"select\" | \"confirm\" | \"input\" | \"editor\" | \"ask\";\n\ttitle: string;\n\tmessage?: string;\n\toptions?: string[];\n\tprefill?: string;\n\tplaceholder?: string;\n\t/** For the `ask` method: one or more questions asked together as a single wizard. */\n\tquestions?: AskUiQuestionDto[];\n\ttimeout?: number;\n\t/** Absolute Unix timestamp in milliseconds when the runtime timeout fires. */\n\texpiresAt?: number;\n}\n\n/**\n * Atomic parent-session snapshot for drill-in hydration. Its barrier sequence\n * marks the SSE ordering point captured by the matching RPC snapshot marker.\n */\nexport interface RuntimeHydrationDto {\n\tkey: string;\n\tstate: SessionStateDto;\n\tmessages: unknown[];\n\tbackgroundAgents: BackgroundAgentDto[];\n\t/** Dialogs still waiting for a host response at the snapshot boundary. */\n\tpendingExtensionUiRequests?: ExtensionUiRequestDto[];\n\tbarrierSeq: number;\n}\n\n/** Parent/subagent data restored by an authoritative recovery snapshot. */\nexport interface ActiveRuntimeSnapshotDto extends RuntimeHydrationDto {\n\tsubagent?: { agentId: string; agent: BackgroundAgentDto; messages: unknown[]; barrierSeq: number };\n}\n\n/** Fleet refresh plus the active runtime's explicitly ordered snapshot. */\nexport interface DashboardResyncDto {\n\tfleet: FleetDto;\n\tactive?: ActiveRuntimeSnapshotDto;\n\t/** The global barrier to await before applying the payload. */\n\tbarrierSeq: number;\n}\n\n/**\n * SSE envelope. Every event on the dashboard stream wraps a session event with\n * the runtime key it came from plus a monotonically increasing sequence number\n * used for Last-Event-ID catch-up on reconnect.\n */\nexport interface EventEnvelope {\n\tseq: number;\n\tkey: string;\n\t/** An AgentSessionEvent (or dashboard-synthesized event) as emitted by the runtime. */\n\tevent: Record<string, unknown>;\n}\n\n/** File listing entry. */\nexport interface FileEntryDto {\n\tname: string;\n\ttype: \"file\" | \"dir\" | \"symlink\" | \"other\";\n\tsize: number;\n\tmodified: string;\n}\n\n/** Directory listing response. */\nexport interface ContextTrustEvaluationDto {\n\t/** Canonical existing directory evaluated by the utility RPC runtime. */\n\tcanonicalTarget: string;\n\t/** Whether nested context is untrusted, granted by a root, or globally unrestricted. */\n\tstate: \"untrusted\" | \"trusted-root\" | \"unrestricted\";\n\t/** Canonical root granting trusted-root access, including inherited access. */\n\tgrantingRoot?: string;\n}\n\n/** Result of changing a context-trust root through the utility RPC runtime. */\nexport interface ContextTrustMutationResultDto {\n\tevaluation: ContextTrustEvaluationDto;\n\tsettings: SettingsDto;\n\taddedRoot?: string;\n\tremovedRoot?: string;\n}\n\n/** Result of removing a configured trusted-folder string exactly as stored. */\nexport interface TrustedFolderRemovalResultDto {\n\tsettings: SettingsDto;\n\tremovedFolder: string;\n}\n\n/** Directory listing response. */\nexport interface DirListingDto {\n\t/** Canonicalized absolute path of the listed directory. */\n\tpath: string;\n\tentries: FileEntryDto[];\n\t/** Current global nested-context trust for this canonical directory. */\n\tcontextTrust: ContextTrustEvaluationDto;\n}\n\nexport type MemoryScopeKindDto = \"global\" | \"project\";\nexport type MemoryEntryTypeDto = \"user-preferences\" | \"good-practices\" | \"project\" | \"navigation\";\n\nexport interface MemoryEntryMetadataDto {\n\tname: string;\n\tdescription: string;\n\ttype: MemoryEntryTypeDto;\n}\n\nexport interface MemoryScopeDto {\n\tid: string;\n\tkind: MemoryScopeKindDto;\n\tlabel: string;\n\tprojectRoot?: string;\n\tmemoryDir: string;\n\texists: boolean;\n}\n\nexport interface MemoryEntrySummaryDto {\n\tfile: string;\n\tmetadata?: MemoryEntryMetadataDto;\n\tmetadataError?: string;\n\tmodified: string;\n\tsize: number;\n}\n\nexport interface MemoryListingDto {\n\tscope: MemoryScopeDto;\n\tindexContent: string | null;\n\tindexRevision: string | null;\n\tindexOverLimit: boolean;\n\tentries: MemoryEntrySummaryDto[];\n}\n\nexport interface MemoryDocumentDto {\n\tkind: \"index\" | \"entry\";\n\tfile: string;\n\tcontent: string;\n\trevision: string;\n\tmetadata?: MemoryEntryMetadataDto;\n\tmetadataError?: string;\n}\n\nexport interface MemoryMutationResultDto {\n\tlisting: MemoryListingDto;\n\tdocument?: MemoryDocumentDto;\n}\n\n/** Auth mode reported to the client. */\nexport interface AuthStatusDto {\n\tmode: \"local\" | \"remote\";\n\t/** Identity string for remote devices (e.g. Tailscale login name). */\n\tidentity?: string;\n\tdevice?: string;\n}\n\n/** Current rotating pairing code, readable only from the host/local dashboard. */\nexport interface PairingCodeDto {\n\tenabled: boolean;\n\tcode?: string;\n\texpiresInMs?: number;\n}\n\n/** A paired device (settings → devices). */\nexport interface PairedDeviceDto {\n\tid: string;\n\tidentity: string;\n\tdevice?: string;\n\tcreatedAt: string;\n\texpiresAt: string;\n}\n\n/** Dashboard settings snapshot (mirrors RpcSettingsSnapshot). */\nexport interface SubagentArbiterSettingsDto {\n\tenabled?: boolean;\n\tmodel?: string;\n\tthinking?: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n\tguidePath?: string;\n}\n\nexport interface SettingsDto {\n\tdefaultProvider?: string;\n\tdefaultModel?: string;\n\tdefaultThinkingLevel?: string;\n\tsteeringMode?: \"all\" | \"one-at-a-time\";\n\tfollowUpMode?: \"all\" | \"one-at-a-time\";\n\tcompactionEnabled?: boolean;\n\tretryEnabled?: boolean;\n\timageAutoResize?: boolean;\n\tblockImages?: boolean;\n\tenableSkillCommands?: boolean;\n\tautoLoadNestedContext?: boolean;\n\t/** Global configured trusted context folders, including invalid legacy entries. */\n\ttrustedContextFolders?: string[];\n\t/** Canonical existing trusted roots currently enforced by the runtime. */\n\teffectiveTrustedContextRoots?: string[];\n\ttransport?: \"sse\" | \"websocket\" | \"auto\";\n\thideThinkingBlock?: boolean;\n\tagentModels?: Record<string, string[]>;\n\t/** Global-only Dispatch Arbiter configuration. */\n\tsubagentArbiter?: SubagentArbiterSettingsDto | null;\n\t/** Raw effective persisted patterns; absent means future-inclusive implicit all. */\n\tenabledModels?: string[];\n\t/** Effective persistent scope resolved by coding-agent core in cycling order. */\n\tresolvedScopedModels: ScopedModelDto[];\n\t/** Resolver diagnostics for legacy persisted patterns. */\n\tscopeWarnings: Array<{ pattern: string; message: string }>;\n\thasProjectEnabledModelsOverride: boolean;\n\tenabledModelsSource: \"default\" | \"global\" | \"project\";\n}\n\n/** Dashboard settings mutation payload. Unlike a snapshot, null explicitly clears enabledModels. */\nexport type SettingsUpdateDto = Partial<\n\tPick<\n\t\tSettingsDto,\n\t\t| \"defaultProvider\"\n\t\t| \"defaultModel\"\n\t\t| \"defaultThinkingLevel\"\n\t\t| \"steeringMode\"\n\t\t| \"followUpMode\"\n\t\t| \"compactionEnabled\"\n\t\t| \"retryEnabled\"\n\t\t| \"imageAutoResize\"\n\t\t| \"blockImages\"\n\t\t| \"enableSkillCommands\"\n\t\t| \"autoLoadNestedContext\"\n\t\t| \"trustedContextFolders\"\n\t\t| \"transport\"\n\t\t| \"hideThinkingBlock\"\n\t\t| \"agentModels\"\n\t\t| \"subagentArbiter\"\n\t>\n> & { enabledModels?: string[] | null };\n\nexport type SettingsSaveResultDto = SettingsDto & { warnings?: string[] };\n\n/** Available model entry (mirrors ModelInfo). */\nexport interface ModelInfoDto {\n\tprovider: string;\n\tid: string;\n\tname: string;\n\tcontextWindow: number;\n\treasoning: boolean;\n}\n\n/** Agent definition metadata (mirrors RpcAgentTypeInfo). */\nexport interface AgentTypeDto {\n\tname: string;\n\tdescription: string;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/shared/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Wire types shared between the dashboard server and the browser client.\n *\n * These are standalone definitions (not imports from @dreb/coding-agent) so the\n * client bundle stays free of node-flavored type resolution. Server code maps\n * RPC DTOs onto these shapes; TypeScript structural typing enforces\n * compatibility at the mapping sites.\n */\n\n/** Session metadata (mirrors RpcSessionInfo). */\nexport interface SessionInfoDto {\n\tpath: string;\n\tid: string;\n\tcwd: string;\n\tname?: string;\n\tcreated: string;\n\tmodified: string;\n\tmessageCount: number;\n\tfirstMessage: string;\n}\n\n/** On-disk session inventory, independent of live runtime state. */\nexport interface SessionInventoryDto {\n\tsessions: SessionInfoDto[];\n}\n\nexport interface ArbitrationRouteDto {\n\tagent: string;\n\tmodel: string;\n\tthinking: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n}\n\nexport interface SubagentArbitrationDto {\n\tstatus: \"success\" | \"failure\";\n\tproposed: ArbitrationRouteDto;\n\tfinal: ArbitrationRouteDto | null;\n\tchanged: Array<\"agent\" | \"model\" | \"thinking\">;\n\tstep?: number;\n\terrorCode?: string;\n\terrorMessage?: string;\n}\n\n/** Background agent metadata (mirrors RpcBackgroundAgentInfo). */\nexport interface BackgroundAgentDto {\n\tagentId: string;\n\tagentType: string;\n\ttaskSummary: string;\n\tstartedAt: string;\n\tstatus: \"running\" | \"completed\" | \"failed\";\n\tsessionDir?: string;\n\tsessionFile?: string;\n\tcwd?: string;\n\tarbitrations?: SubagentArbitrationDto[];\n}\n\n/**\n * Shared eviction cap for completed/failed background agents. The server\n * prunes its registry to this bound and the client applies the same cap as\n * defense-in-depth — the two sides must agree on how many completed agents\n * survive, so the constant lives here.\n */\nexport const MAX_COMPLETED_BACKGROUND_AGENTS = 20;\n\n/** Maximum JSON prompt request body accepted by the dashboard server. */\nexport const MAX_PROMPT_BODY_BYTES = 25 * 1024 * 1024;\n\n/** Maximum accepted JSON body for optional, payload-free SSE client diagnostics. */\nexport const MAX_CLIENT_DIAGNOSTIC_BYTES = 4 * 1024;\n\nexport type EventConnectionState =\n\t| \"connecting\"\n\t| \"connected\"\n\t| \"retrying\"\n\t| \"resyncing\"\n\t| \"disconnected\"\n\t| \"auth_failed\";\n\n/**\n * Deliberately payload-free client connection telemetry. It is useful for\n * correlating stream failures with server logs, without sending prompts,\n * cookies, tool data, or SSE event contents back to the server.\n */\nexport interface ClientConnectionDiagnosticDto {\n\tconnectionId: string;\n\tstate: EventConnectionState;\n\tpreviousState?: EventConnectionState;\n\tattempt: number;\n\tdelayMs?: number;\n\tvisibility: \"visible\" | \"hidden\";\n\tlastAppliedSeq?: number;\n\theartbeatAgeMs?: number;\n\teventCount: number;\n\teventRatePerMinute: number;\n\tprocessingLagTotalMs: number;\n\tprocessingLagMaxMs: number;\n}\n\n/**\n * Inline images are base64-encoded inside the JSON prompt body. Base64 expands\n * raw bytes by 4/3, so a 25 MiB body can carry at most floor(25 MiB * 3/4) =\n * 18.75 MiB of raw image data before JSON syntax and prompt text. Reserve the\n * remaining 0.75 MiB for that overhead and advertise an 18 MiB aggregate raw\n * image budget to the browser.\n */\nexport const MAX_TOTAL_IMAGE_BYTES = Math.floor((MAX_PROMPT_BODY_BYTES * 3) / 4) - 768 * 1024;\n\n/** Context usage (mirrors ContextUsage — the numbers the TUI footer shows). */\nexport interface ContextUsageDto {\n\ttokens: number | null;\n\tcontextWindow: number;\n\tpercent: number | null;\n}\n\nexport interface ScopedModelDto {\n\tprovider: string;\n\tid: string;\n\tname?: string;\n\treasoning?: boolean;\n\tthinkingLevel?: string;\n}\n\nexport interface SessionStatsDto {\n\tsessionFile?: string;\n\tsessionId: string;\n\tuserMessages: number;\n\tassistantMessages: number;\n\ttoolCalls: number;\n\ttoolResults: number;\n\ttotalMessages: number;\n\ttokens: {\n\t\tinput: number;\n\t\toutput: number;\n\t\tcacheRead: number;\n\t\tcacheWrite: number;\n\t\ttotal: number;\n\t};\n\tcost: number;\n\tcontextUsage?: ContextUsageDto;\n}\n\nexport interface PerformanceModelSummaryDto {\n\tprovider: string;\n\tmodelId: string;\n\trolling: { median: number; mean: number; count: number };\n\tdelta: {\n\t\tbaselineMedian: number;\n\t\trecentMedian: number;\n\t\tpercentDelta: number;\n\t\tdirection: \"above\" | \"below\" | \"stable\";\n\t\tbaselineCount: number;\n\t\trecentCount: number;\n\t};\n}\n\nexport interface PerformanceStatsDto {\n\tmodels: PerformanceModelSummaryDto[];\n}\n\nexport interface ResourcesDto {\n\tcontextFiles: Array<{ path: string }>;\n\tskills: Array<{ name: string; description: string }>;\n\textensions: Array<{ name?: string; path: string }>;\n\tpromptTemplates: Array<{ name: string; description?: string }>;\n\tsystemPromptPresent: boolean;\n}\n\nexport interface ImageAttachmentDto {\n\tdata: string;\n\tmimeType: string;\n}\n\n/**\n * Browser-facing reference to a validated tool-result raster image. Original\n * bytes remain behind authenticated runtime routes and never cross transcript\n * JSON or SSE payloads.\n */\nexport interface DashboardImageReferenceDto {\n\ttype: \"image_reference\";\n\t/** SHA-256 of the exact MIME type plus decoded original bytes. */\n\tid: string;\n\t/** Exact allowlisted original MIME type. */\n\tmimeType: \"image/png\" | \"image/jpeg\" | \"image/gif\" | \"image/webp\";\n\t/** Decoded original binary byte size. */\n\tsize: number;\n}\n\nexport const DASHBOARD_IMAGE_DISPLAY_MODES = [\"placeholders\", \"previews\", \"originals\"] as const;\nexport type DashboardImageDisplayMode = (typeof DASHBOARD_IMAGE_DISPLAY_MODES)[number];\n\nexport interface QueuedMessageDto {\n\ttext: string;\n\timages?: ImageAttachmentDto[];\n}\n\nexport interface PendingMessagesDto {\n\t/** Text-only compatibility view. */\n\tsteering: string[];\n\t/** Text-only compatibility view. */\n\tfollowUp: string[];\n\t/** Full queued payloads, including inline image attachments. */\n\tsteeringMessages?: QueuedMessageDto[];\n\t/** Full queued payloads, including inline image attachments. */\n\tfollowUpMessages?: QueuedMessageDto[];\n}\n\nexport interface CommandDto {\n\tname: string;\n\tdescription?: string;\n\tsource: \"extension\" | \"prompt\" | \"skill\" | \"builtin\";\n\t/** Built-ins with false are intercepted when typed but omitted from autocomplete. */\n\tdashboard?: boolean;\n}\n\nexport interface SessionTreeNodeDto {\n\tid: string;\n\tparentId: string | null;\n\ttype: string;\n\trole?: string;\n\tpreview: string;\n\ttimestamp: string;\n\tlabel?: string;\n\tchildren: SessionTreeNodeDto[];\n}\n\nexport interface RuntimeStatsSummaryDto {\n\ttokensTotal: number;\n\tcost: number;\n}\n\n/** Current task list (mirrors RpcSessionTask). */\nexport interface SessionTaskDto {\n\tid: string;\n\ttitle: string;\n\tstatus: \"pending\" | \"in_progress\" | \"completed\";\n}\n\n/** Live session state (mirrors RpcSessionState, model reduced to id fields). */\nexport interface SessionStateDto {\n\tmodel?: { provider: string; id: string; name?: string; reasoning?: boolean };\n\tscopedModels?: ScopedModelDto[];\n\tusingSubscription?: boolean;\n\t/** Current task list, atomically replaced by tasks_update events. */\n\ttasks: SessionTaskDto[];\n\tthinkingLevel: string;\n\tisStreaming: boolean;\n\t/** True while automatic retry classification, backoff, or execution is active. */\n\tisRetrying?: boolean;\n\t/** Current automatic retry attempt, or 0 outside an emitted retry attempt. */\n\tretryAttempt?: number;\n\tisCompacting: boolean;\n\tsteeringMode: \"all\" | \"one-at-a-time\";\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\tsessionFile?: string;\n\tsessionId: string;\n\tsessionName?: string;\n\tautoCompactionEnabled: boolean;\n\tmessageCount: number;\n\tpendingMessageCount: number;\n\tcontextUsage?: ContextUsageDto;\n\tmodelFallbackMessage?: string;\n}\n\n/** A live runtime managed by the dashboard server's pool. */\nexport interface RuntimeInfoDto {\n\t/** Pool key — stable identity for API calls and SSE envelopes. */\n\tkey: string;\n\tcwd: string;\n\tstate: SessionStateDto;\n\t/** Lean session stats for fleet cards; omitted when the runtime stats call fails. */\n\tstats?: RuntimeStatsSummaryDto;\n\t/** Background agents known to this runtime. */\n\tbackgroundAgents: BackgroundAgentDto[];\n\t/** Server-derived needs-attention flag (extension UI pending, paused, error). */\n\tneedsAttention: boolean;\n\t/** Runtime-level error that should survive browser reloads. */\n\terror?: string;\n\t/** Last assistant text, truncated for fleet-card previews. */\n\tlastAssistantText?: string;\n\t/** Session start timestamp (ISO) — stable tiebreak for deterministic fleet ordering. */\n\tcreatedAt: string;\n\t/** Last activity timestamp (ISO). */\n\tlastActivity: string;\n}\n\n/**\n * Lightweight, event-derived live-runtime view for fleet SSE updates.\n *\n * Unlike RuntimeInfoDto, this deliberately excludes RPC-fetched stats and\n * assistant preview text: RuntimePool can build it synchronously from its\n * in-memory runtime registry.\n */\nexport interface FleetRuntimeSnapshotDto {\n\tkey: string;\n\tcwd: string;\n\tstate: SessionStateDto;\n\tbackgroundAgents: BackgroundAgentDto[];\n\tneedsAttention: boolean;\n\terror?: string;\n\tcreatedAt: string;\n\tlastActivity: string;\n}\n\n/** Coalesced fleet update published on the dashboard SSE stream. */\nexport interface FleetSnapshotEventDto {\n\ttype: \"fleet_snapshot\";\n\truntimes: FleetRuntimeSnapshotDto[];\n}\n\n/** Fleet snapshot: live runtimes + on-disk inventory. */\nexport interface FleetDto {\n\truntimes: RuntimeInfoDto[];\n\tdiskSessions: SessionInfoDto[];\n}\n\n/** A single question inside an `ask` extension-UI request (mirrors RpcAskQuestion). */\nexport interface AskUiQuestionDto {\n\tquestion: string;\n\ttitle?: string;\n\toptions?: string[];\n\tallowFreeText?: boolean;\n\tmultiSelect?: boolean;\n\tmultiline?: boolean;\n}\n\n/** A blocking extension UI request that can be restored from a runtime snapshot. */\nexport interface ExtensionUiRequestDto {\n\ttype: \"extension_ui_request\";\n\tid: string;\n\tmethod: \"select\" | \"confirm\" | \"input\" | \"editor\" | \"ask\";\n\ttitle: string;\n\tmessage?: string;\n\toptions?: string[];\n\tprefill?: string;\n\tplaceholder?: string;\n\t/** For the `ask` method: one or more questions asked together as a single wizard. */\n\tquestions?: AskUiQuestionDto[];\n\ttimeout?: number;\n\t/** Absolute Unix timestamp in milliseconds when the runtime timeout fires. */\n\texpiresAt?: number;\n}\n\n/**\n * Atomic parent-session snapshot for drill-in hydration. Its barrier sequence\n * marks the SSE ordering point captured by the matching RPC snapshot marker.\n */\nexport interface RuntimeHydrationDto {\n\tkey: string;\n\tstate: SessionStateDto;\n\tmessages: unknown[];\n\tbackgroundAgents: BackgroundAgentDto[];\n\t/** Dialogs still waiting for a host response at the snapshot boundary. */\n\tpendingExtensionUiRequests?: ExtensionUiRequestDto[];\n\tbarrierSeq: number;\n}\n\n/** Parent/subagent data restored by an authoritative recovery snapshot. */\nexport interface ActiveRuntimeSnapshotDto extends RuntimeHydrationDto {\n\tsubagent?: { agentId: string; agent: BackgroundAgentDto; messages: unknown[]; barrierSeq: number };\n}\n\n/** Fleet refresh plus the active runtime's explicitly ordered snapshot. */\nexport interface DashboardResyncDto {\n\tfleet: FleetDto;\n\tactive?: ActiveRuntimeSnapshotDto;\n\t/** The global barrier to await before applying the payload. */\n\tbarrierSeq: number;\n}\n\n/**\n * SSE envelope. Every event on the dashboard stream wraps a session event with\n * the runtime key it came from plus a monotonically increasing sequence number\n * used for Last-Event-ID catch-up on reconnect.\n */\nexport interface EventEnvelope {\n\tseq: number;\n\tkey: string;\n\t/** An AgentSessionEvent (or dashboard-synthesized event) as emitted by the runtime. */\n\tevent: Record<string, unknown>;\n}\n\n/** File listing entry. */\nexport interface FileEntryDto {\n\tname: string;\n\ttype: \"file\" | \"dir\" | \"symlink\" | \"other\";\n\tsize: number;\n\tmodified: string;\n}\n\n/** Directory listing response. */\nexport interface ContextTrustEvaluationDto {\n\t/** Canonical existing directory evaluated by the utility RPC runtime. */\n\tcanonicalTarget: string;\n\t/** Whether nested context is untrusted, granted by a root, or globally unrestricted. */\n\tstate: \"untrusted\" | \"trusted-root\" | \"unrestricted\";\n\t/** Canonical root granting trusted-root access, including inherited access. */\n\tgrantingRoot?: string;\n}\n\n/** Result of changing a context-trust root through the utility RPC runtime. */\nexport interface ContextTrustMutationResultDto {\n\tevaluation: ContextTrustEvaluationDto;\n\tsettings: SettingsDto;\n\taddedRoot?: string;\n\tremovedRoot?: string;\n}\n\n/** Result of removing a configured trusted-folder string exactly as stored. */\nexport interface TrustedFolderRemovalResultDto {\n\tsettings: SettingsDto;\n\tremovedFolder: string;\n}\n\n/** Directory listing response. */\nexport interface DirListingDto {\n\t/** Canonicalized absolute path of the listed directory. */\n\tpath: string;\n\tentries: FileEntryDto[];\n\t/** Current global nested-context trust for this canonical directory. */\n\tcontextTrust: ContextTrustEvaluationDto;\n}\n\nexport type MemoryScopeKindDto = \"global\" | \"project\";\nexport type MemoryEntryTypeDto = \"user-preferences\" | \"good-practices\" | \"project\" | \"navigation\";\n\nexport interface MemoryEntryMetadataDto {\n\tname: string;\n\tdescription: string;\n\ttype: MemoryEntryTypeDto;\n}\n\nexport interface MemoryScopeDto {\n\tid: string;\n\tkind: MemoryScopeKindDto;\n\tlabel: string;\n\tprojectRoot?: string;\n\tmemoryDir: string;\n\texists: boolean;\n}\n\nexport interface MemoryEntrySummaryDto {\n\tfile: string;\n\tmetadata?: MemoryEntryMetadataDto;\n\tmetadataError?: string;\n\tmodified: string;\n\tsize: number;\n}\n\nexport interface MemoryListingDto {\n\tscope: MemoryScopeDto;\n\tindexContent: string | null;\n\tindexRevision: string | null;\n\tindexOverLimit: boolean;\n\tentries: MemoryEntrySummaryDto[];\n}\n\nexport interface MemoryDocumentDto {\n\tkind: \"index\" | \"entry\";\n\tfile: string;\n\tcontent: string;\n\trevision: string;\n\tmetadata?: MemoryEntryMetadataDto;\n\tmetadataError?: string;\n}\n\nexport interface MemoryMutationResultDto {\n\tlisting: MemoryListingDto;\n\tdocument?: MemoryDocumentDto;\n}\n\n/** Auth mode reported to the client. */\nexport interface AuthStatusDto {\n\tmode: \"local\" | \"remote\";\n\t/** Identity string for remote devices (e.g. Tailscale login name). */\n\tidentity?: string;\n\tdevice?: string;\n}\n\n/** Current rotating pairing code, readable only from the host/local dashboard. */\nexport interface PairingCodeDto {\n\tenabled: boolean;\n\tcode?: string;\n\texpiresInMs?: number;\n}\n\n/** A paired device (settings → devices). */\nexport interface PairedDeviceDto {\n\tid: string;\n\tidentity: string;\n\tdevice?: string;\n\tcreatedAt: string;\n\texpiresAt: string;\n}\n\n/** Dashboard settings snapshot (mirrors RpcSettingsSnapshot). */\nexport interface SubagentArbiterSettingsDto {\n\tenabled?: boolean;\n\tmodel?: string;\n\tthinking?: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n\tguidePath?: string;\n}\n\nexport interface SettingsDto {\n\tdefaultProvider?: string;\n\tdefaultModel?: string;\n\tdefaultThinkingLevel?: string;\n\tsteeringMode?: \"all\" | \"one-at-a-time\";\n\tfollowUpMode?: \"all\" | \"one-at-a-time\";\n\tcompactionEnabled?: boolean;\n\tretryEnabled?: boolean;\n\timageAutoResize?: boolean;\n\tblockImages?: boolean;\n\tenableSkillCommands?: boolean;\n\tautoLoadNestedContext?: boolean;\n\t/** Global configured trusted context folders, including invalid legacy entries. */\n\ttrustedContextFolders?: string[];\n\t/** Canonical existing trusted roots currently enforced by the runtime. */\n\teffectiveTrustedContextRoots?: string[];\n\ttransport?: \"sse\" | \"websocket\" | \"auto\";\n\thideThinkingBlock?: boolean;\n\tagentModels?: Record<string, string[]>;\n\t/** Global-only Dispatch Arbiter configuration. */\n\tsubagentArbiter?: SubagentArbiterSettingsDto | null;\n\t/** Raw effective persisted patterns; absent means future-inclusive implicit all. */\n\tenabledModels?: string[];\n\t/** Effective persistent scope resolved by coding-agent core in cycling order. */\n\tresolvedScopedModels: ScopedModelDto[];\n\t/** Resolver diagnostics for legacy persisted patterns. */\n\tscopeWarnings: Array<{ pattern: string; message: string }>;\n\thasProjectEnabledModelsOverride: boolean;\n\tenabledModelsSource: \"default\" | \"global\" | \"project\";\n}\n\n/** Dashboard settings mutation payload. Unlike a snapshot, null explicitly clears enabledModels. */\nexport type SettingsUpdateDto = Partial<\n\tPick<\n\t\tSettingsDto,\n\t\t| \"defaultProvider\"\n\t\t| \"defaultModel\"\n\t\t| \"defaultThinkingLevel\"\n\t\t| \"steeringMode\"\n\t\t| \"followUpMode\"\n\t\t| \"compactionEnabled\"\n\t\t| \"retryEnabled\"\n\t\t| \"imageAutoResize\"\n\t\t| \"blockImages\"\n\t\t| \"enableSkillCommands\"\n\t\t| \"autoLoadNestedContext\"\n\t\t| \"trustedContextFolders\"\n\t\t| \"transport\"\n\t\t| \"hideThinkingBlock\"\n\t\t| \"agentModels\"\n\t\t| \"subagentArbiter\"\n\t>\n> & { enabledModels?: string[] | null };\n\nexport type SettingsSaveResultDto = SettingsDto & { warnings?: string[] };\n\n/** Available model entry (mirrors ModelInfo). */\nexport interface ModelInfoDto {\n\tprovider: string;\n\tid: string;\n\tname: string;\n\tcontextWindow: number;\n\treasoning: boolean;\n}\n\n/** Agent definition metadata (mirrors RpcAgentTypeInfo). */\nexport interface AgentTypeDto {\n\tname: string;\n\tdescription: string;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/shared/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgDH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,CAAC;AAElD,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEtD,oFAAoF;AACpF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,GAAG,IAAI,CAAC;AA8BpD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,qBAAqB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;AAoE9F,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,cAAc,EAAE,UAAU,EAAE,WAAW,CAAU,CAAC","sourcesContent":["/**\n * Wire types shared between the dashboard server and the browser client.\n *\n * These are standalone definitions (not imports from @dreb/coding-agent) so the\n * client bundle stays free of node-flavored type resolution. Server code maps\n * RPC DTOs onto these shapes; TypeScript structural typing enforces\n * compatibility at the mapping sites.\n */\n\n/** Session metadata (mirrors RpcSessionInfo). */\nexport interface SessionInfoDto {\n\tpath: string;\n\tid: string;\n\tcwd: string;\n\tname?: string;\n\tcreated: string;\n\tmodified: string;\n\tmessageCount: number;\n\tfirstMessage: string;\n}\n\n/** On-disk session inventory, independent of live runtime state. */\nexport interface SessionInventoryDto {\n\tsessions: SessionInfoDto[];\n}\n\nexport interface ArbitrationRouteDto {\n\tagent: string;\n\tmodel: string;\n\tthinking: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n}\n\nexport interface SubagentArbitrationDto {\n\tstatus: \"success\" | \"failure\";\n\tproposed: ArbitrationRouteDto;\n\tfinal: ArbitrationRouteDto | null;\n\tchanged: Array<\"agent\" | \"model\" | \"thinking\">;\n\tstep?: number;\n\terrorCode?: string;\n\terrorMessage?: string;\n}\n\n/** Background agent metadata (mirrors RpcBackgroundAgentInfo). */\nexport interface BackgroundAgentDto {\n\tagentId: string;\n\tagentType: string;\n\ttaskSummary: string;\n\tstartedAt: string;\n\tstatus: \"running\" | \"completed\" | \"failed\";\n\tsessionDir?: string;\n\tsessionFile?: string;\n\tcwd?: string;\n\tarbitrations?: SubagentArbitrationDto[];\n}\n\n/**\n * Shared eviction cap for completed/failed background agents. The server\n * prunes its registry to this bound and the client applies the same cap as\n * defense-in-depth — the two sides must agree on how many completed agents\n * survive, so the constant lives here.\n */\nexport const MAX_COMPLETED_BACKGROUND_AGENTS = 20;\n\n/** Maximum JSON prompt request body accepted by the dashboard server. */\nexport const MAX_PROMPT_BODY_BYTES = 25 * 1024 * 1024;\n\n/** Maximum accepted JSON body for optional, payload-free SSE client diagnostics. */\nexport const MAX_CLIENT_DIAGNOSTIC_BYTES = 4 * 1024;\n\nexport type EventConnectionState =\n\t| \"connecting\"\n\t| \"connected\"\n\t| \"retrying\"\n\t| \"resyncing\"\n\t| \"disconnected\"\n\t| \"auth_failed\";\n\n/**\n * Deliberately payload-free client connection telemetry. It is useful for\n * correlating stream failures with server logs, without sending prompts,\n * cookies, tool data, or SSE event contents back to the server.\n */\nexport interface ClientConnectionDiagnosticDto {\n\tconnectionId: string;\n\tstate: EventConnectionState;\n\tpreviousState?: EventConnectionState;\n\tattempt: number;\n\tdelayMs?: number;\n\tvisibility: \"visible\" | \"hidden\";\n\tlastAppliedSeq?: number;\n\theartbeatAgeMs?: number;\n\teventCount: number;\n\teventRatePerMinute: number;\n\tprocessingLagTotalMs: number;\n\tprocessingLagMaxMs: number;\n}\n\n/**\n * Inline images are base64-encoded inside the JSON prompt body. Base64 expands\n * raw bytes by 4/3, so a 25 MiB body can carry at most floor(25 MiB * 3/4) =\n * 18.75 MiB of raw image data before JSON syntax and prompt text. Reserve the\n * remaining 0.75 MiB for that overhead and advertise an 18 MiB aggregate raw\n * image budget to the browser.\n */\nexport const MAX_TOTAL_IMAGE_BYTES = Math.floor((MAX_PROMPT_BODY_BYTES * 3) / 4) - 768 * 1024;\n\n/** Context usage (mirrors ContextUsage — the numbers the TUI footer shows). */\nexport interface ContextUsageDto {\n\ttokens: number | null;\n\tcontextWindow: number;\n\tpercent: number | null;\n}\n\nexport interface ScopedModelDto {\n\tprovider: string;\n\tid: string;\n\tname?: string;\n\treasoning?: boolean;\n\tthinkingLevel?: string;\n}\n\nexport interface SessionStatsDto {\n\tsessionFile?: string;\n\tsessionId: string;\n\tuserMessages: number;\n\tassistantMessages: number;\n\ttoolCalls: number;\n\ttoolResults: number;\n\ttotalMessages: number;\n\ttokens: {\n\t\tinput: number;\n\t\toutput: number;\n\t\tcacheRead: number;\n\t\tcacheWrite: number;\n\t\ttotal: number;\n\t};\n\tcost: number;\n\tcontextUsage?: ContextUsageDto;\n}\n\nexport interface PerformanceStatsDto {\n\tmodels: Array<{ provider: string; modelId: string; median: number; mean: number; count: number }>;\n}\n\nexport interface ResourcesDto {\n\tcontextFiles: Array<{ path: string }>;\n\tskills: Array<{ name: string; description: string }>;\n\textensions: Array<{ name?: string; path: string }>;\n\tpromptTemplates: Array<{ name: string; description?: string }>;\n\tsystemPromptPresent: boolean;\n}\n\nexport interface ImageAttachmentDto {\n\tdata: string;\n\tmimeType: string;\n}\n\n/**\n * Browser-facing reference to a validated tool-result raster image. Original\n * bytes remain behind authenticated runtime routes and never cross transcript\n * JSON or SSE payloads.\n */\nexport interface DashboardImageReferenceDto {\n\ttype: \"image_reference\";\n\t/** SHA-256 of the exact MIME type plus decoded original bytes. */\n\tid: string;\n\t/** Exact allowlisted original MIME type. */\n\tmimeType: \"image/png\" | \"image/jpeg\" | \"image/gif\" | \"image/webp\";\n\t/** Decoded original binary byte size. */\n\tsize: number;\n}\n\nexport const DASHBOARD_IMAGE_DISPLAY_MODES = [\"placeholders\", \"previews\", \"originals\"] as const;\nexport type DashboardImageDisplayMode = (typeof DASHBOARD_IMAGE_DISPLAY_MODES)[number];\n\nexport interface QueuedMessageDto {\n\ttext: string;\n\timages?: ImageAttachmentDto[];\n}\n\nexport interface PendingMessagesDto {\n\t/** Text-only compatibility view. */\n\tsteering: string[];\n\t/** Text-only compatibility view. */\n\tfollowUp: string[];\n\t/** Full queued payloads, including inline image attachments. */\n\tsteeringMessages?: QueuedMessageDto[];\n\t/** Full queued payloads, including inline image attachments. */\n\tfollowUpMessages?: QueuedMessageDto[];\n}\n\nexport interface CommandDto {\n\tname: string;\n\tdescription?: string;\n\tsource: \"extension\" | \"prompt\" | \"skill\" | \"builtin\";\n\t/** Built-ins with false are intercepted when typed but omitted from autocomplete. */\n\tdashboard?: boolean;\n}\n\nexport interface SessionTreeNodeDto {\n\tid: string;\n\tparentId: string | null;\n\ttype: string;\n\trole?: string;\n\tpreview: string;\n\ttimestamp: string;\n\tlabel?: string;\n\tchildren: SessionTreeNodeDto[];\n}\n\nexport interface RuntimeStatsSummaryDto {\n\ttokensTotal: number;\n\tcost: number;\n}\n\n/** Current task list (mirrors RpcSessionTask). */\nexport interface SessionTaskDto {\n\tid: string;\n\ttitle: string;\n\tstatus: \"pending\" | \"in_progress\" | \"completed\";\n}\n\n/** Live session state (mirrors RpcSessionState, model reduced to id fields). */\nexport interface SessionStateDto {\n\tmodel?: { provider: string; id: string; name?: string; reasoning?: boolean };\n\tscopedModels?: ScopedModelDto[];\n\tusingSubscription?: boolean;\n\t/** Current task list, atomically replaced by tasks_update events. */\n\ttasks: SessionTaskDto[];\n\tthinkingLevel: string;\n\tisStreaming: boolean;\n\t/** True while automatic retry classification, backoff, or execution is active. */\n\tisRetrying?: boolean;\n\t/** Current automatic retry attempt, or 0 outside an emitted retry attempt. */\n\tretryAttempt?: number;\n\tisCompacting: boolean;\n\tsteeringMode: \"all\" | \"one-at-a-time\";\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\tsessionFile?: string;\n\tsessionId: string;\n\tsessionName?: string;\n\tautoCompactionEnabled: boolean;\n\tmessageCount: number;\n\tpendingMessageCount: number;\n\tcontextUsage?: ContextUsageDto;\n\tmodelFallbackMessage?: string;\n}\n\n/** A live runtime managed by the dashboard server's pool. */\nexport interface RuntimeInfoDto {\n\t/** Pool key — stable identity for API calls and SSE envelopes. */\n\tkey: string;\n\tcwd: string;\n\tstate: SessionStateDto;\n\t/** Lean session stats for fleet cards; omitted when the runtime stats call fails. */\n\tstats?: RuntimeStatsSummaryDto;\n\t/** Background agents known to this runtime. */\n\tbackgroundAgents: BackgroundAgentDto[];\n\t/** Server-derived needs-attention flag (extension UI pending, paused, error). */\n\tneedsAttention: boolean;\n\t/** Runtime-level error that should survive browser reloads. */\n\terror?: string;\n\t/** Last assistant text, truncated for fleet-card previews. */\n\tlastAssistantText?: string;\n\t/** Session start timestamp (ISO) — stable tiebreak for deterministic fleet ordering. */\n\tcreatedAt: string;\n\t/** Last activity timestamp (ISO). */\n\tlastActivity: string;\n}\n\n/**\n * Lightweight, event-derived live-runtime view for fleet SSE updates.\n *\n * Unlike RuntimeInfoDto, this deliberately excludes RPC-fetched stats and\n * assistant preview text: RuntimePool can build it synchronously from its\n * in-memory runtime registry.\n */\nexport interface FleetRuntimeSnapshotDto {\n\tkey: string;\n\tcwd: string;\n\tstate: SessionStateDto;\n\tbackgroundAgents: BackgroundAgentDto[];\n\tneedsAttention: boolean;\n\terror?: string;\n\tcreatedAt: string;\n\tlastActivity: string;\n}\n\n/** Coalesced fleet update published on the dashboard SSE stream. */\nexport interface FleetSnapshotEventDto {\n\ttype: \"fleet_snapshot\";\n\truntimes: FleetRuntimeSnapshotDto[];\n}\n\n/** Fleet snapshot: live runtimes + on-disk inventory. */\nexport interface FleetDto {\n\truntimes: RuntimeInfoDto[];\n\tdiskSessions: SessionInfoDto[];\n}\n\n/** A single question inside an `ask` extension-UI request (mirrors RpcAskQuestion). */\nexport interface AskUiQuestionDto {\n\tquestion: string;\n\ttitle?: string;\n\toptions?: string[];\n\tallowFreeText?: boolean;\n\tmultiSelect?: boolean;\n\tmultiline?: boolean;\n}\n\n/** A blocking extension UI request that can be restored from a runtime snapshot. */\nexport interface ExtensionUiRequestDto {\n\ttype: \"extension_ui_request\";\n\tid: string;\n\tmethod: \"select\" | \"confirm\" | \"input\" | \"editor\" | \"ask\";\n\ttitle: string;\n\tmessage?: string;\n\toptions?: string[];\n\tprefill?: string;\n\tplaceholder?: string;\n\t/** For the `ask` method: one or more questions asked together as a single wizard. */\n\tquestions?: AskUiQuestionDto[];\n\ttimeout?: number;\n\t/** Absolute Unix timestamp in milliseconds when the runtime timeout fires. */\n\texpiresAt?: number;\n}\n\n/**\n * Atomic parent-session snapshot for drill-in hydration. Its barrier sequence\n * marks the SSE ordering point captured by the matching RPC snapshot marker.\n */\nexport interface RuntimeHydrationDto {\n\tkey: string;\n\tstate: SessionStateDto;\n\tmessages: unknown[];\n\tbackgroundAgents: BackgroundAgentDto[];\n\t/** Dialogs still waiting for a host response at the snapshot boundary. */\n\tpendingExtensionUiRequests?: ExtensionUiRequestDto[];\n\tbarrierSeq: number;\n}\n\n/** Parent/subagent data restored by an authoritative recovery snapshot. */\nexport interface ActiveRuntimeSnapshotDto extends RuntimeHydrationDto {\n\tsubagent?: { agentId: string; agent: BackgroundAgentDto; messages: unknown[]; barrierSeq: number };\n}\n\n/** Fleet refresh plus the active runtime's explicitly ordered snapshot. */\nexport interface DashboardResyncDto {\n\tfleet: FleetDto;\n\tactive?: ActiveRuntimeSnapshotDto;\n\t/** The global barrier to await before applying the payload. */\n\tbarrierSeq: number;\n}\n\n/**\n * SSE envelope. Every event on the dashboard stream wraps a session event with\n * the runtime key it came from plus a monotonically increasing sequence number\n * used for Last-Event-ID catch-up on reconnect.\n */\nexport interface EventEnvelope {\n\tseq: number;\n\tkey: string;\n\t/** An AgentSessionEvent (or dashboard-synthesized event) as emitted by the runtime. */\n\tevent: Record<string, unknown>;\n}\n\n/** File listing entry. */\nexport interface FileEntryDto {\n\tname: string;\n\ttype: \"file\" | \"dir\" | \"symlink\" | \"other\";\n\tsize: number;\n\tmodified: string;\n}\n\n/** Directory listing response. */\nexport interface ContextTrustEvaluationDto {\n\t/** Canonical existing directory evaluated by the utility RPC runtime. */\n\tcanonicalTarget: string;\n\t/** Whether nested context is untrusted, granted by a root, or globally unrestricted. */\n\tstate: \"untrusted\" | \"trusted-root\" | \"unrestricted\";\n\t/** Canonical root granting trusted-root access, including inherited access. */\n\tgrantingRoot?: string;\n}\n\n/** Result of changing a context-trust root through the utility RPC runtime. */\nexport interface ContextTrustMutationResultDto {\n\tevaluation: ContextTrustEvaluationDto;\n\tsettings: SettingsDto;\n\taddedRoot?: string;\n\tremovedRoot?: string;\n}\n\n/** Result of removing a configured trusted-folder string exactly as stored. */\nexport interface TrustedFolderRemovalResultDto {\n\tsettings: SettingsDto;\n\tremovedFolder: string;\n}\n\n/** Directory listing response. */\nexport interface DirListingDto {\n\t/** Canonicalized absolute path of the listed directory. */\n\tpath: string;\n\tentries: FileEntryDto[];\n\t/** Current global nested-context trust for this canonical directory. */\n\tcontextTrust: ContextTrustEvaluationDto;\n}\n\nexport type MemoryScopeKindDto = \"global\" | \"project\";\nexport type MemoryEntryTypeDto = \"user-preferences\" | \"good-practices\" | \"project\" | \"navigation\";\n\nexport interface MemoryEntryMetadataDto {\n\tname: string;\n\tdescription: string;\n\ttype: MemoryEntryTypeDto;\n}\n\nexport interface MemoryScopeDto {\n\tid: string;\n\tkind: MemoryScopeKindDto;\n\tlabel: string;\n\tprojectRoot?: string;\n\tmemoryDir: string;\n\texists: boolean;\n}\n\nexport interface MemoryEntrySummaryDto {\n\tfile: string;\n\tmetadata?: MemoryEntryMetadataDto;\n\tmetadataError?: string;\n\tmodified: string;\n\tsize: number;\n}\n\nexport interface MemoryListingDto {\n\tscope: MemoryScopeDto;\n\tindexContent: string | null;\n\tindexRevision: string | null;\n\tindexOverLimit: boolean;\n\tentries: MemoryEntrySummaryDto[];\n}\n\nexport interface MemoryDocumentDto {\n\tkind: \"index\" | \"entry\";\n\tfile: string;\n\tcontent: string;\n\trevision: string;\n\tmetadata?: MemoryEntryMetadataDto;\n\tmetadataError?: string;\n}\n\nexport interface MemoryMutationResultDto {\n\tlisting: MemoryListingDto;\n\tdocument?: MemoryDocumentDto;\n}\n\n/** Auth mode reported to the client. */\nexport interface AuthStatusDto {\n\tmode: \"local\" | \"remote\";\n\t/** Identity string for remote devices (e.g. Tailscale login name). */\n\tidentity?: string;\n\tdevice?: string;\n}\n\n/** Current rotating pairing code, readable only from the host/local dashboard. */\nexport interface PairingCodeDto {\n\tenabled: boolean;\n\tcode?: string;\n\texpiresInMs?: number;\n}\n\n/** A paired device (settings → devices). */\nexport interface PairedDeviceDto {\n\tid: string;\n\tidentity: string;\n\tdevice?: string;\n\tcreatedAt: string;\n\texpiresAt: string;\n}\n\n/** Dashboard settings snapshot (mirrors RpcSettingsSnapshot). */\nexport interface SubagentArbiterSettingsDto {\n\tenabled?: boolean;\n\tmodel?: string;\n\tthinking?: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n\tguidePath?: string;\n}\n\nexport interface SettingsDto {\n\tdefaultProvider?: string;\n\tdefaultModel?: string;\n\tdefaultThinkingLevel?: string;\n\tsteeringMode?: \"all\" | \"one-at-a-time\";\n\tfollowUpMode?: \"all\" | \"one-at-a-time\";\n\tcompactionEnabled?: boolean;\n\tretryEnabled?: boolean;\n\timageAutoResize?: boolean;\n\tblockImages?: boolean;\n\tenableSkillCommands?: boolean;\n\tautoLoadNestedContext?: boolean;\n\t/** Global configured trusted context folders, including invalid legacy entries. */\n\ttrustedContextFolders?: string[];\n\t/** Canonical existing trusted roots currently enforced by the runtime. */\n\teffectiveTrustedContextRoots?: string[];\n\ttransport?: \"sse\" | \"websocket\" | \"auto\";\n\thideThinkingBlock?: boolean;\n\tagentModels?: Record<string, string[]>;\n\t/** Global-only Dispatch Arbiter configuration. */\n\tsubagentArbiter?: SubagentArbiterSettingsDto | null;\n\t/** Raw effective persisted patterns; absent means future-inclusive implicit all. */\n\tenabledModels?: string[];\n\t/** Effective persistent scope resolved by coding-agent core in cycling order. */\n\tresolvedScopedModels: ScopedModelDto[];\n\t/** Resolver diagnostics for legacy persisted patterns. */\n\tscopeWarnings: Array<{ pattern: string; message: string }>;\n\thasProjectEnabledModelsOverride: boolean;\n\tenabledModelsSource: \"default\" | \"global\" | \"project\";\n}\n\n/** Dashboard settings mutation payload. Unlike a snapshot, null explicitly clears enabledModels. */\nexport type SettingsUpdateDto = Partial<\n\tPick<\n\t\tSettingsDto,\n\t\t| \"defaultProvider\"\n\t\t| \"defaultModel\"\n\t\t| \"defaultThinkingLevel\"\n\t\t| \"steeringMode\"\n\t\t| \"followUpMode\"\n\t\t| \"compactionEnabled\"\n\t\t| \"retryEnabled\"\n\t\t| \"imageAutoResize\"\n\t\t| \"blockImages\"\n\t\t| \"enableSkillCommands\"\n\t\t| \"autoLoadNestedContext\"\n\t\t| \"trustedContextFolders\"\n\t\t| \"transport\"\n\t\t| \"hideThinkingBlock\"\n\t\t| \"agentModels\"\n\t\t| \"subagentArbiter\"\n\t>\n> & { enabledModels?: string[] | null };\n\nexport type SettingsSaveResultDto = SettingsDto & { warnings?: string[] };\n\n/** Available model entry (mirrors ModelInfo). */\nexport interface ModelInfoDto {\n\tprovider: string;\n\tid: string;\n\tname: string;\n\tcontextWindow: number;\n\treasoning: boolean;\n}\n\n/** Agent definition metadata (mirrors RpcAgentTypeInfo). */\nexport interface AgentTypeDto {\n\tname: string;\n\tdescription: string;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/shared/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgDH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,CAAC;AAElD,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEtD,oFAAoF;AACpF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,GAAG,IAAI,CAAC;AA8BpD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,qBAAqB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;AAkF9F,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,cAAc,EAAE,UAAU,EAAE,WAAW,CAAU,CAAC","sourcesContent":["/**\n * Wire types shared between the dashboard server and the browser client.\n *\n * These are standalone definitions (not imports from @dreb/coding-agent) so the\n * client bundle stays free of node-flavored type resolution. Server code maps\n * RPC DTOs onto these shapes; TypeScript structural typing enforces\n * compatibility at the mapping sites.\n */\n\n/** Session metadata (mirrors RpcSessionInfo). */\nexport interface SessionInfoDto {\n\tpath: string;\n\tid: string;\n\tcwd: string;\n\tname?: string;\n\tcreated: string;\n\tmodified: string;\n\tmessageCount: number;\n\tfirstMessage: string;\n}\n\n/** On-disk session inventory, independent of live runtime state. */\nexport interface SessionInventoryDto {\n\tsessions: SessionInfoDto[];\n}\n\nexport interface ArbitrationRouteDto {\n\tagent: string;\n\tmodel: string;\n\tthinking: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n}\n\nexport interface SubagentArbitrationDto {\n\tstatus: \"success\" | \"failure\";\n\tproposed: ArbitrationRouteDto;\n\tfinal: ArbitrationRouteDto | null;\n\tchanged: Array<\"agent\" | \"model\" | \"thinking\">;\n\tstep?: number;\n\terrorCode?: string;\n\terrorMessage?: string;\n}\n\n/** Background agent metadata (mirrors RpcBackgroundAgentInfo). */\nexport interface BackgroundAgentDto {\n\tagentId: string;\n\tagentType: string;\n\ttaskSummary: string;\n\tstartedAt: string;\n\tstatus: \"running\" | \"completed\" | \"failed\";\n\tsessionDir?: string;\n\tsessionFile?: string;\n\tcwd?: string;\n\tarbitrations?: SubagentArbitrationDto[];\n}\n\n/**\n * Shared eviction cap for completed/failed background agents. The server\n * prunes its registry to this bound and the client applies the same cap as\n * defense-in-depth — the two sides must agree on how many completed agents\n * survive, so the constant lives here.\n */\nexport const MAX_COMPLETED_BACKGROUND_AGENTS = 20;\n\n/** Maximum JSON prompt request body accepted by the dashboard server. */\nexport const MAX_PROMPT_BODY_BYTES = 25 * 1024 * 1024;\n\n/** Maximum accepted JSON body for optional, payload-free SSE client diagnostics. */\nexport const MAX_CLIENT_DIAGNOSTIC_BYTES = 4 * 1024;\n\nexport type EventConnectionState =\n\t| \"connecting\"\n\t| \"connected\"\n\t| \"retrying\"\n\t| \"resyncing\"\n\t| \"disconnected\"\n\t| \"auth_failed\";\n\n/**\n * Deliberately payload-free client connection telemetry. It is useful for\n * correlating stream failures with server logs, without sending prompts,\n * cookies, tool data, or SSE event contents back to the server.\n */\nexport interface ClientConnectionDiagnosticDto {\n\tconnectionId: string;\n\tstate: EventConnectionState;\n\tpreviousState?: EventConnectionState;\n\tattempt: number;\n\tdelayMs?: number;\n\tvisibility: \"visible\" | \"hidden\";\n\tlastAppliedSeq?: number;\n\theartbeatAgeMs?: number;\n\teventCount: number;\n\teventRatePerMinute: number;\n\tprocessingLagTotalMs: number;\n\tprocessingLagMaxMs: number;\n}\n\n/**\n * Inline images are base64-encoded inside the JSON prompt body. Base64 expands\n * raw bytes by 4/3, so a 25 MiB body can carry at most floor(25 MiB * 3/4) =\n * 18.75 MiB of raw image data before JSON syntax and prompt text. Reserve the\n * remaining 0.75 MiB for that overhead and advertise an 18 MiB aggregate raw\n * image budget to the browser.\n */\nexport const MAX_TOTAL_IMAGE_BYTES = Math.floor((MAX_PROMPT_BODY_BYTES * 3) / 4) - 768 * 1024;\n\n/** Context usage (mirrors ContextUsage — the numbers the TUI footer shows). */\nexport interface ContextUsageDto {\n\ttokens: number | null;\n\tcontextWindow: number;\n\tpercent: number | null;\n}\n\nexport interface ScopedModelDto {\n\tprovider: string;\n\tid: string;\n\tname?: string;\n\treasoning?: boolean;\n\tthinkingLevel?: string;\n}\n\nexport interface SessionStatsDto {\n\tsessionFile?: string;\n\tsessionId: string;\n\tuserMessages: number;\n\tassistantMessages: number;\n\ttoolCalls: number;\n\ttoolResults: number;\n\ttotalMessages: number;\n\ttokens: {\n\t\tinput: number;\n\t\toutput: number;\n\t\tcacheRead: number;\n\t\tcacheWrite: number;\n\t\ttotal: number;\n\t};\n\tcost: number;\n\tcontextUsage?: ContextUsageDto;\n}\n\nexport interface PerformanceModelSummaryDto {\n\tprovider: string;\n\tmodelId: string;\n\trolling: { median: number; mean: number; count: number };\n\tdelta: {\n\t\tbaselineMedian: number;\n\t\trecentMedian: number;\n\t\tpercentDelta: number;\n\t\tdirection: \"above\" | \"below\" | \"stable\";\n\t\tbaselineCount: number;\n\t\trecentCount: number;\n\t};\n}\n\nexport interface PerformanceStatsDto {\n\tmodels: PerformanceModelSummaryDto[];\n}\n\nexport interface ResourcesDto {\n\tcontextFiles: Array<{ path: string }>;\n\tskills: Array<{ name: string; description: string }>;\n\textensions: Array<{ name?: string; path: string }>;\n\tpromptTemplates: Array<{ name: string; description?: string }>;\n\tsystemPromptPresent: boolean;\n}\n\nexport interface ImageAttachmentDto {\n\tdata: string;\n\tmimeType: string;\n}\n\n/**\n * Browser-facing reference to a validated tool-result raster image. Original\n * bytes remain behind authenticated runtime routes and never cross transcript\n * JSON or SSE payloads.\n */\nexport interface DashboardImageReferenceDto {\n\ttype: \"image_reference\";\n\t/** SHA-256 of the exact MIME type plus decoded original bytes. */\n\tid: string;\n\t/** Exact allowlisted original MIME type. */\n\tmimeType: \"image/png\" | \"image/jpeg\" | \"image/gif\" | \"image/webp\";\n\t/** Decoded original binary byte size. */\n\tsize: number;\n}\n\nexport const DASHBOARD_IMAGE_DISPLAY_MODES = [\"placeholders\", \"previews\", \"originals\"] as const;\nexport type DashboardImageDisplayMode = (typeof DASHBOARD_IMAGE_DISPLAY_MODES)[number];\n\nexport interface QueuedMessageDto {\n\ttext: string;\n\timages?: ImageAttachmentDto[];\n}\n\nexport interface PendingMessagesDto {\n\t/** Text-only compatibility view. */\n\tsteering: string[];\n\t/** Text-only compatibility view. */\n\tfollowUp: string[];\n\t/** Full queued payloads, including inline image attachments. */\n\tsteeringMessages?: QueuedMessageDto[];\n\t/** Full queued payloads, including inline image attachments. */\n\tfollowUpMessages?: QueuedMessageDto[];\n}\n\nexport interface CommandDto {\n\tname: string;\n\tdescription?: string;\n\tsource: \"extension\" | \"prompt\" | \"skill\" | \"builtin\";\n\t/** Built-ins with false are intercepted when typed but omitted from autocomplete. */\n\tdashboard?: boolean;\n}\n\nexport interface SessionTreeNodeDto {\n\tid: string;\n\tparentId: string | null;\n\ttype: string;\n\trole?: string;\n\tpreview: string;\n\ttimestamp: string;\n\tlabel?: string;\n\tchildren: SessionTreeNodeDto[];\n}\n\nexport interface RuntimeStatsSummaryDto {\n\ttokensTotal: number;\n\tcost: number;\n}\n\n/** Current task list (mirrors RpcSessionTask). */\nexport interface SessionTaskDto {\n\tid: string;\n\ttitle: string;\n\tstatus: \"pending\" | \"in_progress\" | \"completed\";\n}\n\n/** Live session state (mirrors RpcSessionState, model reduced to id fields). */\nexport interface SessionStateDto {\n\tmodel?: { provider: string; id: string; name?: string; reasoning?: boolean };\n\tscopedModels?: ScopedModelDto[];\n\tusingSubscription?: boolean;\n\t/** Current task list, atomically replaced by tasks_update events. */\n\ttasks: SessionTaskDto[];\n\tthinkingLevel: string;\n\tisStreaming: boolean;\n\t/** True while automatic retry classification, backoff, or execution is active. */\n\tisRetrying?: boolean;\n\t/** Current automatic retry attempt, or 0 outside an emitted retry attempt. */\n\tretryAttempt?: number;\n\tisCompacting: boolean;\n\tsteeringMode: \"all\" | \"one-at-a-time\";\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\tsessionFile?: string;\n\tsessionId: string;\n\tsessionName?: string;\n\tautoCompactionEnabled: boolean;\n\tmessageCount: number;\n\tpendingMessageCount: number;\n\tcontextUsage?: ContextUsageDto;\n\tmodelFallbackMessage?: string;\n}\n\n/** A live runtime managed by the dashboard server's pool. */\nexport interface RuntimeInfoDto {\n\t/** Pool key — stable identity for API calls and SSE envelopes. */\n\tkey: string;\n\tcwd: string;\n\tstate: SessionStateDto;\n\t/** Lean session stats for fleet cards; omitted when the runtime stats call fails. */\n\tstats?: RuntimeStatsSummaryDto;\n\t/** Background agents known to this runtime. */\n\tbackgroundAgents: BackgroundAgentDto[];\n\t/** Server-derived needs-attention flag (extension UI pending, paused, error). */\n\tneedsAttention: boolean;\n\t/** Runtime-level error that should survive browser reloads. */\n\terror?: string;\n\t/** Last assistant text, truncated for fleet-card previews. */\n\tlastAssistantText?: string;\n\t/** Session start timestamp (ISO) — stable tiebreak for deterministic fleet ordering. */\n\tcreatedAt: string;\n\t/** Last activity timestamp (ISO). */\n\tlastActivity: string;\n}\n\n/**\n * Lightweight, event-derived live-runtime view for fleet SSE updates.\n *\n * Unlike RuntimeInfoDto, this deliberately excludes RPC-fetched stats and\n * assistant preview text: RuntimePool can build it synchronously from its\n * in-memory runtime registry.\n */\nexport interface FleetRuntimeSnapshotDto {\n\tkey: string;\n\tcwd: string;\n\tstate: SessionStateDto;\n\tbackgroundAgents: BackgroundAgentDto[];\n\tneedsAttention: boolean;\n\terror?: string;\n\tcreatedAt: string;\n\tlastActivity: string;\n}\n\n/** Coalesced fleet update published on the dashboard SSE stream. */\nexport interface FleetSnapshotEventDto {\n\ttype: \"fleet_snapshot\";\n\truntimes: FleetRuntimeSnapshotDto[];\n}\n\n/** Fleet snapshot: live runtimes + on-disk inventory. */\nexport interface FleetDto {\n\truntimes: RuntimeInfoDto[];\n\tdiskSessions: SessionInfoDto[];\n}\n\n/** A single question inside an `ask` extension-UI request (mirrors RpcAskQuestion). */\nexport interface AskUiQuestionDto {\n\tquestion: string;\n\ttitle?: string;\n\toptions?: string[];\n\tallowFreeText?: boolean;\n\tmultiSelect?: boolean;\n\tmultiline?: boolean;\n}\n\n/** A blocking extension UI request that can be restored from a runtime snapshot. */\nexport interface ExtensionUiRequestDto {\n\ttype: \"extension_ui_request\";\n\tid: string;\n\tmethod: \"select\" | \"confirm\" | \"input\" | \"editor\" | \"ask\";\n\ttitle: string;\n\tmessage?: string;\n\toptions?: string[];\n\tprefill?: string;\n\tplaceholder?: string;\n\t/** For the `ask` method: one or more questions asked together as a single wizard. */\n\tquestions?: AskUiQuestionDto[];\n\ttimeout?: number;\n\t/** Absolute Unix timestamp in milliseconds when the runtime timeout fires. */\n\texpiresAt?: number;\n}\n\n/**\n * Atomic parent-session snapshot for drill-in hydration. Its barrier sequence\n * marks the SSE ordering point captured by the matching RPC snapshot marker.\n */\nexport interface RuntimeHydrationDto {\n\tkey: string;\n\tstate: SessionStateDto;\n\tmessages: unknown[];\n\tbackgroundAgents: BackgroundAgentDto[];\n\t/** Dialogs still waiting for a host response at the snapshot boundary. */\n\tpendingExtensionUiRequests?: ExtensionUiRequestDto[];\n\tbarrierSeq: number;\n}\n\n/** Parent/subagent data restored by an authoritative recovery snapshot. */\nexport interface ActiveRuntimeSnapshotDto extends RuntimeHydrationDto {\n\tsubagent?: { agentId: string; agent: BackgroundAgentDto; messages: unknown[]; barrierSeq: number };\n}\n\n/** Fleet refresh plus the active runtime's explicitly ordered snapshot. */\nexport interface DashboardResyncDto {\n\tfleet: FleetDto;\n\tactive?: ActiveRuntimeSnapshotDto;\n\t/** The global barrier to await before applying the payload. */\n\tbarrierSeq: number;\n}\n\n/**\n * SSE envelope. Every event on the dashboard stream wraps a session event with\n * the runtime key it came from plus a monotonically increasing sequence number\n * used for Last-Event-ID catch-up on reconnect.\n */\nexport interface EventEnvelope {\n\tseq: number;\n\tkey: string;\n\t/** An AgentSessionEvent (or dashboard-synthesized event) as emitted by the runtime. */\n\tevent: Record<string, unknown>;\n}\n\n/** File listing entry. */\nexport interface FileEntryDto {\n\tname: string;\n\ttype: \"file\" | \"dir\" | \"symlink\" | \"other\";\n\tsize: number;\n\tmodified: string;\n}\n\n/** Directory listing response. */\nexport interface ContextTrustEvaluationDto {\n\t/** Canonical existing directory evaluated by the utility RPC runtime. */\n\tcanonicalTarget: string;\n\t/** Whether nested context is untrusted, granted by a root, or globally unrestricted. */\n\tstate: \"untrusted\" | \"trusted-root\" | \"unrestricted\";\n\t/** Canonical root granting trusted-root access, including inherited access. */\n\tgrantingRoot?: string;\n}\n\n/** Result of changing a context-trust root through the utility RPC runtime. */\nexport interface ContextTrustMutationResultDto {\n\tevaluation: ContextTrustEvaluationDto;\n\tsettings: SettingsDto;\n\taddedRoot?: string;\n\tremovedRoot?: string;\n}\n\n/** Result of removing a configured trusted-folder string exactly as stored. */\nexport interface TrustedFolderRemovalResultDto {\n\tsettings: SettingsDto;\n\tremovedFolder: string;\n}\n\n/** Directory listing response. */\nexport interface DirListingDto {\n\t/** Canonicalized absolute path of the listed directory. */\n\tpath: string;\n\tentries: FileEntryDto[];\n\t/** Current global nested-context trust for this canonical directory. */\n\tcontextTrust: ContextTrustEvaluationDto;\n}\n\nexport type MemoryScopeKindDto = \"global\" | \"project\";\nexport type MemoryEntryTypeDto = \"user-preferences\" | \"good-practices\" | \"project\" | \"navigation\";\n\nexport interface MemoryEntryMetadataDto {\n\tname: string;\n\tdescription: string;\n\ttype: MemoryEntryTypeDto;\n}\n\nexport interface MemoryScopeDto {\n\tid: string;\n\tkind: MemoryScopeKindDto;\n\tlabel: string;\n\tprojectRoot?: string;\n\tmemoryDir: string;\n\texists: boolean;\n}\n\nexport interface MemoryEntrySummaryDto {\n\tfile: string;\n\tmetadata?: MemoryEntryMetadataDto;\n\tmetadataError?: string;\n\tmodified: string;\n\tsize: number;\n}\n\nexport interface MemoryListingDto {\n\tscope: MemoryScopeDto;\n\tindexContent: string | null;\n\tindexRevision: string | null;\n\tindexOverLimit: boolean;\n\tentries: MemoryEntrySummaryDto[];\n}\n\nexport interface MemoryDocumentDto {\n\tkind: \"index\" | \"entry\";\n\tfile: string;\n\tcontent: string;\n\trevision: string;\n\tmetadata?: MemoryEntryMetadataDto;\n\tmetadataError?: string;\n}\n\nexport interface MemoryMutationResultDto {\n\tlisting: MemoryListingDto;\n\tdocument?: MemoryDocumentDto;\n}\n\n/** Auth mode reported to the client. */\nexport interface AuthStatusDto {\n\tmode: \"local\" | \"remote\";\n\t/** Identity string for remote devices (e.g. Tailscale login name). */\n\tidentity?: string;\n\tdevice?: string;\n}\n\n/** Current rotating pairing code, readable only from the host/local dashboard. */\nexport interface PairingCodeDto {\n\tenabled: boolean;\n\tcode?: string;\n\texpiresInMs?: number;\n}\n\n/** A paired device (settings → devices). */\nexport interface PairedDeviceDto {\n\tid: string;\n\tidentity: string;\n\tdevice?: string;\n\tcreatedAt: string;\n\texpiresAt: string;\n}\n\n/** Dashboard settings snapshot (mirrors RpcSettingsSnapshot). */\nexport interface SubagentArbiterSettingsDto {\n\tenabled?: boolean;\n\tmodel?: string;\n\tthinking?: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n\tguidePath?: string;\n}\n\nexport interface SettingsDto {\n\tdefaultProvider?: string;\n\tdefaultModel?: string;\n\tdefaultThinkingLevel?: string;\n\tsteeringMode?: \"all\" | \"one-at-a-time\";\n\tfollowUpMode?: \"all\" | \"one-at-a-time\";\n\tcompactionEnabled?: boolean;\n\tretryEnabled?: boolean;\n\timageAutoResize?: boolean;\n\tblockImages?: boolean;\n\tenableSkillCommands?: boolean;\n\tautoLoadNestedContext?: boolean;\n\t/** Global configured trusted context folders, including invalid legacy entries. */\n\ttrustedContextFolders?: string[];\n\t/** Canonical existing trusted roots currently enforced by the runtime. */\n\teffectiveTrustedContextRoots?: string[];\n\ttransport?: \"sse\" | \"websocket\" | \"auto\";\n\thideThinkingBlock?: boolean;\n\tagentModels?: Record<string, string[]>;\n\t/** Global-only Dispatch Arbiter configuration. */\n\tsubagentArbiter?: SubagentArbiterSettingsDto | null;\n\t/** Raw effective persisted patterns; absent means future-inclusive implicit all. */\n\tenabledModels?: string[];\n\t/** Effective persistent scope resolved by coding-agent core in cycling order. */\n\tresolvedScopedModels: ScopedModelDto[];\n\t/** Resolver diagnostics for legacy persisted patterns. */\n\tscopeWarnings: Array<{ pattern: string; message: string }>;\n\thasProjectEnabledModelsOverride: boolean;\n\tenabledModelsSource: \"default\" | \"global\" | \"project\";\n}\n\n/** Dashboard settings mutation payload. Unlike a snapshot, null explicitly clears enabledModels. */\nexport type SettingsUpdateDto = Partial<\n\tPick<\n\t\tSettingsDto,\n\t\t| \"defaultProvider\"\n\t\t| \"defaultModel\"\n\t\t| \"defaultThinkingLevel\"\n\t\t| \"steeringMode\"\n\t\t| \"followUpMode\"\n\t\t| \"compactionEnabled\"\n\t\t| \"retryEnabled\"\n\t\t| \"imageAutoResize\"\n\t\t| \"blockImages\"\n\t\t| \"enableSkillCommands\"\n\t\t| \"autoLoadNestedContext\"\n\t\t| \"trustedContextFolders\"\n\t\t| \"transport\"\n\t\t| \"hideThinkingBlock\"\n\t\t| \"agentModels\"\n\t\t| \"subagentArbiter\"\n\t>\n> & { enabledModels?: string[] | null };\n\nexport type SettingsSaveResultDto = SettingsDto & { warnings?: string[] };\n\n/** Available model entry (mirrors ModelInfo). */\nexport interface ModelInfoDto {\n\tprovider: string;\n\tid: string;\n\tname: string;\n\tcontextWindow: number;\n\treasoning: boolean;\n}\n\n/** Agent definition metadata (mirrors RpcAgentTypeInfo). */\nexport interface AgentTypeDto {\n\tname: string;\n\tdescription: string;\n}\n"]}
|
|
@@ -66,14 +66,14 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
66
66
|
`).length}function Zs(e){if(e.kind===`user`)return e.text;if(e.kind===`assistant`)return e.blocks.filter(e=>e.kind===`text`).map(e=>e.text).join(`
|
|
67
67
|
`)}function Qs(e){return e.match(/^\/skill:([\w-]+)/)?.[1]}function $s(e){if(e.status===`running`){let t=Math.floor((Date.now()-e.startedAt)/1e3);return{text:`● running${t>2?` ${t}s`:``}`,cls:`running`}}return e.status===`error`?{text:`✕ error`,cls:`error`}:{text:`done`,cls:``}}var ec=new Set([`subagent`,`skill`,`web_fetch`]);function tc(e){let t=e.args;if(!t||typeof t!=`object`)return[];switch(e.toolName){case`bash`:case`bash (user)`:return[];case`read`:case`ls`:case`edit`:return[];case`suggest_next`:return[];case`write`:return e.resultText&&typeof t.content==`string`?[{label:`content`,text:String(t.content),language:Gs(Ks(t))}]:[];case`subagent`:{let e=[];return typeof t.task==`string`&&e.push({label:`task`,text:t.task,markdown:!0}),Array.isArray(t.tasks)&&t.tasks.forEach((t,n)=>{typeof t?.task==`string`&&e.push({label:`task ${n+1}${t.agent?` (${t.agent})`:``}`,text:t.task,markdown:!0})}),Array.isArray(t.chain)&&t.chain.forEach((t,n)=>{typeof t?.task==`string`&&e.push({label:`step ${n+1}${t.agent?` (${t.agent})`:``}`,text:t.task,markdown:!0})}),e}default:{let e=[];for(let[n,r]of Object.entries(t)){let t=typeof r==`string`?r:JSON.stringify(r,null,2);t&&t.length>80&&e.push({label:n,text:t})}return e}}}function nc(e){return(()=>{var t=ls();return X(t,W(G,{get each(){return e.text.split(`
|
|
68
68
|
`)},children:e=>[(()=>{var t=us();return X(t,e),j(n=>{var r=!!e.startsWith(`+`),i=!!e.startsWith(`-`);return r!==n.e&&t.classList.toggle(`diff-add`,n.e=r),i!==n.t&&t.classList.toggle(`diff-del`,n.t=i),n},{e:void 0,t:void 0}),t})(),`
|
|
69
|
-
`]})),t})()}function rc(e){if(e.toolName!==`edit`)return;let t=e.details?.diff;return typeof t==`string`?t:void 0}var ic=new Set([`image/png`,`image/jpeg`,`image/gif`,`image/webp`]),ac=/^[0-9a-f]{64}$/,oc=1024*1024;function sc(e){return e>=1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:e>=1024?`${Math.ceil(e/1024)} KB`:`${e} B`}var cc={alt:`Tool result`,originalAriaLabel:`Original tool-result image`,enlargedAlt:`Enlarged tool-result preview`},lc={alt:`Uploaded image`,originalAriaLabel:`Original uploaded image`,enlargedAlt:`Enlarged uploaded-image preview`};function uc(e){let[t,n]=k(),[r,i]=k(),[a,o]=k(),[s,c]=k(!1),l=t=>ft(e.scope.runtimeKey,e.image.id,t,e.scope.agentId),u=e=>{let t=l(e);if(!t){o(`Invalid image reference`);return}o(void 0),i(e),n(t)};M(()=>{let e=ts();c(!1),o(void 0),e===`previews`?u(`preview`):e===`originals`?u(`original`):(n(void 0),i(void 0))});let d=()=>{e.image.size>oc&&!window.confirm(`Load the ${sc(e.image.size)} original image? This may use significant data.`)||u(`original`)},f=e=>{e.key===`Escape`&&c(!1)};return R(()=>window.addEventListener(`keydown`,f)),z(()=>window.removeEventListener(`keydown`,f)),(()=>{var l=ps(),f=l.firstChild,p=f.firstChild,m=p.firstChild;return X(l,W(K,{get when(){return t()},get fallback(){return(()=>{var t=ms(),n=t.firstChild,r=n.firstChild,i=n.nextSibling;return X(n,()=>e.image.mimeType.replace(`image/`,``).toUpperCase(),r),X(n,()=>sc(e.image.size),null),i.$$click=()=>u(`preview`),X(i,()=>a()?`retry preview`:`load preview`),t})()},children:t=>(()=>{var a=hs(),s=a.firstChild;return a.$$click=()=>r()===`preview`&&c(!0),s.addEventListener(`error`,()=>{o(`Could not load ${r()??`image`}`),n(void 0),i(void 0)}),j(n=>{var i=r()!==`preview`,o=r()===`preview`?`Enlarge image preview`:e.labels.originalAriaLabel,c=e.labels.alt,l=t();return i!==n.e&&(a.disabled=n.e=i),o!==n.t&&Y(a,`aria-label`,n.t=o),c!==n.a&&Y(s,`alt`,n.a=c),l!==n.o&&Y(s,`src`,n.o=l),n},{e:void 0,t:void 0,a:void 0,o:void 0}),a})()}),f),X(p,()=>e.image.mimeType.replace(`image/`,``).toUpperCase(),m),X(p,()=>sc(e.image.size),null),X(f,W(K,{get when(){return r()!==`original`},get children(){var t=ds();return t.firstChild,t.$$click=d,X(t,()=>sc(e.image.size),null),t}}),null),X(l,W(K,{get when(){return a()},children:e=>(()=>{var t=gs();return X(t,e),t})()}),null),X(l,W(K,{get when(){return q(()=>!!(s()&&r()===`preview`))()&&t()},get children(){var n=fs(),r=n.firstChild,i=r.nextSibling.firstChild,a=i.nextSibling;return r.$$click=()=>c(!1),a.$$click=()=>c(!1),j(n=>{var r=t(),a=e.labels.enlargedAlt;return r!==n.e&&Y(i,`src`,n.e=r),a!==n.t&&Y(i,`alt`,n.t=a),n},{e:void 0,t:void 0}),n}}),null),l})()}function dc(e){let t=()=>e.images.filter(e=>ic.has(e.mimeType)&&ac.test(e.id)&&Number.isSafeInteger(e.size)&&e.size>0);return W(K,{get when(){return t().length>0},get children(){var n=_s();return X(n,W(G,{get each(){return t()},children:t=>W(uc,{image:t,get scope(){return e.scope},get labels(){return e.labels}})})),n}})}function fc(e){let[t,n]=k(!1),r=()=>e.text.length>Bs;M(()=>{r()||n(!1)});let i=()=>r()&&!t()?e.text.slice(-204800):e.text;return[W(K,{get when(){return q(()=>!!r())()&&!t()},get children(){var t=vs(),r=t.firstChild.nextSibling,i=r.nextSibling.nextSibling,a=i.nextSibling.nextSibling,o=a.firstChild.nextSibling;return o.nextSibling,X(t,()=>Us(Bs),r),X(t,()=>Us(e.text.length),i),a.$$click=()=>n(!0),X(a,()=>Us(e.text.length),o),t}}),W(K,{get when(){return e.markdown},get fallback(){return W(Js,{get text(){return i()},get language(){return e.language},get autoScroll(){return e.autoScroll},get throttle(){return e.throttle}})},get children(){return W(Ws,{get text(){return i()},get throttle(){return e.throttle}})}})]}function pc(e){let t=()=>$s(e.entry),n=()=>e.entry.args,r=()=>{if(e.entry.toolName===`suggest_next`)return e.entry.details},i=()=>rc(e.entry),a=()=>e.entry.toolName===`write`&&!e.entry.resultText&&typeof n()?.content==`string`?String(n()?.content):e.entry.resultText,o=()=>{if(e.entry.toolName===`read`||e.entry.toolName===`write`&&!e.entry.resultText)return Gs(Ks(n()))},s=()=>ec.has(e.entry.toolName)&&e.entry.status!==`error`,c=()=>e.entry.toolName===`bash`||e.entry.toolName===`bash (user)`,l=()=>tc(e.entry),u=()=>as(e.entry.toolName),d=e.entry.toolName!==`ask_user`,[f,p]=k(u()||e.entry.status===`running`&&d),m=e.entry.status===`running`,h=!1,g=!1,_,v=e=>{f()!==e&&(g=!0,p(e),_&&clearTimeout(_),_=setTimeout(()=>{g=!1,_=void 0},0))};return M(()=>{let t=e.entry.status===`running`,n=u();t&&d?(h=!1,v(!0)):m?(h=!1,v(n)):h||v(n),m=t}),z(()=>{_&&clearTimeout(_)}),(()=>{var u=xs(),m=u.firstChild.firstChild,v=m.nextSibling,y=v.nextSibling;return u.addEventListener(`toggle`,t=>{let n=t.currentTarget.open;if(g){p(n);return}if(e.entry.status===`running`&&d&&!n){g=!0,t.currentTarget.open=!0,p(!0),_&&clearTimeout(_),_=setTimeout(()=>{g=!1,_=void 0},0);return}h=!0,p(n)}),X(m,()=>e.entry.toolName),X(v,()=>Ys(e.entry)),X(y,()=>t().text),X(u,W(K,{get when(){return f()},get children(){return[W(K,{get when(){return e.entry.toolName===`bash`||e.entry.toolName===`bash (user)`},get children(){var e=ys(),t=e.firstChild;return X(t,()=>String(n()?.command??``)),e}}),W(G,{get each(){return l()},children:e=>(()=>{var t=Ss(),n=t.firstChild;return X(n,()=>e.label),X(t,W(K,{get when(){return e.markdown},get fallback(){return W(Js,{get text(){return e.text},get language(){return e.language}})},get children(){return W(Ws,{get text(){return e.text}})}}),null),t})()}),W(K,{get when(){return e.entry.images?.length},get children(){var t=bs();return X(t,W(dc,{get images(){return e.entry.images},get scope(){return e.imageScope},labels:cc})),t}}),W(Te,{get children(){return[W(Ee,{get when(){return r()},children:e=>(()=>{var t=Cs(),n=t.firstChild,r=n.firstChild.nextSibling;return X(t,W(K,{get when(){return e().summary},get children(){return W(Ws,{get text(){return e().summary}})}}),n),X(r,()=>e().suggestion),t})()}),W(Ee,{get when(){return i()},children:e=>(()=>{var t=bs();return X(t,W(nc,{get text(){return e()}})),t})()}),W(Ee,{get when(){return a()},children:t=>(()=>{var n=bs();return X(n,W(fc,{get text(){return t()},get language(){return o()},get markdown(){return s()},get autoScroll(){return c()},get throttle(){return e.entry.status===`running`}})),n})()})]}})]}}),null),j(e=>{var n=f(),r=`tool-status ${t().cls}`;return n!==e.e&&(u.open=e.e=n),r!==e.t&&je(y,e.t=r),e},{e:void 0,t:void 0}),u})()}function mc(e){let[t,n]=k(`idle`);async function r(){if(e.text){try{await navigator.clipboard.writeText(e.text),n(`copied`)}catch{n(`failed`)}setTimeout(()=>n(`idle`),1200)}}return(()=>{var n=ws();return n.$$click=r,X(n,(()=>{var e=q(()=>t()===`copied`);return()=>e()?`copied`:t()===`failed`?`copy failed`:`copy`})()),j(()=>n.disabled=!e.text),n})()}function hc(e){let t=()=>e.entry.blocks.filter(t=>e.entry.streaming||e.entry.stopReason!==`error`||t.kind!==`thinking`||t.text.trim().length>0);return(()=>{var n=Ds(),r=n.firstChild,i=r.firstChild;return X(i,()=>e.who),X(r,W(K,{get when(){return e.entry.model},get children(){return[Ts(),(()=>{var t=us();return X(t,()=>e.entry.model),t})()]}}),null),X(r,W(K,{get when(){return e.entry.streaming},get children(){return[Ts(),Es()]}}),null),X(r,W(mc,{get text(){return Zs(e.entry)}}),null),X(n,W(G,{get each(){return t()},children:(n,r)=>W(K,{get when(){return n.kind===`thinking`},get fallback(){return(()=>{var i=ks();return X(i,W(Ws,{get text(){return n.text},get classList(){return{"streaming-cursor":e.entry.streaming&&r()===t().length-1}},get throttle(){return e.entry.streaming}})),i})()},get children(){var t=Os();return t.firstChild,X(t,W(Ws,{get text(){return n.text},class:`thinking-body markdown-body`,get throttle(){return e.entry.streaming}}),null),j(()=>t.open=es()),t}})}),null),X(n,W(K,{get when(){return q(()=>e.entry.stopReason===`error`)()&&e.entry.errorMessage},children:e=>(()=>{var t=As();return t.firstChild,X(t,e,null),t})()}),null),n})()}function gc(e,t){return e?.kind===`entry`&&e.entry===t}function _c(e){let[t,n]=k(e);return{kind:`assistant-turn`,lead:e[0],entries:t,setEntries:n}}function vc(e,t=[]){let n=[],r=0;for(;r<e.length;){let i=e[r];if(i?.kind===`assistant`){let a=[i];for(r+=1;e[r]?.kind===`tool`;)a.push(e[r]),r+=1;let o=t[n.length];if(o?.kind===`assistant-turn`&&o.lead===i){let e=L(o.entries);(e.length!==a.length||a.some((t,n)=>t!==e[n]))&&o.setEntries(a),n.push(o)}else n.push(_c(a));continue}if(i){let e=t[n.length];n.push(gc(e,i)?e:{kind:`entry`,entry:i})}r+=1}return n}function yc(e){return W(Te,{get children(){return[W(Ee,{get when(){return e.entry.kind===`user`},get children(){var t=js(),n=t.firstChild,r=n.firstChild,i=n.nextSibling;return X(n,W(K,{get when(){return Qs(e.entry.text)},children:e=>(()=>{var t=Ps();return t.firstChild,X(t,e,null),t})()}),r),X(n,W(mc,{get text(){return Zs(e.entry)}}),r),X(r,()=>e.userLabel),X(i,()=>e.entry.text),X(t,W(K,{get when(){return e.entry.images?.length},get children(){return W(dc,{get images(){return e.entry.images},get scope(){return e.imageScope},labels:lc})}}),null),t}}),W(Ee,{get when(){return e.entry.kind===`agent-result`},get children(){return W(bc,{get entry(){return e.entry}})}}),W(Ee,{get when(){return e.entry.kind===`assistant`},get children(){return W(hc,{get entry(){return e.entry},get who(){return e.who}})}}),W(Ee,{get when(){return e.entry.kind===`tool`},get children(){return W(pc,{get entry(){return e.entry},get imageScope(){return e.imageScope}})}}),W(Ee,{get when(){return e.entry.kind===`summary`},get children(){var t=Ms(),n=t.firstChild.firstChild,r=n.nextSibling;return X(n,()=>e.entry.label===`compaction`?`context compacted`:`branch summary`,null),X(n,W(K,{get when(){return e.entry.tokensBefore},get children(){return[` `,`— `,q(()=>e.entry.tokensBefore.toLocaleString()),` tokens summarized`]}}),null),X(r,()=>e.entry.text),t}}),W(Ee,{get when(){return e.entry.kind===`custom`},get children(){var t=Ns(),n=t.firstChild,r=n.firstChild,i=n.nextSibling;return X(r,()=>e.entry.tag),X(i,()=>e.entry.text),t}})]}})}function bc(e){return(()=>{var t=Is(),n=t.firstChild,r=n.firstChild;return r.firstChild,X(r,W(K,{get when(){return e.entry.header},get children(){var t=Fs();return X(t,()=>e.entry.header),t}}),null),X(n,W(Ws,{get text(){return e.entry.text},class:`entry-body markdown-body`}),null),t})()}function xc(e){let t=()=>e.who??`dreb`,n=()=>e.userLabel??`you`,r=()=>e.imageScope??{runtimeKey:``},i=N(t=>vc(e.entries,t)),[a,o]=k(150),s;M(()=>{let t=e.resetKey??e.entries;t!==s&&(s=t,o(150))});let c=N(()=>{let e=i(),t=a();return e.length>t?e.slice(-t):e}),l=()=>Math.max(0,i().length-c().length);return[W(K,{get when(){return l()>0},get children(){var e=Ls(),t=e.firstChild,n=t.firstChild.nextSibling,r=n.nextSibling.nextSibling;return r.nextSibling,t.$$click=()=>o(Math.min(i().length,a()+150)),X(t,()=>Math.min(150,l()),n),X(t,l,r),e}}),W(G,{get each(){return c()},children:e=>W(Te,{get children(){return[W(Ee,{get when(){return e.kind===`assistant-turn`},get children(){var i=Rs();return X(i,W(G,{get each(){return e.entries()},children:e=>W(yc,{entry:e,get who(){return t()},get userLabel(){return n()},get imageScope(){return r()}})})),i}}),W(Ee,{get when(){return e.kind===`entry`},get children(){return W(yc,{get entry(){return e.entry},get who(){return t()},get userLabel(){return n()},get imageScope(){return r()}})}})]}})})]}Ae([`click`]);var Sc=J(`<p class=settings-error>`),Cc=J(`<p class=settings-success>`),wc=J(`<button type=button class=memory-nav-item><span>MEMORY.md</span><small>complete editable index`),Tc=J(`<div class=context-trust-warning><strong>Complete index warning:</strong> MEMORY.md is over 200 lines. The dashboard shows the full file for repair, while the agent prompt may only load the indexed prefix.`),Ec=J(`<div class=screen-fill><main class="container memories-screen"><div class=memories-head><div><h1>Memories</h1><p class=scope-note>Edit dreb memory only: global ~/.dreb/memory plus known project .dreb/memory scopes. Claude memory paths are never included.</p></div><button type=button class=btn>refresh</button></div><div class=memories-layout><aside class=memories-sidebar><section class=memory-panel><h2>Scopes</h2></section><section class=memory-panel><h2>Documents</h2></section></aside><section class=memory-editor>`),Dc=J(`<p class=muted>loading scopes…`),Oc=J(`<p class=muted>No active dreb memory scopes.`),kc=J(`<button type=button class=memory-nav-item><span></span><small>`),Ac=J(`<p class=muted>loading documents…`),jc=J(`<p class=muted>Memory directory is missing; nothing to edit.`),Mc=J(`<p class=muted>MEMORY.md index missing.`),Nc=J(`<p class=muted>No memory entries.`),Pc=J(`<output class=memory-loading>loading selected memory…`),Fc=J(`<p class=muted>Select an existing memory document.`),Ic=J(`<button type=button class="btn btn-danger">delete entry`),Lc=J(`<div class=memory-doc-head><div><h2></h2><p class=scope-note> · revision </p></div><div class=head-actions><button type=button class=btn>reload`),Rc=J(`<p class=settings-error>Metadata error: `),zc=J(`<div class=memory-edit-actions><button type=button class="btn btn-primary"></button><button type=button class=btn>revert draft</button><span class=muted>`),Bc=J(`<textarea class=memory-textarea>`),Vc=J(`<details class=memory-preview open><summary>preview`),Hc=J(`<div class=memory-metadata><strong></strong><span></span><span>`),Uc=J(`<p>This deletes the entry file and first removes matching <code>[…](<!>)</code> or <code>[…](./<!>)</code> lines from MEMORY.md. If the index changed, deletion will fail with a conflict instead of leaving a dangling link.`),Wc=J(`<button type=button class=btn>cancel`),Gc=J(`<button type=button class="btn btn-danger">`),Kc=`MEMORY.md`;function qc(e){return e.metadata?`${e.metadata.name} · ${e.metadata.type}`:e.metadataError?`metadata error: ${e.metadataError}`:`metadata unavailable`}function Jc(e,t){return e?e.kind===`index`?`MEMORY.md index`:e.metadata?.name??e.file:t??`memory`}function Yc(e){if(e)return e.indexContent===null?e.entries[0]?.file:Kc}function Xc(e,t){if(!e||!t)return;let n;try{n=decodeURIComponent(e)}catch{return}if(n.startsWith(`./`)&&(n=n.slice(2)),!(!n||n.includes(`/`)||n.includes(`\\`)||n.includes(`?`)||n.includes(`#`)))return t.entries.some(e=>e.file===n)?n:void 0}function Zc(e){let[t,n]=k(),[r,i]=k(),[a,o]=k(),[s,c]=k(),[l,u]=k(``),[d,f]=k(!1),[p,m]=k(!1),[h,g]=k(),[_,{refetch:v}]=F(async()=>{try{return(await Q.memoryScopes()).scopes}catch(e){return o(e instanceof Error?e.message:String(e)),[]}});M(()=>{let e=_();if(!e?.length)return;let r=t();(!r||!e.some(e=>e.id===r))&&n(e[0].id)});let[y,{mutate:b,refetch:x}]=F(()=>t(),async e=>{o(void 0),c(void 0);try{return await Q.memoryListing(e)}catch(e){o(e instanceof Error?e.message:String(e));return}});M(()=>{let e=y();if(!e)return;let t=r(),n=new Set([...e.indexContent===null?[]:[Kc],...e.entries.map(e=>e.file)]);(!t||!n.has(t))&&i(Yc(e))});let[S,{mutate:C,refetch:w}]=F(()=>{let e=t(),n=r();return e&&n?{scopeId:e,file:n}:void 0},async e=>{o(void 0),c(void 0);try{return await Q.memoryDocument(e.scopeId,e.file)}catch(e){o(e instanceof Error?e.message:String(e));return}});M(()=>{let e=S();!e||d()||u(e.content)});function T(e){t()!==e.id&&I(()=>{i(void 0),n(e.id),C(void 0),f(!1),u(``)})}function E(e){r()!==e&&(i(e),C(void 0),f(!1),u(``))}function D(e){let t=e.target?.closest(`a`);if(!(t instanceof HTMLAnchorElement))return;let n=Xc(t.getAttribute(`href`),y());n&&(e.preventDefault(),E(n))}async function O(){await v(),await x(),r()&&await w()}async function A(){let e=t(),n=S();if(!(!e||!n)){m(!0),o(void 0),c(void 0);try{let t=await Q.saveMemoryDocument(e,n.file,l(),n.revision);b(t.listing),t.document&&C(t.document),u(t.document?.content??l()),f(!1),c(`saved`)}catch(e){o(e?.status===409?`${e.message} Your draft is still here.`:e instanceof Error?e.message:String(e))}finally{m(!1)}}}async function N(){let e=t(),n=h(),r=y();if(!(!e||!n||n.kind!==`entry`||!r)){m(!0),o(void 0),c(void 0);try{let t=await Q.deleteMemoryEntry(e,n.file,n.revision,r.indexRevision);b(t.listing),C(void 0),g(void 0),i(Yc(t.listing)),f(!1),u(``),c(`deleted ${n.file}; index links cleaned up`)}catch(e){o(e instanceof Error?e.message:String(e))}finally{m(!1)}}}return(()=>{var n=Ec(),i=n.firstChild,o=i.firstChild,c=o.firstChild.nextSibling,m=o.nextSibling,v=m.firstChild,b=v.firstChild;b.firstChild;var x=b.nextSibling;x.firstChild;var C=v.nextSibling;return X(n,W(tt,{get store(){return e.store},active:`memories`}),i),c.$$click=()=>void O(),X(i,W(K,{get when(){return a()},get children(){var e=Sc();return X(e,a),e}}),m),X(i,W(K,{get when(){return s()},get children(){var e=Cc();return X(e,s),e}}),m),X(b,W(K,{get when(){return!_.loading},get fallback(){return Dc()},get children(){return W(K,{get when(){return(_()??[]).length>0},get fallback(){return Oc()},get children(){return W(G,{get each(){return _()??[]},children:e=>(()=>{var n=kc(),r=n.firstChild,i=r.nextSibling;return n.$$click=()=>T(e),X(r,(()=>{var t=q(()=>e.kind===`global`);return()=>t()?`global`:e.label})()),X(i,(()=>{var t=q(()=>!!e.exists);return()=>t()?e.memoryDir:`${e.memoryDir} (missing)`})()),j(()=>n.classList.toggle(`active`,t()===e.id)),n})()})}})}}),null),X(x,W(K,{get when(){return!y.loading},get fallback(){return Ac()},get children(){return W(K,{get when(){return y()?.scope.exists},get fallback(){return jc()},get children(){return[W(K,{get when(){return y()?.indexContent!==null},get fallback(){return Mc()},get children(){var e=wc();return e.$$click=()=>E(Kc),j(()=>e.classList.toggle(`active`,r()===Kc)),e}}),W(K,{get when(){return(y()?.entries.length??0)>0},get fallback(){return Nc()},get children(){return W(G,{get each(){return y()?.entries??[]},children:e=>(()=>{var t=kc(),n=t.firstChild,i=n.nextSibling;return t.$$click=()=>E(e.file),X(n,()=>e.file),X(i,()=>qc(e)),j(n=>{var i=r()===e.file,a=!!e.metadataError;return i!==n.e&&t.classList.toggle(`active`,n.e=i),a!==n.t&&t.classList.toggle(`error`,n.t=a),n},{e:void 0,t:void 0}),t})()})}})]}})}}),null),X(C,W(K,{get when(){return q(()=>!y.loading)()&&!S.loading},get fallback(){return Pc()},get children(){return[W(K,{get when(){return y()?.indexOverLimit},get children(){return Tc()}}),W(K,{get when(){return S()},get fallback(){return Fc()},children:e=>[(()=>{var t=Lc(),n=t.firstChild,i=n.firstChild,a=i.nextSibling,o=a.firstChild,s=n.nextSibling,c=s.firstChild;return X(i,()=>Jc(e(),r())),X(a,()=>e().file,o),X(a,()=>e().revision.slice(0,12),null),c.$$click=()=>void w(),X(s,W(K,{get when(){return e().kind===`entry`},get children(){var t=Ic();return t.$$click=()=>g(e()),t}}),null),j(()=>c.disabled=S.loading),t})(),W(K,{get when(){return e().metadata},children:e=>(()=>{var t=Hc(),n=t.firstChild,r=n.nextSibling,i=r.nextSibling;return X(n,()=>e().name),X(r,()=>e().type),X(i,()=>e().description),t})()}),W(K,{get when(){return e().metadataError},get children(){var t=Rc();return t.firstChild,X(t,()=>e().metadataError,null),t}}),(()=>{var t=zc(),n=t.firstChild,r=n.nextSibling,i=r.nextSibling;return n.$$click=()=>void A(),X(n,()=>p()?`saving…`:`save`),r.$$click=()=>{u(e().content),f(!1)},X(i,()=>d()?`unsaved draft`:`saved revision loaded`),j(e=>{var t=!d()||p(),i=!d()||p();return t!==e.e&&(n.disabled=e.e=t),i!==e.t&&(r.disabled=e.t=i),e},{e:void 0,t:void 0}),t})(),(()=>{var t=Bc();return t.$$input=t=>{u(t.currentTarget.value),f(t.currentTarget.value!==e().content)},j(()=>t.value=l()),t})(),(()=>{var e=Vc();return e.firstChild,e.$$keydown=e=>{e.key===`Enter`&&D(e)},e.$$click=D,X(e,W(Ws,{get text(){return l()},throttle:!0}),null),e})()]})]}})),X(i,W(K,{get when(){return h()},children:e=>W(rt,{get title(){return`Delete ${e().file}?`},onDismiss:()=>g(void 0),get actions(){return[(()=>{var e=Wc();return e.$$click=()=>g(void 0),e})(),(()=>{var e=Gc();return e.$$click=()=>void N(),X(e,()=>p()?`deleting…`:`delete entry`),j(()=>e.disabled=p()),e})()]},get children(){var t=Uc(),n=t.firstChild.nextSibling,r=n.firstChild.nextSibling;r.nextSibling;var i=n.nextSibling.nextSibling,a=i.firstChild.nextSibling;return a.nextSibling,X(n,()=>e().file,r),X(i,()=>e().file,a),t}})}),null),j(e=>{var t=_.loading||y.loading,n=y.loading||S.loading;return t!==e.e&&(c.disabled=e.e=t),n!==e.t&&Y(C,`aria-busy`,e.t=n),e},{e:void 0,t:void 0}),n})()}Ae([`click`,`input`,`keydown`]);var Qc=J(`<p class=pair-error>`),$c=J(`<main class=pair-card><span class=wordmark>dreb</span><h1>pair this device</h1><p class=sub>First login from a new device needs the current pairing code.</p><div class=identity><span class=row-line><span class=k>tailscale identity</span><span></span></span><span class=row-line><span class=k>allowlist</span><span class="chip chip-running"style=align-self:flex-end><span class=dot>●</span> allowed</span></span></div><div class=field><label for=pairing-pin>6-digit code</label><input id=pairing-pin class=pin-input type=text inputmode=numeric maxlength=6 autocomplete=one-time-code></div><p class=pin-hint>The code is shown in the dashboard <strong>Settings tab on the host machine</strong>. It rotates every 30 seconds.</p><div class=pair-actions><button type=button class="btn btn-primary"></button></div><div class=security-note><p><strong>Why a PIN?</strong> Your network identity got you here, but identity alone doesn't grant control. The code proves you can see the host machine's local dashboard — so a stolen or shared allowlist entry can't quietly gain access.</p><p><strong>What pairing grants.</strong> This browser gets a signed cookie for this host. It can chat with agents, run commands through them, browse the host's files, and upload/download — the same power as sitting at the terminal. Unpair anytime from settings → devices.`),el=J(`<div class=pair-wrap>`),tl=J(`<p class="muted small">rejected identity: `),nl=J(`<main class=denied-card><span class=wordmark>dreb</span><h1>access denied</h1><p></p><p class="muted small">If this device should have access, add its Tailscale identity to the dashboard allowlist on the host and reload.`);function rl(e){let[t,n]=k(``),[r,i]=k(),[a,o]=k(!1),s=()=>e.store.auth(),c=()=>s()?.error&&!s()?.needsPairing,l=()=>typeof window.matchMedia==`function`&&window.matchMedia(`(max-width: 700px)`).matches;async function u(){o(!0),i(void 0);try{await Q.pair(t()),await e.store.start(),e.store.navigate({screen:`fleet`})}catch(e){i(e instanceof Error?e.message:String(e))}finally{o(!1)}}return(()=>{var e=el();return X(e,W(K,{get when(){return!c()},get fallback(){return(()=>{var e=nl(),t=e.firstChild.nextSibling.nextSibling,n=t.nextSibling;return X(t,()=>s()?.error),X(e,W(K,{get when(){return s()?.identity},get children(){var e=tl();return e.firstChild,X(e,()=>s().identity,null),e}}),n),e})()},get children(){var e=$c(),i=e.firstChild.nextSibling.nextSibling.nextSibling,o=i.firstChild,c=o.firstChild.nextSibling;o.nextSibling.firstChild.nextSibling;var d=i.nextSibling,f=d.firstChild.nextSibling,p=d.nextSibling.nextSibling,m=p.firstChild;return X(c,()=>s()?.identity??`unknown`),f.$$keydown=e=>{e.key===`Enter`&&t().length===6&&!l()&&u()},f.$$input=e=>n(e.currentTarget.value.replace(/\D/g,``).slice(0,6)),X(e,W(K,{get when(){return r()},get children(){var e=Qc();return X(e,r),e}}),p),m.$$click=u,X(m,()=>a()?`pairing…`:`pair device`),j(()=>m.disabled=t().length!==6||a()),j(()=>f.value=t()),e}})),e})()}Ae([`input`,`keydown`,`click`]);function il(e,t){let n=e.trim(),r=/^\/([^\s]+)(?:\s+([\s\S]*))?$/.exec(n);if(!r)return;let i=t.find(e=>e.source===`builtin`&&e.name===r[1]);if(i)return{command:i,args:(r[2]??``).trim()}}async function al(e,t,n){let r=t[e.command.name];if(r){await r(e.args);return}if(e.command.dashboard===!1){n(`/${e.command.name} is available only in the terminal UI.`);return}n(`/${e.command.name} isn't implemented in the dashboard yet — use the terminal UI.`)}function ol(e,t,n=8){let r=new Map;for(let t of e)(!r.get(t.name)||t.source===`builtin`)&&r.set(t.name,t);return[...r.values()].filter(e=>e.source!==`builtin`||e.dashboard!==!1).filter(e=>{let n=e.name.toLowerCase();return!t||n.startsWith(t)||n.includes(t)}).sort((e,n)=>{let r=e.name.toLowerCase(),i=n.name.toLowerCase();return(t?+!r.startsWith(t):+(e.source===`builtin`))-(t?+!i.startsWith(t):+(n.source===`builtin`))||e.name.localeCompare(n.name)}).slice(0,n)}function sl(e){return typeof DOMException<`u`&&e instanceof DOMException&&e.name===`AbortError`?!0:typeof e==`object`&&!!e&&`name`in e&&e.name===`AbortError`}var cl=new Map,ll=new Map;function ul(e){return ll.get(e)}function dl(e,t){ll.set(e,t)}function fl(e){return cl.get(e)??[]}function pl(e,t){let n=cl.get(e)??[];n.push(t),cl.set(e,n.slice(-100))}function ml(e){cl.delete(e),ll.delete(e)}var hl=J(`<p style=margin-bottom:12px>`),gl=J(`<div class=recent-projects>`),_l=J(`<div class=field><input type=text>`),vl=J(`<div class=field><textarea rows=8>`),yl=J(`<button type=button class="btn btn-small">cancel`),bl=J(`<button type=button class="btn btn-small btn-primary">confirm`),xl=J(`<button type=button class="btn btn-small btn-primary">submit`),Sl=J(`<button type=button>`),Cl=J(`<h4 class=ask-question-title>`),wl=J(`<fieldset class=ask-options><legend class=ask-options-legend>Answer options`),Tl=J(`<textarea rows=5>`),El=J(`<div class="field ask-custom-field"><label class=ask-custom-label>`),Dl=J(`<div class=ask-actions><button type=button class="btn btn-small btn-danger"></button><button type=button class="btn btn-small btn-primary">submit`),Ol=J(`<div class=ask-question role=tabpanel>`),kl=J(`<span class=ask-option-check>✔`),Al=J(`<label class=ask-option><span class=ask-option-index></span><input><span class=ask-option-label>`),jl=J(`<input type=text placeholder="Type a different answer…">`),Ml=J(`<span class=ask-wizard-countdown> (auto-stops in <!>s)`),Nl=J(`<div class=ask-tab-strip role=tablist aria-label=questions><button type=button role=tab class="ask-tab ask-tab-submit">Submit`),Pl=J(`<div class=ask-tab-panel><div class=ask-review role=tabpanel><ul class=ask-review-list></ul><div class=ask-actions><button type=button class="btn btn-small btn-danger"></button><button type=button class="btn btn-small btn-primary">Submit all`),Fl=J(`<section class=ask-wizard><header class=ask-wizard-header><span class=ask-wizard-title>`),Il=J(`<span class=ask-tab-check role=img aria-label=answered>✓`),Ll=J(`<button type=button role=tab class=ask-tab>. `),Rl=J(`<div class=ask-tab-panel>`),zl=J(`<li class=ask-review-item><span class=ask-review-question>`),Bl=J(`<span class="ask-review-answer muted">(unanswered)`),Vl=J(`<span class=ask-review-answer>`),Hl=J(`<ul>`),Ul=J(`<section class=context-section><h3>`),Wl=J(`<p class="muted small">none`),Gl=J(`<p class=pair-error>`),Kl=J(`<p class="muted small">loading…`),ql=J(`<p class="muted small">system prompt: custom`),Jl=J(`<div class=context-modal-body>`),Yl=J(`<li>`),Xl=J(`<span class=muted> — `),Zl=J(`<li><span>`),Ql=J(`<li><span></span><span class=muted> — `),$l=J(`<div class=model-scope-tabs role=tablist aria-label="model scope"><button type=button role=tab>scoped</button><button type=button role=tab>all`),eu=J(`<div class=field style=margin-bottom:8px><input type=text placeholder="search models…">`),tu=J(`<div class="model-list session-model-list"style=max-height:320px>`),nu=J(`<p class="muted small">No matching models.`),ru=J(`<section class=model-provider-group><div class=model-provider-heading>`),iu=J(`<span class=model-name>`),au=J(`<span class=model-reasoning>think`),ou=J(`<button type=button class=model-row><span class=model-current></span><span class=model-id></span><span class=model-provider-badge>`),su=J(`<div class=fork-message-list>`),cu=J(`<p class="muted small">`),lu=J(`<span class="muted small">current`),uu=J(`<button type=button class=fork-message><span class=fork-entry-id></span><span>`),du=J(`<button type=button class=fork-message><span></span><span class="muted small"> messages`),fu=J(`<p class="muted small">Replace the current session with a JSONL session file.`),pu=J(`<div class=field><input type=text placeholder=/path/to/session.jsonl>`),mu=J(`<button type=button class="btn btn-small btn-primary">import and replace`),hu=J(`<span class=project>`),gu=J(`<output class=switcher><span class=label>ctx</span> `),_u=J(`<span class=right><button type=button class="switcher optional model-switcher"><span class=label>model</span> <span class=value></span></button><button type=button class="switcher optional"><span class=label>think</span> </button><button type=button class=switcher>⋯`),vu=J(`<div class=stats-popover>`),yu=J(`<div class="session-bar-inner session-info-bar"><span class=session-info-left></span><button type=button class="session-info-right stats-trigger">`),bu=J(`<button type=button class="btn btn-small">model: `),xu=J(`<button type=button class="btn btn-small">think: `),Su=J(`<div class=session-bar-inner style=justify-content:flex-end;gap:8px><a class="btn btn-small">export HTML</a><button type=button class="btn btn-small">compact now</button><button type=button class="btn btn-small">expand tools</button><button type=button class="btn btn-small">collapse tools</button><button type=button class="btn btn-small">rename</button><button type=button class="btn btn-small">fork</button><button type=button class="btn btn-small">loaded context</button><button type=button class="btn btn-small btn-danger">`),Cu=J(`<div class=container style=padding-top:8px><div class=fallback-banner><span>◆ </span><button type=button class="btn btn-small dismiss">dismiss`),wu=J(`<span class=dock-collapsed-hint>`),Tu=J(`<details class=tasks><summary>tasks — <!> of <!> done</summary><ul>`),Eu=J(`<details class="tasks subagents"><summary>subagents — <!> running · <!> done</summary><ul class=subagent-list>`),Du=J(`<span class=working>● working`),Ou=J(`<span class=error>`),ku=J(`<span class=queued>`),Au=J(`<button type=button class="btn btn-small btn-danger">`),ju=J(`<div class=status-line>`),Mu=J(`<div class=queued-message-row><button type=button class="btn btn-small">restore to composer`),Nu=J(`<div class=attachment-strip>`),Pu=J(`<div class=command-popover role=listbox id=command-listbox aria-label="slash commands">`),Fu=J(`<span class=mode-toggle role=radiogroup aria-label="send mode"><button type=button title="Deliver now — injected into the running turn">steer</button><button type=button title="Queue — delivered after the agent finishes">follow-up`),Iu=J(`<button type=button class=ghost-suggest>suggested: <code></code> <span class=key>tap`),Lu=J(`<div class=dock-inner><div class=composer><textarea></textarea><div class=composer-row><input type=file multiple class=hidden-file-input><input type=file accept=image/* multiple class=hidden-file-input><button type=button class="btn btn-small"title="attach file (uploads to workspace and sends path)">📎 file</button><button type=button class="btn btn-small"title="attach image inline">🖼 photo</button><button type=button class="btn btn-primary btn-small send">send ↵`),Ru=J(`<p>Summarize older context to free window space. The transcript keeps a summary card.`),zu=J(`<div class=session-screen><header class=session-bar><div class="session-bar-inner session-bar-main"><a class=back href=#/>← fleet</a><span class=title></span><button type=button class=chrome-toggle></button></div></header><main class=chat><div class=chat-inner></div></main><footer class=dock><div class=dock-collapse-row><button type=button class=chrome-toggle>`),Bu=J(`<span>`),Vu=J(`<p class="muted small">loading stats…`),Hu=J(`<div class=stats-grid><span>user messages</span><strong></strong><span>assistant messages</span><strong></strong><span>tool calls/results</span><strong>/</strong><span>input/output</span><strong> / </strong><span>cache read/write</span><strong> / </strong><span>total tokens</span><strong></strong><span>cost</span><strong>$`),Uu=J(`<p class=muted>loading transcript…`),Wu=J(`<div class=widget-block>`),Gu=J(`<li> `),Ku=J(`<li><button type=button class=agent-chip title="view this subagent's session"><span></span><span class=task> — `),qu=J(`<button type=button class="btn btn-small btn-danger inline-stop">stop`),Ju=J(`<span class=queued-chip><span class=queued-kind>`),Yu=J(`<span class=attachment-file><span>📎 </span><span class=muted></span><button type=button aria-label="remove file attachment">×`),Xu=J(`<span class=attachment-thumb><img><button type=button aria-label="remove image">×`),Zu=J(`<span class=command-description>`),Qu=J(`<button type=button role=option class=command-option><span class=command-name>/</span><span class=command-source>`),$u=J(`<button type=button class="btn btn-small btn-primary">compact`),ed=J(`<p class="muted small">loading forkable messages…`),td=J(`<button type=button class="btn btn-small btn-primary">rename`),nd=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`],rd=10*1024*1024,id=`.dreb-dashboard-uploads`;function ad(e){return e?`${e.provider}/${e.id}`:`—`}function od(e){if(!e)return`—`;let t=`${e.provider}/${e.id}`;return e.name?`${t} — ${e.name}`:t}function sd(e){return e<1e3?e.toString():e<1e4?`${(e/1e3).toFixed(1)}k`:e<1e6?`${Math.round(e/1e3)}k`:e<1e7?`${(e/1e6).toFixed(1)}M`:`${Math.round(e/1e6)}M`}function cd(e){return e.replace(/^\/home\/[^/]+/,`~`)}function ld(e,t){return`${e.replace(/\/+$/,``)}/${t}`}function ud(e){let t=e.trim().replace(/[\\/\0]/g,`_`);return t&&t!==`.`&&t!==`..`?t:`upload.bin`}function dd(e,t){return`${new Date().toISOString().replace(/[:.]/g,`-`)}-${t+1}-${ud(e.name||`upload.bin`)}`}function fd(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:e<1024*1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:`${(e/(1024*1024*1024)).toFixed(1)} GB`}function pd(e,t){return`${e.provider}/${e.id} ${e.name??``}`.toLowerCase().includes(t)}function md(e){let t=new Map;for(let n of e){let e=t.get(n.provider)??[];e.push(n),t.set(n.provider,e)}return[...t.entries()].map(([e,t])=>({provider:e,models:t}))}function hd(e){e.style.height=`auto`;let t=Math.max(120,Math.floor((window.innerHeight||800)*.4)),n=Math.min(e.scrollHeight,t);n>0&&(e.style.height=`${n}px`),e.style.overflowY=e.scrollHeight>t?`auto`:`hidden`}function gd(e){let[t,n]=k(e.request.prefill??``),r=t=>e.onRespond({type:`extension_ui_response`,id:e.request.id,...t});return W(rt,{get title(){return e.request.title},onDismiss:()=>r({cancelled:!0}),get actions(){return W(K,{get when(){return e.request.method!==`select`},get children(){return[(()=>{var e=yl();return e.$$click=()=>r({cancelled:!0}),e})(),W(K,{get when(){return e.request.method===`confirm`},get children(){var e=bl();return e.$$click=()=>r({confirmed:!0}),e}}),W(K,{get when(){return e.request.method===`input`||e.request.method===`editor`},get children(){var e=xl();return e.$$click=()=>r({value:t()}),e}})]}})},get children(){return[W(K,{get when(){return e.request.message},get children(){var t=hl();return X(t,()=>e.request.message),t}}),W(K,{get when(){return e.request.method===`select`},get children(){var t=gl();return X(t,W(G,{get each(){return e.request.options??[]},children:e=>(()=>{var t=Sl();return t.$$click=()=>r({value:e}),X(t,e),t})()})),t}}),W(K,{get when(){return e.request.method===`input`},get children(){var r=_l(),i=r.firstChild;return i.$$input=e=>n(e.currentTarget.value),j(()=>Y(i,`placeholder`,e.request.placeholder)),j(()=>i.value=t()),r}}),W(K,{get when(){return e.request.method===`editor`},get children(){var e=vl(),r=e.firstChild;return r.$$input=e=>n(e.currentTarget.value),j(()=>r.value=t()),e}})]}})}function _d(e){let t=e.target,n=t?.tagName;return n===`INPUT`||n===`TEXTAREA`||t?.isContentEditable===!0}function vd(e){let t=()=>e.request.questions??[],n=()=>t().length,r=()=>n()>=2,i,[a,o]=k(t().map(()=>({selected:[],customText:``})));M(()=>{let e=n();o(n=>n.length===e?n:t().map((e,t)=>n[t]??{selected:[],customText:``}))});let[s,c]=k(0),l=()=>r()&&s()===n(),u=t=>e.onRespond({type:`extension_ui_response`,id:e.request.id,...t}),d=e=>t()[e]?.options??[],f=e=>t()[e]?.allowFreeText!==!1,p=e=>t()[e]?.multiSelect===!0&&d(e).length>0,m=(e,t)=>o(n=>n.map((n,r)=>r===e?t(n):n)),h=(e,t)=>{m(e,n=>{if(p(e)){let e=n.selected.includes(t)?n.selected.filter(e=>e!==t):[...n.selected,t];return{...n,selected:e}}return{...n,selected:[t]}})},g=(e,t)=>m(e,e=>({...e,customText:t})),_=e=>{let t=a()[e];return t?t.selected.length>0||t.customText.trim().length>0:!1},v=e=>{let t=a()[e];if(!t)return;let n=[...t.selected],r=t.customText.trim();return r&&n.push(r),n.length>0?n.join(`, `):void 0},y=()=>{e.stopping||e.onStop()},b=()=>{let e=a().map(e=>{let t=e.selected,n=e.customText.trim()||void 0;return t.length>0||n?{selected:t,customText:n}:{selected:[],skipped:!0}});u({answers:e})},x=e=>{if(e.key===`Escape`){e.preventDefault(),y();return}if(e.key===`Enter`&&n()===1&&!l()){let t=e.target;t&&i?.contains(t)&&t.tagName!==`TEXTAREA`&&t.tagName!==`BUTTON`&&(e.preventDefault(),b());return}if(r()&&(e.key===`ArrowLeft`||e.key===`ArrowRight`||e.key===`Tab`)){if(_d(e))return;let t=n(),r=e.key===`ArrowLeft`?-1:1;e.preventDefault(),c(e=>{let n=e+r;return n<0?t:n>t?0:n});return}if(!l()&&/^[1-9]$/.test(e.key)&&!_d(e)){let t=s(),n=d(t),r=Number(e.key)-1;r<n.length&&(e.preventDefault(),h(t,n[r]))}};R(()=>window.addEventListener(`keydown`,x)),z(()=>window.removeEventListener(`keydown`,x));let S=typeof e.request.expiresAt==`number`?e.request.expiresAt:e.request.timeout&&e.request.timeout>0?Date.now()+e.request.timeout:void 0,C=()=>S===void 0?0:Math.max(0,Math.ceil((S-Date.now())/1e3)),[w,T]=k(C());if(S!==void 0){let e,t=()=>{let t=C();T(t),t<=0&&(e!==void 0&&clearInterval(e),e=void 0,y())};R(()=>{t(),S>Date.now()&&(e=setInterval(t,1e3))}),z(()=>{e!==void 0&&clearInterval(e)})}let E=(t,r)=>(()=>{var i=Ol();return X(i,W(K,{get when(){return t.title},get children(){var e=Cl();return X(e,()=>t.title),e}}),null),X(i,W(Ws,{get text(){return t.question??``},class:`ask-question-body markdown-body`}),null),X(i,W(K,{get when(){return d(r).length>0},get children(){var t=wl();return t.firstChild,X(t,W(G,{get each(){return d(r)},children:(t,n)=>(()=>{var i=Al(),o=i.firstChild,s=o.nextSibling,c=s.nextSibling;return X(o,()=>n()+1),s.addEventListener(`change`,()=>h(r,t)),X(c,t),X(i,W(K,{get when(){return a()[r]?.selected.includes(t)},get children(){return kl()}}),null),j(n=>{var o=!!a()[r]?.selected.includes(t),c=p(r)?`checkbox`:`radio`,l=p(r)?void 0:`ask-option-input--hidden`,u=`ask-${e.request.id}-${r}`;return o!==n.e&&i.classList.toggle(`selected`,n.e=o),c!==n.t&&Y(s,`type`,n.t=c),l!==n.a&&je(s,n.a=l),u!==n.o&&Y(s,`name`,n.o=u),n},{e:void 0,t:void 0,a:void 0,o:void 0}),j(()=>s.checked=a()[r]?.selected.includes(t)),i})()}),null),t}}),null),X(i,W(K,{get when(){return f(r)},get children(){var n=El(),i=n.firstChild;return X(i,()=>d(r).length>0?`Or type your own answer`:`Your answer`),X(n,W(K,{get when(){return t.multiline},get fallback(){return(()=>{var t=jl();return t.$$input=e=>g(r,e.currentTarget.value),j(()=>Y(t,`id`,`ask-custom-${e.request.id}-${r}`)),j(()=>t.value=a()[r]?.customText??``),t})()},get children(){var t=Tl();return t.$$input=e=>g(r,e.currentTarget.value),j(()=>Y(t,`id`,`ask-custom-${e.request.id}-${r}`)),j(()=>t.value=a()[r]?.customText??``),t}}),null),j(()=>Y(i,`for`,`ask-custom-${e.request.id}-${r}`)),n}}),null),X(i,W(K,{get when(){return n()===1},get children(){var t=Dl(),n=t.firstChild,r=n.nextSibling;return n.$$click=y,X(n,()=>e.stopping?`stopping…`:`■ stop agent`),r.$$click=b,j(()=>n.disabled=e.stopping),t}}),null),i})();return(()=>{var a=Fl(),o=a.firstChild,u=o.firstChild,d=i;return typeof d==`function`?Fe(d,a):i=a,X(u,()=>e.request.title),X(o,W(K,{when:S!==void 0,get children(){var e=Ml(),t=e.firstChild.nextSibling;return t.nextSibling,X(e,w,t),e}}),null),X(a,W(K,{get when(){return r()},get children(){var e=Nl(),r=e.firstChild;return X(e,W(G,{get each(){return t()},children:(e,t)=>(()=>{var n=Ll(),r=n.firstChild;return n.$$click=()=>c(t()),X(n,()=>t()+1,r),X(n,()=>e.title??e.question,null),X(n,W(K,{get when(){return _(t())},get children(){return Il()}}),null),j(e=>{var r=s()===t(),i=s()===t(),a=!!_(t());return r!==e.e&&Y(n,`aria-selected`,e.e=r),i!==e.t&&n.classList.toggle(`selected`,e.t=i),a!==e.a&&n.classList.toggle(`answered`,e.a=a),e},{e:void 0,t:void 0,a:void 0}),n})()}),r),r.$$click=()=>c(n()),j(e=>{var t=l(),n=!!l();return t!==e.e&&Y(r,`aria-selected`,e.e=t),n!==e.t&&r.classList.toggle(`selected`,e.t=n),e},{e:void 0,t:void 0}),e}}),null),X(a,W(G,{get each(){return t()},children:(e,t)=>(()=>{var n=Rl();return X(n,()=>E(e,t())),j(()=>n.classList.toggle(`hidden`,s()!==t())),n})()}),null),X(a,W(K,{get when(){return r()},get children(){var n=Pl(),r=n.firstChild.firstChild,i=r.nextSibling.firstChild,a=i.nextSibling;return X(r,W(G,{get each(){return t()},children:(e,t)=>(()=>{var n=zl(),r=n.firstChild;return X(r,()=>e.title??e.question),X(n,W(K,{get when(){return v(t())},get fallback(){return Bl()},children:e=>(()=>{var t=Vl();return X(t,e),t})()}),null),n})()})),i.$$click=y,X(i,()=>e.stopping?`stopping…`:`cancel`),a.$$click=b,j(t=>{var r=!l(),a=e.stopping;return r!==t.e&&n.classList.toggle(`hidden`,t.e=r),a!==t.t&&(i.disabled=t.t=a),t},{e:void 0,t:void 0}),n}}),null),j(()=>Y(a,`aria-label`,e.request.title)),a})()}function yd(e){let t=(e,t)=>(()=>{var n=Ul(),r=n.firstChild;return X(r,e),X(n,W(K,{get when(){return t.length>0},get fallback(){return Wl()},get children(){var e=Hl();return X(e,t),e}}),null),n})();return W(rt,{title:`loaded context`,get onDismiss(){return e.onClose},get children(){return[W(K,{get when(){return e.error},get children(){var t=Gl();return X(t,()=>e.error),t}}),W(K,{get when(){return e.resources},get fallback(){return Kl()},children:e=>(()=>{var n=Jl();return X(n,()=>t(`context files`,e().contextFiles.map(e=>(()=>{var t=Yl();return X(t,()=>cd(e.path)),j(()=>Y(t,`title`,e.path)),t})())),null),X(n,()=>t(`skills`,e().skills.map(e=>(()=>{var t=Zl(),n=t.firstChild;return X(n,()=>e.name),X(t,W(K,{get when(){return e.description},get children(){var t=Xl();return t.firstChild,X(t,()=>e.description,null),t}}),null),t})())),null),X(n,()=>t(`extensions`,e().extensions.map(e=>(()=>{var t=Ql(),n=t.firstChild,r=n.nextSibling;return r.firstChild,X(n,()=>e.name??`extension`),X(r,()=>cd(e.path),null),j(()=>Y(t,`title`,e.path)),t})())),null),X(n,()=>t(`prompt templates`,e().promptTemplates.map(e=>(()=>{var t=Yl();return X(t,()=>e.name),t})())),null),X(n,W(K,{get when(){return e().systemPromptPresent},get children(){return ql()}}),null),n})()})]}})}function bd(e){let[t,n]=k([]),[r,i]=k(e.initialFilter??``),[a,o]=k((e.state?.scopedModels?.length??0)>0?`scoped`:`all`),[s,c]=k();R(async()=>{try{let{models:t}=await Q.models(e.sessionKey);n(t)}catch(e){c(e instanceof Error?e.message:String(e))}});let l=N(()=>(e.state?.scopedModels??[]).map(e=>({provider:e.provider,id:e.id,name:e.name,reasoning:e.reasoning}))),u=()=>l().length>0,d=()=>a()===`scoped`&&u()?l():t(),f=N(()=>{let e=r().toLowerCase();return md(d().filter(t=>!e||pd(t,e)).slice(0,100))}),p=t=>e.state?.model?.provider===t.provider&&e.state?.model?.id===t.id;async function m(t){try{let n=await Q.setModel(e.sessionKey,t.provider,t.id);e.onSelected(n),e.onClose()}catch(e){c(e instanceof Error?e.message:String(e))}}return W(rt,{title:`select model`,get onDismiss(){return e.onClose},class:`model-picker-modal`,get children(){return[W(K,{get when(){return u()},get children(){var e=$l(),t=e.firstChild,n=t.nextSibling;return t.$$click=()=>o(`scoped`),n.$$click=()=>o(`all`),j(e=>{var r=a()===`scoped`,i=a()===`scoped`,o=a()===`all`,s=a()===`all`;return r!==e.e&&Y(t,`aria-selected`,e.e=r),i!==e.t&&t.classList.toggle(`selected`,e.t=i),o!==e.a&&Y(n,`aria-selected`,e.a=o),s!==e.o&&n.classList.toggle(`selected`,e.o=s),e},{e:void 0,t:void 0,a:void 0,o:void 0}),e}}),(()=>{var e=eu(),t=e.firstChild;return t.$$input=e=>i(e.currentTarget.value),j(()=>t.value=r()),e})(),W(K,{get when(){return s()},get children(){var e=Gl();return X(e,s),e}}),(()=>{var e=tu();return X(e,W(K,{get when(){return f().length>0},get fallback(){return nu()},get children(){return W(G,{get each(){return f()},children:e=>(()=>{var t=ru(),n=t.firstChild;return X(n,()=>e.provider),X(t,W(G,{get each(){return e.models},children:e=>(()=>{var t=ou(),n=t.firstChild,r=n.nextSibling,i=r.nextSibling;return t.$$click=()=>m(e),X(n,()=>p(e)?`✓`:``),X(r,()=>e.id),X(t,W(K,{get when(){return e.name},get children(){var t=iu();return X(t,()=>e.name),t}}),i),X(i,()=>e.provider),X(t,W(K,{get when(){return e.reasoning},get children(){return au()}}),null),j(n=>{var r=!!p(e),i=od(e);return r!==n.e&&t.classList.toggle(`current`,n.e=r),i!==n.t&&Y(t,`title`,n.t=i),n},{e:void 0,t:void 0}),t})()}),null),t})()})}})),e})()]}})}function xd(e){let t=[],n=[...e].reverse().map(e=>({node:e,depth:0}));for(;n.length>0;){let e=n.pop();if(!e)break;t.push(e);for(let t=e.node.children.length-1;t>=0;--t)n.push({node:e.node.children[t],depth:e.depth+1})}return t}function Sd(e){return W(rt,{title:`session tree`,get onDismiss(){return e.onClose},get children(){return[W(K,{get when(){return e.error},get children(){var t=Gl();return X(t,()=>e.error),t}}),W(K,{get when(){return e.roots.length>0},get fallback(){return(()=>{var t=cu();return X(t,()=>e.loading?`loading tree…`:`No session entries yet.`),t})()},get children(){var t=su();return X(t,W(G,{get each(){return xd(e.roots)},children:({node:t,depth:n})=>(()=>{var r=uu(),i=r.firstChild,a=i.nextSibling;return r.$$click=()=>e.onNavigate(t.id),Pe(r,`padding-left`,`${12+n*18}px`),X(i,()=>t.id.slice(0,8)),X(a,()=>t.label??(t.preview||t.type)),X(r,W(K,{get when(){return t.id===e.leafId},get children(){return lu()}}),null),j(()=>r.disabled=t.id===e.leafId),r})()})),t}})]}})}function Cd(e){return W(rt,{title:`resume session`,get onDismiss(){return e.onClose},get children(){return[W(K,{get when(){return e.error},get children(){var t=Gl();return X(t,()=>e.error),t}}),W(K,{get when(){return e.sessions.length>0},get fallback(){return(()=>{var t=cu();return X(t,()=>e.loading?`loading sessions…`:`No other sessions found.`),t})()},get children(){var t=su();return X(t,W(G,{get each(){return e.sessions},children:t=>(()=>{var n=du(),r=n.firstChild,i=r.nextSibling,a=i.firstChild;return n.$$click=()=>e.onResume(t.path),X(r,()=>t.name??(t.firstMessage||t.path)),X(i,()=>t.messageCount,a),n})()})),t}})]}})}function wd(e){let[t,n]=k(e.initialPath);return W(rt,{title:`import session`,get onDismiss(){return e.onClose},get actions(){return[(()=>{var t=yl();return Me(t,`click`,e.onClose,!0),t})(),(()=>{var n=mu();return n.$$click=()=>e.onImport(t().trim()),j(()=>n.disabled=!t().trim()),n})()]},get children(){return[fu(),(()=>{var e=pu(),r=e.firstChild;return r.$$input=e=>n(e.currentTarget.value),j(()=>r.value=t()),e})(),W(K,{get when(){return e.error},get children(){var t=Gl();return X(t,()=>e.error),t}})]}})}function Td(e){let t=()=>e.store.sessions[e.sessionKey],n=N(()=>e.store.fleet().runtimes.find(t=>t.key===e.sessionKey)),[r,i]=k(ul(e.sessionKey)??``),[a,o]=k(`steer`),[s,c]=k(!1),[l,u]=k(!1),[d,f]=k(!1),[p,m]=k(``),[h,g]=k(!1),[_,v]=k(!1),[y,b]=k(!1),[x,S]=k(!1),[C,w]=k(!1),[T,E]=k(!1),[D,O]=k(!1),[A,P]=k(),[F,I]=k(),[L,ee]=k(0),[te,ne]=k(),[re,ie]=k(),[ae,B]=k(),[oe,V]=k(),[se,H]=k([]),[ce,le]=k(!1),[U,ue]=k(0),[de,fe]=k(),[pe,me]=k(),[he,ge]=k({steering:[],followUp:[]}),[_e,ve]=k([]),[ye,be]=k([]),[xe,Se]=k(),[Ce,we]=k(!1),[Te,Ee]=k([]),[De,Oe]=k(),[ke,J]=k(!1),[Ae,Me]=k([]),[Ne,Pe]=k(null),[Ie,Le]=k(!1),[Re,ze]=k(),[Be,Ve]=k(!1),[He,Ue]=k([]),[We,Ge]=k(!1),[Ke,qe]=k(),[Je,Ye]=k(!1),[Xe,Ze]=k(``),[Qe,$e]=k(),[et,tt]=k(!1),[it,at]=k(),ot,st,Z,ct,lt,ut,dt=!1,ft=()=>t()?.streaming??!1,pt=()=>t()?.compacting??!1,mt=()=>(t()?.statusEntries??[]).some(e=>e.key===`paused`),ht=()=>Object.values(t()?.backgroundAgents??{}).some(e=>e.status===`running`),gt=()=>ft()||pt()||mt()||ht(),_t=Mo({scroller:()=>ot});async function vt(t=!1){let[n,r,i]=await Promise.allSettled([Q.stats(e.sessionKey),Q.performance(e.sessionKey),Q.branch(e.sessionKey)]),a=t?await Promise.allSettled([Q.dailyCost()]):void 0;if(dt)return;n.status===`fulfilled`&&ne(n.value),r.status===`fulfilled`&&ie(r.value),i.status===`fulfilled`&&B(i.value.branch),a?.[0]?.status===`fulfilled`&&V(a[0].value.cost);let o=[n,r,i,...a??[]].find(e=>e.status===`rejected`);o?.status===`rejected`&&P(o.reason instanceof Error?o.reason.message:String(o.reason))}async function yt(){try{let{commands:t}=await Q.commands(e.sessionKey);dt||H(t)}catch(e){dt||P(e instanceof Error?e.message:String(e))}}async function bt(){E(!0),me(void 0);try{fe(await Q.resources(e.sessionKey))}catch(e){me(e instanceof Error?e.message:String(e))}}async function xt(){try{ge(await Q.pending(e.sessionKey))}catch(e){P(e instanceof Error?e.message:String(e))}}let St=new Set,Ct=async t=>{let n=typeof t.id==`string`?t.id:void 0;if(!(n&&St.has(n))){n&&St.add(n);try{await Q.extensionUiResponse(e.sessionKey,t),n&&e.store.resolveUiRequest(e.sessionKey,n)}catch(e){P(e instanceof Error?e.message:String(e))}finally{n&&St.delete(n)}}};function wt(e){let t=atob(e);return Uint8Array.from(t,e=>e.charCodeAt(0))}function Tt(e){let t=``,n=32768;for(let r=0;r<e.length;r+=n)t+=String.fromCharCode(...e.subarray(r,r+n));return btoa(t)}async function Et(e){return Tt(new Uint8Array(await e.arrayBuffer()))}function Dt(e){URL.revokeObjectURL(e.previewUrl)}function Ot(){for(let e of _e())Dt(e);ve([])}function kt(e){ve(t=>{let n=t[e];return n&&Dt(n),t.filter((t,n)=>n!==e)})}function At(e){if(_e().reduce((e,t)=>e+t.size,0)+e>zt)throw Error(`Images too large: total inline images exceed ${fd(zt)}`)}function jt(e,t,n){return{blob:e,mimeType:t,fileName:n,size:e.size,previewUrl:URL.createObjectURL(e)}}function Mt(e,t,n){let r=wt(e.data);return jt(new Blob([r],{type:e.mimeType}),e.mimeType,`queued-image-${t+1}-${n+1}`)}function Nt(e){return[...e.steeringMessages??e.steering.map(e=>({text:e})),...e.followUpMessages??e.followUp.map(e=>({text:e}))]}function Pt(e){let t=[];for(let[n,r]of e.entries())for(let[e,i]of(r.images??[]).entries())t.push(Mt(i,n,e));return t}function Ft(e){for(let t of e)Dt(t)}function It(e){let t=e.map(e=>e.text).join(`
|
|
69
|
+
`]})),t})()}function rc(e){if(e.toolName!==`edit`)return;let t=e.details?.diff;return typeof t==`string`?t:void 0}var ic=new Set([`image/png`,`image/jpeg`,`image/gif`,`image/webp`]),ac=/^[0-9a-f]{64}$/,oc=1024*1024;function sc(e){return e>=1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:e>=1024?`${Math.ceil(e/1024)} KB`:`${e} B`}var cc={alt:`Tool result`,originalAriaLabel:`Original tool-result image`,enlargedAlt:`Enlarged tool-result preview`},lc={alt:`Uploaded image`,originalAriaLabel:`Original uploaded image`,enlargedAlt:`Enlarged uploaded-image preview`};function uc(e){let[t,n]=k(),[r,i]=k(),[a,o]=k(),[s,c]=k(!1),l=t=>ft(e.scope.runtimeKey,e.image.id,t,e.scope.agentId),u=e=>{let t=l(e);if(!t){o(`Invalid image reference`);return}o(void 0),i(e),n(t)};M(()=>{let e=ts();c(!1),o(void 0),e===`previews`?u(`preview`):e===`originals`?u(`original`):(n(void 0),i(void 0))});let d=()=>{e.image.size>oc&&!window.confirm(`Load the ${sc(e.image.size)} original image? This may use significant data.`)||u(`original`)},f=e=>{e.key===`Escape`&&c(!1)};return R(()=>window.addEventListener(`keydown`,f)),z(()=>window.removeEventListener(`keydown`,f)),(()=>{var l=ps(),f=l.firstChild,p=f.firstChild,m=p.firstChild;return X(l,W(K,{get when(){return t()},get fallback(){return(()=>{var t=ms(),n=t.firstChild,r=n.firstChild,i=n.nextSibling;return X(n,()=>e.image.mimeType.replace(`image/`,``).toUpperCase(),r),X(n,()=>sc(e.image.size),null),i.$$click=()=>u(`preview`),X(i,()=>a()?`retry preview`:`load preview`),t})()},children:t=>(()=>{var a=hs(),s=a.firstChild;return a.$$click=()=>r()===`preview`&&c(!0),s.addEventListener(`error`,()=>{o(`Could not load ${r()??`image`}`),n(void 0),i(void 0)}),j(n=>{var i=r()!==`preview`,o=r()===`preview`?`Enlarge image preview`:e.labels.originalAriaLabel,c=e.labels.alt,l=t();return i!==n.e&&(a.disabled=n.e=i),o!==n.t&&Y(a,`aria-label`,n.t=o),c!==n.a&&Y(s,`alt`,n.a=c),l!==n.o&&Y(s,`src`,n.o=l),n},{e:void 0,t:void 0,a:void 0,o:void 0}),a})()}),f),X(p,()=>e.image.mimeType.replace(`image/`,``).toUpperCase(),m),X(p,()=>sc(e.image.size),null),X(f,W(K,{get when(){return r()!==`original`},get children(){var t=ds();return t.firstChild,t.$$click=d,X(t,()=>sc(e.image.size),null),t}}),null),X(l,W(K,{get when(){return a()},children:e=>(()=>{var t=gs();return X(t,e),t})()}),null),X(l,W(K,{get when(){return q(()=>!!(s()&&r()===`preview`))()&&t()},get children(){var n=fs(),r=n.firstChild,i=r.nextSibling.firstChild,a=i.nextSibling;return r.$$click=()=>c(!1),a.$$click=()=>c(!1),j(n=>{var r=t(),a=e.labels.enlargedAlt;return r!==n.e&&Y(i,`src`,n.e=r),a!==n.t&&Y(i,`alt`,n.t=a),n},{e:void 0,t:void 0}),n}}),null),l})()}function dc(e){let t=()=>e.images.filter(e=>ic.has(e.mimeType)&&ac.test(e.id)&&Number.isSafeInteger(e.size)&&e.size>0);return W(K,{get when(){return t().length>0},get children(){var n=_s();return X(n,W(G,{get each(){return t()},children:t=>W(uc,{image:t,get scope(){return e.scope},get labels(){return e.labels}})})),n}})}function fc(e){let[t,n]=k(!1),r=()=>e.text.length>Bs;M(()=>{r()||n(!1)});let i=()=>r()&&!t()?e.text.slice(-204800):e.text;return[W(K,{get when(){return q(()=>!!r())()&&!t()},get children(){var t=vs(),r=t.firstChild.nextSibling,i=r.nextSibling.nextSibling,a=i.nextSibling.nextSibling,o=a.firstChild.nextSibling;return o.nextSibling,X(t,()=>Us(Bs),r),X(t,()=>Us(e.text.length),i),a.$$click=()=>n(!0),X(a,()=>Us(e.text.length),o),t}}),W(K,{get when(){return e.markdown},get fallback(){return W(Js,{get text(){return i()},get language(){return e.language},get autoScroll(){return e.autoScroll},get throttle(){return e.throttle}})},get children(){return W(Ws,{get text(){return i()},get throttle(){return e.throttle}})}})]}function pc(e){let t=()=>$s(e.entry),n=()=>e.entry.args,r=()=>{if(e.entry.toolName===`suggest_next`)return e.entry.details},i=()=>rc(e.entry),a=()=>e.entry.toolName===`write`&&!e.entry.resultText&&typeof n()?.content==`string`?String(n()?.content):e.entry.resultText,o=()=>{if(e.entry.toolName===`read`||e.entry.toolName===`write`&&!e.entry.resultText)return Gs(Ks(n()))},s=()=>ec.has(e.entry.toolName)&&e.entry.status!==`error`,c=()=>e.entry.toolName===`bash`||e.entry.toolName===`bash (user)`,l=()=>tc(e.entry),u=()=>as(e.entry.toolName),d=e.entry.toolName!==`ask_user`,[f,p]=k(u()||e.entry.status===`running`&&d),m=e.entry.status===`running`,h=!1,g=!1,_,v=e=>{f()!==e&&(g=!0,p(e),_&&clearTimeout(_),_=setTimeout(()=>{g=!1,_=void 0},0))};return M(()=>{let t=e.entry.status===`running`,n=u();t&&d?(h=!1,v(!0)):m?(h=!1,v(n)):h||v(n),m=t}),z(()=>{_&&clearTimeout(_)}),(()=>{var u=xs(),m=u.firstChild.firstChild,v=m.nextSibling,y=v.nextSibling;return u.addEventListener(`toggle`,t=>{let n=t.currentTarget.open;if(g){p(n);return}if(e.entry.status===`running`&&d&&!n){g=!0,t.currentTarget.open=!0,p(!0),_&&clearTimeout(_),_=setTimeout(()=>{g=!1,_=void 0},0);return}h=!0,p(n)}),X(m,()=>e.entry.toolName),X(v,()=>Ys(e.entry)),X(y,()=>t().text),X(u,W(K,{get when(){return f()},get children(){return[W(K,{get when(){return e.entry.toolName===`bash`||e.entry.toolName===`bash (user)`},get children(){var e=ys(),t=e.firstChild;return X(t,()=>String(n()?.command??``)),e}}),W(G,{get each(){return l()},children:e=>(()=>{var t=Ss(),n=t.firstChild;return X(n,()=>e.label),X(t,W(K,{get when(){return e.markdown},get fallback(){return W(Js,{get text(){return e.text},get language(){return e.language}})},get children(){return W(Ws,{get text(){return e.text}})}}),null),t})()}),W(K,{get when(){return e.entry.images?.length},get children(){var t=bs();return X(t,W(dc,{get images(){return e.entry.images},get scope(){return e.imageScope},labels:cc})),t}}),W(Te,{get children(){return[W(Ee,{get when(){return r()},children:e=>(()=>{var t=Cs(),n=t.firstChild,r=n.firstChild.nextSibling;return X(t,W(K,{get when(){return e().summary},get children(){return W(Ws,{get text(){return e().summary}})}}),n),X(r,()=>e().suggestion),t})()}),W(Ee,{get when(){return i()},children:e=>(()=>{var t=bs();return X(t,W(nc,{get text(){return e()}})),t})()}),W(Ee,{get when(){return a()},children:t=>(()=>{var n=bs();return X(n,W(fc,{get text(){return t()},get language(){return o()},get markdown(){return s()},get autoScroll(){return c()},get throttle(){return e.entry.status===`running`}})),n})()})]}})]}}),null),j(e=>{var n=f(),r=`tool-status ${t().cls}`;return n!==e.e&&(u.open=e.e=n),r!==e.t&&je(y,e.t=r),e},{e:void 0,t:void 0}),u})()}function mc(e){let[t,n]=k(`idle`);async function r(){if(e.text){try{await navigator.clipboard.writeText(e.text),n(`copied`)}catch{n(`failed`)}setTimeout(()=>n(`idle`),1200)}}return(()=>{var n=ws();return n.$$click=r,X(n,(()=>{var e=q(()=>t()===`copied`);return()=>e()?`copied`:t()===`failed`?`copy failed`:`copy`})()),j(()=>n.disabled=!e.text),n})()}function hc(e){let t=()=>e.entry.blocks.filter(t=>e.entry.streaming||e.entry.stopReason!==`error`||t.kind!==`thinking`||t.text.trim().length>0);return(()=>{var n=Ds(),r=n.firstChild,i=r.firstChild;return X(i,()=>e.who),X(r,W(K,{get when(){return e.entry.model},get children(){return[Ts(),(()=>{var t=us();return X(t,()=>e.entry.model),t})()]}}),null),X(r,W(K,{get when(){return e.entry.streaming},get children(){return[Ts(),Es()]}}),null),X(r,W(mc,{get text(){return Zs(e.entry)}}),null),X(n,W(G,{get each(){return t()},children:(n,r)=>W(K,{get when(){return n.kind===`thinking`},get fallback(){return(()=>{var i=ks();return X(i,W(Ws,{get text(){return n.text},get classList(){return{"streaming-cursor":e.entry.streaming&&r()===t().length-1}},get throttle(){return e.entry.streaming}})),i})()},get children(){var t=Os();return t.firstChild,X(t,W(Ws,{get text(){return n.text},class:`thinking-body markdown-body`,get throttle(){return e.entry.streaming}}),null),j(()=>t.open=es()),t}})}),null),X(n,W(K,{get when(){return q(()=>e.entry.stopReason===`error`)()&&e.entry.errorMessage},children:e=>(()=>{var t=As();return t.firstChild,X(t,e,null),t})()}),null),n})()}function gc(e,t){return e?.kind===`entry`&&e.entry===t}function _c(e){let[t,n]=k(e);return{kind:`assistant-turn`,lead:e[0],entries:t,setEntries:n}}function vc(e,t=[]){let n=[],r=0;for(;r<e.length;){let i=e[r];if(i?.kind===`assistant`){let a=[i];for(r+=1;e[r]?.kind===`tool`;)a.push(e[r]),r+=1;let o=t[n.length];if(o?.kind===`assistant-turn`&&o.lead===i){let e=L(o.entries);(e.length!==a.length||a.some((t,n)=>t!==e[n]))&&o.setEntries(a),n.push(o)}else n.push(_c(a));continue}if(i){let e=t[n.length];n.push(gc(e,i)?e:{kind:`entry`,entry:i})}r+=1}return n}function yc(e){return W(Te,{get children(){return[W(Ee,{get when(){return e.entry.kind===`user`},get children(){var t=js(),n=t.firstChild,r=n.firstChild,i=n.nextSibling;return X(n,W(K,{get when(){return Qs(e.entry.text)},children:e=>(()=>{var t=Ps();return t.firstChild,X(t,e,null),t})()}),r),X(n,W(mc,{get text(){return Zs(e.entry)}}),r),X(r,()=>e.userLabel),X(i,()=>e.entry.text),X(t,W(K,{get when(){return e.entry.images?.length},get children(){return W(dc,{get images(){return e.entry.images},get scope(){return e.imageScope},labels:lc})}}),null),t}}),W(Ee,{get when(){return e.entry.kind===`agent-result`},get children(){return W(bc,{get entry(){return e.entry}})}}),W(Ee,{get when(){return e.entry.kind===`assistant`},get children(){return W(hc,{get entry(){return e.entry},get who(){return e.who}})}}),W(Ee,{get when(){return e.entry.kind===`tool`},get children(){return W(pc,{get entry(){return e.entry},get imageScope(){return e.imageScope}})}}),W(Ee,{get when(){return e.entry.kind===`summary`},get children(){var t=Ms(),n=t.firstChild.firstChild,r=n.nextSibling;return X(n,()=>e.entry.label===`compaction`?`context compacted`:`branch summary`,null),X(n,W(K,{get when(){return e.entry.tokensBefore},get children(){return[` `,`— `,q(()=>e.entry.tokensBefore.toLocaleString()),` tokens summarized`]}}),null),X(r,()=>e.entry.text),t}}),W(Ee,{get when(){return e.entry.kind===`custom`},get children(){var t=Ns(),n=t.firstChild,r=n.firstChild,i=n.nextSibling;return X(r,()=>e.entry.tag),X(i,()=>e.entry.text),t}})]}})}function bc(e){return(()=>{var t=Is(),n=t.firstChild,r=n.firstChild;return r.firstChild,X(r,W(K,{get when(){return e.entry.header},get children(){var t=Fs();return X(t,()=>e.entry.header),t}}),null),X(n,W(Ws,{get text(){return e.entry.text},class:`entry-body markdown-body`}),null),t})()}function xc(e){let t=()=>e.who??`dreb`,n=()=>e.userLabel??`you`,r=()=>e.imageScope??{runtimeKey:``},i=N(t=>vc(e.entries,t)),[a,o]=k(150),s;M(()=>{let t=e.resetKey??e.entries;t!==s&&(s=t,o(150))});let c=N(()=>{let e=i(),t=a();return e.length>t?e.slice(-t):e}),l=()=>Math.max(0,i().length-c().length);return[W(K,{get when(){return l()>0},get children(){var e=Ls(),t=e.firstChild,n=t.firstChild.nextSibling,r=n.nextSibling.nextSibling;return r.nextSibling,t.$$click=()=>o(Math.min(i().length,a()+150)),X(t,()=>Math.min(150,l()),n),X(t,l,r),e}}),W(G,{get each(){return c()},children:e=>W(Te,{get children(){return[W(Ee,{get when(){return e.kind===`assistant-turn`},get children(){var i=Rs();return X(i,W(G,{get each(){return e.entries()},children:e=>W(yc,{entry:e,get who(){return t()},get userLabel(){return n()},get imageScope(){return r()}})})),i}}),W(Ee,{get when(){return e.kind===`entry`},get children(){return W(yc,{get entry(){return e.entry},get who(){return t()},get userLabel(){return n()},get imageScope(){return r()}})}})]}})})]}Ae([`click`]);var Sc=J(`<p class=settings-error>`),Cc=J(`<p class=settings-success>`),wc=J(`<button type=button class=memory-nav-item><span>MEMORY.md</span><small>complete editable index`),Tc=J(`<div class=context-trust-warning><strong>Complete index warning:</strong> MEMORY.md is over 200 lines. The dashboard shows the full file for repair, while the agent prompt may only load the indexed prefix.`),Ec=J(`<div class=screen-fill><main class="container memories-screen"><div class=memories-head><div><h1>Memories</h1><p class=scope-note>Edit dreb memory only: global ~/.dreb/memory plus known project .dreb/memory scopes. Claude memory paths are never included.</p></div><button type=button class=btn>refresh</button></div><div class=memories-layout><aside class=memories-sidebar><section class=memory-panel><h2>Scopes</h2></section><section class=memory-panel><h2>Documents</h2></section></aside><section class=memory-editor>`),Dc=J(`<p class=muted>loading scopes…`),Oc=J(`<p class=muted>No active dreb memory scopes.`),kc=J(`<button type=button class=memory-nav-item><span></span><small>`),Ac=J(`<p class=muted>loading documents…`),jc=J(`<p class=muted>Memory directory is missing; nothing to edit.`),Mc=J(`<p class=muted>MEMORY.md index missing.`),Nc=J(`<p class=muted>No memory entries.`),Pc=J(`<output class=memory-loading>loading selected memory…`),Fc=J(`<p class=muted>Select an existing memory document.`),Ic=J(`<button type=button class="btn btn-danger">delete entry`),Lc=J(`<div class=memory-doc-head><div><h2></h2><p class=scope-note> · revision </p></div><div class=head-actions><button type=button class=btn>reload`),Rc=J(`<p class=settings-error>Metadata error: `),zc=J(`<div class=memory-edit-actions><button type=button class="btn btn-primary"></button><button type=button class=btn>revert draft</button><span class=muted>`),Bc=J(`<textarea class=memory-textarea>`),Vc=J(`<details class=memory-preview open><summary>preview`),Hc=J(`<div class=memory-metadata><strong></strong><span></span><span>`),Uc=J(`<p>This deletes the entry file and first removes matching <code>[…](<!>)</code> or <code>[…](./<!>)</code> lines from MEMORY.md. If the index changed, deletion will fail with a conflict instead of leaving a dangling link.`),Wc=J(`<button type=button class=btn>cancel`),Gc=J(`<button type=button class="btn btn-danger">`),Kc=`MEMORY.md`;function qc(e){return e.metadata?`${e.metadata.name} · ${e.metadata.type}`:e.metadataError?`metadata error: ${e.metadataError}`:`metadata unavailable`}function Jc(e,t){return e?e.kind===`index`?`MEMORY.md index`:e.metadata?.name??e.file:t??`memory`}function Yc(e){if(e)return e.indexContent===null?e.entries[0]?.file:Kc}function Xc(e,t){if(!e||!t)return;let n;try{n=decodeURIComponent(e)}catch{return}if(n.startsWith(`./`)&&(n=n.slice(2)),!(!n||n.includes(`/`)||n.includes(`\\`)||n.includes(`?`)||n.includes(`#`)))return t.entries.some(e=>e.file===n)?n:void 0}function Zc(e){let[t,n]=k(),[r,i]=k(),[a,o]=k(),[s,c]=k(),[l,u]=k(``),[d,f]=k(!1),[p,m]=k(!1),[h,g]=k(),[_,{refetch:v}]=F(async()=>{try{return(await Q.memoryScopes()).scopes}catch(e){return o(e instanceof Error?e.message:String(e)),[]}});M(()=>{let e=_();if(!e?.length)return;let r=t();(!r||!e.some(e=>e.id===r))&&n(e[0].id)});let[y,{mutate:b,refetch:x}]=F(()=>t(),async e=>{o(void 0),c(void 0);try{return await Q.memoryListing(e)}catch(e){o(e instanceof Error?e.message:String(e));return}});M(()=>{let e=y();if(!e)return;let t=r(),n=new Set([...e.indexContent===null?[]:[Kc],...e.entries.map(e=>e.file)]);(!t||!n.has(t))&&i(Yc(e))});let[S,{mutate:C,refetch:w}]=F(()=>{let e=t(),n=r();return e&&n?{scopeId:e,file:n}:void 0},async e=>{o(void 0),c(void 0);try{return await Q.memoryDocument(e.scopeId,e.file)}catch(e){o(e instanceof Error?e.message:String(e));return}});M(()=>{let e=S();!e||d()||u(e.content)});function T(e){t()!==e.id&&I(()=>{i(void 0),n(e.id),C(void 0),f(!1),u(``)})}function E(e){r()!==e&&(i(e),C(void 0),f(!1),u(``))}function D(e){let t=e.target?.closest(`a`);if(!(t instanceof HTMLAnchorElement))return;let n=Xc(t.getAttribute(`href`),y());n&&(e.preventDefault(),E(n))}async function O(){await v(),await x(),r()&&await w()}async function A(){let e=t(),n=S();if(!(!e||!n)){m(!0),o(void 0),c(void 0);try{let t=await Q.saveMemoryDocument(e,n.file,l(),n.revision);b(t.listing),t.document&&C(t.document),u(t.document?.content??l()),f(!1),c(`saved`)}catch(e){o(e?.status===409?`${e.message} Your draft is still here.`:e instanceof Error?e.message:String(e))}finally{m(!1)}}}async function N(){let e=t(),n=h(),r=y();if(!(!e||!n||n.kind!==`entry`||!r)){m(!0),o(void 0),c(void 0);try{let t=await Q.deleteMemoryEntry(e,n.file,n.revision,r.indexRevision);b(t.listing),C(void 0),g(void 0),i(Yc(t.listing)),f(!1),u(``),c(`deleted ${n.file}; index links cleaned up`)}catch(e){o(e instanceof Error?e.message:String(e))}finally{m(!1)}}}return(()=>{var n=Ec(),i=n.firstChild,o=i.firstChild,c=o.firstChild.nextSibling,m=o.nextSibling,v=m.firstChild,b=v.firstChild;b.firstChild;var x=b.nextSibling;x.firstChild;var C=v.nextSibling;return X(n,W(tt,{get store(){return e.store},active:`memories`}),i),c.$$click=()=>void O(),X(i,W(K,{get when(){return a()},get children(){var e=Sc();return X(e,a),e}}),m),X(i,W(K,{get when(){return s()},get children(){var e=Cc();return X(e,s),e}}),m),X(b,W(K,{get when(){return!_.loading},get fallback(){return Dc()},get children(){return W(K,{get when(){return(_()??[]).length>0},get fallback(){return Oc()},get children(){return W(G,{get each(){return _()??[]},children:e=>(()=>{var n=kc(),r=n.firstChild,i=r.nextSibling;return n.$$click=()=>T(e),X(r,(()=>{var t=q(()=>e.kind===`global`);return()=>t()?`global`:e.label})()),X(i,(()=>{var t=q(()=>!!e.exists);return()=>t()?e.memoryDir:`${e.memoryDir} (missing)`})()),j(()=>n.classList.toggle(`active`,t()===e.id)),n})()})}})}}),null),X(x,W(K,{get when(){return!y.loading},get fallback(){return Ac()},get children(){return W(K,{get when(){return y()?.scope.exists},get fallback(){return jc()},get children(){return[W(K,{get when(){return y()?.indexContent!==null},get fallback(){return Mc()},get children(){var e=wc();return e.$$click=()=>E(Kc),j(()=>e.classList.toggle(`active`,r()===Kc)),e}}),W(K,{get when(){return(y()?.entries.length??0)>0},get fallback(){return Nc()},get children(){return W(G,{get each(){return y()?.entries??[]},children:e=>(()=>{var t=kc(),n=t.firstChild,i=n.nextSibling;return t.$$click=()=>E(e.file),X(n,()=>e.file),X(i,()=>qc(e)),j(n=>{var i=r()===e.file,a=!!e.metadataError;return i!==n.e&&t.classList.toggle(`active`,n.e=i),a!==n.t&&t.classList.toggle(`error`,n.t=a),n},{e:void 0,t:void 0}),t})()})}})]}})}}),null),X(C,W(K,{get when(){return q(()=>!y.loading)()&&!S.loading},get fallback(){return Pc()},get children(){return[W(K,{get when(){return y()?.indexOverLimit},get children(){return Tc()}}),W(K,{get when(){return S()},get fallback(){return Fc()},children:e=>[(()=>{var t=Lc(),n=t.firstChild,i=n.firstChild,a=i.nextSibling,o=a.firstChild,s=n.nextSibling,c=s.firstChild;return X(i,()=>Jc(e(),r())),X(a,()=>e().file,o),X(a,()=>e().revision.slice(0,12),null),c.$$click=()=>void w(),X(s,W(K,{get when(){return e().kind===`entry`},get children(){var t=Ic();return t.$$click=()=>g(e()),t}}),null),j(()=>c.disabled=S.loading),t})(),W(K,{get when(){return e().metadata},children:e=>(()=>{var t=Hc(),n=t.firstChild,r=n.nextSibling,i=r.nextSibling;return X(n,()=>e().name),X(r,()=>e().type),X(i,()=>e().description),t})()}),W(K,{get when(){return e().metadataError},get children(){var t=Rc();return t.firstChild,X(t,()=>e().metadataError,null),t}}),(()=>{var t=zc(),n=t.firstChild,r=n.nextSibling,i=r.nextSibling;return n.$$click=()=>void A(),X(n,()=>p()?`saving…`:`save`),r.$$click=()=>{u(e().content),f(!1)},X(i,()=>d()?`unsaved draft`:`saved revision loaded`),j(e=>{var t=!d()||p(),i=!d()||p();return t!==e.e&&(n.disabled=e.e=t),i!==e.t&&(r.disabled=e.t=i),e},{e:void 0,t:void 0}),t})(),(()=>{var t=Bc();return t.$$input=t=>{u(t.currentTarget.value),f(t.currentTarget.value!==e().content)},j(()=>t.value=l()),t})(),(()=>{var e=Vc();return e.firstChild,e.$$keydown=e=>{e.key===`Enter`&&D(e)},e.$$click=D,X(e,W(Ws,{get text(){return l()},throttle:!0}),null),e})()]})]}})),X(i,W(K,{get when(){return h()},children:e=>W(rt,{get title(){return`Delete ${e().file}?`},onDismiss:()=>g(void 0),get actions(){return[(()=>{var e=Wc();return e.$$click=()=>g(void 0),e})(),(()=>{var e=Gc();return e.$$click=()=>void N(),X(e,()=>p()?`deleting…`:`delete entry`),j(()=>e.disabled=p()),e})()]},get children(){var t=Uc(),n=t.firstChild.nextSibling,r=n.firstChild.nextSibling;r.nextSibling;var i=n.nextSibling.nextSibling,a=i.firstChild.nextSibling;return a.nextSibling,X(n,()=>e().file,r),X(i,()=>e().file,a),t}})}),null),j(e=>{var t=_.loading||y.loading,n=y.loading||S.loading;return t!==e.e&&(c.disabled=e.e=t),n!==e.t&&Y(C,`aria-busy`,e.t=n),e},{e:void 0,t:void 0}),n})()}Ae([`click`,`input`,`keydown`]);var Qc=J(`<p class=pair-error>`),$c=J(`<main class=pair-card><span class=wordmark>dreb</span><h1>pair this device</h1><p class=sub>First login from a new device needs the current pairing code.</p><div class=identity><span class=row-line><span class=k>tailscale identity</span><span></span></span><span class=row-line><span class=k>allowlist</span><span class="chip chip-running"style=align-self:flex-end><span class=dot>●</span> allowed</span></span></div><div class=field><label for=pairing-pin>6-digit code</label><input id=pairing-pin class=pin-input type=text inputmode=numeric maxlength=6 autocomplete=one-time-code></div><p class=pin-hint>The code is shown in the dashboard <strong>Settings tab on the host machine</strong>. It rotates every 30 seconds.</p><div class=pair-actions><button type=button class="btn btn-primary"></button></div><div class=security-note><p><strong>Why a PIN?</strong> Your network identity got you here, but identity alone doesn't grant control. The code proves you can see the host machine's local dashboard — so a stolen or shared allowlist entry can't quietly gain access.</p><p><strong>What pairing grants.</strong> This browser gets a signed cookie for this host. It can chat with agents, run commands through them, browse the host's files, and upload/download — the same power as sitting at the terminal. Unpair anytime from settings → devices.`),el=J(`<div class=pair-wrap>`),tl=J(`<p class="muted small">rejected identity: `),nl=J(`<main class=denied-card><span class=wordmark>dreb</span><h1>access denied</h1><p></p><p class="muted small">If this device should have access, add its Tailscale identity to the dashboard allowlist on the host and reload.`);function rl(e){let[t,n]=k(``),[r,i]=k(),[a,o]=k(!1),s=()=>e.store.auth(),c=()=>s()?.error&&!s()?.needsPairing,l=()=>typeof window.matchMedia==`function`&&window.matchMedia(`(max-width: 700px)`).matches;async function u(){o(!0),i(void 0);try{await Q.pair(t()),await e.store.start(),e.store.navigate({screen:`fleet`})}catch(e){i(e instanceof Error?e.message:String(e))}finally{o(!1)}}return(()=>{var e=el();return X(e,W(K,{get when(){return!c()},get fallback(){return(()=>{var e=nl(),t=e.firstChild.nextSibling.nextSibling,n=t.nextSibling;return X(t,()=>s()?.error),X(e,W(K,{get when(){return s()?.identity},get children(){var e=tl();return e.firstChild,X(e,()=>s().identity,null),e}}),n),e})()},get children(){var e=$c(),i=e.firstChild.nextSibling.nextSibling.nextSibling,o=i.firstChild,c=o.firstChild.nextSibling;o.nextSibling.firstChild.nextSibling;var d=i.nextSibling,f=d.firstChild.nextSibling,p=d.nextSibling.nextSibling,m=p.firstChild;return X(c,()=>s()?.identity??`unknown`),f.$$keydown=e=>{e.key===`Enter`&&t().length===6&&!l()&&u()},f.$$input=e=>n(e.currentTarget.value.replace(/\D/g,``).slice(0,6)),X(e,W(K,{get when(){return r()},get children(){var e=Qc();return X(e,r),e}}),p),m.$$click=u,X(m,()=>a()?`pairing…`:`pair device`),j(()=>m.disabled=t().length!==6||a()),j(()=>f.value=t()),e}})),e})()}Ae([`input`,`keydown`,`click`]);function il(e,t){let n=e.trim(),r=/^\/([^\s]+)(?:\s+([\s\S]*))?$/.exec(n);if(!r)return;let i=t.find(e=>e.source===`builtin`&&e.name===r[1]);if(i)return{command:i,args:(r[2]??``).trim()}}async function al(e,t,n){let r=t[e.command.name];if(r){await r(e.args);return}if(e.command.dashboard===!1){n(`/${e.command.name} is available only in the terminal UI.`);return}n(`/${e.command.name} isn't implemented in the dashboard yet — use the terminal UI.`)}function ol(e,t,n=8){let r=new Map;for(let t of e)(!r.get(t.name)||t.source===`builtin`)&&r.set(t.name,t);return[...r.values()].filter(e=>e.source!==`builtin`||e.dashboard!==!1).filter(e=>{let n=e.name.toLowerCase();return!t||n.startsWith(t)||n.includes(t)}).sort((e,n)=>{let r=e.name.toLowerCase(),i=n.name.toLowerCase();return(t?+!r.startsWith(t):+(e.source===`builtin`))-(t?+!i.startsWith(t):+(n.source===`builtin`))||e.name.localeCompare(n.name)}).slice(0,n)}function sl(e){return typeof DOMException<`u`&&e instanceof DOMException&&e.name===`AbortError`?!0:typeof e==`object`&&!!e&&`name`in e&&e.name===`AbortError`}var cl=new Map,ll=new Map;function ul(e){return ll.get(e)}function dl(e,t){ll.set(e,t)}function fl(e){return cl.get(e)??[]}function pl(e,t){let n=cl.get(e)??[];n.push(t),cl.set(e,n.slice(-100))}function ml(e){cl.delete(e),ll.delete(e)}var hl=J(`<p style=margin-bottom:12px>`),gl=J(`<div class=recent-projects>`),_l=J(`<div class=field><input type=text>`),vl=J(`<div class=field><textarea rows=8>`),yl=J(`<button type=button class="btn btn-small">cancel`),bl=J(`<button type=button class="btn btn-small btn-primary">confirm`),xl=J(`<button type=button class="btn btn-small btn-primary">submit`),Sl=J(`<button type=button>`),Cl=J(`<h4 class=ask-question-title>`),wl=J(`<fieldset class=ask-options><legend class=ask-options-legend>Answer options`),Tl=J(`<textarea rows=5>`),El=J(`<div class="field ask-custom-field"><label class=ask-custom-label>`),Dl=J(`<div class=ask-actions><button type=button class="btn btn-small btn-danger"></button><button type=button class="btn btn-small btn-primary">submit`),Ol=J(`<div class=ask-question role=tabpanel>`),kl=J(`<span class=ask-option-check>✔`),Al=J(`<label class=ask-option><span class=ask-option-index></span><input><span class=ask-option-label>`),jl=J(`<input type=text placeholder="Type a different answer…">`),Ml=J(`<span class=ask-wizard-countdown> (auto-stops in <!>s)`),Nl=J(`<div class=ask-tab-strip role=tablist aria-label=questions><button type=button role=tab class="ask-tab ask-tab-submit">Submit`),Pl=J(`<div class=ask-tab-panel><div class=ask-review role=tabpanel><ul class=ask-review-list></ul><div class=ask-actions><button type=button class="btn btn-small btn-danger"></button><button type=button class="btn btn-small btn-primary">Submit all`),Fl=J(`<section class=ask-wizard><header class=ask-wizard-header><span class=ask-wizard-title>`),Il=J(`<span class=ask-tab-check role=img aria-label=answered>✓`),Ll=J(`<button type=button role=tab class=ask-tab>. `),Rl=J(`<div class=ask-tab-panel>`),zl=J(`<li class=ask-review-item><span class=ask-review-question>`),Bl=J(`<span class="ask-review-answer muted">(unanswered)`),Vl=J(`<span class=ask-review-answer>`),Hl=J(`<ul>`),Ul=J(`<section class=context-section><h3>`),Wl=J(`<p class="muted small">none`),Gl=J(`<p class=pair-error>`),Kl=J(`<p class="muted small">loading…`),ql=J(`<p class="muted small">system prompt: custom`),Jl=J(`<div class=context-modal-body>`),Yl=J(`<li>`),Xl=J(`<span class=muted> — `),Zl=J(`<li><span>`),Ql=J(`<li><span></span><span class=muted> — `),$l=J(`<div class=model-scope-tabs role=tablist aria-label="model scope"><button type=button role=tab>scoped</button><button type=button role=tab>all`),eu=J(`<div class=field style=margin-bottom:8px><input type=text placeholder="search models…">`),tu=J(`<div class="model-list session-model-list"style=max-height:320px>`),nu=J(`<p class="muted small">No matching models.`),ru=J(`<section class=model-provider-group><div class=model-provider-heading>`),iu=J(`<span class=model-name>`),au=J(`<span class=model-reasoning>think`),ou=J(`<button type=button class=model-row><span class=model-current></span><span class=model-id></span><span class=model-provider-badge>`),su=J(`<div class=fork-message-list>`),cu=J(`<p class="muted small">`),lu=J(`<span class="muted small">current`),uu=J(`<button type=button class=fork-message><span class=fork-entry-id></span><span>`),du=J(`<button type=button class=fork-message><span></span><span class="muted small"> messages`),fu=J(`<p class="muted small">Replace the current session with a JSONL session file.`),pu=J(`<div class=field><input type=text placeholder=/path/to/session.jsonl>`),mu=J(`<button type=button class="btn btn-small btn-primary">import and replace`),hu=J(`<span class=project>`),gu=J(`<output class=switcher><span class=label>ctx</span> `),_u=J(`<span class=right><button type=button class="switcher optional model-switcher"><span class=label>model</span> <span class=value></span></button><button type=button class="switcher optional"><span class=label>think</span> </button><button type=button class=switcher>⋯`),vu=J(`<div class=stats-popover>`),yu=J(`<div class="session-bar-inner session-info-bar"><span class=session-info-left></span><button type=button class="session-info-right stats-trigger">`),bu=J(`<button type=button class="btn btn-small">model: `),xu=J(`<button type=button class="btn btn-small">think: `),Su=J(`<div class=session-bar-inner style=justify-content:flex-end;gap:8px><a class="btn btn-small">export HTML</a><button type=button class="btn btn-small">compact now</button><button type=button class="btn btn-small">expand tools</button><button type=button class="btn btn-small">collapse tools</button><button type=button class="btn btn-small">rename</button><button type=button class="btn btn-small">fork</button><button type=button class="btn btn-small">loaded context</button><button type=button class="btn btn-small btn-danger">`),Cu=J(`<div class=container style=padding-top:8px><div class=fallback-banner><span>◆ </span><button type=button class="btn btn-small dismiss">dismiss`),wu=J(`<span class=dock-collapsed-hint>`),Tu=J(`<details class=tasks><summary>tasks — <!> of <!> done</summary><ul>`),Eu=J(`<details class="tasks subagents"><summary>subagents — <!> running · <!> done</summary><ul class=subagent-list>`),Du=J(`<span class=working>● working`),Ou=J(`<span class=error>`),ku=J(`<span class=queued>`),Au=J(`<button type=button class="btn btn-small btn-danger">`),ju=J(`<div class=status-line>`),Mu=J(`<div class=queued-message-row><button type=button class="btn btn-small">restore to composer`),Nu=J(`<div class=attachment-strip>`),Pu=J(`<div class=command-popover role=listbox id=command-listbox aria-label="slash commands">`),Fu=J(`<span class=mode-toggle role=radiogroup aria-label="send mode"><button type=button title="Deliver now — injected into the running turn">steer</button><button type=button title="Queue — delivered after the agent finishes">follow-up`),Iu=J(`<button type=button class=ghost-suggest>suggested: <code></code> <span class=key>tap`),Lu=J(`<div class=dock-inner><div class=composer><textarea></textarea><div class=composer-row><input type=file multiple class=hidden-file-input><input type=file accept=image/* multiple class=hidden-file-input><button type=button class="btn btn-small"title="attach file (uploads to workspace and sends path)">📎 file</button><button type=button class="btn btn-small"title="attach image inline">🖼 photo</button><button type=button class="btn btn-primary btn-small send">send ↵`),Ru=J(`<p>Summarize older context to free window space. The transcript keeps a summary card.`),zu=J(`<div class=session-screen><header class=session-bar><div class="session-bar-inner session-bar-main"><a class=back href=#/>← fleet</a><span class=title></span><button type=button class=chrome-toggle></button></div></header><main class=chat><div class=chat-inner></div></main><footer class=dock><div class=dock-collapse-row><button type=button class=chrome-toggle>`),Bu=J(`<span>`),Vu=J(`<p class="muted small">loading stats…`),Hu=J(`<div class=stats-grid><span>user messages</span><strong></strong><span>assistant messages</span><strong></strong><span>tool calls/results</span><strong>/</strong><span>input/output</span><strong> / </strong><span>cache read/write</span><strong> / </strong><span>total tokens</span><strong></strong><span>cost</span><strong>$`),Uu=J(`<p class=muted>loading transcript…`),Wu=J(`<div class=widget-block>`),Gu=J(`<li> `),Ku=J(`<li><button type=button class=agent-chip title="view this subagent's session"><span></span><span class=task> — `),qu=J(`<button type=button class="btn btn-small btn-danger inline-stop">stop`),Ju=J(`<span class=queued-chip><span class=queued-kind>`),Yu=J(`<span class=attachment-file><span>📎 </span><span class=muted></span><button type=button aria-label="remove file attachment">×`),Xu=J(`<span class=attachment-thumb><img><button type=button aria-label="remove image">×`),Zu=J(`<span class=command-description>`),Qu=J(`<button type=button role=option class=command-option><span class=command-name>/</span><span class=command-source>`),$u=J(`<button type=button class="btn btn-small btn-primary">compact`),ed=J(`<p class="muted small">loading forkable messages…`),td=J(`<button type=button class="btn btn-small btn-primary">rename`),nd=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`],rd=10*1024*1024,id=`.dreb-dashboard-uploads`;function ad(e){return e?`${e.provider}/${e.id}`:`—`}function od(e){if(!e)return`—`;let t=`${e.provider}/${e.id}`;return e.name?`${t} — ${e.name}`:t}function sd(e){return e<1e3?e.toString():e<1e4?`${(e/1e3).toFixed(1)}k`:e<1e6?`${Math.round(e/1e3)}k`:e<1e7?`${(e/1e6).toFixed(1)}M`:`${Math.round(e/1e6)}M`}function cd(e){if(!e||e.rolling.count<3)return;let t={above:`↑`,below:`↓`,stable:`→`},n=e.delta.direction===`stable`?0:Math.round(Math.abs(e.delta.percentDelta)),r=e.delta.recentCount>=3&&e.delta.baselineCount>=3?` · ${n}% ${t[e.delta.direction]} median [${e.delta.baselineCount}]`:``;return`~${Math.round(e.rolling.median)} tok/s [${e.rolling.count}]${r}`}function ld(e,t){if(!t)return;let n=e?.models.find(e=>e.provider===t.provider&&e.modelId===t.id);return cd(n)}function ud(e){return e.replace(/^\/home\/[^/]+/,`~`)}function dd(e,t){return`${e.replace(/\/+$/,``)}/${t}`}function fd(e){let t=e.trim().replace(/[\\/\0]/g,`_`);return t&&t!==`.`&&t!==`..`?t:`upload.bin`}function pd(e,t){return`${new Date().toISOString().replace(/[:.]/g,`-`)}-${t+1}-${fd(e.name||`upload.bin`)}`}function md(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:e<1024*1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:`${(e/(1024*1024*1024)).toFixed(1)} GB`}function hd(e,t){return`${e.provider}/${e.id} ${e.name??``}`.toLowerCase().includes(t)}function gd(e){let t=new Map;for(let n of e){let e=t.get(n.provider)??[];e.push(n),t.set(n.provider,e)}return[...t.entries()].map(([e,t])=>({provider:e,models:t}))}function _d(e){e.style.height=`auto`;let t=Math.max(120,Math.floor((window.innerHeight||800)*.4)),n=Math.min(e.scrollHeight,t);n>0&&(e.style.height=`${n}px`),e.style.overflowY=e.scrollHeight>t?`auto`:`hidden`}function vd(e){let[t,n]=k(e.request.prefill??``),r=t=>e.onRespond({type:`extension_ui_response`,id:e.request.id,...t});return W(rt,{get title(){return e.request.title},onDismiss:()=>r({cancelled:!0}),get actions(){return W(K,{get when(){return e.request.method!==`select`},get children(){return[(()=>{var e=yl();return e.$$click=()=>r({cancelled:!0}),e})(),W(K,{get when(){return e.request.method===`confirm`},get children(){var e=bl();return e.$$click=()=>r({confirmed:!0}),e}}),W(K,{get when(){return e.request.method===`input`||e.request.method===`editor`},get children(){var e=xl();return e.$$click=()=>r({value:t()}),e}})]}})},get children(){return[W(K,{get when(){return e.request.message},get children(){var t=hl();return X(t,()=>e.request.message),t}}),W(K,{get when(){return e.request.method===`select`},get children(){var t=gl();return X(t,W(G,{get each(){return e.request.options??[]},children:e=>(()=>{var t=Sl();return t.$$click=()=>r({value:e}),X(t,e),t})()})),t}}),W(K,{get when(){return e.request.method===`input`},get children(){var r=_l(),i=r.firstChild;return i.$$input=e=>n(e.currentTarget.value),j(()=>Y(i,`placeholder`,e.request.placeholder)),j(()=>i.value=t()),r}}),W(K,{get when(){return e.request.method===`editor`},get children(){var e=vl(),r=e.firstChild;return r.$$input=e=>n(e.currentTarget.value),j(()=>r.value=t()),e}})]}})}function yd(e){let t=e.target,n=t?.tagName;return n===`INPUT`||n===`TEXTAREA`||t?.isContentEditable===!0}function bd(e){let t=()=>e.request.questions??[],n=()=>t().length,r=()=>n()>=2,i,[a,o]=k(t().map(()=>({selected:[],customText:``})));M(()=>{let e=n();o(n=>n.length===e?n:t().map((e,t)=>n[t]??{selected:[],customText:``}))});let[s,c]=k(0),l=()=>r()&&s()===n(),u=t=>e.onRespond({type:`extension_ui_response`,id:e.request.id,...t}),d=e=>t()[e]?.options??[],f=e=>t()[e]?.allowFreeText!==!1,p=e=>t()[e]?.multiSelect===!0&&d(e).length>0,m=(e,t)=>o(n=>n.map((n,r)=>r===e?t(n):n)),h=(e,t)=>{m(e,n=>{if(p(e)){let e=n.selected.includes(t)?n.selected.filter(e=>e!==t):[...n.selected,t];return{...n,selected:e}}return{...n,selected:[t]}})},g=(e,t)=>m(e,e=>({...e,customText:t})),_=e=>{let t=a()[e];return t?t.selected.length>0||t.customText.trim().length>0:!1},v=e=>{let t=a()[e];if(!t)return;let n=[...t.selected],r=t.customText.trim();return r&&n.push(r),n.length>0?n.join(`, `):void 0},y=()=>{e.stopping||e.onStop()},b=()=>{let e=a().map(e=>{let t=e.selected,n=e.customText.trim()||void 0;return t.length>0||n?{selected:t,customText:n}:{selected:[],skipped:!0}});u({answers:e})},x=e=>{if(e.key===`Escape`){e.preventDefault(),y();return}if(e.key===`Enter`&&n()===1&&!l()){let t=e.target;t&&i?.contains(t)&&t.tagName!==`TEXTAREA`&&t.tagName!==`BUTTON`&&(e.preventDefault(),b());return}if(r()&&(e.key===`ArrowLeft`||e.key===`ArrowRight`||e.key===`Tab`)){if(yd(e))return;let t=n(),r=e.key===`ArrowLeft`?-1:1;e.preventDefault(),c(e=>{let n=e+r;return n<0?t:n>t?0:n});return}if(!l()&&/^[1-9]$/.test(e.key)&&!yd(e)){let t=s(),n=d(t),r=Number(e.key)-1;r<n.length&&(e.preventDefault(),h(t,n[r]))}};R(()=>window.addEventListener(`keydown`,x)),z(()=>window.removeEventListener(`keydown`,x));let S=typeof e.request.expiresAt==`number`?e.request.expiresAt:e.request.timeout&&e.request.timeout>0?Date.now()+e.request.timeout:void 0,C=()=>S===void 0?0:Math.max(0,Math.ceil((S-Date.now())/1e3)),[w,T]=k(C());if(S!==void 0){let e,t=()=>{let t=C();T(t),t<=0&&(e!==void 0&&clearInterval(e),e=void 0,y())};R(()=>{t(),S>Date.now()&&(e=setInterval(t,1e3))}),z(()=>{e!==void 0&&clearInterval(e)})}let E=(t,r)=>(()=>{var i=Ol();return X(i,W(K,{get when(){return t.title},get children(){var e=Cl();return X(e,()=>t.title),e}}),null),X(i,W(Ws,{get text(){return t.question??``},class:`ask-question-body markdown-body`}),null),X(i,W(K,{get when(){return d(r).length>0},get children(){var t=wl();return t.firstChild,X(t,W(G,{get each(){return d(r)},children:(t,n)=>(()=>{var i=Al(),o=i.firstChild,s=o.nextSibling,c=s.nextSibling;return X(o,()=>n()+1),s.addEventListener(`change`,()=>h(r,t)),X(c,t),X(i,W(K,{get when(){return a()[r]?.selected.includes(t)},get children(){return kl()}}),null),j(n=>{var o=!!a()[r]?.selected.includes(t),c=p(r)?`checkbox`:`radio`,l=p(r)?void 0:`ask-option-input--hidden`,u=`ask-${e.request.id}-${r}`;return o!==n.e&&i.classList.toggle(`selected`,n.e=o),c!==n.t&&Y(s,`type`,n.t=c),l!==n.a&&je(s,n.a=l),u!==n.o&&Y(s,`name`,n.o=u),n},{e:void 0,t:void 0,a:void 0,o:void 0}),j(()=>s.checked=a()[r]?.selected.includes(t)),i})()}),null),t}}),null),X(i,W(K,{get when(){return f(r)},get children(){var n=El(),i=n.firstChild;return X(i,()=>d(r).length>0?`Or type your own answer`:`Your answer`),X(n,W(K,{get when(){return t.multiline},get fallback(){return(()=>{var t=jl();return t.$$input=e=>g(r,e.currentTarget.value),j(()=>Y(t,`id`,`ask-custom-${e.request.id}-${r}`)),j(()=>t.value=a()[r]?.customText??``),t})()},get children(){var t=Tl();return t.$$input=e=>g(r,e.currentTarget.value),j(()=>Y(t,`id`,`ask-custom-${e.request.id}-${r}`)),j(()=>t.value=a()[r]?.customText??``),t}}),null),j(()=>Y(i,`for`,`ask-custom-${e.request.id}-${r}`)),n}}),null),X(i,W(K,{get when(){return n()===1},get children(){var t=Dl(),n=t.firstChild,r=n.nextSibling;return n.$$click=y,X(n,()=>e.stopping?`stopping…`:`■ stop agent`),r.$$click=b,j(()=>n.disabled=e.stopping),t}}),null),i})();return(()=>{var a=Fl(),o=a.firstChild,u=o.firstChild,d=i;return typeof d==`function`?Fe(d,a):i=a,X(u,()=>e.request.title),X(o,W(K,{when:S!==void 0,get children(){var e=Ml(),t=e.firstChild.nextSibling;return t.nextSibling,X(e,w,t),e}}),null),X(a,W(K,{get when(){return r()},get children(){var e=Nl(),r=e.firstChild;return X(e,W(G,{get each(){return t()},children:(e,t)=>(()=>{var n=Ll(),r=n.firstChild;return n.$$click=()=>c(t()),X(n,()=>t()+1,r),X(n,()=>e.title??e.question,null),X(n,W(K,{get when(){return _(t())},get children(){return Il()}}),null),j(e=>{var r=s()===t(),i=s()===t(),a=!!_(t());return r!==e.e&&Y(n,`aria-selected`,e.e=r),i!==e.t&&n.classList.toggle(`selected`,e.t=i),a!==e.a&&n.classList.toggle(`answered`,e.a=a),e},{e:void 0,t:void 0,a:void 0}),n})()}),r),r.$$click=()=>c(n()),j(e=>{var t=l(),n=!!l();return t!==e.e&&Y(r,`aria-selected`,e.e=t),n!==e.t&&r.classList.toggle(`selected`,e.t=n),e},{e:void 0,t:void 0}),e}}),null),X(a,W(G,{get each(){return t()},children:(e,t)=>(()=>{var n=Rl();return X(n,()=>E(e,t())),j(()=>n.classList.toggle(`hidden`,s()!==t())),n})()}),null),X(a,W(K,{get when(){return r()},get children(){var n=Pl(),r=n.firstChild.firstChild,i=r.nextSibling.firstChild,a=i.nextSibling;return X(r,W(G,{get each(){return t()},children:(e,t)=>(()=>{var n=zl(),r=n.firstChild;return X(r,()=>e.title??e.question),X(n,W(K,{get when(){return v(t())},get fallback(){return Bl()},children:e=>(()=>{var t=Vl();return X(t,e),t})()}),null),n})()})),i.$$click=y,X(i,()=>e.stopping?`stopping…`:`cancel`),a.$$click=b,j(t=>{var r=!l(),a=e.stopping;return r!==t.e&&n.classList.toggle(`hidden`,t.e=r),a!==t.t&&(i.disabled=t.t=a),t},{e:void 0,t:void 0}),n}}),null),j(()=>Y(a,`aria-label`,e.request.title)),a})()}function xd(e){let t=(e,t)=>(()=>{var n=Ul(),r=n.firstChild;return X(r,e),X(n,W(K,{get when(){return t.length>0},get fallback(){return Wl()},get children(){var e=Hl();return X(e,t),e}}),null),n})();return W(rt,{title:`loaded context`,get onDismiss(){return e.onClose},get children(){return[W(K,{get when(){return e.error},get children(){var t=Gl();return X(t,()=>e.error),t}}),W(K,{get when(){return e.resources},get fallback(){return Kl()},children:e=>(()=>{var n=Jl();return X(n,()=>t(`context files`,e().contextFiles.map(e=>(()=>{var t=Yl();return X(t,()=>ud(e.path)),j(()=>Y(t,`title`,e.path)),t})())),null),X(n,()=>t(`skills`,e().skills.map(e=>(()=>{var t=Zl(),n=t.firstChild;return X(n,()=>e.name),X(t,W(K,{get when(){return e.description},get children(){var t=Xl();return t.firstChild,X(t,()=>e.description,null),t}}),null),t})())),null),X(n,()=>t(`extensions`,e().extensions.map(e=>(()=>{var t=Ql(),n=t.firstChild,r=n.nextSibling;return r.firstChild,X(n,()=>e.name??`extension`),X(r,()=>ud(e.path),null),j(()=>Y(t,`title`,e.path)),t})())),null),X(n,()=>t(`prompt templates`,e().promptTemplates.map(e=>(()=>{var t=Yl();return X(t,()=>e.name),t})())),null),X(n,W(K,{get when(){return e().systemPromptPresent},get children(){return ql()}}),null),n})()})]}})}function Sd(e){let[t,n]=k([]),[r,i]=k(e.initialFilter??``),[a,o]=k((e.state?.scopedModels?.length??0)>0?`scoped`:`all`),[s,c]=k();R(async()=>{try{let{models:t}=await Q.models(e.sessionKey);n(t)}catch(e){c(e instanceof Error?e.message:String(e))}});let l=N(()=>(e.state?.scopedModels??[]).map(e=>({provider:e.provider,id:e.id,name:e.name,reasoning:e.reasoning}))),u=()=>l().length>0,d=()=>a()===`scoped`&&u()?l():t(),f=N(()=>{let e=r().toLowerCase();return gd(d().filter(t=>!e||hd(t,e)).slice(0,100))}),p=t=>e.state?.model?.provider===t.provider&&e.state?.model?.id===t.id;async function m(t){try{let n=await Q.setModel(e.sessionKey,t.provider,t.id);e.onSelected(n),e.onClose()}catch(e){c(e instanceof Error?e.message:String(e))}}return W(rt,{title:`select model`,get onDismiss(){return e.onClose},class:`model-picker-modal`,get children(){return[W(K,{get when(){return u()},get children(){var e=$l(),t=e.firstChild,n=t.nextSibling;return t.$$click=()=>o(`scoped`),n.$$click=()=>o(`all`),j(e=>{var r=a()===`scoped`,i=a()===`scoped`,o=a()===`all`,s=a()===`all`;return r!==e.e&&Y(t,`aria-selected`,e.e=r),i!==e.t&&t.classList.toggle(`selected`,e.t=i),o!==e.a&&Y(n,`aria-selected`,e.a=o),s!==e.o&&n.classList.toggle(`selected`,e.o=s),e},{e:void 0,t:void 0,a:void 0,o:void 0}),e}}),(()=>{var e=eu(),t=e.firstChild;return t.$$input=e=>i(e.currentTarget.value),j(()=>t.value=r()),e})(),W(K,{get when(){return s()},get children(){var e=Gl();return X(e,s),e}}),(()=>{var e=tu();return X(e,W(K,{get when(){return f().length>0},get fallback(){return nu()},get children(){return W(G,{get each(){return f()},children:e=>(()=>{var t=ru(),n=t.firstChild;return X(n,()=>e.provider),X(t,W(G,{get each(){return e.models},children:e=>(()=>{var t=ou(),n=t.firstChild,r=n.nextSibling,i=r.nextSibling;return t.$$click=()=>m(e),X(n,()=>p(e)?`✓`:``),X(r,()=>e.id),X(t,W(K,{get when(){return e.name},get children(){var t=iu();return X(t,()=>e.name),t}}),i),X(i,()=>e.provider),X(t,W(K,{get when(){return e.reasoning},get children(){return au()}}),null),j(n=>{var r=!!p(e),i=od(e);return r!==n.e&&t.classList.toggle(`current`,n.e=r),i!==n.t&&Y(t,`title`,n.t=i),n},{e:void 0,t:void 0}),t})()}),null),t})()})}})),e})()]}})}function Cd(e){let t=[],n=[...e].reverse().map(e=>({node:e,depth:0}));for(;n.length>0;){let e=n.pop();if(!e)break;t.push(e);for(let t=e.node.children.length-1;t>=0;--t)n.push({node:e.node.children[t],depth:e.depth+1})}return t}function wd(e){return W(rt,{title:`session tree`,get onDismiss(){return e.onClose},get children(){return[W(K,{get when(){return e.error},get children(){var t=Gl();return X(t,()=>e.error),t}}),W(K,{get when(){return e.roots.length>0},get fallback(){return(()=>{var t=cu();return X(t,()=>e.loading?`loading tree…`:`No session entries yet.`),t})()},get children(){var t=su();return X(t,W(G,{get each(){return Cd(e.roots)},children:({node:t,depth:n})=>(()=>{var r=uu(),i=r.firstChild,a=i.nextSibling;return r.$$click=()=>e.onNavigate(t.id),Pe(r,`padding-left`,`${12+n*18}px`),X(i,()=>t.id.slice(0,8)),X(a,()=>t.label??(t.preview||t.type)),X(r,W(K,{get when(){return t.id===e.leafId},get children(){return lu()}}),null),j(()=>r.disabled=t.id===e.leafId),r})()})),t}})]}})}function Td(e){return W(rt,{title:`resume session`,get onDismiss(){return e.onClose},get children(){return[W(K,{get when(){return e.error},get children(){var t=Gl();return X(t,()=>e.error),t}}),W(K,{get when(){return e.sessions.length>0},get fallback(){return(()=>{var t=cu();return X(t,()=>e.loading?`loading sessions…`:`No other sessions found.`),t})()},get children(){var t=su();return X(t,W(G,{get each(){return e.sessions},children:t=>(()=>{var n=du(),r=n.firstChild,i=r.nextSibling,a=i.firstChild;return n.$$click=()=>e.onResume(t.path),X(r,()=>t.name??(t.firstMessage||t.path)),X(i,()=>t.messageCount,a),n})()})),t}})]}})}function Ed(e){let[t,n]=k(e.initialPath);return W(rt,{title:`import session`,get onDismiss(){return e.onClose},get actions(){return[(()=>{var t=yl();return Me(t,`click`,e.onClose,!0),t})(),(()=>{var n=mu();return n.$$click=()=>e.onImport(t().trim()),j(()=>n.disabled=!t().trim()),n})()]},get children(){return[fu(),(()=>{var e=pu(),r=e.firstChild;return r.$$input=e=>n(e.currentTarget.value),j(()=>r.value=t()),e})(),W(K,{get when(){return e.error},get children(){var t=Gl();return X(t,()=>e.error),t}})]}})}function Dd(e){let t=()=>e.store.sessions[e.sessionKey],n=N(()=>e.store.fleet().runtimes.find(t=>t.key===e.sessionKey)),[r,i]=k(ul(e.sessionKey)??``),[a,o]=k(`steer`),[s,c]=k(!1),[l,u]=k(!1),[d,f]=k(!1),[p,m]=k(``),[h,g]=k(!1),[_,v]=k(!1),[y,b]=k(!1),[x,S]=k(!1),[C,w]=k(!1),[T,E]=k(!1),[D,O]=k(!1),[A,P]=k(),[F,I]=k(),[L,ee]=k(0),[te,ne]=k(),[re,ie]=k(),[ae,B]=k(),[oe,V]=k(),[se,H]=k([]),[ce,le]=k(!1),[U,ue]=k(0),[de,fe]=k(),[pe,me]=k(),[he,ge]=k({steering:[],followUp:[]}),[_e,ve]=k([]),[ye,be]=k([]),[xe,Se]=k(),[Ce,we]=k(!1),[Te,Ee]=k([]),[De,Oe]=k(),[ke,J]=k(!1),[Ae,Me]=k([]),[Ne,Pe]=k(null),[Ie,Le]=k(!1),[Re,ze]=k(),[Be,Ve]=k(!1),[He,Ue]=k([]),[We,Ge]=k(!1),[Ke,qe]=k(),[Je,Ye]=k(!1),[Xe,Ze]=k(``),[Qe,$e]=k(),[et,tt]=k(!1),[it,at]=k(),ot,st,Z,ct,lt,ut,dt=!1,ft=()=>t()?.streaming??!1,pt=()=>t()?.compacting??!1,mt=()=>(t()?.statusEntries??[]).some(e=>e.key===`paused`),ht=()=>Object.values(t()?.backgroundAgents??{}).some(e=>e.status===`running`),gt=()=>ft()||pt()||mt()||ht(),_t=Mo({scroller:()=>ot});async function vt(t=!1){let[n,r,i]=await Promise.allSettled([Q.stats(e.sessionKey),Q.performance(e.sessionKey),Q.branch(e.sessionKey)]),a=t?await Promise.allSettled([Q.dailyCost()]):void 0;if(dt)return;n.status===`fulfilled`&&ne(n.value),r.status===`fulfilled`&&ie(r.value),i.status===`fulfilled`&&B(i.value.branch),a?.[0]?.status===`fulfilled`&&V(a[0].value.cost);let o=[n,r,i,...a??[]].find(e=>e.status===`rejected`);o?.status===`rejected`&&P(o.reason instanceof Error?o.reason.message:String(o.reason))}async function yt(){try{let{commands:t}=await Q.commands(e.sessionKey);dt||H(t)}catch(e){dt||P(e instanceof Error?e.message:String(e))}}async function bt(){E(!0),me(void 0);try{fe(await Q.resources(e.sessionKey))}catch(e){me(e instanceof Error?e.message:String(e))}}async function xt(){try{ge(await Q.pending(e.sessionKey))}catch(e){P(e instanceof Error?e.message:String(e))}}let St=new Set,Ct=async t=>{let n=typeof t.id==`string`?t.id:void 0;if(!(n&&St.has(n))){n&&St.add(n);try{await Q.extensionUiResponse(e.sessionKey,t),n&&e.store.resolveUiRequest(e.sessionKey,n)}catch(e){P(e instanceof Error?e.message:String(e))}finally{n&&St.delete(n)}}};function wt(e){let t=atob(e);return Uint8Array.from(t,e=>e.charCodeAt(0))}function Tt(e){let t=``,n=32768;for(let r=0;r<e.length;r+=n)t+=String.fromCharCode(...e.subarray(r,r+n));return btoa(t)}async function Et(e){return Tt(new Uint8Array(await e.arrayBuffer()))}function Dt(e){URL.revokeObjectURL(e.previewUrl)}function Ot(){for(let e of _e())Dt(e);ve([])}function kt(e){ve(t=>{let n=t[e];return n&&Dt(n),t.filter((t,n)=>n!==e)})}function At(e){if(_e().reduce((e,t)=>e+t.size,0)+e>zt)throw Error(`Images too large: total inline images exceed ${md(zt)}`)}function jt(e,t,n){return{blob:e,mimeType:t,fileName:n,size:e.size,previewUrl:URL.createObjectURL(e)}}function Mt(e,t,n){let r=wt(e.data);return jt(new Blob([r],{type:e.mimeType}),e.mimeType,`queued-image-${t+1}-${n+1}`)}function Nt(e){return[...e.steeringMessages??e.steering.map(e=>({text:e})),...e.followUpMessages??e.followUp.map(e=>({text:e}))]}function Pt(e){let t=[];for(let[n,r]of e.entries())for(let[e,i]of(r.images??[]).entries())t.push(Mt(i,n,e));return t}function Ft(e){for(let t of e)Dt(t)}function It(e){let t=e.map(e=>e.text).join(`
|
|
70
70
|
|
|
71
71
|
`),n=r();i([t,n].filter(e=>e.trim()).join(`
|
|
72
72
|
|
|
73
|
-
`))}async function Lt(){let t=[];try{let n=await Q.pending(e.sessionKey);t.push(...Pt(Nt(n))),At(t.reduce((e,t)=>e+t.size,0))}catch(e){Ft(t),P(e instanceof Error?e.message:String(e));return}Ft(t);let n=[],r=!1;try{let t=Nt(await Q.dequeue(e.sessionKey));ge({steering:[],followUp:[],steeringMessages:[],followUpMessages:[]}),It(t);try{n.push(...Pt(t)),At(n.reduce((e,t)=>e+t.size,0))}catch(e){throw Error(`Queued image restore failed after restoring text: ${e instanceof Error?e.message:String(e)}`)}n.length>0&&(ve(e=>[...n,...e]),r=!0),queueMicrotask(()=>Z?.focus())}catch(e){r||Ft(n),P(e instanceof Error?e.message:String(e))}}function Rt(e){if(!e.type.startsWith(`image/`))throw Error(`Not an image: ${e.name||e.type}`);if(e.size>rd)throw Error(`Image too large: ${e.name||e.type} exceeds 10MB`);return jt(e,e.type,e.name||`image`)}async function Bt(e){let t=[...e];if(t.length===0)return;let n=[];try{for(let e of t){if(!e.type.startsWith(`image/`))throw Error(`Not an image: ${e.name||e.type}`);if(e.size>rd)throw Error(`Image too large: ${e.name||e.type} exceeds 10MB`)}At(t.reduce((e,t)=>e+t.size,0));for(let e of t)n.push(Rt(e));ve(e=>[...e,...n])}catch(e){for(let e of n)Dt(e);P(e instanceof Error?e.message:String(e))}}async function Vt(e){let t=
|
|
74
|
-
`)),_e().length>0&&t.push([`Attached images included inline with this turn:`,..._e().map((e,t)=>`- image ${t+1}: ${e.fileName} (${
|
|
73
|
+
`))}async function Lt(){let t=[];try{let n=await Q.pending(e.sessionKey);t.push(...Pt(Nt(n))),At(t.reduce((e,t)=>e+t.size,0))}catch(e){Ft(t),P(e instanceof Error?e.message:String(e));return}Ft(t);let n=[],r=!1;try{let t=Nt(await Q.dequeue(e.sessionKey));ge({steering:[],followUp:[],steeringMessages:[],followUpMessages:[]}),It(t);try{n.push(...Pt(t)),At(n.reduce((e,t)=>e+t.size,0))}catch(e){throw Error(`Queued image restore failed after restoring text: ${e instanceof Error?e.message:String(e)}`)}n.length>0&&(ve(e=>[...n,...e]),r=!0),queueMicrotask(()=>Z?.focus())}catch(e){r||Ft(n),P(e instanceof Error?e.message:String(e))}}function Rt(e){if(!e.type.startsWith(`image/`))throw Error(`Not an image: ${e.name||e.type}`);if(e.size>rd)throw Error(`Image too large: ${e.name||e.type} exceeds 10MB`);return jt(e,e.type,e.name||`image`)}async function Bt(e){let t=[...e];if(t.length===0)return;let n=[];try{for(let e of t){if(!e.type.startsWith(`image/`))throw Error(`Not an image: ${e.name||e.type}`);if(e.size>rd)throw Error(`Image too large: ${e.name||e.type} exceeds 10MB`)}At(t.reduce((e,t)=>e+t.size,0));for(let e of t)n.push(Rt(e));ve(e=>[...e,...n])}catch(e){for(let e of n)Dt(e);P(e instanceof Error?e.message:String(e))}}async function Vt(e){let t=dd(e,id);try{return await Q.listFiles(t),t}catch{return await Q.mkdir(e,id),t}}async function Ht(e){let t=[...e];if(t.length===0)return;let r=n()?.cwd;if(!r){P(`Cannot attach files until the runtime is loaded.`);return}P(void 0);try{let e=await Vt(r),n=[];for(let[r,i]of t.entries()){let t=pd(i,r),a=await Q.upload(e,new File([i],t,{type:i.type}),!1);n.push({fileName:i.name||t,size:i.size,mimeType:i.type||`application/octet-stream`,path:a.path})}be(e=>[...e,...n])}catch(e){P(e instanceof Error?e.message:String(e))}}async function Ut(){J(!0),ze(void 0),Me([]),Le(!0);try{let t=await Q.tree(e.sessionKey);Me(t.roots),Pe(t.leafId)}catch(e){ze(e instanceof Error?e.message:String(e))}finally{Le(!1)}}async function Wt(t){ze(void 0);try{let n=await Q.navigateTree(e.sessionKey,t);if(n.cancelled)return;n.editorText&&i(n.editorText),await e.store.hydrateSession(e.sessionKey),J(!1)}catch(e){ze(e instanceof Error?e.message:String(e))}}async function Gt(){Ve(!0),qe(void 0),Ue([]),Ge(!0);try{Ue((await Q.runtimeSessions(e.sessionKey)).sessions)}catch(e){qe(e instanceof Error?e.message:String(e))}finally{Ge(!1)}}async function Kt(t){qe(void 0);try{if((await Q.resume(e.sessionKey,t)).cancelled)return;await e.store.hydrateSession(e.sessionKey),await e.store.refreshDiskSessions(),Ve(!1)}catch(e){qe(e instanceof Error?e.message:String(e))}}async function qt(t){$e(void 0);try{if((await Q.importJsonl(e.sessionKey,t)).cancelled)return;await e.store.hydrateSession(e.sessionKey),await e.store.refreshDiskSessions(),Ye(!1)}catch(e){$e(e instanceof Error?e.message:String(e))}}async function Jt(){we(!0),Oe(void 0),Ee([]);try{let{messages:t}=await Q.forkMessages(e.sessionKey);Ee(t)}catch(e){Oe(e instanceof Error?e.message:String(e))}}async function Yt(t){Oe(void 0);try{let n=await Q.fork(e.sessionKey,t);n.cancelled||i(n.text),await e.store.hydrateSession(e.sessionKey),await e.store.refreshDiskSessions(),we(!1)}catch(e){Oe(e instanceof Error?e.message:String(e))}}async function Xt(){tt(!0),at(void 0);try{ne(await Q.stats(e.sessionKey))}catch(e){at(e instanceof Error?e.message:String(e))}}R(()=>{let t=new AbortController;e.store.hydrateSession(e.sessionKey,t.signal).catch(e=>{t.signal.aborted&&sl(e)||P(e instanceof Error?e.message:String(e))}),vt(!0),yt(),xt();let n=setInterval(()=>void vt(!1),5e3);z(()=>{dt=!0,t.abort(),clearInterval(n)})});let Zt=e=>{if(!et())return;let t=e.target;t&&ut?.contains(t)||tt(!1)},Qt=e=>{e.key===`Escape`&&tt(!1)};document.addEventListener(`mousedown`,Zt),document.addEventListener(`keydown`,Qt),z(()=>{document.removeEventListener(`mousedown`,Zt),document.removeEventListener(`keydown`,Qt)});let $t=setInterval(()=>{let e=t()?.workingSince;ee(e?Math.floor((Date.now()-e)/1e3):0)},1e3);z(()=>{clearInterval($t),_t.dispose(),Ot()}),M(()=>{let e=t()?.composerPrefill;e&&i(e)}),M(()=>{r(),Z&&queueMicrotask(()=>Z&&_d(Z))}),M(()=>{e.store.revisions[e.sessionKey],t()?.entries.length,_t.notifyContentChanged()}),R(()=>{_t.observeContent(st),_t.observeViewport(ot),ot&&z(Po(_t,ot,{keyboard:`window`}))});let en=!1;M(()=>{let e=ft();en&&!e&&vt(!0),en!==e&&xt(),en=e}),M(()=>{n()?.state.pendingMessageCount,xt()}),M(()=>{dl(e.sessionKey,r())});function tn(e){let t=[];return ye().length>0&&t.push([`Attached files uploaded to the host (paths only; inspect deliberately if needed):`,...ye().map(e=>`- ${e.path} (${e.fileName}, ${md(e.size)}, ${e.mimeType||`unknown type`})`)].join(`
|
|
74
|
+
`)),_e().length>0&&t.push([`Attached images included inline with this turn:`,..._e().map((e,t)=>`- image ${t+1}: ${e.fileName} (${md(e.size)}, ${e.mimeType})`)].join(`
|
|
75
75
|
`)),[e,...t].filter(e=>e.trim()).join(`
|
|
76
76
|
|
|
77
|
-
`)}function nn(e,t,n=`/${e}`){return t?(I(`Usage: ${n}`),!0):!1}function rn(){let t=document.createElement(`a`);t.href=Q.exportHtmlUrl(e.sessionKey),t.download=``,document.body.append(t),t.click(),t.remove()}let an={settings:async t=>{nn(`settings`,t)||e.store.navigate({screen:`settings`})},"scoped-models":async t=>{if(nn(`scoped-models`,t))return;let r=n()?.cwd;if(!r)throw Error(`Cannot open scoped models: the runtime project directory is unavailable`);e.store.navigate({screen:`settings`,target:`scoped-models`,cwd:r})},model:async e=>{m(e),f(!0)},export:async e=>{nn(`export`,e)||rn()},import:async e=>{Ze(e),$e(void 0),Ye(!0)},name:async t=>{t?await Q.rename(e.sessionKey,t):w(!0)},session:async e=>{nn(`session`,e)||(v(!1),await Xt())},fork:async e=>{nn(`fork`,e)||await Jt()},tree:async e=>{nn(`tree`,e)||await Ut()},new:async t=>{if(!nn(`new`,t)){if(ft()||pt()){I(`Wait for the current operation to finish before starting a new session.`);return}(await Q.newSession(e.sessionKey)).cancelled?I(`New session cancelled.`):(await e.store.hydrateSession(e.sessionKey),await e.store.refreshDiskSessions())}},compact:async t=>{t?(await Q.compact(e.sessionKey,t),I(`Compaction started.`)):S(!0)},dream:async t=>{let n=await Q.dream(e.sessionKey,t||void 0);I(n.message)},resume:async e=>{nn(`resume`,e)||await Gt()},reload:async t=>{if(nn(`reload`,t))return;if(ft()||pt()){I(`Wait for the current operation to finish before reloading.`);return}await Q.reload(e.sessionKey);let[{commands:n}]=await Promise.all([Q.commands(e.sessionKey),e.store.hydrateSession(e.sessionKey)]);H(n),I(`Reloaded extensions, skills, prompts, themes, and settings.`)},quit:async e=>{nn(`quit`,e)||await cn()}};async function on(){let t=r().trim();if(!t&&ye().length===0&&_e().length===0)return;P(void 0),I(void 0);let n=il(t,se());if(n){if(ye().length>0||_e().length>0){I(`Remove attachments before running a built-in command; nothing was sent or discarded.`);return}try{await al(n,an,I),i(``),Se(void 0)}catch(e){P(e instanceof Error?e.message:String(e))}return}let o=tn(t||`Please review the attached item(s). `);try{let t=_e(),n=t.length>0?await Promise.all(t.map(async({blob:e,mimeType:t})=>({data:await Et(e),mimeType:t}))):void 0;ft()?await Q.prompt(e.sessionKey,o,a(),n):n?await Q.prompt(e.sessionKey,o,void 0,n):await Q.prompt(e.sessionKey,o),pl(e.sessionKey,o),Se(void 0),i(``),Ot(),be([]),xt()}catch(e){P(e instanceof Error?e.message:String(e))}}async function sn(){c(!0);try{await Q.abort(e.sessionKey),await Lt()}catch(e){P(e instanceof Error?e.message:String(e))}finally{c(!1)}}async function cn(){if(!l()){u(!0),P(void 0);try{await Q.stopRuntime(e.sessionKey),await e.store.removeRuntime(e.sessionKey),e.store.navigate({screen:`fleet`})}catch(e){P(e instanceof Error?e.message:String(e))}finally{u(!1)}}}async function ln(t){try{t===`compaction`?await Q.abortCompaction(e.sessionKey):t===`retry`&&await Q.abortRetry(e.sessionKey)}catch(e){P(e instanceof Error?e.message:String(e))}}function un(e){ot?.querySelectorAll(`details.tool`).forEach(t=>{t.open=e})}let dn=()=>Object.values(t()?.backgroundAgents??{}).filter(e=>e.status===`running`),fn=()=>Object.values(t()?.backgroundAgents??{}).filter(e=>e.status!==`running`),pn=()=>Object.values(t()?.backgroundAgents??{}).sort((e,t)=>Date.parse(t.startedAt)-Date.parse(e.startedAt)),mn=()=>t()?.tasks??[],hn=()=>mn().filter(e=>e.status===`completed`).length,gn=()=>n()?.state.contextUsage??te()?.contextUsage,_n=()=>typeof window.matchMedia==`function`&&window.matchMedia(`(max-width: 700px)`).matches,vn=()=>t()?.sessionName??n()?.state.sessionName,yn=()=>vn()??t()?.title??e.sessionKey,bn=()=>{let e=n()?.cwd;if(!e)return;let t=ae();return`${cd(e)}${t?` (${t})`:``}`},xn=()=>{let e=bn(),t=vn();return e&&t?`${e} • ${t}`:e??t??`session`},Sn=()=>{let e=te()?.tokens;if(!e)return;let t=[];return e.input&&t.push(`↑${sd(e.input)}`),e.output&&t.push(`↓${sd(e.output)}`),e.cacheRead&&t.push(`R${sd(e.cacheRead)}`),e.cacheWrite&&t.push(`W${sd(e.cacheWrite)}`),t.length>0?t.join(` `):void 0},Cn=()=>{let e=te()?.cost??0,t=n()?.state.usingSubscription??!1;if(!e&&!t)return;let r=`$${e.toFixed(3)}${t?` (sub)`:``}`,i=oe();return i!==void 0&&i>e&&(r+=`, today: $${i.toFixed(2)}`),r},wn=()=>{let e=gn();if(e)return`ctx ${e.percent===null?`?`:`${e.percent.toFixed(0)}%`}/${sd(e.contextWindow)}`},Tn=()=>{let e=n()?.state.model;if(!e)return;let t=re()?.models.find(t=>t.provider===e.provider&&t.modelId===e.id);if(!(!t||t.count<3))return`${Math.round(t.median)} tok/s`},En=()=>[Sn(),Cn(),wn(),Tn()].filter(Boolean),Dn=()=>[...(he().steeringMessages??he().steering.map(e=>({text:e}))).map(e=>({kind:`steer`,text:e.images?.length?`${e.text} (${e.images.length} image(s))`:e.text})),...(he().followUpMessages??he().followUp.map(e=>({text:e}))).map(e=>({kind:`follow-up`,text:e.images?.length?`${e.text} (${e.images.length} image(s))`:e.text}))],On=()=>{let e=r();if(ce()||!e.startsWith(`/`))return;let t=e.slice(1);if(!/\s/.test(t))return t.toLowerCase()},kn=N(()=>{let e=On();return e===void 0?[]:ol(se(),e)}),An=()=>kn().length>0,jn=e=>{i(`/${e.name} `),le(!0),queueMicrotask(()=>Z?.focus())};return M(()=>{let e=kn().length;U()>=e&&ue(Math.max(0,e-1))}),(()=>{var c=zu(),u=c.firstChild,k=u.firstChild,M=k.firstChild.nextSibling,N=M.nextSibling,I=u.nextSibling,R=I.firstChild,z=I.nextSibling,ee=z.firstChild,ne=ee.firstChild;X(M,yn),X(k,W(K,{get when(){return!_()},get children(){var e=hu();return X(e,(()=>{var e=q(()=>!!n()?.cwd);return()=>e()?cd(n().cwd):void 0})()),e}}),N),X(k,W(nt,{get store(){return e.store},class:`session-connection-indicator`}),N),X(k,W(K,{get when(){return!_()},get children(){var t=_u(),r=t.firstChild,i=r.firstChild.nextSibling.nextSibling,a=r.nextSibling;a.firstChild.nextSibling;var o=a.nextSibling;return r.$$click=()=>f(!0),X(i,()=>ad(n()?.state.model)),a.$$click=async()=>{let t=n()?.state.thinkingLevel??`off`,r=nd[(nd.indexOf(t)+1)%nd.length];try{await Q.setThinking(e.sessionKey,r),e.store.setRuntimeThinkingLevel(e.sessionKey,r)}catch(e){P(e instanceof Error?e.message:String(e))}},X(a,()=>n()?.state.thinkingLevel??`—`,null),X(t,W(K,{get when(){return gn()},get children(){var e=gu();return e.firstChild.nextSibling,X(e,(()=>{var e=q(()=>gn().percent===null);return()=>e()?`?`:`${gn().percent.toFixed(0)}%`})(),null),e}}),o),o.$$click=()=>g(!h()),j(()=>Y(r,`title`,od(n()?.state.model))),t}}),N),N.$$click=()=>v(!_()),X(N,()=>_()?`details ▾`:`details ▴`),X(u,W(K,{get when(){return!_()},get children(){return[(()=>{var e=yu(),t=e.firstChild,n=t.nextSibling;return X(t,xn),n.$$click=Xt,X(n,W(G,{get each(){return En()},children:e=>(()=>{var t=Bu();return X(t,e),t})()})),X(e,W(K,{get when(){return et()},get children(){var e=vu(),t=ut;return typeof t==`function`?Fe(t,e):ut=e,X(e,W(K,{get when(){return it()},get children(){var e=Gl();return X(e,it),e}}),null),X(e,W(K,{get when(){return te()},get fallback(){return Vu()},children:e=>(()=>{var t=Hu(),n=t.firstChild.nextSibling,r=n.nextSibling.nextSibling,i=r.nextSibling.nextSibling,a=i.firstChild,o=i.nextSibling.nextSibling,s=o.firstChild,c=o.nextSibling.nextSibling,l=c.firstChild,u=c.nextSibling.nextSibling,d=u.nextSibling.nextSibling;return d.firstChild,X(n,()=>e().userMessages),X(r,()=>e().assistantMessages),X(i,()=>e().toolCalls,a),X(i,()=>e().toolResults,null),X(o,()=>sd(e().tokens.input),s),X(o,()=>sd(e().tokens.output),null),X(c,()=>sd(e().tokens.cacheRead),l),X(c,()=>sd(e().tokens.cacheWrite),null),X(u,()=>sd(e().tokens.total)),X(d,()=>e().cost.toFixed(4),null),t})()}),null),e}}),null),e})(),W(K,{get when(){return h()},get children(){var t=Su(),r=t.firstChild,i=r.nextSibling,a=i.nextSibling,o=a.nextSibling,s=o.nextSibling,c=s.nextSibling,u=c.nextSibling,d=u.nextSibling;return i.$$click=()=>S(!0),a.$$click=()=>un(!0),o.$$click=()=>un(!1),s.$$click=()=>w(!0),c.$$click=Jt,u.$$click=bt,X(t,W(K,{get when(){return _n()},get children(){return[(()=>{var e=bu();return e.firstChild,e.$$click=()=>f(!0),X(e,()=>ad(n()?.state.model),null),e})(),(()=>{var t=xu();return t.firstChild,t.$$click=async()=>{let t=n()?.state.thinkingLevel??`off`,r=nd[(nd.indexOf(t)+1)%nd.length];try{await Q.setThinking(e.sessionKey,r),e.store.setRuntimeThinkingLevel(e.sessionKey,r)}catch(e){P(e instanceof Error?e.message:String(e))}},X(t,()=>n()?.state.thinkingLevel??`—`,null),t})()]}}),d),d.$$click=cn,X(d,()=>l()?`stopping runtime…`:`stop runtime`),j(t=>{var n=Q.exportHtmlUrl(e.sessionKey),i=l();return n!==t.e&&Y(r,`href`,t.e=n),i!==t.t&&(d.disabled=t.t=i),t},{e:void 0,t:void 0}),t}})]}}),null),X(c,W(K,{get when(){return q(()=>!!(!_()&&n()?.state.modelFallbackMessage))()&&!D()},get children(){var e=Cu(),t=e.firstChild.firstChild;t.firstChild;var r=t.nextSibling;return X(t,()=>n().state.modelFallbackMessage,null),r.$$click=()=>O(!0),e}}),I);var re=ot;typeof re==`function`?Fe(re,I):ot=I;var ie=st;return typeof ie==`function`?Fe(ie,R):st=R,X(R,W(K,{get when(){return t()},get fallback(){return Uu()},get children(){return[W(G,{get each(){return t().widgets.above},children:e=>(()=>{var t=Wu();return X(t,e),t})()}),W(xc,{get entries(){return t().entries},get resetKey(){return e.sessionKey},get imageScope(){return{runtimeKey:e.sessionKey}}}),W(K,{get when(){return t().uiRequests.find(e=>e.method===`ask`)},children:e=>W(vd,{get request(){return e()},onRespond:Ct,onStop:()=>void sn(),get stopping(){return s()}})}),W(G,{get each(){return t().widgets.below},children:e=>(()=>{var t=Wu();return X(t,e),t})()})]}})),ne.$$click=()=>b(!y()),X(ne,()=>y()?`compose ▴`:`compose ▾`),X(ee,W(K,{get when(){return y()},get children(){var e=wu();return X(e,(()=>{var e=q(()=>!!gt());return()=>e()?`agent working — open controls to stop or steer`:q(()=>Dn().length>0)()?`${Dn().length} queued message(s)`:`composer hidden for transcript reading`})()),e}}),null),X(z,W(K,{get when(){return!y()},get children(){var n=Lu(),c=n.firstChild,l=c.firstChild,u=l.nextSibling,d=u.firstChild,f=d.nextSibling,p=f.nextSibling,m=p.nextSibling,h=m.nextSibling;X(n,W(K,{get when(){return mn().length>0},get children(){var e=Tu(),t=e.firstChild,n=t.firstChild.nextSibling,r=n.nextSibling.nextSibling;r.nextSibling;var i=t.nextSibling;return X(t,hn,n),X(t,()=>mn().length,r),X(i,W(G,{get each(){return mn()},children:e=>(()=>{var t=Gu(),n=t.firstChild;return X(t,(()=>{var t=q(()=>e.status===`completed`);return()=>t()?`☑`:e.status===`in_progress`?`⧖`:`☐`})(),n),X(t,()=>e.title,null),j(n=>{var r=e.status===`completed`,i=e.status===`in_progress`;return r!==n.e&&t.classList.toggle(`done`,n.e=r),i!==n.t&&t.classList.toggle(`active`,n.t=i),n},{e:void 0,t:void 0}),t})()})),j(()=>e.open=!_n()),e}}),c),X(n,W(K,{get when(){return dn().length+fn().length>0},get children(){var t=Eu(),n=t.firstChild,r=n.firstChild.nextSibling,i=r.nextSibling.nextSibling;i.nextSibling;var a=n.nextSibling;return X(n,()=>dn().length,r),X(n,()=>fn().length,i),X(a,W(G,{get each(){return pn()},children:t=>(()=>{var n=Ku(),r=n.firstChild,i=r.firstChild,a=i.nextSibling,o=a.firstChild;return r.$$click=()=>e.store.navigate({screen:`subagent`,key:e.sessionKey,agentId:t.agentId}),X(i,(()=>{var e=q(()=>t.status===`running`);return()=>e()?`●`:t.status===`completed`?`✓`:`✕`})()),X(a,()=>t.agentType,o),X(a,()=>t.taskSummary,null),X(a,W(K,{get when(){return t.arbitrations?.at(-1)},children:e=>e().status===`failure`?` · arbitration failed`:` · ${e().final?.model??e().proposed.model} @ ${e().final?.thinking??e().proposed.thinking}`}),null),j(()=>je(i,t.status===`running`?`live`:`done`)),n})()})),j(()=>t.open=!_n()),t}}),c),X(n,W(K,{get when(){return gt()||(t()?.statusEntries.length??0)>0||A()||F()},get children(){var e=ju();return X(e,W(K,{get when(){return ft()},get children(){var e=Du();return e.firstChild,X(e,(()=>{var e=q(()=>!!t()?.workingText);return()=>e()?` — ${t().workingText}`:``})(),null),X(e,(()=>{var e=q(()=>L()>2);return()=>e()?` (${L()}s)`:``})(),null),e}}),null),X(e,W(G,{get each(){return t()?.statusEntries??[]},children:e=>(()=>{var t=Bu();return X(t,()=>e.text,null),X(t,W(K,{get when(){return e.key===`compaction`||e.key===`retry`},get children(){var t=qu();return t.$$click=()=>ln(e.key),t}}),null),j(()=>je(t,e.tone===`info`?`queued`:e.tone)),t})()}),null),X(e,W(K,{get when(){return A()},get children(){var e=Ou();return X(e,A),e}}),null),X(e,W(K,{get when(){return F()},get children(){var e=ku();return X(e,F),e}}),null),X(e,W(K,{get when(){return gt()},get children(){var e=Au();return e.$$click=sn,X(e,()=>s()?`stopping…`:`■ stop`),j(()=>e.disabled=s()),e}}),null),e}}),c),X(c,W(K,{get when(){return Dn().length>0},get children(){var e=Mu(),t=e.firstChild;return X(e,W(G,{get each(){return Dn()},children:e=>(()=>{var t=Ju(),n=t.firstChild;return X(n,()=>e.kind),X(t,()=>e.text,null),j(()=>Y(t,`title`,e.text)),t})()}),t),t.$$click=Lt,e}}),l),X(c,W(K,{get when(){return ye().length>0||_e().length>0},get children(){var e=Nu();return X(e,W(G,{get each(){return ye()},children:(e,t)=>(()=>{var n=Yu(),r=n.firstChild;r.firstChild;var i=r.nextSibling,a=i.nextSibling;return X(r,()=>e.fileName,null),X(i,()=>fd(e.size)),a.$$click=()=>be(e=>e.filter((e,n)=>n!==t())),j(()=>Y(n,`title`,e.path)),n})()}),null),X(e,W(G,{get each(){return _e()},children:(e,t)=>(()=>{var n=Xu(),r=n.firstChild,i=r.nextSibling;return i.$$click=()=>kt(t()),j(t=>{var i=`${e.fileName} (${fd(e.size)})`,a=e.previewUrl,o=e.fileName;return i!==t.e&&Y(n,`title`,t.e=i),a!==t.t&&Y(r,`src`,t.t=a),o!==t.a&&Y(r,`alt`,t.a=o),t},{e:void 0,t:void 0,a:void 0}),n})()}),null),e}}),l),X(c,W(K,{get when(){return An()},get children(){var e=Pu();return X(e,W(G,{get each(){return kn()},children:(e,t)=>(()=>{var n=Qu(),r=n.firstChild;r.firstChild;var i=r.nextSibling;return n.$$click=()=>jn(e),n.addEventListener(`mouseenter`,()=>ue(t())),X(r,()=>e.name,null),X(n,W(K,{get when(){return e.description},get children(){var t=Zu();return X(t,()=>e.description),t}}),i),X(i,()=>e.source),j(e=>{var r=`command-option-${t()}`,i=U()===t(),a=U()===t();return r!==e.e&&Y(n,`id`,e.e=r),i!==e.t&&Y(n,`aria-selected`,e.t=i),a!==e.a&&n.classList.toggle(`selected`,e.a=a),e},{e:void 0,t:void 0,a:void 0}),n})()})),e}}),l),l.$$keydown=t=>{if(An()){if(t.key===`ArrowDown`){t.preventDefault(),ue((U()+1)%kn().length);return}if(t.key===`ArrowUp`){t.preventDefault(),ue((U()-1+kn().length)%kn().length);return}if(t.key===`Tab`||t.key===`Enter`&&!t.shiftKey&&!_n()){t.preventDefault();let e=kn()[U()];e&&t.key===`Enter`&&r()===`/${e.name}`?(le(!0),on()):e&&jn(e);return}if(t.key===`Escape`){t.preventDefault(),le(!0);return}}if((t.key===`ArrowUp`||t.key===`ArrowDown`)&&(r()===``||xe()!==void 0)){let n=fl(e.sessionKey);if(n.length>0){if(t.preventDefault(),t.key===`ArrowUp`){let e=xe()===void 0?n.length-1:Math.max(0,xe()-1);Se(e),i(n[e]??``)}else if(xe()!==void 0){let e=xe()+1;e>=n.length?(Se(void 0),i(``)):(Se(e),i(n[e]??``))}}return}t.key===`Enter`&&!t.shiftKey&&!_n()&&(t.preventDefault(),on())},l.$$input=e=>{le(!1),ue(0),Se(void 0),i(e.currentTarget.value),hd(e.currentTarget)},l.addEventListener(`paste`,e=>{let t=[...e.clipboardData?.items??[]].filter(e=>e.type.startsWith(`image/`)).map(e=>e.getAsFile()).filter(e=>!!e);t.length>0&&(e.preventDefault(),Bt(t))});var g=Z;typeof g==`function`?Fe(g,l):Z=l,d.addEventListener(`change`,e=>{Ht(e.currentTarget.files??[]),e.currentTarget.value=``});var _=ct;typeof _==`function`?Fe(_,d):ct=d,f.addEventListener(`change`,e=>{Bt(e.currentTarget.files??[]),e.currentTarget.value=``});var v=lt;return typeof v==`function`?Fe(v,f):lt=f,p.$$click=()=>ct?.click(),m.$$click=()=>lt?.click(),X(u,W(K,{get when(){return ft()},get children(){var e=Fu(),t=e.firstChild,n=t.nextSibling;return t.$$click=()=>o(`steer`),n.$$click=()=>o(`follow_up`),j(e=>{var r=a()===`steer`,i=a()===`follow_up`;return r!==e.e&&t.classList.toggle(`selected`,e.e=r),i!==e.t&&n.classList.toggle(`selected`,e.t=i),e},{e:void 0,t:void 0}),e}}),h),X(u,W(K,{get when(){return t()?.suggestedCommand},get children(){var e=Iu(),n=e.firstChild.nextSibling;return e.$$click=()=>i(t().suggestedCommand),X(n,()=>t().suggestedCommand),e}}),h),h.$$click=on,j(e=>{var t=ft()?`Message dreb — sends as steer while it works…`:`Message dreb…`,n=An()?`command-listbox`:void 0,r=An()?`command-option-${U()}`:void 0;return t!==e.e&&Y(l,`placeholder`,e.e=t),n!==e.t&&Y(l,`aria-controls`,e.t=n),r!==e.a&&Y(l,`aria-activedescendant`,e.a=r),e},{e:void 0,t:void 0,a:void 0}),j(()=>l.value=r()),n}}),null),X(c,W(K,{get when(){return t()?.uiRequests.find(e=>e.method!==`ask`)},keyed:!0,children:e=>W(gd,{request:e,onRespond:Ct})}),null),X(c,W(K,{get when(){return d()},get children(){return W(bd,{get sessionKey(){return e.sessionKey},get state(){return n()?.state},get initialFilter(){return p()},onClose:()=>{f(!1),m(``)},onSelected:t=>e.store.setRuntimeModel(e.sessionKey,t)})}}),null),X(c,W(K,{get when(){return x()},get children(){return W(rt,{title:`compact context`,onDismiss:()=>S(!1),get actions(){return[(()=>{var e=yl();return e.$$click=()=>S(!1),e})(),(()=>{var t=$u();return t.$$click=async()=>{S(!1);try{await Q.compact(e.sessionKey)}catch(e){P(e instanceof Error?e.message:String(e))}},t})()]},get children(){return Ru()}})}}),null),X(c,W(K,{get when(){return T()},get children(){return W(yd,{get resources(){return de()},get error(){return pe()},onClose:()=>E(!1)})}}),null),X(c,W(K,{get when(){return Ce()},get children(){return W(rt,{title:`fork from message`,onDismiss:()=>we(!1),get children(){return[W(K,{get when(){return De()},get children(){var e=Gl();return X(e,De),e}}),W(K,{get when(){return Te().length>0},get fallback(){return ed()},get children(){var e=su();return X(e,W(G,{get each(){return Te()},children:e=>(()=>{var t=uu(),n=t.firstChild,r=n.nextSibling;return t.$$click=()=>Yt(e.entryId),X(n,()=>e.entryId),X(r,()=>e.text),t})()})),e}})]}})}}),null),X(c,W(K,{get when(){return ke()},get children(){return W(Sd,{get roots(){return Ae()},get leafId(){return Ne()},get loading(){return Ie()},get error(){return Re()},onClose:()=>J(!1),onNavigate:Wt})}}),null),X(c,W(K,{get when(){return Be()},get children(){return W(Cd,{get sessions(){return He()},get loading(){return We()},get error(){return Ke()},onClose:()=>Ve(!1),onResume:Kt})}}),null),X(c,W(K,{get when(){return Je()},get children(){return W(wd,{get initialPath(){return Xe()},get error(){return Qe()},onClose:()=>Ye(!1),onImport:qt})}}),null),X(c,W(K,{get when(){return C()},get children(){return W(Ed,{get current(){return vn()??``},onClose:()=>w(!1),onRename:async t=>{try{await Q.rename(e.sessionKey,t),w(!1)}catch(e){P(e instanceof Error?e.message:String(e))}}})}}),null),j(e=>{var t=!!_(),n=_()?`show session details`:`hide session details`,r=!!y(),i=y()?`show composer and controls`:`hide composer and controls`;return t!==e.e&&u.classList.toggle(`collapsed`,e.e=t),n!==e.t&&Y(N,`title`,e.t=n),r!==e.a&&z.classList.toggle(`collapsed`,e.a=r),i!==e.o&&Y(ne,`title`,e.o=i),e},{e:void 0,t:void 0,a:void 0,o:void 0}),c})()}function Ed(e){let[t,n]=k(e.current);return W(rt,{title:`rename session`,get onDismiss(){return e.onClose},get actions(){return[(()=>{var t=yl();return Me(t,`click`,e.onClose,!0),t})(),(()=>{var n=td();return n.$$click=()=>e.onRename(t().trim()),j(()=>n.disabled=!t().trim()),n})()]},get children(){var e=_l(),r=e.firstChild;return r.$$input=e=>n(e.currentTarget.value),j(()=>r.value=t()),e}})}Ae([`input`,`click`,`keydown`]);var Dd=J(`<div class=settings-error>`),Od=J(`<p class=muted>Loading scoped models…`),kd=J(`<section class="settings-section scoped-models-editor"tabindex=-1 aria-labelledby=scoped-models-heading><h2 id=scoped-models-heading>scoped models</h2><p class="muted small">Controls model cycling for new sessions only; running sessions are never changed. Writes always update global settings, while the selected context shows effective global-plus-project settings.</p><label class=scoped-models-context><span>project context</span><select><option value>global / home`),Ad=J(`<option>`),jd=J(`<div class=settings-warning>This project defines enabledModels in .dreb/settings.json and shadows global writes.`),Md=J(`<div class=scoped-models-toolbar><input type=search aria-label="Search available models"placeholder="search provider, model, or name…"><button type=button class="btn btn-small">enable all`),Nd=J(`<div class=scoped-models-grid><div class=scoped-models-order><h3>cycling order</h3><p class="muted small"></p></div><div class=scoped-models-available><h3>available models`),Pd=J(`<span class="muted small">unsaved changes`),Fd=J(`<span class="muted small">✓ saved`),Id=J(`<div class=scoped-models-actions><button type=button class="btn btn-small">reset</button><button type=button class="btn btn-primary btn-small">`),Ld=J(`<div class=settings-warning>`),Rd=J(`<div class=scoped-model-order-row><span></span><div class=scoped-model-move-controls><button type=button>↑</button><button type=button>↓`),zd=J(`<p class="muted small">No matching models.`),Bd=J(`<section class=scoped-model-provider><label class=scoped-model-provider-heading><input type=checkbox><span>`),Vd=J(`<span class=model-name>`),Hd=J(`<label class=scoped-model-choice><input type=checkbox><span class=model-id>`);function Ud(e){return`${e.provider}/${e.id}`}function Wd(e){let t=new Map;for(let n of e){let e=t.get(n.provider)??[];e.push(n),t.set(n.provider,e)}return[...t].map(([e,t])=>({provider:e,models:t}))}function Gd(e){let[t,n]=k(``),[r,i]=k(!0),[a,o]=k([]),[s,c]=k(!1),[l,u]=k(!1),[d,f]=k(!1),[p,m]=k(),[h,g]=k([]),_,v,y,b=()=>e.cwd??``,[x,{mutate:S}]=F(b,async e=>{let t=e||void 0,[n,r]=await Promise.all([Q.settings(t),Q.settingsModels(t)]);return{cwd:e,settings:n,models:r.models}}),C=N(()=>{if(x.error)return;let e=x();return e?.cwd===b()?e:void 0});function w(e,t){let n=e.enabledModels===void 0;i(n),o(n?t.map(Ud):e.resolvedScopedModels.map(e=>`${e.provider}/${e.id}`)),c(!1),f(!1),m(void 0),g([])}let T=b();M(()=>{let e=b();e!==T&&(T=e,v=void 0,y=void 0,c(!1),f(!1),m(void 0),g([]))}),M(()=>{let e=C();!e||e.cwd===v&&e.settings===y||(v=e.cwd,y=e.settings,w(e.settings,e.models))}),M(()=>{!e.focused||!_||(_.scrollIntoView({block:`start`}),_.focus({preventScroll:!0}))});let E=N(()=>new Set(a())),D=N(()=>{let t=new Set(e.projectRoots);return e.cwd&&t.add(e.cwd),[...t].sort((e,t)=>e.localeCompare(t))}),O=N(()=>{let e=t().trim().toLowerCase();return Wd((C()?.models??[]).filter(t=>!e||`${t.provider}/${t.id} ${t.name??``}`.toLowerCase().includes(e)))}),A=N(()=>{if((C()?.models.length??0)===0)return`No available models were reported for this context.`;if(!r()&&a().length===0)return`At least one model must remain enabled.`}),P=N(()=>{let e=C()?.settings;if(!e?.enabledModels)return;let t=e.resolvedScopedModels.map(e=>`${e.provider}/${e.id}`);return e.enabledModels.length===t.length&&e.enabledModels.every((e,n)=>e===t[n])&&e.scopeWarnings.length===0?void 0:`Saving an edited legacy scope replaces patterns and per-pattern thinking suffixes with exact provider/model references.`});function I(e){let t=C()?.models.map(Ud)??[],n=t.length>0&&t.every(t=>e.includes(t));i(n),o(n?t:e),c(!0),f(!1),m(void 0)}function L(e){let t=r()?C()?.models.map(Ud)??[]:a();I(t.includes(e)?t.filter(t=>t!==e):[...t,e])}function R(e){let t=(C()?.models??[]).filter(t=>t.provider===e).map(Ud),n=r()?C()?.models.map(Ud)??[]:a();I(t.every(e=>n.includes(e))?n.filter(e=>!t.includes(e)):[...n,...t.filter(e=>!n.includes(e))])}function z(e,t){if(r())return;let n=e+t;if(n<0||n>=a().length)return;let i=[...a()];[i[e],i[n]]=[i[n],i[e]],o(i),c(!0),f(!1)}function ee(){let e=C();e&&w(e.settings,e.models)}async function te(){let e=C();if(!e||!s()||A())return;u(!0),m(void 0),g([]),f(!1);let t=e.cwd||void 0;try{let n=await Q.saveSettings({enabledModels:r()?null:a()},t);if(b()!==e.cwd)return;v=e.cwd,y=n,S({cwd:e.cwd,settings:n,models:e.models}),w(n,e.models),g(n.warnings??[]),f(!0)}catch(t){b()===e.cwd&&m(t instanceof Error?t.message:String(t))}finally{u(!1)}}return(()=>{var i=kd(),o=i.firstChild.nextSibling.nextSibling.firstChild.nextSibling;o.firstChild;var c=_;return typeof c==`function`?Fe(c,i):_=i,o.addEventListener(`change`,t=>e.onCwdChange(t.currentTarget.value||void 0)),X(o,W(G,{get each(){return D()},children:e=>(()=>{var t=Ad();return t.value=e,X(t,e),t})()}),null),X(i,W(K,{get when(){return x.error},get children(){var e=Dd();return X(e,(()=>{var e=q(()=>x.error instanceof Error);return()=>e()?x.error.message:String(x.error)})()),e}}),null),X(i,W(K,{get when(){return x.loading},get children(){return Od()}}),null),X(i,W(K,{get when(){return C()},children:e=>[W(K,{get when(){return e().settings.hasProjectEnabledModelsOverride},get children(){return jd()}}),W(K,{get when(){return P()},children:e=>(()=>{var t=Ld();return X(t,e),t})()}),W(G,{get each(){return e().settings.scopeWarnings},children:e=>(()=>{var t=Ld();return X(t,()=>e.message),t})()}),W(G,{get each(){return h()},children:e=>(()=>{var t=Ld();return X(t,e),t})()}),W(K,{get when(){return p()},children:e=>(()=>{var t=Dd();return X(t,e),t})()}),W(K,{get when(){return A()},children:e=>(()=>{var t=Dd();return X(t,e),t})()}),(()=>{var i=Md(),a=i.firstChild,o=a.nextSibling;return a.$$input=e=>n(e.currentTarget.value),o.$$click=()=>I(e().models.map(Ud)),j(()=>o.disabled=r()),j(()=>a.value=t()),i})(),(()=>{var t=Nd(),n=t.firstChild,i=n.firstChild.nextSibling,o=n.nextSibling;return o.firstChild,X(i,(()=>{var e=q(()=>!!r());return()=>e()?`All available models, in registry order (future models included).`:`${a().length} enabled model${a().length===1?``:`s`}.`})()),X(n,W(G,{get each(){return a()},children:(e,t)=>(()=>{var n=Rd(),i=n.firstChild,o=i.nextSibling.firstChild,s=o.nextSibling;return Y(i,`title`,e),X(i,e),o.$$click=()=>z(t(),-1),Y(o,`aria-label`,`Move ${e} up`),s.$$click=()=>z(t(),1),Y(s,`aria-label`,`Move ${e} down`),j(e=>{var n=r()||t()===0,i=r()||t()===a().length-1;return n!==e.e&&(o.disabled=e.e=n),i!==e.t&&(s.disabled=e.t=i),e},{e:void 0,t:void 0}),n})()}),null),X(o,W(K,{get when(){return O().length>0},get fallback(){return zd()},get children(){return W(G,{get each(){return O()},children:t=>(()=>{var n=Bd(),r=n.firstChild.firstChild,i=r.nextSibling;return r.addEventListener(`change`,()=>R(t.provider)),X(i,()=>t.provider),X(n,W(G,{get each(){return t.models},children:e=>{let t=Ud(e);return(()=>{var n=Hd(),r=n.firstChild,i=r.nextSibling;return Y(n,`title`,t),r.addEventListener(`change`,()=>L(t)),X(i,()=>e.id),X(n,W(K,{get when(){return e.name},get children(){var t=Vd();return X(t,()=>e.name),t}}),null),j(()=>r.checked=E().has(t)),n})()}}),null),j(()=>r.checked=e().models.filter(e=>e.provider===t.provider).every(e=>E().has(Ud(e)))),n})()})}}),null),t})(),(()=>{var e=Id(),t=e.firstChild,n=t.nextSibling;return t.$$click=ee,n.$$click=()=>void te(),X(n,()=>l()?`saving…`:`save`),X(e,W(K,{get when(){return s()},get children(){return Pd()}}),null),X(e,W(K,{get when(){return d()},get children(){return Fd()}}),null),j(e=>{var r=!s()||l(),i=!s()||l()||!!A();return r!==e.e&&(t.disabled=e.e=r),i!==e.t&&(n.disabled=e.t=i),e},{e:void 0,t:void 0}),e})()]}),null),j(()=>o.value=e.cwd??``),i})()}Ae([`input`,`click`]);var Kd=[{id:`default`,label:`entropist.ca`},{id:`dim`,label:`Dim`},{id:`solarized`,label:`Solarized`},{id:`gruvbox`,label:`Gruvbox`},{id:`qud`,label:`Caves of Qud`},{id:`vangogh`,label:`Van Gogh`},{id:`okabe`,label:`Colorblind-safe (Okabe-Ito)`},{id:`tol`,label:`Colorblind-safe (Paul Tol)`}],qd=Kd.map(e=>e.id),Jd=[`system`,`light`,`dark`],Yd=`dreb.dashboard.theme`,Xd=`dreb.dashboard.colorMode`,Zd=`default`,Qd=`system`;function $d(e){return typeof e==`string`&&qd.includes(e)}function ef(e){return typeof e==`string`&&Jd.includes(e)}function tf(){if(typeof window>`u`)return Zd;try{let e=window.localStorage.getItem(Yd);return $d(e)?e:Zd}catch{return Zd}}function nf(){if(typeof window>`u`)return Qd;try{let e=window.localStorage.getItem(Xd);return ef(e)?e:Qd}catch{return Qd}}function rf(e,t,n){if(!(typeof window>`u`))try{t===n?window.localStorage.removeItem(e):window.localStorage.setItem(e,t)}catch{}}var[af,of]=k(tf()),[sf,cf]=k(nf()),lf=af,uf=sf;function df(e){let t=e.defaultView??(typeof window<`u`?window:void 0);return!t||typeof t.getComputedStyle!=`function`?``:t.getComputedStyle(e.documentElement).getPropertyValue(`--bg`).trim()}function ff(e){try{let t=e??(typeof document<`u`?document:void 0);if(!t)return;let n=t.documentElement;if(!n)return;let r=af(),i=sf();if(r===Zd?n.removeAttribute(`data-theme`):n.setAttribute(`data-theme`,r),i===Qd?n.removeAttribute(`data-color-mode`):n.setAttribute(`data-color-mode`,i),!(r!==Zd||i!==Qd))n.style.removeProperty(`color-scheme`);else{let e=i===`light`?`light`:i===`dark`?`dark`:`light dark`;n.style.setProperty(`color-scheme`,e)}}catch{}}function pf(e){try{let t=e??(typeof document<`u`?document:void 0);if(!t)return;let n=df(t);if(!n)return;let r=t.querySelector(`meta[name="theme-color"]:not([media])`);if(!r){r=t.createElement(`meta`),r.setAttribute(`name`,`theme-color`);let e=t.head??t.getElementsByTagName(`head`)[0];e&&e.insertBefore(r,e.firstChild)}r.setAttribute(`content`,n)}catch{}}function mf(e){let t=$d(e)?e:Zd;of(t),rf(Yd,t,Zd),ff(),pf()}function hf(e){let t=ef(e)?e:Qd;cf(t),rf(Xd,t,Qd),ff(),pf()}var gf=null,_f=!1;function vf(){sf()===Qd&&pf()}function yf(e){e.key!==null&&e.key!==`dreb.dashboard.theme`&&e.key!==`dreb.dashboard.colorMode`||bf()}function bf(){of(tf()),cf(nf()),ff(),pf()}function xf(){if(!(typeof window>`u`)){try{typeof window.matchMedia==`function`&&(gf=window.matchMedia(`(prefers-color-scheme: dark)`),typeof gf.addEventListener==`function`?gf.addEventListener(`change`,vf):typeof gf.addListener==`function`&&gf.addListener(vf))}catch{}try{window.addEventListener(`storage`,yf)}catch{}}}function Sf(){bf(),!_f&&(_f=!0,xf())}var Cf=J(`<div class=appearance-controls><div class=setting-row><span class=setting-label><span class=name>color mode</span><span class=hint>this browser only — “system” follows your OS light/dark preference</span></span><span class=setting-control><select id=pref-color-mode></select></span></div><div class=theme-gallery>`),wf=J(`<option>`),Tf=J(`<button type=button class=theme-card><div class=theme-card-preview><div class=theme-card-swatch><span class=theme-card-name></span><span class=theme-card-muted>The quick brown fox.</span></div><div class=theme-card-chips></div><pre class=theme-card-code><code class=hljs><span class=hljs-keyword>const</span> <span class=hljs-variable>count</span><span class=hljs-operator> = </span><span class=hljs-number>42</span><span class=hljs-punctuation>;</span>
|
|
77
|
+
`)}function nn(e,t,n=`/${e}`){return t?(I(`Usage: ${n}`),!0):!1}function rn(){let t=document.createElement(`a`);t.href=Q.exportHtmlUrl(e.sessionKey),t.download=``,document.body.append(t),t.click(),t.remove()}let an={settings:async t=>{nn(`settings`,t)||e.store.navigate({screen:`settings`})},"scoped-models":async t=>{if(nn(`scoped-models`,t))return;let r=n()?.cwd;if(!r)throw Error(`Cannot open scoped models: the runtime project directory is unavailable`);e.store.navigate({screen:`settings`,target:`scoped-models`,cwd:r})},model:async e=>{m(e),f(!0)},export:async e=>{nn(`export`,e)||rn()},import:async e=>{Ze(e),$e(void 0),Ye(!0)},name:async t=>{t?await Q.rename(e.sessionKey,t):w(!0)},session:async e=>{nn(`session`,e)||(v(!1),await Xt())},fork:async e=>{nn(`fork`,e)||await Jt()},tree:async e=>{nn(`tree`,e)||await Ut()},new:async t=>{if(!nn(`new`,t)){if(ft()||pt()){I(`Wait for the current operation to finish before starting a new session.`);return}(await Q.newSession(e.sessionKey)).cancelled?I(`New session cancelled.`):(await e.store.hydrateSession(e.sessionKey),await e.store.refreshDiskSessions())}},compact:async t=>{t?(await Q.compact(e.sessionKey,t),I(`Compaction started.`)):S(!0)},dream:async t=>{let n=await Q.dream(e.sessionKey,t||void 0);I(n.message)},resume:async e=>{nn(`resume`,e)||await Gt()},reload:async t=>{if(nn(`reload`,t))return;if(ft()||pt()){I(`Wait for the current operation to finish before reloading.`);return}await Q.reload(e.sessionKey);let[{commands:n}]=await Promise.all([Q.commands(e.sessionKey),e.store.hydrateSession(e.sessionKey)]);H(n),I(`Reloaded extensions, skills, prompts, themes, and settings.`)},quit:async e=>{nn(`quit`,e)||await cn()}};async function on(){let t=r().trim();if(!t&&ye().length===0&&_e().length===0)return;P(void 0),I(void 0);let n=il(t,se());if(n){if(ye().length>0||_e().length>0){I(`Remove attachments before running a built-in command; nothing was sent or discarded.`);return}try{await al(n,an,I),i(``),Se(void 0)}catch(e){P(e instanceof Error?e.message:String(e))}return}let o=tn(t||`Please review the attached item(s). `);try{let t=_e(),n=t.length>0?await Promise.all(t.map(async({blob:e,mimeType:t})=>({data:await Et(e),mimeType:t}))):void 0;ft()?await Q.prompt(e.sessionKey,o,a(),n):n?await Q.prompt(e.sessionKey,o,void 0,n):await Q.prompt(e.sessionKey,o),pl(e.sessionKey,o),Se(void 0),i(``),Ot(),be([]),xt()}catch(e){P(e instanceof Error?e.message:String(e))}}async function sn(){c(!0);try{await Q.abort(e.sessionKey),await Lt()}catch(e){P(e instanceof Error?e.message:String(e))}finally{c(!1)}}async function cn(){if(!l()){u(!0),P(void 0);try{await Q.stopRuntime(e.sessionKey),await e.store.removeRuntime(e.sessionKey),e.store.navigate({screen:`fleet`})}catch(e){P(e instanceof Error?e.message:String(e))}finally{u(!1)}}}async function ln(t){try{t===`compaction`?await Q.abortCompaction(e.sessionKey):t===`retry`&&await Q.abortRetry(e.sessionKey)}catch(e){P(e instanceof Error?e.message:String(e))}}function un(e){ot?.querySelectorAll(`details.tool`).forEach(t=>{t.open=e})}let dn=()=>Object.values(t()?.backgroundAgents??{}).filter(e=>e.status===`running`),fn=()=>Object.values(t()?.backgroundAgents??{}).filter(e=>e.status!==`running`),pn=()=>Object.values(t()?.backgroundAgents??{}).sort((e,t)=>Date.parse(t.startedAt)-Date.parse(e.startedAt)),mn=()=>t()?.tasks??[],hn=()=>mn().filter(e=>e.status===`completed`).length,gn=()=>n()?.state.contextUsage??te()?.contextUsage,_n=()=>typeof window.matchMedia==`function`&&window.matchMedia(`(max-width: 700px)`).matches,vn=()=>t()?.sessionName??n()?.state.sessionName,yn=()=>vn()??t()?.title??e.sessionKey,bn=()=>{let e=n()?.cwd;if(!e)return;let t=ae();return`${ud(e)}${t?` (${t})`:``}`},xn=()=>{let e=bn(),t=vn();return e&&t?`${e} • ${t}`:e??t??`session`},Sn=()=>{let e=te()?.tokens;if(!e)return;let t=[];return e.input&&t.push(`↑${sd(e.input)}`),e.output&&t.push(`↓${sd(e.output)}`),e.cacheRead&&t.push(`R${sd(e.cacheRead)}`),e.cacheWrite&&t.push(`W${sd(e.cacheWrite)}`),t.length>0?t.join(` `):void 0},Cn=()=>{let e=te()?.cost??0,t=n()?.state.usingSubscription??!1;if(!e&&!t)return;let r=`$${e.toFixed(3)}${t?` (sub)`:``}`,i=oe();return i!==void 0&&i>e&&(r+=`, today: $${i.toFixed(2)}`),r},wn=()=>{let e=gn();if(e)return`ctx ${e.percent===null?`?`:`${e.percent.toFixed(0)}%`}/${sd(e.contextWindow)}`},Tn=()=>ld(re(),n()?.state.model),En=()=>[Sn(),Cn(),wn(),Tn()].filter(Boolean),Dn=()=>[...(he().steeringMessages??he().steering.map(e=>({text:e}))).map(e=>({kind:`steer`,text:e.images?.length?`${e.text} (${e.images.length} image(s))`:e.text})),...(he().followUpMessages??he().followUp.map(e=>({text:e}))).map(e=>({kind:`follow-up`,text:e.images?.length?`${e.text} (${e.images.length} image(s))`:e.text}))],On=()=>{let e=r();if(ce()||!e.startsWith(`/`))return;let t=e.slice(1);if(!/\s/.test(t))return t.toLowerCase()},kn=N(()=>{let e=On();return e===void 0?[]:ol(se(),e)}),An=()=>kn().length>0,jn=e=>{i(`/${e.name} `),le(!0),queueMicrotask(()=>Z?.focus())};return M(()=>{let e=kn().length;U()>=e&&ue(Math.max(0,e-1))}),(()=>{var c=zu(),u=c.firstChild,k=u.firstChild,M=k.firstChild.nextSibling,N=M.nextSibling,I=u.nextSibling,R=I.firstChild,z=I.nextSibling,ee=z.firstChild,ne=ee.firstChild;X(M,yn),X(k,W(K,{get when(){return!_()},get children(){var e=hu();return X(e,(()=>{var e=q(()=>!!n()?.cwd);return()=>e()?ud(n().cwd):void 0})()),e}}),N),X(k,W(nt,{get store(){return e.store},class:`session-connection-indicator`}),N),X(k,W(K,{get when(){return!_()},get children(){var t=_u(),r=t.firstChild,i=r.firstChild.nextSibling.nextSibling,a=r.nextSibling;a.firstChild.nextSibling;var o=a.nextSibling;return r.$$click=()=>f(!0),X(i,()=>ad(n()?.state.model)),a.$$click=async()=>{let t=n()?.state.thinkingLevel??`off`,r=nd[(nd.indexOf(t)+1)%nd.length];try{await Q.setThinking(e.sessionKey,r),e.store.setRuntimeThinkingLevel(e.sessionKey,r)}catch(e){P(e instanceof Error?e.message:String(e))}},X(a,()=>n()?.state.thinkingLevel??`—`,null),X(t,W(K,{get when(){return gn()},get children(){var e=gu();return e.firstChild.nextSibling,X(e,(()=>{var e=q(()=>gn().percent===null);return()=>e()?`?`:`${gn().percent.toFixed(0)}%`})(),null),e}}),o),o.$$click=()=>g(!h()),j(()=>Y(r,`title`,od(n()?.state.model))),t}}),N),N.$$click=()=>v(!_()),X(N,()=>_()?`details ▾`:`details ▴`),X(u,W(K,{get when(){return!_()},get children(){return[(()=>{var e=yu(),t=e.firstChild,n=t.nextSibling;return X(t,xn),n.$$click=Xt,X(n,W(G,{get each(){return En()},children:e=>(()=>{var t=Bu();return X(t,e),t})()})),X(e,W(K,{get when(){return et()},get children(){var e=vu(),t=ut;return typeof t==`function`?Fe(t,e):ut=e,X(e,W(K,{get when(){return it()},get children(){var e=Gl();return X(e,it),e}}),null),X(e,W(K,{get when(){return te()},get fallback(){return Vu()},children:e=>(()=>{var t=Hu(),n=t.firstChild.nextSibling,r=n.nextSibling.nextSibling,i=r.nextSibling.nextSibling,a=i.firstChild,o=i.nextSibling.nextSibling,s=o.firstChild,c=o.nextSibling.nextSibling,l=c.firstChild,u=c.nextSibling.nextSibling,d=u.nextSibling.nextSibling;return d.firstChild,X(n,()=>e().userMessages),X(r,()=>e().assistantMessages),X(i,()=>e().toolCalls,a),X(i,()=>e().toolResults,null),X(o,()=>sd(e().tokens.input),s),X(o,()=>sd(e().tokens.output),null),X(c,()=>sd(e().tokens.cacheRead),l),X(c,()=>sd(e().tokens.cacheWrite),null),X(u,()=>sd(e().tokens.total)),X(d,()=>e().cost.toFixed(4),null),t})()}),null),e}}),null),e})(),W(K,{get when(){return h()},get children(){var t=Su(),r=t.firstChild,i=r.nextSibling,a=i.nextSibling,o=a.nextSibling,s=o.nextSibling,c=s.nextSibling,u=c.nextSibling,d=u.nextSibling;return i.$$click=()=>S(!0),a.$$click=()=>un(!0),o.$$click=()=>un(!1),s.$$click=()=>w(!0),c.$$click=Jt,u.$$click=bt,X(t,W(K,{get when(){return _n()},get children(){return[(()=>{var e=bu();return e.firstChild,e.$$click=()=>f(!0),X(e,()=>ad(n()?.state.model),null),e})(),(()=>{var t=xu();return t.firstChild,t.$$click=async()=>{let t=n()?.state.thinkingLevel??`off`,r=nd[(nd.indexOf(t)+1)%nd.length];try{await Q.setThinking(e.sessionKey,r),e.store.setRuntimeThinkingLevel(e.sessionKey,r)}catch(e){P(e instanceof Error?e.message:String(e))}},X(t,()=>n()?.state.thinkingLevel??`—`,null),t})()]}}),d),d.$$click=cn,X(d,()=>l()?`stopping runtime…`:`stop runtime`),j(t=>{var n=Q.exportHtmlUrl(e.sessionKey),i=l();return n!==t.e&&Y(r,`href`,t.e=n),i!==t.t&&(d.disabled=t.t=i),t},{e:void 0,t:void 0}),t}})]}}),null),X(c,W(K,{get when(){return q(()=>!!(!_()&&n()?.state.modelFallbackMessage))()&&!D()},get children(){var e=Cu(),t=e.firstChild.firstChild;t.firstChild;var r=t.nextSibling;return X(t,()=>n().state.modelFallbackMessage,null),r.$$click=()=>O(!0),e}}),I);var re=ot;typeof re==`function`?Fe(re,I):ot=I;var ie=st;return typeof ie==`function`?Fe(ie,R):st=R,X(R,W(K,{get when(){return t()},get fallback(){return Uu()},get children(){return[W(G,{get each(){return t().widgets.above},children:e=>(()=>{var t=Wu();return X(t,e),t})()}),W(xc,{get entries(){return t().entries},get resetKey(){return e.sessionKey},get imageScope(){return{runtimeKey:e.sessionKey}}}),W(K,{get when(){return t().uiRequests.find(e=>e.method===`ask`)},children:e=>W(bd,{get request(){return e()},onRespond:Ct,onStop:()=>void sn(),get stopping(){return s()}})}),W(G,{get each(){return t().widgets.below},children:e=>(()=>{var t=Wu();return X(t,e),t})()})]}})),ne.$$click=()=>b(!y()),X(ne,()=>y()?`compose ▴`:`compose ▾`),X(ee,W(K,{get when(){return y()},get children(){var e=wu();return X(e,(()=>{var e=q(()=>!!gt());return()=>e()?`agent working — open controls to stop or steer`:q(()=>Dn().length>0)()?`${Dn().length} queued message(s)`:`composer hidden for transcript reading`})()),e}}),null),X(z,W(K,{get when(){return!y()},get children(){var n=Lu(),c=n.firstChild,l=c.firstChild,u=l.nextSibling,d=u.firstChild,f=d.nextSibling,p=f.nextSibling,m=p.nextSibling,h=m.nextSibling;X(n,W(K,{get when(){return mn().length>0},get children(){var e=Tu(),t=e.firstChild,n=t.firstChild.nextSibling,r=n.nextSibling.nextSibling;r.nextSibling;var i=t.nextSibling;return X(t,hn,n),X(t,()=>mn().length,r),X(i,W(G,{get each(){return mn()},children:e=>(()=>{var t=Gu(),n=t.firstChild;return X(t,(()=>{var t=q(()=>e.status===`completed`);return()=>t()?`☑`:e.status===`in_progress`?`⧖`:`☐`})(),n),X(t,()=>e.title,null),j(n=>{var r=e.status===`completed`,i=e.status===`in_progress`;return r!==n.e&&t.classList.toggle(`done`,n.e=r),i!==n.t&&t.classList.toggle(`active`,n.t=i),n},{e:void 0,t:void 0}),t})()})),j(()=>e.open=!_n()),e}}),c),X(n,W(K,{get when(){return dn().length+fn().length>0},get children(){var t=Eu(),n=t.firstChild,r=n.firstChild.nextSibling,i=r.nextSibling.nextSibling;i.nextSibling;var a=n.nextSibling;return X(n,()=>dn().length,r),X(n,()=>fn().length,i),X(a,W(G,{get each(){return pn()},children:t=>(()=>{var n=Ku(),r=n.firstChild,i=r.firstChild,a=i.nextSibling,o=a.firstChild;return r.$$click=()=>e.store.navigate({screen:`subagent`,key:e.sessionKey,agentId:t.agentId}),X(i,(()=>{var e=q(()=>t.status===`running`);return()=>e()?`●`:t.status===`completed`?`✓`:`✕`})()),X(a,()=>t.agentType,o),X(a,()=>t.taskSummary,null),X(a,W(K,{get when(){return t.arbitrations?.at(-1)},children:e=>e().status===`failure`?` · arbitration failed`:` · ${e().final?.model??e().proposed.model} @ ${e().final?.thinking??e().proposed.thinking}`}),null),j(()=>je(i,t.status===`running`?`live`:`done`)),n})()})),j(()=>t.open=!_n()),t}}),c),X(n,W(K,{get when(){return gt()||(t()?.statusEntries.length??0)>0||A()||F()},get children(){var e=ju();return X(e,W(K,{get when(){return ft()},get children(){var e=Du();return e.firstChild,X(e,(()=>{var e=q(()=>!!t()?.workingText);return()=>e()?` — ${t().workingText}`:``})(),null),X(e,(()=>{var e=q(()=>L()>2);return()=>e()?` (${L()}s)`:``})(),null),e}}),null),X(e,W(G,{get each(){return t()?.statusEntries??[]},children:e=>(()=>{var t=Bu();return X(t,()=>e.text,null),X(t,W(K,{get when(){return e.key===`compaction`||e.key===`retry`},get children(){var t=qu();return t.$$click=()=>ln(e.key),t}}),null),j(()=>je(t,e.tone===`info`?`queued`:e.tone)),t})()}),null),X(e,W(K,{get when(){return A()},get children(){var e=Ou();return X(e,A),e}}),null),X(e,W(K,{get when(){return F()},get children(){var e=ku();return X(e,F),e}}),null),X(e,W(K,{get when(){return gt()},get children(){var e=Au();return e.$$click=sn,X(e,()=>s()?`stopping…`:`■ stop`),j(()=>e.disabled=s()),e}}),null),e}}),c),X(c,W(K,{get when(){return Dn().length>0},get children(){var e=Mu(),t=e.firstChild;return X(e,W(G,{get each(){return Dn()},children:e=>(()=>{var t=Ju(),n=t.firstChild;return X(n,()=>e.kind),X(t,()=>e.text,null),j(()=>Y(t,`title`,e.text)),t})()}),t),t.$$click=Lt,e}}),l),X(c,W(K,{get when(){return ye().length>0||_e().length>0},get children(){var e=Nu();return X(e,W(G,{get each(){return ye()},children:(e,t)=>(()=>{var n=Yu(),r=n.firstChild;r.firstChild;var i=r.nextSibling,a=i.nextSibling;return X(r,()=>e.fileName,null),X(i,()=>md(e.size)),a.$$click=()=>be(e=>e.filter((e,n)=>n!==t())),j(()=>Y(n,`title`,e.path)),n})()}),null),X(e,W(G,{get each(){return _e()},children:(e,t)=>(()=>{var n=Xu(),r=n.firstChild,i=r.nextSibling;return i.$$click=()=>kt(t()),j(t=>{var i=`${e.fileName} (${md(e.size)})`,a=e.previewUrl,o=e.fileName;return i!==t.e&&Y(n,`title`,t.e=i),a!==t.t&&Y(r,`src`,t.t=a),o!==t.a&&Y(r,`alt`,t.a=o),t},{e:void 0,t:void 0,a:void 0}),n})()}),null),e}}),l),X(c,W(K,{get when(){return An()},get children(){var e=Pu();return X(e,W(G,{get each(){return kn()},children:(e,t)=>(()=>{var n=Qu(),r=n.firstChild;r.firstChild;var i=r.nextSibling;return n.$$click=()=>jn(e),n.addEventListener(`mouseenter`,()=>ue(t())),X(r,()=>e.name,null),X(n,W(K,{get when(){return e.description},get children(){var t=Zu();return X(t,()=>e.description),t}}),i),X(i,()=>e.source),j(e=>{var r=`command-option-${t()}`,i=U()===t(),a=U()===t();return r!==e.e&&Y(n,`id`,e.e=r),i!==e.t&&Y(n,`aria-selected`,e.t=i),a!==e.a&&n.classList.toggle(`selected`,e.a=a),e},{e:void 0,t:void 0,a:void 0}),n})()})),e}}),l),l.$$keydown=t=>{if(An()){if(t.key===`ArrowDown`){t.preventDefault(),ue((U()+1)%kn().length);return}if(t.key===`ArrowUp`){t.preventDefault(),ue((U()-1+kn().length)%kn().length);return}if(t.key===`Tab`||t.key===`Enter`&&!t.shiftKey&&!_n()){t.preventDefault();let e=kn()[U()];e&&t.key===`Enter`&&r()===`/${e.name}`?(le(!0),on()):e&&jn(e);return}if(t.key===`Escape`){t.preventDefault(),le(!0);return}}if((t.key===`ArrowUp`||t.key===`ArrowDown`)&&(r()===``||xe()!==void 0)){let n=fl(e.sessionKey);if(n.length>0){if(t.preventDefault(),t.key===`ArrowUp`){let e=xe()===void 0?n.length-1:Math.max(0,xe()-1);Se(e),i(n[e]??``)}else if(xe()!==void 0){let e=xe()+1;e>=n.length?(Se(void 0),i(``)):(Se(e),i(n[e]??``))}}return}t.key===`Enter`&&!t.shiftKey&&!_n()&&(t.preventDefault(),on())},l.$$input=e=>{le(!1),ue(0),Se(void 0),i(e.currentTarget.value),_d(e.currentTarget)},l.addEventListener(`paste`,e=>{let t=[...e.clipboardData?.items??[]].filter(e=>e.type.startsWith(`image/`)).map(e=>e.getAsFile()).filter(e=>!!e);t.length>0&&(e.preventDefault(),Bt(t))});var g=Z;typeof g==`function`?Fe(g,l):Z=l,d.addEventListener(`change`,e=>{Ht(e.currentTarget.files??[]),e.currentTarget.value=``});var _=ct;typeof _==`function`?Fe(_,d):ct=d,f.addEventListener(`change`,e=>{Bt(e.currentTarget.files??[]),e.currentTarget.value=``});var v=lt;return typeof v==`function`?Fe(v,f):lt=f,p.$$click=()=>ct?.click(),m.$$click=()=>lt?.click(),X(u,W(K,{get when(){return ft()},get children(){var e=Fu(),t=e.firstChild,n=t.nextSibling;return t.$$click=()=>o(`steer`),n.$$click=()=>o(`follow_up`),j(e=>{var r=a()===`steer`,i=a()===`follow_up`;return r!==e.e&&t.classList.toggle(`selected`,e.e=r),i!==e.t&&n.classList.toggle(`selected`,e.t=i),e},{e:void 0,t:void 0}),e}}),h),X(u,W(K,{get when(){return t()?.suggestedCommand},get children(){var e=Iu(),n=e.firstChild.nextSibling;return e.$$click=()=>i(t().suggestedCommand),X(n,()=>t().suggestedCommand),e}}),h),h.$$click=on,j(e=>{var t=ft()?`Message dreb — sends as steer while it works…`:`Message dreb…`,n=An()?`command-listbox`:void 0,r=An()?`command-option-${U()}`:void 0;return t!==e.e&&Y(l,`placeholder`,e.e=t),n!==e.t&&Y(l,`aria-controls`,e.t=n),r!==e.a&&Y(l,`aria-activedescendant`,e.a=r),e},{e:void 0,t:void 0,a:void 0}),j(()=>l.value=r()),n}}),null),X(c,W(K,{get when(){return t()?.uiRequests.find(e=>e.method!==`ask`)},keyed:!0,children:e=>W(vd,{request:e,onRespond:Ct})}),null),X(c,W(K,{get when(){return d()},get children(){return W(Sd,{get sessionKey(){return e.sessionKey},get state(){return n()?.state},get initialFilter(){return p()},onClose:()=>{f(!1),m(``)},onSelected:t=>e.store.setRuntimeModel(e.sessionKey,t)})}}),null),X(c,W(K,{get when(){return x()},get children(){return W(rt,{title:`compact context`,onDismiss:()=>S(!1),get actions(){return[(()=>{var e=yl();return e.$$click=()=>S(!1),e})(),(()=>{var t=$u();return t.$$click=async()=>{S(!1);try{await Q.compact(e.sessionKey)}catch(e){P(e instanceof Error?e.message:String(e))}},t})()]},get children(){return Ru()}})}}),null),X(c,W(K,{get when(){return T()},get children(){return W(xd,{get resources(){return de()},get error(){return pe()},onClose:()=>E(!1)})}}),null),X(c,W(K,{get when(){return Ce()},get children(){return W(rt,{title:`fork from message`,onDismiss:()=>we(!1),get children(){return[W(K,{get when(){return De()},get children(){var e=Gl();return X(e,De),e}}),W(K,{get when(){return Te().length>0},get fallback(){return ed()},get children(){var e=su();return X(e,W(G,{get each(){return Te()},children:e=>(()=>{var t=uu(),n=t.firstChild,r=n.nextSibling;return t.$$click=()=>Yt(e.entryId),X(n,()=>e.entryId),X(r,()=>e.text),t})()})),e}})]}})}}),null),X(c,W(K,{get when(){return ke()},get children(){return W(wd,{get roots(){return Ae()},get leafId(){return Ne()},get loading(){return Ie()},get error(){return Re()},onClose:()=>J(!1),onNavigate:Wt})}}),null),X(c,W(K,{get when(){return Be()},get children(){return W(Td,{get sessions(){return He()},get loading(){return We()},get error(){return Ke()},onClose:()=>Ve(!1),onResume:Kt})}}),null),X(c,W(K,{get when(){return Je()},get children(){return W(Ed,{get initialPath(){return Xe()},get error(){return Qe()},onClose:()=>Ye(!1),onImport:qt})}}),null),X(c,W(K,{get when(){return C()},get children(){return W(Od,{get current(){return vn()??``},onClose:()=>w(!1),onRename:async t=>{try{await Q.rename(e.sessionKey,t),w(!1)}catch(e){P(e instanceof Error?e.message:String(e))}}})}}),null),j(e=>{var t=!!_(),n=_()?`show session details`:`hide session details`,r=!!y(),i=y()?`show composer and controls`:`hide composer and controls`;return t!==e.e&&u.classList.toggle(`collapsed`,e.e=t),n!==e.t&&Y(N,`title`,e.t=n),r!==e.a&&z.classList.toggle(`collapsed`,e.a=r),i!==e.o&&Y(ne,`title`,e.o=i),e},{e:void 0,t:void 0,a:void 0,o:void 0}),c})()}function Od(e){let[t,n]=k(e.current);return W(rt,{title:`rename session`,get onDismiss(){return e.onClose},get actions(){return[(()=>{var t=yl();return Me(t,`click`,e.onClose,!0),t})(),(()=>{var n=td();return n.$$click=()=>e.onRename(t().trim()),j(()=>n.disabled=!t().trim()),n})()]},get children(){var e=_l(),r=e.firstChild;return r.$$input=e=>n(e.currentTarget.value),j(()=>r.value=t()),e}})}Ae([`input`,`click`,`keydown`]);var kd=J(`<div class=settings-error>`),Ad=J(`<p class=muted>Loading scoped models…`),jd=J(`<section class="settings-section scoped-models-editor"tabindex=-1 aria-labelledby=scoped-models-heading><h2 id=scoped-models-heading>scoped models</h2><p class="muted small">Controls model cycling for new sessions only; running sessions are never changed. Writes always update global settings, while the selected context shows effective global-plus-project settings.</p><label class=scoped-models-context><span>project context</span><select><option value>global / home`),Md=J(`<option>`),Nd=J(`<div class=settings-warning>This project defines enabledModels in .dreb/settings.json and shadows global writes.`),Pd=J(`<div class=scoped-models-toolbar><input type=search aria-label="Search available models"placeholder="search provider, model, or name…"><button type=button class="btn btn-small">enable all`),Fd=J(`<div class=scoped-models-grid><div class=scoped-models-order><h3>cycling order</h3><p class="muted small"></p></div><div class=scoped-models-available><h3>available models`),Id=J(`<span class="muted small">unsaved changes`),Ld=J(`<span class="muted small">✓ saved`),Rd=J(`<div class=scoped-models-actions><button type=button class="btn btn-small">reset</button><button type=button class="btn btn-primary btn-small">`),zd=J(`<div class=settings-warning>`),Bd=J(`<div class=scoped-model-order-row><span></span><div class=scoped-model-move-controls><button type=button>↑</button><button type=button>↓`),Vd=J(`<p class="muted small">No matching models.`),Hd=J(`<section class=scoped-model-provider><label class=scoped-model-provider-heading><input type=checkbox><span>`),Ud=J(`<span class=model-name>`),Wd=J(`<label class=scoped-model-choice><input type=checkbox><span class=model-id>`);function Gd(e){return`${e.provider}/${e.id}`}function Kd(e){let t=new Map;for(let n of e){let e=t.get(n.provider)??[];e.push(n),t.set(n.provider,e)}return[...t].map(([e,t])=>({provider:e,models:t}))}function qd(e){let[t,n]=k(``),[r,i]=k(!0),[a,o]=k([]),[s,c]=k(!1),[l,u]=k(!1),[d,f]=k(!1),[p,m]=k(),[h,g]=k([]),_,v,y,b=()=>e.cwd??``,[x,{mutate:S}]=F(b,async e=>{let t=e||void 0,[n,r]=await Promise.all([Q.settings(t),Q.settingsModels(t)]);return{cwd:e,settings:n,models:r.models}}),C=N(()=>{if(x.error)return;let e=x();return e?.cwd===b()?e:void 0});function w(e,t){let n=e.enabledModels===void 0;i(n),o(n?t.map(Gd):e.resolvedScopedModels.map(e=>`${e.provider}/${e.id}`)),c(!1),f(!1),m(void 0),g([])}let T=b();M(()=>{let e=b();e!==T&&(T=e,v=void 0,y=void 0,c(!1),f(!1),m(void 0),g([]))}),M(()=>{let e=C();!e||e.cwd===v&&e.settings===y||(v=e.cwd,y=e.settings,w(e.settings,e.models))}),M(()=>{!e.focused||!_||(_.scrollIntoView({block:`start`}),_.focus({preventScroll:!0}))});let E=N(()=>new Set(a())),D=N(()=>{let t=new Set(e.projectRoots);return e.cwd&&t.add(e.cwd),[...t].sort((e,t)=>e.localeCompare(t))}),O=N(()=>{let e=t().trim().toLowerCase();return Kd((C()?.models??[]).filter(t=>!e||`${t.provider}/${t.id} ${t.name??``}`.toLowerCase().includes(e)))}),A=N(()=>{if((C()?.models.length??0)===0)return`No available models were reported for this context.`;if(!r()&&a().length===0)return`At least one model must remain enabled.`}),P=N(()=>{let e=C()?.settings;if(!e?.enabledModels)return;let t=e.resolvedScopedModels.map(e=>`${e.provider}/${e.id}`);return e.enabledModels.length===t.length&&e.enabledModels.every((e,n)=>e===t[n])&&e.scopeWarnings.length===0?void 0:`Saving an edited legacy scope replaces patterns and per-pattern thinking suffixes with exact provider/model references.`});function I(e){let t=C()?.models.map(Gd)??[],n=t.length>0&&t.every(t=>e.includes(t));i(n),o(n?t:e),c(!0),f(!1),m(void 0)}function L(e){let t=r()?C()?.models.map(Gd)??[]:a();I(t.includes(e)?t.filter(t=>t!==e):[...t,e])}function R(e){let t=(C()?.models??[]).filter(t=>t.provider===e).map(Gd),n=r()?C()?.models.map(Gd)??[]:a();I(t.every(e=>n.includes(e))?n.filter(e=>!t.includes(e)):[...n,...t.filter(e=>!n.includes(e))])}function z(e,t){if(r())return;let n=e+t;if(n<0||n>=a().length)return;let i=[...a()];[i[e],i[n]]=[i[n],i[e]],o(i),c(!0),f(!1)}function ee(){let e=C();e&&w(e.settings,e.models)}async function te(){let e=C();if(!e||!s()||A())return;u(!0),m(void 0),g([]),f(!1);let t=e.cwd||void 0;try{let n=await Q.saveSettings({enabledModels:r()?null:a()},t);if(b()!==e.cwd)return;v=e.cwd,y=n,S({cwd:e.cwd,settings:n,models:e.models}),w(n,e.models),g(n.warnings??[]),f(!0)}catch(t){b()===e.cwd&&m(t instanceof Error?t.message:String(t))}finally{u(!1)}}return(()=>{var i=jd(),o=i.firstChild.nextSibling.nextSibling.firstChild.nextSibling;o.firstChild;var c=_;return typeof c==`function`?Fe(c,i):_=i,o.addEventListener(`change`,t=>e.onCwdChange(t.currentTarget.value||void 0)),X(o,W(G,{get each(){return D()},children:e=>(()=>{var t=Md();return t.value=e,X(t,e),t})()}),null),X(i,W(K,{get when(){return x.error},get children(){var e=kd();return X(e,(()=>{var e=q(()=>x.error instanceof Error);return()=>e()?x.error.message:String(x.error)})()),e}}),null),X(i,W(K,{get when(){return x.loading},get children(){return Ad()}}),null),X(i,W(K,{get when(){return C()},children:e=>[W(K,{get when(){return e().settings.hasProjectEnabledModelsOverride},get children(){return Nd()}}),W(K,{get when(){return P()},children:e=>(()=>{var t=zd();return X(t,e),t})()}),W(G,{get each(){return e().settings.scopeWarnings},children:e=>(()=>{var t=zd();return X(t,()=>e.message),t})()}),W(G,{get each(){return h()},children:e=>(()=>{var t=zd();return X(t,e),t})()}),W(K,{get when(){return p()},children:e=>(()=>{var t=kd();return X(t,e),t})()}),W(K,{get when(){return A()},children:e=>(()=>{var t=kd();return X(t,e),t})()}),(()=>{var i=Pd(),a=i.firstChild,o=a.nextSibling;return a.$$input=e=>n(e.currentTarget.value),o.$$click=()=>I(e().models.map(Gd)),j(()=>o.disabled=r()),j(()=>a.value=t()),i})(),(()=>{var t=Fd(),n=t.firstChild,i=n.firstChild.nextSibling,o=n.nextSibling;return o.firstChild,X(i,(()=>{var e=q(()=>!!r());return()=>e()?`All available models, in registry order (future models included).`:`${a().length} enabled model${a().length===1?``:`s`}.`})()),X(n,W(G,{get each(){return a()},children:(e,t)=>(()=>{var n=Bd(),i=n.firstChild,o=i.nextSibling.firstChild,s=o.nextSibling;return Y(i,`title`,e),X(i,e),o.$$click=()=>z(t(),-1),Y(o,`aria-label`,`Move ${e} up`),s.$$click=()=>z(t(),1),Y(s,`aria-label`,`Move ${e} down`),j(e=>{var n=r()||t()===0,i=r()||t()===a().length-1;return n!==e.e&&(o.disabled=e.e=n),i!==e.t&&(s.disabled=e.t=i),e},{e:void 0,t:void 0}),n})()}),null),X(o,W(K,{get when(){return O().length>0},get fallback(){return Vd()},get children(){return W(G,{get each(){return O()},children:t=>(()=>{var n=Hd(),r=n.firstChild.firstChild,i=r.nextSibling;return r.addEventListener(`change`,()=>R(t.provider)),X(i,()=>t.provider),X(n,W(G,{get each(){return t.models},children:e=>{let t=Gd(e);return(()=>{var n=Wd(),r=n.firstChild,i=r.nextSibling;return Y(n,`title`,t),r.addEventListener(`change`,()=>L(t)),X(i,()=>e.id),X(n,W(K,{get when(){return e.name},get children(){var t=Ud();return X(t,()=>e.name),t}}),null),j(()=>r.checked=E().has(t)),n})()}}),null),j(()=>r.checked=e().models.filter(e=>e.provider===t.provider).every(e=>E().has(Gd(e)))),n})()})}}),null),t})(),(()=>{var e=Rd(),t=e.firstChild,n=t.nextSibling;return t.$$click=ee,n.$$click=()=>void te(),X(n,()=>l()?`saving…`:`save`),X(e,W(K,{get when(){return s()},get children(){return Id()}}),null),X(e,W(K,{get when(){return d()},get children(){return Ld()}}),null),j(e=>{var r=!s()||l(),i=!s()||l()||!!A();return r!==e.e&&(t.disabled=e.e=r),i!==e.t&&(n.disabled=e.t=i),e},{e:void 0,t:void 0}),e})()]}),null),j(()=>o.value=e.cwd??``),i})()}Ae([`input`,`click`]);var Jd=[{id:`default`,label:`entropist.ca`},{id:`dim`,label:`Dim`},{id:`solarized`,label:`Solarized`},{id:`gruvbox`,label:`Gruvbox`},{id:`qud`,label:`Caves of Qud`},{id:`vangogh`,label:`Van Gogh`},{id:`okabe`,label:`Colorblind-safe (Okabe-Ito)`},{id:`tol`,label:`Colorblind-safe (Paul Tol)`}],Yd=Jd.map(e=>e.id),Xd=[`system`,`light`,`dark`],Zd=`dreb.dashboard.theme`,Qd=`dreb.dashboard.colorMode`,$d=`default`,ef=`system`;function tf(e){return typeof e==`string`&&Yd.includes(e)}function nf(e){return typeof e==`string`&&Xd.includes(e)}function rf(){if(typeof window>`u`)return $d;try{let e=window.localStorage.getItem(Zd);return tf(e)?e:$d}catch{return $d}}function af(){if(typeof window>`u`)return ef;try{let e=window.localStorage.getItem(Qd);return nf(e)?e:ef}catch{return ef}}function of(e,t,n){if(!(typeof window>`u`))try{t===n?window.localStorage.removeItem(e):window.localStorage.setItem(e,t)}catch{}}var[sf,cf]=k(rf()),[lf,uf]=k(af()),df=sf,ff=lf;function pf(e){let t=e.defaultView??(typeof window<`u`?window:void 0);return!t||typeof t.getComputedStyle!=`function`?``:t.getComputedStyle(e.documentElement).getPropertyValue(`--bg`).trim()}function mf(e){try{let t=e??(typeof document<`u`?document:void 0);if(!t)return;let n=t.documentElement;if(!n)return;let r=sf(),i=lf();if(r===$d?n.removeAttribute(`data-theme`):n.setAttribute(`data-theme`,r),i===ef?n.removeAttribute(`data-color-mode`):n.setAttribute(`data-color-mode`,i),!(r!==$d||i!==ef))n.style.removeProperty(`color-scheme`);else{let e=i===`light`?`light`:i===`dark`?`dark`:`light dark`;n.style.setProperty(`color-scheme`,e)}}catch{}}function hf(e){try{let t=e??(typeof document<`u`?document:void 0);if(!t)return;let n=pf(t);if(!n)return;let r=t.querySelector(`meta[name="theme-color"]:not([media])`);if(!r){r=t.createElement(`meta`),r.setAttribute(`name`,`theme-color`);let e=t.head??t.getElementsByTagName(`head`)[0];e&&e.insertBefore(r,e.firstChild)}r.setAttribute(`content`,n)}catch{}}function gf(e){let t=tf(e)?e:$d;cf(t),of(Zd,t,$d),mf(),hf()}function _f(e){let t=nf(e)?e:ef;uf(t),of(Qd,t,ef),mf(),hf()}var vf=null,yf=!1;function bf(){lf()===ef&&hf()}function xf(e){e.key!==null&&e.key!==`dreb.dashboard.theme`&&e.key!==`dreb.dashboard.colorMode`||Sf()}function Sf(){cf(rf()),uf(af()),mf(),hf()}function Cf(){if(!(typeof window>`u`)){try{typeof window.matchMedia==`function`&&(vf=window.matchMedia(`(prefers-color-scheme: dark)`),typeof vf.addEventListener==`function`?vf.addEventListener(`change`,bf):typeof vf.addListener==`function`&&vf.addListener(bf))}catch{}try{window.addEventListener(`storage`,xf)}catch{}}}function wf(){Sf(),!yf&&(yf=!0,Cf())}var Tf=J(`<div class=appearance-controls><div class=setting-row><span class=setting-label><span class=name>color mode</span><span class=hint>this browser only — “system” follows your OS light/dark preference</span></span><span class=setting-control><select id=pref-color-mode></select></span></div><div class=theme-gallery>`),Ef=J(`<option>`),Df=J(`<button type=button class=theme-card><div class=theme-card-preview><div class=theme-card-swatch><span class=theme-card-name></span><span class=theme-card-muted>The quick brown fox.</span></div><div class=theme-card-chips></div><pre class=theme-card-code><code class=hljs><span class=hljs-keyword>const</span> <span class=hljs-variable>count</span><span class=hljs-operator> = </span><span class=hljs-number>42</span><span class=hljs-punctuation>;</span>
|
|
78
78
|
<span class=hljs-comment>// preview</span>
|
|
79
|
-
<span class=hljs-function>render</span><span class=hljs-punctuation>(</span><span class=hljs-string>"ok"</span><span class=hljs-punctuation>)</span><span class=hljs-punctuation>;</span></code></pre></div><span class=theme-card-footer><span class=theme-card-title></span><span class=theme-card-state>`),Ef=[`running`,`attention`,`idle`,`error`];function Df(){let e=()=>{let e=uf();return e===`system`?void 0:e};return(()=>{var t=Cf(),n=t.firstChild,r=n.firstChild.nextSibling.firstChild,i=n.nextSibling;return r.addEventListener(`change`,e=>hf(e.currentTarget.value)),X(r,W(G,{each:Jd,children:e=>(()=>{var t=wf();return t.value=e,X(t,e),t})()})),X(i,W(G,{each:Kd,children:t=>{let n=()=>lf()===t.id;return(()=>{var r=Tf(),i=r.firstChild,a=i.firstChild,o=a.firstChild,s=a.nextSibling,c=i.nextSibling.firstChild,l=c.nextSibling;return r.$$click=()=>mf(t.id),X(o,()=>t.label),X(s,W(G,{each:Ef,children:e=>W($e,{status:e,label:``})})),X(c,()=>t.label),X(l,()=>n()?`✓ active`:`select`),j(i=>{var a=!!n(),o=t.id,s=t.id,c=e(),l=n(),u=n()?`true`:void 0,d=`use the ${t.label} theme`;return a!==i.e&&r.classList.toggle(`active`,i.e=a),o!==i.t&&Y(r,`data-theme-card`,i.t=o),s!==i.a&&Y(r,`data-theme`,i.a=s),c!==i.o&&Y(r,`data-color-mode`,i.o=c),l!==i.i&&Y(r,`aria-pressed`,i.i=l),u!==i.n&&Y(r,`aria-current`,i.n=u),d!==i.s&&Y(r,`title`,i.s=d),i},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),r})()}})),j(()=>r.value=uf()),t})()}Ae([`click`]);var Of=J(`<select><option value=on>on</option><option value=off>off`),kf=J(`<div class=field style=margin-bottom:8px><input type=text placeholder="search models…">`),Af=J(`<div class=model-list style=max-height:320px>`),jf=J(`<p class="muted small">No matching models.`),Mf=J(`<section class=model-provider-group><div class=model-provider-heading>`),Nf=J(`<span class=model-name>`),Pf=J(`<span class=model-reasoning>think`),Ff=J(`<button type=button class=model-row><span class=model-current></span><span class=model-id></span><span class=model-provider-badge>`),If=J(`<div class=settings-error>`),Lf=J(`<div class=settings-warning>`),Rf=J(`<p class="muted small"style=margin-bottom:16px>✓ saved`),zf=J(`<div class=setting-row><span class=setting-label><span class=name>pairing code</span><span class=hint>new devices enter this in the pairing screen; it rotates every 30s</span></span><span class=setting-control><code style=font-size:var(--fs-h2);letter-spacing:0.08em>`),Bf=J(`<p class="muted small"style=padding-top:8px>No remote devices paired. Launch with <code>--remote --allow <identity></code> to enable Tailscale access.`),Vf=J(`<p>This exits the dashboard server process and terminates <strong>all running sessions</strong>.`),Hf=J(`<div class=screen-fill><main class="container settings-wrap"><h1>settings</h1><p class=settings-intro>Ordinary defaults apply only to new sessions. Dispatch Arbiter changes apply to subsequent child spawns. Context trust changes apply to subsequent lazy loads in live sessions; already injected content cannot be retracted. Writes go to the global settings file on the host.</p><section class=settings-section><h2>dashboard</h2><div class=appearance-block><div class="setting-row appearance-heading-row"><span class=setting-label><span class=name>appearance</span><span class=hint>this browser only — theme and light/dark mode are stored in localStorage and are independent of the TUI theme. Okabe-Ito and Paul Tol are colorblind-safe palettes.</span></span></div></div><div class=setting-row><label class=setting-label for=pref-image-display-mode><span class=name>tool-result images</span><span class=hint>this browser only — placeholders make no automatic request, previews are bounded to 1024 px and 256 KiB, and originals automatically transfer full files. Choosing originals is the informed network-data opt-in.</span></label><span class=setting-control><select id=pref-image-display-mode><option value=placeholders>placeholders</option><option value=previews>bounded previews</option><option value=originals>automatic originals</option></select></span></div><div class=setting-row><span class=setting-label><span class=name>always expand thinking</span><span class=hint>this browser only — stored in localStorage, not the host settings file</span></span><span class=setting-control><label class=checkbox-control><input id=pref-expand-thinking type=checkbox><span>open by default</span></label></span></div><div class=setting-row><span class=setting-label><span class=name>auto-expand tool cards</span><span class=hint>this browser only — stored in localStorage, not the host settings file</span></span><span class=setting-control style=display:grid;gap:6px></span></div><div class=setting-row><span class=setting-label><span class=name>needs-attention notifications</span><span class=hint></span></span><span class=setting-control><label class=checkbox-control><input id=pref-notifications type=checkbox><span></span></label></span></div><div class=setting-row><span class=setting-label><span class=name>restart dashboard service</span><span class=hint></span></span><span class=setting-control><button type=button class="btn btn-small btn-danger"></button></span></div></section><section class=settings-section><h2>devices</h2><div class=device-row><span>this machine <span class=this-device></span></span><span class=meta>local · always allowed</span></div></section><footer>dreb<!> · dashboard`),Uf=J(`<div>`),Wf=J(`<p class=muted>`),Gf=J(`<section class=settings-section><h2>model</h2><div class=setting-row><span class=setting-label><span class=name>default model</span><span class=hint>used by new sessions; validated against configured providers</span></span><span class=setting-control><button type=button class="btn btn-small model-picker-button"></button></span></div><div class=setting-row><span class=setting-label><span class=name>default thinking level</span><span class=hint></span></span><span class=setting-control><select></select></span></div><div class=setting-row><span class=setting-label><span class=name>transport</span><span class=hint>preferred model transport for new sessions</span></span><span class=setting-control><select>`),Kf=J(`<section class="settings-section dispatch-arbiter-settings"><h2>dispatch arbiter</h2><p class="muted small"style=margin-bottom:8px>Global-only, fully headless pre-spawn routing. Project settings cannot change it. When enabled, invalid model, scope, guide, inference, or output prevents the affected child from spawning.</p><div class=setting-row><span class=setting-label><span class=name>enabled</span><span class=hint>disabled by default; fail closed when enabled</span></span><span class=setting-control></span></div><div class=setting-row><span class=setting-label><span class=name>arbiter model</span><span class=hint>exact authenticated provider/model; no fallback</span></span><span class=setting-control><button type=button class="btn btn-small model-picker-button"></button></span></div><div class=setting-row><span class=setting-label><span class=name>arbiter thinking</span><span class=hint>validated against the selected arbiter model</span></span><span class=setting-control><select></select></span></div><div class=setting-row><label class=setting-label for=dispatch-arbiter-guide-path><span class=name>routing guide path</span><span class=hint>blank uses ~/.dreb/agent/model-routing-guide.md</span></label><span class=setting-control><input id=dispatch-arbiter-guide-path type=text placeholder=~/.dreb/agent/model-routing-guide.md></span></div><div data-testid=dispatch-arbiter-readiness><strong>status:</strong> `),qf=J(`<div class="setting-row agent-context-row"><span class=setting-label><span class=name>agent definition context</span><span class=hint>choose a project to include its .dreb/agents definitions</span></span><span class=setting-control><select><option value>global/home only`),Jf=J(`<section class=settings-section><h2>agent models</h2><p class="muted small"style=margin-bottom:8px>Per-agent fallback lists. First available model wins; empty lists revert to the default model. Agent definitions are loaded from an explicit project context so project-local agents do not depend on which runtime opened first.`),Yf=J(`<section class=settings-section><h2>images</h2><div class=setting-row><span class=setting-label><span class=name>auto-resize images</span><span class=hint>resize image inputs before sending them to providers</span></span><span class=setting-control></span></div><div class=setting-row><span class=setting-label><span class=name>block images</span><span class=hint>prevent image inputs from being sent to providers</span></span><span class=setting-control>`),Xf=J(`<section class=settings-section><h2>queueing</h2><div class=setting-row><span class=setting-label><span class=name>steering delivery</span><span class=hint>deliver queued steers all at once, or one per turn</span></span><span class=setting-control><select></select></span></div><div class=setting-row><span class=setting-label><span class=name>follow-up delivery</span><span class=hint>deliver queued follow-ups all at once, or one per turn</span></span><span class=setting-control><select>`),Zf=J(`<section class=settings-section><h2>behavior</h2><div class=setting-row><span class=setting-label><span class=name>skill slash commands</span><span class=hint>register skills as slash commands in new sessions</span></span><span class=setting-control></span></div><div class=context-trust-subsection><h3>trusted context folders</h3><p class="muted small">Specific global roots that may lazy-load nested AGENTS.md/CLAUDE.md and all descendants.</p><div class="settings-warning context-trust-global-warning"><strong>Global-only policy.</strong> Project <code>.dreb/settings.json</code> cannot enable, disable, or extend nested-context trust. Only these global settings and the Files view can; a cloned repository cannot grant itself trust.</div><form class=trusted-context-folder-add><label for=trusted-context-folder-path>add folder by path</label><input id=trusted-context-folder-path type=text placeholder=/path/to/project><button type=submit class="btn btn-small"></button></form></div><div class=setting-row><span class=setting-label><span class=name>global expert nested-context trust</span><span class=hint>allow nested AGENTS.md/CLAUDE.md from any resolvable directory</span></span><span class=setting-control></span></div><div class="settings-warning context-expert-warning"><strong>Expert global override.</strong> Project <code>.dreb/settings.json</code> cannot enable, disable, or extend nested-context trust; a cloned repository cannot grant itself trust. When ON, nested instructions from any resolvable directory may load, including untrusted prompt-injection content. Leave this OFF and use trusted folders for projects you control.</div><div class=setting-row><span class=setting-label><span class=name>hide thinking blocks</span><span class=hint>hide raw thinking blocks in rendered transcripts</span></span><span class=setting-control>`),Qf=J(`<section class=settings-section><h2>reliability</h2><div class=setting-row><span class=setting-label><span class=name>auto-compaction</span><span class=hint>summarize old context when the window fills</span></span><span class=setting-control></span></div><div class=setting-row><span class=setting-label><span class=name>auto-retry</span><span class=hint>retry transient stream errors (rate limits, 5xx)</span></span><span class=setting-control>`),$f=J(`<p class="muted small settings-footnote">TUI-only settings (cursor, editor) are managed in the terminal /settings menu. The dashboard appearance (theme + light/dark mode) is set here, per-browser, and is independent of the TUI theme.`),ep=J(`<option>`),tp=J(`<p class="muted small">No agent definitions found.`),np=J(`<div class=agent-model-editor><button type=button class="btn btn-small">add model…`),rp=J(`<div class=agent-model-row><div class=agent-model-summary><span class=agent-model-name></span><span class=agent-model-description></span></div><div class=agent-model-fallbacks></div><button type=button class="btn btn-small agent-model-edit">`),ip=J(`<span class="muted small">default`),ap=J(`<span class=agent-model-chip>. `),op=J(`<p class="muted small">Using the default model.`),sp=J(`<div class=agent-model-entry><span></span><div class=agent-model-entry-actions><button type=button class="btn btn-small">↑</button><button type=button class="btn btn-small">↓</button><button type=button class="btn btn-small">×`),cp=J(`<p class="muted small trusted-context-empty">No trusted folders. Use the Files view to trust a project folder and its descendants.`),lp=J(`<div class=trusted-context-folder-row><code></code><span class=meta>and all descendants</span><button type=button class="btn btn-small btn-danger">`),up=J(`<label class=checkbox-control><input type=checkbox><span>`),dp=J(`<div class=device-row><span></span><span class=meta> · paired </span><span class=actions><button type=button class="btn btn-small btn-danger">unpair`),fp=J(`<button type=button class="btn btn-small">cancel`),pp=J(`<button type=button class="btn btn-small btn-danger">restart`),mp=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`],hp=[`all`,`one-at-a-time`],gp=[`sse`,`websocket`,`auto`];function _p(e){return`${e.provider}/${e.id}`}function vp(e){let t=_p(e);return e.name?`${t} — ${e.name}`:t}function yp(e){return e.defaultProvider&&e.defaultModel?`${e.defaultProvider}/${e.defaultModel}`:`choose model…`}function bp(e,t){return`${e.provider}/${e.id} ${e.name??``}`.toLowerCase().includes(t)}function xp(){if(typeof Notification>`u`){if(window.isSecureContext===!1)return`insecure`;let e=/iPad|iPhone|iPod/.test(navigator.userAgent),t=navigator.standalone===!0||window.matchMedia?.(`(display-mode: standalone)`)?.matches===!0;return e&&!t?`ios-install`:`unsupported`}return Notification.permission}function Sp(e){let t=new Map;for(let n of e){let e=t.get(n.provider)??[];e.push(n),t.set(n.provider,e)}return[...t.entries()].map(([e,t])=>({provider:e,models:t}))}function Cp(e,t,n){let r=t+n;if(r<0||r>=e.length)return e;let i=[...e];return[i[t],i[r]]=[i[r],i[t]],i}function wp(e){return(()=>{var t=Of();return t.addEventListener(`change`,t=>{e.onChange(t.currentTarget.value===`on`)===!1&&(t.currentTarget.value=e.value?`on`:`off`)}),j(()=>t.value=e.value?`on`:`off`),t})()}function Tp(e){let[t,n]=k(``),r=()=>new Set(e.selected??[]),i=N(()=>{let n=t().toLowerCase();return Sp(e.models.filter(e=>!n||bp(e,n)).slice(0,100))}),a=e=>r().has(_p(e));return W(rt,{get title(){return e.title},get onDismiss(){return e.onClose},class:`model-picker-modal`,get children(){return[(()=>{var e=kf(),r=e.firstChild;return r.$$input=e=>n(e.currentTarget.value),j(()=>r.value=t()),e})(),(()=>{var t=Af();return X(t,W(K,{get when(){return i().length>0},get fallback(){return jf()},get children(){return W(G,{get each(){return i()},children:t=>(()=>{var n=Mf(),r=n.firstChild;return X(r,()=>t.provider),X(n,W(G,{get each(){return t.models},children:t=>(()=>{var n=Ff(),r=n.firstChild,i=r.nextSibling,o=i.nextSibling;return n.$$click=()=>e.onPick(t),X(r,()=>a(t)?`✓`:``),X(i,()=>t.id),X(n,W(K,{get when(){return t.name},get children(){var e=Nf();return X(e,()=>t.name),e}}),o),X(o,()=>t.provider),X(n,W(K,{get when(){return t.reasoning},get children(){return Pf()}}),null),j(e=>{var r=!!a(t),i=vp(t);return r!==e.e&&n.classList.toggle(`current`,e.e=r),i!==e.t&&Y(n,`title`,e.t=i),e},{e:void 0,t:void 0}),n})()}),null),n})()})}})),t})()]}})}function Ep(e){let[t,n]=k(),[r,i]=k([]),[a,o]=k(!1),[s,c]=k(),[l,u]=k(),[d,f]=k(),[p,m]=k(e.target===`scoped-models`?e.routeScopedModelsCwd:void 0);M(()=>{m(e.target===`scoped-models`?e.routeScopedModelsCwd:void 0)});let[h,g]=k(``),[_,v]=k(!1),[y,b]=k(xp()),[x,{mutate:S,refetch:C}]=F(async()=>{n(void 0);try{return await Q.settings()}catch(e){n(e instanceof Error?e.message:String(e));return}}),[w]=F(x,async()=>{try{let{models:e}=await Q.settingsModels();return e}catch(e){return n(e instanceof Error?e.message:String(e)),[]}}),T=N(()=>{let t=new Set;for(let n of e.store.fleet().runtimes)t.add(n.cwd);for(let n of e.store.fleet().diskSessions)t.add(n.cwd);return[...t].sort((e,t)=>e.localeCompare(t))}),[E]=F(()=>({settings:x(),cwd:d()}),async({cwd:e})=>{if(!x())return[];try{let{agentTypes:t}=await Q.agentTypes(e);return t}catch(e){return n(e instanceof Error?e.message:String(e)),[]}}),[D,{refetch:O}]=F(async()=>{let{devices:e}=await Q.devices();return e}),[A,P]=k(),I;function L(){I&&clearTimeout(I),I=void 0}function ee(e){L();let t=Math.max(250,e??3e4)+100;I=setTimeout(()=>void te(),t)}async function te(){try{let e=await Q.pairingCode();if(!e.enabled||!e.code){P(void 0),L();return}P(e),ee(e.expiresInMs)}catch(e){console.warn(`pairing code unavailable`,e),P(void 0),L()}}let[ne]=F(async()=>{try{let{version:e}=await Q.version();return e}catch{return}}),[re]=F(async()=>{try{return await Q.serverInfo()}catch{return}}),[ie,ae]=k(!1),[B,oe]=k(!1),[V,se]=k();async function H(){se(void 0),oe(!0);try{await Q.restartServer()}catch(e){se(e instanceof Error?e.message:String(e)),oe(!1)}}async function ce(e){n(void 0),i([]),o(!1);try{let t=await Q.saveSettings(e);S(t),i(t.warnings??[]),o(!0),setTimeout(()=>o(!1),2e3)}catch(e){n(e instanceof Error?e.message:String(e)),await C()}}let le=Promise.resolve(),U;function ue(){return U??x()?.subagentArbiter??{}}function de(e){let t={...ue(),...e};U=t;let r=x();r&&S({...r,subagentArbiter:t}),le=le.then(async()=>{n(void 0),i([]),o(!1);try{let e=await Q.saveSettings({subagentArbiter:t});i(e.warnings??[]),o(!0),setTimeout(()=>o(!1),2e3),U===t?(U=e.subagentArbiter??void 0,S(e)):S({...e,subagentArbiter:U})}catch(e){let r=e instanceof Error?e.message:String(e),i=await C();n(r),U===t?U=i?.subagentArbiter??void 0:i&&S({...i,subagentArbiter:U})}})}async function fe(e,t){await ce({agentModels:{[e]:t}})}async function pe(e){n(void 0),v(!0);try{let t=await Q.trustContextFolder(e);S(t.settings),g(``)}catch(e){n(e instanceof Error?e.message:String(e))}finally{v(!1)}}async function me(e){n(void 0),v(!0);try{let t=await Q.removeTrustedContextFolder(e);S(t.settings)}catch(e){n(e instanceof Error?e.message:String(e))}finally{v(!1)}}function he(e){return x()?.agentModels?.[e]??[]}function ge(e){let t=e.subagentArbiter;return t?.enabled===!0?typeof t.model!=`string`||!t.model.trim()?{ready:!1,message:`not ready — choose an arbiter model`}:t.thinking!==void 0&&!mp.some(e=>e===t.thinking)?{ready:!1,message:`not ready — arbiter thinking setting is invalid`}:t.guidePath!==void 0&&typeof t.guidePath!=`string`?{ready:!1,message:`not ready — routing guide path is invalid`}:t.guidePath?.trim()?{ready:!0,message:`enabled — live scope and guide are validated before every child spawn`}:{ready:!0,message:`enabled — using ~/.dreb/agent/model-routing-guide.md; live scope/guide checked at dispatch`}:{ready:!1,message:`disabled`}}async function _e(){typeof Notification>`u`||b(await Notification.requestPermission())}R(()=>void te()),z(L);let ve=()=>e.store.auth();return(()=>{var i=Hf(),o=i.firstChild,v=o.firstChild.nextSibling.nextSibling,b=v.firstChild.nextSibling;b.firstChild;var S=b.nextSibling,C=S.firstChild.nextSibling.firstChild,k=S.nextSibling,M=k.firstChild.nextSibling.firstChild.firstChild,N=k.nextSibling,P=N.firstChild.nextSibling,F=N.nextSibling,I=F.firstChild,L=I.firstChild.nextSibling,R=I.nextSibling.firstChild.firstChild,z=R.nextSibling,ee=F.nextSibling.firstChild,te=ee.firstChild.nextSibling,oe=ee.nextSibling.firstChild,se=v.nextSibling,le=se.firstChild.nextSibling.firstChild.firstChild.nextSibling,U=se.nextSibling,ye=U.firstChild.nextSibling;return ye.nextSibling,X(i,W(tt,{get store(){return e.store},active:`settings`}),o),X(o,W(K,{get when(){return t()},get children(){var e=If();return X(e,t),e}}),v),X(o,W(K,{get when(){return r().length>0},get children(){var e=Lf();return X(e,W(G,{get each(){return r()},children:e=>(()=>{var t=Uf();return X(t,e),t})()})),e}}),v),X(o,W(K,{get when(){return a()},get children(){return Rf()}}),v),X(o,W(K,{get when(){return x()},get fallback(){return(()=>{var e=Wf();return X(e,()=>t()?`Settings could not be loaded — see the error above.`:`Loading settings…`),e})()},children:t=>[(()=>{var e=Gf(),n=e.firstChild.nextSibling,r=n.firstChild.nextSibling.firstChild,i=n.nextSibling,a=i.firstChild,o=a.firstChild.nextSibling,s=a.nextSibling.firstChild,l=i.nextSibling.firstChild.nextSibling.firstChild;return r.$$click=()=>c({kind:`default`}),X(r,()=>yp(t())),X(o,()=>mp.join(` · `)),s.addEventListener(`change`,e=>ce({defaultThinkingLevel:e.currentTarget.value})),X(s,W(G,{each:mp,children:e=>(()=>{var t=ep();return t.value=e,X(t,e),t})()})),l.addEventListener(`change`,e=>ce({transport:e.currentTarget.value})),X(l,W(G,{get each(){return[...gp]},children:e=>(()=>{var t=ep();return t.value=e,X(t,e),t})()})),j(()=>s.value=t().defaultThinkingLevel??`off`),j(()=>l.value=t().transport??`sse`),e})(),W(Gd,{get cwd(){return p()},get projectRoots(){return T()},get focused(){return e.target===`scoped-models`},onCwdChange:t=>{m(t),e.store.navigate({screen:`settings`,target:`scoped-models`,...t?{cwd:t}:{}})}}),(()=>{var e=Kf(),r=e.firstChild.nextSibling.nextSibling,i=r.firstChild.nextSibling,a=r.nextSibling,o=a.firstChild.nextSibling.firstChild,s=a.nextSibling,l=s.firstChild.nextSibling.firstChild,u=s.nextSibling,d=u.firstChild.nextSibling.firstChild,f=u.nextSibling;return f.firstChild.nextSibling,X(i,W(wp,{get value(){return t().subagentArbiter?.enabled===!0},onChange:e=>{let t=ue();return e&&(typeof t.model!=`string`||!t.model.trim())?(n(`Choose an exact Dispatch Arbiter model before enabling it.`),c({kind:`arbiter`}),!1):(de({enabled:e}),!0)}})),o.$$click=()=>c({kind:`arbiter`}),X(o,(()=>{var e=q(()=>typeof t().subagentArbiter?.model==`string`);return()=>e()?t().subagentArbiter?.model:`choose model…`})()),l.addEventListener(`change`,e=>de({thinking:e.currentTarget.value})),X(l,W(G,{each:mp,children:e=>(()=>{var t=ep();return t.value=e,X(t,e),t})()})),d.addEventListener(`change`,e=>{de({guidePath:e.currentTarget.value.trim()||void 0})}),X(f,()=>ge(t()).message,null),j(()=>je(f,ge(t()).ready?`settings-warning`:`muted small`)),j(()=>l.value=typeof t().subagentArbiter?.thinking==`string`&&mp.some(e=>e===t().subagentArbiter?.thinking)?t().subagentArbiter?.thinking:`off`),j(()=>d.value=typeof t().subagentArbiter?.guidePath==`string`?t().subagentArbiter?.guidePath:``),e})(),(()=>{var e=Jf();return e.firstChild.nextSibling,X(e,W(K,{get when(){return T().length>0},get children(){var e=qf(),t=e.firstChild.nextSibling.firstChild;return t.firstChild,t.addEventListener(`change`,e=>f(e.currentTarget.value||void 0)),X(t,W(G,{get each(){return T()},children:e=>(()=>{var t=ep();return t.value=e,X(t,e),t})()}),null),j(()=>Y(t,`title`,d()??`global/home only`)),j(()=>t.value=d()??``),e}}),null),X(e,W(K,{get when(){return(E()??[]).length>0},get fallback(){return tp()},get children(){return W(G,{get each(){return E()??[]},children:e=>{let n=()=>t().agentModels?.[e.name]??[];return(()=>{var t=rp(),r=t.firstChild,i=r.firstChild,a=i.nextSibling,o=r.nextSibling,s=o.nextSibling;return X(i,()=>e.name),X(a,()=>e.description),X(o,W(K,{get when(){return n().length>0},get fallback(){return ip()},get children(){return W(G,{get each(){return n()},children:(e,t)=>(()=>{var n=ap(),r=n.firstChild;return X(n,()=>t()+1,r),X(n,e,null),n})()})}})),s.$$click=()=>u(l()===e.name?void 0:e.name),X(s,()=>l()===e.name?`done`:`edit`),X(t,W(K,{get when(){return l()===e.name},get children(){var t=np(),r=t.firstChild;return X(t,W(K,{get when(){return n().length>0},get fallback(){return op()},get children(){return W(G,{get each(){return n()},children:(t,r)=>(()=>{var i=sp(),a=i.firstChild,o=a.nextSibling.firstChild,s=o.nextSibling,c=s.nextSibling;return X(a,t),o.$$click=()=>void fe(e.name,Cp(n(),r(),-1)),s.$$click=()=>void fe(e.name,Cp(n(),r(),1)),c.$$click=()=>void fe(e.name,n().filter((e,t)=>t!==r())),j(e=>{var t=r()===0,i=r()===n().length-1;return t!==e.e&&(o.disabled=e.e=t),i!==e.t&&(s.disabled=e.t=i),e},{e:void 0,t:void 0}),i})()})}}),r),r.$$click=()=>c({kind:`agent`,agentName:e.name}),t}}),null),t})()}})}}),null),e})(),(()=>{var e=Yf(),n=e.firstChild.nextSibling,r=n.firstChild.nextSibling,i=n.nextSibling.firstChild.nextSibling;return X(r,W(wp,{get value(){return t().imageAutoResize!==!1},onChange:e=>ce({imageAutoResize:e})})),X(i,W(wp,{get value(){return t().blockImages===!0},onChange:e=>ce({blockImages:e})})),e})(),(()=>{var e=Xf(),n=e.firstChild.nextSibling,r=n.firstChild.nextSibling.firstChild,i=n.nextSibling.firstChild.nextSibling.firstChild;return r.addEventListener(`change`,e=>ce({steeringMode:e.currentTarget.value})),X(r,W(G,{get each(){return[...hp]},children:e=>(()=>{var t=ep();return t.value=e,X(t,e),t})()})),i.addEventListener(`change`,e=>ce({followUpMode:e.currentTarget.value})),X(i,W(G,{get each(){return[...hp]},children:e=>(()=>{var t=ep();return t.value=e,X(t,e),t})()})),j(()=>r.value=t().steeringMode??`all`),j(()=>i.value=t().followUpMode??`all`),e})(),(()=>{var e=Zf(),n=e.firstChild.nextSibling,r=n.firstChild.nextSibling,i=n.nextSibling,a=i.firstChild.nextSibling.nextSibling.nextSibling,o=a.firstChild.nextSibling,s=o.nextSibling,c=i.nextSibling,l=c.firstChild.nextSibling,u=c.nextSibling.nextSibling.firstChild.nextSibling;return X(r,W(wp,{get value(){return t().enableSkillCommands!==!1},onChange:e=>ce({enableSkillCommands:e})})),X(i,W(K,{get when(){return(t().trustedContextFolders??[]).length>0},get fallback(){return cp()},get children(){return W(G,{get each(){return t().trustedContextFolders??[]},children:e=>(()=>{var t=lp(),n=t.firstChild,r=n.nextSibling.nextSibling;return X(n,e),r.$$click=()=>void me(e),X(r,()=>_()?`revoking…`:`revoke trust`),j(()=>r.disabled=_()),t})()})}}),a),a.addEventListener(`submit`,e=>{e.preventDefault();let t=h().trim();t&&pe(t)}),o.$$input=e=>g(e.currentTarget.value),X(s,()=>_()?`trusting…`:`trust folder`),X(l,W(wp,{get value(){return t().autoLoadNestedContext===!0},onChange:e=>ce({autoLoadNestedContext:e})})),X(u,W(wp,{get value(){return t().hideThinkingBlock===!0},onChange:e=>ce({hideThinkingBlock:e})})),j(()=>s.disabled=_()||!h().trim()),j(()=>o.value=h()),e})(),(()=>{var e=Qf(),n=e.firstChild.nextSibling,r=n.firstChild.nextSibling,i=n.nextSibling.firstChild.nextSibling;return X(r,W(wp,{get value(){return t().compactionEnabled!==!1},onChange:e=>ce({compactionEnabled:e})})),X(i,W(wp,{get value(){return t().retryEnabled!==!1},onChange:e=>ce({retryEnabled:e})})),e})(),$f()]}),v),X(b,W(Df,{}),null),C.addEventListener(`change`,e=>rs(e.currentTarget.value)),M.addEventListener(`change`,e=>ns(e.currentTarget.checked)),X(P,W(G,{each:Ro,children:e=>(()=>{var t=up(),n=t.firstChild,r=n.nextSibling;return n.addEventListener(`change`,t=>is(e,t.currentTarget.checked)),Y(n,`id`,`pref-tool-expand-${e}`),X(r,e),j(()=>n.checked=as(e)),t})()})),X(L,(()=>{var e=q(()=>y()===`denied`);return()=>e()?`blocked by browser settings — re-enable notifications in site permissions`:q(()=>y()===`insecure`)()?`this page is not a secure context — notifications need HTTPS. Run the server with --https (tailscale cert <host>.<tailnet>.ts.net) and open it via the https:// hostname`:q(()=>y()===`ios-install`)()?`iOS notifications need the installed PWA — tap Share → Add to Home Screen, then open dreb from the home screen icon`:y()===`unsupported`?`browser notifications are unavailable in this environment`:`show a notification when the tab needs input (Android/desktop need the app installed on mobile; works over HTTPS or localhost)`})()),R.addEventListener(`change`,e=>{e.currentTarget.checked&&_e()}),X(z,()=>y()===`granted`?`enabled`:`enable notifications`),X(te,()=>re()?.supervised?`restarts the server process (a supervisor respawns it with the latest build) — kills all running sessions`:`exits the server process — only auto-restarts if run under a supervisor (systemd, pm2, …); otherwise the dashboard goes down. kills all running sessions`),oe.$$click=()=>ae(!0),X(oe,()=>B()?`restarting…`:`restart`),X(v,W(K,{get when(){return V()},get children(){var e=If();return X(e,V),e}}),null),X(le,()=>ve()?.mode===`local`?`local`:`host`),X(se,W(K,{get when(){return q(()=>!!A()?.enabled)()&&A()?.code},get children(){var e=zf(),t=e.firstChild.nextSibling.firstChild;return X(t,()=>A().code),e}}),null),X(se,W(G,{get each(){return D()??[]},children:e=>(()=>{var t=dp(),n=t.firstChild,r=n.nextSibling,i=r.firstChild,a=r.nextSibling.firstChild;return X(n,()=>e.device??e.id),X(r,()=>e.identity,i),X(r,()=>at(e.createdAt),null),a.$$click=async()=>{await Q.unpair(e.id),await O()},t})()}),null),X(se,W(K,{get when(){return(D()??[]).length===0},get children(){return Bf()}}),null),X(U,(()=>{var e=q(()=>!!re()?.version);return()=>e()?` v${re().version}`:q(()=>!!ne())()?` v${ne()}`:``})(),ye),X(U,W(K,{get when(){return re()?.startedAt},get children(){return[` · server build, up `,q(()=>at(re().startedAt))]}}),null),X(i,W(K,{get when(){return ie()},get children(){return W(rt,{title:`restart dashboard service?`,onDismiss:()=>ae(!1),get actions(){return[(()=>{var e=fp();return e.$$click=()=>ae(!1),e})(),(()=>{var e=pp();return e.$$click=()=>{ae(!1),H()},e})()]},get children(){var e=Vf();return e.firstChild.nextSibling.nextSibling,X(e,()=>re()?.supervised?` A supervisor is detected — the server should respawn automatically with the latest build.`:` No supervisor was detected — the dashboard will NOT come back on its own; you'll need to relaunch it manually.`,null),e}})}}),null),X(i,W(K,{get when(){return s()},children:e=>{let t=()=>{let t=e();return t.kind==="default"?`select default model`:t.kind===`arbiter`?`select Dispatch Arbiter model`:`add model for ${t.agentName}`},n=()=>{let t=e();return t.kind==="default"?x()?.defaultProvider&&x()?.defaultModel?[`${x().defaultProvider}/${x().defaultModel}`]:[]:t.kind===`arbiter`?x()?.subagentArbiter?.model?[x().subagentArbiter.model]:[]:he(t.agentName)};return W(Tp,{get title(){return t()},get models(){return w()??[]},get selected(){return n()},onClose:()=>c(void 0),onPick:t=>{let n=e();if(c(void 0),n.kind==="default"){ce({defaultProvider:t.provider,defaultModel:t.id});return}if(n.kind===`arbiter`){de({model:_p(t)});return}let r=_p(t),i=he(n.agentName);i.includes(r)||fe(n.agentName,[...i,r])}})}}),null),j(e=>{var t=y()===`denied`||y()===`unsupported`||y()===`ios-install`||y()===`insecure`,n=B();return t!==e.e&&(R.disabled=e.e=t),n!==e.t&&(oe.disabled=e.t=n),e},{e:void 0,t:void 0}),j(()=>C.value=ts()),j(()=>M.checked=es()),j(()=>R.checked=y()===`granted`),i})()}Ae([`input`,`click`]);var Dp=J(`<div class="status-line arbitration-history">`),Op=J(`<p class=pair-error>`),kp=J(`<div class=status-line><span class=working>● working`),Ap=J(`<div class=session-screen><header class=session-bar><div class=session-bar-inner><a class=back>← </a><span class=agent-type>subagent · </span><span class=title></span><span class=right></span></div></header><main class=chat><div class=chat-inner></div></main><footer class=dock><div class=dock-inner><div class=readonly-note>viewing live — subagents can't be steered yet; the parent session controls this agent.`),jp=J(`<span>arbiter: `),Mp=J(`<p class=muted>`);function Np(e){let t=e.step===void 0?``:`step ${e.step}: `;return e.status===`failure`?`${t}failed — ${e.errorMessage??e.errorCode??`unknown error`}`:!e.final||e.changed.length===0?`${t}kept ${e.proposed.agent} · ${e.proposed.model} · ${e.proposed.thinking}`:`${t}${e.changed.join(`, `)} changed → ${e.final.agent} · ${e.final.model} · ${e.final.thinking}`}function Pp(e){let t=()=>e.store.sessions[e.sessionKey],n=N(()=>t()?.backgroundAgents[e.agentId]),r=()=>t()?.subagents[e.agentId],i=N(()=>e.store.fleet().runtimes.find(t=>t.key===e.sessionKey)),a=()=>i()?.state.sessionName??e.sessionKey,[o,s]=k(),c,l,u=Mo({scroller:()=>c});return R(()=>{let t=new AbortController;e.store.hydrateSubagent(e.sessionKey,e.agentId,t.signal).catch(e=>{t.signal.aborted&&sl(e)||s(e instanceof Error?e.message:String(e))}),z(()=>t.abort())}),M(()=>{e.store.revisions[e.sessionKey],u.notifyContentChanged()}),R(()=>{u.observeContent(l),u.observeViewport(c),c&&z(Po(u,c,{keyboard:`window`}))}),z(()=>u.dispose()),(()=>{var t=Ap(),i=t.firstChild,s=i.firstChild.firstChild;s.firstChild;var u=s.nextSibling;u.firstChild;var d=u.nextSibling,f=d.nextSibling,p=i.nextSibling,m=p.firstChild,h=p.nextSibling.firstChild,g=h.firstChild;X(s,a,null),X(u,()=>n()?.agentType??`unknown`,null),X(d,()=>n()?.taskSummary??e.agentId),X(f,W(K,{get when(){return n()?.status===`running`},get fallback(){return W($e,{get status(){return n()?.status===`failed`?`error`:`idle`},get label(){return n()?.status}})},get children(){return W($e,{status:`running`})}}));var _=c;typeof _==`function`?Fe(_,p):c=p;var v=l;return typeof v==`function`?Fe(v,m):l=m,X(m,W(K,{get when(){return(n()?.arbitrations?.length??0)>0},get children(){var e=Dp();return X(e,W(G,{get each(){return n()?.arbitrations??[]},children:e=>(()=>{var t=jp();return t.firstChild,X(t,()=>Np(e),null),j(()=>je(t,e.status===`failure`?`error-reason`:`muted`)),t})()})),e}}),null),X(m,W(K,{get when(){return o()},get children(){var e=Op();return X(e,o),e}}),null),X(m,W(K,{get when(){return q(()=>!!r())()&&r().entries.length>0},get fallback(){return(()=>{var e=Mp();return X(e,()=>n()?`waiting for output from this agent…`:`no data for this agent — it may not have started writing its session log yet.`),e})()},get children(){return W(xc,{get entries(){return r().entries},get who(){return n()?.agentType??`agent`},userLabel:`task from parent`,get resetKey(){return`${e.sessionKey}:${e.agentId}`},get imageScope(){return{runtimeKey:e.sessionKey,agentId:e.agentId}}})}}),null),X(h,W(K,{get when(){return r()?.streaming},get children(){return kp()}}),g),j(()=>Y(s,`href`,`#/session/${e.sessionKey}`)),t})()}var Fp=Symbol(`store-raw`),Ip=Symbol(`store-node`),Lp=Symbol(`store-has`),Rp=Symbol(`store-self`);function zp(e){let t=e[p];if(!t&&(Object.defineProperty(e,p,{value:t=new Proxy(e,qp)}),!Array.isArray(e))){let n=Object.keys(e),r=Object.getOwnPropertyDescriptors(e),i=Object.getPrototypeOf(e),a=i!==null&&typeof e==`object`&&!!e&&!Array.isArray(e)&&i!==Object.prototype;if(a){let e=Object.getOwnPropertyDescriptors(i);n.push(...Object.keys(e)),Object.assign(r,e)}for(let i=0,o=n.length;i<o;i++){let o=n[i];a&&o===`constructor`||r[o].get&&Object.defineProperty(e,o,{configurable:!0,enumerable:r[o].enumerable,get:r[o].get.bind(t)})}}return t}function Bp(e){let t;return typeof e==`object`&&!!e&&(e[p]||!(t=Object.getPrototypeOf(e))||t===Object.prototype||Array.isArray(e))}function Vp(e,t=new Set){let n,r,i,a;if(n=e!=null&&e[Fp])return n;if(!Bp(e)||t.has(e))return e;if(Array.isArray(e)){Object.isFrozen(e)?e=e.slice(0):t.add(e);for(let n=0,a=e.length;n<a;n++)i=e[n],(r=Vp(i,t))!==i&&(e[n]=r)}else{Object.isFrozen(e)?e=Object.assign({},e):t.add(e);let n=Object.keys(e),o=Object.getOwnPropertyDescriptors(e);for(let s=0,c=n.length;s<c;s++)a=n[s],!o[a].get&&(i=e[a],(r=Vp(i,t))!==i&&(e[a]=r))}return e}function Hp(e,t){let n=e[t];return n||Object.defineProperty(e,t,{value:n=Object.create(null)}),n}function Up(e,t,n){if(e[t])return e[t];let[r,i]=k(n,{equals:!1,internal:!0});return r.$=i,e[t]=r}function Wp(e,t){let n=Reflect.getOwnPropertyDescriptor(e,t);return!n||n.get||!n.configurable||t===p||t===Ip?n:(delete n.value,delete n.writable,n.get=()=>e[p][t],n)}function Gp(e){ee()&&Up(Hp(e,Ip),Rp)()}function Kp(e){return Gp(e),Reflect.ownKeys(e)}var qp={get(e,t,n){if(t===Fp)return e;if(t===p)return n;if(t===m)return Gp(e),n;let r=Hp(e,Ip),i=r[t],a=i?i():e[t];if(t===Ip||t===Lp||t===`__proto__`)return a;if(!i){let n=Object.getOwnPropertyDescriptor(e,t);ee()&&(typeof a!=`function`||Object.prototype.hasOwnProperty.call(e,t))&&!(n&&n.get)&&(a=Up(r,t,a)())}return Bp(a)?zp(a):a},has(e,t){return t===Fp||t===p||t===m||t===Ip||t===Lp||t===`__proto__`?!0:(ee()&&Up(Hp(e,Lp),t)(),t in e)},set(){return!0},deleteProperty(){return!0},ownKeys:Kp,getOwnPropertyDescriptor:Wp};function Jp(e,t,n,r=!1){if(t===`__proto__`||!r&&e[t]===n)return;let i=e[t],a=e.length;n===void 0?(delete e[t],e[Lp]&&e[Lp][t]&&i!==void 0&&e[Lp][t].$()):(e[t]=n,e[Lp]&&e[Lp][t]&&i===void 0&&e[Lp][t].$());let o=Hp(e,Ip),s;if((s=Up(o,t,i))&&s.$(()=>n),Array.isArray(e)&&e.length!==a){for(let t=e.length;t<a;t++)(s=o[t])&&s.$();(s=Up(o,`length`,a))&&s.$(e.length)}(s=o[Rp])&&s.$()}function Yp(e,t){let n=Object.keys(t);for(let r=0;r<n.length;r+=1){let i=n[r];Xp(i)||Jp(e,i,t[i])}}function Xp(e){return e===`__proto__`||e===`constructor`||e===`prototype`}function Zp(e,t){if(typeof t==`function`&&(t=t(e)),t=Vp(t),Array.isArray(t)){if(e===t)return;let n=0,r=t.length;for(;n<r;n++){let r=t[n];e[n]!==r&&Jp(e,n,r)}Jp(e,`length`,r)}else Yp(e,t)}function Qp(e,t,n=[]){let r,i=e;if(t.length>1){r=t.shift();let a=typeof r,o=Array.isArray(e);if(a===`string`&&(r===`__proto__`||t.length>1&&Xp(r)))return;if(Array.isArray(r)){for(let i=0;i<r.length;i++)Qp(e,[r[i]].concat(t),n);return}else if(o&&a===`function`){for(let i=0;i<e.length;i++)r(e[i],i)&&Qp(e,[i].concat(t),n);return}else if(o&&a===`object`){let{from:i=0,to:a=e.length-1,by:o=1}=r;for(let r=i;r<=a;r+=o)Qp(e,[r].concat(t),n);return}else if(t.length>1){Qp(e[r],t,[r].concat(n));return}i=e[r],n=[r].concat(n)}let a=t[0];typeof a==`function`&&(a=a(i,n),a===i)||r===void 0&&a==null||(a=Vp(a),r===void 0||Bp(i)&&Bp(a)&&!Array.isArray(a)?Yp(i,a):Jp(e,r,a))}function $p(...[e,t]){let n=Vp(e||{}),r=Array.isArray(n),i=zp(n);function a(...e){I(()=>{r&&e.length===1?Zp(n,e[0]):Qp(n,e)})}return[i,a]}var em=new WeakMap,tm={get(e,t){if(t===Fp)return e;let n=e[t];if(t===p||t===m||t===Ip||t===Lp||t===`__proto__`)return n;let r;return Bp(n)?em.get(n)||(em.set(n,r=new Proxy(n,tm)),r):n},set(e,t,n){return Jp(e,t,Vp(n)),!0},deleteProperty(e,t){return Jp(e,t,void 0,!0),!0}};function nm(e){return t=>{if(Bp(t)){let n;(n=em.get(t))||em.set(t,n=new Proxy(t,tm)),e(n)}return t}}function rm(){let[e,t=``]=window.location.hash.replace(/^#\/?/,``).split(`?`,2),[n,...r]=e.split(`/`);if(n===`session`&&r[0])return r[1]===`subagent`&&r[2]?{screen:`subagent`,key:r[0],agentId:r[2]}:{screen:`session`,key:r[0]};if(n===`files`)return{screen:`files`,path:r.length?decodeURIComponent(r.join(`/`)):void 0};if(n===`memories`)return{screen:`memories`};if(n===`settings`){if(r[0]===`scoped-models`){let e=new URLSearchParams(t).get(`cwd`)||void 0;return{screen:`settings`,target:`scoped-models`,...e?{cwd:e}:{}}}return{screen:`settings`}}return n===`pairing`?{screen:`pairing`}:{screen:`fleet`}}function im(e){switch(e.screen){case`fleet`:return`#/`;case`session`:return`#/session/${e.key}`;case`subagent`:return`#/session/${e.key}/subagent/${e.agentId}`;case`files`:return e.path?`#/files/${encodeURIComponent(e.path)}`:`#/files`;case`memories`:return`#/memories`;case`settings`:return e.target===`scoped-models`?`#/settings/scoped-models${e.cwd?`?cwd=${encodeURIComponent(e.cwd)}`:``}`:`#/settings`;case`pairing`:return`#/pairing`}}var am=2e3,om=3*1024*1024,sm=am,cm=om,lm=3e4,um=1e4,dm=1e3,fm=3e4,pm=new TextEncoder;function mm(e,t,n){e.statusEntries=e.statusEntries.filter(e=>e.key!==`retry`);let r=n.retryAttempt??0;if(n.isRetrying&&r>0){let t=e.entries.findLast(e=>e.kind===`assistant`&&e.stopReason===`error`),n=t?.errorMessage?` — ${t.errorMessage}`:``;e.statusEntries.push({key:`retry`,text:`retrying (attempt ${r})${n}`,tone:`warning`})}sn(e,t,n.isStreaming||n.isRetrying||n.isCompacting)}function hm(){let[e,t]=$p({}),[n,r]=$p({}),[i,a]=k(rm()),[o,s]=k({runtimes:[],diskSessions:[]}),[c,l]=k(),[u,d]=k(),[f,p]=k(),[m,h]=k(!1),[g,_]=k(),[v,y]=k({state:`disconnected`,attempt:0}),b=()=>v().state===`connected`,[x,S]=k([]),C=new Map,w=new Map,T=new Map,E=0,D=0,O,A,j,M,N=!1,P=0,F=!1,I,L=0,R=new Map,z=new Map,ee=new Map,te=0,ne=0,re,ie=new Set,ae=!1;window.addEventListener(`hashchange`,()=>a(rm()));function B(e){window.location.hash=im(e)}function oe(e){return n[e]??0}function V(e){return C.get(e)??0}function se(e){return w.get(e)??0}function H(e){w.set(e,se(e)+1)}function ce(e){C.set(e,V(e)+1)}function le(e){return{revision:oe(e),generation:V(e),epoch:E}}function U(e,t){return V(e)===t.generation&&E===t.epoch}function ue(e,t){return oe(e)===t.revision&&U(e,t)}function de(e,t){t&&T.get(e)!==t||(T.delete(e),t&&(t.queued=[],t.queuedBytes=0))}function fe(e){r(e,oe(e)+1)}function pe(n){e[n]||t(n,Vt(n))}function me(e,n){pe(e),t(e,nm(n)),fe(e)}function he(e){de(e),ce(e),w.delete(e),t(e,void 0),r(e,void 0),ml(e)}function ge(){let e=rm();return e.screen===`session`||e.screen===`subagent`?e.key:void 0}function _e(e,t=`info`){--D,S(n=>[...n,{id:D,text:e,tone:t}].slice(-20))}function ve(e){return R.get(e)??0}function ye(e,t,n){let r=new Map(e.map(e=>[e.key,JSON.stringify(e.state)])),i=new Map(t.map(e=>[e.key,JSON.stringify(e.state)]));for(let e of new Set([...r.keys(),...i.keys()])){if(r.get(e)===i.get(e))continue;let t=ve(e)+1;R.set(e,t),n===void 0?z.set(e,t):ee.set(e,Math.max(ee.get(e)??-1,n))}}function be(e,t){s(n=>{let r=e(n);return L+=1,ye(n.runtimes,r.runtimes,t),r})}function xe(e){ie.clear(),be(()=>e)}function Se(e,t){let n=new Set(e.filter(e=>!ie.has(e.key)).map(e=>e.key)),r=n.size!==o().runtimes.length||o().runtimes.some(e=>!n.has(e.key));be(t=>{let n=new Map(t.runtimes.map(e=>[e.key,e]));return{...t,runtimes:e.filter(e=>!ie.has(e.key)).map(e=>{let t=n.get(e.key);return{...e,state:{...e.state,contextUsage:t?.state.contextUsage??e.state.contextUsage},...t?.stats===void 0?{}:{stats:t.stats},...t?.lastAssistantText===void 0?{}:{lastAssistantText:t.lastAssistantText}}})}},t),r&&we().catch(()=>{})}function Ce(e){let t=ie.has(e);return ie.add(e),t?(he(e),Promise.resolve()):(be(t=>({...t,runtimes:t.runtimes.filter(t=>t.key!==e)})),he(e),we())}function W(){let e=++te,t=L;return Q.fleet().then(n=>{e!==te||t!==L||(xe(n),l(void 0))},n=>{throw e===te&&t===L&&l(n instanceof Error?n.message:String(n)),n})}function we(){let e=++ne;return Q.sessions().then(t=>{e===ne&&(be(e=>({...e,diskSessions:t.sessions})),l(void 0))},t=>{throw e===ne&&l(t instanceof Error?t.message:String(t)),t})}function G(e){ie.delete(e.key),be(t=>{let n=t.runtimes.findIndex(t=>t.key===e.key);if(n===-1)return{...t,runtimes:[...t.runtimes,e]};let r=[...t.runtimes];return r[n]=e,{...t,runtimes:r}})}function K(e,t,n,r){if(o().runtimes.some(t=>t.key===e)){if(n!==void 0&&ve(e)!==n){let t=z.get(e)??0,i=ee.get(e);if(t>n||i===void 0||i>r)return}be(n=>({...n,runtimes:n.runtimes.map(n=>n.key===e?{...n,state:t}:n)}))}}function Te(e,t){be(n=>({...n,runtimes:n.runtimes.map(n=>n.key===e?{...n,state:{...n.state,model:t}}:n)}))}function Ee(e,t){be(n=>({...n,runtimes:n.runtimes.map(n=>n.key===e?{...n,state:{...n.state,thinkingLevel:t}}:n)}))}function q(e,t,n){return{...e,state:{...e.state,...t.contextUsage===void 0?{}:{contextUsage:t.contextUsage},messageCount:n?e.state.messageCount:t.totalMessages},stats:{tokensTotal:t.tokens.total,cost:t.cost}}}function De(e){let t=new AbortController,n,r=new Promise((r,i)=>{n=setTimeout(()=>{let n=Error(`Stats request for runtime ${e} timed out after ${um} ms`);i(n),t.abort(n)},um)});return Promise.race([Q.stats(e,t.signal),r]).finally(()=>{n!==void 0&&clearTimeout(n)})}function Oe(){if(re)return re;let e=o().runtimes.map(e=>e.key),t=new Map(e.map(e=>[e,ve(e)])),n=e.map(e=>De(e)),r=Promise.allSettled(n).then(n=>{let r=new Map,i=[];for(let[t,a]of n.entries())a.status===`fulfilled`?r.set(e[t],a.value):i.push(a.reason instanceof Error?a.reason.message:String(a.reason));r.size>0&&be(e=>({...e,runtimes:e.runtimes.map(e=>{let n=r.get(e.key),i=t.get(e.key),a=i===void 0||ve(e.key)!==i;return n?q(e,n,a):e})})),d(i.length>0?i.join(`; `):void 0)}).finally(()=>{re===r&&(re=void 0)});return re=r,r}function ke(e){return pm.encode(JSON.stringify(e)).byteLength}function J(e){e.queued=[],e.queuedBytes=0}function Ae(){j!==void 0&&clearTimeout(j),j=void 0}function Y(){return Math.min(fm,dm*2**Math.max(0,P-1))}function je(){if(ae||j!==void 0)return;P+=1;let e=Y();h(!1),M||=v(),y(t=>t.state===`auth_failed`?t:(N=!0,{...t,state:`retrying`,attempt:Math.max(t.attempt,P),retryDelayMs:e,retryAt:Date.now()+e})),j=setTimeout(()=>{j=void 0,X()},e)}function Me(){let e=M,t=N;M=void 0,N=!1,!(!t||e?.state!==`connected`||v().state!==`retrying`)&&y({state:`connected`,attempt:e.attempt,lastAppliedSeq:e.lastAppliedSeq})}function Ne(e){let t=e.event?.type;if(t===`fleet_snapshot`)Se(e.event.runtimes,e.seq);else if(t===`disk_sessions_changed`)we().catch(()=>{});else if(t===`runtime_removed`){if(e.key){let t=ge()===e.key;Ce(e.key).catch(()=>{}),t&&(_e(`session ${e.key} was stopped`,`warning`),B({screen:`fleet`}))}}else e.key&&(me(e.key,t=>fn(t,e.event)),t===`tasks_update`&&H(e.key))}function Pe(e){let t=e.subagent;me(e.key,n=>{let r=e.messages;if(n.entries=Yt(r),n.tasks=(e.state.tasks??[]).map(e=>({...e})),n.streaming=e.state.isStreaming,n.compacting=e.state.isCompacting,n.sessionName=e.state.sessionName,n.model=e.state.model?.id,n.contextUsage=e.state.contextUsage,n.uiRequests=(e.pendingExtensionUiRequests??[]).map(e=>Bt(e)).filter(e=>e!==void 0),n.statusEntries=[],n.suggestedCommand=void 0,n.lastError=void 0,n.widgets={above:[],below:[]},n.toasts=[],n.title=void 0,n.composerPrefill=void 0,mm(n,r,e.state),n.streaming?(n.workingSince=Date.now(),n.workingText=`working`):(n.workingSince=void 0,n.workingText=void 0),n.backgroundAgents=Object.fromEntries(e.backgroundAgents.map(e=>[e.agentId,e])),en(n),t){let r=e.backgroundAgents.find(e=>e.agentId===t.agentId)??t.agent;n.backgroundAgents[t.agentId]=r,n.subagents[t.agentId]={agentId:t.agentId,entries:Yt(t.messages),streaming:r.status===`running`}}tn(n)}),H(e.key)}function Fe(e,t){if(A!==e||e.state!==`active`||e.barrierSeq===void 0)return;Ae(),P=0,Me();let n=e.barrierSeq;if(I=n,xe(t.fleet),l(void 0),t.active)Pe(t.active);else{let e=ge();e&&(he(e),_e(`session ${e} was stopped`,`warning`),B({screen:`fleet`}))}let r=[...e.queued].sort((e,t)=>e.seq-t.seq),i=t.active?.subagent;if(i&&t.active)for(let e of r)e.seq>i.barrierSeq&&e.seq<=n&&e.key===t.active.key&&e.event.type===`background_agent_event`&&String(e.event.agentId)===i.agentId&&Ne(e);for(let e of r)e.seq>n&&Ne(e);J(e),A=void 0,h(!1),p(void 0)}function X(e=!1){if(ae)return Promise.resolve();if(O)return(e||A?.state===`failed`)&&(F=!0),O;Ae();let t=i(),n=t.screen===`session`||t.screen===`subagent`?t.key:void 0,r=t.screen===`subagent`?t.agentId:void 0,a={queued:[],queuedBytes:0,state:`active`,controller:new AbortController};A=a,E+=1;for(let[e,t]of T)de(e,t);h(!0),p(void 0);let o=setTimeout(()=>a.controller.abort(`Dashboard recovery timed out`),lm),s=Q.resync(n,r,a.controller.signal).then(e=>{a.barrierSeq=e.barrierSeq,Fe(a,e)}).catch(e=>{if(A!==a)return;a.state=`failed`,J(a);let t=a.controller.signal.reason;p(typeof t==`string`?t:e instanceof Error?e.message:String(e)),je(),j===void 0&&h(!1)}).finally(()=>{clearTimeout(o),O===s&&(O=void 0),!ae&&F&&(F=!1,X())});return O=s,s}function Ie(){return X(!0)}function Le(e){if(e.event?.type===`dashboard_resync`){X(!0);return}if(A){if(A.state===`failed`)throw je(),Error(`Dashboard recovery is failed; refusing to acknowledge live envelope before resync succeeds`);let t=ke(e);if(A.queued.length>=am||A.queuedBytes+t>om){J(A),A.state=`failed`;let e=`Dashboard recovery queue overflowed; waiting for a newer authoritative snapshot`;throw p(e),A.controller.abort(e),je(),j===void 0&&h(!1),Error(e)}A.queued.push(e),A.queuedBytes+=t;return}if(I!==void 0&&e.seq<=I)return;let t=e.key?T.get(e.key):void 0;if(t){let n=ke(e);if(t.queued.length>=sm||t.queuedBytes+n>cm)throw de(e.key,t),Error(`Dashboard hydration queue overflowed for ${e.key}; refusing an incomplete snapshot replay`);t.queued.push(e),t.queuedBytes+=n}Ne(e)}let Re;async function ze(){ae=!1;try{let e=await Q.auth();_(e)}catch(e){_({mode:`remote`,needsPairing:e?.body?.needsPairing??!1,identity:e?.body?.identity,error:e?.message}),B({screen:`pairing`});return}await W().catch(()=>{}),Re=vt({onEnvelope:Le,onStatusChange:e=>{N=!1,M=e.state===`connected`?e:void 0,y(e)},onRecovery:()=>{X()}})}function Be(){ae=!0,Re?.(),Ae(),M=void 0,N=!1,F=!1;let e=A;A=void 0,e&&J(e),e?.controller.abort(`Dashboard stopped`);for(let[e,t]of T)de(e,t)}function Ve(t){if(x().some(e=>e.id===t)){S(e=>e.filter(e=>e.id!==t));return}for(let[n,r]of Object.entries(e))if(r.toasts.some(e=>e.id===t)){me(n,e=>pn(e,t));return}}async function He(e,t){de(e);let n=ve(e),r={guard:le(e),queued:[],queuedBytes:0};T.set(e,r);let i=()=>de(e,r);t?.addEventListener(`abort`,i,{once:!0}),t?.aborted&&i();try{let i=await Q.hydrate(e,t);if(t?.aborted||T.get(e)!==r||!U(e,r.guard))return;me(e,e=>{let t=i.messages;e.entries=Yt(t),e.backgroundAgents=Object.fromEntries(i.backgroundAgents.map(e=>[e.agentId,e])),en(e),e.streaming=i.state.isStreaming,e.compacting=i.state.isCompacting,e.tasks=(i.state.tasks??[]).map(e=>({...e})),i.state.isStreaming?(e.workingSince=Date.now(),e.workingText=`working`):(e.workingSince=void 0,e.workingText=void 0),e.uiRequests=(i.pendingExtensionUiRequests??[]).map(e=>Bt(e)).filter(e=>e!==void 0),mm(e,t,i.state),tn(e)}),H(e),K(e,i.state,n,i.barrierSeq);for(let e of[...r.queued].sort((e,t)=>e.seq-t.seq))e.seq>i.barrierSeq&&Ne(e)}finally{t?.removeEventListener(`abort`,i),de(e,r)}}async function Ue(e,t,n){let r=le(e),{agent:i,messages:a}=await Q.subagentMessages(e,t,n);n?.aborted||!ue(e,r)||me(e,e=>{e.backgroundAgents[t]=i;let n=e.subagents[t];n||(n={agentId:t,entries:[],streaming:i.status===`running`},e.subagents[t]=n),a.length>0&&(n.entries=Yt(a)),n.streaming=i.status===`running`})}return{sessions:e,revisions:n,route:i,navigate:B,fleet:o,fleetError:c,fleetStatsError:u,refreshFleet:W,refreshDiskSessions:we,refreshFleetStats:Oe,removeRuntime:Ce,upsertRuntime:G,setRuntimeModel:Te,setRuntimeThinkingLevel:Ee,resyncing:m,resyncError:f,retryResync:Ie,auth:g,connected:b,connection:v,notices:x,start:ze,stop:Be,dismissToast:Ve,resolveUiRequest(e,t){me(e,e=>mn(e,t))},hydrateSession:He,hydrateSubagent:Ue}}var gm=5e3;function _m(e){let t;return Promise.race([e,new Promise((e,n)=>{t=setTimeout(()=>n(Error(`service worker not ready`)),gm)})]).finally(()=>{t&&clearTimeout(t)})}function vm(){let e=hm();R(()=>{e.start(),`serviceWorker`in navigator&&(navigator.serviceWorker.addEventListener(`message`,t=>{if(t.data?.type===`navigate-session`&&typeof t.data.sessionKey==`string`){let n=t.data.sessionKey,r=!!e.sessions[n]||e.fleet().runtimes.some(e=>e.key===n);e.navigate(r?{screen:`session`,key:n}:{screen:`fleet`})}}),navigator.serviceWorker.register(`./sw.js`).catch(e=>{console.warn(`dashboard: service worker registration failed`,e)}))}),z(()=>e.stop());let t=new Set,n=new Set,r=t=>!!(e.fleet().runtimes.find(e=>e.key===t)?.needsAttention||e.sessions[t]?.needsAttention);M(()=>{let i=new Map;for(let t of e.fleet().runtimes)t.needsAttention&&i.set(t.key,{name:t.state.sessionName??t.state.sessionId.slice(0,8),reason:`needs attention`});for(let t of Object.values(e.sessions))t.needsAttention&&i.set(t.key,{name:t.sessionName??t.title??t.key,reason:nn(t.uiRequests)??t.statusEntries.find(e=>e.tone===`error`)?.text??`needs attention`});let a=i.size>0,o=e.route(),s=o.screen===`session`||o.screen===`subagent`?o.key:void 0,c=s?e.sessions[s]:void 0,l=s?e.fleet().runtimes.find(e=>e.key===s):void 0,u=c?.title??c?.sessionName??l?.state.sessionName,d=u?`${u} — dreb`:`dreb`;document.title=a?`◆ ${d}`:d;for(let[e,a]of i)n.has(e)||t.has(e)||typeof Notification<`u`&&Notification.permission===`granted`&&document.visibilityState!==`visible`&&`serviceWorker`in navigator&&(t.add(e),_m(navigator.serviceWorker.ready).then(t=>t.showNotification(`dreb — ${a.name}`,{body:a.reason,tag:e,data:{sessionKey:e}})).then(()=>{t.delete(e),r(e)?n.add(e):n.delete(e)}).catch(n=>{t.delete(e),console.warn(`dashboard: showNotification failed`,n)}));for(let e of[...n])i.has(e)||n.delete(e);for(let e of[...t])i.has(e)||t.delete(e)});let i=()=>[...Object.values(e.sessions).flatMap(e=>e.toasts.map(t=>({...t,sessionKey:e.key}))),...e.notices()].slice(-5);return[W(Te,{get fallback(){return W(Qn,{store:e})},get children(){return[W(Ee,{get when(){return e.route().screen===`session`},get children(){return W(Td,{store:e,get sessionKey(){return e.route().key}})}}),W(Ee,{get when(){return e.route().screen===`subagent`},get children(){return W(Pp,{store:e,get sessionKey(){return e.route().key},get agentId(){return e.route().agentId}})}}),W(Ee,{get when(){return e.route().screen===`files`},get children(){return W(Rt,{store:e,get initialPath(){return e.route().path}})}}),W(Ee,{get when(){return e.route().screen===`memories`},get children(){return W(Zc,{store:e})}}),W(Ee,{get when(){return e.route().screen===`settings`},get children(){return W(Ep,{store:e,get target(){return e.route().target},get routeScopedModelsCwd(){return e.route().cwd}})}}),W(Ee,{get when(){return e.route().screen===`pairing`},get children(){return W(rl,{store:e})}})]}}),W(it,{get toasts(){return i()},onDismiss:t=>e.dismissToast(t)})]}Sf();var ym=document.getElementById(`root`);if(!ym)throw Error(`dashboard: #root element missing from index.html`);ke(()=>W(vm,{}),ym);
|
|
79
|
+
<span class=hljs-function>render</span><span class=hljs-punctuation>(</span><span class=hljs-string>"ok"</span><span class=hljs-punctuation>)</span><span class=hljs-punctuation>;</span></code></pre></div><span class=theme-card-footer><span class=theme-card-title></span><span class=theme-card-state>`),Of=[`running`,`attention`,`idle`,`error`];function kf(){let e=()=>{let e=ff();return e===`system`?void 0:e};return(()=>{var t=Tf(),n=t.firstChild,r=n.firstChild.nextSibling.firstChild,i=n.nextSibling;return r.addEventListener(`change`,e=>_f(e.currentTarget.value)),X(r,W(G,{each:Xd,children:e=>(()=>{var t=Ef();return t.value=e,X(t,e),t})()})),X(i,W(G,{each:Jd,children:t=>{let n=()=>df()===t.id;return(()=>{var r=Df(),i=r.firstChild,a=i.firstChild,o=a.firstChild,s=a.nextSibling,c=i.nextSibling.firstChild,l=c.nextSibling;return r.$$click=()=>gf(t.id),X(o,()=>t.label),X(s,W(G,{each:Of,children:e=>W($e,{status:e,label:``})})),X(c,()=>t.label),X(l,()=>n()?`✓ active`:`select`),j(i=>{var a=!!n(),o=t.id,s=t.id,c=e(),l=n(),u=n()?`true`:void 0,d=`use the ${t.label} theme`;return a!==i.e&&r.classList.toggle(`active`,i.e=a),o!==i.t&&Y(r,`data-theme-card`,i.t=o),s!==i.a&&Y(r,`data-theme`,i.a=s),c!==i.o&&Y(r,`data-color-mode`,i.o=c),l!==i.i&&Y(r,`aria-pressed`,i.i=l),u!==i.n&&Y(r,`aria-current`,i.n=u),d!==i.s&&Y(r,`title`,i.s=d),i},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),r})()}})),j(()=>r.value=ff()),t})()}Ae([`click`]);var Af=J(`<select><option value=on>on</option><option value=off>off`),jf=J(`<div class=field style=margin-bottom:8px><input type=text placeholder="search models…">`),Mf=J(`<div class=model-list style=max-height:320px>`),Nf=J(`<p class="muted small">No matching models.`),Pf=J(`<section class=model-provider-group><div class=model-provider-heading>`),Ff=J(`<span class=model-name>`),If=J(`<span class=model-reasoning>think`),Lf=J(`<button type=button class=model-row><span class=model-current></span><span class=model-id></span><span class=model-provider-badge>`),Rf=J(`<div class=settings-error>`),zf=J(`<div class=settings-warning>`),Bf=J(`<p class="muted small"style=margin-bottom:16px>✓ saved`),Vf=J(`<div class=setting-row><span class=setting-label><span class=name>pairing code</span><span class=hint>new devices enter this in the pairing screen; it rotates every 30s</span></span><span class=setting-control><code style=font-size:var(--fs-h2);letter-spacing:0.08em>`),Hf=J(`<p class="muted small"style=padding-top:8px>No remote devices paired. Launch with <code>--remote --allow <identity></code> to enable Tailscale access.`),Uf=J(`<p>This exits the dashboard server process and terminates <strong>all running sessions</strong>.`),Wf=J(`<div class=screen-fill><main class="container settings-wrap"><h1>settings</h1><p class=settings-intro>Ordinary defaults apply only to new sessions. Dispatch Arbiter changes apply to subsequent child spawns. Context trust changes apply to subsequent lazy loads in live sessions; already injected content cannot be retracted. Writes go to the global settings file on the host.</p><section class=settings-section><h2>dashboard</h2><div class=appearance-block><div class="setting-row appearance-heading-row"><span class=setting-label><span class=name>appearance</span><span class=hint>this browser only — theme and light/dark mode are stored in localStorage and are independent of the TUI theme. Okabe-Ito and Paul Tol are colorblind-safe palettes.</span></span></div></div><div class=setting-row><label class=setting-label for=pref-image-display-mode><span class=name>tool-result images</span><span class=hint>this browser only — placeholders make no automatic request, previews are bounded to 1024 px and 256 KiB, and originals automatically transfer full files. Choosing originals is the informed network-data opt-in.</span></label><span class=setting-control><select id=pref-image-display-mode><option value=placeholders>placeholders</option><option value=previews>bounded previews</option><option value=originals>automatic originals</option></select></span></div><div class=setting-row><span class=setting-label><span class=name>always expand thinking</span><span class=hint>this browser only — stored in localStorage, not the host settings file</span></span><span class=setting-control><label class=checkbox-control><input id=pref-expand-thinking type=checkbox><span>open by default</span></label></span></div><div class=setting-row><span class=setting-label><span class=name>auto-expand tool cards</span><span class=hint>this browser only — stored in localStorage, not the host settings file</span></span><span class=setting-control style=display:grid;gap:6px></span></div><div class=setting-row><span class=setting-label><span class=name>needs-attention notifications</span><span class=hint></span></span><span class=setting-control><label class=checkbox-control><input id=pref-notifications type=checkbox><span></span></label></span></div><div class=setting-row><span class=setting-label><span class=name>restart dashboard service</span><span class=hint></span></span><span class=setting-control><button type=button class="btn btn-small btn-danger"></button></span></div></section><section class=settings-section><h2>devices</h2><div class=device-row><span>this machine <span class=this-device></span></span><span class=meta>local · always allowed</span></div></section><footer>dreb<!> · dashboard`),Gf=J(`<div>`),Kf=J(`<p class=muted>`),qf=J(`<section class=settings-section><h2>model</h2><div class=setting-row><span class=setting-label><span class=name>default model</span><span class=hint>used by new sessions; validated against configured providers</span></span><span class=setting-control><button type=button class="btn btn-small model-picker-button"></button></span></div><div class=setting-row><span class=setting-label><span class=name>default thinking level</span><span class=hint></span></span><span class=setting-control><select></select></span></div><div class=setting-row><span class=setting-label><span class=name>transport</span><span class=hint>preferred model transport for new sessions</span></span><span class=setting-control><select>`),Jf=J(`<section class="settings-section dispatch-arbiter-settings"><h2>dispatch arbiter</h2><p class="muted small"style=margin-bottom:8px>Global-only, fully headless pre-spawn routing. Project settings cannot change it. When enabled, invalid model, scope, guide, inference, or output prevents the affected child from spawning.</p><div class=setting-row><span class=setting-label><span class=name>enabled</span><span class=hint>disabled by default; fail closed when enabled</span></span><span class=setting-control></span></div><div class=setting-row><span class=setting-label><span class=name>arbiter model</span><span class=hint>exact authenticated provider/model; no fallback</span></span><span class=setting-control><button type=button class="btn btn-small model-picker-button"></button></span></div><div class=setting-row><span class=setting-label><span class=name>arbiter thinking</span><span class=hint>validated against the selected arbiter model</span></span><span class=setting-control><select></select></span></div><div class=setting-row><label class=setting-label for=dispatch-arbiter-guide-path><span class=name>routing guide path</span><span class=hint>blank uses ~/.dreb/agent/model-routing-guide.md</span></label><span class=setting-control><input id=dispatch-arbiter-guide-path type=text placeholder=~/.dreb/agent/model-routing-guide.md></span></div><div data-testid=dispatch-arbiter-readiness><strong>status:</strong> `),Yf=J(`<div class="setting-row agent-context-row"><span class=setting-label><span class=name>agent definition context</span><span class=hint>choose a project to include its .dreb/agents definitions</span></span><span class=setting-control><select><option value>global/home only`),Xf=J(`<section class=settings-section><h2>agent models</h2><p class="muted small"style=margin-bottom:8px>Per-agent fallback lists. First available model wins; empty lists revert to the default model. Agent definitions are loaded from an explicit project context so project-local agents do not depend on which runtime opened first.`),Zf=J(`<section class=settings-section><h2>images</h2><div class=setting-row><span class=setting-label><span class=name>auto-resize images</span><span class=hint>resize image inputs before sending them to providers</span></span><span class=setting-control></span></div><div class=setting-row><span class=setting-label><span class=name>block images</span><span class=hint>prevent image inputs from being sent to providers</span></span><span class=setting-control>`),Qf=J(`<section class=settings-section><h2>queueing</h2><div class=setting-row><span class=setting-label><span class=name>steering delivery</span><span class=hint>deliver queued steers all at once, or one per turn</span></span><span class=setting-control><select></select></span></div><div class=setting-row><span class=setting-label><span class=name>follow-up delivery</span><span class=hint>deliver queued follow-ups all at once, or one per turn</span></span><span class=setting-control><select>`),$f=J(`<section class=settings-section><h2>behavior</h2><div class=setting-row><span class=setting-label><span class=name>skill slash commands</span><span class=hint>register skills as slash commands in new sessions</span></span><span class=setting-control></span></div><div class=context-trust-subsection><h3>trusted context folders</h3><p class="muted small">Specific global roots that may lazy-load nested AGENTS.md/CLAUDE.md and all descendants.</p><div class="settings-warning context-trust-global-warning"><strong>Global-only policy.</strong> Project <code>.dreb/settings.json</code> cannot enable, disable, or extend nested-context trust. Only these global settings and the Files view can; a cloned repository cannot grant itself trust.</div><form class=trusted-context-folder-add><label for=trusted-context-folder-path>add folder by path</label><input id=trusted-context-folder-path type=text placeholder=/path/to/project><button type=submit class="btn btn-small"></button></form></div><div class=setting-row><span class=setting-label><span class=name>global expert nested-context trust</span><span class=hint>allow nested AGENTS.md/CLAUDE.md from any resolvable directory</span></span><span class=setting-control></span></div><div class="settings-warning context-expert-warning"><strong>Expert global override.</strong> Project <code>.dreb/settings.json</code> cannot enable, disable, or extend nested-context trust; a cloned repository cannot grant itself trust. When ON, nested instructions from any resolvable directory may load, including untrusted prompt-injection content. Leave this OFF and use trusted folders for projects you control.</div><div class=setting-row><span class=setting-label><span class=name>hide thinking blocks</span><span class=hint>hide raw thinking blocks in rendered transcripts</span></span><span class=setting-control>`),ep=J(`<section class=settings-section><h2>reliability</h2><div class=setting-row><span class=setting-label><span class=name>auto-compaction</span><span class=hint>summarize old context when the window fills</span></span><span class=setting-control></span></div><div class=setting-row><span class=setting-label><span class=name>auto-retry</span><span class=hint>retry transient stream errors (rate limits, 5xx)</span></span><span class=setting-control>`),tp=J(`<p class="muted small settings-footnote">TUI-only settings (cursor, editor) are managed in the terminal /settings menu. The dashboard appearance (theme + light/dark mode) is set here, per-browser, and is independent of the TUI theme.`),np=J(`<option>`),rp=J(`<p class="muted small">No agent definitions found.`),ip=J(`<div class=agent-model-editor><button type=button class="btn btn-small">add model…`),ap=J(`<div class=agent-model-row><div class=agent-model-summary><span class=agent-model-name></span><span class=agent-model-description></span></div><div class=agent-model-fallbacks></div><button type=button class="btn btn-small agent-model-edit">`),op=J(`<span class="muted small">default`),sp=J(`<span class=agent-model-chip>. `),cp=J(`<p class="muted small">Using the default model.`),lp=J(`<div class=agent-model-entry><span></span><div class=agent-model-entry-actions><button type=button class="btn btn-small">↑</button><button type=button class="btn btn-small">↓</button><button type=button class="btn btn-small">×`),up=J(`<p class="muted small trusted-context-empty">No trusted folders. Use the Files view to trust a project folder and its descendants.`),dp=J(`<div class=trusted-context-folder-row><code></code><span class=meta>and all descendants</span><button type=button class="btn btn-small btn-danger">`),fp=J(`<label class=checkbox-control><input type=checkbox><span>`),pp=J(`<div class=device-row><span></span><span class=meta> · paired </span><span class=actions><button type=button class="btn btn-small btn-danger">unpair`),mp=J(`<button type=button class="btn btn-small">cancel`),hp=J(`<button type=button class="btn btn-small btn-danger">restart`),gp=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`],_p=[`all`,`one-at-a-time`],vp=[`sse`,`websocket`,`auto`];function yp(e){return`${e.provider}/${e.id}`}function bp(e){let t=yp(e);return e.name?`${t} — ${e.name}`:t}function xp(e){return e.defaultProvider&&e.defaultModel?`${e.defaultProvider}/${e.defaultModel}`:`choose model…`}function Sp(e,t){return`${e.provider}/${e.id} ${e.name??``}`.toLowerCase().includes(t)}function Cp(){if(typeof Notification>`u`){if(window.isSecureContext===!1)return`insecure`;let e=/iPad|iPhone|iPod/.test(navigator.userAgent),t=navigator.standalone===!0||window.matchMedia?.(`(display-mode: standalone)`)?.matches===!0;return e&&!t?`ios-install`:`unsupported`}return Notification.permission}function wp(e){let t=new Map;for(let n of e){let e=t.get(n.provider)??[];e.push(n),t.set(n.provider,e)}return[...t.entries()].map(([e,t])=>({provider:e,models:t}))}function Tp(e,t,n){let r=t+n;if(r<0||r>=e.length)return e;let i=[...e];return[i[t],i[r]]=[i[r],i[t]],i}function Ep(e){return(()=>{var t=Af();return t.addEventListener(`change`,t=>{e.onChange(t.currentTarget.value===`on`)===!1&&(t.currentTarget.value=e.value?`on`:`off`)}),j(()=>t.value=e.value?`on`:`off`),t})()}function Dp(e){let[t,n]=k(``),r=()=>new Set(e.selected??[]),i=N(()=>{let n=t().toLowerCase();return wp(e.models.filter(e=>!n||Sp(e,n)).slice(0,100))}),a=e=>r().has(yp(e));return W(rt,{get title(){return e.title},get onDismiss(){return e.onClose},class:`model-picker-modal`,get children(){return[(()=>{var e=jf(),r=e.firstChild;return r.$$input=e=>n(e.currentTarget.value),j(()=>r.value=t()),e})(),(()=>{var t=Mf();return X(t,W(K,{get when(){return i().length>0},get fallback(){return Nf()},get children(){return W(G,{get each(){return i()},children:t=>(()=>{var n=Pf(),r=n.firstChild;return X(r,()=>t.provider),X(n,W(G,{get each(){return t.models},children:t=>(()=>{var n=Lf(),r=n.firstChild,i=r.nextSibling,o=i.nextSibling;return n.$$click=()=>e.onPick(t),X(r,()=>a(t)?`✓`:``),X(i,()=>t.id),X(n,W(K,{get when(){return t.name},get children(){var e=Ff();return X(e,()=>t.name),e}}),o),X(o,()=>t.provider),X(n,W(K,{get when(){return t.reasoning},get children(){return If()}}),null),j(e=>{var r=!!a(t),i=bp(t);return r!==e.e&&n.classList.toggle(`current`,e.e=r),i!==e.t&&Y(n,`title`,e.t=i),e},{e:void 0,t:void 0}),n})()}),null),n})()})}})),t})()]}})}function Op(e){let[t,n]=k(),[r,i]=k([]),[a,o]=k(!1),[s,c]=k(),[l,u]=k(),[d,f]=k(),[p,m]=k(e.target===`scoped-models`?e.routeScopedModelsCwd:void 0);M(()=>{m(e.target===`scoped-models`?e.routeScopedModelsCwd:void 0)});let[h,g]=k(``),[_,v]=k(!1),[y,b]=k(Cp()),[x,{mutate:S,refetch:C}]=F(async()=>{n(void 0);try{return await Q.settings()}catch(e){n(e instanceof Error?e.message:String(e));return}}),[w]=F(x,async()=>{try{let{models:e}=await Q.settingsModels();return e}catch(e){return n(e instanceof Error?e.message:String(e)),[]}}),T=N(()=>{let t=new Set;for(let n of e.store.fleet().runtimes)t.add(n.cwd);for(let n of e.store.fleet().diskSessions)t.add(n.cwd);return[...t].sort((e,t)=>e.localeCompare(t))}),[E]=F(()=>({settings:x(),cwd:d()}),async({cwd:e})=>{if(!x())return[];try{let{agentTypes:t}=await Q.agentTypes(e);return t}catch(e){return n(e instanceof Error?e.message:String(e)),[]}}),[D,{refetch:O}]=F(async()=>{let{devices:e}=await Q.devices();return e}),[A,P]=k(),I;function L(){I&&clearTimeout(I),I=void 0}function ee(e){L();let t=Math.max(250,e??3e4)+100;I=setTimeout(()=>void te(),t)}async function te(){try{let e=await Q.pairingCode();if(!e.enabled||!e.code){P(void 0),L();return}P(e),ee(e.expiresInMs)}catch(e){console.warn(`pairing code unavailable`,e),P(void 0),L()}}let[ne]=F(async()=>{try{let{version:e}=await Q.version();return e}catch{return}}),[re]=F(async()=>{try{return await Q.serverInfo()}catch{return}}),[ie,ae]=k(!1),[B,oe]=k(!1),[V,se]=k();async function H(){se(void 0),oe(!0);try{await Q.restartServer()}catch(e){se(e instanceof Error?e.message:String(e)),oe(!1)}}async function ce(e){n(void 0),i([]),o(!1);try{let t=await Q.saveSettings(e);S(t),i(t.warnings??[]),o(!0),setTimeout(()=>o(!1),2e3)}catch(e){n(e instanceof Error?e.message:String(e)),await C()}}let le=Promise.resolve(),U;function ue(){return U??x()?.subagentArbiter??{}}function de(e){let t={...ue(),...e};U=t;let r=x();r&&S({...r,subagentArbiter:t}),le=le.then(async()=>{n(void 0),i([]),o(!1);try{let e=await Q.saveSettings({subagentArbiter:t});i(e.warnings??[]),o(!0),setTimeout(()=>o(!1),2e3),U===t?(U=e.subagentArbiter??void 0,S(e)):S({...e,subagentArbiter:U})}catch(e){let r=e instanceof Error?e.message:String(e),i=await C();n(r),U===t?U=i?.subagentArbiter??void 0:i&&S({...i,subagentArbiter:U})}})}async function fe(e,t){await ce({agentModels:{[e]:t}})}async function pe(e){n(void 0),v(!0);try{let t=await Q.trustContextFolder(e);S(t.settings),g(``)}catch(e){n(e instanceof Error?e.message:String(e))}finally{v(!1)}}async function me(e){n(void 0),v(!0);try{let t=await Q.removeTrustedContextFolder(e);S(t.settings)}catch(e){n(e instanceof Error?e.message:String(e))}finally{v(!1)}}function he(e){return x()?.agentModels?.[e]??[]}function ge(e){let t=e.subagentArbiter;return t?.enabled===!0?typeof t.model!=`string`||!t.model.trim()?{ready:!1,message:`not ready — choose an arbiter model`}:t.thinking!==void 0&&!gp.some(e=>e===t.thinking)?{ready:!1,message:`not ready — arbiter thinking setting is invalid`}:t.guidePath!==void 0&&typeof t.guidePath!=`string`?{ready:!1,message:`not ready — routing guide path is invalid`}:t.guidePath?.trim()?{ready:!0,message:`enabled — live scope and guide are validated before every child spawn`}:{ready:!0,message:`enabled — using ~/.dreb/agent/model-routing-guide.md; live scope/guide checked at dispatch`}:{ready:!1,message:`disabled`}}async function _e(){typeof Notification>`u`||b(await Notification.requestPermission())}R(()=>void te()),z(L);let ve=()=>e.store.auth();return(()=>{var i=Wf(),o=i.firstChild,v=o.firstChild.nextSibling.nextSibling,b=v.firstChild.nextSibling;b.firstChild;var S=b.nextSibling,C=S.firstChild.nextSibling.firstChild,k=S.nextSibling,M=k.firstChild.nextSibling.firstChild.firstChild,N=k.nextSibling,P=N.firstChild.nextSibling,F=N.nextSibling,I=F.firstChild,L=I.firstChild.nextSibling,R=I.nextSibling.firstChild.firstChild,z=R.nextSibling,ee=F.nextSibling.firstChild,te=ee.firstChild.nextSibling,oe=ee.nextSibling.firstChild,se=v.nextSibling,le=se.firstChild.nextSibling.firstChild.firstChild.nextSibling,U=se.nextSibling,ye=U.firstChild.nextSibling;return ye.nextSibling,X(i,W(tt,{get store(){return e.store},active:`settings`}),o),X(o,W(K,{get when(){return t()},get children(){var e=Rf();return X(e,t),e}}),v),X(o,W(K,{get when(){return r().length>0},get children(){var e=zf();return X(e,W(G,{get each(){return r()},children:e=>(()=>{var t=Gf();return X(t,e),t})()})),e}}),v),X(o,W(K,{get when(){return a()},get children(){return Bf()}}),v),X(o,W(K,{get when(){return x()},get fallback(){return(()=>{var e=Kf();return X(e,()=>t()?`Settings could not be loaded — see the error above.`:`Loading settings…`),e})()},children:t=>[(()=>{var e=qf(),n=e.firstChild.nextSibling,r=n.firstChild.nextSibling.firstChild,i=n.nextSibling,a=i.firstChild,o=a.firstChild.nextSibling,s=a.nextSibling.firstChild,l=i.nextSibling.firstChild.nextSibling.firstChild;return r.$$click=()=>c({kind:`default`}),X(r,()=>xp(t())),X(o,()=>gp.join(` · `)),s.addEventListener(`change`,e=>ce({defaultThinkingLevel:e.currentTarget.value})),X(s,W(G,{each:gp,children:e=>(()=>{var t=np();return t.value=e,X(t,e),t})()})),l.addEventListener(`change`,e=>ce({transport:e.currentTarget.value})),X(l,W(G,{get each(){return[...vp]},children:e=>(()=>{var t=np();return t.value=e,X(t,e),t})()})),j(()=>s.value=t().defaultThinkingLevel??`off`),j(()=>l.value=t().transport??`sse`),e})(),W(qd,{get cwd(){return p()},get projectRoots(){return T()},get focused(){return e.target===`scoped-models`},onCwdChange:t=>{m(t),e.store.navigate({screen:`settings`,target:`scoped-models`,...t?{cwd:t}:{}})}}),(()=>{var e=Jf(),r=e.firstChild.nextSibling.nextSibling,i=r.firstChild.nextSibling,a=r.nextSibling,o=a.firstChild.nextSibling.firstChild,s=a.nextSibling,l=s.firstChild.nextSibling.firstChild,u=s.nextSibling,d=u.firstChild.nextSibling.firstChild,f=u.nextSibling;return f.firstChild.nextSibling,X(i,W(Ep,{get value(){return t().subagentArbiter?.enabled===!0},onChange:e=>{let t=ue();return e&&(typeof t.model!=`string`||!t.model.trim())?(n(`Choose an exact Dispatch Arbiter model before enabling it.`),c({kind:`arbiter`}),!1):(de({enabled:e}),!0)}})),o.$$click=()=>c({kind:`arbiter`}),X(o,(()=>{var e=q(()=>typeof t().subagentArbiter?.model==`string`);return()=>e()?t().subagentArbiter?.model:`choose model…`})()),l.addEventListener(`change`,e=>de({thinking:e.currentTarget.value})),X(l,W(G,{each:gp,children:e=>(()=>{var t=np();return t.value=e,X(t,e),t})()})),d.addEventListener(`change`,e=>{de({guidePath:e.currentTarget.value.trim()||void 0})}),X(f,()=>ge(t()).message,null),j(()=>je(f,ge(t()).ready?`settings-warning`:`muted small`)),j(()=>l.value=typeof t().subagentArbiter?.thinking==`string`&&gp.some(e=>e===t().subagentArbiter?.thinking)?t().subagentArbiter?.thinking:`off`),j(()=>d.value=typeof t().subagentArbiter?.guidePath==`string`?t().subagentArbiter?.guidePath:``),e})(),(()=>{var e=Xf();return e.firstChild.nextSibling,X(e,W(K,{get when(){return T().length>0},get children(){var e=Yf(),t=e.firstChild.nextSibling.firstChild;return t.firstChild,t.addEventListener(`change`,e=>f(e.currentTarget.value||void 0)),X(t,W(G,{get each(){return T()},children:e=>(()=>{var t=np();return t.value=e,X(t,e),t})()}),null),j(()=>Y(t,`title`,d()??`global/home only`)),j(()=>t.value=d()??``),e}}),null),X(e,W(K,{get when(){return(E()??[]).length>0},get fallback(){return rp()},get children(){return W(G,{get each(){return E()??[]},children:e=>{let n=()=>t().agentModels?.[e.name]??[];return(()=>{var t=ap(),r=t.firstChild,i=r.firstChild,a=i.nextSibling,o=r.nextSibling,s=o.nextSibling;return X(i,()=>e.name),X(a,()=>e.description),X(o,W(K,{get when(){return n().length>0},get fallback(){return op()},get children(){return W(G,{get each(){return n()},children:(e,t)=>(()=>{var n=sp(),r=n.firstChild;return X(n,()=>t()+1,r),X(n,e,null),n})()})}})),s.$$click=()=>u(l()===e.name?void 0:e.name),X(s,()=>l()===e.name?`done`:`edit`),X(t,W(K,{get when(){return l()===e.name},get children(){var t=ip(),r=t.firstChild;return X(t,W(K,{get when(){return n().length>0},get fallback(){return cp()},get children(){return W(G,{get each(){return n()},children:(t,r)=>(()=>{var i=lp(),a=i.firstChild,o=a.nextSibling.firstChild,s=o.nextSibling,c=s.nextSibling;return X(a,t),o.$$click=()=>void fe(e.name,Tp(n(),r(),-1)),s.$$click=()=>void fe(e.name,Tp(n(),r(),1)),c.$$click=()=>void fe(e.name,n().filter((e,t)=>t!==r())),j(e=>{var t=r()===0,i=r()===n().length-1;return t!==e.e&&(o.disabled=e.e=t),i!==e.t&&(s.disabled=e.t=i),e},{e:void 0,t:void 0}),i})()})}}),r),r.$$click=()=>c({kind:`agent`,agentName:e.name}),t}}),null),t})()}})}}),null),e})(),(()=>{var e=Zf(),n=e.firstChild.nextSibling,r=n.firstChild.nextSibling,i=n.nextSibling.firstChild.nextSibling;return X(r,W(Ep,{get value(){return t().imageAutoResize!==!1},onChange:e=>ce({imageAutoResize:e})})),X(i,W(Ep,{get value(){return t().blockImages===!0},onChange:e=>ce({blockImages:e})})),e})(),(()=>{var e=Qf(),n=e.firstChild.nextSibling,r=n.firstChild.nextSibling.firstChild,i=n.nextSibling.firstChild.nextSibling.firstChild;return r.addEventListener(`change`,e=>ce({steeringMode:e.currentTarget.value})),X(r,W(G,{get each(){return[..._p]},children:e=>(()=>{var t=np();return t.value=e,X(t,e),t})()})),i.addEventListener(`change`,e=>ce({followUpMode:e.currentTarget.value})),X(i,W(G,{get each(){return[..._p]},children:e=>(()=>{var t=np();return t.value=e,X(t,e),t})()})),j(()=>r.value=t().steeringMode??`all`),j(()=>i.value=t().followUpMode??`all`),e})(),(()=>{var e=$f(),n=e.firstChild.nextSibling,r=n.firstChild.nextSibling,i=n.nextSibling,a=i.firstChild.nextSibling.nextSibling.nextSibling,o=a.firstChild.nextSibling,s=o.nextSibling,c=i.nextSibling,l=c.firstChild.nextSibling,u=c.nextSibling.nextSibling.firstChild.nextSibling;return X(r,W(Ep,{get value(){return t().enableSkillCommands!==!1},onChange:e=>ce({enableSkillCommands:e})})),X(i,W(K,{get when(){return(t().trustedContextFolders??[]).length>0},get fallback(){return up()},get children(){return W(G,{get each(){return t().trustedContextFolders??[]},children:e=>(()=>{var t=dp(),n=t.firstChild,r=n.nextSibling.nextSibling;return X(n,e),r.$$click=()=>void me(e),X(r,()=>_()?`revoking…`:`revoke trust`),j(()=>r.disabled=_()),t})()})}}),a),a.addEventListener(`submit`,e=>{e.preventDefault();let t=h().trim();t&&pe(t)}),o.$$input=e=>g(e.currentTarget.value),X(s,()=>_()?`trusting…`:`trust folder`),X(l,W(Ep,{get value(){return t().autoLoadNestedContext===!0},onChange:e=>ce({autoLoadNestedContext:e})})),X(u,W(Ep,{get value(){return t().hideThinkingBlock===!0},onChange:e=>ce({hideThinkingBlock:e})})),j(()=>s.disabled=_()||!h().trim()),j(()=>o.value=h()),e})(),(()=>{var e=ep(),n=e.firstChild.nextSibling,r=n.firstChild.nextSibling,i=n.nextSibling.firstChild.nextSibling;return X(r,W(Ep,{get value(){return t().compactionEnabled!==!1},onChange:e=>ce({compactionEnabled:e})})),X(i,W(Ep,{get value(){return t().retryEnabled!==!1},onChange:e=>ce({retryEnabled:e})})),e})(),tp()]}),v),X(b,W(kf,{}),null),C.addEventListener(`change`,e=>rs(e.currentTarget.value)),M.addEventListener(`change`,e=>ns(e.currentTarget.checked)),X(P,W(G,{each:Ro,children:e=>(()=>{var t=fp(),n=t.firstChild,r=n.nextSibling;return n.addEventListener(`change`,t=>is(e,t.currentTarget.checked)),Y(n,`id`,`pref-tool-expand-${e}`),X(r,e),j(()=>n.checked=as(e)),t})()})),X(L,(()=>{var e=q(()=>y()===`denied`);return()=>e()?`blocked by browser settings — re-enable notifications in site permissions`:q(()=>y()===`insecure`)()?`this page is not a secure context — notifications need HTTPS. Run the server with --https (tailscale cert <host>.<tailnet>.ts.net) and open it via the https:// hostname`:q(()=>y()===`ios-install`)()?`iOS notifications need the installed PWA — tap Share → Add to Home Screen, then open dreb from the home screen icon`:y()===`unsupported`?`browser notifications are unavailable in this environment`:`show a notification when the tab needs input (Android/desktop need the app installed on mobile; works over HTTPS or localhost)`})()),R.addEventListener(`change`,e=>{e.currentTarget.checked&&_e()}),X(z,()=>y()===`granted`?`enabled`:`enable notifications`),X(te,()=>re()?.supervised?`restarts the server process (a supervisor respawns it with the latest build) — kills all running sessions`:`exits the server process — only auto-restarts if run under a supervisor (systemd, pm2, …); otherwise the dashboard goes down. kills all running sessions`),oe.$$click=()=>ae(!0),X(oe,()=>B()?`restarting…`:`restart`),X(v,W(K,{get when(){return V()},get children(){var e=Rf();return X(e,V),e}}),null),X(le,()=>ve()?.mode===`local`?`local`:`host`),X(se,W(K,{get when(){return q(()=>!!A()?.enabled)()&&A()?.code},get children(){var e=Vf(),t=e.firstChild.nextSibling.firstChild;return X(t,()=>A().code),e}}),null),X(se,W(G,{get each(){return D()??[]},children:e=>(()=>{var t=pp(),n=t.firstChild,r=n.nextSibling,i=r.firstChild,a=r.nextSibling.firstChild;return X(n,()=>e.device??e.id),X(r,()=>e.identity,i),X(r,()=>at(e.createdAt),null),a.$$click=async()=>{await Q.unpair(e.id),await O()},t})()}),null),X(se,W(K,{get when(){return(D()??[]).length===0},get children(){return Hf()}}),null),X(U,(()=>{var e=q(()=>!!re()?.version);return()=>e()?` v${re().version}`:q(()=>!!ne())()?` v${ne()}`:``})(),ye),X(U,W(K,{get when(){return re()?.startedAt},get children(){return[` · server build, up `,q(()=>at(re().startedAt))]}}),null),X(i,W(K,{get when(){return ie()},get children(){return W(rt,{title:`restart dashboard service?`,onDismiss:()=>ae(!1),get actions(){return[(()=>{var e=mp();return e.$$click=()=>ae(!1),e})(),(()=>{var e=hp();return e.$$click=()=>{ae(!1),H()},e})()]},get children(){var e=Uf();return e.firstChild.nextSibling.nextSibling,X(e,()=>re()?.supervised?` A supervisor is detected — the server should respawn automatically with the latest build.`:` No supervisor was detected — the dashboard will NOT come back on its own; you'll need to relaunch it manually.`,null),e}})}}),null),X(i,W(K,{get when(){return s()},children:e=>{let t=()=>{let t=e();return t.kind==="default"?`select default model`:t.kind===`arbiter`?`select Dispatch Arbiter model`:`add model for ${t.agentName}`},n=()=>{let t=e();return t.kind==="default"?x()?.defaultProvider&&x()?.defaultModel?[`${x().defaultProvider}/${x().defaultModel}`]:[]:t.kind===`arbiter`?x()?.subagentArbiter?.model?[x().subagentArbiter.model]:[]:he(t.agentName)};return W(Dp,{get title(){return t()},get models(){return w()??[]},get selected(){return n()},onClose:()=>c(void 0),onPick:t=>{let n=e();if(c(void 0),n.kind==="default"){ce({defaultProvider:t.provider,defaultModel:t.id});return}if(n.kind===`arbiter`){de({model:yp(t)});return}let r=yp(t),i=he(n.agentName);i.includes(r)||fe(n.agentName,[...i,r])}})}}),null),j(e=>{var t=y()===`denied`||y()===`unsupported`||y()===`ios-install`||y()===`insecure`,n=B();return t!==e.e&&(R.disabled=e.e=t),n!==e.t&&(oe.disabled=e.t=n),e},{e:void 0,t:void 0}),j(()=>C.value=ts()),j(()=>M.checked=es()),j(()=>R.checked=y()===`granted`),i})()}Ae([`input`,`click`]);var kp=J(`<div class="status-line arbitration-history">`),Ap=J(`<p class=pair-error>`),jp=J(`<div class=status-line><span class=working>● working`),Mp=J(`<div class=session-screen><header class=session-bar><div class=session-bar-inner><a class=back>← </a><span class=agent-type>subagent · </span><span class=title></span><span class=right></span></div></header><main class=chat><div class=chat-inner></div></main><footer class=dock><div class=dock-inner><div class=readonly-note>viewing live — subagents can't be steered yet; the parent session controls this agent.`),Np=J(`<span>arbiter: `),Pp=J(`<p class=muted>`);function Fp(e){let t=e.step===void 0?``:`step ${e.step}: `;return e.status===`failure`?`${t}failed — ${e.errorMessage??e.errorCode??`unknown error`}`:!e.final||e.changed.length===0?`${t}kept ${e.proposed.agent} · ${e.proposed.model} · ${e.proposed.thinking}`:`${t}${e.changed.join(`, `)} changed → ${e.final.agent} · ${e.final.model} · ${e.final.thinking}`}function Ip(e){let t=()=>e.store.sessions[e.sessionKey],n=N(()=>t()?.backgroundAgents[e.agentId]),r=()=>t()?.subagents[e.agentId],i=N(()=>e.store.fleet().runtimes.find(t=>t.key===e.sessionKey)),a=()=>i()?.state.sessionName??e.sessionKey,[o,s]=k(),c,l,u=Mo({scroller:()=>c});return R(()=>{let t=new AbortController;e.store.hydrateSubagent(e.sessionKey,e.agentId,t.signal).catch(e=>{t.signal.aborted&&sl(e)||s(e instanceof Error?e.message:String(e))}),z(()=>t.abort())}),M(()=>{e.store.revisions[e.sessionKey],u.notifyContentChanged()}),R(()=>{u.observeContent(l),u.observeViewport(c),c&&z(Po(u,c,{keyboard:`window`}))}),z(()=>u.dispose()),(()=>{var t=Mp(),i=t.firstChild,s=i.firstChild.firstChild;s.firstChild;var u=s.nextSibling;u.firstChild;var d=u.nextSibling,f=d.nextSibling,p=i.nextSibling,m=p.firstChild,h=p.nextSibling.firstChild,g=h.firstChild;X(s,a,null),X(u,()=>n()?.agentType??`unknown`,null),X(d,()=>n()?.taskSummary??e.agentId),X(f,W(K,{get when(){return n()?.status===`running`},get fallback(){return W($e,{get status(){return n()?.status===`failed`?`error`:`idle`},get label(){return n()?.status}})},get children(){return W($e,{status:`running`})}}));var _=c;typeof _==`function`?Fe(_,p):c=p;var v=l;return typeof v==`function`?Fe(v,m):l=m,X(m,W(K,{get when(){return(n()?.arbitrations?.length??0)>0},get children(){var e=kp();return X(e,W(G,{get each(){return n()?.arbitrations??[]},children:e=>(()=>{var t=Np();return t.firstChild,X(t,()=>Fp(e),null),j(()=>je(t,e.status===`failure`?`error-reason`:`muted`)),t})()})),e}}),null),X(m,W(K,{get when(){return o()},get children(){var e=Ap();return X(e,o),e}}),null),X(m,W(K,{get when(){return q(()=>!!r())()&&r().entries.length>0},get fallback(){return(()=>{var e=Pp();return X(e,()=>n()?`waiting for output from this agent…`:`no data for this agent — it may not have started writing its session log yet.`),e})()},get children(){return W(xc,{get entries(){return r().entries},get who(){return n()?.agentType??`agent`},userLabel:`task from parent`,get resetKey(){return`${e.sessionKey}:${e.agentId}`},get imageScope(){return{runtimeKey:e.sessionKey,agentId:e.agentId}}})}}),null),X(h,W(K,{get when(){return r()?.streaming},get children(){return jp()}}),g),j(()=>Y(s,`href`,`#/session/${e.sessionKey}`)),t})()}var Lp=Symbol(`store-raw`),Rp=Symbol(`store-node`),zp=Symbol(`store-has`),Bp=Symbol(`store-self`);function Vp(e){let t=e[p];if(!t&&(Object.defineProperty(e,p,{value:t=new Proxy(e,Yp)}),!Array.isArray(e))){let n=Object.keys(e),r=Object.getOwnPropertyDescriptors(e),i=Object.getPrototypeOf(e),a=i!==null&&typeof e==`object`&&!!e&&!Array.isArray(e)&&i!==Object.prototype;if(a){let e=Object.getOwnPropertyDescriptors(i);n.push(...Object.keys(e)),Object.assign(r,e)}for(let i=0,o=n.length;i<o;i++){let o=n[i];a&&o===`constructor`||r[o].get&&Object.defineProperty(e,o,{configurable:!0,enumerable:r[o].enumerable,get:r[o].get.bind(t)})}}return t}function Hp(e){let t;return typeof e==`object`&&!!e&&(e[p]||!(t=Object.getPrototypeOf(e))||t===Object.prototype||Array.isArray(e))}function Up(e,t=new Set){let n,r,i,a;if(n=e!=null&&e[Lp])return n;if(!Hp(e)||t.has(e))return e;if(Array.isArray(e)){Object.isFrozen(e)?e=e.slice(0):t.add(e);for(let n=0,a=e.length;n<a;n++)i=e[n],(r=Up(i,t))!==i&&(e[n]=r)}else{Object.isFrozen(e)?e=Object.assign({},e):t.add(e);let n=Object.keys(e),o=Object.getOwnPropertyDescriptors(e);for(let s=0,c=n.length;s<c;s++)a=n[s],!o[a].get&&(i=e[a],(r=Up(i,t))!==i&&(e[a]=r))}return e}function Wp(e,t){let n=e[t];return n||Object.defineProperty(e,t,{value:n=Object.create(null)}),n}function Gp(e,t,n){if(e[t])return e[t];let[r,i]=k(n,{equals:!1,internal:!0});return r.$=i,e[t]=r}function Kp(e,t){let n=Reflect.getOwnPropertyDescriptor(e,t);return!n||n.get||!n.configurable||t===p||t===Rp?n:(delete n.value,delete n.writable,n.get=()=>e[p][t],n)}function qp(e){ee()&&Gp(Wp(e,Rp),Bp)()}function Jp(e){return qp(e),Reflect.ownKeys(e)}var Yp={get(e,t,n){if(t===Lp)return e;if(t===p)return n;if(t===m)return qp(e),n;let r=Wp(e,Rp),i=r[t],a=i?i():e[t];if(t===Rp||t===zp||t===`__proto__`)return a;if(!i){let n=Object.getOwnPropertyDescriptor(e,t);ee()&&(typeof a!=`function`||Object.prototype.hasOwnProperty.call(e,t))&&!(n&&n.get)&&(a=Gp(r,t,a)())}return Hp(a)?Vp(a):a},has(e,t){return t===Lp||t===p||t===m||t===Rp||t===zp||t===`__proto__`?!0:(ee()&&Gp(Wp(e,zp),t)(),t in e)},set(){return!0},deleteProperty(){return!0},ownKeys:Jp,getOwnPropertyDescriptor:Kp};function Xp(e,t,n,r=!1){if(t===`__proto__`||!r&&e[t]===n)return;let i=e[t],a=e.length;n===void 0?(delete e[t],e[zp]&&e[zp][t]&&i!==void 0&&e[zp][t].$()):(e[t]=n,e[zp]&&e[zp][t]&&i===void 0&&e[zp][t].$());let o=Wp(e,Rp),s;if((s=Gp(o,t,i))&&s.$(()=>n),Array.isArray(e)&&e.length!==a){for(let t=e.length;t<a;t++)(s=o[t])&&s.$();(s=Gp(o,`length`,a))&&s.$(e.length)}(s=o[Bp])&&s.$()}function Zp(e,t){let n=Object.keys(t);for(let r=0;r<n.length;r+=1){let i=n[r];Qp(i)||Xp(e,i,t[i])}}function Qp(e){return e===`__proto__`||e===`constructor`||e===`prototype`}function $p(e,t){if(typeof t==`function`&&(t=t(e)),t=Up(t),Array.isArray(t)){if(e===t)return;let n=0,r=t.length;for(;n<r;n++){let r=t[n];e[n]!==r&&Xp(e,n,r)}Xp(e,`length`,r)}else Zp(e,t)}function em(e,t,n=[]){let r,i=e;if(t.length>1){r=t.shift();let a=typeof r,o=Array.isArray(e);if(a===`string`&&(r===`__proto__`||t.length>1&&Qp(r)))return;if(Array.isArray(r)){for(let i=0;i<r.length;i++)em(e,[r[i]].concat(t),n);return}else if(o&&a===`function`){for(let i=0;i<e.length;i++)r(e[i],i)&&em(e,[i].concat(t),n);return}else if(o&&a===`object`){let{from:i=0,to:a=e.length-1,by:o=1}=r;for(let r=i;r<=a;r+=o)em(e,[r].concat(t),n);return}else if(t.length>1){em(e[r],t,[r].concat(n));return}i=e[r],n=[r].concat(n)}let a=t[0];typeof a==`function`&&(a=a(i,n),a===i)||r===void 0&&a==null||(a=Up(a),r===void 0||Hp(i)&&Hp(a)&&!Array.isArray(a)?Zp(i,a):Xp(e,r,a))}function tm(...[e,t]){let n=Up(e||{}),r=Array.isArray(n),i=Vp(n);function a(...e){I(()=>{r&&e.length===1?$p(n,e[0]):em(n,e)})}return[i,a]}var nm=new WeakMap,rm={get(e,t){if(t===Lp)return e;let n=e[t];if(t===p||t===m||t===Rp||t===zp||t===`__proto__`)return n;let r;return Hp(n)?nm.get(n)||(nm.set(n,r=new Proxy(n,rm)),r):n},set(e,t,n){return Xp(e,t,Up(n)),!0},deleteProperty(e,t){return Xp(e,t,void 0,!0),!0}};function im(e){return t=>{if(Hp(t)){let n;(n=nm.get(t))||nm.set(t,n=new Proxy(t,rm)),e(n)}return t}}function am(){let[e,t=``]=window.location.hash.replace(/^#\/?/,``).split(`?`,2),[n,...r]=e.split(`/`);if(n===`session`&&r[0])return r[1]===`subagent`&&r[2]?{screen:`subagent`,key:r[0],agentId:r[2]}:{screen:`session`,key:r[0]};if(n===`files`)return{screen:`files`,path:r.length?decodeURIComponent(r.join(`/`)):void 0};if(n===`memories`)return{screen:`memories`};if(n===`settings`){if(r[0]===`scoped-models`){let e=new URLSearchParams(t).get(`cwd`)||void 0;return{screen:`settings`,target:`scoped-models`,...e?{cwd:e}:{}}}return{screen:`settings`}}return n===`pairing`?{screen:`pairing`}:{screen:`fleet`}}function om(e){switch(e.screen){case`fleet`:return`#/`;case`session`:return`#/session/${e.key}`;case`subagent`:return`#/session/${e.key}/subagent/${e.agentId}`;case`files`:return e.path?`#/files/${encodeURIComponent(e.path)}`:`#/files`;case`memories`:return`#/memories`;case`settings`:return e.target===`scoped-models`?`#/settings/scoped-models${e.cwd?`?cwd=${encodeURIComponent(e.cwd)}`:``}`:`#/settings`;case`pairing`:return`#/pairing`}}var sm=2e3,cm=3*1024*1024,lm=sm,um=cm,dm=3e4,fm=1e4,pm=1e3,mm=3e4,hm=new TextEncoder;function gm(e,t,n){e.statusEntries=e.statusEntries.filter(e=>e.key!==`retry`);let r=n.retryAttempt??0;if(n.isRetrying&&r>0){let t=e.entries.findLast(e=>e.kind===`assistant`&&e.stopReason===`error`),n=t?.errorMessage?` — ${t.errorMessage}`:``;e.statusEntries.push({key:`retry`,text:`retrying (attempt ${r})${n}`,tone:`warning`})}sn(e,t,n.isStreaming||n.isRetrying||n.isCompacting)}function _m(){let[e,t]=tm({}),[n,r]=tm({}),[i,a]=k(am()),[o,s]=k({runtimes:[],diskSessions:[]}),[c,l]=k(),[u,d]=k(),[f,p]=k(),[m,h]=k(!1),[g,_]=k(),[v,y]=k({state:`disconnected`,attempt:0}),b=()=>v().state===`connected`,[x,S]=k([]),C=new Map,w=new Map,T=new Map,E=0,D=0,O,A,j,M,N=!1,P=0,F=!1,I,L=0,R=new Map,z=new Map,ee=new Map,te=0,ne=0,re,ie=new Set,ae=!1;window.addEventListener(`hashchange`,()=>a(am()));function B(e){window.location.hash=om(e)}function oe(e){return n[e]??0}function V(e){return C.get(e)??0}function se(e){return w.get(e)??0}function H(e){w.set(e,se(e)+1)}function ce(e){C.set(e,V(e)+1)}function le(e){return{revision:oe(e),generation:V(e),epoch:E}}function U(e,t){return V(e)===t.generation&&E===t.epoch}function ue(e,t){return oe(e)===t.revision&&U(e,t)}function de(e,t){t&&T.get(e)!==t||(T.delete(e),t&&(t.queued=[],t.queuedBytes=0))}function fe(e){r(e,oe(e)+1)}function pe(n){e[n]||t(n,Vt(n))}function me(e,n){pe(e),t(e,im(n)),fe(e)}function he(e){de(e),ce(e),w.delete(e),t(e,void 0),r(e,void 0),ml(e)}function ge(){let e=am();return e.screen===`session`||e.screen===`subagent`?e.key:void 0}function _e(e,t=`info`){--D,S(n=>[...n,{id:D,text:e,tone:t}].slice(-20))}function ve(e){return R.get(e)??0}function ye(e,t,n){let r=new Map(e.map(e=>[e.key,JSON.stringify(e.state)])),i=new Map(t.map(e=>[e.key,JSON.stringify(e.state)]));for(let e of new Set([...r.keys(),...i.keys()])){if(r.get(e)===i.get(e))continue;let t=ve(e)+1;R.set(e,t),n===void 0?z.set(e,t):ee.set(e,Math.max(ee.get(e)??-1,n))}}function be(e,t){s(n=>{let r=e(n);return L+=1,ye(n.runtimes,r.runtimes,t),r})}function xe(e){ie.clear(),be(()=>e)}function Se(e,t){let n=new Set(e.filter(e=>!ie.has(e.key)).map(e=>e.key)),r=n.size!==o().runtimes.length||o().runtimes.some(e=>!n.has(e.key));be(t=>{let n=new Map(t.runtimes.map(e=>[e.key,e]));return{...t,runtimes:e.filter(e=>!ie.has(e.key)).map(e=>{let t=n.get(e.key);return{...e,state:{...e.state,contextUsage:t?.state.contextUsage??e.state.contextUsage},...t?.stats===void 0?{}:{stats:t.stats},...t?.lastAssistantText===void 0?{}:{lastAssistantText:t.lastAssistantText}}})}},t),r&&we().catch(()=>{})}function Ce(e){let t=ie.has(e);return ie.add(e),t?(he(e),Promise.resolve()):(be(t=>({...t,runtimes:t.runtimes.filter(t=>t.key!==e)})),he(e),we())}function W(){let e=++te,t=L;return Q.fleet().then(n=>{e!==te||t!==L||(xe(n),l(void 0))},n=>{throw e===te&&t===L&&l(n instanceof Error?n.message:String(n)),n})}function we(){let e=++ne;return Q.sessions().then(t=>{e===ne&&(be(e=>({...e,diskSessions:t.sessions})),l(void 0))},t=>{throw e===ne&&l(t instanceof Error?t.message:String(t)),t})}function G(e){ie.delete(e.key),be(t=>{let n=t.runtimes.findIndex(t=>t.key===e.key);if(n===-1)return{...t,runtimes:[...t.runtimes,e]};let r=[...t.runtimes];return r[n]=e,{...t,runtimes:r}})}function K(e,t,n,r){if(o().runtimes.some(t=>t.key===e)){if(n!==void 0&&ve(e)!==n){let t=z.get(e)??0,i=ee.get(e);if(t>n||i===void 0||i>r)return}be(n=>({...n,runtimes:n.runtimes.map(n=>n.key===e?{...n,state:t}:n)}))}}function Te(e,t){be(n=>({...n,runtimes:n.runtimes.map(n=>n.key===e?{...n,state:{...n.state,model:t}}:n)}))}function Ee(e,t){be(n=>({...n,runtimes:n.runtimes.map(n=>n.key===e?{...n,state:{...n.state,thinkingLevel:t}}:n)}))}function q(e,t,n){return{...e,state:{...e.state,...t.contextUsage===void 0?{}:{contextUsage:t.contextUsage},messageCount:n?e.state.messageCount:t.totalMessages},stats:{tokensTotal:t.tokens.total,cost:t.cost}}}function De(e){let t=new AbortController,n,r=new Promise((r,i)=>{n=setTimeout(()=>{let n=Error(`Stats request for runtime ${e} timed out after ${fm} ms`);i(n),t.abort(n)},fm)});return Promise.race([Q.stats(e,t.signal),r]).finally(()=>{n!==void 0&&clearTimeout(n)})}function Oe(){if(re)return re;let e=o().runtimes.map(e=>e.key),t=new Map(e.map(e=>[e,ve(e)])),n=e.map(e=>De(e)),r=Promise.allSettled(n).then(n=>{let r=new Map,i=[];for(let[t,a]of n.entries())a.status===`fulfilled`?r.set(e[t],a.value):i.push(a.reason instanceof Error?a.reason.message:String(a.reason));r.size>0&&be(e=>({...e,runtimes:e.runtimes.map(e=>{let n=r.get(e.key),i=t.get(e.key),a=i===void 0||ve(e.key)!==i;return n?q(e,n,a):e})})),d(i.length>0?i.join(`; `):void 0)}).finally(()=>{re===r&&(re=void 0)});return re=r,r}function ke(e){return hm.encode(JSON.stringify(e)).byteLength}function J(e){e.queued=[],e.queuedBytes=0}function Ae(){j!==void 0&&clearTimeout(j),j=void 0}function Y(){return Math.min(mm,pm*2**Math.max(0,P-1))}function je(){if(ae||j!==void 0)return;P+=1;let e=Y();h(!1),M||=v(),y(t=>t.state===`auth_failed`?t:(N=!0,{...t,state:`retrying`,attempt:Math.max(t.attempt,P),retryDelayMs:e,retryAt:Date.now()+e})),j=setTimeout(()=>{j=void 0,X()},e)}function Me(){let e=M,t=N;M=void 0,N=!1,!(!t||e?.state!==`connected`||v().state!==`retrying`)&&y({state:`connected`,attempt:e.attempt,lastAppliedSeq:e.lastAppliedSeq})}function Ne(e){let t=e.event?.type;if(t===`fleet_snapshot`)Se(e.event.runtimes,e.seq);else if(t===`disk_sessions_changed`)we().catch(()=>{});else if(t===`runtime_removed`){if(e.key){let t=ge()===e.key;Ce(e.key).catch(()=>{}),t&&(_e(`session ${e.key} was stopped`,`warning`),B({screen:`fleet`}))}}else e.key&&(me(e.key,t=>fn(t,e.event)),t===`tasks_update`&&H(e.key))}function Pe(e){let t=e.subagent;me(e.key,n=>{let r=e.messages;if(n.entries=Yt(r),n.tasks=(e.state.tasks??[]).map(e=>({...e})),n.streaming=e.state.isStreaming,n.compacting=e.state.isCompacting,n.sessionName=e.state.sessionName,n.model=e.state.model?.id,n.contextUsage=e.state.contextUsage,n.uiRequests=(e.pendingExtensionUiRequests??[]).map(e=>Bt(e)).filter(e=>e!==void 0),n.statusEntries=[],n.suggestedCommand=void 0,n.lastError=void 0,n.widgets={above:[],below:[]},n.toasts=[],n.title=void 0,n.composerPrefill=void 0,gm(n,r,e.state),n.streaming?(n.workingSince=Date.now(),n.workingText=`working`):(n.workingSince=void 0,n.workingText=void 0),n.backgroundAgents=Object.fromEntries(e.backgroundAgents.map(e=>[e.agentId,e])),en(n),t){let r=e.backgroundAgents.find(e=>e.agentId===t.agentId)??t.agent;n.backgroundAgents[t.agentId]=r,n.subagents[t.agentId]={agentId:t.agentId,entries:Yt(t.messages),streaming:r.status===`running`}}tn(n)}),H(e.key)}function Fe(e,t){if(A!==e||e.state!==`active`||e.barrierSeq===void 0)return;Ae(),P=0,Me();let n=e.barrierSeq;if(I=n,xe(t.fleet),l(void 0),t.active)Pe(t.active);else{let e=ge();e&&(he(e),_e(`session ${e} was stopped`,`warning`),B({screen:`fleet`}))}let r=[...e.queued].sort((e,t)=>e.seq-t.seq),i=t.active?.subagent;if(i&&t.active)for(let e of r)e.seq>i.barrierSeq&&e.seq<=n&&e.key===t.active.key&&e.event.type===`background_agent_event`&&String(e.event.agentId)===i.agentId&&Ne(e);for(let e of r)e.seq>n&&Ne(e);J(e),A=void 0,h(!1),p(void 0)}function X(e=!1){if(ae)return Promise.resolve();if(O)return(e||A?.state===`failed`)&&(F=!0),O;Ae();let t=i(),n=t.screen===`session`||t.screen===`subagent`?t.key:void 0,r=t.screen===`subagent`?t.agentId:void 0,a={queued:[],queuedBytes:0,state:`active`,controller:new AbortController};A=a,E+=1;for(let[e,t]of T)de(e,t);h(!0),p(void 0);let o=setTimeout(()=>a.controller.abort(`Dashboard recovery timed out`),dm),s=Q.resync(n,r,a.controller.signal).then(e=>{a.barrierSeq=e.barrierSeq,Fe(a,e)}).catch(e=>{if(A!==a)return;a.state=`failed`,J(a);let t=a.controller.signal.reason;p(typeof t==`string`?t:e instanceof Error?e.message:String(e)),je(),j===void 0&&h(!1)}).finally(()=>{clearTimeout(o),O===s&&(O=void 0),!ae&&F&&(F=!1,X())});return O=s,s}function Ie(){return X(!0)}function Le(e){if(e.event?.type===`dashboard_resync`){X(!0);return}if(A){if(A.state===`failed`)throw je(),Error(`Dashboard recovery is failed; refusing to acknowledge live envelope before resync succeeds`);let t=ke(e);if(A.queued.length>=sm||A.queuedBytes+t>cm){J(A),A.state=`failed`;let e=`Dashboard recovery queue overflowed; waiting for a newer authoritative snapshot`;throw p(e),A.controller.abort(e),je(),j===void 0&&h(!1),Error(e)}A.queued.push(e),A.queuedBytes+=t;return}if(I!==void 0&&e.seq<=I)return;let t=e.key?T.get(e.key):void 0;if(t){let n=ke(e);if(t.queued.length>=lm||t.queuedBytes+n>um)throw de(e.key,t),Error(`Dashboard hydration queue overflowed for ${e.key}; refusing an incomplete snapshot replay`);t.queued.push(e),t.queuedBytes+=n}Ne(e)}let Re;async function ze(){ae=!1;try{let e=await Q.auth();_(e)}catch(e){_({mode:`remote`,needsPairing:e?.body?.needsPairing??!1,identity:e?.body?.identity,error:e?.message}),B({screen:`pairing`});return}await W().catch(()=>{}),Re=vt({onEnvelope:Le,onStatusChange:e=>{N=!1,M=e.state===`connected`?e:void 0,y(e)},onRecovery:()=>{X()}})}function Be(){ae=!0,Re?.(),Ae(),M=void 0,N=!1,F=!1;let e=A;A=void 0,e&&J(e),e?.controller.abort(`Dashboard stopped`);for(let[e,t]of T)de(e,t)}function Ve(t){if(x().some(e=>e.id===t)){S(e=>e.filter(e=>e.id!==t));return}for(let[n,r]of Object.entries(e))if(r.toasts.some(e=>e.id===t)){me(n,e=>pn(e,t));return}}async function He(e,t){de(e);let n=ve(e),r={guard:le(e),queued:[],queuedBytes:0};T.set(e,r);let i=()=>de(e,r);t?.addEventListener(`abort`,i,{once:!0}),t?.aborted&&i();try{let i=await Q.hydrate(e,t);if(t?.aborted||T.get(e)!==r||!U(e,r.guard))return;me(e,e=>{let t=i.messages;e.entries=Yt(t),e.backgroundAgents=Object.fromEntries(i.backgroundAgents.map(e=>[e.agentId,e])),en(e),e.streaming=i.state.isStreaming,e.compacting=i.state.isCompacting,e.tasks=(i.state.tasks??[]).map(e=>({...e})),i.state.isStreaming?(e.workingSince=Date.now(),e.workingText=`working`):(e.workingSince=void 0,e.workingText=void 0),e.uiRequests=(i.pendingExtensionUiRequests??[]).map(e=>Bt(e)).filter(e=>e!==void 0),gm(e,t,i.state),tn(e)}),H(e),K(e,i.state,n,i.barrierSeq);for(let e of[...r.queued].sort((e,t)=>e.seq-t.seq))e.seq>i.barrierSeq&&Ne(e)}finally{t?.removeEventListener(`abort`,i),de(e,r)}}async function Ue(e,t,n){let r=le(e),{agent:i,messages:a}=await Q.subagentMessages(e,t,n);n?.aborted||!ue(e,r)||me(e,e=>{e.backgroundAgents[t]=i;let n=e.subagents[t];n||(n={agentId:t,entries:[],streaming:i.status===`running`},e.subagents[t]=n),a.length>0&&(n.entries=Yt(a)),n.streaming=i.status===`running`})}return{sessions:e,revisions:n,route:i,navigate:B,fleet:o,fleetError:c,fleetStatsError:u,refreshFleet:W,refreshDiskSessions:we,refreshFleetStats:Oe,removeRuntime:Ce,upsertRuntime:G,setRuntimeModel:Te,setRuntimeThinkingLevel:Ee,resyncing:m,resyncError:f,retryResync:Ie,auth:g,connected:b,connection:v,notices:x,start:ze,stop:Be,dismissToast:Ve,resolveUiRequest(e,t){me(e,e=>mn(e,t))},hydrateSession:He,hydrateSubagent:Ue}}var vm=5e3;function ym(e){let t;return Promise.race([e,new Promise((e,n)=>{t=setTimeout(()=>n(Error(`service worker not ready`)),vm)})]).finally(()=>{t&&clearTimeout(t)})}function bm(){let e=_m();R(()=>{e.start(),`serviceWorker`in navigator&&(navigator.serviceWorker.addEventListener(`message`,t=>{if(t.data?.type===`navigate-session`&&typeof t.data.sessionKey==`string`){let n=t.data.sessionKey,r=!!e.sessions[n]||e.fleet().runtimes.some(e=>e.key===n);e.navigate(r?{screen:`session`,key:n}:{screen:`fleet`})}}),navigator.serviceWorker.register(`./sw.js`).catch(e=>{console.warn(`dashboard: service worker registration failed`,e)}))}),z(()=>e.stop());let t=new Set,n=new Set,r=t=>!!(e.fleet().runtimes.find(e=>e.key===t)?.needsAttention||e.sessions[t]?.needsAttention);M(()=>{let i=new Map;for(let t of e.fleet().runtimes)t.needsAttention&&i.set(t.key,{name:t.state.sessionName??t.state.sessionId.slice(0,8),reason:`needs attention`});for(let t of Object.values(e.sessions))t.needsAttention&&i.set(t.key,{name:t.sessionName??t.title??t.key,reason:nn(t.uiRequests)??t.statusEntries.find(e=>e.tone===`error`)?.text??`needs attention`});let a=i.size>0,o=e.route(),s=o.screen===`session`||o.screen===`subagent`?o.key:void 0,c=s?e.sessions[s]:void 0,l=s?e.fleet().runtimes.find(e=>e.key===s):void 0,u=c?.title??c?.sessionName??l?.state.sessionName,d=u?`${u} — dreb`:`dreb`;document.title=a?`◆ ${d}`:d;for(let[e,a]of i)n.has(e)||t.has(e)||typeof Notification<`u`&&Notification.permission===`granted`&&document.visibilityState!==`visible`&&`serviceWorker`in navigator&&(t.add(e),ym(navigator.serviceWorker.ready).then(t=>t.showNotification(`dreb — ${a.name}`,{body:a.reason,tag:e,data:{sessionKey:e}})).then(()=>{t.delete(e),r(e)?n.add(e):n.delete(e)}).catch(n=>{t.delete(e),console.warn(`dashboard: showNotification failed`,n)}));for(let e of[...n])i.has(e)||n.delete(e);for(let e of[...t])i.has(e)||t.delete(e)});let i=()=>[...Object.values(e.sessions).flatMap(e=>e.toasts.map(t=>({...t,sessionKey:e.key}))),...e.notices()].slice(-5);return[W(Te,{get fallback(){return W(Qn,{store:e})},get children(){return[W(Ee,{get when(){return e.route().screen===`session`},get children(){return W(Dd,{store:e,get sessionKey(){return e.route().key}})}}),W(Ee,{get when(){return e.route().screen===`subagent`},get children(){return W(Ip,{store:e,get sessionKey(){return e.route().key},get agentId(){return e.route().agentId}})}}),W(Ee,{get when(){return e.route().screen===`files`},get children(){return W(Rt,{store:e,get initialPath(){return e.route().path}})}}),W(Ee,{get when(){return e.route().screen===`memories`},get children(){return W(Zc,{store:e})}}),W(Ee,{get when(){return e.route().screen===`settings`},get children(){return W(Op,{store:e,get target(){return e.route().target},get routeScopedModelsCwd(){return e.route().cwd}})}}),W(Ee,{get when(){return e.route().screen===`pairing`},get children(){return W(rl,{store:e})}})]}}),W(it,{get toasts(){return i()},onDismiss:t=>e.dismissToast(t)})]}wf();var xm=document.getElementById(`root`);if(!xm)throw Error(`dashboard: #root element missing from index.html`);ke(()=>W(bm,{}),xm);
|
package/dist/static/index.html
CHANGED
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
} catch (e) {}
|
|
56
56
|
})();
|
|
57
57
|
</script>
|
|
58
|
-
<script type="module" crossorigin src="./assets/index-
|
|
58
|
+
<script type="module" crossorigin src="./assets/index-MJ5nXWOn.js"></script>
|
|
59
59
|
<link rel="stylesheet" crossorigin href="./assets/index-DVt6aXhf.css">
|
|
60
60
|
</head>
|
|
61
61
|
<body>
|
package/dist/static/sw.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
// Replaced at build time; see vite.config.ts generateBundle hook.
|
|
17
|
-
const SW_CACHE_VERSION = "2.55.
|
|
17
|
+
const SW_CACHE_VERSION = "2.55.2";
|
|
18
18
|
const SHELL_CACHE = `dreb-dashboard-shell-v${SW_CACHE_VERSION}`;
|
|
19
19
|
|
|
20
20
|
// Shell assets (HTML, JS, CSS) get a network-first strategy. The dashboard
|