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.
- package/dist/capture/event.d.ts +5 -1
- package/dist/capture/event.d.ts.map +1 -1
- package/dist/cli.js +100 -0
- package/dist/cli.js.map +1 -1
- package/dist/evaluators/llm-judge.js +17 -14
- package/dist/evaluators/types.d.ts +1 -0
- package/dist/execution/tool-runner.d.ts +26 -0
- package/dist/execution/tool-runner.d.ts.map +1 -0
- package/dist/execution/tool-runner.js +270 -0
- package/dist/execution/tool-runner.js.map +1 -0
- package/dist/http.d.ts +2 -0
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +2 -0
- package/dist/http.js.map +1 -1
- package/dist/index.cjs +4310 -2672
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/interceptors/ai-interceptor.d.ts.map +1 -1
- package/dist/interceptors/ai-interceptor.js +97 -4
- package/dist/interceptors/ai-interceptor.js.map +1 -1
- package/dist/interceptors/db-auto.d.ts.map +1 -1
- package/dist/interceptors/db-auto.js +116 -24
- package/dist/interceptors/db-auto.js.map +1 -1
- package/dist/interceptors/db.d.ts +5 -0
- package/dist/interceptors/db.d.ts.map +1 -1
- package/dist/interceptors/db.js +93 -15
- package/dist/interceptors/db.js.map +1 -1
- package/dist/interceptors/http.d.ts.map +1 -1
- package/dist/interceptors/http.js +125 -93
- package/dist/interceptors/http.js.map +1 -1
- package/dist/interceptors/telemetry-push.d.ts +15 -0
- package/dist/interceptors/telemetry-push.d.ts.map +1 -1
- package/dist/interceptors/telemetry-push.js +96 -13
- package/dist/interceptors/telemetry-push.js.map +1 -1
- package/dist/interceptors/tool.d.ts.map +1 -1
- package/dist/interceptors/tool.js +42 -5
- package/dist/interceptors/tool.js.map +1 -1
- package/dist/interceptors/workflow-ai.d.ts.map +1 -1
- package/dist/interceptors/workflow-ai.js +46 -2
- package/dist/interceptors/workflow-ai.js.map +1 -1
- package/dist/observability.d.ts +69 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +242 -0
- package/dist/observability.js.map +1 -0
- package/dist/portal-executor.d.ts +30 -0
- package/dist/portal-executor.d.ts.map +1 -0
- package/dist/portal-executor.js +304 -0
- package/dist/portal-executor.js.map +1 -0
- package/dist/portal-server.d.ts +3 -0
- package/dist/portal-server.d.ts.map +1 -0
- package/dist/portal-server.js +265 -0
- package/dist/portal-server.js.map +1 -0
- package/dist/telemetry-batcher.d.ts +43 -0
- package/dist/telemetry-batcher.d.ts.map +1 -0
- package/dist/telemetry-batcher.js +111 -0
- package/dist/telemetry-batcher.js.map +1 -0
- package/dist/trigger-executor.d.ts +12 -0
- package/dist/trigger-executor.d.ts.map +1 -0
- package/dist/trigger-executor.js +83 -0
- package/dist/trigger-executor.js.map +1 -0
- package/dist/types/portal.d.ts +64 -0
- package/dist/types/portal.d.ts.map +1 -0
- package/dist/types/portal.js +2 -0
- package/dist/types/portal.js.map +1 -0
- package/dist/utils/debug.d.ts +3 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/debug.js +8 -0
- package/dist/utils/debug.js.map +1 -0
- package/dist/utils/redact.d.ts +7 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +26 -0
- package/dist/utils/redact.js.map +1 -0
- package/package.json +9 -1
- package/src/capture/event.ts +5 -1
- package/src/cli.ts +109 -0
- package/src/execution/tool-runner.ts +304 -0
- package/src/http.ts +2 -0
- package/src/index.ts +14 -0
- package/src/interceptors/ai-interceptor.ts +110 -4
- package/src/interceptors/db-auto.ts +121 -25
- package/src/interceptors/db.ts +92 -17
- package/src/interceptors/http.ts +145 -107
- package/src/interceptors/telemetry-push.ts +113 -13
- package/src/interceptors/tool.ts +42 -5
- package/src/interceptors/workflow-ai.ts +49 -2
- package/src/observability.ts +281 -0
- package/src/portal-executor.ts +335 -0
- package/src/portal-server.ts +290 -0
- package/src/telemetry-batcher.ts +143 -0
- package/src/trigger-executor.ts +121 -0
- package/src/types/portal.ts +67 -0
- package/src/utils/debug.ts +8 -0
- 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":"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"}
|
|
@@ -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"}
|