@elyracode/web-ui 0.9.10 → 0.9.11

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.
Files changed (135) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/ChatPanel.d.ts +1 -1
  3. package/dist/ChatPanel.d.ts.map +1 -1
  4. package/dist/components/AgentInterface.d.ts +1 -1
  5. package/dist/components/AgentInterface.d.ts.map +1 -1
  6. package/dist/components/AgentInterface.js +1 -1
  7. package/dist/components/AgentInterface.js.map +1 -1
  8. package/dist/components/MessageEditor.d.ts +2 -2
  9. package/dist/components/MessageEditor.d.ts.map +1 -1
  10. package/dist/components/Messages.d.ts +3 -3
  11. package/dist/components/Messages.d.ts.map +1 -1
  12. package/dist/components/Messages.js.map +1 -1
  13. package/dist/components/ProviderKeyInput.js +2 -2
  14. package/dist/components/ProviderKeyInput.js.map +1 -1
  15. package/dist/components/SandboxedIframe.d.ts +1 -1
  16. package/dist/components/SandboxedIframe.d.ts.map +1 -1
  17. package/dist/components/SandboxedIframe.js +1 -1
  18. package/dist/components/SandboxedIframe.js.map +1 -1
  19. package/dist/components/message-renderer-registry.js.map +1 -1
  20. package/dist/components/sandbox/ArtifactsRuntimeProvider.d.ts +4 -3
  21. package/dist/components/sandbox/ArtifactsRuntimeProvider.d.ts.map +1 -1
  22. package/dist/components/sandbox/ArtifactsRuntimeProvider.js +31 -31
  23. package/dist/components/sandbox/ArtifactsRuntimeProvider.js.map +1 -1
  24. package/dist/components/sandbox/AttachmentsRuntimeProvider.d.ts +1 -1
  25. package/dist/components/sandbox/AttachmentsRuntimeProvider.d.ts.map +1 -1
  26. package/dist/components/sandbox/AttachmentsRuntimeProvider.js +6 -5
  27. package/dist/components/sandbox/AttachmentsRuntimeProvider.js.map +1 -1
  28. package/dist/components/sandbox/ConsoleRuntimeProvider.d.ts +3 -2
  29. package/dist/components/sandbox/ConsoleRuntimeProvider.d.ts.map +1 -1
  30. package/dist/components/sandbox/ConsoleRuntimeProvider.js +12 -11
  31. package/dist/components/sandbox/ConsoleRuntimeProvider.js.map +1 -1
  32. package/dist/components/sandbox/FileDownloadRuntimeProvider.d.ts +3 -2
  33. package/dist/components/sandbox/FileDownloadRuntimeProvider.d.ts.map +1 -1
  34. package/dist/components/sandbox/FileDownloadRuntimeProvider.js +6 -4
  35. package/dist/components/sandbox/FileDownloadRuntimeProvider.js.map +1 -1
  36. package/dist/components/sandbox/RuntimeMessageRouter.d.ts +2 -1
  37. package/dist/components/sandbox/RuntimeMessageRouter.d.ts.map +1 -1
  38. package/dist/components/sandbox/RuntimeMessageRouter.js.map +1 -1
  39. package/dist/components/sandbox/SandboxRuntimeProvider.d.ts +3 -2
  40. package/dist/components/sandbox/SandboxRuntimeProvider.d.ts.map +1 -1
  41. package/dist/components/sandbox/runtime-messages.d.ts +140 -0
  42. package/dist/components/sandbox/runtime-messages.d.ts.map +1 -0
  43. package/dist/components/sandbox/runtime-messages.js +9 -0
  44. package/dist/components/sandbox/runtime-messages.js.map +1 -0
  45. package/dist/dialogs/AttachmentOverlay.d.ts.map +1 -1
  46. package/dist/dialogs/AttachmentOverlay.js +4 -4
  47. package/dist/dialogs/AttachmentOverlay.js.map +1 -1
  48. package/dist/dialogs/ModelSelector.d.ts +3 -3
  49. package/dist/dialogs/ModelSelector.d.ts.map +1 -1
  50. package/dist/dialogs/ModelSelector.js.map +1 -1
  51. package/dist/storage/stores/custom-providers-store.d.ts +2 -2
  52. package/dist/storage/stores/custom-providers-store.d.ts.map +1 -1
  53. package/dist/storage/types.d.ts +2 -2
  54. package/dist/storage/types.d.ts.map +1 -1
  55. package/dist/tools/artifacts/DocxArtifact.js +1 -1
  56. package/dist/tools/artifacts/DocxArtifact.js.map +1 -1
  57. package/dist/tools/artifacts/ExcelArtifact.js +1 -1
  58. package/dist/tools/artifacts/ExcelArtifact.js.map +1 -1
  59. package/dist/tools/artifacts/HtmlArtifact.js.map +1 -1
  60. package/dist/tools/artifacts/PdfArtifact.d.ts.map +1 -1
  61. package/dist/tools/artifacts/PdfArtifact.js +1 -1
  62. package/dist/tools/artifacts/PdfArtifact.js.map +1 -1
  63. package/dist/tools/artifacts/artifacts-tool-renderer.d.ts.map +1 -1
  64. package/dist/tools/artifacts/artifacts-tool-renderer.js.map +1 -1
  65. package/dist/tools/artifacts/artifacts.js.map +1 -1
  66. package/dist/tools/extract-document.js +1 -1
  67. package/dist/tools/extract-document.js.map +1 -1
  68. package/dist/tools/index.d.ts +1 -1
  69. package/dist/tools/index.d.ts.map +1 -1
  70. package/dist/tools/index.js.map +1 -1
  71. package/dist/tools/javascript-repl.js.map +1 -1
  72. package/dist/tools/renderer-registry.d.ts +4 -3
  73. package/dist/tools/renderer-registry.d.ts.map +1 -1
  74. package/dist/tools/renderer-registry.js.map +1 -1
  75. package/dist/tools/renderers/BashRenderer.d.ts.map +1 -1
  76. package/dist/tools/renderers/BashRenderer.js.map +1 -1
  77. package/dist/tools/renderers/CalculateRenderer.d.ts.map +1 -1
  78. package/dist/tools/renderers/CalculateRenderer.js.map +1 -1
  79. package/dist/tools/renderers/DefaultRenderer.d.ts +1 -1
  80. package/dist/tools/renderers/DefaultRenderer.d.ts.map +1 -1
  81. package/dist/tools/renderers/DefaultRenderer.js.map +1 -1
  82. package/dist/tools/renderers/GetCurrentTimeRenderer.d.ts.map +1 -1
  83. package/dist/tools/renderers/GetCurrentTimeRenderer.js.map +1 -1
  84. package/dist/tools/types.d.ts +1 -1
  85. package/dist/tools/types.d.ts.map +1 -1
  86. package/dist/utils/attachment-utils.js +1 -1
  87. package/dist/utils/attachment-utils.js.map +1 -1
  88. package/dist/utils/format.d.ts +2 -2
  89. package/dist/utils/format.d.ts.map +1 -1
  90. package/dist/utils/format.js.map +1 -1
  91. package/dist/utils/model-discovery.d.ts +6 -6
  92. package/dist/utils/model-discovery.d.ts.map +1 -1
  93. package/dist/utils/model-discovery.js +3 -3
  94. package/dist/utils/model-discovery.js.map +1 -1
  95. package/dist/utils/proxy-utils.d.ts +1 -1
  96. package/example/package.json +1 -1
  97. package/package.json +5 -5
  98. package/src/ChatPanel.ts +1 -1
  99. package/src/components/AgentInterface.ts +5 -5
  100. package/src/components/MessageEditor.ts +2 -2
  101. package/src/components/Messages.ts +6 -6
  102. package/src/components/ProviderKeyInput.ts +3 -3
  103. package/src/components/SandboxedIframe.ts +7 -6
  104. package/src/components/message-renderer-registry.ts +1 -1
  105. package/src/components/sandbox/ArtifactsRuntimeProvider.ts +40 -44
  106. package/src/components/sandbox/AttachmentsRuntimeProvider.ts +9 -7
  107. package/src/components/sandbox/ConsoleRuntimeProvider.ts +19 -17
  108. package/src/components/sandbox/FileDownloadRuntimeProvider.ts +11 -7
  109. package/src/components/sandbox/RuntimeMessageRouter.ts +7 -8
  110. package/src/components/sandbox/SandboxRuntimeProvider.ts +4 -2
  111. package/src/components/sandbox/runtime-messages.ts +146 -0
  112. package/src/dialogs/AttachmentOverlay.ts +12 -11
  113. package/src/dialogs/CustomProviderDialog.ts +2 -2
  114. package/src/dialogs/ModelSelector.ts +11 -11
  115. package/src/storage/stores/custom-providers-store.ts +2 -2
  116. package/src/storage/types.ts +2 -2
  117. package/src/tools/artifacts/DocxArtifact.ts +2 -2
  118. package/src/tools/artifacts/ExcelArtifact.ts +3 -3
  119. package/src/tools/artifacts/HtmlArtifact.ts +1 -1
  120. package/src/tools/artifacts/PdfArtifact.ts +5 -4
  121. package/src/tools/artifacts/artifacts-tool-renderer.ts +4 -4
  122. package/src/tools/artifacts/artifacts.ts +4 -4
  123. package/src/tools/extract-document.ts +6 -6
  124. package/src/tools/index.ts +1 -1
  125. package/src/tools/javascript-repl.ts +3 -3
  126. package/src/tools/renderer-registry.ts +5 -5
  127. package/src/tools/renderers/BashRenderer.ts +3 -3
  128. package/src/tools/renderers/CalculateRenderer.ts +3 -3
  129. package/src/tools/renderers/DefaultRenderer.ts +5 -5
  130. package/src/tools/renderers/GetCurrentTimeRenderer.ts +5 -5
  131. package/src/tools/types.ts +1 -1
  132. package/src/utils/attachment-utils.ts +10 -3
  133. package/src/utils/format.ts +2 -2
  134. package/src/utils/model-discovery.ts +35 -22
  135. package/src/utils/proxy-utils.ts +1 -1
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Shared types for the sandbox runtime messaging protocol.
3
+ *
4
+ * These describe the message envelopes exchanged between the host page
5
+ * (SandboxedIframe / RuntimeMessageRouter / *RuntimeProvider classes) and the
6
+ * sandboxed execution context (iframe or user script).
7
+ */
8
+
9
+ /** Fields attached to every message routed through the runtime bridge. */
10
+ export interface RuntimeMessageEnvelope {
11
+ sandboxId?: string;
12
+ messageId?: string;
13
+ }
14
+
15
+ /** Artifact CRUD request issued from sandboxed code. */
16
+ export type ArtifactOperationMessage =
17
+ | { type: "artifact-operation"; action: "list" }
18
+ | { type: "artifact-operation"; action: "get"; filename: string }
19
+ | { type: "artifact-operation"; action: "delete"; filename: string }
20
+ | {
21
+ type: "artifact-operation";
22
+ action: "createOrUpdate";
23
+ filename: string;
24
+ content: string;
25
+ mimeType?: string;
26
+ };
27
+
28
+ /** Captured console output forwarded from sandboxed code. */
29
+ export interface ConsoleRuntimeMessage {
30
+ type: "console";
31
+ method: string;
32
+ text: string;
33
+ args?: unknown[];
34
+ }
35
+
36
+ /** A one-time downloadable file returned from sandboxed code. */
37
+ export interface FileReturnedMessage {
38
+ type: "file-returned";
39
+ fileName: string;
40
+ content: string | Uint8Array;
41
+ mimeType: string;
42
+ }
43
+
44
+ /** Successful execution lifecycle completion. */
45
+ export interface ExecutionCompleteMessage {
46
+ type: "execution-complete";
47
+ returnValue?: unknown;
48
+ }
49
+
50
+ /** Failed execution lifecycle completion. */
51
+ export interface ExecutionErrorMessage {
52
+ type: "execution-error";
53
+ error: { message: string; stack: string };
54
+ }
55
+
56
+ /** Discriminated union of all messages a provider/consumer can receive. */
57
+ export type RuntimeMessage = RuntimeMessageEnvelope &
58
+ (
59
+ | ArtifactOperationMessage
60
+ | ConsoleRuntimeMessage
61
+ | FileReturnedMessage
62
+ | ExecutionCompleteMessage
63
+ | ExecutionErrorMessage
64
+ );
65
+
66
+ /** Response sent back to sandboxed code via the bridge. */
67
+ export interface RuntimeResponse {
68
+ success?: boolean;
69
+ error?: string;
70
+ result?: unknown;
71
+ }
72
+
73
+ /**
74
+ * Shape of the resolved value of `window.sendRuntimeMessage` inside the sandbox.
75
+ * Mirrors the `runtime-response` payload posted back by the router.
76
+ */
77
+ export interface SendRuntimeMessageResponse extends RuntimeResponse, RuntimeMessageEnvelope {
78
+ type?: string;
79
+ }
80
+
81
+ /** A single attachment record injected into the sandbox via `window.attachments`. */
82
+ export interface SandboxAttachment {
83
+ id: string;
84
+ fileName: string;
85
+ mimeType: string;
86
+ size: number;
87
+ content: string;
88
+ extractedText?: string;
89
+ }
90
+
91
+ /**
92
+ * Window surface exposed inside the sandbox by the injected runtime functions.
93
+ *
94
+ * The runtime functions are stringified and injected, so this interface only
95
+ * exists to type-check the function bodies at build time; the assertions are
96
+ * erased from the emitted JavaScript.
97
+ */
98
+ export interface SandboxRuntimeWindow extends Window {
99
+ sandboxId?: string;
100
+ sendRuntimeMessage?: (message: Record<string, unknown>) => Promise<SendRuntimeMessageResponse>;
101
+ onCompleted?: (callback: (success: boolean) => void | Promise<void>) => void;
102
+ complete?: (error?: { message: string; stack: string } | null, returnValue?: unknown) => Promise<void>;
103
+ __completionCallbacks?: Array<(success: boolean) => void | Promise<void>>;
104
+ __originalConsole?: Record<"log" | "error" | "warn" | "info", (...args: unknown[]) => void>;
105
+ artifacts?: Record<string, string>;
106
+ attachments?: SandboxAttachment[];
107
+ listArtifacts?: () => Promise<string[]>;
108
+ getArtifact?: (filename: string) => Promise<unknown>;
109
+ createOrUpdateArtifact?: (filename: string, content: unknown, mimeType?: string) => Promise<void>;
110
+ deleteArtifact?: (filename: string) => Promise<void>;
111
+ listAttachments?: () => Array<{ id: string; fileName: string; mimeType: string; size: number }>;
112
+ readTextAttachment?: (attachmentId: string) => string;
113
+ readBinaryAttachment?: (attachmentId: string) => Uint8Array;
114
+ returnDownloadableFile?: (fileName: string, content: unknown, mimeType?: string) => Promise<void>;
115
+ }
116
+
117
+ /** Listener registered with `chrome.runtime.onUserScriptMessage`. */
118
+ export type UserScriptMessageListener = (
119
+ message: RuntimeMessage,
120
+ sender: unknown,
121
+ sendResponse: (response: RuntimeResponse & RuntimeMessageEnvelope) => void,
122
+ ) => boolean;
123
+
124
+ /** Minimal subset of the `chrome.runtime.onUserScriptMessage` event API. */
125
+ export interface ChromeUserScriptMessageEvent {
126
+ addListener(listener: UserScriptMessageListener): void;
127
+ removeListener(listener: UserScriptMessageListener): void;
128
+ }
129
+
130
+ /** Minimal subset of `chrome.runtime` used by the runtime router/bridge. */
131
+ export interface ChromeRuntime {
132
+ onUserScriptMessage?: ChromeUserScriptMessageEvent;
133
+ sendMessage?(message: unknown): Promise<unknown>;
134
+ getURL?(path: string): string;
135
+ }
136
+
137
+ /** Minimal subset of `chrome.tabs` used to open external URLs. */
138
+ export interface ChromeTabs {
139
+ create(createProperties: { url: string }): void;
140
+ }
141
+
142
+ /** Minimal subset of the chrome extension API surface used by the sandbox. */
143
+ export interface ChromeApi {
144
+ runtime?: ChromeRuntime;
145
+ tabs?: ChromeTabs;
146
+ }
@@ -5,6 +5,7 @@ import { renderAsync } from "docx-preview";
5
5
  import { html, LitElement } from "lit";
6
6
  import { state } from "lit/decorators.js";
7
7
  import { Download, X } from "lucide";
8
+ import type { PDFDocumentLoadingTask, PDFDocumentProxy } from "pdfjs-dist";
8
9
  import * as pdfjsLib from "pdfjs-dist";
9
10
  import * as XLSX from "xlsx";
10
11
  import type { Attachment } from "../utils/attachment-utils.js";
@@ -18,7 +19,7 @@ export class AttachmentOverlay extends LitElement {
18
19
  @state() private error: string | null = null;
19
20
 
20
21
  // Track current loading task to cancel if needed
21
- private currentLoadingTask: any = null;
22
+ private currentLoadingTask: PDFDocumentLoadingTask | null = null;
22
23
  private onCloseCallback?: () => void;
23
24
  private boundHandleKeyDown?: (e: KeyboardEvent) => void;
24
25
 
@@ -304,7 +305,7 @@ export class AttachmentOverlay extends LitElement {
304
305
  const container = this.querySelector("#pdf-container");
305
306
  if (!container || !this.attachment) return;
306
307
 
307
- let pdf: any = null;
308
+ let pdf: PDFDocumentProxy | null = null;
308
309
 
309
310
  try {
310
311
  // Convert base64 to ArrayBuffer
@@ -370,9 +371,9 @@ export class AttachmentOverlay extends LitElement {
370
371
 
371
372
  wrapper.appendChild(pageContainer);
372
373
  }
373
- } catch (error: any) {
374
+ } catch (error) {
374
375
  console.error("Error rendering PDF:", error);
375
- this.error = error?.message || i18n("Failed to load PDF");
376
+ this.error = (error instanceof Error ? error.message : undefined) || i18n("Failed to load PDF");
376
377
  } finally {
377
378
  if (pdf) {
378
379
  pdf.destroy();
@@ -475,9 +476,9 @@ export class AttachmentOverlay extends LitElement {
475
476
  }
476
477
  `;
477
478
  container.appendChild(style);
478
- } catch (error: any) {
479
+ } catch (error) {
479
480
  console.error("Error rendering DOCX:", error);
480
- this.error = error?.message || i18n("Failed to load document");
481
+ this.error = (error instanceof Error ? error.message : undefined) || i18n("Failed to load document");
481
482
  }
482
483
  }
483
484
 
@@ -550,13 +551,13 @@ export class AttachmentOverlay extends LitElement {
550
551
  const sheetName = workbook.SheetNames[0];
551
552
  wrapper.appendChild(this.renderExcelSheet(workbook.Sheets[sheetName], sheetName));
552
553
  }
553
- } catch (error: any) {
554
+ } catch (error) {
554
555
  console.error("Error rendering Excel:", error);
555
- this.error = error?.message || i18n("Failed to load spreadsheet");
556
+ this.error = (error instanceof Error ? error.message : undefined) || i18n("Failed to load spreadsheet");
556
557
  }
557
558
  }
558
559
 
559
- private renderExcelSheet(worksheet: any, sheetName: string): HTMLElement {
560
+ private renderExcelSheet(worksheet: XLSX.WorkSheet, sheetName: string): HTMLElement {
560
561
  const sheetDiv = document.createElement("div");
561
562
 
562
563
  // Generate HTML table
@@ -623,9 +624,9 @@ export class AttachmentOverlay extends LitElement {
623
624
 
624
625
  wrapper.appendChild(pre);
625
626
  container.appendChild(wrapper);
626
- } catch (error: any) {
627
+ } catch (error) {
627
628
  console.error("Error rendering extracted text:", error);
628
- this.error = error?.message || i18n("Failed to display text content");
629
+ this.error = (error instanceof Error ? error.message : undefined) || i18n("Failed to display text content");
629
630
  }
630
631
  }
631
632
  }
@@ -1,4 +1,4 @@
1
- import type { Model } from "@elyracode/ai";
1
+ import type { Api, Model } from "@elyracode/ai";
2
2
  import { i18n } from "@elyracode/mini-lit";
3
3
  import { Button } from "@elyracode/mini-lit/dist/Button.js";
4
4
  import { DialogBase } from "@elyracode/mini-lit/dist/DialogBase.js";
@@ -22,7 +22,7 @@ export class CustomProviderDialog extends DialogBase {
22
22
  @state() private apiKey = "";
23
23
  @state() private testing = false;
24
24
  @state() private testError = "";
25
- @state() private discoveredModels: Model<any>[] = [];
25
+ @state() private discoveredModels: Model<Api>[] = [];
26
26
 
27
27
  protected modalWidth = "min(800px, 90vw)";
28
28
  protected modalHeight = "min(700px, 90vh)";
@@ -1,4 +1,4 @@
1
- import { getModels, getProviders, type Model, modelsAreEqual } from "@elyracode/ai";
1
+ import { type Api, getModels, getProviders, type Model, modelsAreEqual } from "@elyracode/ai";
2
2
  import { icon } from "@elyracode/mini-lit";
3
3
  import { Badge } from "@elyracode/mini-lit/dist/Badge.js";
4
4
  import { Button } from "@elyracode/mini-lit/dist/Button.js";
@@ -48,16 +48,16 @@ function subsequenceScore(query: string, text: string): number {
48
48
 
49
49
  @customElement("agent-model-selector")
50
50
  export class ModelSelector extends DialogBase {
51
- @state() currentModel: Model<any> | null = null;
51
+ @state() currentModel: Model<Api> | null = null;
52
52
  @state() searchQuery = "";
53
53
  @state() filterThinking = false;
54
54
  @state() filterVision = false;
55
55
  @state() customProvidersLoading = false;
56
56
  @state() selectedIndex = 0;
57
57
  @state() private navigationMode: "mouse" | "keyboard" = "mouse";
58
- @state() private customProviderModels: Model<any>[] = [];
58
+ @state() private customProviderModels: Model<Api>[] = [];
59
59
 
60
- private onSelectCallback?: (model: Model<any>) => void;
60
+ private onSelectCallback?: (model: Model<Api>) => void;
61
61
  private allowedProviders?: Set<string>;
62
62
  private scrollContainerRef = createRef<HTMLDivElement>();
63
63
  private searchInputRef = createRef<HTMLInputElement>();
@@ -66,8 +66,8 @@ export class ModelSelector extends DialogBase {
66
66
  protected override modalWidth = "min(400px, 90vw)";
67
67
 
68
68
  static async open(
69
- currentModel: Model<any> | null,
70
- onSelect: (model: Model<any>) => void,
69
+ currentModel: Model<Api> | null,
70
+ onSelect: (model: Model<Api>) => void,
71
71
  allowedProviders?: string[],
72
72
  ) {
73
73
  const selector = new ModelSelector();
@@ -140,7 +140,7 @@ export class ModelSelector extends DialogBase {
140
140
 
141
141
  private async loadCustomProviders() {
142
142
  this.customProvidersLoading = true;
143
- const allCustomModels: Model<any>[] = [];
143
+ const allCustomModels: Model<Api>[] = [];
144
144
 
145
145
  try {
146
146
  const storage = getAppStorage();
@@ -191,20 +191,20 @@ export class ModelSelector extends DialogBase {
191
191
  return String(tokens);
192
192
  }
193
193
 
194
- private handleSelect(model: Model<any>) {
194
+ private handleSelect(model: Model<Api>) {
195
195
  if (model) {
196
196
  this.onSelectCallback?.(model);
197
197
  this.close();
198
198
  }
199
199
  }
200
200
 
201
- private getFilteredModels(): Array<{ provider: string; id: string; model: any }> {
201
+ private getFilteredModels(): Array<{ provider: string; id: string; model: Model<Api> }> {
202
202
  // Collect all models from known providers
203
- const allModels: Array<{ provider: string; id: string; model: any }> = [];
203
+ const allModels: Array<{ provider: string; id: string; model: Model<Api> }> = [];
204
204
  const knownProviders = getProviders();
205
205
 
206
206
  for (const provider of knownProviders) {
207
- const models = getModels(provider as any);
207
+ const models = getModels(provider);
208
208
  for (const model of models) {
209
209
  allModels.push({ provider, id: model.id, model });
210
210
  }
@@ -1,4 +1,4 @@
1
- import type { Model } from "@elyracode/ai";
1
+ import type { Api, Model } from "@elyracode/ai";
2
2
  import { Store } from "../store.js";
3
3
  import type { StoreConfig } from "../types.js";
4
4
 
@@ -19,7 +19,7 @@ export interface CustomProvider {
19
19
 
20
20
  // For manual types ONLY - models stored directly on provider
21
21
  // Auto-discovery types: models fetched on-demand, never stored
22
- models?: Model<any>[];
22
+ models?: Model<Api>[];
23
23
  }
24
24
 
25
25
  /**
@@ -1,5 +1,5 @@
1
1
  import type { AgentMessage, ThinkingLevel } from "@elyracode/agent-core";
2
- import type { Model } from "@elyracode/ai";
2
+ import type { Api, Model } from "@elyracode/ai";
3
3
 
4
4
  /**
5
5
  * Transaction interface for atomic operations across stores.
@@ -152,7 +152,7 @@ export interface SessionData {
152
152
  title: string;
153
153
 
154
154
  /** Last selected model */
155
- model: Model<any>;
155
+ model: Model<Api>;
156
156
 
157
157
  /** Last selected thinking level */
158
158
  thinkingLevel: ThinkingLevel;
@@ -180,9 +180,9 @@ export class DocxArtifact extends ArtifactElement {
180
180
  }
181
181
  `;
182
182
  container.appendChild(style);
183
- } catch (error: any) {
183
+ } catch (error) {
184
184
  console.error("Error rendering DOCX:", error);
185
- this.error = error?.message || i18n("Failed to load document");
185
+ this.error = error instanceof Error ? error.message : i18n("Failed to load document");
186
186
  }
187
187
  }
188
188
 
@@ -157,13 +157,13 @@ export class ExcelArtifact extends ArtifactElement {
157
157
  const sheetName = workbook.SheetNames[0];
158
158
  wrapper.appendChild(this.renderExcelSheet(workbook.Sheets[sheetName], sheetName));
159
159
  }
160
- } catch (error: any) {
160
+ } catch (error) {
161
161
  console.error("Error rendering Excel:", error);
162
- this.error = error?.message || i18n("Failed to load spreadsheet");
162
+ this.error = error instanceof Error ? error.message : i18n("Failed to load spreadsheet");
163
163
  }
164
164
  }
165
165
 
166
- private renderExcelSheet(worksheet: any, sheetName: string): HTMLElement {
166
+ private renderExcelSheet(worksheet: XLSX.WorkSheet, sheetName: string): HTMLElement {
167
167
  const sheetDiv = document.createElement("div");
168
168
 
169
169
  // Generate HTML table
@@ -104,7 +104,7 @@ export class HtmlArtifact extends ArtifactElement {
104
104
 
105
105
  // Create consumer for console messages
106
106
  const consumer: MessageConsumer = {
107
- handleMessage: async (message: any): Promise<void> => {
107
+ handleMessage: async (message): Promise<void> => {
108
108
  if (message.type === "console") {
109
109
  // Create new array reference for Lit reactivity
110
110
  this.logs = [
@@ -1,6 +1,7 @@
1
1
  import { DownloadButton } from "@elyracode/mini-lit/dist/DownloadButton.js";
2
2
  import { html, type TemplateResult } from "lit";
3
3
  import { customElement, property, state } from "lit/decorators.js";
4
+ import type { PDFDocumentLoadingTask, PDFDocumentProxy } from "pdfjs-dist";
4
5
  import * as pdfjsLib from "pdfjs-dist";
5
6
  import { i18n } from "../../utils/i18n.js";
6
7
  import { ArtifactElement } from "./ArtifactElement.js";
@@ -12,7 +13,7 @@ pdfjsLib.GlobalWorkerOptions.workerSrc = new URL("pdfjs-dist/build/pdf.worker.mi
12
13
  export class PdfArtifact extends ArtifactElement {
13
14
  @property({ type: String }) private _content = "";
14
15
  @state() private error: string | null = null;
15
- private currentLoadingTask: any = null;
16
+ private currentLoadingTask: PDFDocumentLoadingTask | null = null;
16
17
 
17
18
  get content(): string {
18
19
  return this._content;
@@ -106,7 +107,7 @@ export class PdfArtifact extends ArtifactElement {
106
107
  const container = this.querySelector("#pdf-container");
107
108
  if (!container || !this._content) return;
108
109
 
109
- let pdf: any = null;
110
+ let pdf: PDFDocumentProxy | null = null;
110
111
 
111
112
  try {
112
113
  const arrayBuffer = this.base64ToArrayBuffer(this._content);
@@ -164,9 +165,9 @@ export class PdfArtifact extends ArtifactElement {
164
165
 
165
166
  wrapper.appendChild(pageContainer);
166
167
  }
167
- } catch (error: any) {
168
+ } catch (error) {
168
169
  console.error("Error rendering PDF:", error);
169
- this.error = error?.message || i18n("Failed to load PDF");
170
+ this.error = error instanceof Error ? error.message : i18n("Failed to load PDF");
170
171
  } finally {
171
172
  if (pdf) {
172
173
  pdf.destroy();
@@ -1,5 +1,5 @@
1
1
  import "@elyracode/mini-lit/dist/CodeBlock.js";
2
- import type { ToolResultMessage } from "@elyracode/ai";
2
+ import type { TextContent, ToolResultMessage } from "@elyracode/ai";
3
3
  import { createRef, ref } from "lit/directives/ref.js";
4
4
  import { FileCode2 } from "lucide";
5
5
  import "../../components/ConsoleBlock.js";
@@ -12,12 +12,12 @@ import { ArtifactPill } from "./ArtifactPill.js";
12
12
  import type { ArtifactsPanel, ArtifactsParams } from "./artifacts.js";
13
13
 
14
14
  // Helper to extract text from content blocks
15
- function getTextOutput(result: ToolResultMessage<any> | undefined): string {
15
+ function getTextOutput(result: ToolResultMessage<unknown> | undefined): string {
16
16
  if (!result) return "";
17
17
  return (
18
18
  result.content
19
- ?.filter((c) => c.type === "text")
20
- .map((c: any) => c.text)
19
+ ?.filter((c): c is TextContent => c.type === "text")
20
+ .map((c) => c.text)
21
21
  .join("\n") || ""
22
22
  );
23
23
  }
@@ -311,7 +311,7 @@ export class ArtifactsPanel extends LitElement {
311
311
  // 2) Build an ordered list of successful artifact operations
312
312
  const operations: Array<ArtifactsParams> = [];
313
313
  for (const m of messages) {
314
- if ((m as any).role === "artifact") {
314
+ if (m.role === "artifact") {
315
315
  const artifactMsg = m as ArtifactMessage;
316
316
  switch (artifactMsg.action) {
317
317
  case "create":
@@ -337,8 +337,8 @@ export class ArtifactsPanel extends LitElement {
337
337
  }
338
338
  }
339
339
  // Handle tool result messages (from artifacts tool calls)
340
- else if ((m as any).role === "toolResult" && (m as any).toolName === artifactToolName && !(m as any).isError) {
341
- const toolCallId = (m as any).toolCallId as string;
340
+ else if (m.role === "toolResult" && m.toolName === artifactToolName && !m.isError) {
341
+ const toolCallId = m.toolCallId;
342
342
  const call = toolCalls.get(toolCallId);
343
343
  if (!call) continue;
344
344
  const params = call.arguments as ArtifactsParams;
@@ -431,7 +431,7 @@ export class ArtifactsPanel extends LitElement {
431
431
  return this.getLogs(params);
432
432
  default:
433
433
  // Should never happen with TypeBox validation
434
- return `Error: Unknown command ${(params as any).command}`;
434
+ return `Error: Unknown command ${(params as { command: string }).command}`;
435
435
  }
436
436
  }
437
437
 
@@ -1,5 +1,5 @@
1
1
  import type { AgentTool } from "@elyracode/agent-core";
2
- import type { ToolResultMessage } from "@elyracode/ai";
2
+ import type { TextContent, ToolResultMessage } from "@elyracode/ai";
3
3
  import { html } from "lit";
4
4
  import { createRef, ref } from "lit/directives/ref.js";
5
5
  import { FileText } from "lucide";
@@ -103,17 +103,17 @@ export function createExtractDocumentTool(): AgentTool<typeof extractDocumentSch
103
103
  try {
104
104
  // Attempt direct fetch first
105
105
  arrayBuffer = await fetchAndProcess(url);
106
- } catch (directError: any) {
106
+ } catch (directError) {
107
107
  // If CORS error and proxy is available, retry with proxy
108
108
  if (isCorsError(directError) && tool.corsProxyUrl) {
109
109
  try {
110
110
  const proxiedUrl = tool.corsProxyUrl + encodeURIComponent(url);
111
111
  arrayBuffer = await fetchAndProcess(proxiedUrl);
112
- } catch (proxyError: any) {
112
+ } catch (proxyError) {
113
113
  // Proxy fetch also failed - throw helpful message
114
114
  throw new Error(
115
115
  `TELL USER: Unable to fetch the document due to CORS restrictions.\n\n` +
116
- `Tried with proxy but it also failed: ${proxyError.message}\n\n` +
116
+ `Tried with proxy but it also failed: ${proxyError instanceof Error ? proxyError.message : String(proxyError)}\n\n` +
117
117
  `INSTRUCT USER: Please download the file manually and attach it to your message using the attachment button (paperclip icon) in the message input area. I can then extract the text from the attached file.`,
118
118
  );
119
119
  }
@@ -213,8 +213,8 @@ export const extractDocumentRenderer: ToolRenderer<ExtractDocumentParams, Extrac
213
213
 
214
214
  const output =
215
215
  result.content
216
- ?.filter((c) => c.type === "text")
217
- .map((c: any) => c.text)
216
+ ?.filter((c): c is TextContent => c.type === "text")
217
+ .map((c) => c.text)
218
218
  .join("\n") || "";
219
219
 
220
220
  return {
@@ -27,7 +27,7 @@ export function setShowJsonMode(enabled: boolean): void {
27
27
  */
28
28
  export function renderTool(
29
29
  toolName: string,
30
- params: any | undefined,
30
+ params: unknown | undefined,
31
31
  result: ToolResultMessage | undefined,
32
32
  isStreaming?: boolean,
33
33
  ): ToolRenderResult {
@@ -1,5 +1,5 @@
1
1
  import type { AgentTool } from "@elyracode/agent-core";
2
- import type { ToolResultMessage } from "@elyracode/ai";
2
+ import type { TextContent, ToolResultMessage } from "@elyracode/ai";
3
3
  import { i18n } from "@elyracode/mini-lit";
4
4
  import { html } from "lit";
5
5
  import { createRef, ref } from "lit/directives/ref.js";
@@ -214,8 +214,8 @@ export const javascriptReplRenderer: ToolRenderer<JavaScriptReplParams, JavaScri
214
214
  if (result && params) {
215
215
  const output =
216
216
  result.content
217
- ?.filter((c) => c.type === "text")
218
- .map((c: any) => c.text)
217
+ ?.filter((c): c is TextContent => c.type === "text")
218
+ .map((c) => c.text)
219
219
  .join("\n") || "";
220
220
  const files = result.details?.files || [];
221
221
 
@@ -2,7 +2,7 @@ import { icon } from "@elyracode/mini-lit";
2
2
  import { html, type TemplateResult } from "lit";
3
3
  import type { Ref } from "lit/directives/ref.js";
4
4
  import { ref } from "lit/directives/ref.js";
5
- import { ChevronsUpDown, ChevronUp, Loader } from "lucide";
5
+ import { ChevronsUpDown, ChevronUp, type IconNode, Loader } from "lucide";
6
6
  import type { ToolRenderer } from "./types.js";
7
7
 
8
8
  // Registry of tool renderers
@@ -28,10 +28,10 @@ export function getToolRenderer(toolName: string): ToolRenderer | undefined {
28
28
  */
29
29
  export function renderHeader(
30
30
  state: "inprogress" | "complete" | "error",
31
- toolIcon: any,
31
+ toolIcon: IconNode,
32
32
  text: string | TemplateResult,
33
33
  ): TemplateResult {
34
- const statusIcon = (iconComponent: any, color: string) =>
34
+ const statusIcon = (iconComponent: IconNode, color: string) =>
35
35
  html`<span class="inline-block ${color}">${icon(iconComponent, "sm")}</span>`;
36
36
 
37
37
  switch (state) {
@@ -68,13 +68,13 @@ export function renderHeader(
68
68
  */
69
69
  export function renderCollapsibleHeader(
70
70
  state: "inprogress" | "complete" | "error",
71
- toolIcon: any,
71
+ toolIcon: IconNode,
72
72
  text: string | TemplateResult,
73
73
  contentRef: Ref<HTMLElement>,
74
74
  chevronRef: Ref<HTMLElement>,
75
75
  defaultExpanded = false,
76
76
  ): TemplateResult {
77
- const statusIcon = (iconComponent: any, color: string) =>
77
+ const statusIcon = (iconComponent: IconNode, color: string) =>
78
78
  html`<span class="inline-block ${color}">${icon(iconComponent, "sm")}</span>`;
79
79
 
80
80
  const toggleContent = (e: Event) => {
@@ -1,4 +1,4 @@
1
- import type { ToolResultMessage } from "@elyracode/ai";
1
+ import type { TextContent, ToolResultMessage } from "@elyracode/ai";
2
2
  import { html } from "lit";
3
3
  import { SquareTerminal } from "lucide";
4
4
  import { i18n } from "../../utils/i18n.js";
@@ -18,8 +18,8 @@ export class BashRenderer implements ToolRenderer<BashParams, undefined> {
18
18
  if (result && params?.command) {
19
19
  const output =
20
20
  result.content
21
- ?.filter((c) => c.type === "text")
22
- .map((c: any) => c.text)
21
+ ?.filter((c): c is TextContent => c.type === "text")
22
+ .map((c) => c.text)
23
23
  .join("\n") || "";
24
24
  const combined = output ? `> ${params.command}\n\n${output}` : `> ${params.command}`;
25
25
  return {
@@ -1,4 +1,4 @@
1
- import type { ToolResultMessage } from "@elyracode/ai";
1
+ import type { TextContent, ToolResultMessage } from "@elyracode/ai";
2
2
  import { html } from "lit";
3
3
  import { Calculator } from "lucide";
4
4
  import { i18n } from "../../utils/i18n.js";
@@ -18,8 +18,8 @@ export class CalculateRenderer implements ToolRenderer<CalculateParams, undefine
18
18
  if (result && params?.expression) {
19
19
  const output =
20
20
  result.content
21
- ?.filter((c) => c.type === "text")
22
- .map((c: any) => c.text)
21
+ ?.filter((c): c is TextContent => c.type === "text")
22
+ .map((c) => c.text)
23
23
  .join("\n") || "";
24
24
 
25
25
  // Error: show expression in header, error below
@@ -1,4 +1,4 @@
1
- import type { ToolResultMessage } from "@elyracode/ai";
1
+ import type { TextContent, ToolResultMessage } from "@elyracode/ai";
2
2
  import { html } from "lit";
3
3
  import { Code } from "lucide";
4
4
  import { i18n } from "../../utils/i18n.js";
@@ -6,14 +6,14 @@ import { renderHeader } from "../renderer-registry.js";
6
6
  import type { ToolRenderer, ToolRenderResult } from "../types.js";
7
7
 
8
8
  export class DefaultRenderer implements ToolRenderer {
9
- render(params: any | undefined, result: ToolResultMessage | undefined, isStreaming?: boolean): ToolRenderResult {
9
+ render(params: unknown | undefined, result: ToolResultMessage | undefined, isStreaming?: boolean): ToolRenderResult {
10
10
  const state = result ? (result.isError ? "error" : "complete") : isStreaming ? "inprogress" : "complete";
11
11
 
12
12
  // Format params as JSON
13
13
  let paramsJson = "";
14
14
  if (params) {
15
15
  try {
16
- paramsJson = JSON.stringify(JSON.parse(params), null, 2);
16
+ paramsJson = JSON.stringify(JSON.parse(params as string), null, 2);
17
17
  } catch {
18
18
  try {
19
19
  paramsJson = JSON.stringify(params, null, 2);
@@ -27,8 +27,8 @@ export class DefaultRenderer implements ToolRenderer {
27
27
  if (result) {
28
28
  let outputJson =
29
29
  result.content
30
- ?.filter((c) => c.type === "text")
31
- .map((c: any) => c.text)
30
+ ?.filter((c): c is TextContent => c.type === "text")
31
+ .map((c) => c.text)
32
32
  .join("\n") || i18n("(no output)");
33
33
  let outputLanguage = "text";
34
34