@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.
Files changed (73) hide show
  1. package/dist/clearDataset.tool.d.ts +14 -0
  2. package/dist/clearDataset.tool.d.ts.map +1 -0
  3. package/dist/clearDataset.tool.js +26 -0
  4. package/dist/clearDataset.tool.js.map +1 -0
  5. package/dist/completeObject.tool.d.ts +23 -0
  6. package/dist/completeObject.tool.d.ts.map +1 -0
  7. package/dist/completeObject.tool.js +80 -0
  8. package/dist/completeObject.tool.js.map +1 -0
  9. package/dist/completeRows.tool.d.ts +20 -0
  10. package/dist/completeRows.tool.d.ts.map +1 -0
  11. package/dist/completeRows.tool.js +134 -0
  12. package/dist/completeRows.tool.js.map +1 -0
  13. package/dist/dataset/steps.d.ts +142 -0
  14. package/dist/dataset/steps.d.ts.map +1 -0
  15. package/dist/dataset/steps.js +166 -0
  16. package/dist/dataset/steps.js.map +1 -0
  17. package/dist/datasetFiles.d.ts +6 -0
  18. package/dist/datasetFiles.d.ts.map +1 -0
  19. package/dist/datasetFiles.js +12 -0
  20. package/dist/datasetFiles.js.map +1 -0
  21. package/dist/domain.d.ts +2 -0
  22. package/dist/domain.d.ts.map +1 -0
  23. package/dist/domain.js +2 -0
  24. package/dist/domain.js.map +1 -0
  25. package/dist/executeCommand.tool.d.ts +35 -0
  26. package/dist/executeCommand.tool.d.ts.map +1 -0
  27. package/dist/executeCommand.tool.js +106 -0
  28. package/dist/executeCommand.tool.js.map +1 -0
  29. package/dist/file/steps.d.ts +8 -0
  30. package/dist/file/steps.d.ts.map +1 -0
  31. package/dist/file/steps.js +20 -0
  32. package/dist/file/steps.js.map +1 -0
  33. package/dist/generateSchema.tool.d.ts +22 -0
  34. package/dist/generateSchema.tool.d.ts.map +1 -0
  35. package/dist/generateSchema.tool.js +61 -0
  36. package/dist/generateSchema.tool.js.map +1 -0
  37. package/dist/index.d.ts +5 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +5 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/prompts.d.ts +18 -0
  42. package/dist/prompts.d.ts.map +1 -0
  43. package/dist/prompts.js +62 -0
  44. package/dist/prompts.js.map +1 -0
  45. package/dist/sandbox/steps.d.ts +74 -0
  46. package/dist/sandbox/steps.d.ts.map +1 -0
  47. package/dist/sandbox/steps.js +104 -0
  48. package/dist/sandbox/steps.js.map +1 -0
  49. package/dist/schema.d.ts +2 -0
  50. package/dist/schema.d.ts.map +1 -0
  51. package/dist/schema.js +33 -0
  52. package/dist/schema.js.map +1 -0
  53. package/dist/service.d.ts +41 -0
  54. package/dist/service.d.ts.map +1 -0
  55. package/dist/service.js +179 -0
  56. package/dist/service.js.map +1 -0
  57. package/dist/steps/commitFromEvents.step.d.ts +13 -0
  58. package/dist/steps/commitFromEvents.step.d.ts.map +1 -0
  59. package/dist/steps/commitFromEvents.step.js +82 -0
  60. package/dist/steps/commitFromEvents.step.js.map +1 -0
  61. package/dist/steps/persistObjectFromStory.step.d.ts +7 -0
  62. package/dist/steps/persistObjectFromStory.step.d.ts.map +1 -0
  63. package/dist/steps/persistObjectFromStory.step.js +90 -0
  64. package/dist/steps/persistObjectFromStory.step.js.map +1 -0
  65. package/dist/structure.d.ts +34 -0
  66. package/dist/structure.d.ts.map +1 -0
  67. package/dist/structure.js +443 -0
  68. package/dist/structure.js.map +1 -0
  69. package/dist/types/runtime.d.ts +56 -0
  70. package/dist/types/runtime.d.ts.map +1 -0
  71. package/dist/types/runtime.js +2 -0
  72. package/dist/types/runtime.js.map +1 -0
  73. package/package.json +49 -0
@@ -0,0 +1,14 @@
1
+ interface ClearDatasetToolParams {
2
+ datasetId: string;
3
+ sandboxId: string;
4
+ env?: any;
5
+ }
6
+ export declare function createClearDatasetTool({ datasetId, sandboxId, env }: ClearDatasetToolParams): import("ai").Tool<{
7
+ reason: string;
8
+ }, {
9
+ success: boolean;
10
+ message: string;
11
+ reason: string;
12
+ }>;
13
+ export {};
14
+ //# sourceMappingURL=clearDataset.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clearDataset.tool.d.ts","sourceRoot":"","sources":["../src/clearDataset.tool.ts"],"names":[],"mappings":"AAKA,UAAU,sBAAsB;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,GAAG,CAAA;CACV;AAED,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,sBAAsB;;;;;;GAqB3F"}
@@ -0,0 +1,26 @@
1
+ import { tool } from "ai";
2
+ import { z } from "zod/v4";
3
+ import { runDatasetSandboxCommandStep } from "./sandbox/steps";
4
+ import { getDatasetOutputPath } from "./datasetFiles";
5
+ export function createClearDatasetTool({ datasetId, sandboxId, env }) {
6
+ return tool({
7
+ description: "Clear output files and reset dataset status.",
8
+ inputSchema: z.object({
9
+ reason: z.string().describe("Reason for clearing"),
10
+ }),
11
+ execute: async ({ reason }) => {
12
+ console.log("[ekairos/structure] clearDataset.tool execute begin");
13
+ console.log("[ekairos/structure] clearDataset.tool execute datasetId", datasetId);
14
+ const outputPath = getDatasetOutputPath(datasetId);
15
+ try {
16
+ await runDatasetSandboxCommandStep({ env, sandboxId, cmd: "rm", args: ["-f", outputPath] });
17
+ }
18
+ catch {
19
+ // best-effort
20
+ }
21
+ console.log("[ekairos/structure] clearDataset.tool execute ok");
22
+ return { success: true, message: "Cleared", reason };
23
+ },
24
+ });
25
+ }
26
+ //# sourceMappingURL=clearDataset.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clearDataset.tool.js","sourceRoot":"","sources":["../src/clearDataset.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AACzB,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAA;AAC1B,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAQrD,MAAM,UAAU,sBAAsB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAA0B;IAC1F,OAAO,IAAI,CAAC;QACV,WAAW,EAAE,8CAA8C;QAC3D,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;SACnD,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAsB,EAAE,EAAE;YAChD,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAA;YAClE,OAAO,CAAC,GAAG,CAAC,yDAAyD,EAAE,SAAS,CAAC,CAAA;YACjF,MAAM,UAAU,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAA;YAElD,IAAI,CAAC;gBACH,MAAM,4BAA4B,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,CAAA;YAC7F,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAA;YAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAA;QACtD,CAAC;KACF,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { tool } from \"ai\"\nimport { z } from \"zod/v4\"\nimport { runDatasetSandboxCommandStep } from \"./sandbox/steps\"\nimport { getDatasetOutputPath } from \"./datasetFiles\"\n\ninterface ClearDatasetToolParams {\n datasetId: string\n sandboxId: string\n env?: any\n}\n\nexport function createClearDatasetTool({ datasetId, sandboxId, env }: ClearDatasetToolParams) {\n return tool({\n description: \"Clear output files and reset dataset status.\",\n inputSchema: z.object({\n reason: z.string().describe(\"Reason for clearing\"),\n }),\n execute: async ({ reason }: { reason: string }) => {\n console.log(\"[ekairos/structure] clearDataset.tool execute begin\")\n console.log(\"[ekairos/structure] clearDataset.tool execute datasetId\", datasetId)\n const outputPath = getDatasetOutputPath(datasetId)\n\n try {\n await runDatasetSandboxCommandStep({ env, sandboxId, cmd: \"rm\", args: [\"-f\", outputPath] })\n } catch {\n // best-effort\n }\n\n console.log(\"[ekairos/structure] clearDataset.tool execute ok\")\n return { success: true, message: \"Cleared\", reason }\n },\n })\n}\n\n"]}
@@ -0,0 +1,23 @@
1
+ interface CompleteObjectToolParams {
2
+ datasetId: string;
3
+ sandboxId: string;
4
+ env?: any;
5
+ }
6
+ export declare function createCompleteObjectTool({ datasetId, sandboxId, env }: CompleteObjectToolParams): import("ai").Tool<{
7
+ summary: string;
8
+ result?: any;
9
+ resultJson?: string | undefined;
10
+ resultPath?: string | undefined;
11
+ }, {
12
+ success: boolean;
13
+ error: string;
14
+ summary?: undefined;
15
+ result?: undefined;
16
+ } | {
17
+ success: boolean;
18
+ summary: string;
19
+ result: any;
20
+ error?: undefined;
21
+ }>;
22
+ export {};
23
+ //# sourceMappingURL=completeObject.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completeObject.tool.d.ts","sourceRoot":"","sources":["../src/completeObject.tool.ts"],"names":[],"mappings":"AAeA,UAAU,wBAAwB;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,GAAG,CAAA;CACV;AAED,wBAAgB,wBAAwB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,wBAAwB;;;;;;;;;;;;;;;GAmE/F"}
@@ -0,0 +1,80 @@
1
+ import { tool } from "ai";
2
+ import { z } from "zod/v4";
3
+ import Ajv from "ajv";
4
+ import { structureGetContextStep } from "./dataset/steps";
5
+ import { readDatasetSandboxTextFileStep } from "./sandbox/steps";
6
+ let ajvInstance = null;
7
+ function getAjv() {
8
+ if (!ajvInstance) {
9
+ ajvInstance = new Ajv({ allErrors: true, strict: false });
10
+ }
11
+ return ajvInstance;
12
+ }
13
+ export function createCompleteObjectTool({ datasetId, sandboxId, env }) {
14
+ return tool({
15
+ description: "Complete an object result. Provide either resultJson (inline JSON) or resultPath (path to a JSON file in the sandbox). If a schema exists in the dataset record, the object is validated against it.",
16
+ inputSchema: z
17
+ .object({
18
+ summary: z.string().describe("Short summary"),
19
+ result: z.any().optional().describe("Result object (preferred)"),
20
+ resultJson: z.string().optional().describe("JSON string for the result object"),
21
+ resultPath: z.string().optional().describe("Sandbox path to a JSON file containing the object"),
22
+ })
23
+ .refine((v) => v.result !== undefined || Boolean(v.resultJson) || Boolean(v.resultPath), {
24
+ message: "Provide result, resultJson or resultPath",
25
+ }),
26
+ execute: async (input) => {
27
+ console.log("[ekairos/structure] completeObject.tool execute begin");
28
+ console.log("[ekairos/structure] completeObject.tool execute datasetId", datasetId);
29
+ const contextKey = `structure:${datasetId}`;
30
+ const ctxResult = await structureGetContextStep({ env, contextKey });
31
+ if (!ctxResult.ok)
32
+ return { success: false, error: ctxResult.error };
33
+ let obj;
34
+ if (input.result !== undefined) {
35
+ obj = input.result;
36
+ }
37
+ else {
38
+ let jsonText = input.resultJson ?? "";
39
+ if (!jsonText && input.resultPath) {
40
+ console.log("[ekairos/structure] completeObject.tool execute readingResultPath");
41
+ const fileRead = await readDatasetSandboxTextFileStep({ env, sandboxId, path: input.resultPath });
42
+ jsonText = fileRead.text ?? "";
43
+ }
44
+ try {
45
+ obj = JSON.parse(jsonText);
46
+ }
47
+ catch (error) {
48
+ const message = error instanceof Error ? error.message : String(error);
49
+ console.log("[ekairos/structure] completeObject.tool execute invalidJson");
50
+ return { success: false, error: `Invalid JSON: ${message}` };
51
+ }
52
+ }
53
+ const content = (ctxResult.data?.content ?? {});
54
+ const outputSchema = content?.structure?.outputSchema;
55
+ const mode = content?.structure?.mode;
56
+ // Schema validation is strict only in `.schema(...)` mode. Auto is best-effort.
57
+ if (mode === "schema" && outputSchema?.schema) {
58
+ try {
59
+ const validator = getAjv().compile(outputSchema.schema);
60
+ const valid = validator(obj);
61
+ if (!valid) {
62
+ const errors = Array.isArray(validator.errors)
63
+ ? validator.errors.map((err) => err.message || "Unknown validation error")
64
+ : ["Unknown validation error"];
65
+ console.log("[ekairos/structure] completeObject.tool execute schemaValidationFailed");
66
+ return { success: false, error: errors.slice(0, 5).join("; ") };
67
+ }
68
+ }
69
+ catch (error) {
70
+ const message = error instanceof Error ? error.message : String(error);
71
+ console.log("[ekairos/structure] completeObject.tool execute schemaValidateThrew");
72
+ return { success: false, error: `Failed to validate schema: ${message}` };
73
+ }
74
+ }
75
+ console.log("[ekairos/structure] completeObject.tool execute ok");
76
+ return { success: true, summary: input.summary, result: obj };
77
+ },
78
+ });
79
+ }
80
+ //# sourceMappingURL=completeObject.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completeObject.tool.js","sourceRoot":"","sources":["../src/completeObject.tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { tool } from \"ai\"\nimport { z } from \"zod/v4\"\nimport Ajv from \"ajv\"\nimport { structureGetContextStep } from \"./dataset/steps\"\nimport { readDatasetSandboxTextFileStep } from \"./sandbox/steps\"\n\nlet ajvInstance: Ajv | null = null\n\nfunction getAjv(): Ajv {\n if (!ajvInstance) {\n ajvInstance = new Ajv({ allErrors: true, strict: false })\n }\n return ajvInstance\n}\n\ninterface CompleteObjectToolParams {\n datasetId: string\n sandboxId: string\n env?: any\n}\n\nexport function createCompleteObjectTool({ datasetId, sandboxId, env }: CompleteObjectToolParams) {\n return tool({\n description:\n \"Complete an object result. Provide either resultJson (inline JSON) or resultPath (path to a JSON file in the sandbox). If a schema exists in the dataset record, the object is validated against it.\",\n inputSchema: z\n .object({\n summary: z.string().describe(\"Short summary\"),\n result: z.any().optional().describe(\"Result object (preferred)\"),\n resultJson: z.string().optional().describe(\"JSON string for the result object\"),\n resultPath: z.string().optional().describe(\"Sandbox path to a JSON file containing the object\"),\n })\n .refine((v) => v.result !== undefined || Boolean(v.resultJson) || Boolean(v.resultPath), {\n message: \"Provide result, resultJson or resultPath\",\n }),\n execute: async (input: { summary: string; result?: any; resultJson?: string; resultPath?: string }) => {\n console.log(\"[ekairos/structure] completeObject.tool execute begin\")\n console.log(\"[ekairos/structure] completeObject.tool execute datasetId\", datasetId)\n const contextKey = `structure:${datasetId}`\n const ctxResult = await structureGetContextStep({ env, contextKey })\n if (!ctxResult.ok) return { success: false, error: ctxResult.error }\n\n let obj: any\n if (input.result !== undefined) {\n obj = input.result\n } else {\n let jsonText = input.resultJson ?? \"\"\n if (!jsonText && input.resultPath) {\n console.log(\"[ekairos/structure] completeObject.tool execute readingResultPath\")\n const fileRead = await readDatasetSandboxTextFileStep({ env, sandboxId, path: input.resultPath })\n jsonText = fileRead.text ?? \"\"\n }\n\n try {\n obj = JSON.parse(jsonText)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.log(\"[ekairos/structure] completeObject.tool execute invalidJson\")\n return { success: false, error: `Invalid JSON: ${message}` }\n }\n }\n\n const content = (ctxResult.data?.content ?? {}) as any\n const outputSchema = content?.structure?.outputSchema\n const mode = content?.structure?.mode\n // Schema validation is strict only in `.schema(...)` mode. Auto is best-effort.\n if (mode === \"schema\" && outputSchema?.schema) {\n try {\n const validator = getAjv().compile(outputSchema.schema)\n const valid = validator(obj)\n if (!valid) {\n const errors = Array.isArray(validator.errors)\n ? validator.errors.map((err) => err.message || \"Unknown validation error\")\n : [\"Unknown validation error\"]\n console.log(\"[ekairos/structure] completeObject.tool execute schemaValidationFailed\")\n return { success: false, error: errors.slice(0, 5).join(\"; \") }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.log(\"[ekairos/structure] completeObject.tool execute schemaValidateThrew\")\n return { success: false, error: `Failed to validate schema: ${message}` }\n }\n }\n\n console.log(\"[ekairos/structure] completeObject.tool execute ok\")\n return { success: true, summary: input.summary, result: obj }\n },\n })\n}\n\n"]}
@@ -0,0 +1,20 @@
1
+ interface CompleteRowsToolParams {
2
+ datasetId: string;
3
+ sandboxId: string;
4
+ env?: any;
5
+ }
6
+ export declare function createCompleteRowsTool({ datasetId, sandboxId, env }: CompleteRowsToolParams): import("ai").Tool<{
7
+ summary: string;
8
+ }, {
9
+ success: boolean;
10
+ validRowCount?: number;
11
+ error?: string;
12
+ } | {
13
+ success: boolean;
14
+ summary: string;
15
+ validRows: number;
16
+ fileId: string;
17
+ storagePath: string;
18
+ }>;
19
+ export {};
20
+ //# sourceMappingURL=completeRows.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completeRows.tool.d.ts","sourceRoot":"","sources":["../src/completeRows.tool.ts"],"names":[],"mappings":"AAgBA,UAAU,sBAAsB;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,GAAG,CAAA;CACV;AAED,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,sBAAsB;;;aA4FrE,OAAO;oBAAkB,MAAM;YAAU,MAAM;;;;;;;GAjBrE"}
@@ -0,0 +1,134 @@
1
+ import { tool } from "ai";
2
+ import { z } from "zod/v4";
3
+ import Ajv from "ajv";
4
+ import { readDatasetSandboxFileStep, readDatasetSandboxTextFileStep, runDatasetSandboxCommandStep } from "./sandbox/steps";
5
+ import { getDatasetOutputPath } from "./datasetFiles";
6
+ import { structureGetContextStep, structureUploadRowsOutputJsonlStep } from "./dataset/steps";
7
+ let ajvInstance = null;
8
+ function getAjv() {
9
+ if (!ajvInstance) {
10
+ ajvInstance = new Ajv({ allErrors: true, strict: false });
11
+ }
12
+ return ajvInstance;
13
+ }
14
+ export function createCompleteRowsTool({ datasetId, sandboxId, env }) {
15
+ return tool({
16
+ description: "Complete a rows dataset. Requires output.jsonl in the workstation and a saved schema.",
17
+ inputSchema: z.object({
18
+ summary: z.string().describe("Summary of the completed dataset"),
19
+ }),
20
+ execute: async ({ summary }) => {
21
+ console.log("[ekairos/structure] completeRows.tool execute begin");
22
+ console.log("[ekairos/structure] completeRows.tool execute datasetId", datasetId);
23
+ const contextKey = `structure:${datasetId}`;
24
+ const outputPath = getDatasetOutputPath(datasetId);
25
+ try {
26
+ await ensureFileExists(env, sandboxId, outputPath);
27
+ }
28
+ catch (error) {
29
+ const message = error instanceof Error ? error.message : String(error);
30
+ console.log("[ekairos/structure] completeRows.tool execute missingOutputFile");
31
+ return { success: false, error: message };
32
+ }
33
+ const ctxResult = await structureGetContextStep({ env, contextKey });
34
+ if (!ctxResult.ok)
35
+ return { success: false, error: ctxResult.error };
36
+ const content = (ctxResult.data?.content ?? {});
37
+ const outputSchema = content?.structure?.outputSchema;
38
+ if (!outputSchema?.schema) {
39
+ console.log("[ekairos/structure] completeRows.tool execute schemaMissing");
40
+ return { success: false, error: "Schema not found in database. Please generate schema first." };
41
+ }
42
+ const schemaJson = outputSchema.schema;
43
+ const mode = content?.structure?.mode;
44
+ let validator = null;
45
+ try {
46
+ validator = getAjv().compile(schemaJson);
47
+ }
48
+ catch (error) {
49
+ const message = error instanceof Error ? error.message : String(error);
50
+ if (mode === "auto") {
51
+ console.log("[ekairos/structure] completeRows.tool execute schemaCompileSkippedAuto");
52
+ validator = null;
53
+ }
54
+ else {
55
+ console.log("[ekairos/structure] completeRows.tool execute schemaCompileFailed");
56
+ return { success: false, error: `Failed to compile schema: ${message}` };
57
+ }
58
+ }
59
+ let totalValidRows = 0;
60
+ if (validator) {
61
+ const validationResult = await validateJsonlRows({ env, sandboxId, outputPath, validator });
62
+ if (!validationResult.success)
63
+ return validationResult;
64
+ totalValidRows = validationResult.validRowCount ?? 0;
65
+ }
66
+ console.log("[ekairos/structure] completeRows.tool execute validRowCount", totalValidRows);
67
+ const fileRead = await readDatasetSandboxFileStep({ env, sandboxId, path: outputPath });
68
+ if (!fileRead.contentBase64)
69
+ return { success: false, error: "Empty file content" };
70
+ const uploadResult = await structureUploadRowsOutputJsonlStep({
71
+ env,
72
+ structureId: datasetId,
73
+ contentBase64: fileRead.contentBase64,
74
+ });
75
+ if (!uploadResult.ok)
76
+ return { success: false, error: uploadResult.error };
77
+ console.log("[ekairos/structure] completeRows.tool execute uploadedFileId", uploadResult.data.fileId);
78
+ console.log("[ekairos/structure] completeRows.tool execute ok");
79
+ return {
80
+ success: true,
81
+ summary,
82
+ validRows: totalValidRows,
83
+ fileId: uploadResult.data.fileId,
84
+ storagePath: uploadResult.data.storagePath,
85
+ };
86
+ },
87
+ });
88
+ }
89
+ async function ensureFileExists(env, sandboxId, path) {
90
+ const result = await runDatasetSandboxCommandStep({
91
+ env,
92
+ sandboxId,
93
+ cmd: "test",
94
+ args: ["-f", path],
95
+ });
96
+ if (result.exitCode !== 0)
97
+ throw new Error("Required file not found");
98
+ }
99
+ async function validateJsonlRows(params) {
100
+ const { env, sandboxId, outputPath, validator } = params;
101
+ const fileRead = await readDatasetSandboxTextFileStep({ env, sandboxId, path: outputPath });
102
+ const fileContent = fileRead.text ?? "";
103
+ if (!fileContent)
104
+ return { success: true, validRowCount: 0 };
105
+ const lines = fileContent.split("\n");
106
+ let validRowCount = 0;
107
+ for (let index = 0; index < lines.length; index++) {
108
+ const trimmed = lines[index].trim();
109
+ if (!trimmed)
110
+ continue;
111
+ let record;
112
+ try {
113
+ record = JSON.parse(trimmed);
114
+ }
115
+ catch {
116
+ continue;
117
+ }
118
+ if (record.type !== "row")
119
+ continue;
120
+ const data = record.data;
121
+ if (data === undefined || data === null)
122
+ continue;
123
+ const valid = validator(data);
124
+ if (!valid) {
125
+ const errors = Array.isArray(validator.errors)
126
+ ? validator.errors.map((err) => err.message || "Unknown validation error")
127
+ : ["Unknown validation error"];
128
+ return { success: false, error: errors.slice(0, 3).join("; ") };
129
+ }
130
+ validRowCount++;
131
+ }
132
+ return { success: true, validRowCount };
133
+ }
134
+ //# sourceMappingURL=completeRows.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completeRows.tool.js","sourceRoot":"","sources":["../src/completeRows.tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { tool } from \"ai\"\nimport { z } from \"zod/v4\"\nimport Ajv, { ValidateFunction } from \"ajv\"\nimport { readDatasetSandboxFileStep, readDatasetSandboxTextFileStep, runDatasetSandboxCommandStep } from \"./sandbox/steps\"\nimport { getDatasetOutputPath } from \"./datasetFiles\"\nimport { structureGetContextStep, structureUploadRowsOutputJsonlStep } from \"./dataset/steps\"\n\nlet ajvInstance: Ajv | null = null\n\nfunction getAjv(): Ajv {\n if (!ajvInstance) {\n ajvInstance = new Ajv({ allErrors: true, strict: false })\n }\n return ajvInstance\n}\n\ninterface CompleteRowsToolParams {\n datasetId: string\n sandboxId: string\n env?: any\n}\n\nexport function createCompleteRowsTool({ datasetId, sandboxId, env }: CompleteRowsToolParams) {\n return tool({\n description: \"Complete a rows dataset. Requires output.jsonl in the workstation and a saved schema.\",\n inputSchema: z.object({\n summary: z.string().describe(\"Summary of the completed dataset\"),\n }),\n execute: async ({ summary }: { summary: string }) => {\n console.log(\"[ekairos/structure] completeRows.tool execute begin\")\n console.log(\"[ekairos/structure] completeRows.tool execute datasetId\", datasetId)\n const contextKey = `structure:${datasetId}`\n const outputPath = getDatasetOutputPath(datasetId)\n\n try {\n await ensureFileExists(env, sandboxId, outputPath)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.log(\"[ekairos/structure] completeRows.tool execute missingOutputFile\")\n return { success: false, error: message }\n }\n\n const ctxResult = await structureGetContextStep({ env, contextKey })\n if (!ctxResult.ok) return { success: false, error: ctxResult.error }\n\n const content = (ctxResult.data?.content ?? {}) as any\n const outputSchema = content?.structure?.outputSchema\n if (!outputSchema?.schema) {\n console.log(\"[ekairos/structure] completeRows.tool execute schemaMissing\")\n return { success: false, error: \"Schema not found in database. Please generate schema first.\" }\n }\n\n const schemaJson = outputSchema.schema\n const mode = content?.structure?.mode\n let validator: ValidateFunction | null = null\n try {\n validator = getAjv().compile(schemaJson)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n if (mode === \"auto\") {\n console.log(\"[ekairos/structure] completeRows.tool execute schemaCompileSkippedAuto\")\n validator = null\n } else {\n console.log(\"[ekairos/structure] completeRows.tool execute schemaCompileFailed\")\n return { success: false, error: `Failed to compile schema: ${message}` }\n }\n }\n\n let totalValidRows = 0\n if (validator) {\n const validationResult = await validateJsonlRows({ env, sandboxId, outputPath, validator })\n if (!validationResult.success) return validationResult\n totalValidRows = validationResult.validRowCount ?? 0\n }\n console.log(\"[ekairos/structure] completeRows.tool execute validRowCount\", totalValidRows)\n\n const fileRead = await readDatasetSandboxFileStep({ env, sandboxId, path: outputPath })\n if (!fileRead.contentBase64) return { success: false, error: \"Empty file content\" }\n\n const uploadResult = await structureUploadRowsOutputJsonlStep({\n env,\n structureId: datasetId,\n contentBase64: fileRead.contentBase64,\n })\n if (!uploadResult.ok) return { success: false, error: uploadResult.error }\n console.log(\"[ekairos/structure] completeRows.tool execute uploadedFileId\", uploadResult.data.fileId)\n\n console.log(\"[ekairos/structure] completeRows.tool execute ok\")\n return {\n success: true,\n summary,\n validRows: totalValidRows,\n fileId: uploadResult.data.fileId,\n storagePath: uploadResult.data.storagePath,\n }\n },\n })\n}\n\nasync function ensureFileExists(env: any, sandboxId: string, path: string): Promise<void> {\n const result = await runDatasetSandboxCommandStep({\n env,\n sandboxId,\n cmd: \"test\",\n args: [\"-f\", path],\n })\n if (result.exitCode !== 0) throw new Error(\"Required file not found\")\n}\n\nasync function validateJsonlRows(params: {\n env: any\n sandboxId: string\n outputPath: string\n validator: ValidateFunction\n}): Promise<{ success: boolean; validRowCount?: number; error?: string }> {\n const { env, sandboxId, outputPath, validator } = params\n const fileRead = await readDatasetSandboxTextFileStep({ env, sandboxId, path: outputPath })\n const fileContent = fileRead.text ?? \"\"\n if (!fileContent) return { success: true, validRowCount: 0 }\n const lines = fileContent.split(\"\\n\")\n\n let validRowCount = 0\n for (let index = 0; index < lines.length; index++) {\n const trimmed = lines[index].trim()\n if (!trimmed) continue\n\n let record: any\n try {\n record = JSON.parse(trimmed)\n } catch {\n continue\n }\n\n if (record.type !== \"row\") continue\n const data = record.data\n if (data === undefined || data === null) continue\n\n const valid = validator(data)\n if (!valid) {\n const errors = Array.isArray(validator.errors)\n ? validator.errors.map((err) => err.message || \"Unknown validation error\")\n : [\"Unknown validation error\"]\n return { success: false, error: errors.slice(0, 3).join(\"; \") }\n }\n\n validRowCount++\n }\n\n return { success: true, validRowCount }\n}\n\n"]}
@@ -0,0 +1,142 @@
1
+ export type StructureContextContent = {
2
+ /**
3
+ * IMPORTANT:
4
+ * Story engine persists its own runtime state into `context.content`.
5
+ * To avoid clobbering, all structure metadata is namespaced under `structure`.
6
+ */
7
+ structure?: {
8
+ kind?: "ekairos.structure";
9
+ version?: number;
10
+ structureId?: string;
11
+ orgId?: string;
12
+ createdAt?: number;
13
+ updatedAt?: number;
14
+ mode?: "auto" | "schema";
15
+ output?: "rows" | "object";
16
+ instructions?: string;
17
+ sources?: any[];
18
+ outputSchema?: {
19
+ title?: string;
20
+ description?: string;
21
+ schema: any;
22
+ };
23
+ state?: string;
24
+ metrics?: {
25
+ calculatedTotalRows?: number;
26
+ actualGeneratedRowCount?: number;
27
+ };
28
+ outputs?: {
29
+ rows?: {
30
+ format: "jsonl";
31
+ fileId: string;
32
+ storagePath: string;
33
+ rowCount?: number;
34
+ };
35
+ object?: {
36
+ value: any;
37
+ };
38
+ };
39
+ error?: {
40
+ message: string;
41
+ };
42
+ };
43
+ };
44
+ export declare function structureGetOrCreateContextStep(params: {
45
+ env: any;
46
+ contextKey: string;
47
+ }): Promise<{
48
+ ok: true;
49
+ data: any;
50
+ } | {
51
+ ok: false;
52
+ error: string;
53
+ }>;
54
+ export declare function structureGetContextStep(params: {
55
+ env: any;
56
+ contextKey: string;
57
+ }): Promise<{
58
+ ok: true;
59
+ data: any;
60
+ } | {
61
+ ok: false;
62
+ error: string;
63
+ }>;
64
+ export declare function structureUpdateContextContentStep(params: {
65
+ env: any;
66
+ contextKey: string;
67
+ content: StructureContextContent;
68
+ }): Promise<{
69
+ ok: true;
70
+ data: any;
71
+ } | {
72
+ ok: false;
73
+ error: string;
74
+ }>;
75
+ export declare function structurePatchContextContentStep(params: {
76
+ env: any;
77
+ contextKey: string;
78
+ patch: Partial<StructureContextContent>;
79
+ }): Promise<{
80
+ ok: true;
81
+ data: any;
82
+ } | {
83
+ ok: false;
84
+ error: string;
85
+ }>;
86
+ export declare function structureUploadRowsOutputJsonlStep(params: {
87
+ env: any;
88
+ structureId: string;
89
+ contentBase64: string;
90
+ }): Promise<{
91
+ ok: true;
92
+ data: {
93
+ fileId: string;
94
+ storagePath: string;
95
+ };
96
+ } | {
97
+ ok: false;
98
+ error: string;
99
+ }>;
100
+ export declare function structureLinkRowsOutputFileToContextStep(params: {
101
+ env: any;
102
+ contextKey: string;
103
+ fileId: string;
104
+ }): Promise<{
105
+ ok: true;
106
+ } | {
107
+ ok: false;
108
+ error: string;
109
+ }>;
110
+ export declare function structureUnlinkRowsOutputFileFromContextStep(params: {
111
+ env: any;
112
+ contextKey: string;
113
+ fileId: string;
114
+ }): Promise<{
115
+ ok: true;
116
+ } | {
117
+ ok: false;
118
+ error: string;
119
+ }>;
120
+ export declare function structureGetContextWithRowsOutputFileStep(params: {
121
+ env: any;
122
+ contextKey: string;
123
+ }): Promise<{
124
+ ok: true;
125
+ data: any;
126
+ } | {
127
+ ok: false;
128
+ error: string;
129
+ }>;
130
+ export declare function structureReadRowsOutputJsonlStep(params: {
131
+ env: any;
132
+ structureId: string;
133
+ }): Promise<{
134
+ ok: true;
135
+ data: {
136
+ contentBase64: string;
137
+ };
138
+ } | {
139
+ ok: false;
140
+ error: string;
141
+ }>;
142
+ //# sourceMappingURL=steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steps.d.ts","sourceRoot":"","sources":["../../src/dataset/steps.ts"],"names":[],"mappings":"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"}