@vedangiitb/qwintly-core 1.4.13 → 1.5.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.
@@ -1 +1 @@
1
- {"version":3,"file":"plannerTaskParser.d.ts","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/plannerTaskParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEnE,eAAO,MAAM,iBAAiB;;;iBAG5B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;kBAA6B,CAAC;AAQ7D,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,EAAE,CAEtE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAgBjE"}
1
+ {"version":3,"file":"plannerTaskParser.d.ts","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/plannerTaskParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEnE,eAAO,MAAM,iBAAiB;;;iBAG5B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;kBAA6B,CAAC;AAQ7D,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,EAAE,CAMtE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAgBjE"}
@@ -10,7 +10,11 @@ function stripCodeFences(input) {
10
10
  return withoutStart.replace(/```$/i, "").trim();
11
11
  }
12
12
  export function parsePlannerTasksUnknown(value) {
13
- return PlannerTasksSchema.parse(value);
13
+ let arrayValue = value;
14
+ if (Array.isArray(value)) {
15
+ arrayValue = value.slice(0, 15);
16
+ }
17
+ return PlannerTasksSchema.parse(arrayValue);
14
18
  }
15
19
  export function parsePlannerTasksJson(text) {
16
20
  const cleaned = stripCodeFences(text);
@@ -1 +1 @@
1
- {"version":3,"file":"plannerTaskParser.js","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/plannerTaskParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;AAE7D,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IAC9D,OAAO,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,OAAO,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAkB,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,8DAA8D,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACtF,CAAC;IACJ,CAAC;IAED,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["import { z } from \"zod\";\nimport { PlannerTask } from \"../../../types/plannerTasks.types.js\";\n\nexport const PlannerTaskSchema = z.object({\n description: z.string().min(1),\n targets: z.array(z.string().min(1)),\n});\n\nexport const PlannerTasksSchema = z.array(PlannerTaskSchema);\n\nfunction stripCodeFences(input: string) {\n const trimmed = (input ?? \"\").trim();\n const withoutStart = trimmed.replace(/^```(?:json)?\\s*/i, \"\");\n return withoutStart.replace(/```$/i, \"\").trim();\n}\n\nexport function parsePlannerTasksUnknown(value: unknown): PlannerTask[] {\n return PlannerTasksSchema.parse(value) as PlannerTask[];\n}\n\nexport function parsePlannerTasksJson(text: string): PlannerTask[] {\n const cleaned = stripCodeFences(text);\n if (!cleaned) {\n throw new Error(\"Planner tasks parse failed: empty response text.\");\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(cleaned);\n } catch (err) {\n throw new Error(\n `Planner tasks parse failed: invalid JSON. First 200 chars: ${cleaned.slice(0, 200)}`,\n );\n }\n\n return parsePlannerTasksUnknown(parsed);\n}\n"]}
1
+ {"version":3,"file":"plannerTaskParser.js","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/plannerTaskParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;AAE7D,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IAC9D,OAAO,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAkB,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,8DAA8D,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACtF,CAAC;IACJ,CAAC;IAED,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["import { z } from \"zod\";\nimport { PlannerTask } from \"../../../types/plannerTasks.types.js\";\n\nexport const PlannerTaskSchema = z.object({\n description: z.string().min(1),\n targets: z.array(z.string().min(1)),\n});\n\nexport const PlannerTasksSchema = z.array(PlannerTaskSchema);\n\nfunction stripCodeFences(input: string) {\n const trimmed = (input ?? \"\").trim();\n const withoutStart = trimmed.replace(/^```(?:json)?\\s*/i, \"\");\n return withoutStart.replace(/```$/i, \"\").trim();\n}\n\nexport function parsePlannerTasksUnknown(value: unknown): PlannerTask[] {\n let arrayValue = value;\n if (Array.isArray(value)) {\n arrayValue = value.slice(0, 15);\n }\n return PlannerTasksSchema.parse(arrayValue) as PlannerTask[];\n}\n\nexport function parsePlannerTasksJson(text: string): PlannerTask[] {\n const cleaned = stripCodeFences(text);\n if (!cleaned) {\n throw new Error(\"Planner tasks parse failed: empty response text.\");\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(cleaned);\n } catch (err) {\n throw new Error(\n `Planner tasks parse failed: invalid JSON. First 200 chars: ${cleaned.slice(0, 200)}`,\n );\n }\n\n return parsePlannerTasksUnknown(parsed);\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plannerTaskParser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plannerTaskParser.test.d.ts","sourceRoot":"","sources":["../../src/tests/plannerTaskParser.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import { parsePlannerTasksUnknown, parsePlannerTasksJson } from "../ai/toolLoop/helpers/plannerTaskParser.js";
4
+ test("plannerTaskParser: parses less than 15 tasks successfully", () => {
5
+ const tasks = Array.from({ length: 5 }, (_, i) => ({
6
+ description: `Task ${i + 1}`,
7
+ targets: [`target-${i + 1}`],
8
+ }));
9
+ const parsed = parsePlannerTasksUnknown(tasks);
10
+ assert.equal(parsed.length, 5);
11
+ assert.equal(parsed[0]?.description, "Task 1");
12
+ assert.deepEqual(parsed[0]?.targets, ["target-1"]);
13
+ });
14
+ test("plannerTaskParser: limits to max 15 tasks and ignores rest without throwing", () => {
15
+ const tasks = Array.from({ length: 25 }, (_, i) => ({
16
+ description: `Task ${i + 1}`,
17
+ targets: [`target-${i + 1}`],
18
+ }));
19
+ const parsed = parsePlannerTasksUnknown(tasks);
20
+ assert.equal(parsed.length, 15);
21
+ assert.equal(parsed[0]?.description, "Task 1");
22
+ assert.equal(parsed[14]?.description, "Task 15");
23
+ });
24
+ test("plannerTaskParser: invalid tasks past index 15 are ignored and don't throw", () => {
25
+ const tasks = Array.from({ length: 15 }, (_, i) => ({
26
+ description: `Task ${i + 1}`,
27
+ targets: [`target-${i + 1}`],
28
+ }));
29
+ // Append invalid tasks at the end
30
+ tasks.push({ description: "", targets: [] }); // invalid: empty description & target min length
31
+ tasks.push({ description: 123, targets: "not-an-array" }); // completely invalid
32
+ tasks.push("not-even-an-object");
33
+ const parsed = parsePlannerTasksUnknown(tasks);
34
+ assert.equal(parsed.length, 15);
35
+ assert.equal(parsed[0]?.description, "Task 1");
36
+ assert.equal(parsed[14]?.description, "Task 15");
37
+ });
38
+ test("plannerTaskParser: parsePlannerTasksJson handles JSON with more than 15 tasks", () => {
39
+ const tasks = Array.from({ length: 20 }, (_, i) => ({
40
+ description: `Task ${i + 1}`,
41
+ targets: [`target-${i + 1}`],
42
+ }));
43
+ const jsonString = JSON.stringify(tasks);
44
+ const parsed = parsePlannerTasksJson(jsonString);
45
+ assert.equal(parsed.length, 15);
46
+ assert.equal(parsed[0]?.description, "Task 1");
47
+ assert.equal(parsed[14]?.description, "Task 15");
48
+ });
49
+ //# sourceMappingURL=plannerTaskParser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plannerTaskParser.test.js","sourceRoot":"","sources":["../../src/tests/plannerTaskParser.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AAE9G,IAAI,CAAC,2DAA2D,EAAE,GAAG,EAAE;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACjD,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;QAC5B,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;KAC7B,CAAC,CAAC,CAAC;IAEJ,MAAM,MAAM,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6EAA6E,EAAE,GAAG,EAAE;IACvF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;QAC5B,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;KAC7B,CAAC,CAAC,CAAC;IAEJ,MAAM,MAAM,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4EAA4E,EAAE,GAAG,EAAE;IACtF,MAAM,KAAK,GAAU,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACzD,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;QAC5B,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;KAC7B,CAAC,CAAC,CAAC;IAEJ,kCAAkC;IAClC,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,iDAAiD;IAC/F,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,qBAAqB;IAChF,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAEjC,MAAM,MAAM,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+EAA+E,EAAE,GAAG,EAAE;IACzF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;QAC5B,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;KAC7B,CAAC,CAAC,CAAC;IAEJ,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC","sourcesContent":["import assert from \"node:assert/strict\";\nimport test from \"node:test\";\nimport { parsePlannerTasksUnknown, parsePlannerTasksJson } from \"../ai/toolLoop/helpers/plannerTaskParser.js\";\n\ntest(\"plannerTaskParser: parses less than 15 tasks successfully\", () => {\n const tasks = Array.from({ length: 5 }, (_, i) => ({\n description: `Task ${i + 1}`,\n targets: [`target-${i + 1}`],\n }));\n\n const parsed = parsePlannerTasksUnknown(tasks);\n assert.equal(parsed.length, 5);\n assert.equal(parsed[0]?.description, \"Task 1\");\n assert.deepEqual(parsed[0]?.targets, [\"target-1\"]);\n});\n\ntest(\"plannerTaskParser: limits to max 15 tasks and ignores rest without throwing\", () => {\n const tasks = Array.from({ length: 25 }, (_, i) => ({\n description: `Task ${i + 1}`,\n targets: [`target-${i + 1}`],\n }));\n\n const parsed = parsePlannerTasksUnknown(tasks);\n assert.equal(parsed.length, 15);\n assert.equal(parsed[0]?.description, \"Task 1\");\n assert.equal(parsed[14]?.description, \"Task 15\");\n});\n\ntest(\"plannerTaskParser: invalid tasks past index 15 are ignored and don't throw\", () => {\n const tasks: any[] = Array.from({ length: 15 }, (_, i) => ({\n description: `Task ${i + 1}`,\n targets: [`target-${i + 1}`],\n }));\n\n // Append invalid tasks at the end\n tasks.push({ description: \"\", targets: [] }); // invalid: empty description & target min length\n tasks.push({ description: 123, targets: \"not-an-array\" }); // completely invalid\n tasks.push(\"not-even-an-object\");\n\n const parsed = parsePlannerTasksUnknown(tasks);\n assert.equal(parsed.length, 15);\n assert.equal(parsed[0]?.description, \"Task 1\");\n assert.equal(parsed[14]?.description, \"Task 15\");\n});\n\ntest(\"plannerTaskParser: parsePlannerTasksJson handles JSON with more than 15 tasks\", () => {\n const tasks = Array.from({ length: 20 }, (_, i) => ({\n description: `Task ${i + 1}`,\n targets: [`target-${i + 1}`],\n }));\n\n const jsonString = JSON.stringify(tasks);\n const parsed = parsePlannerTasksJson(jsonString);\n assert.equal(parsed.length, 15);\n assert.equal(parsed[0]?.description, \"Task 1\");\n assert.equal(parsed[14]?.description, \"Task 15\");\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vedangiitb/qwintly-core",
3
- "version": "1.4.13",
3
+ "version": "1.5.0",
4
4
  "description": "Qwintly Core",
5
5
  "homepage": "https://github.com/vedangiitb/qwintly-core#readme",
6
6
  "bugs": {