agency-lang 0.0.21 → 0.0.23

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 (82) hide show
  1. package/dist/lib/backends/agencyGenerator.d.ts +10 -2
  2. package/dist/lib/backends/agencyGenerator.js +87 -20
  3. package/dist/lib/backends/agencyGenerator.test.js +0 -48
  4. package/dist/lib/backends/baseGenerator.d.ts +11 -4
  5. package/dist/lib/backends/baseGenerator.js +35 -11
  6. package/dist/lib/backends/graphGenerator.js +19 -186
  7. package/dist/lib/backends/typescriptGenerator/builtins.js +6 -0
  8. package/dist/lib/backends/typescriptGenerator.d.ts +11 -3
  9. package/dist/lib/backends/typescriptGenerator.js +98 -26
  10. package/dist/lib/backends/utils.d.ts +1 -1
  11. package/dist/lib/parser.js +5 -5
  12. package/dist/lib/parser.test.js +15 -38
  13. package/dist/lib/parsers/access.test.js +14 -3
  14. package/dist/lib/parsers/assignment.test.js +159 -4
  15. package/dist/lib/parsers/await.d.ts +3 -0
  16. package/dist/lib/parsers/await.js +18 -0
  17. package/dist/lib/parsers/body.test.js +10 -1
  18. package/dist/lib/parsers/dataStructures.js +2 -2
  19. package/dist/lib/parsers/dataStructures.test.js +11 -11
  20. package/dist/lib/parsers/function.d.ts +8 -3
  21. package/dist/lib/parsers/function.js +64 -12
  22. package/dist/lib/parsers/function.test.js +284 -52
  23. package/dist/lib/parsers/functionCall.test.js +6 -6
  24. package/dist/lib/parsers/ifElse.test.d.ts +1 -0
  25. package/dist/lib/parsers/ifElse.test.js +376 -0
  26. package/dist/lib/parsers/importStatement.js +2 -2
  27. package/dist/lib/parsers/literals.d.ts +1 -0
  28. package/dist/lib/parsers/literals.js +6 -2
  29. package/dist/lib/parsers/literals.test.js +110 -21
  30. package/dist/lib/parsers/matchBlock.js +7 -4
  31. package/dist/lib/parsers/matchBlock.test.js +16 -16
  32. package/dist/lib/parsers/newline.d.ts +3 -0
  33. package/dist/lib/parsers/newline.js +2 -0
  34. package/dist/lib/parsers/parserUtils.d.ts +3 -1
  35. package/dist/lib/parsers/parserUtils.js +4 -1
  36. package/dist/lib/parsers/returnStatement.js +2 -1
  37. package/dist/lib/parsers/returnStatement.test.js +2 -2
  38. package/dist/lib/parsers/specialVar.test.js +7 -7
  39. package/dist/lib/parsers/typeHints.d.ts +1 -1
  40. package/dist/lib/parsers/typeHints.js +4 -4
  41. package/dist/lib/parsers/typeHints.test.js +0 -8
  42. package/dist/lib/parsers/utils.d.ts +1 -0
  43. package/dist/lib/parsers/utils.js +2 -1
  44. package/dist/lib/parsers/whileLoop.test.js +46 -1
  45. package/dist/lib/templates/backends/graphGenerator/goToNode.d.ts +2 -1
  46. package/dist/lib/templates/backends/graphGenerator/goToNode.js +11 -1
  47. package/dist/lib/templates/backends/graphGenerator/graphNode.d.ts +2 -2
  48. package/dist/lib/templates/backends/graphGenerator/graphNode.js +2 -1
  49. package/dist/lib/templates/backends/graphGenerator/imports.d.ts +1 -1
  50. package/dist/lib/templates/backends/graphGenerator/imports.js +14 -1
  51. package/dist/lib/templates/backends/typescriptGenerator/builtinFunctions/sleep.d.ts +4 -0
  52. package/dist/lib/templates/backends/typescriptGenerator/builtinFunctions/sleep.js +13 -0
  53. package/dist/lib/templates/backends/typescriptGenerator/builtinFunctions/time.d.ts +7 -0
  54. package/dist/lib/templates/backends/typescriptGenerator/builtinFunctions/time.js +12 -0
  55. package/dist/lib/templates/backends/typescriptGenerator/functionDefinition.d.ts +1 -1
  56. package/dist/lib/templates/backends/typescriptGenerator/functionDefinition.js +1 -0
  57. package/dist/lib/templates/backends/typescriptGenerator/promptFunction.d.ts +1 -1
  58. package/dist/lib/templates/backends/typescriptGenerator/promptFunction.js +3 -2
  59. package/dist/lib/templates/backends/typescriptGenerator/tool.d.ts +1 -1
  60. package/dist/lib/templates/backends/typescriptGenerator/tool.js +1 -1
  61. package/dist/lib/templates/backends/typescriptGenerator/toolCall.d.ts +1 -1
  62. package/dist/lib/templates/backends/typescriptGenerator/toolCall.js +2 -2
  63. package/dist/lib/types/await.d.ts +7 -0
  64. package/dist/lib/types/await.js +1 -0
  65. package/dist/lib/types/graphNode.d.ts +2 -1
  66. package/dist/lib/types/ifElse.d.ts +7 -0
  67. package/dist/lib/types/ifElse.js +1 -0
  68. package/dist/lib/types/literals.d.ts +1 -1
  69. package/dist/lib/types/returnStatement.d.ts +2 -1
  70. package/dist/lib/types/timeBlock.d.ts +5 -0
  71. package/dist/lib/types/timeBlock.js +1 -0
  72. package/dist/lib/types.d.ts +16 -8
  73. package/dist/lib/types.js +1 -0
  74. package/dist/lib/utils.d.ts +1 -0
  75. package/dist/lib/utils.js +3 -0
  76. package/package.json +2 -1
  77. package/dist/lib/parsers/assignment.d.ts +0 -3
  78. package/dist/lib/parsers/assignment.js +0 -8
  79. package/dist/lib/templates/backends/graphGenerator/node.d.ts +0 -7
  80. package/dist/lib/templates/backends/graphGenerator/node.js +0 -18
  81. package/dist/lib/templates/backends/graphGenerator/promptNode.d.ts +0 -8
  82. package/dist/lib/templates/backends/graphGenerator/promptNode.js +0 -16
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from "vitest";
2
- import { functionParser, docStringParser, graphNodeParser } from "./function.js";
2
+ import { functionParser, docStringParser, graphNodeParser, timeBlockParser, } from "./function.js";
3
3
  describe("docStringParser", () => {
4
4
  const testCases = [
5
5
  // Happy path - basic docstrings
@@ -175,6 +175,9 @@ describe("functionParser", () => {
175
175
  variableName: "x",
176
176
  value: { type: "number", value: "5" },
177
177
  },
178
+ {
179
+ type: "newLine",
180
+ },
178
181
  {
179
182
  type: "assignment",
180
183
  variableName: "y",
@@ -254,11 +257,17 @@ describe("functionParser", () => {
254
257
  variableName: "x",
255
258
  value: { type: "number", value: "5" },
256
259
  },
260
+ {
261
+ type: "newLine",
262
+ },
257
263
  {
258
264
  type: "assignment",
259
265
  variableName: "y",
260
266
  value: { type: "number", value: "10" },
261
267
  },
268
+ {
269
+ type: "newLine",
270
+ },
262
271
  ],
263
272
  },
264
273
  },
@@ -333,6 +342,9 @@ describe("functionParser", () => {
333
342
  segments: [{ type: "text", value: "say hello" }],
334
343
  },
335
344
  },
345
+ {
346
+ type: "newLine",
347
+ },
336
348
  ],
337
349
  },
338
350
  },
@@ -356,6 +368,9 @@ describe("functionParser", () => {
356
368
  variableName: "x",
357
369
  value: { type: "number", value: "5" },
358
370
  },
371
+ {
372
+ type: "newLine",
373
+ },
359
374
  {
360
375
  type: "assignment",
361
376
  variableName: "y",
@@ -401,6 +416,9 @@ describe("functionParser", () => {
401
416
  variableName: "x",
402
417
  value: { type: "number", value: "5" },
403
418
  },
419
+ {
420
+ type: "newLine",
421
+ },
404
422
  ],
405
423
  },
406
424
  },
@@ -494,6 +512,9 @@ describe("functionParser", () => {
494
512
  variableName: "result",
495
513
  value: { type: "number", value: "42" },
496
514
  },
515
+ {
516
+ type: "newLine",
517
+ },
497
518
  {
498
519
  type: "variableName",
499
520
  value: "result",
@@ -572,43 +593,6 @@ describe("functionParser", () => {
572
593
  },
573
594
  },
574
595
  },
575
- {
576
- input: 'def greet(name, greeting) {\n """Greets someone with a custom greeting"""\n result = `${greeting} ${name}`\n result\n}',
577
- expected: {
578
- success: true,
579
- result: {
580
- type: "function",
581
- functionName: "greet",
582
- parameters: [
583
- { type: "functionParameter", name: "name" },
584
- { type: "functionParameter", name: "greeting" },
585
- ],
586
- returnType: null,
587
- docString: {
588
- type: "docString",
589
- value: "Greets someone with a custom greeting",
590
- },
591
- body: [
592
- {
593
- type: "assignment",
594
- variableName: "result",
595
- value: {
596
- type: "prompt",
597
- segments: [
598
- { type: "interpolation", variableName: "greeting" },
599
- { type: "text", value: " " },
600
- { type: "interpolation", variableName: "name" },
601
- ],
602
- },
603
- },
604
- {
605
- type: "variableName",
606
- value: "result",
607
- },
608
- ],
609
- },
610
- },
611
- },
612
596
  // Functions with single parameter with type hint
613
597
  {
614
598
  input: "def add(x: number) { x }",
@@ -1112,7 +1096,7 @@ describe("functionParser", () => {
1112
1096
  type: "docString",
1113
1097
  value: "Adds two numbers",
1114
1098
  },
1115
- body: [{ type: "variableName", value: "x" }],
1099
+ body: [{ type: "variableName", value: "x" }, { type: "newLine" }],
1116
1100
  },
1117
1101
  },
1118
1102
  },
@@ -1135,7 +1119,7 @@ describe("functionParser", () => {
1135
1119
  type: "docString",
1136
1120
  value: "Greets a person by name",
1137
1121
  },
1138
- body: [{ type: "variableName", value: "name" }],
1122
+ body: [{ type: "variableName", value: "name" }, { type: "newLine" }],
1139
1123
  },
1140
1124
  },
1141
1125
  },
@@ -1159,7 +1143,7 @@ describe("functionParser", () => {
1159
1143
  type: "docString",
1160
1144
  value: "Mix of typed and untyped params",
1161
1145
  },
1162
- body: [{ type: "variableName", value: "typed" }],
1146
+ body: [{ type: "variableName", value: "typed" }, { type: "newLine" }],
1163
1147
  },
1164
1148
  },
1165
1149
  },
@@ -1502,7 +1486,7 @@ describe("functionParser", () => {
1502
1486
  type: "docString",
1503
1487
  value: "Adds two numbers",
1504
1488
  },
1505
- body: [{ type: "variableName", value: "x" }],
1489
+ body: [{ type: "variableName", value: "x" }, { type: "newLine" }],
1506
1490
  },
1507
1491
  },
1508
1492
  },
@@ -1525,7 +1509,7 @@ describe("functionParser", () => {
1525
1509
  type: "docString",
1526
1510
  value: "Greets a person",
1527
1511
  },
1528
- body: [{ type: "variableName", value: "name" }],
1512
+ body: [{ type: "variableName", value: "name" }, { type: "newLine" }],
1529
1513
  },
1530
1514
  },
1531
1515
  },
@@ -1668,6 +1652,248 @@ describe("functionParser", () => {
1668
1652
  }
1669
1653
  });
1670
1654
  });
1655
+ describe("timeBlockParser", () => {
1656
+ const testCases = [
1657
+ // Happy path - basic time blocks
1658
+ {
1659
+ input: "time {\n x = 1\n}",
1660
+ expected: {
1661
+ success: true,
1662
+ result: {
1663
+ type: "timeBlock",
1664
+ body: [
1665
+ {
1666
+ type: "assignment",
1667
+ variableName: "x",
1668
+ value: { type: "number", value: "1" },
1669
+ },
1670
+ {
1671
+ type: "newLine",
1672
+ },
1673
+ ],
1674
+ },
1675
+ },
1676
+ },
1677
+ {
1678
+ input: "time {\n foo = `hello`\n}",
1679
+ expected: {
1680
+ success: true,
1681
+ result: {
1682
+ type: "timeBlock",
1683
+ body: [
1684
+ {
1685
+ type: "assignment",
1686
+ variableName: "foo",
1687
+ value: {
1688
+ type: "prompt",
1689
+ segments: [{ type: "text", value: "hello" }],
1690
+ },
1691
+ },
1692
+ {
1693
+ type: "newLine",
1694
+ },
1695
+ ],
1696
+ },
1697
+ },
1698
+ },
1699
+ // Multiple statements in body
1700
+ {
1701
+ input: "time {\n a = 1\n b = 2\n c = 3\n}",
1702
+ expected: {
1703
+ success: true,
1704
+ result: {
1705
+ type: "timeBlock",
1706
+ body: [
1707
+ {
1708
+ type: "assignment",
1709
+ variableName: "a",
1710
+ value: { type: "number", value: "1" },
1711
+ },
1712
+ {
1713
+ type: "newLine",
1714
+ },
1715
+ {
1716
+ type: "assignment",
1717
+ variableName: "b",
1718
+ value: { type: "number", value: "2" },
1719
+ },
1720
+ {
1721
+ type: "newLine",
1722
+ },
1723
+ {
1724
+ type: "assignment",
1725
+ variableName: "c",
1726
+ value: { type: "number", value: "3" },
1727
+ },
1728
+ {
1729
+ type: "newLine",
1730
+ },
1731
+ ],
1732
+ },
1733
+ },
1734
+ },
1735
+ // Empty body
1736
+ {
1737
+ input: "time {\n}",
1738
+ expected: {
1739
+ success: true,
1740
+ result: {
1741
+ type: "timeBlock",
1742
+ body: [],
1743
+ },
1744
+ },
1745
+ },
1746
+ // Whitespace variations
1747
+ {
1748
+ input: "time{\n x = 1\n}",
1749
+ expected: {
1750
+ success: true,
1751
+ result: {
1752
+ type: "timeBlock",
1753
+ body: [
1754
+ {
1755
+ type: "assignment",
1756
+ variableName: "x",
1757
+ value: { type: "number", value: "1" },
1758
+ },
1759
+ {
1760
+ type: "newLine",
1761
+ },
1762
+ ],
1763
+ },
1764
+ },
1765
+ },
1766
+ {
1767
+ input: "time { \n x = 1\n }",
1768
+ expected: {
1769
+ success: true,
1770
+ result: {
1771
+ type: "timeBlock",
1772
+ body: [
1773
+ {
1774
+ type: "assignment",
1775
+ variableName: "x",
1776
+ value: { type: "number", value: "1" },
1777
+ },
1778
+ {
1779
+ type: "newLine",
1780
+ },
1781
+ ],
1782
+ },
1783
+ },
1784
+ },
1785
+ // Function calls in body
1786
+ {
1787
+ input: "time {\n result = doSomething()\n}",
1788
+ expected: {
1789
+ success: true,
1790
+ result: {
1791
+ type: "timeBlock",
1792
+ body: [
1793
+ {
1794
+ type: "assignment",
1795
+ variableName: "result",
1796
+ value: {
1797
+ type: "functionCall",
1798
+ functionName: "doSomething",
1799
+ arguments: [],
1800
+ },
1801
+ },
1802
+ {
1803
+ type: "newLine",
1804
+ },
1805
+ ],
1806
+ },
1807
+ },
1808
+ },
1809
+ // Complex body with different statement types
1810
+ {
1811
+ input: "time {\n x = 1\n y = `prompt`\n z = foo()\n}",
1812
+ expected: {
1813
+ success: true,
1814
+ result: {
1815
+ type: "timeBlock",
1816
+ body: [
1817
+ {
1818
+ type: "assignment",
1819
+ variableName: "x",
1820
+ value: { type: "number", value: "1" },
1821
+ },
1822
+ {
1823
+ type: "newLine",
1824
+ },
1825
+ {
1826
+ type: "assignment",
1827
+ variableName: "y",
1828
+ value: {
1829
+ type: "prompt",
1830
+ segments: [{ type: "text", value: "prompt" }],
1831
+ },
1832
+ },
1833
+ {
1834
+ type: "newLine",
1835
+ },
1836
+ {
1837
+ type: "assignment",
1838
+ variableName: "z",
1839
+ value: {
1840
+ type: "functionCall",
1841
+ functionName: "foo",
1842
+ arguments: [],
1843
+ },
1844
+ },
1845
+ {
1846
+ type: "newLine",
1847
+ },
1848
+ ],
1849
+ },
1850
+ },
1851
+ },
1852
+ // Failure cases - missing braces
1853
+ {
1854
+ input: "time \n x = 1\n",
1855
+ expected: { success: false },
1856
+ },
1857
+ {
1858
+ input: "time {\n x = 1",
1859
+ expected: { success: false },
1860
+ },
1861
+ {
1862
+ input: "time \n x = 1\n}",
1863
+ expected: { success: false },
1864
+ },
1865
+ // Failure cases - empty or malformed
1866
+ {
1867
+ input: "",
1868
+ expected: { success: false },
1869
+ },
1870
+ {
1871
+ input: "time",
1872
+ expected: { success: false },
1873
+ },
1874
+ {
1875
+ input: "time {",
1876
+ expected: { success: false },
1877
+ },
1878
+ ];
1879
+ testCases.forEach(({ input, expected }) => {
1880
+ if (expected.success) {
1881
+ it(`should parse "${input.replace(/\n/g, "\\n")}" successfully`, () => {
1882
+ const result = timeBlockParser(input);
1883
+ expect(result.success).toBe(true);
1884
+ if (result.success) {
1885
+ expect(result.result).toEqual(expected.result);
1886
+ }
1887
+ });
1888
+ }
1889
+ else {
1890
+ it(`should fail to parse "${input.replace(/\n/g, "\\n")}"`, () => {
1891
+ const result = timeBlockParser(input);
1892
+ expect(result.success).toBe(false);
1893
+ });
1894
+ }
1895
+ });
1896
+ });
1671
1897
  describe("graphNodeParser", () => {
1672
1898
  const testCases = [
1673
1899
  // Basic graph nodes without return types
@@ -1733,7 +1959,7 @@ describe("graphNodeParser", () => {
1733
1959
  result: {
1734
1960
  type: "graphNode",
1735
1961
  nodeName: "process",
1736
- parameters: ["input"],
1962
+ parameters: [{ type: "functionParameter", name: "input" }],
1737
1963
  returnType: null,
1738
1964
  body: [
1739
1965
  {
@@ -1752,7 +1978,10 @@ describe("graphNodeParser", () => {
1752
1978
  result: {
1753
1979
  type: "graphNode",
1754
1980
  nodeName: "calculate",
1755
- parameters: ["a", "b"],
1981
+ parameters: [
1982
+ { type: "functionParameter", name: "a" },
1983
+ { type: "functionParameter", name: "b" },
1984
+ ],
1756
1985
  returnType: null,
1757
1986
  body: [
1758
1987
  {
@@ -1812,7 +2041,10 @@ describe("graphNodeParser", () => {
1812
2041
  result: {
1813
2042
  type: "graphNode",
1814
2043
  nodeName: "add",
1815
- parameters: ["x", "y"],
2044
+ parameters: [
2045
+ { type: "functionParameter", name: "x" },
2046
+ { type: "functionParameter", name: "y" },
2047
+ ],
1816
2048
  returnType: { type: "primitiveType", value: "number" },
1817
2049
  body: [
1818
2050
  {
@@ -1831,7 +2063,7 @@ describe("graphNodeParser", () => {
1831
2063
  result: {
1832
2064
  type: "graphNode",
1833
2065
  nodeName: "greet",
1834
- parameters: ["name"],
2066
+ parameters: [{ type: "functionParameter", name: "name" }],
1835
2067
  returnType: { type: "primitiveType", value: "string" },
1836
2068
  body: [
1837
2069
  {
@@ -1853,7 +2085,7 @@ describe("graphNodeParser", () => {
1853
2085
  result: {
1854
2086
  type: "graphNode",
1855
2087
  nodeName: "process",
1856
- parameters: ["input"],
2088
+ parameters: [{ type: "functionParameter", name: "input" }],
1857
2089
  returnType: { type: "primitiveType", value: "boolean" },
1858
2090
  body: [{ type: "variableName", value: "result" }],
1859
2091
  },
@@ -1899,7 +2131,7 @@ describe("graphNodeParser", () => {
1899
2131
  result: {
1900
2132
  type: "graphNode",
1901
2133
  nodeName: "processArray",
1902
- parameters: ["items"],
2134
+ parameters: [{ type: "functionParameter", name: "items" }],
1903
2135
  returnType: {
1904
2136
  type: "arrayType",
1905
2137
  elementType: { type: "primitiveType", value: "number" },
@@ -1935,7 +2167,7 @@ describe("graphNodeParser", () => {
1935
2167
  result: {
1936
2168
  type: "graphNode",
1937
2169
  nodeName: "flexible",
1938
- parameters: ["x"],
2170
+ parameters: [{ type: "functionParameter", name: "x" }],
1939
2171
  returnType: {
1940
2172
  type: "unionType",
1941
2173
  types: [
@@ -1982,7 +2214,7 @@ describe("graphNodeParser", () => {
1982
2214
  result: {
1983
2215
  type: "graphNode",
1984
2216
  nodeName: "baz",
1985
- parameters: ["x"],
2217
+ parameters: [{ type: "functionParameter", name: "x" }],
1986
2218
  returnType: { type: "primitiveType", value: "number" },
1987
2219
  body: [{ type: "variableName", value: "x" }],
1988
2220
  },
@@ -2009,7 +2241,7 @@ describe("graphNodeParser", () => {
2009
2241
  result: {
2010
2242
  type: "graphNode",
2011
2243
  nodeName: "getData",
2012
- parameters: ["id"],
2244
+ parameters: [{ type: "functionParameter", name: "id" }],
2013
2245
  returnType: { type: "typeAliasVariable", aliasName: "UserData" },
2014
2246
  body: [{ type: "variableName", value: "data" }],
2015
2247
  },
@@ -152,8 +152,8 @@ describe("functionCallParser", () => {
152
152
  {
153
153
  type: "agencyArray",
154
154
  items: [
155
- { type: "string", value: "hello" },
156
- { type: "string", value: "world" },
155
+ { type: "string", segments: [{ type: "text", value: "hello" }] },
156
+ { type: "string", segments: [{ type: "text", value: "world" }] },
157
157
  ],
158
158
  },
159
159
  ],
@@ -221,7 +221,7 @@ describe("functionCallParser", () => {
221
221
  entries: [
222
222
  {
223
223
  key: "key",
224
- value: { type: "string", value: "value" },
224
+ value: { type: "string", segments: [{ type: "text", value: "value" }] },
225
225
  },
226
226
  ],
227
227
  },
@@ -242,7 +242,7 @@ describe("functionCallParser", () => {
242
242
  entries: [
243
243
  {
244
244
  key: "name",
245
- value: { type: "string", value: "Alice" },
245
+ value: { type: "string", segments: [{ type: "text", value: "Alice" }] },
246
246
  },
247
247
  {
248
248
  key: "age",
@@ -349,7 +349,7 @@ describe("functionCallParser", () => {
349
349
  entries: [
350
350
  {
351
351
  key: "key",
352
- value: { type: "string", value: "value" },
352
+ value: { type: "string", segments: [{ type: "text", value: "value" }] },
353
353
  },
354
354
  ],
355
355
  },
@@ -365,7 +365,7 @@ describe("functionCallParser", () => {
365
365
  type: "functionCall",
366
366
  functionName: "complexCall",
367
367
  arguments: [
368
- { type: "string", value: "test" },
368
+ { type: "string", segments: [{ type: "text", value: "test" }] },
369
369
  {
370
370
  type: "agencyArray",
371
371
  items: [],
@@ -0,0 +1 @@
1
+ export {};