@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.
- package/CHANGELOG.md +7 -0
- package/dist/ChatPanel.d.ts +1 -1
- package/dist/ChatPanel.d.ts.map +1 -1
- package/dist/app.css +1 -1
- package/dist/components/AgentInterface.d.ts +1 -1
- package/dist/components/AgentInterface.d.ts.map +1 -1
- package/dist/components/AgentInterface.js +1 -1
- package/dist/components/AgentInterface.js.map +1 -1
- package/dist/components/MessageEditor.d.ts +2 -2
- package/dist/components/MessageEditor.d.ts.map +1 -1
- package/dist/components/Messages.d.ts +3 -3
- package/dist/components/Messages.d.ts.map +1 -1
- package/dist/components/Messages.js.map +1 -1
- package/dist/components/ProviderKeyInput.js +2 -2
- package/dist/components/ProviderKeyInput.js.map +1 -1
- package/dist/components/SandboxedIframe.d.ts +1 -1
- package/dist/components/SandboxedIframe.d.ts.map +1 -1
- package/dist/components/SandboxedIframe.js +1 -1
- package/dist/components/SandboxedIframe.js.map +1 -1
- package/dist/components/message-renderer-registry.js.map +1 -1
- package/dist/components/sandbox/ArtifactsRuntimeProvider.d.ts +4 -3
- package/dist/components/sandbox/ArtifactsRuntimeProvider.d.ts.map +1 -1
- package/dist/components/sandbox/ArtifactsRuntimeProvider.js +31 -31
- package/dist/components/sandbox/ArtifactsRuntimeProvider.js.map +1 -1
- package/dist/components/sandbox/AttachmentsRuntimeProvider.d.ts +1 -1
- package/dist/components/sandbox/AttachmentsRuntimeProvider.d.ts.map +1 -1
- package/dist/components/sandbox/AttachmentsRuntimeProvider.js +6 -5
- package/dist/components/sandbox/AttachmentsRuntimeProvider.js.map +1 -1
- package/dist/components/sandbox/ConsoleRuntimeProvider.d.ts +3 -2
- package/dist/components/sandbox/ConsoleRuntimeProvider.d.ts.map +1 -1
- package/dist/components/sandbox/ConsoleRuntimeProvider.js +12 -11
- package/dist/components/sandbox/ConsoleRuntimeProvider.js.map +1 -1
- package/dist/components/sandbox/FileDownloadRuntimeProvider.d.ts +3 -2
- package/dist/components/sandbox/FileDownloadRuntimeProvider.d.ts.map +1 -1
- package/dist/components/sandbox/FileDownloadRuntimeProvider.js +6 -4
- package/dist/components/sandbox/FileDownloadRuntimeProvider.js.map +1 -1
- package/dist/components/sandbox/RuntimeMessageRouter.d.ts +2 -1
- package/dist/components/sandbox/RuntimeMessageRouter.d.ts.map +1 -1
- package/dist/components/sandbox/RuntimeMessageRouter.js.map +1 -1
- package/dist/components/sandbox/SandboxRuntimeProvider.d.ts +3 -2
- package/dist/components/sandbox/SandboxRuntimeProvider.d.ts.map +1 -1
- package/dist/components/sandbox/runtime-messages.d.ts +140 -0
- package/dist/components/sandbox/runtime-messages.d.ts.map +1 -0
- package/dist/components/sandbox/runtime-messages.js +9 -0
- package/dist/components/sandbox/runtime-messages.js.map +1 -0
- package/dist/dialogs/AttachmentOverlay.d.ts.map +1 -1
- package/dist/dialogs/AttachmentOverlay.js +4 -4
- package/dist/dialogs/AttachmentOverlay.js.map +1 -1
- package/dist/dialogs/ModelSelector.d.ts +3 -3
- package/dist/dialogs/ModelSelector.d.ts.map +1 -1
- package/dist/dialogs/ModelSelector.js.map +1 -1
- package/dist/storage/stores/custom-providers-store.d.ts +2 -2
- package/dist/storage/stores/custom-providers-store.d.ts.map +1 -1
- package/dist/storage/types.d.ts +2 -2
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/tools/artifacts/DocxArtifact.js +1 -1
- package/dist/tools/artifacts/DocxArtifact.js.map +1 -1
- package/dist/tools/artifacts/ExcelArtifact.js +1 -1
- package/dist/tools/artifacts/ExcelArtifact.js.map +1 -1
- package/dist/tools/artifacts/HtmlArtifact.js.map +1 -1
- package/dist/tools/artifacts/PdfArtifact.d.ts.map +1 -1
- package/dist/tools/artifacts/PdfArtifact.js +1 -1
- package/dist/tools/artifacts/PdfArtifact.js.map +1 -1
- package/dist/tools/artifacts/artifacts-tool-renderer.d.ts.map +1 -1
- package/dist/tools/artifacts/artifacts-tool-renderer.js.map +1 -1
- package/dist/tools/artifacts/artifacts.js.map +1 -1
- package/dist/tools/extract-document.js +1 -1
- package/dist/tools/extract-document.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/javascript-repl.js.map +1 -1
- package/dist/tools/renderer-registry.d.ts +4 -3
- package/dist/tools/renderer-registry.d.ts.map +1 -1
- package/dist/tools/renderer-registry.js.map +1 -1
- package/dist/tools/renderers/BashRenderer.d.ts.map +1 -1
- package/dist/tools/renderers/BashRenderer.js.map +1 -1
- package/dist/tools/renderers/CalculateRenderer.d.ts.map +1 -1
- package/dist/tools/renderers/CalculateRenderer.js.map +1 -1
- package/dist/tools/renderers/DefaultRenderer.d.ts +1 -1
- package/dist/tools/renderers/DefaultRenderer.d.ts.map +1 -1
- package/dist/tools/renderers/DefaultRenderer.js.map +1 -1
- package/dist/tools/renderers/GetCurrentTimeRenderer.d.ts.map +1 -1
- package/dist/tools/renderers/GetCurrentTimeRenderer.js.map +1 -1
- package/dist/tools/types.d.ts +1 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/utils/attachment-utils.js +1 -1
- package/dist/utils/attachment-utils.js.map +1 -1
- package/dist/utils/format.d.ts +2 -2
- package/dist/utils/format.d.ts.map +1 -1
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/model-discovery.d.ts +6 -6
- package/dist/utils/model-discovery.d.ts.map +1 -1
- package/dist/utils/model-discovery.js +3 -3
- package/dist/utils/model-discovery.js.map +1 -1
- package/dist/utils/proxy-utils.d.ts +1 -1
- package/example/package.json +1 -1
- package/package.json +5 -5
- package/src/ChatPanel.ts +1 -1
- package/src/components/AgentInterface.ts +5 -5
- package/src/components/MessageEditor.ts +2 -2
- package/src/components/Messages.ts +6 -6
- package/src/components/ProviderKeyInput.ts +3 -3
- package/src/components/SandboxedIframe.ts +7 -6
- package/src/components/message-renderer-registry.ts +1 -1
- package/src/components/sandbox/ArtifactsRuntimeProvider.ts +40 -44
- package/src/components/sandbox/AttachmentsRuntimeProvider.ts +9 -7
- package/src/components/sandbox/ConsoleRuntimeProvider.ts +19 -17
- package/src/components/sandbox/FileDownloadRuntimeProvider.ts +11 -7
- package/src/components/sandbox/RuntimeMessageRouter.ts +7 -8
- package/src/components/sandbox/SandboxRuntimeProvider.ts +4 -2
- package/src/components/sandbox/runtime-messages.ts +146 -0
- package/src/dialogs/AttachmentOverlay.ts +12 -11
- package/src/dialogs/CustomProviderDialog.ts +2 -2
- package/src/dialogs/ModelSelector.ts +11 -11
- package/src/storage/stores/custom-providers-store.ts +2 -2
- package/src/storage/types.ts +2 -2
- package/src/tools/artifacts/DocxArtifact.ts +2 -2
- package/src/tools/artifacts/ExcelArtifact.ts +3 -3
- package/src/tools/artifacts/HtmlArtifact.ts +1 -1
- package/src/tools/artifacts/PdfArtifact.ts +5 -4
- package/src/tools/artifacts/artifacts-tool-renderer.ts +4 -4
- package/src/tools/artifacts/artifacts.ts +4 -4
- package/src/tools/extract-document.ts +6 -6
- package/src/tools/index.ts +1 -1
- package/src/tools/javascript-repl.ts +3 -3
- package/src/tools/renderer-registry.ts +5 -5
- package/src/tools/renderers/BashRenderer.ts +3 -3
- package/src/tools/renderers/CalculateRenderer.ts +3 -3
- package/src/tools/renderers/DefaultRenderer.ts +5 -5
- package/src/tools/renderers/GetCurrentTimeRenderer.ts +5 -5
- package/src/tools/types.ts +1 -1
- package/src/utils/attachment-utils.ts +10 -3
- package/src/utils/format.ts +2 -2
- package/src/utils/model-discovery.ts +35 -22
- 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,
|
|
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 (!
|
|
35
|
-
|
|
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 =
|
|
46
|
+
const originalConsole = win.__originalConsole;
|
|
45
47
|
|
|
46
48
|
// Track pending send promises to wait for them in onCompleted
|
|
47
|
-
const pendingSends: Promise<
|
|
49
|
+
const pendingSends: Promise<unknown>[] = [];
|
|
48
50
|
|
|
49
|
-
["log", "error", "warn", "info"].forEach((method) => {
|
|
50
|
-
|
|
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
|
-
|
|
64
|
+
originalConsole[method].apply(console, args);
|
|
63
65
|
|
|
64
66
|
// Send immediately and track the promise (only in extension context)
|
|
65
|
-
if (
|
|
66
|
-
const sendPromise =
|
|
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 (
|
|
81
|
-
|
|
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
|
-
|
|
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 (
|
|
122
|
+
if (win.sendRuntimeMessage) {
|
|
121
123
|
if (finalError) {
|
|
122
|
-
await
|
|
124
|
+
await win.sendRuntimeMessage({
|
|
123
125
|
type: "execution-error",
|
|
124
126
|
error: finalError,
|
|
125
127
|
});
|
|
126
128
|
} else {
|
|
127
|
-
await
|
|
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:
|
|
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,
|
|
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
|
-
|
|
28
|
-
|
|
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 (
|
|
57
|
-
const response = await
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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,
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
374
|
+
} catch (error) {
|
|
374
375
|
console.error("Error rendering PDF:", error);
|
|
375
|
-
this.error = error
|
|
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
|
|
479
|
+
} catch (error) {
|
|
479
480
|
console.error("Error rendering DOCX:", error);
|
|
480
|
-
this.error = error
|
|
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
|
|
554
|
+
} catch (error) {
|
|
554
555
|
console.error("Error rendering Excel:", error);
|
|
555
|
-
this.error = error
|
|
556
|
+
this.error = (error instanceof Error ? error.message : undefined) || i18n("Failed to load spreadsheet");
|
|
556
557
|
}
|
|
557
558
|
}
|
|
558
559
|
|
|
559
|
-
private renderExcelSheet(worksheet:
|
|
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
|
|
627
|
+
} catch (error) {
|
|
627
628
|
console.error("Error rendering extracted text:", error);
|
|
628
|
-
this.error = error
|
|
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<
|
|
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<
|
|
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<
|
|
58
|
+
@state() private customProviderModels: Model<Api>[] = [];
|
|
59
59
|
|
|
60
|
-
private onSelectCallback?: (model: Model<
|
|
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<
|
|
70
|
-
onSelect: (model: Model<
|
|
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<
|
|
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<
|
|
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:
|
|
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:
|
|
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
|
|
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<
|
|
22
|
+
models?: Model<Api>[];
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
/**
|
package/src/storage/types.ts
CHANGED
|
@@ -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<
|
|
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
|
|
183
|
+
} catch (error) {
|
|
184
184
|
console.error("Error rendering DOCX:", error);
|
|
185
|
-
this.error = error
|
|
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
|
|
160
|
+
} catch (error) {
|
|
161
161
|
console.error("Error rendering Excel:", error);
|
|
162
|
-
this.error = error
|
|
162
|
+
this.error = error instanceof Error ? error.message : i18n("Failed to load spreadsheet");
|
|
163
163
|
}
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
-
private renderExcelSheet(worksheet:
|
|
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
|
|
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:
|
|
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:
|
|
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
|
|
168
|
+
} catch (error) {
|
|
168
169
|
console.error("Error rendering PDF:", error);
|
|
169
|
-
this.error = error
|
|
170
|
+
this.error = error instanceof Error ? error.message : i18n("Failed to load PDF");
|
|
170
171
|
} finally {
|
|
171
172
|
if (pdf) {
|
|
172
173
|
pdf.destroy();
|