@ekairos/structure 1.21.53-beta.0
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/clearDataset.tool.d.ts +14 -0
- package/dist/clearDataset.tool.d.ts.map +1 -0
- package/dist/clearDataset.tool.js +26 -0
- package/dist/clearDataset.tool.js.map +1 -0
- package/dist/completeObject.tool.d.ts +23 -0
- package/dist/completeObject.tool.d.ts.map +1 -0
- package/dist/completeObject.tool.js +80 -0
- package/dist/completeObject.tool.js.map +1 -0
- package/dist/completeRows.tool.d.ts +20 -0
- package/dist/completeRows.tool.d.ts.map +1 -0
- package/dist/completeRows.tool.js +134 -0
- package/dist/completeRows.tool.js.map +1 -0
- package/dist/dataset/steps.d.ts +142 -0
- package/dist/dataset/steps.d.ts.map +1 -0
- package/dist/dataset/steps.js +166 -0
- package/dist/dataset/steps.js.map +1 -0
- package/dist/datasetFiles.d.ts +6 -0
- package/dist/datasetFiles.d.ts.map +1 -0
- package/dist/datasetFiles.js +12 -0
- package/dist/datasetFiles.js.map +1 -0
- package/dist/domain.d.ts +2 -0
- package/dist/domain.d.ts.map +1 -0
- package/dist/domain.js +2 -0
- package/dist/domain.js.map +1 -0
- package/dist/executeCommand.tool.d.ts +35 -0
- package/dist/executeCommand.tool.d.ts.map +1 -0
- package/dist/executeCommand.tool.js +106 -0
- package/dist/executeCommand.tool.js.map +1 -0
- package/dist/file/steps.d.ts +8 -0
- package/dist/file/steps.d.ts.map +1 -0
- package/dist/file/steps.js +20 -0
- package/dist/file/steps.js.map +1 -0
- package/dist/generateSchema.tool.d.ts +22 -0
- package/dist/generateSchema.tool.d.ts.map +1 -0
- package/dist/generateSchema.tool.js +61 -0
- package/dist/generateSchema.tool.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.d.ts +18 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +62 -0
- package/dist/prompts.js.map +1 -0
- package/dist/sandbox/steps.d.ts +74 -0
- package/dist/sandbox/steps.d.ts.map +1 -0
- package/dist/sandbox/steps.js +104 -0
- package/dist/sandbox/steps.js.map +1 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +33 -0
- package/dist/schema.js.map +1 -0
- package/dist/service.d.ts +41 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +179 -0
- package/dist/service.js.map +1 -0
- package/dist/steps/commitFromEvents.step.d.ts +13 -0
- package/dist/steps/commitFromEvents.step.d.ts.map +1 -0
- package/dist/steps/commitFromEvents.step.js +82 -0
- package/dist/steps/commitFromEvents.step.js.map +1 -0
- package/dist/steps/persistObjectFromStory.step.d.ts +7 -0
- package/dist/steps/persistObjectFromStory.step.d.ts.map +1 -0
- package/dist/steps/persistObjectFromStory.step.js +90 -0
- package/dist/steps/persistObjectFromStory.step.js.map +1 -0
- package/dist/structure.d.ts +34 -0
- package/dist/structure.d.ts.map +1 -0
- package/dist/structure.js +443 -0
- package/dist/structure.js.map +1 -0
- package/dist/types/runtime.d.ts +56 -0
- package/dist/types/runtime.d.ts.map +1 -0
- package/dist/types/runtime.js +2 -0
- package/dist/types/runtime.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
import { createStory, didToolExecute, USER_MESSAGE_TYPE, WEB_CHANNEL } from "@ekairos/story";
|
|
2
|
+
import { getDatasetOutputPath, getDatasetOutputSchemaPath, getDatasetWorkstation } from "./datasetFiles";
|
|
3
|
+
import { createDatasetSandboxStep, readDatasetSandboxFileStep, readDatasetSandboxTextFileStep, runDatasetSandboxCommandStep, writeDatasetSandboxFilesStep, writeDatasetSandboxTextFileStep, } from "./sandbox/steps";
|
|
4
|
+
import { readInstantFileStep } from "./file/steps";
|
|
5
|
+
import { structureGetContextStep, structureGetContextWithRowsOutputFileStep, structureReadRowsOutputJsonlStep, } from "./dataset/steps";
|
|
6
|
+
import { buildStructurePrompt } from "./prompts";
|
|
7
|
+
import { createExecuteCommandTool } from "./executeCommand.tool";
|
|
8
|
+
import { createGenerateSchemaTool } from "./generateSchema.tool";
|
|
9
|
+
import { createClearDatasetTool } from "./clearDataset.tool";
|
|
10
|
+
import { createCompleteRowsTool } from "./completeRows.tool";
|
|
11
|
+
import { createCompleteObjectTool } from "./completeObject.tool";
|
|
12
|
+
import { persistObjectResultFromStoryStep } from "./steps/persistObjectFromStory.step";
|
|
13
|
+
import { structureCommitFromEventsStep } from "./steps/commitFromEvents.step";
|
|
14
|
+
function createUuidV4() {
|
|
15
|
+
// Pure JS uuidv4 (workflow-safe: avoids Node built-ins and @instantdb/admin)
|
|
16
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
|
|
17
|
+
const r = (Math.random() * 16) | 0;
|
|
18
|
+
const v = c === "x" ? r : (r & 0x3) | 0x8;
|
|
19
|
+
return v.toString(16);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function guessTextFileExtension(mimeType, name) {
|
|
23
|
+
const n = String(name ?? "").toLowerCase();
|
|
24
|
+
if (n.includes("."))
|
|
25
|
+
return n.substring(n.lastIndexOf("."));
|
|
26
|
+
const mt = String(mimeType ?? "").toLowerCase();
|
|
27
|
+
if (mt.includes("csv"))
|
|
28
|
+
return ".csv";
|
|
29
|
+
if (mt.includes("json"))
|
|
30
|
+
return ".json";
|
|
31
|
+
if (mt.includes("yaml") || mt.includes("yml"))
|
|
32
|
+
return ".yaml";
|
|
33
|
+
return ".txt";
|
|
34
|
+
}
|
|
35
|
+
async function ensureSandboxPrepared(params) {
|
|
36
|
+
const { env, datasetId, sandboxId, sources, state } = params;
|
|
37
|
+
const workstation = getDatasetWorkstation(datasetId);
|
|
38
|
+
const outputPath = getDatasetOutputPath(datasetId);
|
|
39
|
+
if (state.initialized) {
|
|
40
|
+
console.log("[ekairos/structure] structure.ts ensureSandboxPrepared alreadyInitialized");
|
|
41
|
+
return { preparedSources: state.sources, workstation, outputPath };
|
|
42
|
+
}
|
|
43
|
+
console.log("[ekairos/structure] structure.ts ensureSandboxPrepared begin");
|
|
44
|
+
console.log("[ekairos/structure] structure.ts ensureSandboxPrepared datasetId", datasetId);
|
|
45
|
+
console.log("[ekairos/structure] structure.ts ensureSandboxPrepared sourcesCount", sources.length);
|
|
46
|
+
console.log("[ekairos/structure] structure.ts ensureSandboxPrepared sandbox.mkdir", workstation);
|
|
47
|
+
const mkdirRes = await runDatasetSandboxCommandStep({ env, sandboxId, cmd: "mkdir", args: ["-p", workstation] });
|
|
48
|
+
console.log("[ekairos/structure] structure.ts ensureSandboxPrepared sandbox.mkdir exitCode", mkdirRes.exitCode);
|
|
49
|
+
// Align with dataset sandbox behavior: install python deps up-front (once per dataset sandbox).
|
|
50
|
+
// This avoids tool-level "install if used" heuristics and ensures scripts can import pandas.
|
|
51
|
+
console.log("[ekairos/structure] structure.ts ensureSandboxPrepared installingPythonDeps pandas");
|
|
52
|
+
const pipInstall = await runDatasetSandboxCommandStep({
|
|
53
|
+
env,
|
|
54
|
+
sandboxId,
|
|
55
|
+
cmd: "python",
|
|
56
|
+
args: ["-m", "pip", "install", "pandas", "--quiet", "--upgrade"],
|
|
57
|
+
});
|
|
58
|
+
const installStderr = pipInstall.stderr ?? "";
|
|
59
|
+
if (installStderr && (installStderr.includes("ERROR") || installStderr.includes("FAILED"))) {
|
|
60
|
+
throw new Error(`pip install failed: ${installStderr.substring(0, 300)}`);
|
|
61
|
+
}
|
|
62
|
+
const prepared = [];
|
|
63
|
+
for (let i = 0; i < sources.length; i++) {
|
|
64
|
+
const src = sources[i];
|
|
65
|
+
if (src.kind === "file") {
|
|
66
|
+
console.log("[ekairos/structure] structure.ts ensureSandboxPrepared preparingFileSource");
|
|
67
|
+
console.log("[ekairos/structure] structure.ts ensureSandboxPrepared fileId", src.fileId);
|
|
68
|
+
const file = await readInstantFileStep({ env, fileId: src.fileId });
|
|
69
|
+
const fileName = String(file.contentDisposition ?? "");
|
|
70
|
+
const ext = fileName.includes(".") ? fileName.substring(fileName.lastIndexOf(".")) : "";
|
|
71
|
+
const path = `${workstation}/file_${i}_${src.fileId}${ext}`;
|
|
72
|
+
await writeDatasetSandboxFilesStep({
|
|
73
|
+
env,
|
|
74
|
+
sandboxId,
|
|
75
|
+
files: [{ path, contentBase64: file.contentBase64 }],
|
|
76
|
+
});
|
|
77
|
+
console.log("[ekairos/structure] structure.ts ensureSandboxPrepared wroteFile path", path);
|
|
78
|
+
prepared.push({ kind: "file", id: src.fileId, path });
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (src.kind === "dataset") {
|
|
82
|
+
console.log("[ekairos/structure] structure.ts ensureSandboxPrepared preparingDatasetSource");
|
|
83
|
+
console.log("[ekairos/structure] structure.ts ensureSandboxPrepared sourceDatasetId", src.datasetId);
|
|
84
|
+
const content = await structureReadRowsOutputJsonlStep({ env, structureId: src.datasetId });
|
|
85
|
+
if (!content.ok) {
|
|
86
|
+
throw new Error(content.error);
|
|
87
|
+
}
|
|
88
|
+
const path = `${workstation}/dataset_${src.datasetId}.jsonl`;
|
|
89
|
+
await writeDatasetSandboxFilesStep({
|
|
90
|
+
env,
|
|
91
|
+
sandboxId,
|
|
92
|
+
files: [{ path, contentBase64: content.data.contentBase64 }],
|
|
93
|
+
});
|
|
94
|
+
console.log("[ekairos/structure] structure.ts ensureSandboxPrepared wroteDatasetJsonl path", path);
|
|
95
|
+
prepared.push({ kind: "dataset", id: src.datasetId, path });
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (src.kind === "text") {
|
|
99
|
+
console.log("[ekairos/structure] structure.ts ensureSandboxPrepared preparingTextSource");
|
|
100
|
+
const ext = guessTextFileExtension(src.mimeType, src.name);
|
|
101
|
+
const textId = `text_${i}`;
|
|
102
|
+
const path = `${workstation}/${textId}${ext}`;
|
|
103
|
+
await writeDatasetSandboxTextFileStep({ env, sandboxId, path, text: String(src.text ?? "") });
|
|
104
|
+
console.log("[ekairos/structure] structure.ts ensureSandboxPrepared wroteText path", path);
|
|
105
|
+
prepared.push({ kind: "text", id: textId, path, name: src.name, mimeType: src.mimeType });
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
state.initialized = true;
|
|
110
|
+
state.sources = prepared;
|
|
111
|
+
console.log("[ekairos/structure] structure.ts ensureSandboxPrepared ok");
|
|
112
|
+
return { preparedSources: prepared, workstation, outputPath };
|
|
113
|
+
}
|
|
114
|
+
async function readSchemaFromSandboxIfPresent(params) {
|
|
115
|
+
const schemaPath = getDatasetOutputSchemaPath(params.datasetId);
|
|
116
|
+
console.log("[ekairos/structure] structure.ts readSchemaFromSandboxIfPresent begin");
|
|
117
|
+
console.log("[ekairos/structure] structure.ts readSchemaFromSandboxIfPresent datasetId", params.datasetId);
|
|
118
|
+
console.log("[ekairos/structure] structure.ts readSchemaFromSandboxIfPresent schemaPath", schemaPath);
|
|
119
|
+
const exists = await runDatasetSandboxCommandStep({
|
|
120
|
+
env: params.env,
|
|
121
|
+
sandboxId: params.sandboxId,
|
|
122
|
+
cmd: "test",
|
|
123
|
+
args: ["-f", schemaPath],
|
|
124
|
+
});
|
|
125
|
+
console.log("[ekairos/structure] structure.ts readSchemaFromSandboxIfPresent existsExitCode", exists.exitCode);
|
|
126
|
+
if (exists.exitCode !== 0)
|
|
127
|
+
return null;
|
|
128
|
+
const fileRead = await readDatasetSandboxFileStep({
|
|
129
|
+
env: params.env,
|
|
130
|
+
sandboxId: params.sandboxId,
|
|
131
|
+
path: schemaPath,
|
|
132
|
+
});
|
|
133
|
+
// Decode inside step runtime (Node) to avoid `Buffer` usage in workflow runtime.
|
|
134
|
+
const decoded = await readDatasetSandboxTextFileStep({
|
|
135
|
+
env: params.env,
|
|
136
|
+
sandboxId: params.sandboxId,
|
|
137
|
+
path: schemaPath,
|
|
138
|
+
});
|
|
139
|
+
const jsonText = String(decoded.text ?? "").trim();
|
|
140
|
+
if (!jsonText)
|
|
141
|
+
return null;
|
|
142
|
+
try {
|
|
143
|
+
const parsed = JSON.parse(jsonText);
|
|
144
|
+
console.log("[ekairos/structure] structure.ts readSchemaFromSandboxIfPresent parsedOk");
|
|
145
|
+
return parsed;
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
console.log("[ekairos/structure] structure.ts readSchemaFromSandboxIfPresent parsedFailed");
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function createStructureStoryDefinition(config) {
|
|
153
|
+
const datasetId = config.datasetId;
|
|
154
|
+
const model = config.model ?? "openai/gpt-5";
|
|
155
|
+
const story = createStory("ekairos.structure")
|
|
156
|
+
.context(async (stored, env) => {
|
|
157
|
+
console.log("[ekairos/structure] structure.ts story.context begin");
|
|
158
|
+
const prev = stored?.content ?? {};
|
|
159
|
+
const sandboxState = prev.sandboxState ?? { initialized: false, sources: [] };
|
|
160
|
+
const existingSandboxId = prev.sandboxId ?? config.sandboxId ?? "";
|
|
161
|
+
let sandboxId = existingSandboxId;
|
|
162
|
+
if (!sandboxId) {
|
|
163
|
+
console.log("[ekairos/structure] structure.ts story.context creatingSandbox");
|
|
164
|
+
const created = await createDatasetSandboxStep({ env, runtime: "python3.13", timeoutMs: 10 * 60 * 1000 });
|
|
165
|
+
sandboxId = created.sandboxId;
|
|
166
|
+
}
|
|
167
|
+
const { preparedSources, workstation, outputPath } = await ensureSandboxPrepared({
|
|
168
|
+
env,
|
|
169
|
+
datasetId,
|
|
170
|
+
sandboxId,
|
|
171
|
+
sources: config.sources,
|
|
172
|
+
state: sandboxState,
|
|
173
|
+
});
|
|
174
|
+
if (config.mode === "schema" && config.outputSchema) {
|
|
175
|
+
console.log("[ekairos/structure] structure.ts story.context schemaMode outputSchemaProvided");
|
|
176
|
+
}
|
|
177
|
+
const promptContext = {
|
|
178
|
+
datasetId,
|
|
179
|
+
mode: config.mode,
|
|
180
|
+
output: config.output,
|
|
181
|
+
outputSchema: config.outputSchema,
|
|
182
|
+
sources: preparedSources,
|
|
183
|
+
workstation,
|
|
184
|
+
outputPath,
|
|
185
|
+
};
|
|
186
|
+
const contextKey = `structure:${datasetId}`;
|
|
187
|
+
// IMPORTANT:
|
|
188
|
+
// The Story engine keeps an in-memory context snapshot from *before* tool execution.
|
|
189
|
+
// Tools may have updated `context.content` via steps in the same story turn.
|
|
190
|
+
// To avoid clobbering those updates, re-read the latest persisted content here.
|
|
191
|
+
const latest = await structureGetContextStep({ env, contextKey });
|
|
192
|
+
const prevContent = latest.ok ? (latest.data?.content ?? {}) : (stored?.content ?? {});
|
|
193
|
+
const prevStructure = (prevContent?.structure ?? {});
|
|
194
|
+
const nextStructure = {
|
|
195
|
+
...prevStructure,
|
|
196
|
+
kind: "ekairos.structure",
|
|
197
|
+
version: 1,
|
|
198
|
+
structureId: datasetId,
|
|
199
|
+
orgId: env?.orgId,
|
|
200
|
+
updatedAt: Date.now(),
|
|
201
|
+
mode: config.mode,
|
|
202
|
+
output: config.output,
|
|
203
|
+
instructions: config.instructions,
|
|
204
|
+
sources: config.sources,
|
|
205
|
+
};
|
|
206
|
+
if (config.mode === "schema" && config.outputSchema && !nextStructure.outputSchema) {
|
|
207
|
+
nextStructure.outputSchema = config.outputSchema;
|
|
208
|
+
}
|
|
209
|
+
// Auto mode: lift schema produced by tools from the sandbox, if present.
|
|
210
|
+
if (config.mode === "auto" && !nextStructure.outputSchema) {
|
|
211
|
+
const lifted = await readSchemaFromSandboxIfPresent({ env, sandboxId, datasetId });
|
|
212
|
+
if (lifted) {
|
|
213
|
+
nextStructure.outputSchema = lifted;
|
|
214
|
+
nextStructure.state = "schema_complete";
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Ensure the prompt always reflects the currently known schema (schema mode or lifted auto schema).
|
|
218
|
+
if (nextStructure.outputSchema) {
|
|
219
|
+
;
|
|
220
|
+
promptContext.outputSchema = nextStructure.outputSchema;
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
...prevContent,
|
|
224
|
+
...prev,
|
|
225
|
+
sandboxId,
|
|
226
|
+
sandboxState,
|
|
227
|
+
promptContext,
|
|
228
|
+
structure: nextStructure,
|
|
229
|
+
};
|
|
230
|
+
})
|
|
231
|
+
.narrative(async (stored) => {
|
|
232
|
+
console.log("[ekairos/structure] structure.ts story.narrative begin");
|
|
233
|
+
const promptContext = stored?.content?.promptContext;
|
|
234
|
+
const base = buildStructurePrompt(promptContext);
|
|
235
|
+
const userInstructions = String(config.instructions ?? "").trim();
|
|
236
|
+
if (!userInstructions) {
|
|
237
|
+
console.log("[ekairos/structure] structure.ts story.narrative okNoUserInstructions");
|
|
238
|
+
return base;
|
|
239
|
+
}
|
|
240
|
+
console.log("[ekairos/structure] structure.ts story.narrative okWithUserInstructions");
|
|
241
|
+
return [
|
|
242
|
+
"## USER INSTRUCTIONS",
|
|
243
|
+
"The following instructions were provided by the user. Apply them in addition to (and with higher priority than) the default instructions.",
|
|
244
|
+
"",
|
|
245
|
+
userInstructions,
|
|
246
|
+
"",
|
|
247
|
+
base,
|
|
248
|
+
].join("\n");
|
|
249
|
+
})
|
|
250
|
+
.actions(async (stored, env) => {
|
|
251
|
+
console.log("[ekairos/structure] structure.ts story.actions begin");
|
|
252
|
+
const sandboxId = stored?.content?.sandboxId;
|
|
253
|
+
const output = config.output;
|
|
254
|
+
const content = (stored?.content ?? {});
|
|
255
|
+
const hasOutputSchema = Boolean(content?.structure?.outputSchema?.schema);
|
|
256
|
+
console.log("[ekairos/structure] structure.ts story.actions datasetId", datasetId);
|
|
257
|
+
console.log("[ekairos/structure] structure.ts story.actions mode", config.mode);
|
|
258
|
+
console.log("[ekairos/structure] structure.ts story.actions hasOutputSchema", hasOutputSchema);
|
|
259
|
+
const actions = {
|
|
260
|
+
executeCommand: createExecuteCommandTool({ datasetId, sandboxId, env }),
|
|
261
|
+
clear: createClearDatasetTool({ datasetId, sandboxId, env }),
|
|
262
|
+
};
|
|
263
|
+
// In auto() mode we force a two-phase flow:
|
|
264
|
+
// 1) Model MUST call generateSchema (to persist schema into context)
|
|
265
|
+
// 2) Only then do we expose complete
|
|
266
|
+
if (config.mode === "auto" && !hasOutputSchema) {
|
|
267
|
+
actions.generateSchema = createGenerateSchemaTool({ datasetId, sandboxId, env });
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
actions.complete =
|
|
271
|
+
output === "rows"
|
|
272
|
+
? createCompleteRowsTool({ datasetId, sandboxId, env })
|
|
273
|
+
: createCompleteObjectTool({ datasetId, sandboxId, env });
|
|
274
|
+
}
|
|
275
|
+
console.log("[ekairos/structure] structure.ts story.actions ok");
|
|
276
|
+
return actions;
|
|
277
|
+
})
|
|
278
|
+
.shouldContinue(({ reactionEvent }) => {
|
|
279
|
+
return !didToolExecute(reactionEvent, "complete");
|
|
280
|
+
})
|
|
281
|
+
.model(model);
|
|
282
|
+
return { datasetId, story };
|
|
283
|
+
}
|
|
284
|
+
export function structure(env, opts) {
|
|
285
|
+
const datasetId = opts?.datasetId ?? createUuidV4();
|
|
286
|
+
const sources = [];
|
|
287
|
+
let instructions;
|
|
288
|
+
let mode = "auto";
|
|
289
|
+
let output = "rows";
|
|
290
|
+
let outputSchema;
|
|
291
|
+
const api = {
|
|
292
|
+
datasetId,
|
|
293
|
+
from(...src) {
|
|
294
|
+
sources.push(...src);
|
|
295
|
+
return api;
|
|
296
|
+
},
|
|
297
|
+
instructions(text) {
|
|
298
|
+
instructions = text;
|
|
299
|
+
return api;
|
|
300
|
+
},
|
|
301
|
+
auto() {
|
|
302
|
+
mode = "auto";
|
|
303
|
+
outputSchema = undefined;
|
|
304
|
+
return api;
|
|
305
|
+
},
|
|
306
|
+
schema(schema) {
|
|
307
|
+
mode = "schema";
|
|
308
|
+
outputSchema = schema;
|
|
309
|
+
return api;
|
|
310
|
+
},
|
|
311
|
+
asRows() {
|
|
312
|
+
output = "rows";
|
|
313
|
+
return api;
|
|
314
|
+
},
|
|
315
|
+
asObject() {
|
|
316
|
+
output = "object";
|
|
317
|
+
return api;
|
|
318
|
+
},
|
|
319
|
+
async build(userPrompt) {
|
|
320
|
+
console.log("[ekairos/structure] structure.ts build begin");
|
|
321
|
+
console.log("[ekairos/structure] structure.ts build datasetId", datasetId);
|
|
322
|
+
console.log("[ekairos/structure] structure.ts build mode", mode);
|
|
323
|
+
console.log("[ekairos/structure] structure.ts build output", output);
|
|
324
|
+
console.log("[ekairos/structure] structure.ts build sourcesCount", sources.length);
|
|
325
|
+
const contextKey = `structure:${datasetId}`;
|
|
326
|
+
const storyConfig = {
|
|
327
|
+
datasetId,
|
|
328
|
+
sources: [...sources],
|
|
329
|
+
instructions,
|
|
330
|
+
mode,
|
|
331
|
+
output,
|
|
332
|
+
outputSchema,
|
|
333
|
+
};
|
|
334
|
+
const { story } = createStructureStoryDefinition(storyConfig);
|
|
335
|
+
function makeUserMessageEvent(text) {
|
|
336
|
+
return {
|
|
337
|
+
id: createUuidV4(),
|
|
338
|
+
type: USER_MESSAGE_TYPE,
|
|
339
|
+
channel: WEB_CHANNEL,
|
|
340
|
+
createdAt: new Date().toISOString(),
|
|
341
|
+
content: { parts: [{ type: "text", text }] },
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
async function runStory(evt) {
|
|
345
|
+
console.log("[ekairos/structure] structure.ts build storyReact begin");
|
|
346
|
+
console.log("[ekairos/structure] structure.ts build storyReact contextKey", contextKey);
|
|
347
|
+
console.log("[ekairos/structure] structure.ts build storyReact silent", true);
|
|
348
|
+
console.log("[ekairos/structure] structure.ts build storyReact eventId", evt?.id);
|
|
349
|
+
console.log("[ekairos/structure] structure.ts build storyReact eventType", evt?.type);
|
|
350
|
+
await story.react(evt, {
|
|
351
|
+
env,
|
|
352
|
+
context: { key: contextKey },
|
|
353
|
+
options: { silent: true, preventClose: true, sendFinish: false, maxIterations: 40, maxModelSteps: 10 },
|
|
354
|
+
});
|
|
355
|
+
console.log("[ekairos/structure] structure.ts build storyReact end");
|
|
356
|
+
// Tools are intentionally pure: persist completion outputs post-react by reading tool results from events.
|
|
357
|
+
const commit = await structureCommitFromEventsStep({ env, structureId: datasetId });
|
|
358
|
+
if (!commit.ok) {
|
|
359
|
+
console.log("[ekairos/structure] structure.ts build commitFromEvents failed");
|
|
360
|
+
console.log("[ekairos/structure] structure.ts build commitFromEvents error", commit.error);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
async function getContextOrThrow() {
|
|
364
|
+
const ctxResult = await structureGetContextStep({ env, contextKey });
|
|
365
|
+
if (!ctxResult.ok)
|
|
366
|
+
throw new Error(ctxResult.error);
|
|
367
|
+
return ctxResult.data;
|
|
368
|
+
}
|
|
369
|
+
async function isRowsCompleted() {
|
|
370
|
+
const res = await structureGetContextWithRowsOutputFileStep({ env, contextKey });
|
|
371
|
+
if (!res.ok)
|
|
372
|
+
return false;
|
|
373
|
+
const f = res.data?.structure_output_file;
|
|
374
|
+
const linked = Array.isArray(f) ? f[0] : f;
|
|
375
|
+
return Boolean(linked?.url);
|
|
376
|
+
}
|
|
377
|
+
function isObjectCompleted(ctx) {
|
|
378
|
+
const content = (ctx?.content ?? {});
|
|
379
|
+
return (content?.structure?.outputs?.object?.value !== undefined &&
|
|
380
|
+
content?.structure?.outputs?.object?.value !== null);
|
|
381
|
+
}
|
|
382
|
+
await runStory(makeUserMessageEvent(userPrompt ?? "produce structured output"));
|
|
383
|
+
let ctx = await getContextOrThrow();
|
|
384
|
+
// Auto-mode: if schema is missing after the first pass, explicitly request investigation + generateSchema.
|
|
385
|
+
if (mode === "auto") {
|
|
386
|
+
const content = (ctx?.content ?? {});
|
|
387
|
+
const hasSchema = Boolean(content?.structure?.outputSchema?.schema);
|
|
388
|
+
if (!hasSchema) {
|
|
389
|
+
console.log("[ekairos/structure] structure.ts build autoSchemaMissing followUp");
|
|
390
|
+
await runStory(makeUserMessageEvent([
|
|
391
|
+
"CRITICAL: You did not generate a schema yet.",
|
|
392
|
+
"1) Investigate Sources using executeCommand (inspect paths, read files, infer structure).",
|
|
393
|
+
"2) Call generateSchema.",
|
|
394
|
+
"3) After schema is saved, produce the final output and call complete.",
|
|
395
|
+
].join("\n")));
|
|
396
|
+
ctx = await getContextOrThrow();
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
const needsSecondPass = output === "rows" ? !(await isRowsCompleted()) : !isObjectCompleted(ctx);
|
|
400
|
+
console.log("[ekairos/structure] structure.ts build needsSecondPass", needsSecondPass);
|
|
401
|
+
if (needsSecondPass) {
|
|
402
|
+
console.log("[ekairos/structure] structure.ts build secondPass begin");
|
|
403
|
+
const followUpText = output === "rows"
|
|
404
|
+
? "Finalize now: write output.jsonl to OutputPath and call complete."
|
|
405
|
+
: "Finalize now: call complete with summary and resultJson (inline JSON).";
|
|
406
|
+
await runStory(makeUserMessageEvent(followUpText));
|
|
407
|
+
ctx = await getContextOrThrow();
|
|
408
|
+
console.log("[ekairos/structure] structure.ts build secondPass end");
|
|
409
|
+
}
|
|
410
|
+
const stillIncompleteAfterSecondPass = output === "rows" ? !(await isRowsCompleted()) : !isObjectCompleted(ctx);
|
|
411
|
+
if (stillIncompleteAfterSecondPass) {
|
|
412
|
+
console.log("[ekairos/structure] structure.ts build thirdPass begin");
|
|
413
|
+
const finalText = output === "rows"
|
|
414
|
+
? "CRITICAL: Do not do anything else. Ensure output.jsonl exists at OutputPath and immediately call complete."
|
|
415
|
+
: "CRITICAL: Do not do anything else. Immediately call complete with summary and resultJson (inline JSON).";
|
|
416
|
+
await runStory(makeUserMessageEvent(finalText));
|
|
417
|
+
ctx = await getContextOrThrow();
|
|
418
|
+
console.log("[ekairos/structure] structure.ts build thirdPass end");
|
|
419
|
+
}
|
|
420
|
+
if (output === "rows" && !(await isRowsCompleted())) {
|
|
421
|
+
throw new Error("Rows output not completed");
|
|
422
|
+
}
|
|
423
|
+
if (output === "object" && !isObjectCompleted(ctx)) {
|
|
424
|
+
console.log("[ekairos/structure] structure.ts build objectNotCompleted tryingPersistFallback");
|
|
425
|
+
const persisted = await persistObjectResultFromStoryStep({ env, datasetId });
|
|
426
|
+
if (persisted.ok) {
|
|
427
|
+
console.log("[ekairos/structure] structure.ts build persistFallback ok");
|
|
428
|
+
ctx = await getContextOrThrow();
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
console.log("[ekairos/structure] structure.ts build persistFallback failed");
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
if (output === "object" && !isObjectCompleted(ctx)) {
|
|
435
|
+
throw new Error("Object output not completed");
|
|
436
|
+
}
|
|
437
|
+
console.log("[ekairos/structure] structure.ts build ok");
|
|
438
|
+
return { datasetId, dataset: ctx };
|
|
439
|
+
},
|
|
440
|
+
};
|
|
441
|
+
return api;
|
|
442
|
+
}
|
|
443
|
+
//# sourceMappingURL=structure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structure.js","sourceRoot":"","sources":["../src/structure.ts"],"names":[],"mappings":"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","sourcesContent":["import { createStory, didToolExecute, USER_MESSAGE_TYPE, WEB_CHANNEL } from \"@ekairos/story\"\nimport { getDatasetOutputPath, getDatasetOutputSchemaPath, getDatasetWorkstation } from \"./datasetFiles\"\nimport {\n createDatasetSandboxStep,\n readDatasetSandboxFileStep,\n readDatasetSandboxTextFileStep,\n runDatasetSandboxCommandStep,\n writeDatasetSandboxFilesStep,\n writeDatasetSandboxTextFileStep,\n} from \"./sandbox/steps\"\nimport { readInstantFileStep } from \"./file/steps\"\nimport {\n structureGetContextStep,\n structureGetContextWithRowsOutputFileStep,\n structurePatchContextContentStep,\n structureReadRowsOutputJsonlStep,\n} from \"./dataset/steps\"\nimport { buildStructurePrompt, PreparedSource } from \"./prompts\"\nimport { createExecuteCommandTool } from \"./executeCommand.tool\"\nimport { createGenerateSchemaTool } from \"./generateSchema.tool\"\nimport { createClearDatasetTool } from \"./clearDataset.tool\"\nimport { createCompleteRowsTool } from \"./completeRows.tool\"\nimport { createCompleteObjectTool } from \"./completeObject.tool\"\nimport { persistObjectResultFromStoryStep } from \"./steps/persistObjectFromStory.step\"\nimport { structureCommitFromEventsStep } from \"./steps/commitFromEvents.step\"\n\nexport type StructureSource =\n | { kind: \"file\"; fileId: string }\n | { kind: \"dataset\"; datasetId: string }\n | { kind: \"text\"; text: string; mimeType?: string; name?: string }\n\nexport type StructureMode = \"auto\" | \"schema\"\nexport type StructureOutput = \"rows\" | \"object\"\n\nexport type StructureBuildResult = {\n datasetId: string\n}\n\nfunction createUuidV4(): string {\n // Pure JS uuidv4 (workflow-safe: avoids Node built-ins and @instantdb/admin)\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0\n const v = c === \"x\" ? r : (r & 0x3) | 0x8\n return v.toString(16)\n })\n}\n\ntype SandboxState = {\n initialized: boolean\n sources: PreparedSource[]\n}\n\ntype StructureStoryStored = {\n sandboxId?: string\n sandboxState?: SandboxState\n}\n\ntype StructureStoryConfig = {\n datasetId: string\n sources: StructureSource[]\n instructions?: string\n mode: StructureMode\n output: StructureOutput\n outputSchema?: any\n sandboxId?: string\n model?: string\n}\n\nfunction guessTextFileExtension(mimeType?: string, name?: string): string {\n const n = String(name ?? \"\").toLowerCase()\n if (n.includes(\".\")) return n.substring(n.lastIndexOf(\".\"))\n const mt = String(mimeType ?? \"\").toLowerCase()\n if (mt.includes(\"csv\")) return \".csv\"\n if (mt.includes(\"json\")) return \".json\"\n if (mt.includes(\"yaml\") || mt.includes(\"yml\")) return \".yaml\"\n return \".txt\"\n}\n\nasync function ensureSandboxPrepared(params: {\n env: any\n datasetId: string\n sandboxId: string\n sources: StructureSource[]\n state: SandboxState\n}): Promise<{ preparedSources: PreparedSource[]; workstation: string; outputPath: string }> {\n const { env, datasetId, sandboxId, sources, state } = params\n\n const workstation = getDatasetWorkstation(datasetId)\n const outputPath = getDatasetOutputPath(datasetId)\n\n if (state.initialized) {\n console.log(\"[ekairos/structure] structure.ts ensureSandboxPrepared alreadyInitialized\")\n return { preparedSources: state.sources, workstation, outputPath }\n }\n\n console.log(\"[ekairos/structure] structure.ts ensureSandboxPrepared begin\")\n console.log(\"[ekairos/structure] structure.ts ensureSandboxPrepared datasetId\", datasetId)\n console.log(\"[ekairos/structure] structure.ts ensureSandboxPrepared sourcesCount\", sources.length)\n console.log(\"[ekairos/structure] structure.ts ensureSandboxPrepared sandbox.mkdir\", workstation)\n const mkdirRes = await runDatasetSandboxCommandStep({ env, sandboxId, cmd: \"mkdir\", args: [\"-p\", workstation] })\n console.log(\"[ekairos/structure] structure.ts ensureSandboxPrepared sandbox.mkdir exitCode\", mkdirRes.exitCode)\n\n // Align with dataset sandbox behavior: install python deps up-front (once per dataset sandbox).\n // This avoids tool-level \"install if used\" heuristics and ensures scripts can import pandas.\n console.log(\"[ekairos/structure] structure.ts ensureSandboxPrepared installingPythonDeps pandas\")\n const pipInstall = await runDatasetSandboxCommandStep({\n env,\n sandboxId,\n cmd: \"python\",\n args: [\"-m\", \"pip\", \"install\", \"pandas\", \"--quiet\", \"--upgrade\"],\n })\n const installStderr = pipInstall.stderr ?? \"\"\n if (installStderr && (installStderr.includes(\"ERROR\") || installStderr.includes(\"FAILED\"))) {\n throw new Error(`pip install failed: ${installStderr.substring(0, 300)}`)\n }\n\n const prepared: PreparedSource[] = []\n\n for (let i = 0; i < sources.length; i++) {\n const src = sources[i] as any\n\n if (src.kind === \"file\") {\n console.log(\"[ekairos/structure] structure.ts ensureSandboxPrepared preparingFileSource\")\n console.log(\"[ekairos/structure] structure.ts ensureSandboxPrepared fileId\", src.fileId)\n const file = await readInstantFileStep({ env, fileId: src.fileId })\n const fileName = String(file.contentDisposition ?? \"\")\n const ext = fileName.includes(\".\") ? fileName.substring(fileName.lastIndexOf(\".\")) : \"\"\n const path = `${workstation}/file_${i}_${src.fileId}${ext}`\n\n await writeDatasetSandboxFilesStep({\n env,\n sandboxId,\n files: [{ path, contentBase64: file.contentBase64 }],\n })\n console.log(\"[ekairos/structure] structure.ts ensureSandboxPrepared wroteFile path\", path)\n\n prepared.push({ kind: \"file\", id: src.fileId, path })\n continue\n }\n\n if (src.kind === \"dataset\") {\n console.log(\"[ekairos/structure] structure.ts ensureSandboxPrepared preparingDatasetSource\")\n console.log(\"[ekairos/structure] structure.ts ensureSandboxPrepared sourceDatasetId\", src.datasetId)\n const content = await structureReadRowsOutputJsonlStep({ env, structureId: src.datasetId })\n if (!content.ok) {\n throw new Error(content.error)\n }\n const path = `${workstation}/dataset_${src.datasetId}.jsonl`\n\n await writeDatasetSandboxFilesStep({\n env,\n sandboxId,\n files: [{ path, contentBase64: content.data.contentBase64 }],\n })\n console.log(\"[ekairos/structure] structure.ts ensureSandboxPrepared wroteDatasetJsonl path\", path)\n\n prepared.push({ kind: \"dataset\", id: src.datasetId, path })\n continue\n }\n\n if (src.kind === \"text\") {\n console.log(\"[ekairos/structure] structure.ts ensureSandboxPrepared preparingTextSource\")\n const ext = guessTextFileExtension(src.mimeType, src.name)\n const textId = `text_${i}`\n const path = `${workstation}/${textId}${ext}`\n await writeDatasetSandboxTextFileStep({ env, sandboxId, path, text: String(src.text ?? \"\") })\n console.log(\"[ekairos/structure] structure.ts ensureSandboxPrepared wroteText path\", path)\n\n prepared.push({ kind: \"text\", id: textId, path, name: src.name, mimeType: src.mimeType })\n continue\n }\n }\n\n state.initialized = true\n state.sources = prepared\n\n console.log(\"[ekairos/structure] structure.ts ensureSandboxPrepared ok\")\n return { preparedSources: prepared, workstation, outputPath }\n}\n\nasync function readSchemaFromSandboxIfPresent(params: {\n env: any\n sandboxId: string\n datasetId: string\n}): Promise<any | null> {\n const schemaPath = getDatasetOutputSchemaPath(params.datasetId)\n console.log(\"[ekairos/structure] structure.ts readSchemaFromSandboxIfPresent begin\")\n console.log(\"[ekairos/structure] structure.ts readSchemaFromSandboxIfPresent datasetId\", params.datasetId)\n console.log(\"[ekairos/structure] structure.ts readSchemaFromSandboxIfPresent schemaPath\", schemaPath)\n const exists = await runDatasetSandboxCommandStep({\n env: params.env,\n sandboxId: params.sandboxId,\n cmd: \"test\",\n args: [\"-f\", schemaPath],\n })\n console.log(\"[ekairos/structure] structure.ts readSchemaFromSandboxIfPresent existsExitCode\", exists.exitCode)\n if (exists.exitCode !== 0) return null\n\n const fileRead = await readDatasetSandboxFileStep({\n env: params.env,\n sandboxId: params.sandboxId,\n path: schemaPath,\n })\n // Decode inside step runtime (Node) to avoid `Buffer` usage in workflow runtime.\n const decoded = await readDatasetSandboxTextFileStep({\n env: params.env,\n sandboxId: params.sandboxId,\n path: schemaPath,\n })\n const jsonText = String(decoded.text ?? \"\").trim()\n if (!jsonText) return null\n try {\n const parsed = JSON.parse(jsonText)\n console.log(\"[ekairos/structure] structure.ts readSchemaFromSandboxIfPresent parsedOk\")\n return parsed\n } catch {\n console.log(\"[ekairos/structure] structure.ts readSchemaFromSandboxIfPresent parsedFailed\")\n return null\n }\n}\n\nfunction createStructureStoryDefinition<Env extends { orgId: string }>(config: StructureStoryConfig): { datasetId: string; story: any } {\n const datasetId = config.datasetId\n const model = config.model ?? \"openai/gpt-5\"\n\n const story = createStory<Env>(\"ekairos.structure\")\n .context(async (stored: any, env: Env) => {\n console.log(\"[ekairos/structure] structure.ts story.context begin\")\n const prev = (stored?.content as StructureStoryStored) ?? {}\n const sandboxState: SandboxState = prev.sandboxState ?? { initialized: false, sources: [] }\n const existingSandboxId = prev.sandboxId ?? config.sandboxId ?? \"\"\n\n let sandboxId = existingSandboxId\n if (!sandboxId) {\n console.log(\"[ekairos/structure] structure.ts story.context creatingSandbox\")\n const created = await createDatasetSandboxStep({ env, runtime: \"python3.13\", timeoutMs: 10 * 60 * 1000 })\n sandboxId = created.sandboxId\n }\n\n const { preparedSources, workstation, outputPath } = await ensureSandboxPrepared({\n env,\n datasetId,\n sandboxId,\n sources: config.sources,\n state: sandboxState,\n })\n\n if (config.mode === \"schema\" && config.outputSchema) {\n console.log(\"[ekairos/structure] structure.ts story.context schemaMode outputSchemaProvided\")\n }\n\n const promptContext = {\n datasetId,\n mode: config.mode,\n output: config.output,\n outputSchema: config.outputSchema,\n sources: preparedSources,\n workstation,\n outputPath,\n }\n\n const contextKey = `structure:${datasetId}`\n // IMPORTANT:\n // The Story engine keeps an in-memory context snapshot from *before* tool execution.\n // Tools may have updated `context.content` via steps in the same story turn.\n // To avoid clobbering those updates, re-read the latest persisted content here.\n const latest = await structureGetContextStep({ env, contextKey })\n const prevContent = latest.ok ? ((latest.data?.content ?? {}) as any) : ((stored?.content ?? {}) as any)\n const prevStructure = (prevContent?.structure ?? {}) as any\n\n const nextStructure: any = {\n ...prevStructure,\n kind: \"ekairos.structure\",\n version: 1,\n structureId: datasetId,\n orgId: (env as any)?.orgId,\n updatedAt: Date.now(),\n mode: config.mode,\n output: config.output,\n instructions: config.instructions,\n sources: config.sources,\n }\n\n if (config.mode === \"schema\" && config.outputSchema && !nextStructure.outputSchema) {\n nextStructure.outputSchema = config.outputSchema\n }\n\n // Auto mode: lift schema produced by tools from the sandbox, if present.\n if (config.mode === \"auto\" && !nextStructure.outputSchema) {\n const lifted = await readSchemaFromSandboxIfPresent({ env, sandboxId, datasetId })\n if (lifted) {\n nextStructure.outputSchema = lifted\n nextStructure.state = \"schema_complete\"\n }\n }\n\n // Ensure the prompt always reflects the currently known schema (schema mode or lifted auto schema).\n if (nextStructure.outputSchema) {\n ;(promptContext as any).outputSchema = nextStructure.outputSchema\n }\n\n return {\n ...prevContent,\n ...prev,\n sandboxId,\n sandboxState,\n promptContext,\n structure: nextStructure,\n }\n })\n .narrative(async (stored: any) => {\n console.log(\"[ekairos/structure] structure.ts story.narrative begin\")\n const promptContext = (stored?.content as any)?.promptContext\n const base = buildStructurePrompt(promptContext)\n const userInstructions = String(config.instructions ?? \"\").trim()\n if (!userInstructions) {\n console.log(\"[ekairos/structure] structure.ts story.narrative okNoUserInstructions\")\n return base\n }\n console.log(\"[ekairos/structure] structure.ts story.narrative okWithUserInstructions\")\n return [\n \"## USER INSTRUCTIONS\",\n \"The following instructions were provided by the user. Apply them in addition to (and with higher priority than) the default instructions.\",\n \"\",\n userInstructions,\n \"\",\n base,\n ].join(\"\\n\")\n })\n .actions(async (stored: any, env: Env) => {\n console.log(\"[ekairos/structure] structure.ts story.actions begin\")\n const sandboxId = (stored?.content as any)?.sandboxId as string\n const output = config.output\n const content = (stored?.content ?? {}) as any\n const hasOutputSchema = Boolean(content?.structure?.outputSchema?.schema)\n console.log(\"[ekairos/structure] structure.ts story.actions datasetId\", datasetId)\n console.log(\"[ekairos/structure] structure.ts story.actions mode\", config.mode)\n console.log(\"[ekairos/structure] structure.ts story.actions hasOutputSchema\", hasOutputSchema)\n\n const actions: any = {\n executeCommand: createExecuteCommandTool({ datasetId, sandboxId, env }),\n clear: createClearDatasetTool({ datasetId, sandboxId, env }),\n }\n\n // In auto() mode we force a two-phase flow:\n // 1) Model MUST call generateSchema (to persist schema into context)\n // 2) Only then do we expose complete\n if (config.mode === \"auto\" && !hasOutputSchema) {\n actions.generateSchema = createGenerateSchemaTool({ datasetId, sandboxId, env })\n } else {\n actions.complete =\n output === \"rows\"\n ? createCompleteRowsTool({ datasetId, sandboxId, env })\n : createCompleteObjectTool({ datasetId, sandboxId, env })\n }\n\n console.log(\"[ekairos/structure] structure.ts story.actions ok\")\n return actions\n })\n .shouldContinue(({ reactionEvent }: { reactionEvent: any }) => {\n return !didToolExecute(reactionEvent as any, \"complete\")\n })\n .model(model)\n\n return { datasetId, story }\n}\n\nexport function structure<Env extends { orgId: string }>(\n env: Env,\n opts?: { datasetId?: string },\n) {\n const datasetId = opts?.datasetId ?? createUuidV4()\n const sources: StructureSource[] = []\n let instructions: string | undefined\n let mode: StructureMode = \"auto\"\n let output: StructureOutput = \"rows\"\n let outputSchema: any | undefined\n\n const api = {\n datasetId,\n\n from(...src: StructureSource[]) {\n sources.push(...src)\n return api\n },\n\n instructions(text?: string) {\n instructions = text\n return api\n },\n\n auto() {\n mode = \"auto\"\n outputSchema = undefined\n return api\n },\n\n schema(schema: any) {\n mode = \"schema\"\n outputSchema = schema\n return api\n },\n\n asRows() {\n output = \"rows\"\n return api\n },\n\n asObject() {\n output = \"object\"\n return api\n },\n\n async build(userPrompt?: string): Promise<StructureBuildResult & { dataset?: any }> {\n console.log(\"[ekairos/structure] structure.ts build begin\")\n console.log(\"[ekairos/structure] structure.ts build datasetId\", datasetId)\n console.log(\"[ekairos/structure] structure.ts build mode\", mode)\n console.log(\"[ekairos/structure] structure.ts build output\", output)\n console.log(\"[ekairos/structure] structure.ts build sourcesCount\", sources.length)\n const contextKey = `structure:${datasetId}`\n const storyConfig: StructureStoryConfig = {\n datasetId,\n sources: [...sources],\n instructions,\n mode,\n output,\n outputSchema,\n }\n\n const { story } = createStructureStoryDefinition<Env>(storyConfig)\n\n function makeUserMessageEvent(text: string) {\n return {\n id: createUuidV4(),\n type: USER_MESSAGE_TYPE,\n channel: WEB_CHANNEL,\n createdAt: new Date().toISOString(),\n content: { parts: [{ type: \"text\", text }] },\n } as any\n }\n\n async function runStory(evt: any) {\n console.log(\"[ekairos/structure] structure.ts build storyReact begin\")\n console.log(\"[ekairos/structure] structure.ts build storyReact contextKey\", contextKey)\n console.log(\"[ekairos/structure] structure.ts build storyReact silent\", true)\n console.log(\"[ekairos/structure] structure.ts build storyReact eventId\", evt?.id)\n console.log(\"[ekairos/structure] structure.ts build storyReact eventType\", evt?.type)\n await story.react(evt, {\n env,\n context: { key: contextKey },\n options: { silent: true, preventClose: true, sendFinish: false, maxIterations: 40, maxModelSteps: 10 },\n })\n console.log(\"[ekairos/structure] structure.ts build storyReact end\")\n\n // Tools are intentionally pure: persist completion outputs post-react by reading tool results from events.\n const commit = await structureCommitFromEventsStep({ env, structureId: datasetId })\n if (!commit.ok) {\n console.log(\"[ekairos/structure] structure.ts build commitFromEvents failed\")\n console.log(\"[ekairos/structure] structure.ts build commitFromEvents error\", commit.error)\n }\n }\n\n async function getContextOrThrow() {\n const ctxResult = await structureGetContextStep({ env, contextKey })\n if (!ctxResult.ok) throw new Error(ctxResult.error)\n return ctxResult.data\n }\n\n async function isRowsCompleted() {\n const res = await structureGetContextWithRowsOutputFileStep({ env, contextKey })\n if (!res.ok) return false\n const f = res.data?.structure_output_file\n const linked = Array.isArray(f) ? f[0] : f\n return Boolean(linked?.url)\n }\n\n function isObjectCompleted(ctx: any) {\n const content = (ctx?.content ?? {}) as any\n return (\n content?.structure?.outputs?.object?.value !== undefined &&\n content?.structure?.outputs?.object?.value !== null\n )\n }\n\n await runStory(makeUserMessageEvent(userPrompt ?? \"produce structured output\"))\n let ctx = await getContextOrThrow()\n\n // Auto-mode: if schema is missing after the first pass, explicitly request investigation + generateSchema.\n if (mode === \"auto\") {\n const content = (ctx?.content ?? {}) as any\n const hasSchema = Boolean(content?.structure?.outputSchema?.schema)\n if (!hasSchema) {\n console.log(\"[ekairos/structure] structure.ts build autoSchemaMissing followUp\")\n await runStory(\n makeUserMessageEvent(\n [\n \"CRITICAL: You did not generate a schema yet.\",\n \"1) Investigate Sources using executeCommand (inspect paths, read files, infer structure).\",\n \"2) Call generateSchema.\",\n \"3) After schema is saved, produce the final output and call complete.\",\n ].join(\"\\n\"),\n ),\n )\n ctx = await getContextOrThrow()\n }\n }\n\n const needsSecondPass = output === \"rows\" ? !(await isRowsCompleted()) : !isObjectCompleted(ctx)\n\n console.log(\"[ekairos/structure] structure.ts build needsSecondPass\", needsSecondPass)\n\n if (needsSecondPass) {\n console.log(\"[ekairos/structure] structure.ts build secondPass begin\")\n const followUpText =\n output === \"rows\"\n ? \"Finalize now: write output.jsonl to OutputPath and call complete.\"\n : \"Finalize now: call complete with summary and resultJson (inline JSON).\"\n\n await runStory(makeUserMessageEvent(followUpText))\n ctx = await getContextOrThrow()\n console.log(\"[ekairos/structure] structure.ts build secondPass end\")\n }\n\n const stillIncompleteAfterSecondPass =\n output === \"rows\" ? !(await isRowsCompleted()) : !isObjectCompleted(ctx)\n if (stillIncompleteAfterSecondPass) {\n console.log(\"[ekairos/structure] structure.ts build thirdPass begin\")\n const finalText =\n output === \"rows\"\n ? \"CRITICAL: Do not do anything else. Ensure output.jsonl exists at OutputPath and immediately call complete.\"\n : \"CRITICAL: Do not do anything else. Immediately call complete with summary and resultJson (inline JSON).\"\n await runStory(makeUserMessageEvent(finalText))\n ctx = await getContextOrThrow()\n console.log(\"[ekairos/structure] structure.ts build thirdPass end\")\n }\n\n if (output === \"rows\" && !(await isRowsCompleted())) {\n throw new Error(\"Rows output not completed\")\n }\n if (output === \"object\" && !isObjectCompleted(ctx)) {\n console.log(\"[ekairos/structure] structure.ts build objectNotCompleted tryingPersistFallback\")\n const persisted = await persistObjectResultFromStoryStep({ env, datasetId })\n if (persisted.ok) {\n console.log(\"[ekairos/structure] structure.ts build persistFallback ok\")\n ctx = await getContextOrThrow()\n } else {\n console.log(\"[ekairos/structure] structure.ts build persistFallback failed\")\n }\n }\n\n if (output === \"object\" && !isObjectCompleted(ctx)) {\n throw new Error(\"Object output not completed\")\n }\n\n console.log(\"[ekairos/structure] structure.ts build ok\")\n return { datasetId, dataset: ctx }\n },\n }\n\n return api\n}\n\n"]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export type StoryRuntimeStore = {
|
|
2
|
+
getOrCreateContext(params: {
|
|
3
|
+
key: string;
|
|
4
|
+
}): Promise<{
|
|
5
|
+
id: string;
|
|
6
|
+
key: string;
|
|
7
|
+
content?: unknown;
|
|
8
|
+
}>;
|
|
9
|
+
getContext(params: {
|
|
10
|
+
key: string;
|
|
11
|
+
}): Promise<{
|
|
12
|
+
id: string;
|
|
13
|
+
key: string;
|
|
14
|
+
content?: unknown;
|
|
15
|
+
} | null>;
|
|
16
|
+
updateContextContent(params: {
|
|
17
|
+
key: string;
|
|
18
|
+
}, content: unknown): Promise<{
|
|
19
|
+
id: string;
|
|
20
|
+
key: string;
|
|
21
|
+
content?: unknown;
|
|
22
|
+
}>;
|
|
23
|
+
getEvents(params: {
|
|
24
|
+
key: string;
|
|
25
|
+
}): Promise<unknown[]>;
|
|
26
|
+
};
|
|
27
|
+
export type InstantTxCollection<TLinkLabel extends string = string> = Record<string, {
|
|
28
|
+
link(data: Record<TLinkLabel, string>): unknown;
|
|
29
|
+
unlink(data: Record<TLinkLabel, string>): unknown;
|
|
30
|
+
update(data: unknown): unknown;
|
|
31
|
+
delete(): unknown;
|
|
32
|
+
create(data: unknown): unknown;
|
|
33
|
+
}>;
|
|
34
|
+
export type InstantDbLike = {
|
|
35
|
+
query(query: unknown): Promise<unknown>;
|
|
36
|
+
transact(tx: unknown | unknown[]): Promise<unknown>;
|
|
37
|
+
tx: {
|
|
38
|
+
context_contexts: InstantTxCollection<"structure_output_file">;
|
|
39
|
+
$files?: InstantTxCollection<string>;
|
|
40
|
+
};
|
|
41
|
+
storage: {
|
|
42
|
+
uploadFile(path: string, file: Buffer, opts?: {
|
|
43
|
+
contentType?: string;
|
|
44
|
+
contentDisposition?: string;
|
|
45
|
+
}): Promise<{
|
|
46
|
+
data?: {
|
|
47
|
+
id?: string;
|
|
48
|
+
};
|
|
49
|
+
}>;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
export type StoryRuntime = {
|
|
53
|
+
db: InstantDbLike;
|
|
54
|
+
store: StoryRuntimeStore;
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/types/runtime.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,kBAAkB,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACrG,UAAU,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACpG,oBAAoB,CAClB,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,EACvB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC3D,SAAS,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,UAAU,SAAS,MAAM,GAAG,MAAM,IAAI,MAAM,CAC1E,MAAM,EACN;IACE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;IAChD,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;IAClD,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IAC/B,MAAM,IAAI,OAAO,CAAC;IAClB,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;CAChC,CACF,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,EAAE,EAAE;QACF,gBAAgB,EAAE,mBAAmB,CAAC,uBAAuB,CAAC,CAAC;QAC/D,MAAM,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;KACtC,CAAC;IACF,OAAO,EAAE;QACP,UAAU,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;YAAE,WAAW,CAAC,EAAE,MAAM,CAAC;YAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;SAAE,GAC3D,OAAO,CAAC;YAAE,IAAI,CAAC,EAAE;gBAAE,EAAE,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC,CAAC;KACxC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,aAAa,CAAC;IAClB,KAAK,EAAE,iBAAiB,CAAC;CAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/types/runtime.ts"],"names":[],"mappings":"","sourcesContent":["export type StoryRuntimeStore = {\r\n getOrCreateContext(params: { key: string }): Promise<{ id: string; key: string; content?: unknown }>;\r\n getContext(params: { key: string }): Promise<{ id: string; key: string; content?: unknown } | null>;\r\n updateContextContent(\r\n params: { key: string },\r\n content: unknown,\r\n ): Promise<{ id: string; key: string; content?: unknown }>;\r\n getEvents(params: { key: string }): Promise<unknown[]>;\r\n};\r\n\r\nexport type InstantTxCollection<TLinkLabel extends string = string> = Record<\r\n string,\r\n {\r\n link(data: Record<TLinkLabel, string>): unknown;\r\n unlink(data: Record<TLinkLabel, string>): unknown;\r\n update(data: unknown): unknown;\r\n delete(): unknown;\r\n create(data: unknown): unknown;\r\n }\r\n>;\r\n\r\nexport type InstantDbLike = {\r\n query(query: unknown): Promise<unknown>;\r\n transact(tx: unknown | unknown[]): Promise<unknown>;\r\n tx: {\r\n context_contexts: InstantTxCollection<\"structure_output_file\">;\r\n $files?: InstantTxCollection<string>;\r\n };\r\n storage: {\r\n uploadFile(\r\n path: string,\r\n file: Buffer,\r\n opts?: { contentType?: string; contentDisposition?: string },\r\n ): Promise<{ data?: { id?: string } }>;\r\n };\r\n};\r\n\r\nexport type StoryRuntime = {\r\n db: InstantDbLike;\r\n store: StoryRuntimeStore;\r\n};\r\n\r\n"]}
|