@eclipse-docks/extension-ai-system 0.7.139 → 0.7.141
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 +72 -0
- package/dist/api.d.ts +1 -7
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +2 -2
- package/dist/cognitive-extension-CG_d39K5.js +2129 -0
- package/dist/cognitive-extension-CG_d39K5.js.map +1 -0
- package/dist/cognitive-extension.d.ts +1 -0
- package/dist/cognitive-extension.d.ts.map +1 -0
- package/dist/i18n.de-BrLTiN56.js +11 -0
- package/dist/i18n.de-BrLTiN56.js.map +1 -0
- package/dist/i18n.en-MkwuLlOD.js +11 -0
- package/dist/i18n.en-MkwuLlOD.js.map +1 -0
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/dist/runtime/attachments.d.ts +89 -0
- package/dist/runtime/attachments.d.ts.map +1 -0
- package/dist/runtime/cognitive-runtime.d.ts +83 -0
- package/dist/runtime/cognitive-runtime.d.ts.map +1 -0
- package/dist/runtime/compact/compaction.d.ts +29 -0
- package/dist/runtime/compact/compaction.d.ts.map +1 -0
- package/dist/runtime/constants.d.ts +9 -0
- package/dist/runtime/constants.d.ts.map +1 -0
- package/dist/runtime/context/usage.d.ts +35 -0
- package/dist/runtime/context/usage.d.ts.map +1 -0
- package/dist/runtime/core/index.d.ts +4 -0
- package/dist/runtime/core/index.d.ts.map +1 -0
- package/dist/runtime/core/needs.d.ts +5 -0
- package/dist/runtime/core/needs.d.ts.map +1 -0
- package/dist/runtime/core/plutchik.d.ts +8 -0
- package/dist/runtime/core/plutchik.d.ts.map +1 -0
- package/dist/runtime/core/tick.d.ts +23 -0
- package/dist/runtime/core/tick.d.ts.map +1 -0
- package/dist/runtime/events.d.ts +21 -0
- package/dist/runtime/events.d.ts.map +1 -0
- package/dist/runtime/index.d.ts +14 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/memory/index.d.ts +2 -0
- package/dist/runtime/memory/index.d.ts.map +1 -0
- package/dist/runtime/memory/store.d.ts +27 -0
- package/dist/runtime/memory/store.d.ts.map +1 -0
- package/dist/runtime/models/effort-support.d.ts +31 -0
- package/dist/runtime/models/effort-support.d.ts.map +1 -0
- package/dist/runtime/models/index.d.ts +7 -0
- package/dist/runtime/models/index.d.ts.map +1 -0
- package/dist/runtime/models/openai-compatible.d.ts +39 -0
- package/dist/runtime/models/openai-compatible.d.ts.map +1 -0
- package/dist/runtime/models/provider-config.d.ts +23 -0
- package/dist/runtime/models/provider-config.d.ts.map +1 -0
- package/dist/runtime/models/provider-registry.d.ts +16 -0
- package/dist/runtime/models/provider-registry.d.ts.map +1 -0
- package/dist/runtime/models/router.d.ts +12 -0
- package/dist/runtime/models/router.d.ts.map +1 -0
- package/dist/runtime/models/types.d.ts +88 -0
- package/dist/runtime/models/types.d.ts.map +1 -0
- package/dist/runtime/session/index.d.ts +2 -0
- package/dist/runtime/session/index.d.ts.map +1 -0
- package/dist/runtime/session/session-runtime.d.ts +48 -0
- package/dist/runtime/session/session-runtime.d.ts.map +1 -0
- package/dist/runtime/specialists/classify-risk.d.ts +15 -0
- package/dist/runtime/specialists/classify-risk.d.ts.map +1 -0
- package/dist/runtime/specialists/index.d.ts +12 -0
- package/dist/runtime/specialists/index.d.ts.map +1 -0
- package/dist/runtime/specialists/loop.d.ts +25 -0
- package/dist/runtime/specialists/loop.d.ts.map +1 -0
- package/dist/runtime/tools/attachment-adapter.d.ts +6 -0
- package/dist/runtime/tools/attachment-adapter.d.ts.map +1 -0
- package/dist/runtime/tools/broker.d.ts +52 -0
- package/dist/runtime/tools/broker.d.ts.map +1 -0
- package/dist/runtime/tools/command-adapter.d.ts +5 -0
- package/dist/runtime/tools/command-adapter.d.ts.map +1 -0
- package/dist/runtime/tools/index.d.ts +5 -0
- package/dist/runtime/tools/index.d.ts.map +1 -0
- package/dist/runtime/tools/workspace-adapter.d.ts +4 -0
- package/dist/runtime/tools/workspace-adapter.d.ts.map +1 -0
- package/dist/runtime/types.d.ts +145 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime-DfNGzEjU.js +2952 -0
- package/dist/runtime-DfNGzEjU.js.map +1 -0
- package/dist/view/cognitive-settings-editor.d.ts +40 -0
- package/dist/view/cognitive-settings-editor.d.ts.map +1 -0
- package/dist/view/cognitive-view.d.ts +83 -0
- package/dist/view/cognitive-view.d.ts.map +1 -0
- package/package.json +15 -11
- package/dist/agents/agent-registry.d.ts +0 -8
- package/dist/agents/agent-registry.d.ts.map +0 -1
- package/dist/agents/index.d.ts +0 -6
- package/dist/agents/index.d.ts.map +0 -1
- package/dist/agents/message-processor.d.ts +0 -9
- package/dist/agents/message-processor.d.ts.map +0 -1
- package/dist/agents/orchestrator.d.ts +0 -12
- package/dist/agents/orchestrator.d.ts.map +0 -1
- package/dist/agents/prompt-builder.d.ts +0 -21
- package/dist/agents/prompt-builder.d.ts.map +0 -1
- package/dist/agents/reviewer.d.ts +0 -15
- package/dist/agents/reviewer.d.ts.map +0 -1
- package/dist/ai-service-Cmafte5S.js +0 -1866
- package/dist/ai-service-Cmafte5S.js.map +0 -1
- package/dist/ai-system-extension-CsfSiwNJ.js +0 -2324
- package/dist/ai-system-extension-CsfSiwNJ.js.map +0 -1
- package/dist/ai-system-extension.d.ts +0 -1
- package/dist/ai-system-extension.d.ts.map +0 -1
- package/dist/chat-provider-contributions.d.ts +0 -2
- package/dist/chat-provider-contributions.d.ts.map +0 -1
- package/dist/core/constants.d.ts +0 -21
- package/dist/core/constants.d.ts.map +0 -1
- package/dist/core/index.d.ts +0 -4
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/interfaces.d.ts +0 -138
- package/dist/core/interfaces.d.ts.map +0 -1
- package/dist/core/message-utils.d.ts +0 -4
- package/dist/core/message-utils.d.ts.map +0 -1
- package/dist/core/types.d.ts +0 -128
- package/dist/core/types.d.ts.map +0 -1
- package/dist/prompt-enhancer-contributions.d.ts +0 -2
- package/dist/prompt-enhancer-contributions.d.ts.map +0 -1
- package/dist/providers/base-provider.d.ts +0 -15
- package/dist/providers/base-provider.d.ts.map +0 -1
- package/dist/providers/index.d.ts +0 -9
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/ollama-provider.d.ts +0 -7
- package/dist/providers/ollama-provider.d.ts.map +0 -1
- package/dist/providers/openai-provider.d.ts +0 -7
- package/dist/providers/openai-provider.d.ts.map +0 -1
- package/dist/providers/provider-factory.d.ts +0 -10
- package/dist/providers/provider-factory.d.ts.map +0 -1
- package/dist/providers/provider-utils.d.ts +0 -5
- package/dist/providers/provider-utils.d.ts.map +0 -1
- package/dist/providers/streaming/ollama-parser.d.ts +0 -9
- package/dist/providers/streaming/ollama-parser.d.ts.map +0 -1
- package/dist/providers/streaming/sse-parser.d.ts +0 -10
- package/dist/providers/streaming/sse-parser.d.ts.map +0 -1
- package/dist/providers/streaming/stream-parser.d.ts +0 -10
- package/dist/providers/streaming/stream-parser.d.ts.map +0 -1
- package/dist/service/ai-service.d.ts +0 -47
- package/dist/service/ai-service.d.ts.map +0 -1
- package/dist/service/token-usage-tracker.d.ts +0 -16
- package/dist/service/token-usage-tracker.d.ts.map +0 -1
- package/dist/task/task-checkpoint.d.ts +0 -12
- package/dist/task/task-checkpoint.d.ts.map +0 -1
- package/dist/task/task-plan.d.ts +0 -7
- package/dist/task/task-plan.d.ts.map +0 -1
- package/dist/task/task-runner.d.ts +0 -10
- package/dist/task/task-runner.d.ts.map +0 -1
- package/dist/tools/index.d.ts +0 -6
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/token-estimator.d.ts +0 -12
- package/dist/tools/token-estimator.d.ts.map +0 -1
- package/dist/tools/tool-call-accumulator.d.ts +0 -9
- package/dist/tools/tool-call-accumulator.d.ts.map +0 -1
- package/dist/tools/tool-executor.d.ts +0 -13
- package/dist/tools/tool-executor.d.ts.map +0 -1
- package/dist/tools/tool-name-utils.d.ts +0 -2
- package/dist/tools/tool-name-utils.d.ts.map +0 -1
- package/dist/tools/tool-registry.d.ts +0 -7
- package/dist/tools/tool-registry.d.ts.map +0 -1
- package/dist/utils/token-estimator.d.ts +0 -2
- package/dist/utils/token-estimator.d.ts.map +0 -1
- package/dist/utils/tool-detector.d.ts +0 -10
- package/dist/utils/tool-detector.d.ts.map +0 -1
- package/dist/view/agent-group-manager.d.ts +0 -37
- package/dist/view/agent-group-manager.d.ts.map +0 -1
- package/dist/view/aiview.d.ts +0 -42
- package/dist/view/aiview.d.ts.map +0 -1
- package/dist/view/components/ai-agent-response-group.d.ts +0 -18
- package/dist/view/components/ai-agent-response-group.d.ts.map +0 -1
- package/dist/view/components/ai-chat-input.d.ts +0 -20
- package/dist/view/components/ai-chat-input.d.ts.map +0 -1
- package/dist/view/components/ai-chat-message.d.ts +0 -22
- package/dist/view/components/ai-chat-message.d.ts.map +0 -1
- package/dist/view/components/ai-config-editor.d.ts +0 -33
- package/dist/view/components/ai-config-editor.d.ts.map +0 -1
- package/dist/view/components/ai-empty-state.d.ts +0 -13
- package/dist/view/components/ai-empty-state.d.ts.map +0 -1
- package/dist/view/components/ai-tool-approval.d.ts +0 -26
- package/dist/view/components/ai-tool-approval.d.ts.map +0 -1
- package/dist/view/components/index.d.ts +0 -7
- package/dist/view/components/index.d.ts.map +0 -1
- package/dist/view/provider-manager.d.ts +0 -30
- package/dist/view/provider-manager.d.ts.map +0 -1
- package/dist/view/session-manager.d.ts +0 -25
- package/dist/view/session-manager.d.ts.map +0 -1
- package/dist/view/stream-manager.d.ts +0 -23
- package/dist/view/stream-manager.d.ts.map +0 -1
- package/dist/view/task-progress-panel.d.ts +0 -14
- package/dist/view/task-progress-panel.d.ts.map +0 -1
- package/dist/view/token-usage.d.ts +0 -18
- package/dist/view/token-usage.d.ts.map +0 -1
- package/dist/view/workspace-panel.d.ts +0 -15
- package/dist/view/workspace-panel.d.ts.map +0 -1
- package/dist/workflows/base-sequential-workflow.d.ts +0 -13
- package/dist/workflows/base-sequential-workflow.d.ts.map +0 -1
- package/dist/workflows/conditional-workflow.d.ts +0 -7
- package/dist/workflows/conditional-workflow.d.ts.map +0 -1
- package/dist/workflows/index.d.ts +0 -10
- package/dist/workflows/index.d.ts.map +0 -1
- package/dist/workflows/orchestrated-workflow.d.ts +0 -10
- package/dist/workflows/orchestrated-workflow.d.ts.map +0 -1
- package/dist/workflows/parallel-workflow.d.ts +0 -6
- package/dist/workflows/parallel-workflow.d.ts.map +0 -1
- package/dist/workflows/pipeline-workflow.d.ts +0 -7
- package/dist/workflows/pipeline-workflow.d.ts.map +0 -1
- package/dist/workflows/review-workflow.d.ts +0 -10
- package/dist/workflows/review-workflow.d.ts.map +0 -1
- package/dist/workflows/sequential-workflow.d.ts +0 -7
- package/dist/workflows/sequential-workflow.d.ts.map +0 -1
- package/dist/workflows/workflow-engine.d.ts +0 -8
- package/dist/workflows/workflow-engine.d.ts.map +0 -1
- package/dist/workflows/workflow-strategy.d.ts +0 -8
- package/dist/workflows/workflow-strategy.d.ts.map +0 -1
- package/dist/workspace/workspace.d.ts +0 -20
- package/dist/workspace/workspace.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cognitive-extension-CG_d39K5.js","names":["APPROVAL_OPTIONS"],"sources":["../src/view/cognitive-view.ts","../src/view/cognitive-settings-editor.ts","../src/cognitive-extension.ts"],"sourcesContent":["import '@eclipse-docks/core/externals/webawesome';\nimport {\n html,\n css,\n nothing,\n customElement,\n query,\n state,\n type TemplateResult,\n} from '@eclipse-docks/core/externals/lit';\nimport { DocksPart, toastError } from '@eclipse-docks/core';\nimport {\n ATTACHMENT_FILE_ACCEPT,\n MAX_ATTACHMENTS,\n OPEN_AI_SETTINGS_COMMAND,\n TOPIC,\n cognitiveRuntime,\n detectEffortCapability,\n estimateSessionContextUsage,\n formatBucketDetail,\n formatContextPercent,\n formatTokenCount,\n readPromptAttachmentFromFile,\n} from '../runtime';\nimport type {\n ChatMessage,\n CognitiveSession,\n ContextUsage,\n EffortLevel,\n MessagePart,\n ModelPolicy,\n PermissionAction,\n PromptAttachment,\n SessionAttachment,\n ToolApprovalMode,\n} from '../runtime';\n\ninterface PermissionRequest {\n requestId: string;\n toolName: string;\n args: Record<string, unknown>;\n sessionId: string;\n}\n\n@customElement('docks-cognitive-view')\nexport class DocksCognitiveView extends DocksPart {\n protected scrollMode: 'scroller' | 'native' | 'none' = 'none';\n\n static styles = css`\n :host {\n height: 100%;\n min-height: 0;\n background: var(--wa-color-surface-default);\n color: var(--wa-color-text-normal);\n font-family: var(--wa-font-family-body);\n }\n\n .part-content,\n .part-content-inner {\n height: 100%;\n min-height: 0;\n }\n\n .cognitive-shell {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n /* Establish a definite containing block for wa-scroller's height: 100%. */\n position: relative;\n }\n\n wa-dropdown.history-menu::part(menu) {\n min-width: 18rem;\n max-width: min(24rem, 92vw);\n max-height: min(28rem, 70vh);\n overflow-y: auto;\n padding-top: 0;\n }\n\n .history-search {\n position: sticky;\n top: 0;\n z-index: 1;\n display: block;\n padding: var(--wa-space-s);\n background: var(--wa-color-surface-raised);\n border-bottom: var(--wa-border-width-s) solid var(--wa-color-border-normal);\n }\n\n .history-search wa-input {\n width: 100%;\n }\n\n .history-item-title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .history-item-meta {\n color: var(--wa-color-text-quiet);\n font-size: var(--wa-font-size-xs);\n flex-shrink: 0;\n }\n\n .history-empty {\n padding: var(--wa-space-m);\n color: var(--wa-color-text-quiet);\n font-size: var(--wa-font-size-s);\n text-align: center;\n }\n\n wa-scroller.transcript {\n /* flex-basis 0 so the host gets a definite height; wa-scroller vertical uses height:100%. */\n flex: 1 1 0;\n min-height: 0;\n height: 100%;\n overflow: hidden;\n }\n\n .transcript-inner {\n display: flex;\n flex-direction: column;\n gap: var(--wa-space-m);\n padding: var(--wa-space-m);\n min-height: 100%;\n box-sizing: border-box;\n }\n\n /* Pushes short threads to the bottom without breaking overflow scroll. */\n .transcript-spacer {\n flex: 1 0 0;\n min-height: 0;\n }\n\n .msg {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: var(--wa-space-2xs);\n max-width: 100%;\n }\n\n .msg.user {\n align-items: flex-end;\n }\n\n .msg-meta {\n position: absolute;\n right: var(--wa-space-2xs);\n bottom: var(--wa-space-2xs);\n z-index: 1;\n display: flex;\n gap: var(--wa-space-2xs);\n align-items: center;\n flex-wrap: wrap;\n justify-content: flex-end;\n max-width: calc(100% - var(--wa-space-s));\n padding: var(--wa-space-3xs) var(--wa-space-2xs);\n border-radius: var(--wa-border-radius-m);\n background: color-mix(in srgb, var(--wa-color-surface-default) 88%, transparent);\n font-size: var(--wa-font-size-xs);\n color: var(--wa-color-text-quiet);\n opacity: 0;\n pointer-events: none;\n transition: opacity var(--wa-transition-fast, 120ms) ease;\n }\n\n .msg:hover .msg-meta,\n .msg:focus-within .msg-meta {\n opacity: 1;\n pointer-events: auto;\n }\n\n .bubble {\n padding: var(--wa-space-s) var(--wa-space-m);\n border-radius: var(--wa-border-radius-l);\n background: var(--wa-color-surface-raised);\n border: var(--wa-border-width-s) solid var(--wa-color-border-normal);\n white-space: pre-wrap;\n line-height: var(--wa-line-height-normal);\n max-width: 100%;\n }\n\n .msg.user .bubble {\n background: color-mix(in srgb, var(--wa-color-brand-fill-normal) 22%, transparent);\n border-color: color-mix(in srgb, var(--wa-color-brand-fill-normal) 40%, transparent);\n }\n\n .streaming-meta {\n display: flex;\n gap: var(--wa-space-2xs);\n align-items: center;\n color: var(--wa-color-text-quiet);\n font-size: var(--wa-font-size-s);\n }\n\n .composer-shell {\n display: flex;\n flex-direction: column;\n gap: var(--wa-space-s);\n padding: var(--wa-space-s) var(--wa-space-m) var(--wa-space-m);\n border-top: var(--wa-border-width-s) solid var(--wa-color-border-normal);\n flex-shrink: 0;\n }\n\n wa-dropdown.settings-menu::part(menu) {\n min-width: 16rem;\n max-width: min(28rem, 92vw);\n }\n\n wa-dropdown.context-menu::part(menu) {\n min-width: 17rem;\n max-width: min(22rem, 92vw);\n padding: var(--wa-space-s);\n }\n\n .context-ring {\n --size: 1.35rem;\n --track-width: 2.5px;\n --indicator-width: 2.5px;\n font-size: 0;\n }\n\n .context-panel {\n display: flex;\n flex-direction: column;\n gap: var(--wa-space-s);\n }\n\n .context-header {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: var(--wa-space-s);\n }\n\n .context-header strong {\n font-size: var(--wa-font-size-s);\n }\n\n .context-header span {\n color: var(--wa-color-text-quiet);\n font-size: var(--wa-font-size-xs);\n }\n\n .context-bars {\n display: flex;\n flex-direction: column;\n gap: var(--wa-space-2xs);\n }\n\n .context-row {\n display: grid;\n grid-template-columns: 1fr auto;\n gap: var(--wa-space-2xs);\n font-size: var(--wa-font-size-xs);\n }\n\n .context-row-label {\n color: var(--wa-color-text-quiet);\n }\n\n .context-meter {\n grid-column: 1 / -1;\n height: 0.35rem;\n border-radius: var(--wa-border-radius-pill);\n background: var(--wa-color-neutral-fill-quiet);\n overflow: hidden;\n }\n\n .context-meter > span {\n display: block;\n height: 100%;\n border-radius: inherit;\n background: var(--bucket-color, var(--wa-color-brand-fill-normal));\n }\n\n .context-footer {\n display: flex;\n flex-direction: column;\n gap: var(--wa-space-2xs);\n }\n\n .context-remaining {\n color: var(--wa-color-text-quiet);\n font-size: var(--wa-font-size-xs);\n }\n\n .composer {\n display: flex;\n flex-direction: column;\n gap: var(--wa-space-2xs);\n flex: 1;\n min-width: 0;\n }\n\n .composer-row {\n display: flex;\n gap: var(--wa-space-s);\n align-items: flex-end;\n }\n\n .composer wa-textarea {\n flex: 1;\n min-width: 0;\n }\n\n .composer-actions {\n display: flex;\n align-items: center;\n gap: var(--wa-space-2xs);\n flex-shrink: 0;\n }\n\n .composer-shell.drag-over {\n outline: 2px dashed var(--wa-color-brand-border-normal);\n outline-offset: -2px;\n background: color-mix(in srgb, var(--wa-color-brand-fill-quiet) 35%, transparent);\n }\n\n wa-dropdown.attach-menu::part(menu) {\n min-width: 18rem;\n max-width: min(24rem, 92vw);\n padding: var(--wa-space-2xs);\n }\n\n .attach-panel {\n display: flex;\n flex-direction: column;\n gap: var(--wa-space-2xs);\n max-height: min(22rem, 50vh);\n }\n\n .attach-list {\n display: flex;\n flex-direction: column;\n gap: var(--wa-space-2xs);\n overflow: auto;\n min-height: 0;\n }\n\n .attach-row {\n display: flex;\n align-items: center;\n gap: var(--wa-space-2xs);\n min-width: 0;\n }\n\n .attach-preview-btn {\n display: flex;\n align-items: center;\n gap: var(--wa-space-s);\n flex: 1;\n min-width: 0;\n margin: 0;\n padding: var(--wa-space-2xs);\n border: none;\n border-radius: var(--wa-border-radius-s);\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: start;\n cursor: pointer;\n }\n\n .attach-preview-btn:hover {\n background: var(--wa-color-neutral-fill-quiet);\n }\n\n .attach-thumb,\n .msg-file-thumb {\n width: 2.5rem;\n height: 2.5rem;\n object-fit: cover;\n border-radius: var(--wa-border-radius-s);\n border: var(--wa-border-width-s) solid var(--wa-color-border-normal);\n flex-shrink: 0;\n }\n\n .attach-file-icon {\n display: grid;\n place-items: center;\n width: 2.5rem;\n height: 2.5rem;\n border-radius: var(--wa-border-radius-s);\n border: var(--wa-border-width-s) solid var(--wa-color-border-normal);\n color: var(--wa-color-text-quiet);\n flex-shrink: 0;\n }\n\n .attach-name {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--wa-font-size-s);\n }\n\n .attach-empty {\n color: var(--wa-color-text-quiet);\n font-size: var(--wa-font-size-xs);\n padding: var(--wa-space-s);\n }\n\n .msg-file-thumb {\n width: 4.5rem;\n height: 4.5rem;\n }\n\n .attach-dialog-body {\n display: flex;\n flex-direction: column;\n gap: var(--wa-space-s);\n max-height: min(70vh, 40rem);\n overflow: auto;\n }\n\n .attach-dialog-image {\n max-width: 100%;\n height: auto;\n border-radius: var(--wa-border-radius-m);\n }\n\n .attach-dialog-text {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-word;\n font-family: var(--wa-font-family-code, ui-monospace, monospace);\n font-size: var(--wa-font-size-s);\n }\n\n .msg-files {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wa-space-2xs);\n margin-bottom: var(--wa-space-2xs);\n }\n\n .approval-actions {\n display: flex;\n gap: var(--wa-space-s);\n margin-top: var(--wa-space-s);\n flex-wrap: wrap;\n }\n\n pre.args {\n margin: var(--wa-space-s) 0 0;\n font-family: var(--wa-font-family-code, var(--wa-font-mono));\n font-size: var(--wa-font-size-xs);\n white-space: pre-wrap;\n overflow-x: auto;\n }\n\n wa-details {\n font-size: var(--wa-font-size-s);\n }\n\n wa-details.msg-details {\n width: 100%;\n font-size: var(--wa-font-size-s);\n }\n\n wa-details.msg-details::part(base),\n wa-details.msg-details::part(details) {\n border: none;\n background: transparent;\n }\n\n wa-details.msg-details::part(header) {\n align-items: flex-start;\n gap: var(--wa-space-2xs);\n padding: 0;\n }\n\n wa-details.msg-details::part(summary) {\n flex: 1;\n min-width: 0;\n }\n\n wa-details.msg-details::part(content) {\n padding: var(--wa-space-s) 0 0;\n }\n\n .msg-summary {\n display: flex;\n flex-direction: column;\n gap: var(--wa-space-2xs);\n width: 100%;\n }\n\n .msg-tech {\n display: flex;\n flex-direction: column;\n gap: var(--wa-space-s);\n margin-inline-start: var(--wa-space-l);\n padding-inline-start: var(--wa-space-m);\n border-inline-start: var(--wa-border-width-s) solid var(--wa-color-border-normal);\n }\n\n .tool-heading {\n font-size: var(--wa-font-size-xs);\n color: var(--wa-color-text-quiet);\n margin-bottom: var(--wa-space-2xs);\n }\n `;\n\n @query('wa-textarea') private textarea?: HTMLTextAreaElement & { value: string };\n @query('#attach-file-input') private fileInput?: HTMLInputElement;\n\n @state() private sessions: CognitiveSession[] = [];\n @state() private focusedId: string | null = null;\n @state() private draft = '';\n /** Session attachment ids to publish with the next user turn. */\n @state() private pendingAttachmentIds: string[] = [];\n @state() private dragOver = false;\n @state() private previewAttachmentId: string | null = null;\n @state() private busy = false;\n @state() private pendingPermission: PermissionRequest | null = null;\n @state() private policyMode: 'auto' | 'manual' = 'auto';\n @state() private optimizeFor: 'cost' | 'balance' | 'intelligence' = 'balance';\n @state() private manualModel = '';\n @state() private manualEffort: EffortLevel | 'auto' = 'auto';\n @state() private approvalMode: ToolApprovalMode = 'auto_safe';\n @state() private modelIds: string[] = [];\n @state() private streamingParts: MessagePart[] = [];\n @state() private historyOpen = false;\n @state() private historyQuery = '';\n private unsubs: Array<() => void> = [];\n private scrollDebounceTimer?: ReturnType<typeof setTimeout>;\n\n protected doBeforeUI(): void {\n cognitiveRuntime.start();\n this.syncSessions();\n this.syncModels();\n this.approvalMode = cognitiveRuntime.getApprovalMode();\n void cognitiveRuntime.whenReady().then(() => {\n this.syncSessions();\n this.syncModels();\n this.approvalMode = cognitiveRuntime.getApprovalMode();\n this.scheduleScrollToBottom();\n });\n this.unsubs.push(\n cognitiveRuntime.events.subscribe(TOPIC.sessionChanged, () => {\n this.syncSessions();\n this.scheduleScrollToBottom();\n }),\n cognitiveRuntime.events.subscribe(TOPIC.providersChanged, () => this.syncModels()),\n cognitiveRuntime.events.subscribe(TOPIC.approvalModeChanged, (mode) => {\n this.approvalMode = mode as ToolApprovalMode;\n }),\n cognitiveRuntime.events.subscribe(TOPIC.permissionAsked, (payload) => {\n this.pendingPermission = payload as PermissionRequest;\n this.scheduleScrollToBottom();\n }),\n cognitiveRuntime.events.subscribe(TOPIC.messagePart, (payload) => {\n const { sessionId, part } = payload as { sessionId: string; part: MessagePart };\n if (sessionId !== this.focusedId) return;\n this.streamingParts = mergePart(this.streamingParts, part);\n this.scheduleScrollToBottom();\n }),\n cognitiveRuntime.events.subscribe(TOPIC.messageDone, () => {\n this.streamingParts = [];\n this.syncSessions();\n this.scheduleScrollToBottom();\n }),\n );\n }\n\n protected doClose(): void {\n if (this.scrollDebounceTimer) clearTimeout(this.scrollDebounceTimer);\n this.scrollDebounceTimer = undefined;\n for (const u of this.unsubs) u();\n this.unsubs = [];\n }\n\n private syncSessions(): void {\n const byRecency = cognitiveRuntime.sessions.list();\n this.sessions = [...byRecency].sort((a, b) => a.createdAt - b.createdAt);\n const focused = cognitiveRuntime.sessions.focused();\n const activeId = focused?.id ?? byRecency[0]?.id ?? null;\n if (activeId && focused?.id !== activeId) {\n cognitiveRuntime.sessions.focus(activeId);\n }\n this.focusedId = activeId;\n }\n\n private scheduleScrollToBottom(): void {\n if (this.scrollDebounceTimer) clearTimeout(this.scrollDebounceTimer);\n this.scrollDebounceTimer = setTimeout(() => {\n this.scrollDebounceTimer = undefined;\n void this.scrollToBottom();\n }, 50);\n }\n\n private async scrollToBottom(): Promise<void> {\n await this.updateComplete;\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n const scroller = this.renderRoot.querySelector('wa-scroller.transcript');\n if (!scroller?.shadowRoot) return;\n\n const container = scroller.shadowRoot.querySelector('#content');\n if (!(container instanceof HTMLElement)) return;\n container.scrollTop = container.scrollHeight;\n }\n\n private focusedSession(): CognitiveSession | undefined {\n return this.sessions.find((s) => s.id === this.focusedId) ?? this.sessions[0];\n }\n\n private deleteSession(sessionId: string): void {\n if (this.sessions.length <= 1) {\n cognitiveRuntime.sessions.createSession({ title: 'Chat' });\n cognitiveRuntime.sessions.remove(sessionId);\n } else {\n cognitiveRuntime.sessions.remove(sessionId);\n }\n this.streamingParts = [];\n this.syncSessions();\n cognitiveRuntime.commitSessions();\n }\n\n private openSession(sessionId: string): void {\n if (!cognitiveRuntime.sessions.focus(sessionId)) return;\n this.streamingParts = [];\n this.syncSessions();\n this.historyOpen = false;\n this.historyQuery = '';\n cognitiveRuntime.commitSessions();\n this.scheduleScrollToBottom();\n }\n\n private newSession(): void {\n cognitiveRuntime.sessions.createSession({ title: 'Chat' });\n this.streamingParts = [];\n this.historyOpen = false;\n this.historyQuery = '';\n this.syncSessions();\n cognitiveRuntime.commitSessions();\n }\n\n private historySessions(): CognitiveSession[] {\n const q = this.historyQuery.trim().toLowerCase();\n const sorted = [...this.sessions].sort((a, b) => b.updatedAt - a.updatedAt);\n if (!q) return sorted;\n return sorted.filter((s) => {\n if (s.title.toLowerCase().includes(q)) return true;\n return s.history.some((m) =>\n m.parts.some((p) => {\n if (p.type === 'text') return p.text.toLowerCase().includes(q);\n if (p.type === 'file') {\n return (\n p.name.toLowerCase().includes(q) ||\n p.id.toLowerCase().includes(q) ||\n (p.path?.toLowerCase().includes(q) ?? false)\n );\n }\n return false;\n }),\n );\n });\n }\n\n private syncModels(): void {\n this.modelIds = cognitiveRuntime.listConfiguredModels();\n if (!this.manualModel || !this.modelIds.includes(this.manualModel)) {\n this.manualModel = this.modelIds[0] ?? cognitiveRuntime.defaultModelId();\n }\n }\n\n private effortChoices(): Array<EffortLevel | 'auto'> {\n const cap = detectEffortCapability(this.manualModel || cognitiveRuntime.defaultModelId());\n if (!cap.supported) return ['auto', 'none'];\n return ['auto', ...cap.levels];\n }\n\n private routerValue(): string {\n return this.policyMode === 'auto' ? `auto:${this.optimizeFor}` : `model:${this.manualModel}`;\n }\n\n private routerLabel(): string {\n if (this.policyMode === 'auto') return `Auto · ${capitalize(this.optimizeFor)}`;\n if (!this.modelIds.length) return 'No models';\n return shortModelLabel(this.manualModel || this.modelIds[0]!);\n }\n\n private activeModelRef(): string {\n const session = this.focusedSession();\n const routed = [...(session?.history ?? [])]\n .reverse()\n .find((m) => m.role === 'assistant' && m.routedModel)?.routedModel;\n if (routed) return routed;\n if (this.policyMode === 'manual') {\n return this.manualModel || this.modelIds[0] || cognitiveRuntime.defaultModelId();\n }\n return this.modelIds[0] || cognitiveRuntime.defaultModelId();\n }\n\n private contextUsage(): ContextUsage {\n return estimateSessionContextUsage(this.focusedSession(), this.activeModelRef());\n }\n\n private async compactFocused(): Promise<void> {\n if (!this.focusedId) return;\n await cognitiveRuntime.compactSession(this.focusedId);\n this.syncSessions();\n }\n\n private onRouterSelect(value: string): void {\n if (value.startsWith('auto:')) {\n const optimize = value.slice(5);\n if (optimize === 'cost' || optimize === 'balance' || optimize === 'intelligence') {\n this.policyMode = 'auto';\n this.optimizeFor = optimize;\n }\n return;\n }\n if (value.startsWith('model:')) {\n const model = value.slice(6);\n if (!model) return;\n this.policyMode = 'manual';\n this.manualModel = model;\n }\n }\n\n private applyPolicy(): void {\n const policy: ModelPolicy =\n this.policyMode === 'manual'\n ? {\n mode: 'manual',\n model: this.manualModel || cognitiveRuntime.defaultModelId(),\n effort: this.manualEffort,\n }\n : { mode: 'auto', optimizeFor: this.optimizeFor };\n cognitiveRuntime.setModelPolicy(policy);\n }\n\n private async clearComposer(): Promise<void> {\n this.draft = '';\n this.pendingAttachmentIds = [];\n await this.updateComplete;\n if (this.textarea) this.textarea.value = '';\n if (this.fileInput) this.fileInput.value = '';\n }\n\n private sessionAttachments(): SessionAttachment[] {\n return this.focusedSession()?.attachments ?? [];\n }\n\n private previewAttachment(): SessionAttachment | undefined {\n if (!this.previewAttachmentId) return undefined;\n return this.sessionAttachments().find((a) => a.id === this.previewAttachmentId);\n }\n\n private openAttachmentPreview(attachmentId: string): void {\n this.previewAttachmentId = attachmentId;\n }\n\n private closeAttachmentPreview(): void {\n this.previewAttachmentId = null;\n }\n\n private removeSessionAttachment(attachmentId: string): void {\n const sessionId = this.focusedId ?? cognitiveRuntime.ensureSessionId();\n cognitiveRuntime.removeAttachment(sessionId, attachmentId);\n this.pendingAttachmentIds = this.pendingAttachmentIds.filter((id) => id !== attachmentId);\n if (this.previewAttachmentId === attachmentId) this.previewAttachmentId = null;\n this.syncSessions();\n }\n\n private async addFiles(fileList: FileList | File[]): Promise<void> {\n const files = [...fileList];\n if (!files.length) return;\n\n const sessionId = cognitiveRuntime.ensureSessionId(this.focusedId ?? undefined);\n this.focusedId = sessionId;\n const existing = this.sessionAttachments();\n const accepted: PromptAttachment[] = [];\n\n for (const file of files) {\n if (existing.length + accepted.length >= MAX_ATTACHMENTS) {\n toastError(`At most ${MAX_ATTACHMENTS} files per session`);\n break;\n }\n if (\n existing.some((a) => a.name === file.name && a.byteLength === file.size) ||\n accepted.some((a) => a.name === file.name && a.byteLength === file.size)\n ) {\n continue;\n }\n const result = await readPromptAttachmentFromFile(file);\n if (!result.ok) {\n toastError(result.error);\n continue;\n }\n accepted.push(result.attachment);\n }\n\n const stored = cognitiveRuntime.addAttachments(sessionId, accepted);\n if (stored.length) {\n this.pendingAttachmentIds = [\n ...this.pendingAttachmentIds,\n ...stored.map((a) => a.id).filter((id) => !this.pendingAttachmentIds.includes(id)),\n ];\n }\n this.syncSessions();\n }\n\n private openFilePicker(): void {\n this.fileInput?.click();\n }\n\n private async onFileInputChange(e: Event): Promise<void> {\n const input = e.target as HTMLInputElement;\n if (input.files?.length) await this.addFiles(input.files);\n input.value = '';\n }\n\n private onComposerDragOver(e: DragEvent): void {\n if (!e.dataTransfer?.types.includes('Files')) return;\n e.preventDefault();\n this.dragOver = true;\n }\n\n private onComposerDragLeave(e: DragEvent): void {\n if (e.currentTarget === e.target) this.dragOver = false;\n }\n\n private async onComposerDrop(e: DragEvent): Promise<void> {\n e.preventDefault();\n this.dragOver = false;\n if (e.dataTransfer?.files?.length) await this.addFiles(e.dataTransfer.files);\n }\n\n private async send(): Promise<void> {\n const text = this.draft.trim();\n const attachmentIds = [...this.pendingAttachmentIds];\n if ((!text && !attachmentIds.length) || this.busy) return;\n this.applyPolicy();\n await this.clearComposer();\n this.busy = true;\n this.streamingParts = [];\n try {\n await cognitiveRuntime.prompt({\n sessionId: this.focusedId ?? undefined,\n text,\n attachmentIds,\n });\n } finally {\n this.busy = false;\n this.syncSessions();\n this.scheduleScrollToBottom();\n this.textarea?.focus();\n }\n }\n\n private renderAttachmentDropdown() {\n const attachments = this.sessionAttachments();\n const count = attachments.length;\n return html`\n <wa-dropdown class=\"attach-menu\" size=\"s\" placement=\"top-end\" distance=\"4\">\n <wa-button\n slot=\"trigger\"\n size=\"s\"\n appearance=\"plain\"\n title=${count ? `${count} attachment${count === 1 ? '' : 's'}` : 'Attachments'}\n ?disabled=${this.busy}\n >\n <wa-icon name=\"paperclip\" label=\"Attachments\"></wa-icon>\n ${count > 0 ? html`<wa-badge pill>${count}</wa-badge>` : nothing}\n </wa-button>\n <div\n class=\"attach-panel\"\n @click=${(e: Event) => e.stopPropagation()}\n @keydown=${(e: Event) => e.stopPropagation()}\n >\n ${count\n ? html`\n <div class=\"attach-list\">\n ${attachments.map(\n (file) => html`\n <div class=\"attach-row\">\n <button\n type=\"button\"\n class=\"attach-preview-btn\"\n title=\"Open ${file.name}\"\n @click=${() => this.openAttachmentPreview(file.id)}\n >\n ${file.kind === 'image' && file.dataUrl\n ? html`<img\n class=\"attach-thumb\"\n src=${file.dataUrl}\n alt=${file.name}\n />`\n : html`\n <span class=\"attach-file-icon\">\n <wa-icon name=\"file\" label=\"\"></wa-icon>\n </span>\n `}\n <span class=\"attach-name\">${file.name}</span>\n </button>\n <wa-button\n size=\"s\"\n appearance=\"plain\"\n title=\"Remove from session\"\n ?disabled=${this.busy}\n @click=${() => this.removeSessionAttachment(file.id)}\n >\n <wa-icon name=\"xmark\" label=\"Remove\"></wa-icon>\n </wa-button>\n </div>\n `,\n )}\n </div>\n `\n : html`<div class=\"attach-empty\">No attachments in this session</div>`}\n <wa-button\n size=\"s\"\n appearance=\"outlined\"\n ?disabled=${this.busy || count >= MAX_ATTACHMENTS}\n @click=${() => this.openFilePicker()}\n >\n <wa-icon slot=\"start\" name=\"plus\"></wa-icon>\n Add files…\n </wa-button>\n </div>\n </wa-dropdown>\n `;\n }\n\n private renderAttachmentDialog() {\n const preview = this.previewAttachment();\n if (!preview) return nothing;\n return html`\n <wa-dialog\n label=${preview.name}\n open\n light-dismiss\n with-footer\n style=\"--width: min(40rem, 94vw)\"\n @wa-after-hide=${() => this.closeAttachmentPreview()}\n >\n <div class=\"attach-dialog-body\">\n ${preview.kind === 'image' && preview.dataUrl\n ? html`<img class=\"attach-dialog-image\" src=${preview.dataUrl} alt=${preview.name} />`\n : nothing}\n ${preview.text\n ? html`<pre class=\"attach-dialog-text\">${preview.text}</pre>`\n : preview.kind === 'image' && preview.dataUrl\n ? nothing\n : html`<pre class=\"attach-dialog-text\"></pre>`}\n </div>\n <div slot=\"footer\">\n <wa-button\n variant=\"danger\"\n appearance=\"outlined\"\n @click=${() => this.removeSessionAttachment(preview.id)}\n >\n Remove\n </wa-button>\n <wa-button variant=\"brand\" @click=${() => this.closeAttachmentPreview()}>Close</wa-button>\n </div>\n </wa-dialog>\n `;\n }\n\n private resolvePermission(action: PermissionAction): void {\n if (!this.pendingPermission) return;\n cognitiveRuntime.resolvePermission(this.pendingPermission.requestId, action);\n this.pendingPermission = null;\n }\n\n protected renderToolbar(): TemplateResult {\n const session = this.focusedSession();\n const title = session?.title || 'Chat';\n return html`\n <span class=\"toolbar-title\" title=${title}>${title}</span>\n <wa-button size=\"s\" appearance=\"plain\" title=\"New chat\" @click=${() => this.newSession()}>\n <wa-icon name=\"plus\" label=\"New chat\"></wa-icon>\n </wa-button>\n ${this.renderHistoryDropdown()}\n <wa-button\n size=\"s\"\n appearance=\"plain\"\n title=\"Checkpoint\"\n @click=${() => {\n if (!this.focusedId) return;\n cognitiveRuntime.sessions.checkpoint(this.focusedId);\n this.syncSessions();\n cognitiveRuntime.commitSessions();\n }}\n >\n <wa-icon name=\"floppy-disk\" label=\"Checkpoint\"></wa-icon>\n </wa-button>\n ${this.renderSettingsDropdown()}\n `;\n }\n\n private contextRingStyle(level: ContextUsage['level']): string {\n const tone = level === 'critical' ? 'danger' : level === 'warn' ? 'warning' : 'success';\n // Match Web Awesome docs: quiet track + loud indicator.\n return [\n `--track-color: var(--wa-color-${tone}-fill-quiet)`,\n `--indicator-color: var(--wa-color-${tone}-fill-loud)`,\n ].join(';');\n }\n\n private renderContextDropdown() {\n const usage = this.contextUsage();\n const canCompact = (this.focusedSession()?.history.length ?? 0) > 12;\n const percentLabel = formatContextPercent(usage.percent);\n const title = `Context ${percentLabel} · ${formatTokenCount(usage.used)} / ${formatTokenCount(usage.limit)} tokens`;\n const ringValue = Math.min(100, Math.max(usage.percent, usage.used > 0 ? 1 : 0));\n\n return html`\n <wa-dropdown\n class=\"context-menu\"\n size=\"s\"\n placement=\"top-end\"\n distance=\"4\"\n >\n <wa-button\n slot=\"trigger\"\n appearance=\"plain\"\n size=\"s\"\n title=${title}\n >\n <wa-progress-ring\n class=\"context-ring\"\n style=${this.contextRingStyle(usage.level)}\n value=${ringValue}\n label=${title}\n ></wa-progress-ring>\n </wa-button>\n\n <div\n class=\"context-panel\"\n @click=${(e: Event) => e.stopPropagation()}\n @keydown=${(e: Event) => e.stopPropagation()}\n >\n <div class=\"context-header\">\n <strong>Context tokens</strong>\n <span>${percentLabel}</span>\n </div>\n <div class=\"context-bars\">\n ${usage.buckets.map((bucket) => {\n const share = usage.limit > 0 ? (bucket.tokens / usage.limit) * 100 : 0;\n return html`\n <div class=\"context-row\">\n <span class=\"context-row-label\">${bucket.label}</span>\n <span>${formatBucketDetail(bucket)}</span>\n <div class=\"context-meter\">\n <span\n style=\"width:${Math.max(share, bucket.tokens > 0 ? 0.5 : 0)}%; --bucket-color: var(--wa-color-brand-fill-normal)\"\n ></span>\n </div>\n </div>\n `;\n })}\n </div>\n <div class=\"context-footer\">\n <span class=\"context-remaining\">\n ~${formatTokenCount(usage.used)} used · ${formatTokenCount(usage.remaining)} free of\n ${formatTokenCount(usage.limit)}\n · ${shortModelLabel(usage.modelRef)}\n </span>\n <wa-button\n size=\"s\"\n variant=${usage.level === 'critical' ? 'danger' : 'neutral'}\n appearance=${canCompact ? 'filled' : 'outlined'}\n ?disabled=${!canCompact || this.busy}\n @click=${() => this.compactFocused()}\n >\n <wa-icon slot=\"start\" name=\"arrows-down-to-line\"></wa-icon>\n Compact conversation\n </wa-button>\n </div>\n </div>\n </wa-dropdown>\n `;\n }\n\n protected renderContent() {\n const session = this.focusedSession();\n return html`\n <div class=\"cognitive-shell\">\n <wa-scroller class=\"transcript\" orientation=\"vertical\">\n <div class=\"transcript-inner\">\n <div class=\"transcript-spacer\" aria-hidden=\"true\"></div>\n ${session ? this.renderTranscript(session) : nothing}\n </div>\n </wa-scroller>\n\n <div\n class=\"composer-shell ${this.dragOver ? 'drag-over' : ''}\"\n @dragover=${(e: DragEvent) => this.onComposerDragOver(e)}\n @dragleave=${(e: DragEvent) => this.onComposerDragLeave(e)}\n @drop=${(e: DragEvent) => void this.onComposerDrop(e)}\n >\n <input\n id=\"attach-file-input\"\n type=\"file\"\n multiple\n accept=${ATTACHMENT_FILE_ACCEPT}\n hidden\n @change=${(e: Event) => void this.onFileInputChange(e)}\n />\n <div class=\"composer\">\n <div class=\"composer-row\">\n <wa-textarea\n placeholder=\"Enter your message here...\"\n size=\"s\"\n resize=\"auto\"\n rows=\"1\"\n .value=${this.draft}\n ?disabled=${this.busy}\n @input=${(e: Event) => {\n this.draft = (e.target as HTMLTextAreaElement).value;\n }}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n void this.send();\n }\n }}\n ></wa-textarea>\n <div class=\"composer-actions\">\n ${this.renderAttachmentDropdown()}\n ${this.renderContextDropdown()}\n </div>\n </div>\n </div>\n </div>\n ${this.renderAttachmentDialog()}\n </div>\n `;\n }\n\n private renderTranscript(session: CognitiveSession) {\n const showStreaming = this.streamingParts.length > 0;\n const showPermission =\n this.pendingPermission && this.pendingPermission.sessionId === session.id;\n\n return html`\n ${session.history.map((m) => this.renderMessage(m))}\n ${showStreaming\n ? this.renderAssistantMessage(\n {\n id: 'streaming',\n role: 'assistant',\n parts: this.streamingParts,\n createdAt: Date.now(),\n },\n { streaming: true },\n )\n : nothing}\n ${showPermission\n ? html`\n <wa-callout variant=\"warning\" appearance=\"outlined\">\n <wa-icon slot=\"icon\" name=\"shield-halved\"></wa-icon>\n Allow tool <code>${this.pendingPermission!.toolName}</code>?\n <pre class=\"args\">${JSON.stringify(this.pendingPermission!.args, null, 2)}</pre>\n <div class=\"approval-actions\">\n <wa-button size=\"s\" variant=\"success\" @click=${() => this.resolvePermission('allow')}>\n <wa-icon slot=\"start\" name=\"check\"></wa-icon>\n Allow\n </wa-button>\n <wa-button\n size=\"s\"\n variant=\"neutral\"\n appearance=\"outlined\"\n @click=${() => this.resolvePermission('deny')}\n >\n <wa-icon slot=\"start\" name=\"xmark\"></wa-icon>\n Deny\n </wa-button>\n </div>\n </wa-callout>\n `\n : nothing}\n `;\n }\n\n private renderHistoryDropdown() {\n const items = this.historySessions();\n const groups = groupSessionsByRecency(items);\n\n return html`\n <wa-dropdown\n class=\"history-menu\"\n size=\"s\"\n placement=\"bottom-end\"\n distance=\"4\"\n ?open=${this.historyOpen}\n @wa-after-show=${() => {\n this.historyOpen = true;\n }}\n @wa-after-hide=${() => {\n this.historyOpen = false;\n this.historyQuery = '';\n }}\n >\n <wa-button\n slot=\"trigger\"\n appearance=\"plain\"\n size=\"s\"\n with-caret\n title=\"Chat history\"\n @click=${(e: Event) => {\n e.stopPropagation();\n this.historyOpen = !this.historyOpen;\n }}\n >\n <wa-icon name=\"clock-rotate-left\" label=\"Chat history\"></wa-icon>\n </wa-button>\n\n <div\n class=\"history-search\"\n @click=${(e: Event) => e.stopPropagation()}\n @keydown=${(e: Event) => e.stopPropagation()}\n >\n <wa-input\n size=\"s\"\n clearable\n placeholder=\"Search chats…\"\n .value=${this.historyQuery}\n @input=${(e: Event) => {\n this.historyQuery = (e.target as HTMLInputElement).value;\n }}\n >\n <wa-icon slot=\"start\" name=\"magnifying-glass\"></wa-icon>\n </wa-input>\n </div>\n\n ${groups.length\n ? groups.map(\n (group) => html`\n <h3>${group.label}</h3>\n ${group.sessions.map(\n (s) => html`\n <wa-dropdown-item @click=${() => this.openSession(s.id)}>\n <wa-icon\n slot=\"icon\"\n name=${s.id === this.focusedId ? 'check' : 'message'}\n ></wa-icon>\n <span class=\"history-item-title\" title=${s.title}>${s.title}</span>\n <div slot=\"details\" style=\"display:flex;align-items:center;gap:0.25rem\">\n <span class=\"history-item-meta\">${relativeTime(s.updatedAt)}</span>\n <wa-button\n appearance=\"plain\"\n size=\"s\"\n title=\"Delete chat\"\n @click=${(e: Event) => {\n e.stopPropagation();\n this.deleteSession(s.id);\n }}\n >\n <wa-icon name=\"trash\" label=\"Delete chat\"></wa-icon>\n </wa-button>\n </div>\n </wa-dropdown-item>\n `,\n )}\n `,\n )\n : html`<div class=\"history-empty\">${this.historyQuery ? 'No matching chats' : 'No chats yet'}</div>`}\n </wa-dropdown>\n `;\n }\n\n private onSettingsSelect(value: string): void {\n if (value === 'settings') {\n void this.executeCommand(OPEN_AI_SETTINGS_COMMAND, {});\n return;\n }\n if (value.startsWith('approval:')) {\n const mode = value.slice('approval:'.length);\n if (mode === 'manual' || mode === 'auto_safe' || mode === 'auto_all') {\n this.approvalMode = mode;\n cognitiveRuntime.setApprovalMode(mode);\n }\n return;\n }\n if (value.startsWith('effort:')) {\n this.manualEffort = (value.slice(7) as EffortLevel | 'auto') || 'auto';\n return;\n }\n this.onRouterSelect(value);\n }\n\n private renderSettingsDropdown() {\n const selected = this.routerValue();\n const autoOptions = [\n { value: 'auto:cost', label: 'Auto · Cost' },\n { value: 'auto:balance', label: 'Auto · Balance' },\n { value: 'auto:intelligence', label: 'Auto · Intelligence' },\n ];\n const effortOptions = this.effortChoices();\n\n return html`\n <wa-dropdown\n class=\"settings-menu\"\n size=\"s\"\n placement=\"bottom-end\"\n distance=\"4\"\n @wa-select=${(e: CustomEvent<{ item?: { value?: string } }>) => {\n const value = e.detail?.item?.value;\n if (value != null) this.onSettingsSelect(value);\n }}\n >\n <wa-button\n slot=\"trigger\"\n appearance=\"plain\"\n size=\"s\"\n with-caret\n title=${`AI · ${this.routerLabel()}`}\n >\n <wa-icon name=\"gear\" label=\"AI settings\"></wa-icon>\n </wa-button>\n\n <h3>Auto</h3>\n ${autoOptions.map(\n (option) => html`\n <wa-dropdown-item\n value=${option.value}\n type=\"checkbox\"\n ?checked=${option.value === selected}\n >\n ${option.label}\n </wa-dropdown-item>\n `,\n )}\n\n <wa-divider></wa-divider>\n <h3>Models</h3>\n ${this.modelIds.length\n ? this.modelIds.map(\n (id) => html`\n <wa-dropdown-item\n value=${`model:${id}`}\n type=\"checkbox\"\n ?checked=${selected === `model:${id}`}\n >\n ${id}\n </wa-dropdown-item>\n `,\n )\n : html`<wa-dropdown-item disabled>No models configured</wa-dropdown-item>`}\n\n ${this.policyMode === 'manual'\n ? html`\n <wa-divider></wa-divider>\n <h3>Effort</h3>\n ${effortOptions.map(\n (level) => html`\n <wa-dropdown-item\n value=${`effort:${level}`}\n type=\"checkbox\"\n ?checked=${this.manualEffort === level}\n >\n ${level}\n </wa-dropdown-item>\n `,\n )}\n `\n : nothing}\n\n <wa-divider></wa-divider>\n <h3>Tool approvals</h3>\n ${APPROVAL_OPTIONS.map(\n (option) => html`\n <wa-dropdown-item\n value=${`approval:${option.value}`}\n type=\"checkbox\"\n ?checked=${this.approvalMode === option.value}\n >\n ${option.label}\n </wa-dropdown-item>\n `,\n )}\n\n <wa-divider></wa-divider>\n <wa-dropdown-item value=\"settings\">\n <wa-icon slot=\"icon\" name=\"sliders\"></wa-icon>\n Settings…\n </wa-dropdown-item>\n </wa-dropdown>\n `;\n }\n\n private resolveAttachmentDataUrl(fileId: string): string | undefined {\n return this.focusedSession()?.attachments?.find((a) => a.id === fileId)?.dataUrl;\n }\n\n private renderMessage(message: ChatMessage) {\n if (message.role === 'user') {\n const files = message.parts.filter((p): p is Extract<MessagePart, { type: 'file' }> => p.type === 'file');\n const texts = message.parts.filter((p) => p.type === 'text');\n return html`\n <div class=\"msg user\">\n ${files.length\n ? html`\n <div class=\"msg-files\">\n ${files.map((file) => {\n const dataUrl =\n file.kind === 'image' ? this.resolveAttachmentDataUrl(file.id) : undefined;\n return dataUrl\n ? html`<img\n class=\"msg-file-thumb\"\n src=${dataUrl}\n alt=${file.name}\n title=${`${file.name} (${file.id})`}\n />`\n : html`\n <wa-tag\n size=\"s\"\n appearance=\"outlined\"\n title=${`${file.path || file.name} (${file.id})`}\n >\n <wa-icon slot=\"start\" name=${file.kind === 'image' ? 'image' : 'file'}></wa-icon>\n ${file.name}\n </wa-tag>\n `;\n })}\n </div>\n `\n : nothing}\n ${texts.map((p) => this.renderTextPart(p))}\n ${this.renderMessageMeta(message)}\n </div>\n `;\n }\n return this.renderAssistantMessage(message);\n }\n\n private renderAssistantMessage(message: ChatMessage, opts: { streaming?: boolean } = {}) {\n const textParts = message.parts.filter((p) => p.type === 'text');\n const techParts = message.parts.filter((p) => p.type !== 'text');\n const open =\n opts.streaming === true ||\n techParts.some((p) => (p.type === 'reasoning' || p.type === 'tool') && p.status === 'streaming');\n\n const summary = html`\n <div slot=\"summary\" class=\"msg-summary\">\n ${opts.streaming\n ? html`\n <div class=\"streaming-meta\">\n <wa-spinner style=\"font-size: 0.85rem\"></wa-spinner>\n <span>streaming…</span>\n </div>\n `\n : nothing}\n ${textParts.length\n ? textParts.map((p) => this.renderTextPart(p))\n : html`<div class=\"bubble\">${technicalSummary(techParts)}</div>`}\n </div>\n `;\n\n if (!techParts.length) {\n return html`\n <div class=\"msg assistant\">\n ${opts.streaming\n ? html`\n <div class=\"streaming-meta\">\n <wa-spinner style=\"font-size: 0.85rem\"></wa-spinner>\n <span>streaming…</span>\n </div>\n `\n : nothing}\n ${textParts.map((p) => this.renderTextPart(p))}\n ${message.id !== 'streaming' ? this.renderMessageMeta(message) : nothing}\n </div>\n `;\n }\n\n return html`\n <div class=\"msg assistant\">\n <wa-details class=\"msg-details\" appearance=\"plain\" ?open=${open}>\n ${summary}\n <div class=\"msg-tech\">${techParts.map((p) => this.renderTechnicalPart(p))}</div>\n </wa-details>\n ${message.id !== 'streaming' ? this.renderMessageMeta(message) : nothing}\n </div>\n `;\n }\n\n private renderMessageMeta(message: ChatMessage) {\n const timeLabel = formatMessageTime(message.createdAt);\n return html`\n <div class=\"msg-meta\">\n <wa-tag size=\"s\" appearance=\"outlined\" title=${new Date(message.createdAt).toLocaleString()}>\n ${timeLabel}\n </wa-tag>\n ${message.routedModel\n ? html`<wa-tag size=\"s\" appearance=\"outlined\">${message.routedModel}</wa-tag>`\n : nothing}\n ${message.effort\n ? html`<wa-tag size=\"s\" appearance=\"outlined\">${message.effort}</wa-tag>`\n : nothing}\n </div>\n `;\n }\n\n private renderTextPart(part: MessagePart) {\n if (part.type === 'text') return html`<div class=\"bubble\">${part.text}</div>`;\n return nothing;\n }\n\n private renderTechnicalPart(part: MessagePart) {\n if (part.type === 'reasoning') {\n return html`\n <div>\n <div class=\"tool-heading\">Thinking</div>\n <div class=\"bubble\">${part.text}</div>\n </div>\n `;\n }\n if (part.type === 'tool') {\n const heading = `${part.name} · ${part.status}${part.durationMs != null ? ` · ${part.durationMs}ms` : ''}`;\n return html`\n <div>\n <div class=\"tool-heading\">${heading}</div>\n <pre class=\"args\">${JSON.stringify({ args: part.args, result: part.result }, null, 2)}</pre>\n </div>\n `;\n }\n if (part.type === 'step') {\n return html`<div class=\"tool-heading\">Step: ${part.title} · ${part.status}</div>`;\n }\n return nothing;\n }\n}\n\nconst APPROVAL_OPTIONS: Array<{ value: ToolApprovalMode; label: string }> = [\n { value: 'manual', label: 'Manual' },\n { value: 'auto_safe', label: 'Auto-approve non-critical' },\n { value: 'auto_all', label: 'Approve all' },\n];\n\nfunction capitalize(value: string): string {\n return value ? value[0]!.toUpperCase() + value.slice(1) : value;\n}\n\nfunction technicalSummary(parts: MessagePart[]): string {\n const tools = parts.filter((p): p is Extract<MessagePart, { type: 'tool' }> => p.type === 'tool');\n const reasoning = parts.some((p) => p.type === 'reasoning');\n const steps = parts.filter((p): p is Extract<MessagePart, { type: 'step' }> => p.type === 'step');\n\n const bits: string[] = [];\n if (tools.length) {\n bits.push(\n tools\n .map((t) => `${t.name} · ${t.status}${t.durationMs != null ? ` · ${t.durationMs}ms` : ''}`)\n .join(', '),\n );\n }\n if (reasoning) bits.push('Thinking');\n if (steps.length) bits.push(`${steps.length} step${steps.length === 1 ? '' : 's'}`);\n return bits.join(' · ') || 'Details';\n}\n\nfunction startOfDay(ts: number): number {\n const d = new Date(ts);\n d.setHours(0, 0, 0, 0);\n return d.getTime();\n}\n\nfunction groupSessionsByRecency(sessions: CognitiveSession[]): Array<{ label: string; sessions: CognitiveSession[] }> {\n const now = Date.now();\n const today = startOfDay(now);\n const yesterday = today - 86_400_000;\n const week = today - 7 * 86_400_000;\n const buckets: Record<'today' | 'yesterday' | 'week' | 'older', CognitiveSession[]> = {\n today: [],\n yesterday: [],\n week: [],\n older: [],\n };\n\n for (const s of sessions) {\n const day = startOfDay(s.updatedAt);\n if (day >= today) buckets.today.push(s);\n else if (day >= yesterday) buckets.yesterday.push(s);\n else if (day >= week) buckets.week.push(s);\n else buckets.older.push(s);\n }\n\n return (\n [\n { label: 'Today', sessions: buckets.today },\n { label: 'Yesterday', sessions: buckets.yesterday },\n { label: 'Previous 7 Days', sessions: buckets.week },\n { label: 'Older', sessions: buckets.older },\n ] as const\n ).filter((g) => g.sessions.length > 0);\n}\n\nfunction relativeTime(ts: number): string {\n const delta = Math.max(0, Date.now() - ts);\n const mins = Math.floor(delta / 60_000);\n if (mins < 1) return 'now';\n if (mins < 60) return `${mins}m`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h`;\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d`;\n return new Date(ts).toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n}\n\nfunction formatMessageTime(ts: number): string {\n const date = new Date(ts);\n const now = new Date();\n const sameDay =\n date.getFullYear() === now.getFullYear() &&\n date.getMonth() === now.getMonth() &&\n date.getDate() === now.getDate();\n const time = date.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });\n if (sameDay) return time;\n return `${date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })} ${time}`;\n}\n\nfunction shortModelLabel(modelRef: string): string {\n const slash = modelRef.indexOf('/');\n return slash === -1 ? modelRef : modelRef.slice(slash + 1);\n}\n\nfunction mergePart(parts: MessagePart[], part: MessagePart): MessagePart[] {\n const next = [...parts];\n const last = next[next.length - 1];\n if (part.type === 'text' && last?.type === 'text') {\n next[next.length - 1] = { ...last, text: last.text + part.text };\n return next;\n }\n if (part.type === 'reasoning' && last?.type === 'reasoning') {\n next[next.length - 1] = { ...last, text: last.text + part.text, status: part.status };\n return next;\n }\n if (part.type === 'tool' && last?.type === 'tool' && last.id === part.id) {\n next[next.length - 1] = part;\n return next;\n }\n next.push(part);\n return next;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'docks-cognitive-view': DocksCognitiveView;\n }\n}\n","import '@eclipse-docks/core/externals/webawesome';\nimport {\n DocksPart,\n EditorInput,\n confirmDialog,\n toastError,\n toastInfo,\n} from '@eclipse-docks/core';\nimport { css, customElement, html, property, state } from '@eclipse-docks/core/externals/lit';\nimport {\n cognitiveRuntime,\n TOPIC,\n defaultProvidersSettings,\n fetchOpenAICompatibleModels,\n parseModelIds,\n} from '../runtime';\nimport type { ProviderConfig, ProvidersSettings, RemoteModelInfo, ToolApprovalMode } from '../runtime';\n\nconst APPROVAL_OPTIONS: Array<{ value: ToolApprovalMode; label: string; hint: string }> = [\n { value: 'manual', label: 'Manual', hint: 'Confirm every tool before it runs' },\n {\n value: 'auto_safe',\n label: 'Auto-approve non-critical',\n hint: 'The agent classifies each tool as safe or critical; only critical ones ask for approval',\n },\n { value: 'auto_all', label: 'Approve all', hint: 'Run every tool without asking' },\n];\n\n@customElement('docks-cognitive-settings-editor')\nexport class DocksCognitiveSettingsEditor extends DocksPart {\n @property({ attribute: false }) public input?: EditorInput;\n\n @state() private settings: ProvidersSettings = defaultProvidersSettings();\n @state() private approvalMode: ToolApprovalMode = 'auto_safe';\n @state() private availableModels: Record<number, RemoteModelInfo[]> = {};\n @state() private loadingModels: Record<number, boolean> = {};\n @state() private modelErrors: Record<number, string> = {};\n\n private unsubs: Array<() => void> = [];\n private fetchControllers = new Map<number, AbortController>();\n private fetchTimers = new Map<number, ReturnType<typeof setTimeout>>();\n private autoFetchedKeys = new Set<string>();\n\n protected doInitUI(): void {\n cognitiveRuntime.start();\n this.loadFromRuntime();\n this.unsubs.push(\n cognitiveRuntime.events.subscribe(TOPIC.providersChanged, () => {\n if (!this.isDirty()) this.loadFromRuntime();\n }),\n cognitiveRuntime.events.subscribe(TOPIC.approvalModeChanged, (mode) => {\n this.approvalMode = mode as ToolApprovalMode;\n }),\n );\n }\n\n disconnectedCallback(): void {\n for (const unsub of this.unsubs) unsub();\n this.unsubs = [];\n for (const timer of this.fetchTimers.values()) clearTimeout(timer);\n this.fetchTimers.clear();\n for (const controller of this.fetchControllers.values()) controller.abort();\n this.fetchControllers.clear();\n super.disconnectedCallback();\n }\n\n private loadFromRuntime(): void {\n this.settings = cognitiveRuntime.getProvidersSettings();\n this.approvalMode = cognitiveRuntime.getApprovalMode();\n this.availableModels = {};\n this.loadingModels = {};\n this.modelErrors = {};\n this.autoFetchedKeys.clear();\n this.markDirty(false);\n this.settings.providers.forEach((provider, index) => {\n if (provider.apiKey.trim() && provider.baseUrl.trim()) {\n void this.fetchModels(index, { auto: true });\n }\n });\n }\n\n private setApprovalMode(mode: ToolApprovalMode): void {\n this.approvalMode = mode;\n cognitiveRuntime.setApprovalMode(mode);\n }\n\n private touch(next: ProvidersSettings): void {\n this.settings = next;\n this.markDirty(true);\n }\n\n private updateProvider(index: number, patch: Partial<ProviderConfig>): void {\n const prev = this.settings.providers[index];\n const providers = this.settings.providers.map((p, i) => (i === index ? { ...p, ...patch } : p));\n let defaultProviderId = this.settings.defaultProviderId;\n if (patch.id && prev?.id === defaultProviderId) {\n defaultProviderId = patch.id;\n }\n this.touch({ ...this.settings, defaultProviderId, providers });\n\n if (patch.apiKey !== undefined || patch.baseUrl !== undefined) {\n const next = providers[index];\n if (next?.apiKey.trim() && next.baseUrl.trim()) {\n this.scheduleFetchModels(index);\n } else if (!next?.apiKey.trim()) {\n this.clearModels(index);\n }\n }\n }\n\n private clearModels(index: number): void {\n this.fetchTimers.get(index) && clearTimeout(this.fetchTimers.get(index)!);\n this.fetchTimers.delete(index);\n this.fetchControllers.get(index)?.abort();\n this.fetchControllers.delete(index);\n const { [index]: _a, ...available } = this.availableModels;\n const { [index]: _b, ...loading } = this.loadingModels;\n const { [index]: _c, ...errors } = this.modelErrors;\n this.availableModels = available;\n this.loadingModels = loading;\n this.modelErrors = errors;\n }\n\n private scheduleFetchModels(index: number): void {\n const existing = this.fetchTimers.get(index);\n if (existing) clearTimeout(existing);\n this.fetchTimers.set(\n index,\n setTimeout(() => {\n this.fetchTimers.delete(index);\n void this.fetchModels(index, { auto: true });\n }, 400),\n );\n }\n\n private async fetchModels(index: number, opts: { auto?: boolean } = {}): Promise<void> {\n const provider = this.settings.providers[index];\n if (!provider?.baseUrl.trim()) {\n toastError('Set a base URL before fetching models');\n return;\n }\n if (opts.auto && !provider.apiKey.trim()) return;\n\n const fingerprint = `${provider.baseUrl}|${provider.apiKey}`;\n if (opts.auto && this.autoFetchedKeys.has(fingerprint) && this.availableModels[index]?.length) {\n return;\n }\n\n this.fetchControllers.get(index)?.abort();\n const controller = new AbortController();\n this.fetchControllers.set(index, controller);\n this.loadingModels = { ...this.loadingModels, [index]: true };\n this.modelErrors = { ...this.modelErrors, [index]: '' };\n\n try {\n const models = await fetchOpenAICompatibleModels(\n provider.baseUrl,\n provider.apiKey || undefined,\n controller.signal,\n );\n if (controller.signal.aborted) return;\n this.availableModels = { ...this.availableModels, [index]: models };\n this.autoFetchedKeys.add(fingerprint);\n if (!opts.auto) toastInfo(`Loaded ${models.length} models`);\n } catch (err) {\n if (controller.signal.aborted) return;\n const message = err instanceof Error ? err.message : String(err);\n this.modelErrors = { ...this.modelErrors, [index]: message };\n this.availableModels = { ...this.availableModels, [index]: [] };\n if (!opts.auto) toastError(message);\n } finally {\n if (this.fetchControllers.get(index) === controller) {\n this.fetchControllers.delete(index);\n this.loadingModels = { ...this.loadingModels, [index]: false };\n }\n }\n }\n\n private onModelsSelect(index: number, e: Event): void {\n const target = e.target as HTMLSelectElement & { value: string | string[] };\n const value = target.value;\n const selected = Array.isArray(value) ? value : value ? [value] : [];\n this.updateProvider(index, { models: selected.join(',') });\n }\n\n private addProvider(): void {\n const id = uniqueProviderId(this.settings.providers);\n this.touch({\n ...this.settings,\n providers: [\n ...this.settings.providers,\n { id, baseUrl: '', apiKey: '', models: '', enabled: true },\n ],\n defaultProviderId: this.settings.defaultProviderId || id,\n });\n }\n\n private async deleteProvider(index: number): Promise<void> {\n const provider = this.settings.providers[index];\n if (!provider) return;\n if (!(await confirmDialog(`Delete provider \"${provider.id || '(unnamed)'}\"?`))) return;\n this.clearModels(index);\n const providers = this.settings.providers.filter((_, i) => i !== index);\n const defaultProviderId =\n this.settings.defaultProviderId === provider.id\n ? (providers.find((p) => p.enabled)?.id ?? '')\n : this.settings.defaultProviderId;\n this.touch({ providers, defaultProviderId });\n this.reindexModelState(index);\n }\n\n /** Shift per-row model fetch state after a row is removed. */\n private reindexModelState(removed: number): void {\n const remap = <T,>(src: Record<number, T>): Record<number, T> => {\n const next: Record<number, T> = {};\n for (const [key, value] of Object.entries(src)) {\n const i = Number(key);\n if (Number.isNaN(i) || i === removed) continue;\n next[i > removed ? i - 1 : i] = value;\n }\n return next;\n };\n this.availableModels = remap(this.availableModels);\n this.loadingModels = remap(this.loadingModels);\n this.modelErrors = remap(this.modelErrors);\n }\n\n private setDefault(id: string): void {\n this.touch({ ...this.settings, defaultProviderId: id });\n }\n\n override async save(): Promise<void> {\n if (!this.isDirty()) return;\n try {\n await cognitiveRuntime.setProvidersSettings(this.settings);\n this.loadFromRuntime();\n toastInfo('AI providers saved');\n } catch (err) {\n toastError(err instanceof Error ? err.message : String(err));\n }\n }\n\n protected renderToolbar() {\n return html`\n <wa-button size=\"s\" appearance=\"plain\" title=\"Add provider\" @click=${() => this.addProvider()}>\n <wa-icon name=\"plus\" label=\"Add provider\"></wa-icon>\n </wa-button>\n <wa-button\n size=\"s\"\n variant=\"brand\"\n ?disabled=${!this.isDirty()}\n @click=${() => void this.save()}\n >\n <wa-icon slot=\"start\" name=\"floppy-disk\"></wa-icon>\n Save\n </wa-button>\n `;\n }\n\n protected renderContent() {\n const rows = this.settings.providers;\n return html`\n <div class=\"editor\">\n <section class=\"section\">\n <header class=\"header\">\n <div>\n <h2>Tool approvals</h2>\n <p class=\"hint\">How the agent handles tool confirmation — same options as GitHub Copilot.</p>\n </div>\n </header>\n <wa-radio-group\n name=\"approval-mode\"\n label=\"Approval mode\"\n orientation=\"vertical\"\n .value=${this.approvalMode}\n @change=${(e: Event) => {\n const value = (e.target as HTMLInputElement).value;\n if (value === 'manual' || value === 'auto_safe' || value === 'auto_all') {\n this.setApprovalMode(value);\n }\n }}\n >\n ${APPROVAL_OPTIONS.map(\n (option) => html`\n <wa-radio value=${option.value}>\n <span class=\"approval-option\">\n <span class=\"approval-label\">${option.label}</span>\n <span class=\"approval-hint\">${option.hint}</span>\n </span>\n </wa-radio>\n `,\n )}\n </wa-radio-group>\n </section>\n\n <section class=\"section\">\n <header class=\"header\">\n <div>\n <h2>AI Providers</h2>\n <p class=\"hint\">OpenAI-compatible endpoints. Edit cells in place, then Save.</p>\n </div>\n <wa-button size=\"s\" variant=\"brand\" appearance=\"filled\" @click=${() => this.addProvider()}>\n <wa-icon slot=\"start\" name=\"plus\"></wa-icon>\n Add provider\n </wa-button>\n </header>\n\n ${rows.length === 0\n ? html`<wa-callout variant=\"neutral\" appearance=\"outlined\">No providers configured.</wa-callout>`\n : html`\n <div class=\"table-wrap\">\n <table class=\"providers\">\n <thead>\n <tr>\n <th class=\"col-on\">On</th>\n <th class=\"col-id\">ID</th>\n <th class=\"col-url\">Base URL</th>\n <th class=\"col-key\">API Key</th>\n <th class=\"col-models\">Models</th>\n <th class=\"col-default\">Default</th>\n <th class=\"col-actions\"></th>\n </tr>\n </thead>\n <tbody>\n ${rows.map((provider, index) => this.renderRow(provider, index))}\n </tbody>\n </table>\n </div>\n `}\n\n <wa-callout variant=\"neutral\" appearance=\"plain\" size=\"s\">\n <wa-icon slot=\"icon\" name=\"circle-info\"></wa-icon>\n Enter an API key to load available models. Catalog ids become\n <code>providerId/modelId</code> for Auto routing.\n </wa-callout>\n </section>\n </div>\n `;\n }\n\n private renderRow(provider: ProviderConfig, index: number) {\n const isDefault = this.settings.defaultProviderId === provider.id;\n return html`\n <tr class=${isDefault ? 'is-default' : ''}>\n <td>\n <wa-checkbox\n ?checked=${provider.enabled}\n @change=${(e: Event) =>\n this.updateProvider(index, { enabled: (e.target as HTMLInputElement).checked })}\n ></wa-checkbox>\n </td>\n <td>\n <wa-input\n size=\"s\"\n .value=${provider.id}\n placeholder=\"openai\"\n @input=${(e: Event) => this.updateProvider(index, { id: (e.target as HTMLInputElement).value })}\n ></wa-input>\n </td>\n <td>\n <wa-input\n size=\"s\"\n .value=${provider.baseUrl}\n placeholder=\"https://api.openai.com/v1\"\n @input=${(e: Event) =>\n this.updateProvider(index, { baseUrl: (e.target as HTMLInputElement).value })}\n ></wa-input>\n </td>\n <td>\n <wa-input\n size=\"s\"\n type=\"password\"\n password-toggle\n .value=${provider.apiKey}\n placeholder=\"optional\"\n @input=${(e: Event) =>\n this.updateProvider(index, { apiKey: (e.target as HTMLInputElement).value })}\n ></wa-input>\n </td>\n <td>${this.renderModelsCell(provider, index)}</td>\n <td class=\"col-default\">\n ${isDefault\n ? html`<wa-tag size=\"s\" variant=\"brand\" pill>Default</wa-tag>`\n : html`\n <wa-button\n size=\"s\"\n appearance=\"plain\"\n ?disabled=${!provider.id}\n @click=${() => this.setDefault(provider.id)}\n >\n Set\n </wa-button>\n `}\n </td>\n <td class=\"col-actions\">\n <wa-button\n size=\"s\"\n appearance=\"plain\"\n variant=\"danger\"\n title=\"Delete\"\n @click=${() => void this.deleteProvider(index)}\n >\n <wa-icon name=\"trash\" label=\"Delete\"></wa-icon>\n </wa-button>\n </td>\n </tr>\n `;\n }\n\n private renderModelsCell(provider: ProviderConfig, index: number) {\n const hasKey = Boolean(provider.apiKey.trim());\n const remote = this.availableModels[index] ?? [];\n const loading = Boolean(this.loadingModels[index]);\n const error = this.modelErrors[index];\n const selected = parseModelIds(provider.models);\n const showPicker = hasKey || remote.length > 0;\n\n if (!showPicker) {\n return html`\n <div class=\"models-cell\">\n <wa-input\n size=\"s\"\n .value=${provider.models}\n placeholder=\"gpt-4o-mini,gpt-4o\"\n @input=${(e: Event) =>\n this.updateProvider(index, { models: (e.target as HTMLInputElement).value })}\n ></wa-input>\n <wa-button\n size=\"s\"\n appearance=\"plain\"\n title=\"Fetch models\"\n ?disabled=${!provider.baseUrl.trim() || loading}\n ?loading=${loading}\n @click=${() => void this.fetchModels(index)}\n >\n <wa-icon name=\"arrows-rotate\" label=\"Reload models\"></wa-icon>\n </wa-button>\n </div>\n `;\n }\n\n return html`\n <div class=\"models-cell\">\n <wa-select\n size=\"s\"\n multiple\n with-clear\n placeholder=${loading ? 'Loading models…' : 'Select models'}\n .value=${selected}\n ?disabled=${loading && remote.length === 0}\n @change=${(e: Event) => this.onModelsSelect(index, e)}\n >\n ${remote.map(\n (m) => html`<wa-option value=${m.id}>${m.name === m.id ? m.id : `${m.name} (${m.id})`}</wa-option>`,\n )}\n ${selected\n .filter((id) => !remote.some((m) => m.id === id))\n .map((id) => html`<wa-option value=${id}>${id}</wa-option>`)}\n </wa-select>\n <wa-button\n size=\"s\"\n appearance=\"plain\"\n title=\"Reload models\"\n ?disabled=${!provider.baseUrl.trim() || loading}\n ?loading=${loading}\n @click=${() => void this.fetchModels(index)}\n >\n <wa-icon name=\"arrows-rotate\" label=\"Reload models\"></wa-icon>\n </wa-button>\n </div>\n ${error ? html`<div class=\"models-error\">${error}</div>` : ''}\n `;\n }\n\n static styles = css`\n :host {\n display: block;\n height: 100%;\n }\n\n .editor {\n display: flex;\n flex-direction: column;\n gap: var(--wa-space-2xl);\n padding: var(--wa-space-l);\n min-width: 0;\n }\n\n .section {\n display: flex;\n flex-direction: column;\n gap: var(--wa-space-l);\n min-width: 0;\n }\n\n .header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: var(--wa-space-m);\n flex-wrap: wrap;\n }\n\n .header h2 {\n margin: 0;\n font-size: var(--wa-font-size-l);\n }\n\n wa-radio-group {\n max-width: 36rem;\n }\n\n .approval-option {\n display: flex;\n flex-direction: column;\n gap: var(--wa-space-3xs);\n padding-block: var(--wa-space-3xs);\n }\n\n .approval-label {\n font-weight: 500;\n }\n\n .approval-hint {\n color: var(--wa-color-text-quiet);\n font-size: var(--wa-font-size-s);\n }\n\n .hint {\n margin: var(--wa-space-2xs) 0 0;\n color: var(--wa-color-text-quiet);\n font-size: var(--wa-font-size-s);\n }\n\n .table-wrap {\n overflow: auto;\n border: var(--wa-border-width-s) solid var(--wa-color-border-normal);\n border-radius: var(--wa-border-radius-m);\n }\n\n table.providers {\n width: 100%;\n border-collapse: collapse;\n min-width: 56rem;\n }\n\n th,\n td {\n padding: var(--wa-space-2xs) var(--wa-space-s);\n border-bottom: var(--wa-border-width-s) solid var(--wa-color-border-normal);\n text-align: left;\n vertical-align: middle;\n }\n\n th {\n font-size: var(--wa-font-size-xs);\n font-weight: 600;\n color: var(--wa-color-text-quiet);\n background: var(--wa-color-surface-lowered);\n white-space: nowrap;\n }\n\n tr.is-default td {\n background: color-mix(in srgb, var(--wa-color-brand-fill-normal) 8%, transparent);\n }\n\n tbody tr:last-child td {\n border-bottom: none;\n }\n\n .col-on {\n width: 2.5rem;\n }\n\n .col-id {\n width: 8rem;\n }\n\n .col-key {\n width: 11rem;\n }\n\n .col-models {\n min-width: 16rem;\n }\n\n .col-default {\n width: 5.5rem;\n white-space: nowrap;\n }\n\n .col-actions {\n width: 2.75rem;\n text-align: end;\n }\n\n td wa-input {\n width: 100%;\n }\n\n .models-cell {\n display: flex;\n gap: var(--wa-space-2xs);\n align-items: flex-start;\n min-width: 14rem;\n }\n\n .models-cell wa-input,\n .models-cell wa-select {\n flex: 1;\n min-width: 0;\n }\n\n .models-error {\n margin-top: var(--wa-space-3xs);\n color: var(--wa-color-danger-on-quiet);\n font-size: var(--wa-font-size-xs);\n }\n\n code {\n font-family: var(--wa-font-family-code, var(--wa-font-mono));\n font-size: 0.9em;\n }\n `;\n}\n\nfunction uniqueProviderId(existing: ProviderConfig[]): string {\n const used = new Set(existing.map((p) => p.id));\n if (!used.has('provider')) return 'provider';\n let n = 2;\n while (used.has(`provider-${n}`)) n += 1;\n return `provider-${n}`;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'docks-cognitive-settings-editor': DocksCognitiveSettingsEditor;\n }\n}\n","import {\n contributionRegistry,\n editorRegistry,\n registerAll,\n rootContext,\n SIDEBAR_AUXILIARY,\n type EditorInput,\n} from '@eclipse-docks/core';\nimport { html } from '@eclipse-docks/core/externals/lit';\nimport {\n AI_SETTINGS_EDITOR_ID,\n AI_SETTINGS_KEY,\n AI_VIEW_NAME,\n OPEN_AI_SETTINGS_COMMAND,\n cognitiveRuntime,\n} from './runtime';\nimport './view/cognitive-view';\nimport './view/cognitive-settings-editor';\n\ncognitiveRuntime.start();\nrootContext.put('cognitiveRuntime', cognitiveRuntime);\n\ncontributionRegistry.registerContribution(SIDEBAR_AUXILIARY, {\n name: AI_VIEW_NAME,\n label: 'AI',\n icon: 'robot',\n editorId: AI_VIEW_NAME,\n component: (id: string) => html`<docks-cognitive-view id=\"${id}\"></docks-cognitive-view>`,\n});\n\neditorRegistry.registerEditorInputHandler({\n editorId: AI_SETTINGS_EDITOR_ID,\n label: 'AI Settings',\n ranking: 1000,\n canHandle: (input: EditorInput) => input.key === AI_SETTINGS_KEY,\n handle: async (input: EditorInput) => {\n input.component = (id: string) =>\n html`<docks-cognitive-settings-editor id=\"${id}\" .input=${input}></docks-cognitive-settings-editor>`;\n return input;\n },\n});\n\nregisterAll({\n command: {\n id: OPEN_AI_SETTINGS_COMMAND,\n name: 'Open AI Settings',\n description: 'Configure AI model providers',\n parameters: [],\n },\n handler: {\n execute: () => {\n const editorInput = {\n title: 'AI Settings',\n data: {},\n key: AI_SETTINGS_KEY,\n icon: 'gear',\n state: {},\n } as EditorInput;\n void editorRegistry.loadEditor(editorInput);\n },\n },\n});\n"],"mappings":";;;;;;AA6CO,IAAM,qBAAN,MAAM,2BAA2B,UAAU;;;EACO,KAAA,aAAA;EAqdP,KAAA,WAAA,CAAC;EACL,KAAA,YAAA;EACnB,KAAA,QAAA;EAEyB,KAAA,uBAAA,CAAC;EACvB,KAAA,WAAA;EAC0B,KAAA,sBAAA;EAC9B,KAAA,OAAA;EACuC,KAAA,oBAAA;EACd,KAAA,aAAA;EACmB,KAAA,cAAA;EACrC,KAAA,cAAA;EACuB,KAAA,eAAA;EACJ,KAAA,eAAA;EACZ,KAAA,WAAA,CAAC;EACU,KAAA,iBAAA,CAAC;EACnB,KAAA,cAAA;EACC,KAAA,eAAA;EACI,KAAA,SAAA,CAAC;;;EArerB,KAAA,SAAA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwenB,aAA6B;EAC3B,iBAAiB,MAAM;EACvB,KAAK,aAAa;EAClB,KAAK,WAAW;EAChB,KAAK,eAAe,iBAAiB,gBAAgB;EACrD,iBAAsB,UAAU,CAAC,CAAC,WAAW;GAC3C,KAAK,aAAa;GAClB,KAAK,WAAW;GAChB,KAAK,eAAe,iBAAiB,gBAAgB;GACrD,KAAK,uBAAuB;EAC9B,CAAC;EACD,KAAK,OAAO,KACV,iBAAiB,OAAO,UAAU,MAAM,sBAAsB;GAC5D,KAAK,aAAa;GAClB,KAAK,uBAAuB;EAC9B,CAAC,GACD,iBAAiB,OAAO,UAAU,MAAM,wBAAwB,KAAK,WAAW,CAAC,GACjF,iBAAiB,OAAO,UAAU,MAAM,sBAAsB,SAAS;GACrE,KAAK,eAAe;EACtB,CAAC,GACD,iBAAiB,OAAO,UAAU,MAAM,kBAAkB,YAAY;GACpE,KAAK,oBAAoB;GACzB,KAAK,uBAAuB;EAC9B,CAAC,GACD,iBAAiB,OAAO,UAAU,MAAM,cAAc,YAAY;GAChE,MAAM,EAAE,WAAW,SAAS;GAC5B,IAAI,cAAc,KAAK,WAAW;GAClC,KAAK,iBAAiB,UAAU,KAAK,gBAAgB,IAAI;GACzD,KAAK,uBAAuB;EAC9B,CAAC,GACD,iBAAiB,OAAO,UAAU,MAAM,mBAAmB;GACzD,KAAK,iBAAiB,CAAC;GACvB,KAAK,aAAa;GAClB,KAAK,uBAAuB;EAC9B,CAAC,CACH;CACF;CAEA,UAA0B;EACxB,IAAI,KAAK,qBAAqB,aAAa,KAAK,mBAAmB;EACnE,KAAK,sBAAsB,KAAA;EAC3B,KAAK,MAAM,KAAK,KAAK,QAAQ,EAAE;EAC/B,KAAK,SAAS,CAAC;CACjB;CAEA,eAA6B;EAC3B,MAAM,YAAY,iBAAiB,SAAS,KAAK;EACjD,KAAK,WAAW,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;EACvE,MAAM,UAAU,iBAAiB,SAAS,QAAQ;EAClD,MAAM,WAAW,SAAS,MAAM,UAAU,EAAE,EAAE,MAAM;EACpD,IAAI,YAAY,SAAS,OAAO,UAC9B,iBAAiB,SAAS,MAAM,QAAQ;EAE1C,KAAK,YAAY;CACnB;CAEA,yBAAuC;EACrC,IAAI,KAAK,qBAAqB,aAAa,KAAK,mBAAmB;EACnE,KAAK,sBAAsB,iBAAiB;GAC1C,KAAK,sBAAsB,KAAA;GAC3B,KAAU,eAAe;EAC3B,GAAG,EAAE;CACP;CAEA,MAAc,iBAAgC;EAC5C,MAAM,KAAK;EACX,MAAM,IAAI,SAAe,YAAY,4BAA4B,QAAQ,CAAC,CAAC;EAC3E,MAAM,WAAW,KAAK,WAAW,cAAc,wBAAwB;EACvE,IAAI,CAAC,UAAU,YAAY;EAE3B,MAAM,YAAY,SAAS,WAAW,cAAc,UAAU;EAC9D,IAAI,EAAE,qBAAqB,cAAc;EACzC,UAAU,YAAY,UAAU;CAClC;CAEA,iBAAuD;EACrD,OAAO,KAAK,SAAS,MAAM,MAAM,EAAE,OAAO,KAAK,SAAS,KAAK,KAAK,SAAS;CAC7E;CAEA,cAAsB,WAAyB;EAC7C,IAAI,KAAK,SAAS,UAAU,GAAG;GAC7B,iBAAiB,SAAS,cAAc,EAAE,OAAO,OAAO,CAAC;GACzD,iBAAiB,SAAS,OAAO,SAAS;EAC5C,OACE,iBAAiB,SAAS,OAAO,SAAS;EAE5C,KAAK,iBAAiB,CAAC;EACvB,KAAK,aAAa;EAClB,iBAAiB,eAAe;CAClC;CAEA,YAAoB,WAAyB;EAC3C,IAAI,CAAC,iBAAiB,SAAS,MAAM,SAAS,GAAG;EACjD,KAAK,iBAAiB,CAAC;EACvB,KAAK,aAAa;EAClB,KAAK,cAAc;EACnB,KAAK,eAAe;EACpB,iBAAiB,eAAe;EAChC,KAAK,uBAAuB;CAC9B;CAEA,aAA2B;EACzB,iBAAiB,SAAS,cAAc,EAAE,OAAO,OAAO,CAAC;EACzD,KAAK,iBAAiB,CAAC;EACvB,KAAK,cAAc;EACnB,KAAK,eAAe;EACpB,KAAK,aAAa;EAClB,iBAAiB,eAAe;CAClC;CAEA,kBAA8C;EAC5C,MAAM,IAAI,KAAK,aAAa,KAAK,CAAC,CAAC,YAAY;EAC/C,MAAM,SAAS,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;EAC1E,IAAI,CAAC,GAAG,OAAO;EACf,OAAO,OAAO,QAAQ,MAAM;GAC1B,IAAI,EAAE,MAAM,YAAY,CAAC,CAAC,SAAS,CAAC,GAAG,OAAO;GAC9C,OAAO,EAAE,QAAQ,MAAM,MACrB,EAAE,MAAM,MAAM,MAAM;IAClB,IAAI,EAAE,SAAS,QAAQ,OAAO,EAAE,KAAK,YAAY,CAAC,CAAC,SAAS,CAAC;IAC7D,IAAI,EAAE,SAAS,QACb,OACE,EAAE,KAAK,YAAY,CAAC,CAAC,SAAS,CAAC,KAC/B,EAAE,GAAG,YAAY,CAAC,CAAC,SAAS,CAAC,MAC5B,EAAE,MAAM,YAAY,CAAC,CAAC,SAAS,CAAC,KAAK;IAG1C,OAAO;GACT,CAAC,CACH;EACF,CAAC;CACH;CAEA,aAA2B;EACzB,KAAK,WAAW,iBAAiB,qBAAqB;EACtD,IAAI,CAAC,KAAK,eAAe,CAAC,KAAK,SAAS,SAAS,KAAK,WAAW,GAC/D,KAAK,cAAc,KAAK,SAAS,MAAM,iBAAiB,eAAe;CAE3E;CAEA,gBAAqD;EACnD,MAAM,MAAM,uBAAuB,KAAK,eAAe,iBAAiB,eAAe,CAAC;EACxF,IAAI,CAAC,IAAI,WAAW,OAAO,CAAC,QAAQ,MAAM;EAC1C,OAAO,CAAC,QAAQ,GAAG,IAAI,MAAM;CAC/B;CAEA,cAA8B;EAC5B,OAAO,KAAK,eAAe,SAAS,QAAQ,KAAK,gBAAgB,SAAS,KAAK;CACjF;CAEA,cAA8B;EAC5B,IAAI,KAAK,eAAe,QAAQ,OAAO,UAAU,WAAW,KAAK,WAAW;EAC5E,IAAI,CAAC,KAAK,SAAS,QAAQ,OAAO;EAClC,OAAO,gBAAgB,KAAK,eAAe,KAAK,SAAS,EAAG;CAC9D;CAEA,iBAAiC;EAE/B,MAAM,SAAS,CAAC,GADA,KAAK,eACD,CAAA,EAAS,WAAW,CAAC,CAAE,CAAC,CACzC,QAAQ,CAAC,CACT,MAAM,MAAM,EAAE,SAAS,eAAe,EAAE,WAAW,CAAC,EAAE;EACzD,IAAI,QAAQ,OAAO;EACnB,IAAI,KAAK,eAAe,UACtB,OAAO,KAAK,eAAe,KAAK,SAAS,MAAM,iBAAiB,eAAe;EAEjF,OAAO,KAAK,SAAS,MAAM,iBAAiB,eAAe;CAC7D;CAEA,eAAqC;EACnC,OAAO,4BAA4B,KAAK,eAAe,GAAG,KAAK,eAAe,CAAC;CACjF;CAEA,MAAc,iBAAgC;EAC5C,IAAI,CAAC,KAAK,WAAW;EACrB,MAAM,iBAAiB,eAAe,KAAK,SAAS;EACpD,KAAK,aAAa;CACpB;CAEA,eAAuB,OAAqB;EAC1C,IAAI,MAAM,WAAW,OAAO,GAAG;GAC7B,MAAM,WAAW,MAAM,MAAM,CAAC;GAC9B,IAAI,aAAa,UAAU,aAAa,aAAa,aAAa,gBAAgB;IAChF,KAAK,aAAa;IAClB,KAAK,cAAc;GACrB;GACA;EACF;EACA,IAAI,MAAM,WAAW,QAAQ,GAAG;GAC9B,MAAM,QAAQ,MAAM,MAAM,CAAC;GAC3B,IAAI,CAAC,OAAO;GACZ,KAAK,aAAa;GAClB,KAAK,cAAc;EACrB;CACF;CAEA,cAA4B;EAC1B,MAAM,SACJ,KAAK,eAAe,WAChB;GACE,MAAM;GACN,OAAO,KAAK,eAAe,iBAAiB,eAAe;GAC3D,QAAQ,KAAK;EACf,IACA;GAAE,MAAM;GAAQ,aAAa,KAAK;EAAY;EACpD,iBAAiB,eAAe,MAAM;CACxC;CAEA,MAAc,gBAA+B;EAC3C,KAAK,QAAQ;EACb,KAAK,uBAAuB,CAAC;EAC7B,MAAM,KAAK;EACX,IAAI,KAAK,UAAU,KAAK,SAAS,QAAQ;EACzC,IAAI,KAAK,WAAW,KAAK,UAAU,QAAQ;CAC7C;CAEA,qBAAkD;EAChD,OAAO,KAAK,eAAe,CAAC,EAAE,eAAe,CAAC;CAChD;CAEA,oBAA2D;EACzD,IAAI,CAAC,KAAK,qBAAqB,OAAO,KAAA;EACtC,OAAO,KAAK,mBAAmB,CAAC,CAAC,MAAM,MAAM,EAAE,OAAO,KAAK,mBAAmB;CAChF;CAEA,sBAA8B,cAA4B;EACxD,KAAK,sBAAsB;CAC7B;CAEA,yBAAuC;EACrC,KAAK,sBAAsB;CAC7B;CAEA,wBAAgC,cAA4B;EAC1D,MAAM,YAAY,KAAK,aAAa,iBAAiB,gBAAgB;EACrE,iBAAiB,iBAAiB,WAAW,YAAY;EACzD,KAAK,uBAAuB,KAAK,qBAAqB,QAAQ,OAAO,OAAO,YAAY;EACxF,IAAI,KAAK,wBAAwB,cAAc,KAAK,sBAAsB;EAC1E,KAAK,aAAa;CACpB;CAEA,MAAc,SAAS,UAA4C;EACjE,MAAM,QAAQ,CAAC,GAAG,QAAQ;EAC1B,IAAI,CAAC,MAAM,QAAQ;EAEnB,MAAM,YAAY,iBAAiB,gBAAgB,KAAK,aAAa,KAAA,CAAS;EAC9E,KAAK,YAAY;EACjB,MAAM,WAAW,KAAK,mBAAmB;EACzC,MAAM,WAA+B,CAAC;EAEtC,KAAK,MAAM,QAAQ,OAAO;GACxB,IAAI,SAAS,SAAS,SAAS,UAAA,GAA2B;IACxD,WAAW,6BAA8C;IACzD;GACF;GACA,IACE,SAAS,MAAM,MAAM,EAAE,SAAS,KAAK,QAAQ,EAAE,eAAe,KAAK,IAAI,KACvE,SAAS,MAAM,MAAM,EAAE,SAAS,KAAK,QAAQ,EAAE,eAAe,KAAK,IAAI,GAEvE;GAEF,MAAM,SAAS,MAAM,6BAA6B,IAAI;GACtD,IAAI,CAAC,OAAO,IAAI;IACd,WAAW,OAAO,KAAK;IACvB;GACF;GACA,SAAS,KAAK,OAAO,UAAU;EACjC;EAEA,MAAM,SAAS,iBAAiB,eAAe,WAAW,QAAQ;EAClE,IAAI,OAAO,QACT,KAAK,uBAAuB,CAC1B,GAAG,KAAK,sBACR,GAAG,OAAO,KAAK,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,OAAO,CAAC,KAAK,qBAAqB,SAAS,EAAE,CAAC,CACnF;EAEF,KAAK,aAAa;CACpB;CAEA,iBAA+B;EAC7B,KAAK,WAAW,MAAM;CACxB;CAEA,MAAc,kBAAkB,GAAyB;EACvD,MAAM,QAAQ,EAAE;EAChB,IAAI,MAAM,OAAO,QAAQ,MAAM,KAAK,SAAS,MAAM,KAAK;EACxD,MAAM,QAAQ;CAChB;CAEA,mBAA2B,GAAoB;EAC7C,IAAI,CAAC,EAAE,cAAc,MAAM,SAAS,OAAO,GAAG;EAC9C,EAAE,eAAe;EACjB,KAAK,WAAW;CAClB;CAEA,oBAA4B,GAAoB;EAC9C,IAAI,EAAE,kBAAkB,EAAE,QAAQ,KAAK,WAAW;CACpD;CAEA,MAAc,eAAe,GAA6B;EACxD,EAAE,eAAe;EACjB,KAAK,WAAW;EAChB,IAAI,EAAE,cAAc,OAAO,QAAQ,MAAM,KAAK,SAAS,EAAE,aAAa,KAAK;CAC7E;CAEA,MAAc,OAAsB;EAClC,MAAM,OAAO,KAAK,MAAM,KAAK;EAC7B,MAAM,gBAAgB,CAAC,GAAG,KAAK,oBAAoB;EACnD,IAAK,CAAC,QAAQ,CAAC,cAAc,UAAW,KAAK,MAAM;EACnD,KAAK,YAAY;EACjB,MAAM,KAAK,cAAc;EACzB,KAAK,OAAO;EACZ,KAAK,iBAAiB,CAAC;EACvB,IAAI;GACF,MAAM,iBAAiB,OAAO;IAC5B,WAAW,KAAK,aAAa,KAAA;IAC7B;IACA;GACF,CAAC;EACH,UAAU;GACR,KAAK,OAAO;GACZ,KAAK,aAAa;GAClB,KAAK,uBAAuB;GAC5B,KAAK,UAAU,MAAM;EACvB;CACF;CAEA,2BAAmC;EACjC,MAAM,cAAc,KAAK,mBAAmB;EAC5C,MAAM,QAAQ,YAAY;EAC1B,OAAO,IAAI;;;;;;kBAMG,QAAQ,GAAG,MAAM,aAAa,UAAU,IAAI,KAAK,QAAQ,cAAc;sBACnE,KAAK,KAAK;;;YAGpB,QAAQ,IAAI,IAAI,kBAAkB,MAAM,eAAe,QAAQ;;;;oBAIvD,MAAa,EAAE,gBAAgB,EAAE;sBAC/B,MAAa,EAAE,gBAAgB,EAAE;;YAE3C,QACE,IAAI;;oBAEE,YAAY,KACX,SAAS,IAAI;;;;;wCAKM,KAAK,KAAK;yCACT,KAAK,sBAAsB,KAAK,EAAE,EAAE;;4BAEjD,KAAK,SAAS,WAAW,KAAK,UAC5B,IAAI;;sCAEI,KAAK,QAAQ;sCACb,KAAK,KAAK;oCAElB,IAAI;;;;gCAIF;sDACsB,KAAK,KAAK;;;;;;sCAM1B,KAAK,KAAK;yCACP,KAAK,wBAAwB,KAAK,EAAE,EAAE;;;;;qBAM7D,EAAE;;kBAGN,IAAI,iEAAiE;;;;wBAI3D,KAAK,QAAQ,SAAA,EAAyB;2BACnC,KAAK,eAAe,EAAE;;;;;;;;CAQ/C;CAEA,yBAAiC;EAC/B,MAAM,UAAU,KAAK,kBAAkB;EACvC,IAAI,CAAC,SAAS,OAAO;EACrB,OAAO,IAAI;;gBAEC,QAAQ,KAAK;;;;;+BAKE,KAAK,uBAAuB,EAAE;;;YAGjD,QAAQ,SAAS,WAAW,QAAQ,UAClC,IAAI,wCAAwC,QAAQ,QAAQ,OAAO,QAAQ,KAAK,OAChF,QAAQ;YACV,QAAQ,OACN,IAAI,mCAAmC,QAAQ,KAAK,UACpD,QAAQ,SAAS,WAAW,QAAQ,UAClC,UACA,IAAI,yCAAyC;;;;;;2BAMlC,KAAK,wBAAwB,QAAQ,EAAE,EAAE;;;;oDAIhB,KAAK,uBAAuB,EAAE;;;;CAIhF;CAEA,kBAA0B,QAAgC;EACxD,IAAI,CAAC,KAAK,mBAAmB;EAC7B,iBAAiB,kBAAkB,KAAK,kBAAkB,WAAW,MAAM;EAC3E,KAAK,oBAAoB;CAC3B;CAEA,gBAA0C;EAExC,MAAM,QADU,KAAK,eACP,CAAA,EAAS,SAAS;EAChC,OAAO,IAAI;0CAC2B,MAAM,GAAG,MAAM;6EACoB,KAAK,WAAW,EAAE;;;QAGvF,KAAK,sBAAsB,EAAE;;;;;uBAKd;GACb,IAAI,CAAC,KAAK,WAAW;GACrB,iBAAiB,SAAS,WAAW,KAAK,SAAS;GACnD,KAAK,aAAa;GAClB,iBAAiB,eAAe;EAClC,EAAE;;;;QAIF,KAAK,uBAAuB,EAAE;;CAEpC;CAEA,iBAAyB,OAAsC;EAC7D,MAAM,OAAO,UAAU,aAAa,WAAW,UAAU,SAAS,YAAY;EAE9E,OAAO,CACL,iCAAiC,KAAK,eACtC,qCAAqC,KAAK,YAC5C,CAAC,CAAC,KAAK,GAAG;CACZ;CAEA,wBAAgC;EAC9B,MAAM,QAAQ,KAAK,aAAa;EAChC,MAAM,cAAc,KAAK,eAAe,CAAC,EAAE,QAAQ,UAAU,KAAK;EAClE,MAAM,eAAe,qBAAqB,MAAM,OAAO;EACvD,MAAM,QAAQ,WAAW,aAAa,KAAK,iBAAiB,MAAM,IAAI,EAAE,KAAK,iBAAiB,MAAM,KAAK,EAAE;EAC3G,MAAM,YAAY,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,SAAS,MAAM,OAAO,IAAI,IAAI,CAAC,CAAC;EAE/E,OAAO,IAAI;;;;;;;;;;;kBAWG,MAAM;;;;oBAIJ,KAAK,iBAAiB,MAAM,KAAK,EAAE;oBACnC,UAAU;oBACV,MAAM;;;;;;oBAMN,MAAa,EAAE,gBAAgB,EAAE;sBAC/B,MAAa,EAAE,gBAAgB,EAAE;;;;oBAInC,aAAa;;;cAGnB,MAAM,QAAQ,KAAK,WAAW;GAC9B,MAAM,QAAQ,MAAM,QAAQ,IAAK,OAAO,SAAS,MAAM,QAAS,MAAM;GACtE,OAAO,IAAI;;oDAE2B,OAAO,MAAM;0BACvC,mBAAmB,MAAM,EAAE;;;qCAGhB,KAAK,IAAI,OAAO,OAAO,SAAS,IAAI,KAAM,CAAC,EAAE;;;;;EAKtE,CAAC,EAAE;;;;iBAIE,iBAAiB,MAAM,IAAI,EAAE,UAAU,iBAAiB,MAAM,SAAS,EAAE;gBAC1E,iBAAiB,MAAM,KAAK,EAAE;kBAC5B,gBAAgB,MAAM,QAAQ,EAAE;;;;wBAI1B,MAAM,UAAU,aAAa,WAAW,UAAU;2BAC/C,aAAa,WAAW,WAAW;0BACpC,CAAC,cAAc,KAAK,KAAK;6BACtB,KAAK,eAAe,EAAE;;;;;;;;;CASjD;CAEA,gBAA0B;EACxB,MAAM,UAAU,KAAK,eAAe;EACpC,OAAO,IAAI;;;;;cAKD,UAAU,KAAK,iBAAiB,OAAO,IAAI,QAAQ;;;;;kCAK/B,KAAK,WAAW,cAAc,GAAG;uBAC5C,MAAiB,KAAK,mBAAmB,CAAC,EAAE;wBAC3C,MAAiB,KAAK,oBAAoB,CAAC,EAAE;mBAClD,MAAiB,KAAK,KAAK,eAAe,CAAC,EAAE;;;;;;qBAM3C,uBAAuB;;uBAErB,MAAa,KAAK,KAAK,kBAAkB,CAAC,EAAE;;;;;;;;;yBAS1C,KAAK,MAAM;4BACR,KAAK,KAAK;0BACZ,MAAa;GACrB,KAAK,QAAS,EAAE,OAA+B;EACjD,EAAE;4BACU,MAAqB;GAC/B,IAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;IACpC,EAAE,eAAe;IACjB,KAAU,KAAK;GACjB;EACF,EAAE;;;kBAGA,KAAK,yBAAyB,EAAE;kBAChC,KAAK,sBAAsB,EAAE;;;;;UAKrC,KAAK,uBAAuB,EAAE;;;CAGtC;CAEA,iBAAyB,SAA2B;EAClD,MAAM,gBAAgB,KAAK,eAAe,SAAS;EACnD,MAAM,iBACJ,KAAK,qBAAqB,KAAK,kBAAkB,cAAc,QAAQ;EAEzE,OAAO,IAAI;QACP,QAAQ,QAAQ,KAAK,MAAM,KAAK,cAAc,CAAC,CAAC,EAAE;QAClD,gBACE,KAAK,uBACH;GACE,IAAI;GACJ,MAAM;GACN,OAAO,KAAK;GACZ,WAAW,KAAK,IAAI;EACtB,GACA,EAAE,WAAW,KAAK,CACpB,IACA,QAAQ;QACV,iBACE,IAAI;;;iCAGmB,KAAK,kBAAmB,SAAS;kCAChC,KAAK,UAAU,KAAK,kBAAmB,MAAM,MAAM,CAAC,EAAE;;qEAEnB,KAAK,kBAAkB,OAAO,EAAE;;;;;;;;iCAQpE,KAAK,kBAAkB,MAAM,EAAE;;;;;;;cAQtD,QAAQ;;CAEhB;CAEA,wBAAgC;EAE9B,MAAM,SAAS,uBADD,KAAK,gBACmB,CAAK;EAE3C,OAAO,IAAI;;;;;;gBAMC,KAAK,YAAY;+BACF;GACrB,KAAK,cAAc;EACrB,EAAE;+BACqB;GACrB,KAAK,cAAc;GACnB,KAAK,eAAe;EACtB,EAAE;;;;;;;;oBAQU,MAAa;GACrB,EAAE,gBAAgB;GAClB,KAAK,cAAc,CAAC,KAAK;EAC3B,EAAE;;;;;;;oBAOQ,MAAa,EAAE,gBAAgB,EAAE;sBAC/B,MAAa,EAAE,gBAAgB,EAAE;;;;;;qBAMlC,KAAK,aAAa;sBACjB,MAAa;GACrB,KAAK,eAAgB,EAAE,OAA4B;EACrD,EAAE;;;;;;UAMJ,OAAO,SACL,OAAO,KACJ,UAAU,IAAI;sBACP,MAAM,MAAM;kBAChB,MAAM,SAAS,KACd,MAAM,IAAI;qDACwB,KAAK,YAAY,EAAE,EAAE,EAAE;;;+BAG7C,EAAE,OAAO,KAAK,YAAY,UAAU,UAAU;;+DAEd,EAAE,MAAM,GAAG,EAAE,MAAM;;0DAExB,aAAa,EAAE,SAAS,EAAE;;;;;oCAKhD,MAAa;GACrB,EAAE,gBAAgB;GAClB,KAAK,cAAc,EAAE,EAAE;EACzB,EAAE;;;;;;mBAOZ,EAAE;eAEN,IACA,IAAI,8BAA8B,KAAK,eAAe,sBAAsB,eAAe,QAAQ;;;CAG7G;CAEA,iBAAyB,OAAqB;EAC5C,IAAI,UAAU,YAAY;GACxB,KAAU,eAAe,0BAA0B,CAAC,CAAC;GACrD;EACF;EACA,IAAI,MAAM,WAAW,WAAW,GAAG;GACjC,MAAM,OAAO,MAAM,MAAM,CAAkB;GAC3C,IAAI,SAAS,YAAY,SAAS,eAAe,SAAS,YAAY;IACpE,KAAK,eAAe;IACpB,iBAAiB,gBAAgB,IAAI;GACvC;GACA;EACF;EACA,IAAI,MAAM,WAAW,SAAS,GAAG;GAC/B,KAAK,eAAgB,MAAM,MAAM,CAAC,KAA8B;GAChE;EACF;EACA,KAAK,eAAe,KAAK;CAC3B;CAEA,yBAAiC;EAC/B,MAAM,WAAW,KAAK,YAAY;EAClC,MAAM,cAAc;GAClB;IAAE,OAAO;IAAa,OAAO;GAAc;GAC3C;IAAE,OAAO;IAAgB,OAAO;GAAiB;GACjD;IAAE,OAAO;IAAqB,OAAO;GAAsB;EAC7D;EACA,MAAM,gBAAgB,KAAK,cAAc;EAEzC,OAAO,IAAI;;;;;;sBAMO,MAAkD;GAC9D,MAAM,QAAQ,EAAE,QAAQ,MAAM;GAC9B,IAAI,SAAS,MAAM,KAAK,iBAAiB,KAAK;EAChD,EAAE;;;;;;;kBAOQ,QAAQ,KAAK,YAAY,IAAI;;;;;;UAMrC,YAAY,KACX,WAAW,IAAI;;sBAEJ,OAAO,MAAM;;yBAEV,OAAO,UAAU,SAAS;;gBAEnC,OAAO,MAAM;;WAGrB,EAAE;;;;UAIA,KAAK,SAAS,SACZ,KAAK,SAAS,KACX,OAAO,IAAI;;0BAEA,SAAS,KAAK;;6BAEX,aAAa,SAAS,KAAK;;oBAEpC,GAAG;;eAGX,IACA,IAAI,qEAAqE;;UAE3E,KAAK,eAAe,WAClB,IAAI;;;gBAGA,cAAc,KACb,UAAU,IAAI;;4BAEH,UAAU,QAAQ;;+BAEf,KAAK,iBAAiB,MAAM;;sBAErC,MAAM;;iBAGd,EAAE;gBAEJ,QAAQ;;;;UAIVA,mBAAiB,KAChB,WAAW,IAAI;;sBAEJ,YAAY,OAAO,QAAQ;;yBAExB,KAAK,iBAAiB,OAAO,MAAM;;gBAE5C,OAAO,MAAM;;WAGrB,EAAE;;;;;;;;;CASR;CAEA,yBAAiC,QAAoC;EACnE,OAAO,KAAK,eAAe,CAAC,EAAE,aAAa,MAAM,MAAM,EAAE,OAAO,MAAM,CAAC,EAAE;CAC3E;CAEA,cAAsB,SAAsB;EAC1C,IAAI,QAAQ,SAAS,QAAQ;GAC3B,MAAM,QAAQ,QAAQ,MAAM,QAAQ,MAAmD,EAAE,SAAS,MAAM;GACxG,MAAM,QAAQ,QAAQ,MAAM,QAAQ,MAAM,EAAE,SAAS,MAAM;GAC3D,OAAO,IAAI;;YAEL,MAAM,SACJ,IAAI;;oBAEE,MAAM,KAAK,SAAS;IACpB,MAAM,UACJ,KAAK,SAAS,UAAU,KAAK,yBAAyB,KAAK,EAAE,IAAI,KAAA;IACnE,OAAO,UACH,IAAI;;gCAEI,QAAQ;gCACR,KAAK,KAAK;kCACR,GAAG,KAAK,KAAK,IAAI,KAAK,GAAG,GAAG;8BAEtC,IAAI;;;;oCAIQ,GAAG,KAAK,QAAQ,KAAK,KAAK,IAAI,KAAK,GAAG,GAAG;;yDAEpB,KAAK,SAAS,UAAU,UAAU,OAAO;8BACpE,KAAK,KAAK;;;GAGtB,CAAC,EAAE;;kBAGP,QAAQ;YACV,MAAM,KAAK,MAAM,KAAK,eAAe,CAAC,CAAC,EAAE;YACzC,KAAK,kBAAkB,OAAO,EAAE;;;EAGxC;EACA,OAAO,KAAK,uBAAuB,OAAO;CAC5C;CAEA,uBAA+B,SAAsB,OAAgC,CAAC,GAAG;EACvF,MAAM,YAAY,QAAQ,MAAM,QAAQ,MAAM,EAAE,SAAS,MAAM;EAC/D,MAAM,YAAY,QAAQ,MAAM,QAAQ,MAAM,EAAE,SAAS,MAAM;EAC/D,MAAM,OACJ,KAAK,cAAc,QACnB,UAAU,MAAM,OAAO,EAAE,SAAS,eAAe,EAAE,SAAS,WAAW,EAAE,WAAW,WAAW;EAEjG,MAAM,UAAU,IAAI;;UAEd,KAAK,YACH,IAAI;;;;;gBAMJ,QAAQ;UACV,UAAU,SACR,UAAU,KAAK,MAAM,KAAK,eAAe,CAAC,CAAC,IAC3C,IAAI,uBAAuB,iBAAiB,SAAS,EAAE,QAAQ;;;EAIvE,IAAI,CAAC,UAAU,QACb,OAAO,IAAI;;YAEL,KAAK,YACH,IAAI;;;;;kBAMJ,QAAQ;YACV,UAAU,KAAK,MAAM,KAAK,eAAe,CAAC,CAAC,EAAE;YAC7C,QAAQ,OAAO,cAAc,KAAK,kBAAkB,OAAO,IAAI,QAAQ;;;EAK/E,OAAO,IAAI;;mEAEoD,KAAK;YAC5D,QAAQ;kCACc,UAAU,KAAK,MAAM,KAAK,oBAAoB,CAAC,CAAC,EAAE;;UAE1E,QAAQ,OAAO,cAAc,KAAK,kBAAkB,OAAO,IAAI,QAAQ;;;CAG/E;CAEA,kBAA0B,SAAsB;EAC9C,MAAM,YAAY,kBAAkB,QAAQ,SAAS;EACrD,OAAO,IAAI;;uDAEwC,IAAI,KAAK,QAAQ,SAAS,CAAC,CAAC,eAAe,EAAE;YACxF,UAAU;;UAEZ,QAAQ,cACN,IAAI,0CAA0C,QAAQ,YAAY,aAClE,QAAQ;UACV,QAAQ,SACN,IAAI,0CAA0C,QAAQ,OAAO,aAC7D,QAAQ;;;CAGlB;CAEA,eAAuB,MAAmB;EACxC,IAAI,KAAK,SAAS,QAAQ,OAAO,IAAI,uBAAuB,KAAK,KAAK;EACtE,OAAO;CACT;CAEA,oBAA4B,MAAmB;EAC7C,IAAI,KAAK,SAAS,aAChB,OAAO,IAAI;;;gCAGe,KAAK,KAAK;;;EAItC,IAAI,KAAK,SAAS,QAAQ;GACxB,MAAM,UAAU,GAAG,KAAK,KAAK,KAAK,KAAK,SAAS,KAAK,cAAc,OAAO,MAAM,KAAK,WAAW,MAAM;GACtG,OAAO,IAAI;;sCAEqB,QAAQ;8BAChB,KAAK,UAAU;IAAE,MAAM,KAAK;IAAM,QAAQ,KAAK;GAAO,GAAG,MAAM,CAAC,EAAE;;;EAG5F;EACA,IAAI,KAAK,SAAS,QAChB,OAAO,IAAI,mCAAmC,KAAK,MAAM,KAAK,KAAK,OAAO;EAE5E,OAAO;CACT;AACF;AAhgCG,UAAA,CAAA,MAAM,aAAa,CAAA,GAAA,mBAAA,WAAA,YAAA,KAAA,CAAA;AACnB,UAAA,CAAA,MAAM,oBAAoB,CAAA,GAAA,mBAAA,WAAA,aAAA,KAAA,CAAA;AAE1B,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,YAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,aAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,SAAA,KAAA,CAAA;AAEN,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,wBAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,YAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,uBAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,QAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,qBAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,cAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,eAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,eAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,gBAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,gBAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,YAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,kBAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,eAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,gBAAA,KAAA,CAAA;AAxeR,qBAAA,UAAA,CAAA,cAAc,sBAAsB,CAAA,GAAA,kBAAA;AAs9CrC,IAAMA,qBAAsE;CAC1E;EAAE,OAAO;EAAU,OAAO;CAAS;CACnC;EAAE,OAAO;EAAa,OAAO;CAA4B;CACzD;EAAE,OAAO;EAAY,OAAO;CAAc;AAC5C;AAEA,SAAS,WAAW,OAAuB;CACzC,OAAO,QAAQ,MAAM,EAAE,CAAE,YAAY,IAAI,MAAM,MAAM,CAAC,IAAI;AAC5D;AAEA,SAAS,iBAAiB,OAA8B;CACtD,MAAM,QAAQ,MAAM,QAAQ,MAAmD,EAAE,SAAS,MAAM;CAChG,MAAM,YAAY,MAAM,MAAM,MAAM,EAAE,SAAS,WAAW;CAC1D,MAAM,QAAQ,MAAM,QAAQ,MAAmD,EAAE,SAAS,MAAM;CAEhG,MAAM,OAAiB,CAAC;CACxB,IAAI,MAAM,QACR,KAAK,KACH,MACG,KAAK,MAAM,GAAG,EAAE,KAAK,KAAK,EAAE,SAAS,EAAE,cAAc,OAAO,MAAM,EAAE,WAAW,MAAM,IAAI,CAAC,CAC1F,KAAK,IAAI,CACd;CAEF,IAAI,WAAW,KAAK,KAAK,UAAU;CACnC,IAAI,MAAM,QAAQ,KAAK,KAAK,GAAG,MAAM,OAAO,OAAO,MAAM,WAAW,IAAI,KAAK,KAAK;CAClF,OAAO,KAAK,KAAK,KAAK,KAAK;AAC7B;AAEA,SAAS,WAAW,IAAoB;CACtC,MAAM,IAAI,IAAI,KAAK,EAAE;CACrB,EAAE,SAAS,GAAG,GAAG,GAAG,CAAC;CACrB,OAAO,EAAE,QAAQ;AACnB;AAEA,SAAS,uBAAuB,UAAsF;CAEpH,MAAM,QAAQ,WADF,KAAK,IACQ,CAAG;CAC5B,MAAM,YAAY,QAAQ;CAC1B,MAAM,OAAO,QAAQ;CACrB,MAAM,UAAgF;EACpF,OAAO,CAAC;EACR,WAAW,CAAC;EACZ,MAAM,CAAC;EACP,OAAO,CAAC;CACV;CAEA,KAAK,MAAM,KAAK,UAAU;EACxB,MAAM,MAAM,WAAW,EAAE,SAAS;EAClC,IAAI,OAAO,OAAO,QAAQ,MAAM,KAAK,CAAC;OACjC,IAAI,OAAO,WAAW,QAAQ,UAAU,KAAK,CAAC;OAC9C,IAAI,OAAO,MAAM,QAAQ,KAAK,KAAK,CAAC;OACpC,QAAQ,MAAM,KAAK,CAAC;CAC3B;CAEA,OACE;EACE;GAAE,OAAO;GAAS,UAAU,QAAQ;EAAM;EAC1C;GAAE,OAAO;GAAa,UAAU,QAAQ;EAAU;EAClD;GAAE,OAAO;GAAmB,UAAU,QAAQ;EAAK;EACnD;GAAE,OAAO;GAAS,UAAU,QAAQ;EAAM;CAC5C,CAAC,CACD,QAAQ,MAAM,EAAE,SAAS,SAAS,CAAC;AACvC;AAEA,SAAS,aAAa,IAAoB;CACxC,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,EAAE;CACzC,MAAM,OAAO,KAAK,MAAM,QAAQ,GAAM;CACtC,IAAI,OAAO,GAAG,OAAO;CACrB,IAAI,OAAO,IAAI,OAAO,GAAG,KAAK;CAC9B,MAAM,QAAQ,KAAK,MAAM,OAAO,EAAE;CAClC,IAAI,QAAQ,IAAI,OAAO,GAAG,MAAM;CAChC,MAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;CAClC,IAAI,OAAO,GAAG,OAAO,GAAG,KAAK;CAC7B,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,mBAAmB,KAAA,GAAW;EAAE,OAAO;EAAS,KAAK;CAAU,CAAC;AACtF;AAEA,SAAS,kBAAkB,IAAoB;CAC7C,MAAM,OAAO,IAAI,KAAK,EAAE;CACxB,MAAM,sBAAM,IAAI,KAAK;CACrB,MAAM,UACJ,KAAK,YAAY,MAAM,IAAI,YAAY,KACvC,KAAK,SAAS,MAAM,IAAI,SAAS,KACjC,KAAK,QAAQ,MAAM,IAAI,QAAQ;CACjC,MAAM,OAAO,KAAK,mBAAmB,KAAA,GAAW;EAAE,MAAM;EAAW,QAAQ;CAAU,CAAC;CACtF,IAAI,SAAS,OAAO;CACpB,OAAO,GAAG,KAAK,mBAAmB,KAAA,GAAW;EAAE,OAAO;EAAS,KAAK;CAAU,CAAC,EAAE,GAAG;AACtF;AAEA,SAAS,gBAAgB,UAA0B;CACjD,MAAM,QAAQ,SAAS,QAAQ,GAAG;CAClC,OAAO,UAAU,KAAK,WAAW,SAAS,MAAM,QAAQ,CAAC;AAC3D;AAEA,SAAS,UAAU,OAAsB,MAAkC;CACzE,MAAM,OAAO,CAAC,GAAG,KAAK;CACtB,MAAM,OAAO,KAAK,KAAK,SAAS;CAChC,IAAI,KAAK,SAAS,UAAU,MAAM,SAAS,QAAQ;EACjD,KAAK,KAAK,SAAS,KAAK;GAAE,GAAG;GAAM,MAAM,KAAK,OAAO,KAAK;EAAK;EAC/D,OAAO;CACT;CACA,IAAI,KAAK,SAAS,eAAe,MAAM,SAAS,aAAa;EAC3D,KAAK,KAAK,SAAS,KAAK;GAAE,GAAG;GAAM,MAAM,KAAK,OAAO,KAAK;GAAM,QAAQ,KAAK;EAAO;EACpF,OAAO;CACT;CACA,IAAI,KAAK,SAAS,UAAU,MAAM,SAAS,UAAU,KAAK,OAAO,KAAK,IAAI;EACxE,KAAK,KAAK,SAAS,KAAK;EACxB,OAAO;CACT;CACA,KAAK,KAAK,IAAI;CACd,OAAO;AACT;;;AC9lDA,IAAM,mBAAoF;CACxF;EAAE,OAAO;EAAU,OAAO;EAAU,MAAM;CAAoC;CAC9E;EACE,OAAO;EACP,OAAO;EACP,MAAM;CACR;CACA;EAAE,OAAO;EAAY,OAAO;EAAe,MAAM;CAAgC;AACnF;AAGO,IAAM,+BAAN,MAAM,qCAAqC,UAAU;;;EAGX,KAAA,WAAA,yBAAyB;EACtB,KAAA,eAAA;EACoB,KAAA,kBAAA,CAAC;EACb,KAAA,gBAAA,CAAC;EACJ,KAAA,cAAA,CAAC;EAEpB,KAAA,SAAA,CAAC;EACV,KAAA,mCAAA,IAAI,IAA6B;EACtC,KAAA,8BAAA,IAAI,IAA2C;EAC3C,KAAA,kCAAA,IAAI,IAAY;;CAE1C,WAA2B;EACzB,iBAAiB,MAAM;EACvB,KAAK,gBAAgB;EACrB,KAAK,OAAO,KACV,iBAAiB,OAAO,UAAU,MAAM,wBAAwB;GAC9D,IAAI,CAAC,KAAK,QAAQ,GAAG,KAAK,gBAAgB;EAC5C,CAAC,GACD,iBAAiB,OAAO,UAAU,MAAM,sBAAsB,SAAS;GACrE,KAAK,eAAe;EACtB,CAAC,CACH;CACF;CAEA,uBAA6B;EAC3B,KAAK,MAAM,SAAS,KAAK,QAAQ,MAAM;EACvC,KAAK,SAAS,CAAC;EACf,KAAK,MAAM,SAAS,KAAK,YAAY,OAAO,GAAG,aAAa,KAAK;EACjE,KAAK,YAAY,MAAM;EACvB,KAAK,MAAM,cAAc,KAAK,iBAAiB,OAAO,GAAG,WAAW,MAAM;EAC1E,KAAK,iBAAiB,MAAM;EAC5B,MAAM,qBAAqB;CAC7B;CAEA,kBAAgC;EAC9B,KAAK,WAAW,iBAAiB,qBAAqB;EACtD,KAAK,eAAe,iBAAiB,gBAAgB;EACrD,KAAK,kBAAkB,CAAC;EACxB,KAAK,gBAAgB,CAAC;EACtB,KAAK,cAAc,CAAC;EACpB,KAAK,gBAAgB,MAAM;EAC3B,KAAK,UAAU,KAAK;EACpB,KAAK,SAAS,UAAU,SAAS,UAAU,UAAU;GACnD,IAAI,SAAS,OAAO,KAAK,KAAK,SAAS,QAAQ,KAAK,GAClD,KAAU,YAAY,OAAO,EAAE,MAAM,KAAK,CAAC;EAE/C,CAAC;CACH;CAEA,gBAAwB,MAA8B;EACpD,KAAK,eAAe;EACpB,iBAAiB,gBAAgB,IAAI;CACvC;CAEA,MAAc,MAA+B;EAC3C,KAAK,WAAW;EAChB,KAAK,UAAU,IAAI;CACrB;CAEA,eAAuB,OAAe,OAAsC;EAC1E,MAAM,OAAO,KAAK,SAAS,UAAU;EACrC,MAAM,YAAY,KAAK,SAAS,UAAU,KAAK,GAAG,MAAO,MAAM,QAAQ;GAAE,GAAG;GAAG,GAAG;EAAM,IAAI,CAAE;EAC9F,IAAI,oBAAoB,KAAK,SAAS;EACtC,IAAI,MAAM,MAAM,MAAM,OAAO,mBAC3B,oBAAoB,MAAM;EAE5B,KAAK,MAAM;GAAE,GAAG,KAAK;GAAU;GAAmB;EAAU,CAAC;EAE7D,IAAI,MAAM,WAAW,KAAA,KAAa,MAAM,YAAY,KAAA,GAAW;GAC7D,MAAM,OAAO,UAAU;GACvB,IAAI,MAAM,OAAO,KAAK,KAAK,KAAK,QAAQ,KAAK,GAC3C,KAAK,oBAAoB,KAAK;QACzB,IAAI,CAAC,MAAM,OAAO,KAAK,GAC5B,KAAK,YAAY,KAAK;EAE1B;CACF;CAEA,YAAoB,OAAqB;EACvC,KAAK,YAAY,IAAI,KAAK,KAAK,aAAa,KAAK,YAAY,IAAI,KAAK,CAAE;EACxE,KAAK,YAAY,OAAO,KAAK;EAC7B,KAAK,iBAAiB,IAAI,KAAK,CAAC,EAAE,MAAM;EACxC,KAAK,iBAAiB,OAAO,KAAK;EAClC,MAAM,GAAG,QAAQ,IAAI,GAAG,cAAc,KAAK;EAC3C,MAAM,GAAG,QAAQ,IAAI,GAAG,YAAY,KAAK;EACzC,MAAM,GAAG,QAAQ,IAAI,GAAG,WAAW,KAAK;EACxC,KAAK,kBAAkB;EACvB,KAAK,gBAAgB;EACrB,KAAK,cAAc;CACrB;CAEA,oBAA4B,OAAqB;EAC/C,MAAM,WAAW,KAAK,YAAY,IAAI,KAAK;EAC3C,IAAI,UAAU,aAAa,QAAQ;EACnC,KAAK,YAAY,IACf,OACA,iBAAiB;GACf,KAAK,YAAY,OAAO,KAAK;GAC7B,KAAU,YAAY,OAAO,EAAE,MAAM,KAAK,CAAC;EAC7C,GAAG,GAAG,CACR;CACF;CAEA,MAAc,YAAY,OAAe,OAA2B,CAAC,GAAkB;EACrF,MAAM,WAAW,KAAK,SAAS,UAAU;EACzC,IAAI,CAAC,UAAU,QAAQ,KAAK,GAAG;GAC7B,WAAW,uCAAuC;GAClD;EACF;EACA,IAAI,KAAK,QAAQ,CAAC,SAAS,OAAO,KAAK,GAAG;EAE1C,MAAM,cAAc,GAAG,SAAS,QAAQ,GAAG,SAAS;EACpD,IAAI,KAAK,QAAQ,KAAK,gBAAgB,IAAI,WAAW,KAAK,KAAK,gBAAgB,MAAM,EAAE,QACrF;EAGF,KAAK,iBAAiB,IAAI,KAAK,CAAC,EAAE,MAAM;EACxC,MAAM,aAAa,IAAI,gBAAgB;EACvC,KAAK,iBAAiB,IAAI,OAAO,UAAU;EAC3C,KAAK,gBAAgB;GAAE,GAAG,KAAK;IAAgB,QAAQ;EAAK;EAC5D,KAAK,cAAc;GAAE,GAAG,KAAK;IAAc,QAAQ;EAAG;EAEtD,IAAI;GACF,MAAM,SAAS,MAAM,4BACnB,SAAS,SACT,SAAS,UAAU,KAAA,GACnB,WAAW,MACb;GACA,IAAI,WAAW,OAAO,SAAS;GAC/B,KAAK,kBAAkB;IAAE,GAAG,KAAK;KAAkB,QAAQ;GAAO;GAClE,KAAK,gBAAgB,IAAI,WAAW;GACpC,IAAI,CAAC,KAAK,MAAM,UAAU,UAAU,OAAO,OAAO,QAAQ;EAC5D,SAAS,KAAK;GACZ,IAAI,WAAW,OAAO,SAAS;GAC/B,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;GAC/D,KAAK,cAAc;IAAE,GAAG,KAAK;KAAc,QAAQ;GAAQ;GAC3D,KAAK,kBAAkB;IAAE,GAAG,KAAK;KAAkB,QAAQ,CAAC;GAAE;GAC9D,IAAI,CAAC,KAAK,MAAM,WAAW,OAAO;EACpC,UAAU;GACR,IAAI,KAAK,iBAAiB,IAAI,KAAK,MAAM,YAAY;IACnD,KAAK,iBAAiB,OAAO,KAAK;IAClC,KAAK,gBAAgB;KAAE,GAAG,KAAK;MAAgB,QAAQ;IAAM;GAC/D;EACF;CACF;CAEA,eAAuB,OAAe,GAAgB;EAEpD,MAAM,QADS,EAAE,OACI;EACrB,MAAM,WAAW,MAAM,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC,KAAK,IAAI,CAAC;EACnE,KAAK,eAAe,OAAO,EAAE,QAAQ,SAAS,KAAK,GAAG,EAAE,CAAC;CAC3D;CAEA,cAA4B;EAC1B,MAAM,KAAK,iBAAiB,KAAK,SAAS,SAAS;EACnD,KAAK,MAAM;GACT,GAAG,KAAK;GACR,WAAW,CACT,GAAG,KAAK,SAAS,WACjB;IAAE;IAAI,SAAS;IAAI,QAAQ;IAAI,QAAQ;IAAI,SAAS;GAAK,CAC3D;GACA,mBAAmB,KAAK,SAAS,qBAAqB;EACxD,CAAC;CACH;CAEA,MAAc,eAAe,OAA8B;EACzD,MAAM,WAAW,KAAK,SAAS,UAAU;EACzC,IAAI,CAAC,UAAU;EACf,IAAI,CAAE,MAAM,cAAc,oBAAoB,SAAS,MAAM,YAAY,GAAG,GAAI;EAChF,KAAK,YAAY,KAAK;EACtB,MAAM,YAAY,KAAK,SAAS,UAAU,QAAQ,GAAG,MAAM,MAAM,KAAK;EACtE,MAAM,oBACJ,KAAK,SAAS,sBAAsB,SAAS,KACxC,UAAU,MAAM,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KACzC,KAAK,SAAS;EACpB,KAAK,MAAM;GAAE;GAAW;EAAkB,CAAC;EAC3C,KAAK,kBAAkB,KAAK;CAC9B;;CAGA,kBAA0B,SAAuB;EAC/C,MAAM,SAAa,QAA8C;GAC/D,MAAM,OAA0B,CAAC;GACjC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,GAAG,GAAG;IAC9C,MAAM,IAAI,OAAO,GAAG;IACpB,IAAI,OAAO,MAAM,CAAC,KAAK,MAAM,SAAS;IACtC,KAAK,IAAI,UAAU,IAAI,IAAI,KAAK;GAClC;GACA,OAAO;EACT;EACA,KAAK,kBAAkB,MAAM,KAAK,eAAe;EACjD,KAAK,gBAAgB,MAAM,KAAK,aAAa;EAC7C,KAAK,cAAc,MAAM,KAAK,WAAW;CAC3C;CAEA,WAAmB,IAAkB;EACnC,KAAK,MAAM;GAAE,GAAG,KAAK;GAAU,mBAAmB;EAAG,CAAC;CACxD;CAEA,MAAe,OAAsB;EACnC,IAAI,CAAC,KAAK,QAAQ,GAAG;EACrB,IAAI;GACF,MAAM,iBAAiB,qBAAqB,KAAK,QAAQ;GACzD,KAAK,gBAAgB;GACrB,UAAU,oBAAoB;EAChC,SAAS,KAAK;GACZ,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;EAC7D;CACF;CAEA,gBAA0B;EACxB,OAAO,IAAI;iFACkE,KAAK,YAAY,EAAE;;;;;;oBAMhF,CAAC,KAAK,QAAQ,EAAE;uBACb,KAAK,KAAK,KAAK,EAAE;;;;;;CAMtC;CAEA,gBAA0B;EACxB,MAAM,OAAO,KAAK,SAAS;EAC3B,OAAO,IAAI;;;;;;;;;;;;;qBAaM,KAAK,aAAa;uBAChB,MAAa;GACtB,MAAM,QAAS,EAAE,OAA4B;GAC7C,IAAI,UAAU,YAAY,UAAU,eAAe,UAAU,YAC3D,KAAK,gBAAgB,KAAK;EAE9B,EAAE;;cAEA,iBAAiB,KAChB,WAAW,IAAI;kCACI,OAAO,MAAM;;mDAEI,OAAO,MAAM;kDACd,OAAO,KAAK;;;eAIlD,EAAE;;;;;;;;;;mFAUqE,KAAK,YAAY,EAAE;;;;;;YAM1F,KAAK,WAAW,IACd,IAAI,8FACJ,IAAI;;;;;;;;;;;;;;;wBAeM,KAAK,KAAK,UAAU,UAAU,KAAK,UAAU,UAAU,KAAK,CAAC,EAAE;;;;gBAIvE;;;;;;;;;;CAUd;CAEA,UAAkB,UAA0B,OAAe;EACzD,MAAM,YAAY,KAAK,SAAS,sBAAsB,SAAS;EAC/D,OAAO,IAAI;kBACG,YAAY,eAAe,GAAG;;;uBAGzB,SAAS,QAAQ;uBACjB,MACT,KAAK,eAAe,OAAO,EAAE,SAAU,EAAE,OAA4B,QAAQ,CAAC,EAAE;;;;;;qBAMzE,SAAS,GAAG;;sBAEX,MAAa,KAAK,eAAe,OAAO,EAAE,IAAK,EAAE,OAA4B,MAAM,CAAC,EAAE;;;;;;qBAMvF,SAAS,QAAQ;;sBAEhB,MACR,KAAK,eAAe,OAAO,EAAE,SAAU,EAAE,OAA4B,MAAM,CAAC,EAAE;;;;;;;;qBAQvE,SAAS,OAAO;;sBAEf,MACR,KAAK,eAAe,OAAO,EAAE,QAAS,EAAE,OAA4B,MAAM,CAAC,EAAE;;;cAG7E,KAAK,iBAAiB,UAAU,KAAK,EAAE;;YAEzC,YACE,IAAI,2DACJ,IAAI;;;;8BAIY,CAAC,SAAS,GAAG;iCACV,KAAK,WAAW,SAAS,EAAE,EAAE;;;;gBAI9C;;;;;;;;2BAQW,KAAK,KAAK,eAAe,KAAK,EAAE;;;;;;;CAOzD;CAEA,iBAAyB,UAA0B,OAAe;EAChE,MAAM,SAAS,QAAQ,SAAS,OAAO,KAAK,CAAC;EAC7C,MAAM,SAAS,KAAK,gBAAgB,UAAU,CAAC;EAC/C,MAAM,UAAU,QAAQ,KAAK,cAAc,MAAM;EACjD,MAAM,QAAQ,KAAK,YAAY;EAC/B,MAAM,WAAW,cAAc,SAAS,MAAM;EAG9C,IAAI,EAFe,UAAU,OAAO,SAAS,IAG3C,OAAO,IAAI;;;;qBAII,SAAS,OAAO;;sBAEf,MACR,KAAK,eAAe,OAAO,EAAE,QAAS,EAAE,OAA4B,MAAM,CAAC,EAAE;;;;;;wBAMnE,CAAC,SAAS,QAAQ,KAAK,KAAK,QAAQ;uBACrC,QAAQ;2BACJ,KAAK,KAAK,YAAY,KAAK,EAAE;;;;;;EAQpD,OAAO,IAAI;;;;;;wBAMS,UAAU,oBAAoB,gBAAgB;mBACnD,SAAS;sBACN,WAAW,OAAO,WAAW,EAAE;qBAChC,MAAa,KAAK,eAAe,OAAO,CAAC,EAAE;;YAEpD,OAAO,KACN,MAAM,IAAI,oBAAoB,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,KAAK,IAAI,EAAE,GAAG,GAAG,aACxF,EAAE;YACA,SACC,QAAQ,OAAO,CAAC,OAAO,MAAM,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAChD,KAAK,OAAO,IAAI,oBAAoB,GAAG,GAAG,GAAG,aAAa,EAAE;;;;;;sBAMnD,CAAC,SAAS,QAAQ,KAAK,KAAK,QAAQ;qBACrC,QAAQ;yBACJ,KAAK,KAAK,YAAY,KAAK,EAAE;;;;;QAK9C,QAAQ,IAAI,6BAA6B,MAAM,UAAU,GAAG;;CAElE;;EAEgB,KAAA,SAAA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsJrB;AAllBG,UAAA,CAAA,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,6BAAA,WAAA,SAAA,KAAA,CAAA;AAE7B,UAAA,CAAA,MAAM,CAAA,GAAA,6BAAA,WAAA,YAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,6BAAA,WAAA,gBAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,6BAAA,WAAA,mBAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,6BAAA,WAAA,iBAAA,KAAA,CAAA;AACN,UAAA,CAAA,MAAM,CAAA,GAAA,6BAAA,WAAA,eAAA,KAAA,CAAA;AARR,+BAAA,UAAA,CAAA,cAAc,iCAAiC,CAAA,GAAA,4BAAA;AAslBhD,SAAS,iBAAiB,UAAoC;CAC5D,MAAM,OAAO,IAAI,IAAI,SAAS,KAAK,MAAM,EAAE,EAAE,CAAC;CAC9C,IAAI,CAAC,KAAK,IAAI,UAAU,GAAG,OAAO;CAClC,IAAI,IAAI;CACR,OAAO,KAAK,IAAI,YAAY,GAAG,GAAG,KAAK;CACvC,OAAO,YAAY;AACrB;;;ACrmBA,iBAAiB,MAAM;AACvB,YAAY,IAAI,oBAAoB,gBAAgB;AAEpD,qBAAqB,qBAAqB,mBAAmB;CAC3D,MAAM;CACN,OAAO;CACP,MAAM;CACN,UAAU;CACV,YAAY,OAAe,IAAI,6BAA6B,GAAG;AACjE,CAAC;AAED,eAAe,2BAA2B;CACxC,UAAU;CACV,OAAO;CACP,SAAS;CACT,YAAY,UAAuB,MAAM,QAAQ;CACjD,QAAQ,OAAO,UAAuB;EACpC,MAAM,aAAa,OACjB,IAAI,wCAAwC,GAAG,WAAW,MAAM;EAClE,OAAO;CACT;AACF,CAAC;AAED,YAAY;CACV,SAAS;EACP,IAAI;EACJ,MAAM;EACN,aAAa;EACb,YAAY,CAAC;CACf;CACA,SAAS,EACP,eAAe;EACb,MAAM,cAAc;GAClB,OAAO;GACP,MAAM,CAAC;GACP,KAAK;GACL,MAAM;GACN,OAAO,CAAC;EACV;EACA,eAAoB,WAAW,WAAW;CAC5C,EACF;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=cognitive-extension.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cognitive-extension.d.ts","sourceRoot":"","sources":["../src/cognitive-extension.ts"],"names":[],"mappings":"AAgBA,OAAO,uBAAuB,CAAC;AAC/B,OAAO,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/i18n.de.json
|
|
2
|
+
var EXT_COGNITIVE_NAME = "Kognitive KI";
|
|
3
|
+
var EXT_COGNITIVE_DESC = "Headless kognitives Agenten-Runtime mit moderner Chat-UI";
|
|
4
|
+
var i18n_de_default = {
|
|
5
|
+
EXT_COGNITIVE_NAME,
|
|
6
|
+
EXT_COGNITIVE_DESC
|
|
7
|
+
};
|
|
8
|
+
//#endregion
|
|
9
|
+
export { EXT_COGNITIVE_DESC, EXT_COGNITIVE_NAME, i18n_de_default as default };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=i18n.de-BrLTiN56.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.de-BrLTiN56.js","names":[],"sources":["../src/i18n.de.json"],"sourcesContent":["{\n \"EXT_COGNITIVE_NAME\": \"Kognitive KI\",\n \"EXT_COGNITIVE_DESC\": \"Headless kognitives Agenten-Runtime mit moderner Chat-UI\"\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/i18n.en.json
|
|
2
|
+
var EXT_COGNITIVE_NAME = "AI System";
|
|
3
|
+
var EXT_COGNITIVE_DESC = "AI assistants, chat, and tool execution";
|
|
4
|
+
var i18n_en_default = {
|
|
5
|
+
EXT_COGNITIVE_NAME,
|
|
6
|
+
EXT_COGNITIVE_DESC
|
|
7
|
+
};
|
|
8
|
+
//#endregion
|
|
9
|
+
export { EXT_COGNITIVE_DESC, EXT_COGNITIVE_NAME, i18n_en_default as default };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=i18n.en-MkwuLlOD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.en-MkwuLlOD.js","names":[],"sources":["../src/i18n.en.json"],"sourcesContent":["{\n \"EXT_COGNITIVE_NAME\": \"AI System\",\n \"EXT_COGNITIVE_DESC\": \"AI assistants, chat, and tool execution\"\n}\n"],"mappings":""}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import { extensionRegistry } from "@eclipse-docks/core";
|
|
1
|
+
import { extensionRegistry, i18n } from "@eclipse-docks/core";
|
|
2
2
|
import pkg from "../package.json";
|
|
3
3
|
//#region src/index.ts
|
|
4
|
+
var t = await i18n(/* #__PURE__ */ Object.assign({
|
|
5
|
+
"./i18n.de.json": () => import("./i18n.de-BrLTiN56.js"),
|
|
6
|
+
"./i18n.en.json": () => import("./i18n.en-MkwuLlOD.js")
|
|
7
|
+
}), true);
|
|
4
8
|
extensionRegistry.registerExtension({
|
|
5
9
|
id: pkg.name,
|
|
6
|
-
name:
|
|
7
|
-
description:
|
|
8
|
-
loader: () => import("./
|
|
10
|
+
name: t.EXT_COGNITIVE_NAME,
|
|
11
|
+
description: t.EXT_COGNITIVE_DESC,
|
|
12
|
+
loader: () => import("./cognitive-extension-CG_d39K5.js"),
|
|
9
13
|
icon: "robot"
|
|
10
14
|
});
|
|
11
15
|
//#endregion
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { extensionRegistry } from '@eclipse-docks/core';\nimport pkg from '../package.json';\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name:
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { extensionRegistry, i18n } from '@eclipse-docks/core';\nimport pkg from '../package.json';\n\nconst t = await i18n(import.meta.glob('./i18n*.json'), true);\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: t.EXT_COGNITIVE_NAME,\n description: t.EXT_COGNITIVE_DESC,\n loader: () => import('./cognitive-extension'),\n icon: 'robot',\n});\n"],"mappings":";;;AAGA,IAAM,IAAI,MAAM,KAAK,uBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,wBAAA,OAAA;AAAA,CAAA,GAAkC,IAAI;AAE3D,kBAAkB,kBAAkB;CAClC,IAAI,IAAI;CACR,MAAM,EAAE;CACR,aAAa,EAAE;CACf,cAAc,OAAO;CACrB,MAAM;AACR,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { MessagePart, PromptAttachment, SessionAttachment } from './types';
|
|
2
|
+
import { ProviderContent } from './models/types';
|
|
3
|
+
/** Soft cap per attached text file when stored / returned by attachment_read. */
|
|
4
|
+
export declare const MAX_ATTACHMENT_CHARS = 100000;
|
|
5
|
+
/** Soft cap for visual media attachments (bytes). */
|
|
6
|
+
export declare const MAX_IMAGE_BYTES = 4000000;
|
|
7
|
+
/** Max files accepted on a single user turn. */
|
|
8
|
+
export declare const MAX_ATTACHMENTS = 8;
|
|
9
|
+
/** Default max characters returned by attachment_read for text. */
|
|
10
|
+
export declare const DEFAULT_READ_CHARS = 40000;
|
|
11
|
+
type MediaMode = 'raster' | 'svg';
|
|
12
|
+
interface MediaType {
|
|
13
|
+
mime: string;
|
|
14
|
+
mode: MediaMode;
|
|
15
|
+
/** Prefer presenting bytes to vision models on attachment_read. */
|
|
16
|
+
vision: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** File picker `accept` list for visual media + common text sources. */
|
|
19
|
+
export declare const ATTACHMENT_FILE_ACCEPT: string;
|
|
20
|
+
export declare function fileExtension(name: string): string;
|
|
21
|
+
export declare function resolveMediaType(input: {
|
|
22
|
+
name: string;
|
|
23
|
+
mime?: string;
|
|
24
|
+
}): MediaType | null;
|
|
25
|
+
export declare function isImageAttachment(part: Pick<PromptAttachment, 'kind' | 'mime' | 'dataUrl' | 'name'>): boolean;
|
|
26
|
+
export declare function isSvgAttachment(part: Pick<PromptAttachment, 'mime' | 'name' | 'text'>): boolean;
|
|
27
|
+
export declare function newAttachmentId(): string;
|
|
28
|
+
/** Persistable session entry holding the full payload (not sent in chat history). */
|
|
29
|
+
export declare function toSessionAttachment(attachment: PromptAttachment, opts?: {
|
|
30
|
+
id?: string;
|
|
31
|
+
messageId?: string;
|
|
32
|
+
}): SessionAttachment;
|
|
33
|
+
/** Lightweight history/UI reference — no payload. */
|
|
34
|
+
export declare function toFileRefPart(stored: SessionAttachment): Extract<MessagePart, {
|
|
35
|
+
type: 'file';
|
|
36
|
+
}>;
|
|
37
|
+
/** One-line catalog entry published into the user turn for the model. */
|
|
38
|
+
export declare function formatAttachmentRefForModel(part: Extract<MessagePart, {
|
|
39
|
+
type: 'file';
|
|
40
|
+
}>): string;
|
|
41
|
+
/**
|
|
42
|
+
* Build provider user content from history parts.
|
|
43
|
+
* File parts are references only — payloads stay in the session store.
|
|
44
|
+
*/
|
|
45
|
+
export declare function userContentFromParts(parts: MessagePart[]): ProviderContent;
|
|
46
|
+
export declare function attachmentMeta(stored: SessionAttachment): {
|
|
47
|
+
id: string;
|
|
48
|
+
name: string;
|
|
49
|
+
path: string | undefined;
|
|
50
|
+
mime: string | undefined;
|
|
51
|
+
kind: "text" | "image";
|
|
52
|
+
byteLength: number | undefined;
|
|
53
|
+
truncated: boolean | undefined;
|
|
54
|
+
};
|
|
55
|
+
export declare function readTextAttachment(stored: SessionAttachment, opts?: {
|
|
56
|
+
offset?: number;
|
|
57
|
+
limit?: number;
|
|
58
|
+
}): {
|
|
59
|
+
ok: true;
|
|
60
|
+
output: Record<string, unknown>;
|
|
61
|
+
} | {
|
|
62
|
+
ok: false;
|
|
63
|
+
error: string;
|
|
64
|
+
};
|
|
65
|
+
/** Marker field: specialist loop presents image bytes in a follow-up multimodal message. */
|
|
66
|
+
export declare const IMAGE_PRESENT_KEY: "_presentImage";
|
|
67
|
+
export declare function readImageAttachment(stored: SessionAttachment, opts?: {
|
|
68
|
+
offset?: number;
|
|
69
|
+
limit?: number;
|
|
70
|
+
}): {
|
|
71
|
+
ok: true;
|
|
72
|
+
output: Record<string, unknown>;
|
|
73
|
+
} | {
|
|
74
|
+
ok: false;
|
|
75
|
+
error: string;
|
|
76
|
+
};
|
|
77
|
+
export declare function stripAttachmentToolOutput(output: unknown): unknown;
|
|
78
|
+
export declare function looksBinaryText(sample: string): boolean;
|
|
79
|
+
export type ReadAttachmentResult = {
|
|
80
|
+
ok: true;
|
|
81
|
+
attachment: PromptAttachment;
|
|
82
|
+
} | {
|
|
83
|
+
ok: false;
|
|
84
|
+
error: string;
|
|
85
|
+
};
|
|
86
|
+
/** Read a browser `File` into a prompt attachment (payload kept until publish). */
|
|
87
|
+
export declare function readPromptAttachmentFromFile(file: File): Promise<ReadAttachmentResult>;
|
|
88
|
+
export {};
|
|
89
|
+
//# sourceMappingURL=attachments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../src/runtime/attachments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { ChatMessage, ModelPolicy, PermissionAction, PromptAttachment, SessionAttachment, SpecialistRole, ToolApprovalMode } from './types';
|
|
2
|
+
import { CognitiveMemory } from './memory';
|
|
3
|
+
import { ModelRouter, ProviderRegistry, ModelProvider, ProvidersSettings } from './models';
|
|
4
|
+
import { ToolBroker, PermissionHandler } from './tools';
|
|
5
|
+
import { SessionRuntime } from './session';
|
|
6
|
+
import { SystemPromptEnhancer } from './specialists';
|
|
7
|
+
import { RuntimeEvents } from './events';
|
|
8
|
+
export declare class CognitiveRuntime {
|
|
9
|
+
readonly events: RuntimeEvents;
|
|
10
|
+
readonly sessions: SessionRuntime;
|
|
11
|
+
readonly memory: CognitiveMemory;
|
|
12
|
+
readonly providers: ProviderRegistry;
|
|
13
|
+
readonly models: ModelRouter;
|
|
14
|
+
readonly tools: ToolBroker;
|
|
15
|
+
private core;
|
|
16
|
+
private policy;
|
|
17
|
+
private providersSettings;
|
|
18
|
+
private approvalMode;
|
|
19
|
+
private promptEnhancers;
|
|
20
|
+
private permissionResolvers;
|
|
21
|
+
private started;
|
|
22
|
+
private ready;
|
|
23
|
+
start(): void;
|
|
24
|
+
/** Resolves after initial provider/settings hydrate. */
|
|
25
|
+
whenReady(): Promise<void>;
|
|
26
|
+
getProvidersSettings(): ProvidersSettings;
|
|
27
|
+
/** Models available for routing (`providerId/modelId`), including external plugins. */
|
|
28
|
+
listConfiguredModels(): string[];
|
|
29
|
+
setProvidersSettings(settings: ProvidersSettings): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Register a plugin ModelProvider (e.g. WebLLM) that survives settings rebuilds.
|
|
32
|
+
* Models from listModels() are merged into the router catalog as `providerId/modelId`.
|
|
33
|
+
*/
|
|
34
|
+
registerExternalProvider(provider: ModelProvider): void;
|
|
35
|
+
unregisterExternalProvider(id: string): void;
|
|
36
|
+
/** Append instructions to the specialist system prompt (e.g. RAG guidance). */
|
|
37
|
+
addSystemPromptEnhancer(enhancer: SystemPromptEnhancer): () => void;
|
|
38
|
+
/** First catalog model for the default provider — used by Manual routing. */
|
|
39
|
+
defaultModelId(): string;
|
|
40
|
+
setModelPolicy(policy: ModelPolicy): void;
|
|
41
|
+
getModelPolicy(): ModelPolicy;
|
|
42
|
+
getApprovalMode(): ToolApprovalMode;
|
|
43
|
+
setApprovalMode(mode: ToolApprovalMode): void;
|
|
44
|
+
/** Low-level override; prefer {@link setApprovalMode} for the convenience modes. */
|
|
45
|
+
setPermissionPolicy(policy: 'ask' | 'allow' | 'deny' | PermissionHandler): void;
|
|
46
|
+
resolvePermission(requestId: string, action: PermissionAction): void;
|
|
47
|
+
/** Emit session list changes and persist them. */
|
|
48
|
+
commitSessions(): void;
|
|
49
|
+
/** Ensure a focused session exists and return its id. */
|
|
50
|
+
ensureSessionId(sessionId?: string): string;
|
|
51
|
+
/** Store attachment payloads on the session (not inlined into history until prompt). */
|
|
52
|
+
addAttachments(sessionId: string | undefined, attachments: PromptAttachment[]): SessionAttachment[];
|
|
53
|
+
/** Remove an attachment payload from the session store. */
|
|
54
|
+
removeAttachment(sessionId: string, attachmentId: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Compact a session: drop older turns, store a summary (LLM when possible),
|
|
57
|
+
* and persist. The summary is injected into later model calls.
|
|
58
|
+
*/
|
|
59
|
+
compactSession(sessionId: string, keepCount?: number, signal?: AbortSignal): Promise<{
|
|
60
|
+
didCompact: boolean;
|
|
61
|
+
}>;
|
|
62
|
+
prompt(input: {
|
|
63
|
+
sessionId?: string;
|
|
64
|
+
text: string;
|
|
65
|
+
/** New payloads to store on the session and publish as refs in this turn. */
|
|
66
|
+
attachments?: PromptAttachment[];
|
|
67
|
+
/** Already-stored session attachment ids to publish as refs in this turn. */
|
|
68
|
+
attachmentIds?: string[];
|
|
69
|
+
role?: SpecialistRole;
|
|
70
|
+
signal?: AbortSignal;
|
|
71
|
+
}): Promise<ChatMessage>;
|
|
72
|
+
private applyProvidersSettings;
|
|
73
|
+
private rebuildCatalog;
|
|
74
|
+
private requestPermission;
|
|
75
|
+
private emitSessions;
|
|
76
|
+
private hydrateAll;
|
|
77
|
+
private hydrateProviders;
|
|
78
|
+
private persistProviders;
|
|
79
|
+
private hydrate;
|
|
80
|
+
private persist;
|
|
81
|
+
}
|
|
82
|
+
export declare const cognitiveRuntime: CognitiveRuntime;
|
|
83
|
+
//# sourceMappingURL=cognitive-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cognitive-runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/cognitive-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ChatMessage } from '../types';
|
|
2
|
+
import { ModelProvider } from '../models/types';
|
|
3
|
+
export interface CompactionResult {
|
|
4
|
+
/** Summary covering dropped turns (extractive or caller-replaced). */
|
|
5
|
+
summary: string;
|
|
6
|
+
kept: ChatMessage[];
|
|
7
|
+
dropped: ChatMessage[];
|
|
8
|
+
didCompact: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** Format one message for extractive / LLM compaction input. */
|
|
11
|
+
export declare function formatMessageForCompaction(msg: ChatMessage, maxChars?: number): string;
|
|
12
|
+
/** Anchored summary compaction: keep recent messages, summarize the rest. */
|
|
13
|
+
export declare function compactHistory(history: ChatMessage[], options?: {
|
|
14
|
+
keepCount?: number;
|
|
15
|
+
previousSummary?: string;
|
|
16
|
+
}): CompactionResult;
|
|
17
|
+
export declare function buildExtractiveSummary(dropped: ChatMessage[], previousSummary?: string): string;
|
|
18
|
+
/** Ask the model to summarize dropped turns; returns null on empty/failure. */
|
|
19
|
+
export declare function summarizeDroppedHistory(input: {
|
|
20
|
+
provider: ModelProvider;
|
|
21
|
+
model: string;
|
|
22
|
+
dropped: ChatMessage[];
|
|
23
|
+
previousSummary?: string;
|
|
24
|
+
providerOptions?: Record<string, unknown>;
|
|
25
|
+
signal?: AbortSignal;
|
|
26
|
+
}): Promise<string | null>;
|
|
27
|
+
/** System message body injected ahead of live history when a summary exists. */
|
|
28
|
+
export declare function compactionContextMessage(summary: string): string;
|
|
29
|
+
//# sourceMappingURL=compaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../src/runtime/compact/compaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,UAAU,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,iBAAiB,CAAC;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;CACrB;AAOD,gEAAgE;AAChE,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,SAAM,GAAG,MAAM,CAUnF;AAsBD,6EAA6E;AAC7E,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,EAAE,EACtB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7D,gBAAgB,CAmBlB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,WAAW,EAAE,EACtB,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,CAaR;AAED,+EAA+E;AAC/E,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoCzB;AAED,gFAAgF;AAChF,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Sidebar contribution / tab panel name for the AI chat view. */
|
|
2
|
+
export declare const AI_VIEW_NAME = "cognitiveview";
|
|
3
|
+
/** EditorInput.key for the AI settings editor. */
|
|
4
|
+
export declare const AI_SETTINGS_KEY = ".system.cognitive-ai-settings";
|
|
5
|
+
/** editorRegistry editorId for the AI settings editor. */
|
|
6
|
+
export declare const AI_SETTINGS_EDITOR_ID = "system.cognitive-ai-settings-editor";
|
|
7
|
+
/** Command that opens AI settings. */
|
|
8
|
+
export declare const OPEN_AI_SETTINGS_COMMAND = "open_cognitive_ai_settings";
|
|
9
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/runtime/constants.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,eAAO,MAAM,YAAY,kBAAkB,CAAC;AAE5C,kDAAkD;AAClD,eAAO,MAAM,eAAe,kCAAkC,CAAC;AAE/D,0DAA0D;AAC1D,eAAO,MAAM,qBAAqB,wCAAwC,CAAC;AAE3E,sCAAsC;AACtC,eAAO,MAAM,wBAAwB,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ChatMessage, CognitiveSession, MessagePart } from '../types';
|
|
2
|
+
export type ContextUsageLevel = 'ok' | 'warn' | 'critical';
|
|
3
|
+
export interface ContextUsageBucket {
|
|
4
|
+
id: 'summary' | 'messages' | 'tools' | 'reasoning';
|
|
5
|
+
label: string;
|
|
6
|
+
tokens: number;
|
|
7
|
+
/** Item count for this bucket (messages, tool parts, etc.). */
|
|
8
|
+
count: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ContextUsage {
|
|
11
|
+
used: number;
|
|
12
|
+
limit: number;
|
|
13
|
+
percent: number;
|
|
14
|
+
remaining: number;
|
|
15
|
+
level: ContextUsageLevel;
|
|
16
|
+
buckets: ContextUsageBucket[];
|
|
17
|
+
modelRef: string;
|
|
18
|
+
}
|
|
19
|
+
/** Rough token estimate (~4 chars / token) with a small structural overhead. */
|
|
20
|
+
export declare function estimateTokens(text: string): number;
|
|
21
|
+
export declare function estimatePartTokens(part: MessagePart): number;
|
|
22
|
+
export declare function estimateMessageTokens(message: ChatMessage): {
|
|
23
|
+
messages: number;
|
|
24
|
+
tools: number;
|
|
25
|
+
reasoning: number;
|
|
26
|
+
toolCount: number;
|
|
27
|
+
reasoningCount: number;
|
|
28
|
+
};
|
|
29
|
+
export declare function contextUsageLevel(percent: number): ContextUsageLevel;
|
|
30
|
+
/** Estimate how much of the model context window the session currently occupies. */
|
|
31
|
+
export declare function estimateSessionContextUsage(session: CognitiveSession | undefined, modelRef: string): ContextUsage;
|
|
32
|
+
export declare function formatTokenCount(n: number): string;
|
|
33
|
+
export declare function formatContextPercent(percent: number): string;
|
|
34
|
+
export declare function formatBucketDetail(bucket: ContextUsageBucket): string;
|
|
35
|
+
//# sourceMappingURL=usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/runtime/context/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG3E,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,MAAM,GAAG,UAAU,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,CAAC;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,iBAAiB,CAAC;IACzB,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAgB5D;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB,CAkBA;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAIpE;AAED,oFAAoF;AACpF,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,gBAAgB,GAAG,SAAS,EACrC,QAAQ,EAAE,MAAM,GACf,YAAY,CAkCd;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAarE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC"}
|