@cotrrackpro-dev/sdk 0.1.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 (233) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/LICENSE +21 -0
  3. package/README.md +111 -0
  4. package/dist/assistant/compliance.d.ts +24 -0
  5. package/dist/assistant/compliance.js +60 -0
  6. package/dist/assistant/compliance.js.map +1 -0
  7. package/dist/assistant/crisis.d.ts +31 -0
  8. package/dist/assistant/crisis.js +62 -0
  9. package/dist/assistant/crisis.js.map +1 -0
  10. package/dist/assistant/index.d.ts +15 -0
  11. package/dist/assistant/index.js +16 -0
  12. package/dist/assistant/index.js.map +1 -0
  13. package/dist/assistant/levels.d.ts +43 -0
  14. package/dist/assistant/levels.js +102 -0
  15. package/dist/assistant/levels.js.map +1 -0
  16. package/dist/assistant/prompt.d.ts +20 -0
  17. package/dist/assistant/prompt.js +96 -0
  18. package/dist/assistant/prompt.js.map +1 -0
  19. package/dist/assistant/rbac.d.ts +45 -0
  20. package/dist/assistant/rbac.js +75 -0
  21. package/dist/assistant/rbac.js.map +1 -0
  22. package/dist/assistant/readability.d.ts +28 -0
  23. package/dist/assistant/readability.js +70 -0
  24. package/dist/assistant/readability.js.map +1 -0
  25. package/dist/auth/broker.d.ts +32 -0
  26. package/dist/auth/broker.js +48 -0
  27. package/dist/auth/broker.js.map +1 -0
  28. package/dist/auth/deviceFlow.d.ts +26 -0
  29. package/dist/auth/deviceFlow.js +65 -0
  30. package/dist/auth/deviceFlow.js.map +1 -0
  31. package/dist/auth/provider.d.ts +32 -0
  32. package/dist/auth/provider.js +29 -0
  33. package/dist/auth/provider.js.map +1 -0
  34. package/dist/community/badges.d.ts +19 -0
  35. package/dist/community/badges.js +19 -0
  36. package/dist/community/badges.js.map +1 -0
  37. package/dist/community/events.d.ts +30 -0
  38. package/dist/community/events.js +31 -0
  39. package/dist/community/events.js.map +1 -0
  40. package/dist/community/identity.d.ts +28 -0
  41. package/dist/community/identity.js +2 -0
  42. package/dist/community/identity.js.map +1 -0
  43. package/dist/community/index.d.ts +7 -0
  44. package/dist/community/index.js +8 -0
  45. package/dist/community/index.js.map +1 -0
  46. package/dist/community/org.d.ts +46 -0
  47. package/dist/community/org.js +32 -0
  48. package/dist/community/org.js.map +1 -0
  49. package/dist/community/tiers.d.ts +8 -0
  50. package/dist/community/tiers.js +40 -0
  51. package/dist/community/tiers.js.map +1 -0
  52. package/dist/community/types.d.ts +26 -0
  53. package/dist/community/types.js +2 -0
  54. package/dist/community/types.js.map +1 -0
  55. package/dist/core/config.d.ts +22 -0
  56. package/dist/core/config.js +27 -0
  57. package/dist/core/config.js.map +1 -0
  58. package/dist/core/errors.d.ts +29 -0
  59. package/dist/core/errors.js +20 -0
  60. package/dist/core/errors.js.map +1 -0
  61. package/dist/core/transport.d.ts +45 -0
  62. package/dist/core/transport.js +109 -0
  63. package/dist/core/transport.js.map +1 -0
  64. package/dist/diagram/core.d.ts +11 -0
  65. package/dist/diagram/core.js +12 -0
  66. package/dist/diagram/core.js.map +1 -0
  67. package/dist/diagram/extract.d.ts +17 -0
  68. package/dist/diagram/extract.js +213 -0
  69. package/dist/diagram/extract.js.map +1 -0
  70. package/dist/diagram/index.d.ts +2 -0
  71. package/dist/diagram/index.js +3 -0
  72. package/dist/diagram/index.js.map +1 -0
  73. package/dist/diagram/mermaid.d.ts +10 -0
  74. package/dist/diagram/mermaid.js +50 -0
  75. package/dist/diagram/mermaid.js.map +1 -0
  76. package/dist/diagram/prompt.d.ts +4 -0
  77. package/dist/diagram/prompt.js +16 -0
  78. package/dist/diagram/prompt.js.map +1 -0
  79. package/dist/diagram/types.d.ts +33 -0
  80. package/dist/diagram/types.js +2 -0
  81. package/dist/diagram/types.js.map +1 -0
  82. package/dist/diagram/validate.d.ts +13 -0
  83. package/dist/diagram/validate.js +48 -0
  84. package/dist/diagram/validate.js.map +1 -0
  85. package/dist/guide/compose.d.ts +10 -0
  86. package/dist/guide/compose.js +31 -0
  87. package/dist/guide/compose.js.map +1 -0
  88. package/dist/guide/core.d.ts +10 -0
  89. package/dist/guide/core.js +11 -0
  90. package/dist/guide/core.js.map +1 -0
  91. package/dist/guide/index.d.ts +2 -0
  92. package/dist/guide/index.js +3 -0
  93. package/dist/guide/index.js.map +1 -0
  94. package/dist/guide/prompt.d.ts +8 -0
  95. package/dist/guide/prompt.js +20 -0
  96. package/dist/guide/prompt.js.map +1 -0
  97. package/dist/guide/render.d.ts +9 -0
  98. package/dist/guide/render.js +180 -0
  99. package/dist/guide/render.js.map +1 -0
  100. package/dist/guide/types.d.ts +67 -0
  101. package/dist/guide/types.js +2 -0
  102. package/dist/guide/types.js.map +1 -0
  103. package/dist/index.d.ts +18 -0
  104. package/dist/index.js +19 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/mcp/artifacts.generated.d.ts +19 -0
  107. package/dist/mcp/artifacts.generated.js +140 -0
  108. package/dist/mcp/artifacts.generated.js.map +1 -0
  109. package/dist/mcp/format.d.ts +10 -0
  110. package/dist/mcp/format.js +17 -0
  111. package/dist/mcp/format.js.map +1 -0
  112. package/dist/mcp/index.d.ts +12 -0
  113. package/dist/mcp/index.js +18 -0
  114. package/dist/mcp/index.js.map +1 -0
  115. package/dist/mcp/knowledge.generated.d.ts +11 -0
  116. package/dist/mcp/knowledge.generated.js +12 -0
  117. package/dist/mcp/knowledge.generated.js.map +1 -0
  118. package/dist/mcp/prompt-modules.generated.d.ts +12 -0
  119. package/dist/mcp/prompt-modules.generated.js +19 -0
  120. package/dist/mcp/prompt-modules.generated.js.map +1 -0
  121. package/dist/mcp/roles.generated.d.ts +15 -0
  122. package/dist/mcp/roles.generated.js +25 -0
  123. package/dist/mcp/roles.generated.js.map +1 -0
  124. package/dist/mcp/safety.d.ts +35 -0
  125. package/dist/mcp/safety.js +76 -0
  126. package/dist/mcp/safety.js.map +1 -0
  127. package/dist/mcp/scenarios.generated.d.ts +13 -0
  128. package/dist/mcp/scenarios.generated.js +16 -0
  129. package/dist/mcp/scenarios.generated.js.map +1 -0
  130. package/dist/mcp/search.d.ts +13 -0
  131. package/dist/mcp/search.js +33 -0
  132. package/dist/mcp/search.js.map +1 -0
  133. package/dist/mcp/skills.generated.d.ts +17 -0
  134. package/dist/mcp/skills.generated.js +40 -0
  135. package/dist/mcp/skills.generated.js.map +1 -0
  136. package/dist/mcp/toolset.d.ts +31 -0
  137. package/dist/mcp/toolset.js +54 -0
  138. package/dist/mcp/toolset.js.map +1 -0
  139. package/dist/mcp/types.d.ts +96 -0
  140. package/dist/mcp/types.js +9 -0
  141. package/dist/mcp/types.js.map +1 -0
  142. package/dist/mcp/workflows.generated.d.ts +17 -0
  143. package/dist/mcp/workflows.generated.js +12 -0
  144. package/dist/mcp/workflows.generated.js.map +1 -0
  145. package/dist/nocode/core.d.ts +12 -0
  146. package/dist/nocode/core.js +13 -0
  147. package/dist/nocode/core.js.map +1 -0
  148. package/dist/nocode/examples.d.ts +28 -0
  149. package/dist/nocode/examples.js +218 -0
  150. package/dist/nocode/examples.js.map +1 -0
  151. package/dist/nocode/index.d.ts +2 -0
  152. package/dist/nocode/index.js +3 -0
  153. package/dist/nocode/index.js.map +1 -0
  154. package/dist/nocode/mermaid.d.ts +9 -0
  155. package/dist/nocode/mermaid.js +33 -0
  156. package/dist/nocode/mermaid.js.map +1 -0
  157. package/dist/nocode/prompt.d.ts +8 -0
  158. package/dist/nocode/prompt.js +46 -0
  159. package/dist/nocode/prompt.js.map +1 -0
  160. package/dist/nocode/runtime.d.ts +28 -0
  161. package/dist/nocode/runtime.js +113 -0
  162. package/dist/nocode/runtime.js.map +1 -0
  163. package/dist/nocode/simpleOps.d.ts +16 -0
  164. package/dist/nocode/simpleOps.js +137 -0
  165. package/dist/nocode/simpleOps.js.map +1 -0
  166. package/dist/nocode/types.d.ts +72 -0
  167. package/dist/nocode/types.js +12 -0
  168. package/dist/nocode/types.js.map +1 -0
  169. package/dist/nocode/validate.d.ts +17 -0
  170. package/dist/nocode/validate.js +136 -0
  171. package/dist/nocode/validate.js.map +1 -0
  172. package/dist/params/codegen.d.ts +8 -0
  173. package/dist/params/codegen.js +12 -0
  174. package/dist/params/codegen.js.map +1 -0
  175. package/dist/params/convert.d.ts +7 -0
  176. package/dist/params/convert.js +123 -0
  177. package/dist/params/convert.js.map +1 -0
  178. package/dist/params/core.d.ts +11 -0
  179. package/dist/params/core.js +12 -0
  180. package/dist/params/core.js.map +1 -0
  181. package/dist/params/fieldTypes.d.ts +26 -0
  182. package/dist/params/fieldTypes.js +29 -0
  183. package/dist/params/fieldTypes.js.map +1 -0
  184. package/dist/params/index.d.ts +3 -0
  185. package/dist/params/index.js +4 -0
  186. package/dist/params/index.js.map +1 -0
  187. package/dist/params/prompt.d.ts +4 -0
  188. package/dist/params/prompt.js +16 -0
  189. package/dist/params/prompt.js.map +1 -0
  190. package/dist/params/render.d.ts +5 -0
  191. package/dist/params/render.js +25 -0
  192. package/dist/params/render.js.map +1 -0
  193. package/dist/params/types.d.ts +76 -0
  194. package/dist/params/types.js +16 -0
  195. package/dist/params/types.js.map +1 -0
  196. package/dist/params/validate.d.ts +5 -0
  197. package/dist/params/validate.js +104 -0
  198. package/dist/params/validate.js.map +1 -0
  199. package/dist/resources/client.d.ts +58 -0
  200. package/dist/resources/client.js +79 -0
  201. package/dist/resources/client.js.map +1 -0
  202. package/dist/resources/types.d.ts +72 -0
  203. package/dist/resources/types.js +9 -0
  204. package/dist/resources/types.js.map +1 -0
  205. package/dist/workflow/assets.d.ts +8 -0
  206. package/dist/workflow/assets.js +16 -0
  207. package/dist/workflow/assets.js.map +1 -0
  208. package/dist/workflow/commands.d.ts +10 -0
  209. package/dist/workflow/commands.js +21 -0
  210. package/dist/workflow/commands.js.map +1 -0
  211. package/dist/workflow/core.d.ts +15 -0
  212. package/dist/workflow/core.js +16 -0
  213. package/dist/workflow/core.js.map +1 -0
  214. package/dist/workflow/index.d.ts +2 -0
  215. package/dist/workflow/index.js +3 -0
  216. package/dist/workflow/index.js.map +1 -0
  217. package/dist/workflow/stack.d.ts +11 -0
  218. package/dist/workflow/stack.js +40 -0
  219. package/dist/workflow/stack.js.map +1 -0
  220. package/dist/workflow/templates.d.ts +17 -0
  221. package/dist/workflow/templates.js +223 -0
  222. package/dist/workflow/templates.js.map +1 -0
  223. package/dist/workflow/types.d.ts +27 -0
  224. package/dist/workflow/types.js +2 -0
  225. package/dist/workflow/types.js.map +1 -0
  226. package/package.json +77 -0
  227. package/schemas/artifacts.index.json +1211 -0
  228. package/schemas/knowledge.index.json +49 -0
  229. package/schemas/prompt-modules.index.json +105 -0
  230. package/schemas/roles.index.json +431 -0
  231. package/schemas/scenarios.index.json +15 -0
  232. package/schemas/skills.index.json +670 -0
  233. package/schemas/workflows.index.json +462 -0
@@ -0,0 +1,33 @@
1
+ function label(s) {
2
+ return s.replace(/"/g, """).replace(/\r?\n/g, " ");
3
+ }
4
+ function nodeText(n) {
5
+ const raw = typeof n.data.label === "string" && n.data.label ? n.data.label : n.id;
6
+ return label(`${n.type}: ${raw}`);
7
+ }
8
+ function shapeFor(type, id, text) {
9
+ const l = `"${text}"`;
10
+ switch (type) {
11
+ case "condition":
12
+ return ` ${id}{${l}}`;
13
+ case "input":
14
+ return ` ${id}[/${l}/]`;
15
+ case "output":
16
+ case "artifact":
17
+ return ` ${id}([${l}])`;
18
+ case "mcpTool":
19
+ return ` ${id}[[${l}]]`;
20
+ default: // transform | mermaid
21
+ return ` ${id}[${l}]`;
22
+ }
23
+ }
24
+ export function appToMermaid(app) {
25
+ const lines = ["flowchart TD"];
26
+ for (const n of app.nodes)
27
+ lines.push(shapeFor(n.type, n.id, nodeText(n)));
28
+ for (const e of app.edges) {
29
+ lines.push(e.condition ? ` ${e.source} -->|${label(e.condition)}| ${e.target}` : ` ${e.source} --> ${e.target}`);
30
+ }
31
+ return lines.join("\n");
32
+ }
33
+ //# sourceMappingURL=mermaid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid.js","sourceRoot":"","sources":["../../src/nocode/mermaid.ts"],"names":[],"mappings":"AASA,SAAS,KAAK,CAAC,CAAS;IACtB,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,QAAQ,CAAC,IAAc,EAAE,EAAU,EAAE,IAAY;IACxD,MAAM,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC;IACtB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW;YACd,OAAO,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC;QAC3B,KAAK,QAAQ,CAAC;QACd,KAAK,UAAU;YACb,OAAO,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC;QAC3B,KAAK,SAAS;YACZ,OAAO,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC;QAC3B,SAAS,sBAAsB;YAC7B,OAAO,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAc;IACzC,MAAM,KAAK,GAAG,CAAC,cAAc,CAAC,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,QAAQ,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACrH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Turn a no-code app into a plain-English prompt to paste into any AI assistant —
3
+ * the same "copy as prompt" idea the guide/params/diagram cores offer, so someone
4
+ * who doesn't write prompts can still ask an assistant to extend their app, with
5
+ * the platform's safety framing baked in. Import-free (types only).
6
+ */
7
+ import type { NoCodeApp } from "./types.js";
8
+ export declare function toAppPrompt(app: NoCodeApp): string;
@@ -0,0 +1,46 @@
1
+ function nodeLabel(n) {
2
+ const d = n.data;
3
+ if (typeof d.label === "string" && d.label)
4
+ return d.label;
5
+ if (typeof d.variable === "string" && d.variable)
6
+ return d.variable;
7
+ if (typeof d.toolName === "string" && d.toolName)
8
+ return d.toolName;
9
+ if (typeof d.op === "string" && d.op)
10
+ return d.op;
11
+ return n.id;
12
+ }
13
+ function describe(n) {
14
+ switch (n.type) {
15
+ case "input":
16
+ return `asks for "${nodeLabel(n)}"`;
17
+ case "transform":
18
+ return `works out "${nodeLabel(n)}" on the device`;
19
+ case "condition":
20
+ return `checks "${nodeLabel(n)}" and branches`;
21
+ case "mcpTool":
22
+ return `calls an AI tool "${nodeLabel(n)}" (the only step that leaves the device)`;
23
+ case "artifact":
24
+ return `saves "${nodeLabel(n)}"`;
25
+ case "output":
26
+ return `shows "${nodeLabel(n)}"`;
27
+ default:
28
+ return `${n.type}: ${nodeLabel(n)}`;
29
+ }
30
+ }
31
+ export function toAppPrompt(app) {
32
+ const steps = app.nodes.map((n, i) => `${i + 1}. It ${describe(n)}.`).join("\n");
33
+ const inputs = app.nodes.filter((n) => n.type === "input").map(nodeLabel);
34
+ return [
35
+ `I built a small no-code app called "${app.name}". Here's what it does, step by step:`,
36
+ "",
37
+ steps || "1. (no steps yet)",
38
+ "",
39
+ inputs.length ? `It collects: ${inputs.join(", ")}.` : "It collects no input yet.",
40
+ "",
41
+ "Please help me improve it: what steps or fields am I missing for this kind of task, how should I word each one so it's clear and neutral, and is there anything I should be careful about? If a step should call an AI tool rather than run on the device, point that out.",
42
+ "",
43
+ "Keep it educational and informational only — not legal or clinical advice. This may hold sensitive family information, so flag anything I should keep private. Use court-neutral, child-centered language: describe behavior, use a child's initials, and never characterize a parent.",
44
+ ].join("\n");
45
+ }
46
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/nocode/prompt.ts"],"names":[],"mappings":"AAQA,SAAS,SAAS,CAAC,CAAU;IAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAiF,CAAC;IAC9F,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC;IAC3D,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ;QAAE,OAAO,CAAC,CAAC,QAAQ,CAAC;IACpE,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ;QAAE,OAAO,CAAC,CAAC,QAAQ,CAAC;IACpE,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC;IAClD,OAAO,CAAC,CAAC,EAAE,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU;IAC1B,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,aAAa,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;QACtC,KAAK,WAAW;YACd,OAAO,cAAc,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC;QACrD,KAAK,WAAW;YACd,OAAO,WAAW,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC;QACjD,KAAK,SAAS;YACZ,OAAO,qBAAqB,SAAS,CAAC,CAAC,CAAC,0CAA0C,CAAC;QACrF,KAAK,UAAU;YACb,OAAO,UAAU,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;QACnC,KAAK,QAAQ;YACX,OAAO,UAAU,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;QACnC;YACE,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACxC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAc;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC1E,OAAO;QACL,uCAAuC,GAAG,CAAC,IAAI,uCAAuC;QACtF,EAAE;QACF,KAAK,IAAI,mBAAmB;QAC5B,EAAE;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,2BAA2B;QAClF,EAAE;QACF,4QAA4Q;QAC5Q,EAAE;QACF,wRAAwR;KACzR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The on-device graph executor. Walks a no-code app in dependency order, running
3
+ * allow-listed ops locally and handing `mcpTool` nodes to an injected
4
+ * `callTool` (the same host-callable shape `sdk/src/mcp/toolset.ts` expects).
5
+ *
6
+ * Dependency-free by design: no `node:`, no `fetch`, no clock. All I/O is the
7
+ * host's job — the runtime only resolves variables and sequences steps, so a run
8
+ * over simple ops is fully reproducible.
9
+ */
10
+ import type { NoCodeApp, AppNode } from "./types.js";
11
+ /** A host-provided MCP call (browser client, Tauri sidecar, or a test mock). */
12
+ export type CallTool = (serverId: string, toolName: string, args: Record<string, unknown>) => Promise<unknown>;
13
+ export interface RunOptions {
14
+ /** Seed values for `input` nodes, keyed by variable key. */
15
+ values?: Record<string, unknown>;
16
+ /** Required only if the app has `mcpTool` nodes. */
17
+ callTool?: CallTool;
18
+ }
19
+ export interface RunStep {
20
+ nodeId: string;
21
+ type: AppNode["type"];
22
+ output?: unknown;
23
+ }
24
+ export interface RunResult {
25
+ variables: Record<string, unknown>;
26
+ trace: RunStep[];
27
+ }
28
+ export declare function runApp(app: NoCodeApp, opts?: RunOptions): Promise<RunResult>;
@@ -0,0 +1,113 @@
1
+ import { runOp } from "./simpleOps.js";
2
+ const str = (v) => (typeof v === "string" ? v : "");
3
+ /** Topological order via Kahn's algorithm (the app is validated acyclic first). */
4
+ function topoOrder(app) {
5
+ const indeg = new Map();
6
+ const out = new Map();
7
+ const byId = new Map();
8
+ for (const n of app.nodes) {
9
+ indeg.set(n.id, 0);
10
+ out.set(n.id, []);
11
+ byId.set(n.id, n);
12
+ }
13
+ for (const e of app.edges) {
14
+ if (!byId.has(e.source) || !byId.has(e.target))
15
+ continue;
16
+ out.get(e.source)?.push(e.target);
17
+ indeg.set(e.target, (indeg.get(e.target) ?? 0) + 1);
18
+ }
19
+ const queue = app.nodes.filter((n) => (indeg.get(n.id) ?? 0) === 0).map((n) => n.id);
20
+ const order = [];
21
+ while (queue.length) {
22
+ const id = queue.shift();
23
+ const node = byId.get(id);
24
+ if (node)
25
+ order.push(node);
26
+ for (const next of out.get(id) ?? []) {
27
+ indeg.set(next, (indeg.get(next) ?? 0) - 1);
28
+ if ((indeg.get(next) ?? 0) === 0)
29
+ queue.push(next);
30
+ }
31
+ }
32
+ // Any leftover (shouldn't happen on a validated acyclic graph) appended stably.
33
+ for (const n of app.nodes)
34
+ if (!order.includes(n))
35
+ order.push(n);
36
+ return order;
37
+ }
38
+ function resolveInputs(node, vars) {
39
+ const op = str(node.data.op);
40
+ if (op === "template")
41
+ return [str(node.data.literal), vars];
42
+ const inKeys = Array.isArray(node.data.in) ? node.data.in.map(str) : [];
43
+ const inputs = inKeys.map((k) => vars[k]);
44
+ return node.data.literal !== undefined ? [node.data.literal, ...inputs] : inputs;
45
+ }
46
+ export async function runApp(app, opts = {}) {
47
+ const vars = { ...(opts.values ?? {}) };
48
+ const trace = [];
49
+ // Activation: source nodes start active; a condition node activates only the
50
+ // outgoing edge whose `condition` matches its boolean result.
51
+ const incoming = new Set(app.edges.map((e) => e.target));
52
+ const active = new Set(app.nodes.filter((n) => !incoming.has(n.id)).map((n) => n.id));
53
+ const edgesFrom = (id) => app.edges.filter((e) => e.source === id);
54
+ for (const node of topoOrder(app)) {
55
+ if (!active.has(node.id))
56
+ continue;
57
+ let output;
58
+ let branch;
59
+ switch (node.type) {
60
+ case "input": {
61
+ const key = str(node.data.variable) || str(node.data.key);
62
+ if (key) {
63
+ if (vars[key] === undefined && node.data.default !== undefined)
64
+ vars[key] = node.data.default;
65
+ output = vars[key];
66
+ }
67
+ break;
68
+ }
69
+ case "transform": {
70
+ output = runOp(str(node.data.op), resolveInputs(node, vars));
71
+ if (str(node.data.out))
72
+ vars[str(node.data.out)] = output;
73
+ break;
74
+ }
75
+ case "condition": {
76
+ const result = Boolean(runOp(str(node.data.op), resolveInputs(node, vars)));
77
+ if (str(node.data.out))
78
+ vars[str(node.data.out)] = result;
79
+ output = result;
80
+ branch = String(result); // "true" | "false"
81
+ break;
82
+ }
83
+ case "mcpTool": {
84
+ if (!opts.callTool) {
85
+ throw new Error(`This app calls the MCP tool '${str(node.data.serverId)}/${str(node.data.toolName)}'. Run it in a host that provides a tool caller (the offline CLI can't).`);
86
+ }
87
+ const mapping = (node.data.argMapping ?? {});
88
+ const args = {};
89
+ for (const [toolArg, varKey] of Object.entries(mapping))
90
+ args[toolArg] = vars[varKey];
91
+ output = await opts.callTool(str(node.data.serverId), str(node.data.toolName), args);
92
+ if (str(node.data.out))
93
+ vars[str(node.data.out)] = output;
94
+ break;
95
+ }
96
+ default: {
97
+ // artifact | mermaid | output — surface the referenced variable, no compute.
98
+ const key = str(node.data.variable) || str(node.data.in);
99
+ output = key ? vars[key] : undefined;
100
+ break;
101
+ }
102
+ }
103
+ trace.push({ nodeId: node.id, type: node.type, output });
104
+ // Propagate activation to downstream nodes.
105
+ for (const e of edgesFrom(node.id)) {
106
+ if (branch !== undefined && e.condition !== undefined && e.condition !== branch)
107
+ continue;
108
+ active.add(e.target);
109
+ }
110
+ }
111
+ return { variables: vars, trace };
112
+ }
113
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/nocode/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The allow-list of deterministic operations a no-code app may run ON-DEVICE.
3
+ * This is the single source the runtime and the validator both consult: anything
4
+ * not here (a model call, a network fetch, heavy/loopy compute) must go through
5
+ * an `mcpTool` node instead. `runOp` is pure — no clock, no I/O, no randomness —
6
+ * so a run is reproducible and unit-testable.
7
+ */
8
+ /** Every op that is permitted to run locally. */
9
+ export declare const ALLOWED_OPS: Set<string>;
10
+ export declare function isAllowedOp(op: string): boolean;
11
+ /**
12
+ * Run one allow-listed op over already-resolved inputs. Throws on any op that is
13
+ * not on the device allow-list — the runtime turns that into a clear "use an MCP
14
+ * tool node" error.
15
+ */
16
+ export declare function runOp(op: string, inputs: unknown[]): unknown;
@@ -0,0 +1,137 @@
1
+ /**
2
+ * The allow-list of deterministic operations a no-code app may run ON-DEVICE.
3
+ * This is the single source the runtime and the validator both consult: anything
4
+ * not here (a model call, a network fetch, heavy/loopy compute) must go through
5
+ * an `mcpTool` node instead. `runOp` is pure — no clock, no I/O, no randomness —
6
+ * so a run is reproducible and unit-testable.
7
+ */
8
+ /** Every op that is permitted to run locally. */
9
+ export const ALLOWED_OPS = new Set([
10
+ // strings
11
+ "concat",
12
+ "trim",
13
+ "upper",
14
+ "lower",
15
+ "template",
16
+ "length",
17
+ "contains",
18
+ "startsWith",
19
+ "endsWith",
20
+ "capitalize",
21
+ "coalesce",
22
+ "isEmpty",
23
+ // numbers
24
+ "add",
25
+ "sub",
26
+ "mul",
27
+ "div",
28
+ "min",
29
+ "max",
30
+ "round",
31
+ "abs",
32
+ "mod",
33
+ // booleans / comparison
34
+ "and",
35
+ "or",
36
+ "not",
37
+ "eq",
38
+ "ne",
39
+ "gt",
40
+ "gte",
41
+ "lt",
42
+ "lte",
43
+ ]);
44
+ export function isAllowedOp(op) {
45
+ return ALLOWED_OPS.has(op);
46
+ }
47
+ const asStr = (x) => (x === undefined || x === null ? "" : String(x));
48
+ const asNum = (x) => (typeof x === "number" ? x : Number(asStr(x)));
49
+ const nums = (xs) => xs.map(asNum);
50
+ function fold(xs, f) {
51
+ const ns = nums(xs);
52
+ if (ns.length === 0)
53
+ return 0;
54
+ return ns.reduce((a, b) => f(a, b));
55
+ }
56
+ function fillTemplate(tpl, vars) {
57
+ return tpl.replace(/\{\{\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\}\}/g, (_m, key) => Object.prototype.hasOwnProperty.call(vars, key) ? asStr(vars[key]) : "");
58
+ }
59
+ function asRecord(x) {
60
+ return x && typeof x === "object" && !Array.isArray(x) ? x : {};
61
+ }
62
+ /**
63
+ * Run one allow-listed op over already-resolved inputs. Throws on any op that is
64
+ * not on the device allow-list — the runtime turns that into a clear "use an MCP
65
+ * tool node" error.
66
+ */
67
+ export function runOp(op, inputs) {
68
+ switch (op) {
69
+ case "concat":
70
+ return inputs.map(asStr).join("");
71
+ case "trim":
72
+ return asStr(inputs[0]).trim();
73
+ case "upper":
74
+ return asStr(inputs[0]).toUpperCase();
75
+ case "lower":
76
+ return asStr(inputs[0]).toLowerCase();
77
+ case "template":
78
+ return fillTemplate(asStr(inputs[0]), asRecord(inputs[1]));
79
+ case "length":
80
+ return asStr(inputs[0]).length;
81
+ case "contains":
82
+ return asStr(inputs[0]).includes(asStr(inputs[1]));
83
+ case "startsWith":
84
+ return asStr(inputs[0]).startsWith(asStr(inputs[1]));
85
+ case "endsWith":
86
+ return asStr(inputs[0]).endsWith(asStr(inputs[1]));
87
+ case "capitalize": {
88
+ const s = asStr(inputs[0]);
89
+ return s ? s.charAt(0).toUpperCase() + s.slice(1) : s;
90
+ }
91
+ case "coalesce": {
92
+ const first = inputs.find((x) => asStr(x).trim() !== "");
93
+ return first === undefined ? "" : asStr(first);
94
+ }
95
+ case "isEmpty":
96
+ return asStr(inputs[0]).trim() === "";
97
+ case "add":
98
+ return nums(inputs).reduce((a, b) => a + b, 0);
99
+ case "sub":
100
+ return fold(inputs, (a, b) => a - b);
101
+ case "mul":
102
+ return nums(inputs).reduce((a, b) => a * b, 1);
103
+ case "div":
104
+ return fold(inputs, (a, b) => a / b);
105
+ case "min":
106
+ return Math.min(...nums(inputs));
107
+ case "max":
108
+ return Math.max(...nums(inputs));
109
+ case "round":
110
+ return Math.round(asNum(inputs[0]));
111
+ case "abs":
112
+ return Math.abs(asNum(inputs[0]));
113
+ case "mod":
114
+ return asNum(inputs[0]) % asNum(inputs[1]);
115
+ case "and":
116
+ return inputs.every(Boolean);
117
+ case "or":
118
+ return inputs.some(Boolean);
119
+ case "not":
120
+ return !inputs[0];
121
+ case "eq":
122
+ return inputs[0] === inputs[1];
123
+ case "ne":
124
+ return inputs[0] !== inputs[1];
125
+ case "gt":
126
+ return asNum(inputs[0]) > asNum(inputs[1]);
127
+ case "gte":
128
+ return asNum(inputs[0]) >= asNum(inputs[1]);
129
+ case "lt":
130
+ return asNum(inputs[0]) < asNum(inputs[1]);
131
+ case "lte":
132
+ return asNum(inputs[0]) <= asNum(inputs[1]);
133
+ default:
134
+ throw new Error(`Operation not permitted on-device: ${op}. Use an MCP tool node.`);
135
+ }
136
+ }
137
+ //# sourceMappingURL=simpleOps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simpleOps.js","sourceRoot":"","sources":["../../src/nocode/simpleOps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * The no-code app schema — plain TypeScript interfaces (no zod), so this core
3
+ * stays dependency-free and import-free and loads unchanged in the CLI, a
4
+ * browser builder, and the on-device runtime. A "no-code app" is a small,
5
+ * local-first graph: capture input → run simple deterministic steps on-device →
6
+ * hand the heavy/AI/network work to an MCP tool → store/surface a result.
7
+ *
8
+ * NOTHING here stores secrets or URLs: an `McpRef` carries only a LOGICAL
9
+ * `serverId`; the host resolves the connection + credentials at runtime.
10
+ */
11
+ /** What a node does. Only `transform`/`condition`/`input`/`output`/`artifact`/`mermaid`
12
+ * run on-device; `mcpTool` is the single escape hatch to the network/AI. */
13
+ export type NodeType = "input" | "transform" | "condition" | "mcpTool" | "artifact" | "mermaid" | "output";
14
+ export interface AppNode {
15
+ id: string;
16
+ type: NodeType;
17
+ position: {
18
+ x: number;
19
+ y: number;
20
+ };
21
+ /** Node-type-specific config (e.g. `{ op, in, out }` for transform). */
22
+ data: Record<string, unknown>;
23
+ }
24
+ export interface AppEdge {
25
+ id: string;
26
+ source: string;
27
+ target: string;
28
+ sourceHandle?: string;
29
+ /** Only meaningful out of a `condition` node — the branch this edge takes. */
30
+ condition?: string;
31
+ }
32
+ export type VariableType = "string" | "number" | "boolean" | "json";
33
+ export interface Variable {
34
+ key: string;
35
+ type: VariableType;
36
+ /** v1 is device-only; the field exists so a future scope can't break the schema. */
37
+ scope: "local";
38
+ }
39
+ /** A reference to one MCP tool. No URL, no secret — the host resolves both. */
40
+ export interface McpRef {
41
+ serverId: string;
42
+ toolName: string;
43
+ /** Maps a tool argument name → the local variable key that feeds it. */
44
+ argMapping: Record<string, string>;
45
+ }
46
+ export type StorageKind = "indexeddb" | "opfs" | "memory";
47
+ export interface AppSettings {
48
+ storage: StorageKind;
49
+ /** The allow-list of MCP servers/tools this app may call. */
50
+ mcp: McpRef[];
51
+ }
52
+ export interface NoCodeApp {
53
+ id: string;
54
+ name: string;
55
+ version: string;
56
+ createdAt: string;
57
+ updatedAt: string;
58
+ nodes: AppNode[];
59
+ edges: AppEdge[];
60
+ variables: Variable[];
61
+ settings: AppSettings;
62
+ }
63
+ /** A single validation finding. Same shape the params core uses (redefined here
64
+ * because the import-free invariant forbids importing across core folders). */
65
+ export interface ValidationError {
66
+ path: string;
67
+ message: string;
68
+ }
69
+ export interface ValidationResult {
70
+ valid: boolean;
71
+ errors: ValidationError[];
72
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The no-code app schema — plain TypeScript interfaces (no zod), so this core
3
+ * stays dependency-free and import-free and loads unchanged in the CLI, a
4
+ * browser builder, and the on-device runtime. A "no-code app" is a small,
5
+ * local-first graph: capture input → run simple deterministic steps on-device →
6
+ * hand the heavy/AI/network work to an MCP tool → store/surface a result.
7
+ *
8
+ * NOTHING here stores secrets or URLs: an `McpRef` carries only a LOGICAL
9
+ * `serverId`; the host resolves the connection + credentials at runtime.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/nocode/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Validate a no-code app DEFINITION before it runs. Pure and dependency-free, in
3
+ * the style of `params/validate.ts`. Catches the things that would make a run
4
+ * unsafe or impossible: duplicate ids, dangling edges, an on-device op that
5
+ * isn't allow-listed, an `mcpTool` node that calls a server the app never
6
+ * declared, and cycles (the runtime refuses to run a graph that loops).
7
+ */
8
+ import type { NoCodeApp, ValidationError, ValidationResult } from "./types.js";
9
+ export declare function validateApp(app: NoCodeApp): ValidationResult;
10
+ /**
11
+ * Soft warnings that don't make an app invalid but usually signal a mistake — the
12
+ * core stays permissive (a variable can be seeded at run time) while still helping
13
+ * surface the common slip: a transform/condition whose `in` names a variable no
14
+ * step produces (a typo or a missing upstream step). Template ops read variables
15
+ * from their text, not `in`, so they're skipped. Pure; same shape as errors.
16
+ */
17
+ export declare function appWarnings(app: NoCodeApp): ValidationError[];