@elyracode/web-ui 0.9.10 → 0.9.12

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 (136) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/ChatPanel.d.ts +1 -1
  3. package/dist/ChatPanel.d.ts.map +1 -1
  4. package/dist/app.css +1 -1
  5. package/dist/components/AgentInterface.d.ts +1 -1
  6. package/dist/components/AgentInterface.d.ts.map +1 -1
  7. package/dist/components/AgentInterface.js +1 -1
  8. package/dist/components/AgentInterface.js.map +1 -1
  9. package/dist/components/MessageEditor.d.ts +2 -2
  10. package/dist/components/MessageEditor.d.ts.map +1 -1
  11. package/dist/components/Messages.d.ts +3 -3
  12. package/dist/components/Messages.d.ts.map +1 -1
  13. package/dist/components/Messages.js.map +1 -1
  14. package/dist/components/ProviderKeyInput.js +2 -2
  15. package/dist/components/ProviderKeyInput.js.map +1 -1
  16. package/dist/components/SandboxedIframe.d.ts +1 -1
  17. package/dist/components/SandboxedIframe.d.ts.map +1 -1
  18. package/dist/components/SandboxedIframe.js +1 -1
  19. package/dist/components/SandboxedIframe.js.map +1 -1
  20. package/dist/components/message-renderer-registry.js.map +1 -1
  21. package/dist/components/sandbox/ArtifactsRuntimeProvider.d.ts +4 -3
  22. package/dist/components/sandbox/ArtifactsRuntimeProvider.d.ts.map +1 -1
  23. package/dist/components/sandbox/ArtifactsRuntimeProvider.js +31 -31
  24. package/dist/components/sandbox/ArtifactsRuntimeProvider.js.map +1 -1
  25. package/dist/components/sandbox/AttachmentsRuntimeProvider.d.ts +1 -1
  26. package/dist/components/sandbox/AttachmentsRuntimeProvider.d.ts.map +1 -1
  27. package/dist/components/sandbox/AttachmentsRuntimeProvider.js +6 -5
  28. package/dist/components/sandbox/AttachmentsRuntimeProvider.js.map +1 -1
  29. package/dist/components/sandbox/ConsoleRuntimeProvider.d.ts +3 -2
  30. package/dist/components/sandbox/ConsoleRuntimeProvider.d.ts.map +1 -1
  31. package/dist/components/sandbox/ConsoleRuntimeProvider.js +12 -11
  32. package/dist/components/sandbox/ConsoleRuntimeProvider.js.map +1 -1
  33. package/dist/components/sandbox/FileDownloadRuntimeProvider.d.ts +3 -2
  34. package/dist/components/sandbox/FileDownloadRuntimeProvider.d.ts.map +1 -1
  35. package/dist/components/sandbox/FileDownloadRuntimeProvider.js +6 -4
  36. package/dist/components/sandbox/FileDownloadRuntimeProvider.js.map +1 -1
  37. package/dist/components/sandbox/RuntimeMessageRouter.d.ts +2 -1
  38. package/dist/components/sandbox/RuntimeMessageRouter.d.ts.map +1 -1
  39. package/dist/components/sandbox/RuntimeMessageRouter.js.map +1 -1
  40. package/dist/components/sandbox/SandboxRuntimeProvider.d.ts +3 -2
  41. package/dist/components/sandbox/SandboxRuntimeProvider.d.ts.map +1 -1
  42. package/dist/components/sandbox/runtime-messages.d.ts +140 -0
  43. package/dist/components/sandbox/runtime-messages.d.ts.map +1 -0
  44. package/dist/components/sandbox/runtime-messages.js +9 -0
  45. package/dist/components/sandbox/runtime-messages.js.map +1 -0
  46. package/dist/dialogs/AttachmentOverlay.d.ts.map +1 -1
  47. package/dist/dialogs/AttachmentOverlay.js +4 -4
  48. package/dist/dialogs/AttachmentOverlay.js.map +1 -1
  49. package/dist/dialogs/ModelSelector.d.ts +3 -3
  50. package/dist/dialogs/ModelSelector.d.ts.map +1 -1
  51. package/dist/dialogs/ModelSelector.js.map +1 -1
  52. package/dist/storage/stores/custom-providers-store.d.ts +2 -2
  53. package/dist/storage/stores/custom-providers-store.d.ts.map +1 -1
  54. package/dist/storage/types.d.ts +2 -2
  55. package/dist/storage/types.d.ts.map +1 -1
  56. package/dist/tools/artifacts/DocxArtifact.js +1 -1
  57. package/dist/tools/artifacts/DocxArtifact.js.map +1 -1
  58. package/dist/tools/artifacts/ExcelArtifact.js +1 -1
  59. package/dist/tools/artifacts/ExcelArtifact.js.map +1 -1
  60. package/dist/tools/artifacts/HtmlArtifact.js.map +1 -1
  61. package/dist/tools/artifacts/PdfArtifact.d.ts.map +1 -1
  62. package/dist/tools/artifacts/PdfArtifact.js +1 -1
  63. package/dist/tools/artifacts/PdfArtifact.js.map +1 -1
  64. package/dist/tools/artifacts/artifacts-tool-renderer.d.ts.map +1 -1
  65. package/dist/tools/artifacts/artifacts-tool-renderer.js.map +1 -1
  66. package/dist/tools/artifacts/artifacts.js.map +1 -1
  67. package/dist/tools/extract-document.js +1 -1
  68. package/dist/tools/extract-document.js.map +1 -1
  69. package/dist/tools/index.d.ts +1 -1
  70. package/dist/tools/index.d.ts.map +1 -1
  71. package/dist/tools/index.js.map +1 -1
  72. package/dist/tools/javascript-repl.js.map +1 -1
  73. package/dist/tools/renderer-registry.d.ts +4 -3
  74. package/dist/tools/renderer-registry.d.ts.map +1 -1
  75. package/dist/tools/renderer-registry.js.map +1 -1
  76. package/dist/tools/renderers/BashRenderer.d.ts.map +1 -1
  77. package/dist/tools/renderers/BashRenderer.js.map +1 -1
  78. package/dist/tools/renderers/CalculateRenderer.d.ts.map +1 -1
  79. package/dist/tools/renderers/CalculateRenderer.js.map +1 -1
  80. package/dist/tools/renderers/DefaultRenderer.d.ts +1 -1
  81. package/dist/tools/renderers/DefaultRenderer.d.ts.map +1 -1
  82. package/dist/tools/renderers/DefaultRenderer.js.map +1 -1
  83. package/dist/tools/renderers/GetCurrentTimeRenderer.d.ts.map +1 -1
  84. package/dist/tools/renderers/GetCurrentTimeRenderer.js.map +1 -1
  85. package/dist/tools/types.d.ts +1 -1
  86. package/dist/tools/types.d.ts.map +1 -1
  87. package/dist/utils/attachment-utils.js +1 -1
  88. package/dist/utils/attachment-utils.js.map +1 -1
  89. package/dist/utils/format.d.ts +2 -2
  90. package/dist/utils/format.d.ts.map +1 -1
  91. package/dist/utils/format.js.map +1 -1
  92. package/dist/utils/model-discovery.d.ts +6 -6
  93. package/dist/utils/model-discovery.d.ts.map +1 -1
  94. package/dist/utils/model-discovery.js +3 -3
  95. package/dist/utils/model-discovery.js.map +1 -1
  96. package/dist/utils/proxy-utils.d.ts +1 -1
  97. package/example/package.json +1 -1
  98. package/package.json +5 -5
  99. package/src/ChatPanel.ts +1 -1
  100. package/src/components/AgentInterface.ts +5 -5
  101. package/src/components/MessageEditor.ts +2 -2
  102. package/src/components/Messages.ts +6 -6
  103. package/src/components/ProviderKeyInput.ts +3 -3
  104. package/src/components/SandboxedIframe.ts +7 -6
  105. package/src/components/message-renderer-registry.ts +1 -1
  106. package/src/components/sandbox/ArtifactsRuntimeProvider.ts +40 -44
  107. package/src/components/sandbox/AttachmentsRuntimeProvider.ts +9 -7
  108. package/src/components/sandbox/ConsoleRuntimeProvider.ts +19 -17
  109. package/src/components/sandbox/FileDownloadRuntimeProvider.ts +11 -7
  110. package/src/components/sandbox/RuntimeMessageRouter.ts +7 -8
  111. package/src/components/sandbox/SandboxRuntimeProvider.ts +4 -2
  112. package/src/components/sandbox/runtime-messages.ts +146 -0
  113. package/src/dialogs/AttachmentOverlay.ts +12 -11
  114. package/src/dialogs/CustomProviderDialog.ts +2 -2
  115. package/src/dialogs/ModelSelector.ts +11 -11
  116. package/src/storage/stores/custom-providers-store.ts +2 -2
  117. package/src/storage/types.ts +2 -2
  118. package/src/tools/artifacts/DocxArtifact.ts +2 -2
  119. package/src/tools/artifacts/ExcelArtifact.ts +3 -3
  120. package/src/tools/artifacts/HtmlArtifact.ts +1 -1
  121. package/src/tools/artifacts/PdfArtifact.ts +5 -4
  122. package/src/tools/artifacts/artifacts-tool-renderer.ts +4 -4
  123. package/src/tools/artifacts/artifacts.ts +4 -4
  124. package/src/tools/extract-document.ts +6 -6
  125. package/src/tools/index.ts +1 -1
  126. package/src/tools/javascript-repl.ts +3 -3
  127. package/src/tools/renderer-registry.ts +5 -5
  128. package/src/tools/renderers/BashRenderer.ts +3 -3
  129. package/src/tools/renderers/CalculateRenderer.ts +3 -3
  130. package/src/tools/renderers/DefaultRenderer.ts +5 -5
  131. package/src/tools/renderers/GetCurrentTimeRenderer.ts +5 -5
  132. package/src/tools/types.ts +1 -1
  133. package/src/utils/attachment-utils.ts +10 -3
  134. package/src/utils/format.ts +2 -2
  135. package/src/utils/model-discovery.ts +35 -22
  136. package/src/utils/proxy-utils.ts +1 -1
@@ -1,3 +1,4 @@
1
+ import type { RuntimeMessage, RuntimeResponse, SandboxRuntimeWindow } from "./runtime-messages.js";
1
2
  import type { SandboxRuntimeProvider } from "./SandboxRuntimeProvider.js";
2
3
 
3
4
  export interface ConsoleLog {
@@ -18,7 +19,7 @@ export class ConsoleRuntimeProvider implements SandboxRuntimeProvider {
18
19
  private completionError: { message: string; stack: string } | null = null;
19
20
  private completed = false;
20
21
 
21
- getData(): Record<string, any> {
22
+ getData(): Record<string, unknown> {
22
23
  // No data needed
23
24
  return {};
24
25
  }
@@ -29,10 +30,11 @@ export class ConsoleRuntimeProvider implements SandboxRuntimeProvider {
29
30
 
30
31
  getRuntime(): (sandboxId: string) => void {
31
32
  return (_sandboxId: string) => {
33
+ const win = window as unknown as SandboxRuntimeWindow;
32
34
  // Store truly original console methods on first wrap only
33
35
  // This prevents accumulation of wrapper functions across multiple executions
34
- if (!(window as any).__originalConsole) {
35
- (window as any).__originalConsole = {
36
+ if (!win.__originalConsole) {
37
+ win.__originalConsole = {
36
38
  log: console.log.bind(console),
37
39
  error: console.error.bind(console),
38
40
  warn: console.warn.bind(console),
@@ -41,13 +43,13 @@ export class ConsoleRuntimeProvider implements SandboxRuntimeProvider {
41
43
  }
42
44
 
43
45
  // Always use the truly original console, not the current (possibly wrapped) one
44
- const originalConsole = (window as any).__originalConsole;
46
+ const originalConsole = win.__originalConsole;
45
47
 
46
48
  // Track pending send promises to wait for them in onCompleted
47
- const pendingSends: Promise<any>[] = [];
49
+ const pendingSends: Promise<unknown>[] = [];
48
50
 
49
- ["log", "error", "warn", "info"].forEach((method) => {
50
- (console as any)[method] = (...args: any[]) => {
51
+ (["log", "error", "warn", "info"] as const).forEach((method) => {
52
+ console[method] = (...args: unknown[]) => {
51
53
  const text = args
52
54
  .map((arg) => {
53
55
  try {
@@ -59,11 +61,11 @@ export class ConsoleRuntimeProvider implements SandboxRuntimeProvider {
59
61
  .join(" ");
60
62
 
61
63
  // Always log locally too (using truly original console)
62
- (originalConsole as any)[method].apply(console, args);
64
+ originalConsole[method].apply(console, args);
63
65
 
64
66
  // Send immediately and track the promise (only in extension context)
65
- if ((window as any).sendRuntimeMessage) {
66
- const sendPromise = (window as any)
67
+ if (win.sendRuntimeMessage) {
68
+ const sendPromise = win
67
69
  .sendRuntimeMessage({
68
70
  type: "console",
69
71
  method,
@@ -77,8 +79,8 @@ export class ConsoleRuntimeProvider implements SandboxRuntimeProvider {
77
79
  });
78
80
 
79
81
  // Register completion callback to wait for all pending sends
80
- if ((window as any).onCompleted) {
81
- (window as any).onCompleted(async (_success: boolean) => {
82
+ if (win.onCompleted) {
83
+ win.onCompleted(async (_success: boolean) => {
82
84
  // Wait for all pending console sends to complete
83
85
  if (pendingSends.length > 0) {
84
86
  await Promise.all(pendingSends);
@@ -111,20 +113,20 @@ export class ConsoleRuntimeProvider implements SandboxRuntimeProvider {
111
113
 
112
114
  // Expose complete() method for user code to call
113
115
  let completionSent = false;
114
- (window as any).complete = async (error?: { message: string; stack: string }, returnValue?: any) => {
116
+ win.complete = async (error?: { message: string; stack: string } | null, returnValue?: unknown) => {
115
117
  if (completionSent) return;
116
118
  completionSent = true;
117
119
 
118
120
  const finalError = error || lastError;
119
121
 
120
- if ((window as any).sendRuntimeMessage) {
122
+ if (win.sendRuntimeMessage) {
121
123
  if (finalError) {
122
- await (window as any).sendRuntimeMessage({
124
+ await win.sendRuntimeMessage({
123
125
  type: "execution-error",
124
126
  error: finalError,
125
127
  });
126
128
  } else {
127
- await (window as any).sendRuntimeMessage({
129
+ await win.sendRuntimeMessage({
128
130
  type: "execution-complete",
129
131
  returnValue,
130
132
  });
@@ -134,7 +136,7 @@ export class ConsoleRuntimeProvider implements SandboxRuntimeProvider {
134
136
  };
135
137
  }
136
138
 
137
- async handleMessage(message: any, respond: (response: any) => void): Promise<void> {
139
+ async handleMessage(message: RuntimeMessage, respond: (response: RuntimeResponse) => void): Promise<void> {
138
140
  if (message.type === "console") {
139
141
  // Collect console output
140
142
  this.logs.push({
@@ -1,3 +1,4 @@
1
+ import type { RuntimeMessage, RuntimeResponse, SandboxRuntimeWindow } from "./runtime-messages.js";
1
2
  import type { SandboxRuntimeProvider } from "./SandboxRuntimeProvider.js";
2
3
 
3
4
  export interface DownloadableFile {
@@ -17,15 +18,16 @@ export interface DownloadableFile {
17
18
  export class FileDownloadRuntimeProvider implements SandboxRuntimeProvider {
18
19
  private files: DownloadableFile[] = [];
19
20
 
20
- getData(): Record<string, any> {
21
+ getData(): Record<string, unknown> {
21
22
  // No data needed
22
23
  return {};
23
24
  }
24
25
 
25
26
  getRuntime(): (sandboxId: string) => void {
26
27
  return (_sandboxId: string) => {
27
- (window as any).returnDownloadableFile = async (fileName: string, content: any, mimeType?: string) => {
28
- let finalContent: any, finalMimeType: string;
28
+ const win = window as unknown as SandboxRuntimeWindow;
29
+ win.returnDownloadableFile = async (fileName: string, content: unknown, mimeType?: string) => {
30
+ let finalContent: string | Uint8Array, finalMimeType: string;
29
31
 
30
32
  if (content instanceof Blob) {
31
33
  const arrayBuffer = await content.arrayBuffer();
@@ -53,8 +55,8 @@ export class FileDownloadRuntimeProvider implements SandboxRuntimeProvider {
53
55
  }
54
56
 
55
57
  // Send to extension if in extension context (online mode)
56
- if ((window as any).sendRuntimeMessage) {
57
- const response = await (window as any).sendRuntimeMessage({
58
+ if (win.sendRuntimeMessage) {
59
+ const response = await win.sendRuntimeMessage({
58
60
  type: "file-returned",
59
61
  fileName,
60
62
  content: finalContent,
@@ -63,7 +65,9 @@ export class FileDownloadRuntimeProvider implements SandboxRuntimeProvider {
63
65
  if (response.error) throw new Error(response.error);
64
66
  } else {
65
67
  // Offline mode: trigger browser download directly
66
- const blob = new Blob([finalContent instanceof Uint8Array ? finalContent : finalContent], {
68
+ const blobPart: BlobPart =
69
+ typeof finalContent === "string" ? finalContent : new Uint8Array(finalContent);
70
+ const blob = new Blob([blobPart], {
67
71
  type: finalMimeType,
68
72
  });
69
73
  const url = URL.createObjectURL(blob);
@@ -77,7 +81,7 @@ export class FileDownloadRuntimeProvider implements SandboxRuntimeProvider {
77
81
  };
78
82
  }
79
83
 
80
- async handleMessage(message: any, respond: (response: any) => void): Promise<void> {
84
+ async handleMessage(message: RuntimeMessage, respond: (response: RuntimeResponse) => void): Promise<void> {
81
85
  if (message.type === "file-returned") {
82
86
  // Collect file for caller
83
87
  this.files.push({
@@ -1,7 +1,8 @@
1
+ import type { ChromeApi, RuntimeMessage, RuntimeResponse, UserScriptMessageListener } from "./runtime-messages.js";
1
2
  import type { SandboxRuntimeProvider } from "./SandboxRuntimeProvider.js";
2
3
 
3
4
  // Type declaration for chrome extension API (when available)
4
- declare const chrome: any;
5
+ declare const chrome: ChromeApi | undefined;
5
6
 
6
7
  /**
7
8
  * Message consumer interface - components that want to receive messages from sandboxes
@@ -11,7 +12,7 @@ export interface MessageConsumer {
11
12
  * Handle a message from a sandbox.
12
13
  * All consumers receive all messages - decide internally what to handle.
13
14
  */
14
- handleMessage(message: any): Promise<void>;
15
+ handleMessage(message: RuntimeMessage): Promise<void>;
15
16
  }
16
17
 
17
18
  /**
@@ -41,9 +42,7 @@ interface SandboxContext {
41
42
  export class RuntimeMessageRouter {
42
43
  private sandboxes = new Map<string, SandboxContext>();
43
44
  private messageListener: ((e: MessageEvent) => void) | null = null;
44
- private userScriptMessageListener:
45
- | ((message: any, sender: any, sendResponse: (response: any) => void) => boolean)
46
- | null = null;
45
+ private userScriptMessageListener: UserScriptMessageListener | null = null;
47
46
 
48
47
  /**
49
48
  * Register a new sandbox with its runtime providers.
@@ -133,7 +132,7 @@ export class RuntimeMessageRouter {
133
132
  }
134
133
 
135
134
  // Create respond() function for bidirectional communication
136
- const respond = (response: any) => {
135
+ const respond = (response: RuntimeResponse) => {
137
136
  context.iframe?.contentWindow?.postMessage(
138
137
  {
139
138
  type: "runtime-response",
@@ -170,14 +169,14 @@ export class RuntimeMessageRouter {
170
169
  return;
171
170
  }
172
171
 
173
- this.userScriptMessageListener = (message: any, _sender: any, sendResponse: (response: any) => void) => {
172
+ this.userScriptMessageListener = (message, _sender, sendResponse) => {
174
173
  const { sandboxId } = message;
175
174
  if (!sandboxId) return false;
176
175
 
177
176
  const context = this.sandboxes.get(sandboxId);
178
177
  if (!context) return false;
179
178
 
180
- const respond = (response: any) => {
179
+ const respond = (response: RuntimeResponse) => {
181
180
  sendResponse({
182
181
  ...response,
183
182
  sandboxId,
@@ -1,3 +1,5 @@
1
+ import type { RuntimeMessage, RuntimeResponse } from "./runtime-messages.js";
2
+
1
3
  /**
2
4
  * Interface for providing runtime capabilities to sandboxed iframes.
3
5
  * Each provider injects data and runtime functions into the sandbox context.
@@ -7,7 +9,7 @@ export interface SandboxRuntimeProvider {
7
9
  * Returns data to inject into window scope.
8
10
  * Keys become window properties (e.g., { attachments: [...] } -> window.attachments)
9
11
  */
10
- getData(): Record<string, any>;
12
+ getData(): Record<string, unknown>;
11
13
 
12
14
  /**
13
15
  * Returns a runtime function that will be stringified and executed in the sandbox.
@@ -25,7 +27,7 @@ export interface SandboxRuntimeProvider {
25
27
  * @param message - The message from the sandbox
26
28
  * @param respond - Function to send a response back to the sandbox
27
29
  */
28
- handleMessage?(message: any, respond: (response: any) => void): Promise<void>;
30
+ handleMessage?(message: RuntimeMessage, respond: (response: RuntimeResponse) => void): Promise<void>;
29
31
 
30
32
  /**
31
33
  * Optional documentation describing what globals/functions this provider injects.
@@ -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();