elasticdash-test 0.1.17 → 0.1.18-alpha

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 (95) hide show
  1. package/dist/capture/event.d.ts +5 -1
  2. package/dist/capture/event.d.ts.map +1 -1
  3. package/dist/cli.js +100 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/evaluators/llm-judge.js +17 -14
  6. package/dist/evaluators/types.d.ts +1 -0
  7. package/dist/execution/tool-runner.d.ts +26 -0
  8. package/dist/execution/tool-runner.d.ts.map +1 -0
  9. package/dist/execution/tool-runner.js +270 -0
  10. package/dist/execution/tool-runner.js.map +1 -0
  11. package/dist/http.d.ts +2 -0
  12. package/dist/http.d.ts.map +1 -1
  13. package/dist/http.js +2 -0
  14. package/dist/http.js.map +1 -1
  15. package/dist/index.cjs +4310 -2672
  16. package/dist/index.d.ts +10 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +7 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/interceptors/ai-interceptor.d.ts.map +1 -1
  21. package/dist/interceptors/ai-interceptor.js +97 -4
  22. package/dist/interceptors/ai-interceptor.js.map +1 -1
  23. package/dist/interceptors/db-auto.d.ts.map +1 -1
  24. package/dist/interceptors/db-auto.js +116 -24
  25. package/dist/interceptors/db-auto.js.map +1 -1
  26. package/dist/interceptors/db.d.ts +5 -0
  27. package/dist/interceptors/db.d.ts.map +1 -1
  28. package/dist/interceptors/db.js +93 -15
  29. package/dist/interceptors/db.js.map +1 -1
  30. package/dist/interceptors/http.d.ts.map +1 -1
  31. package/dist/interceptors/http.js +125 -93
  32. package/dist/interceptors/http.js.map +1 -1
  33. package/dist/interceptors/telemetry-push.d.ts +15 -0
  34. package/dist/interceptors/telemetry-push.d.ts.map +1 -1
  35. package/dist/interceptors/telemetry-push.js +96 -13
  36. package/dist/interceptors/telemetry-push.js.map +1 -1
  37. package/dist/interceptors/tool.d.ts.map +1 -1
  38. package/dist/interceptors/tool.js +42 -5
  39. package/dist/interceptors/tool.js.map +1 -1
  40. package/dist/interceptors/workflow-ai.d.ts.map +1 -1
  41. package/dist/interceptors/workflow-ai.js +46 -2
  42. package/dist/interceptors/workflow-ai.js.map +1 -1
  43. package/dist/observability.d.ts +69 -0
  44. package/dist/observability.d.ts.map +1 -0
  45. package/dist/observability.js +242 -0
  46. package/dist/observability.js.map +1 -0
  47. package/dist/portal-executor.d.ts +30 -0
  48. package/dist/portal-executor.d.ts.map +1 -0
  49. package/dist/portal-executor.js +304 -0
  50. package/dist/portal-executor.js.map +1 -0
  51. package/dist/portal-server.d.ts +3 -0
  52. package/dist/portal-server.d.ts.map +1 -0
  53. package/dist/portal-server.js +265 -0
  54. package/dist/portal-server.js.map +1 -0
  55. package/dist/telemetry-batcher.d.ts +43 -0
  56. package/dist/telemetry-batcher.d.ts.map +1 -0
  57. package/dist/telemetry-batcher.js +111 -0
  58. package/dist/telemetry-batcher.js.map +1 -0
  59. package/dist/trigger-executor.d.ts +12 -0
  60. package/dist/trigger-executor.d.ts.map +1 -0
  61. package/dist/trigger-executor.js +83 -0
  62. package/dist/trigger-executor.js.map +1 -0
  63. package/dist/types/portal.d.ts +64 -0
  64. package/dist/types/portal.d.ts.map +1 -0
  65. package/dist/types/portal.js +2 -0
  66. package/dist/types/portal.js.map +1 -0
  67. package/dist/utils/debug.d.ts +3 -0
  68. package/dist/utils/debug.d.ts.map +1 -0
  69. package/dist/utils/debug.js +8 -0
  70. package/dist/utils/debug.js.map +1 -0
  71. package/dist/utils/redact.d.ts +7 -0
  72. package/dist/utils/redact.d.ts.map +1 -0
  73. package/dist/utils/redact.js +26 -0
  74. package/dist/utils/redact.js.map +1 -0
  75. package/package.json +9 -1
  76. package/src/capture/event.ts +5 -1
  77. package/src/cli.ts +109 -0
  78. package/src/execution/tool-runner.ts +304 -0
  79. package/src/http.ts +2 -0
  80. package/src/index.ts +14 -0
  81. package/src/interceptors/ai-interceptor.ts +110 -4
  82. package/src/interceptors/db-auto.ts +121 -25
  83. package/src/interceptors/db.ts +92 -17
  84. package/src/interceptors/http.ts +145 -107
  85. package/src/interceptors/telemetry-push.ts +113 -13
  86. package/src/interceptors/tool.ts +42 -5
  87. package/src/interceptors/workflow-ai.ts +49 -2
  88. package/src/observability.ts +281 -0
  89. package/src/portal-executor.ts +335 -0
  90. package/src/portal-server.ts +290 -0
  91. package/src/telemetry-batcher.ts +143 -0
  92. package/src/trigger-executor.ts +121 -0
  93. package/src/types/portal.ts +67 -0
  94. package/src/utils/debug.ts +8 -0
  95. package/src/utils/redact.ts +25 -0
@@ -0,0 +1,242 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { TelemetryBatcher } from './telemetry-batcher.js';
3
+ import { setObservabilityContext, getObservabilityContext, clearObservabilityContext, pushTelemetryEvent, } from './interceptors/telemetry-push.js';
4
+ import { installAIInterceptor } from './interceptors/ai-interceptor.js';
5
+ import { interceptFetch } from './interceptors/http.js';
6
+ import { installDBAutoInterceptor } from './interceptors/db-auto.js';
7
+ import { executeTrigger } from './trigger-executor.js';
8
+ import { scanTools, scanWorkflows } from './execution/tool-runner.js';
9
+ import { debugLog } from './utils/debug.js';
10
+ let heartbeatTimer = null;
11
+ let shutdownRegistered = false;
12
+ /**
13
+ * Initialise active observability mode. All `wrapTool` / `wrapAI` calls will
14
+ * automatically record and stream trace events to the configured backend.
15
+ *
16
+ * Reads from environment variables as fallback:
17
+ * - `ELASTICDASH_API_URL` — backend API URL (required)
18
+ * - `ELASTICDASH_API_KEY` — project auth token
19
+ * - `ELASTICDASH_SERVICE_ID` — service/app identifier
20
+ * - `ELASTICDASH_SESSION_ID` — session identifier (auto-generated if omitted)
21
+ */
22
+ export function initObservability(options) {
23
+ const serverUrl = options?.serverUrl ?? process.env.ELASTICDASH_API_URL ?? '';
24
+ if (!serverUrl) {
25
+ throw new Error('[elasticdash] initObservability: serverUrl is required (set ELASTICDASH_API_URL or pass serverUrl option)');
26
+ }
27
+ const apiKey = options?.apiKey ?? process.env.ELASTICDASH_API_KEY;
28
+ const serviceId = options?.serviceId ?? process.env.ELASTICDASH_SERVICE_ID ?? 'unknown-service';
29
+ const sessionId = options?.sessionId ?? process.env.ELASTICDASH_SESSION_ID ?? randomUUID();
30
+ const sampleRate = options?.sampleRate ?? 1.0;
31
+ const redactKeys = options?.redactKeys ?? [];
32
+ const heartbeatIntervalMs = options?.heartbeatIntervalMs ?? 30_000;
33
+ const batcher = new TelemetryBatcher({
34
+ serverUrl,
35
+ apiKey,
36
+ sessionId,
37
+ serviceId,
38
+ batchIntervalMs: options?.batchIntervalMs,
39
+ maxBatchSize: options?.maxBatchSize,
40
+ redactKeys,
41
+ onTrigger: async (trigger) => {
42
+ await executeTrigger(serverUrl, apiKey, trigger);
43
+ },
44
+ });
45
+ let counter = 0;
46
+ const traceId = `${serviceId}::${Date.now()}::${randomUUID().slice(0, 8)}`;
47
+ const ctx = {
48
+ sessionId,
49
+ serviceId,
50
+ serverUrl,
51
+ apiKey,
52
+ batcher,
53
+ nextId: () => ++counter,
54
+ sampleRate,
55
+ redactKeys,
56
+ traceId,
57
+ };
58
+ setObservabilityContext(ctx);
59
+ installAIInterceptor();
60
+ interceptFetch();
61
+ installDBAutoInterceptor().catch(() => { });
62
+ // Heartbeat
63
+ heartbeatTimer = setInterval(() => {
64
+ batcher.enqueue({
65
+ id: ctx.nextId(),
66
+ type: 'side_effect',
67
+ name: '__heartbeat__',
68
+ input: { sessionId, serviceId },
69
+ output: { uptime: process.uptime() },
70
+ timestamp: Date.now(),
71
+ durationMs: 0,
72
+ schemaVersion: 1,
73
+ });
74
+ }, heartbeatIntervalMs);
75
+ if (heartbeatTimer && typeof heartbeatTimer === 'object' && 'unref' in heartbeatTimer) {
76
+ heartbeatTimer.unref();
77
+ }
78
+ // Register process exit hooks (once)
79
+ if (!shutdownRegistered) {
80
+ shutdownRegistered = true;
81
+ const onExit = () => { shutdownObservability().catch(() => { }); };
82
+ process.once('beforeExit', onExit);
83
+ process.once('SIGTERM', onExit);
84
+ process.once('SIGINT', onExit);
85
+ }
86
+ debugLog(`[elasticdash] Observability initialised — sessionId=${sessionId} serviceId=${serviceId} server=${serverUrl}`);
87
+ // Push workflow/tool catalog to backend (fire-and-forget)
88
+ pushCatalog(serverUrl, apiKey).catch(() => { });
89
+ return {
90
+ sessionId,
91
+ shutdown: () => shutdownObservability(),
92
+ };
93
+ }
94
+ /**
95
+ * Scan ed_workflows.ts and ed_tools.ts, then POST the catalog to the backend
96
+ * so it registers the real function names instead of falling back to serviceId.
97
+ */
98
+ async function pushCatalog(serverUrl, apiKey) {
99
+ const cwd = process.cwd();
100
+ const workflows = scanWorkflows(cwd);
101
+ const tools = scanTools(cwd);
102
+ if (workflows.length === 0 && tools.length === 0)
103
+ return;
104
+ const body = {};
105
+ if (workflows.length > 0)
106
+ body.workflows = workflows.map(w => ({ name: w.name }));
107
+ if (tools.length > 0)
108
+ body.tools = tools.map(t => ({ name: t.name }));
109
+ const headers = { 'Content-Type': 'application/json' };
110
+ if (apiKey)
111
+ headers['Authorization'] = `Bearer ${apiKey}`;
112
+ try {
113
+ const res = await fetch(`${serverUrl.replace(/\/$/, '')}/api/observability/catalog`, {
114
+ method: 'POST',
115
+ headers,
116
+ body: JSON.stringify(body),
117
+ });
118
+ debugLog(`[elasticdash] Catalog pushed: ${workflows.length} workflows, ${tools.length} tools (status ${res.status})`);
119
+ }
120
+ catch (err) {
121
+ debugLog(`[elasticdash] Catalog push failed: ${err instanceof Error ? err.message : String(err)}`);
122
+ }
123
+ }
124
+ /**
125
+ * Gracefully shut down observability: flush remaining events, send session_end,
126
+ * stop heartbeat, and clear context.
127
+ */
128
+ export async function shutdownObservability() {
129
+ const ctx = getObservabilityContext();
130
+ if (!ctx)
131
+ return;
132
+ // Stop heartbeat
133
+ if (heartbeatTimer) {
134
+ clearInterval(heartbeatTimer);
135
+ heartbeatTimer = null;
136
+ }
137
+ // Send session_end event
138
+ ctx.batcher.enqueue({
139
+ id: ctx.nextId(),
140
+ type: 'side_effect',
141
+ name: '__session_end__',
142
+ input: { sessionId: ctx.sessionId, serviceId: ctx.serviceId },
143
+ output: { uptime: process.uptime() },
144
+ timestamp: Date.now(),
145
+ durationMs: 0,
146
+ schemaVersion: 1,
147
+ });
148
+ // Flush and shut down the batcher
149
+ await ctx.batcher.shutdown();
150
+ clearObservabilityContext();
151
+ debugLog(`[elasticdash] Observability shut down — sessionId=${ctx.sessionId}`);
152
+ }
153
+ /**
154
+ * Start a new trace for the current request/operation.
155
+ *
156
+ * Call this at the start of each request handler to group all tool/AI events
157
+ * under one trace, identified by the workflow name.
158
+ *
159
+ * The generated traceId encodes the workflow name and timestamp for easy
160
+ * parsing by the backend: `{workflowName}::{timestamp}::{shortId}`
161
+ *
162
+ * @param workflowName — the workflow/function being executed (e.g. 'chatStreamHandler')
163
+ * @returns The new traceId
164
+ *
165
+ * @example
166
+ * ```ts
167
+ * // In a route handler:
168
+ * startTrace('chatStreamHandler')
169
+ * // All subsequent wrapTool/wrapAI calls get traceId = "chatStreamHandler::1712851200000::a1b2c3d4"
170
+ * ```
171
+ */
172
+ export function startTrace(workflowName) {
173
+ const ctx = getObservabilityContext();
174
+ if (!ctx)
175
+ throw new Error('[elasticdash] startTrace: observability not initialised');
176
+ const timestamp = Date.now();
177
+ const shortId = randomUUID().slice(0, 8);
178
+ if (workflowName) {
179
+ ctx.traceId = `${workflowName}::${timestamp}::${shortId}`;
180
+ }
181
+ else {
182
+ ctx.traceId = `${ctx.serviceId}::${timestamp}::${shortId}`;
183
+ }
184
+ return ctx.traceId;
185
+ }
186
+ /**
187
+ * Wrap a workflow function so that every invocation automatically starts a new
188
+ * trace with the workflow name. All tool/AI calls within the function execution
189
+ * are grouped under that trace.
190
+ *
191
+ * Use this in `ed_workflows.ts` to automatically tag each workflow execution:
192
+ *
193
+ * @example
194
+ * ```ts
195
+ * export const chatStreamHandler = wrapWorkflow('chatStreamHandler', async (input) => {
196
+ * const result = await fetchUser(input.userId)
197
+ * const reply = await generateReply(result)
198
+ * return reply
199
+ * })
200
+ * ```
201
+ */
202
+ export function wrapWorkflow(name, fn) {
203
+ return async (...args) => {
204
+ const ctx = getObservabilityContext();
205
+ if (ctx) {
206
+ startTrace(name);
207
+ const start = Date.now();
208
+ let result;
209
+ try {
210
+ result = await fn(...args);
211
+ }
212
+ catch (err) {
213
+ // Emit workflow event with error output
214
+ pushTelemetryEvent({
215
+ id: ctx.nextId(),
216
+ type: 'workflow',
217
+ name,
218
+ input: args.length === 1 ? args[0] : args,
219
+ output: { error: err instanceof Error ? err.message : String(err) },
220
+ timestamp: start,
221
+ durationMs: Date.now() - start,
222
+ schemaVersion: 1,
223
+ });
224
+ throw err;
225
+ }
226
+ // Emit workflow event with successful output
227
+ pushTelemetryEvent({
228
+ id: ctx.nextId(),
229
+ type: 'workflow',
230
+ name,
231
+ input: args.length === 1 ? args[0] : args,
232
+ output: result,
233
+ timestamp: start,
234
+ durationMs: Date.now() - start,
235
+ schemaVersion: 1,
236
+ });
237
+ return result;
238
+ }
239
+ return fn(...args);
240
+ };
241
+ }
242
+ //# sourceMappingURL=observability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.js","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { ToolInfo } from './execution/tool-runner.js';
2
+ import type { PortalTask, PortalTaskResult } from './types/portal.js';
3
+ export interface AvailabilityResult {
4
+ available: boolean;
5
+ reason?: string;
6
+ }
7
+ /**
8
+ * Check if a tool is available for execution.
9
+ * Returns { available: true } or { available: false, reason: "..." }.
10
+ */
11
+ export declare function checkToolAvailability(name: string, cwd: string, tools: ToolInfo[]): AvailabilityResult;
12
+ /**
13
+ * Check if an AI provider is available for execution (API key present).
14
+ * Returns { available: true } or { available: false, reason: "..." }.
15
+ */
16
+ export declare function checkAIAvailability(provider?: string, model?: string): AvailabilityResult;
17
+ /**
18
+ * Execute a portal task (tool or AI rerun). Returns a structured result with
19
+ * output, duration, usage, and error information.
20
+ *
21
+ * Error handling:
22
+ * - Tool not found in ed_tools → ok:false with descriptive error
23
+ * - ed_tools.ts/js missing → ok:false with descriptive error
24
+ * - AI provider unsupported → ok:false with error
25
+ * - AI provider API key missing → ok:false with error naming the expected env var
26
+ * - Subprocess crash → ok:false with stderr excerpt
27
+ * - Any other exception → ok:false with error message
28
+ */
29
+ export declare function executePortalTask(task: PortalTask, cwd: string, tools: ToolInfo[]): Promise<PortalTaskResult>;
30
+ //# sourceMappingURL=portal-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal-executor.d.ts","sourceRoot":"","sources":["../src/portal-executor.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAyFrE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,QAAQ,EAAE,GAChB,kBAAkB,CAcpB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,GACb,kBAAkB,CAcpB;AAiBD;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,QAAQ,EAAE,GAChB,OAAO,CAAC,gBAAgB,CAAC,CA2B3B"}
@@ -0,0 +1,304 @@
1
+ import { callProviderLLM } from './matchers/index.js';
2
+ import { resolveRuntimeModule, buildToolArgs, runToolInSubprocess, } from './execution/tool-runner.js';
3
+ import { debugLog } from './utils/debug.js';
4
+ /** Provider → required env var name */
5
+ const PROVIDER_API_KEY_ENV = {
6
+ openai: 'OPENAI_API_KEY',
7
+ claude: 'ANTHROPIC_API_KEY',
8
+ gemini: 'GEMINI_API_KEY',
9
+ grok: 'GROK_API_KEY',
10
+ kimi: 'KIMI_API_KEY',
11
+ };
12
+ // ---------------------------------------------------------------------------
13
+ // Prompt extraction (mirrors dashboard-server.ts logic)
14
+ // ---------------------------------------------------------------------------
15
+ function normalizeMessageContent(content) {
16
+ if (typeof content === 'string')
17
+ return content;
18
+ if (Array.isArray(content)) {
19
+ return content
20
+ .map((part) => {
21
+ if (typeof part === 'string')
22
+ return part;
23
+ if (part && typeof part === 'object' && typeof part.text === 'string')
24
+ return part.text;
25
+ try {
26
+ return JSON.stringify(part);
27
+ }
28
+ catch {
29
+ return String(part);
30
+ }
31
+ })
32
+ .join('\n');
33
+ }
34
+ if (content && typeof content === 'object') {
35
+ if (typeof content.text === 'string')
36
+ return content.text;
37
+ try {
38
+ return JSON.stringify(content);
39
+ }
40
+ catch {
41
+ return String(content);
42
+ }
43
+ }
44
+ return content == null ? '' : String(content);
45
+ }
46
+ function extractPromptFromInput(input) {
47
+ if (typeof input === 'string')
48
+ return { prompt: input };
49
+ const messages = Array.isArray(input)
50
+ ? input
51
+ : input && typeof input === 'object' && Array.isArray(input.messages)
52
+ ? input.messages
53
+ : null;
54
+ if (messages && messages.length > 0) {
55
+ const systemParts = [];
56
+ const promptParts = [];
57
+ for (const message of messages) {
58
+ const role = typeof message?.role === 'string' ? message.role : 'user';
59
+ const content = normalizeMessageContent(message?.content).trim();
60
+ if (!content)
61
+ continue;
62
+ if (role === 'system')
63
+ systemParts.push(content);
64
+ else
65
+ promptParts.push(`${role}: ${content}`);
66
+ }
67
+ return {
68
+ prompt: promptParts.join('\n\n') || systemParts.join('\n\n') || JSON.stringify(input),
69
+ systemPrompt: systemParts.length > 0 ? systemParts.join('\n\n') : undefined,
70
+ };
71
+ }
72
+ if (input && typeof input === 'object' && typeof input.prompt === 'string') {
73
+ return {
74
+ prompt: input.prompt,
75
+ systemPrompt: typeof input.systemPrompt === 'string' ? input.systemPrompt : undefined,
76
+ };
77
+ }
78
+ try {
79
+ return { prompt: JSON.stringify(input) };
80
+ }
81
+ catch {
82
+ return { prompt: String(input ?? '') };
83
+ }
84
+ }
85
+ function inferProvider(task) {
86
+ const provider = task.provider?.toLowerCase();
87
+ if (provider === 'openai' || provider === 'claude' || provider === 'gemini' || provider === 'grok' || provider === 'kimi') {
88
+ return provider;
89
+ }
90
+ const model = (task.model ?? task.name)?.toLowerCase() ?? '';
91
+ if (model.includes('claude'))
92
+ return 'claude';
93
+ if (model.includes('gemini'))
94
+ return 'gemini';
95
+ if (model.includes('grok'))
96
+ return 'grok';
97
+ if (model.includes('kimi'))
98
+ return 'kimi';
99
+ return 'openai';
100
+ }
101
+ /**
102
+ * Check if a tool is available for execution.
103
+ * Returns { available: true } or { available: false, reason: "..." }.
104
+ */
105
+ export function checkToolAvailability(name, cwd, tools) {
106
+ if (!name) {
107
+ return { available: false, reason: 'Missing tool name.' };
108
+ }
109
+ const toolsModulePath = resolveRuntimeModule(cwd, 'ed_tools');
110
+ if (!toolsModulePath) {
111
+ return { available: false, reason: 'Cannot find ed_tools.ts/js in workspace root.' };
112
+ }
113
+ const toolInfo = tools.find(t => t.name === name);
114
+ if (!toolInfo) {
115
+ const available = tools.map(t => t.name).join(', ') || '(none found)';
116
+ return { available: false, reason: `Tool not found: "${name}". Available tools: ${available}` };
117
+ }
118
+ return { available: true };
119
+ }
120
+ /**
121
+ * Check if an AI provider is available for execution (API key present).
122
+ * Returns { available: true } or { available: false, reason: "..." }.
123
+ */
124
+ export function checkAIAvailability(provider, model) {
125
+ const resolved = inferProviderFromArgs(provider, model);
126
+ const supportedProviders = ['openai', 'claude', 'gemini', 'grok', 'kimi'];
127
+ if (!supportedProviders.includes(resolved)) {
128
+ return { available: false, reason: `Unsupported AI provider: "${provider ?? model}". Supported: ${supportedProviders.join(', ')}` };
129
+ }
130
+ const envVar = PROVIDER_API_KEY_ENV[resolved];
131
+ if (!process.env[envVar]) {
132
+ if (resolved === 'gemini' && process.env.GOOGLE_API_KEY) {
133
+ return { available: true };
134
+ }
135
+ return { available: false, reason: `Missing API key for provider "${resolved}". Expected environment variable: ${envVar}` };
136
+ }
137
+ return { available: true };
138
+ }
139
+ function inferProviderFromArgs(provider, model) {
140
+ const p = provider?.toLowerCase();
141
+ if (p === 'openai' || p === 'claude' || p === 'gemini' || p === 'grok' || p === 'kimi')
142
+ return p;
143
+ const m = (model ?? '')?.toLowerCase();
144
+ if (m.includes('claude'))
145
+ return 'claude';
146
+ if (m.includes('gemini'))
147
+ return 'gemini';
148
+ if (m.includes('grok'))
149
+ return 'grok';
150
+ if (m.includes('kimi'))
151
+ return 'kimi';
152
+ return 'openai';
153
+ }
154
+ // ---------------------------------------------------------------------------
155
+ // Public API
156
+ // ---------------------------------------------------------------------------
157
+ /**
158
+ * Execute a portal task (tool or AI rerun). Returns a structured result with
159
+ * output, duration, usage, and error information.
160
+ *
161
+ * Error handling:
162
+ * - Tool not found in ed_tools → ok:false with descriptive error
163
+ * - ed_tools.ts/js missing → ok:false with descriptive error
164
+ * - AI provider unsupported → ok:false with error
165
+ * - AI provider API key missing → ok:false with error naming the expected env var
166
+ * - Subprocess crash → ok:false with stderr excerpt
167
+ * - Any other exception → ok:false with error message
168
+ */
169
+ export async function executePortalTask(task, cwd, tools) {
170
+ const start = Date.now();
171
+ try {
172
+ if (task.type === 'tool') {
173
+ return await executeToolTask(task, cwd, tools);
174
+ }
175
+ if (task.type === 'ai') {
176
+ return await executeAITask(task);
177
+ }
178
+ return {
179
+ taskId: task.taskId,
180
+ ok: false,
181
+ output: null,
182
+ error: `Unknown task type: ${task.type}`,
183
+ durationMs: Date.now() - start,
184
+ metadata: task.metadata,
185
+ };
186
+ }
187
+ catch (e) {
188
+ return {
189
+ taskId: task.taskId,
190
+ ok: false,
191
+ output: null,
192
+ error: e instanceof Error ? e.message : String(e),
193
+ durationMs: Date.now() - start,
194
+ metadata: task.metadata,
195
+ };
196
+ }
197
+ }
198
+ async function executeToolTask(task, cwd, tools) {
199
+ const start = Date.now();
200
+ if (!task.name) {
201
+ return { taskId: task.taskId, ok: false, output: null, error: 'Missing tool name on task.', durationMs: 0, metadata: task.metadata };
202
+ }
203
+ // Check tool exists in the scanned tool list
204
+ const toolInfo = tools.find(t => t.name === task.name);
205
+ if (!toolInfo) {
206
+ const available = tools.map(t => t.name).join(', ') || '(none found)';
207
+ return {
208
+ taskId: task.taskId, ok: false, output: null,
209
+ error: `Tool not found: "${task.name}". Available tools: ${available}`,
210
+ durationMs: 0, metadata: task.metadata,
211
+ };
212
+ }
213
+ // Resolve ed_tools module
214
+ const toolsModulePath = resolveRuntimeModule(cwd, 'ed_tools');
215
+ if (!toolsModulePath) {
216
+ return {
217
+ taskId: task.taskId, ok: false, output: null,
218
+ error: 'Cannot find ed_tools.ts/js in workspace root.',
219
+ durationMs: 0, metadata: task.metadata,
220
+ };
221
+ }
222
+ // Parse input
223
+ let parsedInput = task.input;
224
+ if (typeof parsedInput === 'string') {
225
+ try {
226
+ parsedInput = JSON.parse(parsedInput);
227
+ }
228
+ catch { /* use as-is */ }
229
+ }
230
+ const args = buildToolArgs(parsedInput, toolInfo);
231
+ debugLog(`[elasticdash portal] Executing tool: ${task.name}`, { args });
232
+ const result = await runToolInSubprocess(toolsModulePath, task.name, args);
233
+ const durationMs = result.currentDurationMs ?? (Date.now() - start);
234
+ return {
235
+ taskId: task.taskId,
236
+ ok: result.ok,
237
+ output: result.currentOutput ?? null,
238
+ error: result.error,
239
+ durationMs,
240
+ usage: result.currentUsage,
241
+ metadata: task.metadata,
242
+ };
243
+ }
244
+ async function executeAITask(task) {
245
+ const start = Date.now();
246
+ // Infer provider
247
+ const provider = inferProvider(task);
248
+ const supportedProviders = ['openai', 'claude', 'gemini', 'grok', 'kimi'];
249
+ if (!supportedProviders.includes(provider)) {
250
+ return {
251
+ taskId: task.taskId, ok: false, output: null,
252
+ error: `Unsupported AI provider: "${task.provider}". Supported: ${supportedProviders.join(', ')}`,
253
+ durationMs: 0, metadata: task.metadata,
254
+ };
255
+ }
256
+ // Check API key is available
257
+ const envVar = PROVIDER_API_KEY_ENV[provider];
258
+ if (!process.env[envVar]) {
259
+ // Gemini also accepts GOOGLE_API_KEY
260
+ if (provider === 'gemini' && process.env.GOOGLE_API_KEY) {
261
+ // ok, fallback key available
262
+ }
263
+ else {
264
+ return {
265
+ taskId: task.taskId, ok: false, output: null,
266
+ error: `Missing API key for provider "${provider}". Expected environment variable: ${envVar}`,
267
+ durationMs: 0, metadata: task.metadata,
268
+ };
269
+ }
270
+ }
271
+ // Extract prompt from input
272
+ const { prompt, systemPrompt } = extractPromptFromInput(task.input);
273
+ if (!prompt.trim()) {
274
+ return {
275
+ taskId: task.taskId, ok: false, output: null,
276
+ error: 'AI task input is empty; cannot execute.',
277
+ durationMs: 0, metadata: task.metadata,
278
+ };
279
+ }
280
+ const model = task.model ?? task.name;
281
+ const temperature = typeof task.modelParameters?.temperature === 'number' ? task.modelParameters.temperature : 0;
282
+ const maxTokens = typeof task.modelParameters?.max_tokens === 'number' ? task.modelParameters.max_tokens : 512;
283
+ debugLog(`[elasticdash portal] Executing AI: provider=${provider} model=${model}`);
284
+ try {
285
+ const result = await callProviderLLM(prompt, { provider, model }, systemPrompt ?? 'You are a helpful assistant.', maxTokens, temperature);
286
+ return {
287
+ taskId: task.taskId,
288
+ ok: true,
289
+ output: result.content,
290
+ durationMs: result.durationMs ?? (Date.now() - start),
291
+ usage: result.usage,
292
+ metadata: task.metadata,
293
+ };
294
+ }
295
+ catch (e) {
296
+ return {
297
+ taskId: task.taskId, ok: false, output: null,
298
+ error: `AI execution failed: ${e instanceof Error ? e.message : String(e)}`,
299
+ durationMs: Date.now() - start,
300
+ metadata: task.metadata,
301
+ };
302
+ }
303
+ }
304
+ //# sourceMappingURL=portal-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal-executor.js","sourceRoot":"","sources":["../src/portal-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAEL,oBAAoB,EACpB,aAAa,EACb,mBAAmB,GACpB,MAAM,4BAA4B,CAAA;AAGnC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAI3C,uCAAuC;AACvC,MAAM,oBAAoB,GAAsC;IAC9D,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,mBAAmB;IAC3B,MAAM,EAAE,gBAAgB;IACxB,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE,cAAc;CACrB,CAAA;AAED,8EAA8E;AAC9E,wDAAwD;AACxD,8EAA8E;AAE9E,SAAS,uBAAuB,CAAC,OAAgB;IAC/C,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAA;IAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAA;YACzC,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAQ,IAAY,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAQ,IAAY,CAAC,IAAI,CAAA;YACzG,IAAI,CAAC;gBAAC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;YAAC,CAAC;QACnE,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAA;IACf,CAAC;IACD,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3C,IAAI,OAAQ,OAAe,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAQ,OAAe,CAAC,IAAI,CAAA;QAC3E,IAAI,CAAC;YAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAA;QAAC,CAAC;IACzE,CAAC;IACD,OAAO,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AAC/C,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAEvD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACnC,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAE,KAAa,CAAC,QAAQ,CAAC;YAC5E,CAAC,CAAE,KAAa,CAAC,QAAQ;YACzB,CAAC,CAAC,IAAI,CAAA;IAEV,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,WAAW,GAAa,EAAE,CAAA;QAChC,MAAM,WAAW,GAAa,EAAE,CAAA;QAChC,KAAK,MAAM,OAAO,IAAI,QAAsB,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,OAAO,OAAO,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;YACtE,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;YAChE,IAAI,CAAC,OAAO;gBAAE,SAAQ;YACtB,IAAI,IAAI,KAAK,QAAQ;gBAAE,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;;gBAC3C,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,CAAA;QAC9C,CAAC;QACD,OAAO;YACL,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YACrF,YAAY,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;SAC5E,CAAA;IACH,CAAC;IAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAQ,KAAa,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACpF,OAAO;YACL,MAAM,EAAG,KAAa,CAAC,MAAM;YAC7B,YAAY,EAAE,OAAQ,KAAa,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAE,KAAa,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;SACxG,CAAA;IACH,CAAC;IAED,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAA;IAAC,CAAC;IAChD,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAA;IAAC,CAAC;AAClD,CAAC;AAED,SAAS,aAAa,CAAC,IAAgB;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAA;IAC7C,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC1H,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;IAC5D,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAA;IAC7C,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAA;IAC7C,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAA;IACzC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAA;IACzC,OAAO,QAAQ,CAAA;AACjB,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAY,EACZ,GAAW,EACX,KAAiB;IAEjB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAA;IAC3D,CAAC;IACD,MAAM,eAAe,GAAG,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;IAC7D,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,+CAA+C,EAAE,CAAA;IACtF,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,cAAc,CAAA;QACrE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,IAAI,uBAAuB,SAAS,EAAE,EAAE,CAAA;IACjG,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAiB,EACjB,KAAc;IAEd,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IACvD,MAAM,kBAAkB,GAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9F,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,6BAA6B,QAAQ,IAAI,KAAK,iBAAiB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAA;IACrI,CAAC;IACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAA;IAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,IAAI,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;YACxD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;QAC5B,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,iCAAiC,QAAQ,qCAAqC,MAAM,EAAE,EAAE,CAAA;IAC7H,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;AAC5B,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAiB,EAAE,KAAc;IAC9D,MAAM,CAAC,GAAG,QAAQ,EAAE,WAAW,EAAE,CAAA;IACjC,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,CAAC,CAAA;IAChG,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,CAAA;IACtC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAA;IACzC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAA;IACzC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAA;IACrC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAA;IACrC,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAgB,EAChB,GAAW,EACX,KAAiB;IAEjB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACxB,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,OAAO,MAAM,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAChD,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO,MAAM,aAAa,CAAC,IAAI,CAAC,CAAA;QAClC,CAAC;QACD,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,sBAAsB,IAAI,CAAC,IAAI,EAAE;YACxC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;YAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAA;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACjD,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;YAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAA;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,IAAgB,EAChB,GAAW,EACX,KAAiB;IAEjB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAExB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,4BAA4B,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAA;IACtI,CAAC;IAED,6CAA6C;IAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAA;IACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,cAAc,CAAA;QACrE,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI;YAC5C,KAAK,EAAE,oBAAoB,IAAI,CAAC,IAAI,uBAAuB,SAAS,EAAE;YACtE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACvC,CAAA;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,eAAe,GAAG,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;IAC7D,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI;YAC5C,KAAK,EAAE,+CAA+C;YACtD,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACvC,CAAA;IACH,CAAC;IAED,cAAc;IACd,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,CAAA;IAC5B,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpC,IAAI,CAAC;YAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IACjD,QAAQ,CAAC,wCAAwC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAEvE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAC1E,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAA;IAEnE,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,MAAM,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI;QACpC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,UAAU;QACV,KAAK,EAAE,MAAM,CAAC,YAAY;QAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAA;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAgB;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAExB,iBAAiB;IACjB,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IACpC,MAAM,kBAAkB,GAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9F,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3C,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI;YAC5C,KAAK,EAAE,6BAA6B,IAAI,CAAC,QAAQ,iBAAiB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACjG,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACvC,CAAA;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAA;IAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,qCAAqC;QACrC,IAAI,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;YACxD,6BAA6B;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI;gBAC5C,KAAK,EAAE,iCAAiC,QAAQ,qCAAqC,MAAM,EAAE;gBAC7F,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACvC,CAAA;QACH,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI;YAC5C,KAAK,EAAE,yCAAyC;YAChD,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACvC,CAAA;IACH,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAA;IACrC,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,eAAe,EAAE,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IAChH,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,eAAe,EAAE,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAA;IAE9G,QAAQ,CAAC,+CAA+C,QAAQ,UAAU,KAAK,EAAE,CAAC,CAAA;IAElF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC,MAAM,EACN,EAAE,QAAQ,EAAE,KAAK,EAAE,EACnB,YAAY,IAAI,8BAA8B,EAC9C,SAAS,EACT,WAAW,CACZ,CAAA;QAED,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,MAAM,CAAC,OAAO;YACtB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACrD,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAA;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI;YAC5C,KAAK,EAAE,wBAAwB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YAC3E,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;YAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAA;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PortalServerOptions, PortalServerHandle } from './types/portal.js';
2
+ export declare function startPortalServer(options: PortalServerOptions): Promise<PortalServerHandle>;
3
+ //# sourceMappingURL=portal-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal-server.d.ts","sourceRoot":"","sources":["../src/portal-server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAGV,mBAAmB,EACnB,kBAAkB,EAEnB,MAAM,mBAAmB,CAAA;AA6E1B,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAyMjG"}