create-relkit 0.4.0 → 0.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.
Files changed (277) hide show
  1. package/dist/add-name.d.ts +9 -0
  2. package/dist/add-name.d.ts.map +1 -0
  3. package/dist/add-name.js +18 -0
  4. package/dist/add-name.js.map +1 -0
  5. package/dist/add-options-parser.d.ts +21 -0
  6. package/dist/add-options-parser.d.ts.map +1 -0
  7. package/dist/add-options-parser.js +103 -0
  8. package/dist/add-options-parser.js.map +1 -0
  9. package/dist/add-options-resource.d.ts +5 -0
  10. package/dist/add-options-resource.d.ts.map +1 -0
  11. package/dist/add-options-resource.js +18 -0
  12. package/dist/add-options-resource.js.map +1 -0
  13. package/dist/add-options.d.ts +6 -0
  14. package/dist/add-options.d.ts.map +1 -0
  15. package/dist/add-options.js +165 -0
  16. package/dist/add-options.js.map +1 -0
  17. package/dist/add-output.d.ts +4 -0
  18. package/dist/add-output.d.ts.map +1 -0
  19. package/dist/add-output.js +33 -0
  20. package/dist/add-output.js.map +1 -0
  21. package/dist/add-plan.d.ts +4 -0
  22. package/dist/add-plan.d.ts.map +1 -0
  23. package/dist/add-plan.js +62 -0
  24. package/dist/add-plan.js.map +1 -0
  25. package/dist/add-resolution-discovery.d.ts +13 -0
  26. package/dist/add-resolution-discovery.d.ts.map +1 -0
  27. package/dist/add-resolution-discovery.js +70 -0
  28. package/dist/add-resolution-discovery.js.map +1 -0
  29. package/dist/add-resolution-state.d.ts +23 -0
  30. package/dist/add-resolution-state.d.ts.map +1 -0
  31. package/dist/add-resolution-state.js +89 -0
  32. package/dist/add-resolution-state.js.map +1 -0
  33. package/dist/add-resolver-domain.d.ts +4 -0
  34. package/dist/add-resolver-domain.d.ts.map +1 -0
  35. package/dist/add-resolver-domain.js +150 -0
  36. package/dist/add-resolver-domain.js.map +1 -0
  37. package/dist/add-resolver-platform.d.ts +4 -0
  38. package/dist/add-resolver-platform.d.ts.map +1 -0
  39. package/dist/add-resolver-platform.js +112 -0
  40. package/dist/add-resolver-platform.js.map +1 -0
  41. package/dist/add-resolver-resources.d.ts +4 -0
  42. package/dist/add-resolver-resources.d.ts.map +1 -0
  43. package/dist/add-resolver-resources.js +150 -0
  44. package/dist/add-resolver-resources.js.map +1 -0
  45. package/dist/add-resolver.d.ts +14 -0
  46. package/dist/add-resolver.d.ts.map +1 -0
  47. package/dist/add-resolver.js +41 -0
  48. package/dist/add-resolver.js.map +1 -0
  49. package/dist/add-transaction-files.d.ts +12 -0
  50. package/dist/add-transaction-files.d.ts.map +1 -0
  51. package/dist/add-transaction-files.js +103 -0
  52. package/dist/add-transaction-files.js.map +1 -0
  53. package/dist/add-transaction.d.ts +17 -0
  54. package/dist/add-transaction.d.ts.map +1 -0
  55. package/dist/add-transaction.js +115 -0
  56. package/dist/add-transaction.js.map +1 -0
  57. package/dist/add-types.d.ts +136 -0
  58. package/dist/add-types.d.ts.map +1 -0
  59. package/dist/add-types.js +41 -0
  60. package/dist/add-types.js.map +1 -0
  61. package/dist/bucket-profiles.d.ts +4 -0
  62. package/dist/bucket-profiles.d.ts.map +1 -0
  63. package/dist/bucket-profiles.js +18 -0
  64. package/dist/bucket-profiles.js.map +1 -0
  65. package/dist/create-additions.d.ts +7 -0
  66. package/dist/create-additions.d.ts.map +1 -0
  67. package/dist/create-additions.js +27 -0
  68. package/dist/create-additions.js.map +1 -0
  69. package/dist/create-preview.d.ts +12 -0
  70. package/dist/create-preview.d.ts.map +1 -0
  71. package/dist/create-preview.js +50 -0
  72. package/dist/create-preview.js.map +1 -0
  73. package/dist/create-resolver.d.ts +14 -0
  74. package/dist/create-resolver.d.ts.map +1 -0
  75. package/dist/create-resolver.js +96 -0
  76. package/dist/create-resolver.js.map +1 -0
  77. package/dist/domain-planning.d.ts +24 -0
  78. package/dist/domain-planning.d.ts.map +1 -0
  79. package/dist/domain-planning.js +94 -0
  80. package/dist/domain-planning.js.map +1 -0
  81. package/dist/generate-files-utilities.d.ts +18 -0
  82. package/dist/generate-files-utilities.d.ts.map +1 -0
  83. package/dist/generate-files-utilities.js +87 -0
  84. package/dist/generate-files-utilities.js.map +1 -0
  85. package/dist/generate-files.d.ts +1 -12
  86. package/dist/generate-files.d.ts.map +1 -1
  87. package/dist/generate-files.js +38 -89
  88. package/dist/generate-files.js.map +1 -1
  89. package/dist/generate-output.d.ts +2 -1
  90. package/dist/generate-output.d.ts.map +1 -1
  91. package/dist/generate-output.js +9 -0
  92. package/dist/generate-output.js.map +1 -1
  93. package/dist/generate-process.d.ts +1 -1
  94. package/dist/generate-process.d.ts.map +1 -1
  95. package/dist/generate-process.js +7 -3
  96. package/dist/generate-process.js.map +1 -1
  97. package/dist/generate-types.d.ts +46 -0
  98. package/dist/generate-types.d.ts.map +1 -0
  99. package/dist/generate-types.js +20 -0
  100. package/dist/generate-types.js.map +1 -0
  101. package/dist/generate.d.ts +1 -38
  102. package/dist/generate.d.ts.map +1 -1
  103. package/dist/generate.js +34 -39
  104. package/dist/generate.js.map +1 -1
  105. package/dist/index.d.ts +18 -0
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +79 -9
  108. package/dist/index.js.map +1 -1
  109. package/dist/options.d.ts +5 -1
  110. package/dist/options.d.ts.map +1 -1
  111. package/dist/options.js +10 -1
  112. package/dist/options.js.map +1 -1
  113. package/dist/plan-builder.d.ts +33 -0
  114. package/dist/plan-builder.d.ts.map +1 -0
  115. package/dist/plan-builder.js +139 -0
  116. package/dist/plan-builder.js.map +1 -0
  117. package/dist/plan-manifest.d.ts +6 -0
  118. package/dist/plan-manifest.d.ts.map +1 -0
  119. package/dist/plan-manifest.js +40 -0
  120. package/dist/plan-manifest.js.map +1 -0
  121. package/dist/project-discovery-app.d.ts +7 -0
  122. package/dist/project-discovery-app.d.ts.map +1 -0
  123. package/dist/project-discovery-app.js +122 -0
  124. package/dist/project-discovery-app.js.map +1 -0
  125. package/dist/project-discovery-database.d.ts +11 -0
  126. package/dist/project-discovery-database.d.ts.map +1 -0
  127. package/dist/project-discovery-database.js +46 -0
  128. package/dist/project-discovery-database.js.map +1 -0
  129. package/dist/project-discovery-types.d.ts +45 -0
  130. package/dist/project-discovery-types.d.ts.map +1 -0
  131. package/dist/project-discovery-types.js +2 -0
  132. package/dist/project-discovery-types.js.map +1 -0
  133. package/dist/project-discovery.d.ts +4 -0
  134. package/dist/project-discovery.d.ts.map +1 -0
  135. package/dist/project-discovery.js +152 -0
  136. package/dist/project-discovery.js.map +1 -0
  137. package/dist/prompt-driver.d.ts +32 -0
  138. package/dist/prompt-driver.d.ts.map +1 -0
  139. package/dist/prompt-driver.js +42 -0
  140. package/dist/prompt-driver.js.map +1 -0
  141. package/dist/provider-planning-definitions.d.ts +35 -0
  142. package/dist/provider-planning-definitions.d.ts.map +1 -0
  143. package/dist/provider-planning-definitions.js +109 -0
  144. package/dist/provider-planning-definitions.js.map +1 -0
  145. package/dist/provider-planning.d.ts +11 -0
  146. package/dist/provider-planning.d.ts.map +1 -0
  147. package/dist/provider-planning.js +131 -0
  148. package/dist/provider-planning.js.map +1 -0
  149. package/dist/render-ai-sources.d.ts +18 -0
  150. package/dist/render-ai-sources.d.ts.map +1 -0
  151. package/dist/render-ai-sources.js +49 -0
  152. package/dist/render-ai-sources.js.map +1 -0
  153. package/dist/render-ai.d.ts +11 -0
  154. package/dist/render-ai.d.ts.map +1 -0
  155. package/dist/render-ai.js +61 -0
  156. package/dist/render-ai.js.map +1 -0
  157. package/dist/render-auth-schema.d.ts +3 -0
  158. package/dist/render-auth-schema.d.ts.map +1 -0
  159. package/dist/render-auth-schema.js +85 -0
  160. package/dist/render-auth-schema.js.map +1 -0
  161. package/dist/render-auth-sources.d.ts +3 -0
  162. package/dist/render-auth-sources.d.ts.map +1 -0
  163. package/dist/render-auth-sources.js +17 -0
  164. package/dist/render-auth-sources.js.map +1 -0
  165. package/dist/render-auth.d.ts +6 -0
  166. package/dist/render-auth.d.ts.map +1 -0
  167. package/dist/render-auth.js +84 -0
  168. package/dist/render-auth.js.map +1 -0
  169. package/dist/render-database-sources.d.ts +5 -0
  170. package/dist/render-database-sources.d.ts.map +1 -0
  171. package/dist/render-database-sources.js +65 -0
  172. package/dist/render-database-sources.js.map +1 -0
  173. package/dist/render-database.d.ts +13 -0
  174. package/dist/render-database.d.ts.map +1 -0
  175. package/dist/render-database.js +40 -0
  176. package/dist/render-database.js.map +1 -0
  177. package/dist/render-domain-register.d.ts +4 -0
  178. package/dist/render-domain-register.d.ts.map +1 -0
  179. package/dist/render-domain-register.js +11 -0
  180. package/dist/render-domain-register.js.map +1 -0
  181. package/dist/render-domain-sources.d.ts +19 -0
  182. package/dist/render-domain-sources.d.ts.map +1 -0
  183. package/dist/render-domain-sources.js +132 -0
  184. package/dist/render-domain-sources.js.map +1 -0
  185. package/dist/render-domain.d.ts +26 -0
  186. package/dist/render-domain.d.ts.map +1 -0
  187. package/dist/render-domain.js +98 -0
  188. package/dist/render-domain.js.map +1 -0
  189. package/dist/render-resource-sources.d.ts +4 -0
  190. package/dist/render-resource-sources.d.ts.map +1 -0
  191. package/dist/render-resource-sources.js +31 -0
  192. package/dist/render-resource-sources.js.map +1 -0
  193. package/dist/render-resources.d.ts +11 -0
  194. package/dist/render-resources.d.ts.map +1 -0
  195. package/dist/render-resources.js +53 -0
  196. package/dist/render-resources.js.map +1 -0
  197. package/dist/render-route-sources.d.ts +6 -0
  198. package/dist/render-route-sources.d.ts.map +1 -0
  199. package/dist/render-route-sources.js +35 -0
  200. package/dist/render-route-sources.js.map +1 -0
  201. package/dist/render-routes.d.ts +13 -0
  202. package/dist/render-routes.d.ts.map +1 -0
  203. package/dist/render-routes.js +48 -0
  204. package/dist/render-routes.js.map +1 -0
  205. package/dist/render-service.d.ts +6 -0
  206. package/dist/render-service.d.ts.map +1 -0
  207. package/dist/render-service.js +124 -0
  208. package/dist/render-service.js.map +1 -0
  209. package/dist/scaffold-catalog.d.ts +75 -0
  210. package/dist/scaffold-catalog.d.ts.map +1 -0
  211. package/dist/scaffold-catalog.js +24 -0
  212. package/dist/scaffold-catalog.js.map +1 -0
  213. package/dist/source-edit.d.ts +10 -0
  214. package/dist/source-edit.d.ts.map +1 -0
  215. package/dist/source-edit.js +136 -0
  216. package/dist/source-edit.js.map +1 -0
  217. package/dist/source-import-edit.d.ts +3 -0
  218. package/dist/source-import-edit.d.ts.map +1 -0
  219. package/dist/source-import-edit.js +52 -0
  220. package/dist/source-import-edit.js.map +1 -0
  221. package/dist/template-root.d.ts +5 -0
  222. package/dist/template-root.d.ts.map +1 -0
  223. package/dist/template-root.js +15 -0
  224. package/dist/template-root.js.map +1 -0
  225. package/dist/templates/default/README.md +1 -1
  226. package/dist/templates/default/v1/agent/.env.example +0 -2
  227. package/dist/templates/default/v1/agent/README.md +7 -8
  228. package/dist/templates/default/v1/agent/package.json +6 -4
  229. package/dist/templates/default/v1/agent/relkit.config.ts +5 -15
  230. package/dist/templates/default/v1/agent/src/hello/agents/assistant.agent.ts +37 -4
  231. package/dist/templates/default/v1/agent/src/hello/agents/review.agent.ts +43 -0
  232. package/dist/templates/default/v1/agent/src/platform/env.ts +0 -2
  233. package/dist/templates/default/v1/agent/tests/integration/hello.route.test.ts +17 -6
  234. package/dist/templates/default/v1/agent/tests/unit/assistant.agent.test.ts +14 -36
  235. package/dist/templates/default/v1/agent/tests/unit/review.agent.test.ts +19 -0
  236. package/dist/templates/default/v1/api/package.json +3 -3
  237. package/dist/templates/default/v1/fullstack/.env.example +1 -0
  238. package/dist/templates/default/v1/fullstack/README.md +15 -0
  239. package/dist/templates/default/v1/fullstack/gitignore +4 -0
  240. package/dist/templates/default/v1/fullstack/package.json +35 -0
  241. package/dist/templates/default/v1/fullstack/relkit.config.ts +15 -0
  242. package/dist/templates/default/v1/fullstack/src/hello/agents/assistant.agent.ts +46 -0
  243. package/dist/templates/default/v1/fullstack/src/hello/agents/review.agent.ts +43 -0
  244. package/dist/templates/default/v1/fullstack/src/hello/functions/hello.function.ts +10 -0
  245. package/dist/templates/default/v1/fullstack/src/hello/service.ts +4 -0
  246. package/dist/templates/default/v1/fullstack/src/hello/tools/lookup.tool.ts +9 -0
  247. package/dist/templates/default/v1/fullstack/src/platform/env.ts +5 -0
  248. package/dist/templates/default/v1/fullstack/src/routes/hello/route.ts +4 -0
  249. package/dist/templates/default/v1/fullstack/tests/integration/hello.route.test.ts +29 -0
  250. package/dist/templates/default/v1/fullstack/tests/unit/assistant.agent.test.ts +18 -0
  251. package/dist/templates/default/v1/fullstack/tests/unit/hello.function.test.ts +7 -0
  252. package/dist/templates/default/v1/fullstack/tests/unit/review.agent.test.ts +19 -0
  253. package/dist/templates/default/v1/fullstack/tsconfig.json +21 -0
  254. package/dist/templates/default/v1/fullstack/web/app/agent-config.ts +7 -0
  255. package/dist/templates/default/v1/fullstack/web/app/layout.tsx +12 -0
  256. package/dist/templates/default/v1/fullstack/web/app/page.tsx +85 -0
  257. package/dist/templates/default/v1/fullstack/web/app/providers.tsx +29 -0
  258. package/dist/templates/default/v1/fullstack/web/next-env.d.ts +2 -0
  259. package/dist/templates/default/v1/fullstack/web/next.config.ts +5 -0
  260. package/dist/templates/default/v1/fullstack/web/tsconfig.json +10 -0
  261. package/dist/templates/default/v1/minimal/package.json +3 -3
  262. package/dist/templates/default/v1/tasks/.env.example +2 -0
  263. package/dist/templates/default/v1/tasks/README.md +15 -0
  264. package/dist/templates/default/v1/tasks/examples/export-orders.json +1 -0
  265. package/dist/templates/default/v1/tasks/gitignore +10 -0
  266. package/dist/templates/default/v1/tasks/package.json +24 -0
  267. package/dist/templates/default/v1/tasks/relkit.config.ts +11 -0
  268. package/dist/templates/default/v1/tasks/src/orders/functions/health.function.ts +9 -0
  269. package/dist/templates/default/v1/tasks/src/orders/jobs/export-orders.job.ts +15 -0
  270. package/dist/templates/default/v1/tasks/src/orders/service.ts +10 -0
  271. package/dist/templates/default/v1/tasks/src/orders/tasks/export-orders.task.ts +19 -0
  272. package/dist/templates/default/v1/tasks/src/platform/env.ts +3 -0
  273. package/dist/templates/default/v1/tasks/src/routes/health/route.ts +4 -0
  274. package/dist/templates/default/v1/tasks/tests/unit/export-orders.task.test.ts +7 -0
  275. package/dist/templates/default/v1/tasks/tsconfig.json +14 -0
  276. package/package.json +6 -1
  277. package/dist/templates/default/v1/agent/src/hello/functions/ask-assistant.function.ts +0 -16
@@ -0,0 +1,124 @@
1
+ import { ADD_FAILURE_CODES, AddScaffoldError, } from "./add-types.js";
2
+ import { normalizeArtifactName } from "./add-name.js";
3
+ import { serviceSource } from "./domain-planning.js";
4
+ import { PlanBuilder } from "./plan-builder.js";
5
+ import { renderAgent, renderTool } from "./render-ai.js";
6
+ import { renderConstants, renderError, renderEvent, renderEventFunction, renderFunction, renderJob, renderTask, renderPrompt, } from "./render-domain.js";
7
+ import { renderBucket, renderCache } from "./render-resources.js";
8
+ import { renderRoute } from "./render-routes.js";
9
+ const FULL = [
10
+ "function",
11
+ "event-function",
12
+ "task",
13
+ "error",
14
+ "event",
15
+ "job",
16
+ "cache",
17
+ "bucket",
18
+ "tool",
19
+ "prompt",
20
+ "agent",
21
+ "constants",
22
+ "route",
23
+ ];
24
+ export async function renderService(builder, request) {
25
+ const domain = normalizeArtifactName(request.name);
26
+ if (builder.discovery.services.some((service) => service.domain === domain.fileStem) ||
27
+ builder.discovery.artifacts.some((artifact) => artifact.domain === domain.fileStem)) {
28
+ throw new AddScaffoldError(ADD_FAILURE_CODES.collision, `Domain ${domain.fileStem} already exists.`);
29
+ }
30
+ const target = {
31
+ domain,
32
+ servicePath: `src/${domain.fileStem}/service.ts`,
33
+ service: undefined,
34
+ };
35
+ await builder.create(target.servicePath, serviceSource(domain));
36
+ const selected = closure(request.full ? FULL : request.include.length ? request.include : ["function"]);
37
+ const error = selected.has("error") ? await renderError(builder, target, "example") : undefined;
38
+ const event = selected.has("event") ? await renderEvent(builder, target, "example") : undefined;
39
+ const fn = selected.has("function")
40
+ ? await renderFunction(builder, target, "example", {
41
+ ...(error ? { error } : {}),
42
+ ...(event ? { event } : {}),
43
+ })
44
+ : undefined;
45
+ const taskExecution = selected.has("task") ? taskExecutionFor(builder) : undefined;
46
+ const task = selected.has("task")
47
+ ? await renderTask(builder, target, requestFor(builder, "task", {
48
+ name: "Example",
49
+ version: "1",
50
+ execution: taskExecution ?? "durable",
51
+ }))
52
+ : undefined;
53
+ if (selected.has("event-function")) {
54
+ await renderEventFunction(builder, target, requestFor(builder, "event-function", {
55
+ name: "On Example",
56
+ event: event?.id ?? "example",
57
+ delivery: "durable",
58
+ }));
59
+ }
60
+ if (selected.has("job")) {
61
+ await renderJob(builder, target, requestFor(builder, "job", { name: "Example", target: task?.id ?? fn?.id ?? "example" }));
62
+ }
63
+ if (selected.has("cache")) {
64
+ await renderCache(builder, target, requestFor(builder, "cache", { name: "Example" }));
65
+ }
66
+ if (selected.has("bucket")) {
67
+ await renderBucket(builder, target, requestFor(builder, "bucket", { name: "Example" }));
68
+ }
69
+ const tool = selected.has("tool")
70
+ ? await renderTool(builder, target, requestFor(builder, "tool", {
71
+ name: "Example",
72
+ target: fn?.id ?? "example",
73
+ sideEffect: "read",
74
+ approval: "never",
75
+ }))
76
+ : undefined;
77
+ const prompt = selected.has("prompt")
78
+ ? await renderPrompt(builder, target, "Example", [
79
+ "Use the available tool and answer concisely.",
80
+ ])
81
+ : undefined;
82
+ if (selected.has("agent")) {
83
+ await renderAgent(builder, target, requestFor(builder, "agent", {
84
+ name: "Example",
85
+ tools: tool ? [tool.id] : [],
86
+ prompt: prompt?.id ?? "example",
87
+ }));
88
+ }
89
+ if (selected.has("constants"))
90
+ await renderConstants(builder, target, "Example");
91
+ if (selected.has("route")) {
92
+ await renderRoute(builder, requestFor(builder, "route", {
93
+ path: `/${domain.fileStem}`,
94
+ mode: "service-route",
95
+ maps: { GET: fn?.binding ?? "example" },
96
+ }), target);
97
+ }
98
+ }
99
+ function taskExecutionFor(builder) {
100
+ const profile = builder.profiles.find((item) => item.capability === "job" && item.isDefault);
101
+ return profile?.adapter?.includes("effectMq") ? "retryable" : "durable";
102
+ }
103
+ function closure(input) {
104
+ const selected = new Set(input);
105
+ if (["error", "job", "tool", "route"].some((kind) => selected.has(kind)))
106
+ selected.add("function");
107
+ if (selected.has("event-function"))
108
+ selected.add("event");
109
+ if (selected.has("agent")) {
110
+ selected.add("function");
111
+ selected.add("tool");
112
+ selected.add("prompt");
113
+ }
114
+ return selected;
115
+ }
116
+ function requestFor(builder, kind, options) {
117
+ return {
118
+ kind,
119
+ projectRoot: builder.discovery.projectRoot,
120
+ install: builder.request.install,
121
+ ...options,
122
+ };
123
+ }
124
+ //# sourceMappingURL=render-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-service.js","sourceRoot":"","sources":["../src/render-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ export type DependencySection = "dependencies" | "devDependencies";
2
+ export interface ScaffoldDependency {
3
+ readonly version: string;
4
+ readonly section: DependencySection;
5
+ }
6
+ /** Versions copied into generated projects; first-party packages share this fixed release train. */
7
+ export declare const SCAFFOLD_DEPENDENCIES: Readonly<{
8
+ "@relkit/aws": {
9
+ version: string;
10
+ section: "dependencies";
11
+ };
12
+ "@relkit/better-auth": {
13
+ version: string;
14
+ section: "dependencies";
15
+ };
16
+ "@relkit/cloudflare": {
17
+ version: string;
18
+ section: "dependencies";
19
+ };
20
+ "@relkit/docker": {
21
+ version: string;
22
+ section: "dependencies";
23
+ };
24
+ "@relkit/effect-mq": {
25
+ version: string;
26
+ section: "dependencies";
27
+ };
28
+ "@relkit/inngest": {
29
+ version: string;
30
+ section: "dependencies";
31
+ };
32
+ "@relkit/drizzle": {
33
+ version: string;
34
+ section: "dependencies";
35
+ };
36
+ "@relkit/local": {
37
+ version: string;
38
+ section: "dependencies";
39
+ };
40
+ "@relkit/pulumi": {
41
+ version: string;
42
+ section: "dependencies";
43
+ };
44
+ "@relkit/redis": {
45
+ version: string;
46
+ section: "dependencies";
47
+ };
48
+ "@relkit/s3": {
49
+ version: string;
50
+ section: "dependencies";
51
+ };
52
+ "@relkit/trigger": {
53
+ version: string;
54
+ section: "dependencies";
55
+ };
56
+ "better-auth": {
57
+ version: string;
58
+ section: "dependencies";
59
+ };
60
+ "drizzle-kit": {
61
+ version: string;
62
+ section: "devDependencies";
63
+ };
64
+ "drizzle-orm": {
65
+ version: string;
66
+ section: "dependencies";
67
+ };
68
+ langchain: {
69
+ version: string;
70
+ section: "dependencies";
71
+ };
72
+ }>;
73
+ export type ScaffoldDependencyName = keyof typeof SCAFFOLD_DEPENDENCIES;
74
+ export declare function scaffoldDependency(name: ScaffoldDependencyName): ScaffoldDependency;
75
+ //# sourceMappingURL=scaffold-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-catalog.d.ts","sourceRoot":"","sources":["../src/scaffold-catalog.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,iBAAiB,CAAC;AAEnE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC;AAED,oGAAoG;AACpG,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBuB,CAAC;AAE1D,MAAM,MAAM,sBAAsB,GAAG,MAAM,OAAO,qBAAqB,CAAC;AAExE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB,CAEnF"}
@@ -0,0 +1,24 @@
1
+ import manifest from "../package.json" with { type: "json" };
2
+ /** Versions copied into generated projects; first-party packages share this fixed release train. */
3
+ export const SCAFFOLD_DEPENDENCIES = Object.freeze({
4
+ "@relkit/aws": { version: manifest.version, section: "dependencies" },
5
+ "@relkit/better-auth": { version: manifest.version, section: "dependencies" },
6
+ "@relkit/cloudflare": { version: manifest.version, section: "dependencies" },
7
+ "@relkit/docker": { version: manifest.version, section: "dependencies" },
8
+ "@relkit/effect-mq": { version: manifest.version, section: "dependencies" },
9
+ "@relkit/inngest": { version: manifest.version, section: "dependencies" },
10
+ "@relkit/drizzle": { version: manifest.version, section: "dependencies" },
11
+ "@relkit/local": { version: manifest.version, section: "dependencies" },
12
+ "@relkit/pulumi": { version: manifest.version, section: "dependencies" },
13
+ "@relkit/redis": { version: manifest.version, section: "dependencies" },
14
+ "@relkit/s3": { version: manifest.version, section: "dependencies" },
15
+ "@relkit/trigger": { version: manifest.version, section: "dependencies" },
16
+ "better-auth": { version: "1.7.1", section: "dependencies" },
17
+ "drizzle-kit": { version: "1.0.0-rc.5-ab785fc", section: "devDependencies" },
18
+ "drizzle-orm": { version: "1.0.0-rc.5-169397b", section: "dependencies" },
19
+ langchain: { version: "1.5.10", section: "dependencies" },
20
+ });
21
+ export function scaffoldDependency(name) {
22
+ return SCAFFOLD_DEPENDENCIES[name];
23
+ }
24
+ //# sourceMappingURL=scaffold-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-catalog.js","sourceRoot":"","sources":["../src/scaffold-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAS7D,oGAAoG;AACpG,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC;IACjD,aAAa,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE;IACrE,qBAAqB,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE;IAC7E,oBAAoB,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE;IAC5E,gBAAgB,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE;IACxE,mBAAmB,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE;IAC3E,iBAAiB,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE;IACzE,iBAAiB,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE;IACzE,eAAe,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE;IACvE,gBAAgB,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE;IACxE,eAAe,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE;IACvE,YAAY,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE;IACpE,iBAAiB,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE;IACzE,aAAa,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE;IAC5D,aAAa,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,iBAAiB,EAAE;IAC5E,aAAa,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,cAAc,EAAE;IACzE,SAAS,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE;CACH,CAAC,CAAC;AAI1D,MAAM,UAAU,kBAAkB,CAAC,IAA4B;IAC7D,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import * as ts from "typescript";
2
+ export { addSourceImport } from "./source-import-edit.js";
3
+ /** Appends one export declaration after validating the source syntax. */
4
+ export declare function addSourceExport(source: string, fileName: string, declaration: string): string;
5
+ /** Inserts one property into a canonical factory object or one nested object property. */
6
+ export declare function addFactoryObjectMember(source: string, fileName: string, factories: readonly string[], path: readonly string[], memberName: string, memberSource: string): string;
7
+ export declare function readFactoryObject(source: string, fileName: string, factories: readonly string[]): ts.ObjectLiteralExpression;
8
+ export declare function readFactoryStringProperty(source: string, fileName: string, factory: string, name: string, argumentIndex?: number): string | undefined;
9
+ export declare function staticPropertyName(node: ts.PropertyName | undefined): string | undefined;
10
+ //# sourceMappingURL=source-edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-edit.d.ts","sourceRoot":"","sources":["../src/source-edit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAI7F;AAED,0FAA0F;AAC1F,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,MAAM,CAaR;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,EAAE,CAAC,uBAAuB,CAE5B;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,aAAa,SAAI,GAChB,MAAM,GAAG,SAAS,CAMpB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAMxF"}
@@ -0,0 +1,136 @@
1
+ import * as ts from "typescript";
2
+ import { ADD_FAILURE_CODES, AddScaffoldError } from "./add-types.js";
3
+ export { addSourceImport } from "./source-import-edit.js";
4
+ /** Appends one export declaration after validating the source syntax. */
5
+ export function addSourceExport(source, fileName, declaration) {
6
+ if (source.includes(declaration))
7
+ return source;
8
+ parse(fileName, source);
9
+ return `${source.trimEnd()}\n${declaration}\n`;
10
+ }
11
+ /** Inserts one property into a canonical factory object or one nested object property. */
12
+ export function addFactoryObjectMember(source, fileName, factories, path, memberName, memberSource) {
13
+ const file = parse(fileName, source);
14
+ const root = factoryObject(file, factories);
15
+ const target = descend(root, path, source, memberSource);
16
+ assertObject(target.object, source);
17
+ const existing = !target.created ? property(target.object, memberName) : undefined;
18
+ if (existing !== undefined) {
19
+ const current = source.slice(existing.getStart(), existing.getEnd()).replace(/\s+/g, " ");
20
+ if (current === memberSource.replace(/\s+/g, " "))
21
+ return source;
22
+ collision(fileName, [...path, memberName]);
23
+ }
24
+ const insertion = target.created ? `${target.name}: { ${memberSource} }` : memberSource;
25
+ return insertMember(source, target.parent ?? target.object, insertion);
26
+ }
27
+ export function readFactoryObject(source, fileName, factories) {
28
+ return factoryObject(parse(fileName, source), factories);
29
+ }
30
+ export function readFactoryStringProperty(source, fileName, factory, name, argumentIndex = 0) {
31
+ const object = factoryObject(parse(fileName, source), [factory], argumentIndex);
32
+ const item = property(object, name);
33
+ return item && ts.isPropertyAssignment(item) && ts.isStringLiteralLike(item.initializer)
34
+ ? item.initializer.text
35
+ : undefined;
36
+ }
37
+ export function staticPropertyName(node) {
38
+ if (node === undefined)
39
+ return undefined;
40
+ if (ts.isIdentifier(node) || ts.isStringLiteralLike(node) || ts.isNumericLiteral(node)) {
41
+ return node.text;
42
+ }
43
+ return undefined;
44
+ }
45
+ function factoryObject(file, factories, argumentIndex = 0) {
46
+ const matches = [];
47
+ const visit = (node) => {
48
+ if (ts.isCallExpression(node) && factories.includes(lastSegment(node.expression))) {
49
+ const argument = unwrap(node.arguments[argumentIndex]);
50
+ if (!argument || !ts.isObjectLiteralExpression(argument))
51
+ unsupported(file.fileName);
52
+ matches.push(argument);
53
+ }
54
+ ts.forEachChild(node, visit);
55
+ };
56
+ visit(file);
57
+ if (matches.length !== 1)
58
+ unsupported(file.fileName);
59
+ return matches[0];
60
+ }
61
+ function descend(root, path, source, memberSource) {
62
+ let object = root;
63
+ for (const [index, name] of path.entries()) {
64
+ assertObject(object, source);
65
+ const found = property(object, name);
66
+ if (found === undefined) {
67
+ if (index !== path.length - 1)
68
+ unsupported("nested object");
69
+ return { object, parent: object, name, created: true };
70
+ }
71
+ if (!ts.isPropertyAssignment(found))
72
+ unsupported(name);
73
+ const value = unwrap(found.initializer);
74
+ if (!value || !ts.isObjectLiteralExpression(value))
75
+ unsupported(name);
76
+ object = value;
77
+ }
78
+ return { object, name: path.at(-1) ?? memberSource, created: false };
79
+ }
80
+ function insertMember(source, object, member) {
81
+ const close = object.getEnd() - 1;
82
+ const body = source.slice(object.getStart() + 1, close);
83
+ if (object.properties.length === 0) {
84
+ return `${source.slice(0, object.getStart() + 1)} ${member} ${source.slice(close)}`;
85
+ }
86
+ if (!body.includes("\n")) {
87
+ const last = object.properties.at(-1);
88
+ return `${source.slice(0, last.getEnd())}, ${member}${source.slice(last.getEnd())}`;
89
+ }
90
+ const last = object.properties.at(-1);
91
+ const between = source.slice(last.getEnd(), close);
92
+ const comma = between.trimStart().startsWith(",") ? "" : ",";
93
+ const lineStart = source.lastIndexOf("\n", close - 1) + 1;
94
+ const closeIndent = source.slice(lineStart, close);
95
+ return `${source.slice(0, last.getEnd())}${comma}${source.slice(last.getEnd(), close)}${closeIndent} ${member},\n${closeIndent}${source.slice(close)}`;
96
+ }
97
+ function assertObject(object, source) {
98
+ for (const item of object.properties) {
99
+ if (ts.isSpreadAssignment(item) || staticPropertyName(item.name) === undefined) {
100
+ unsupported(source.slice(item.getStart(), item.getEnd()));
101
+ }
102
+ }
103
+ }
104
+ function property(object, name) {
105
+ return object.properties.find((item) => staticPropertyName(item.name) === name);
106
+ }
107
+ function parse(fileName, source) {
108
+ const file = ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
109
+ const diagnostics = file.parseDiagnostics;
110
+ if (diagnostics?.length)
111
+ unsupported(fileName);
112
+ return file;
113
+ }
114
+ function unwrap(value) {
115
+ let current = value;
116
+ while (current &&
117
+ (ts.isParenthesizedExpression(current) ||
118
+ ts.isAsExpression(current) ||
119
+ ts.isSatisfiesExpression(current)))
120
+ current = current.expression;
121
+ return current;
122
+ }
123
+ function lastSegment(expression) {
124
+ return ts.isIdentifier(expression)
125
+ ? expression.text
126
+ : ts.isPropertyAccessExpression(expression)
127
+ ? expression.name.text
128
+ : "";
129
+ }
130
+ function collision(fileName, path) {
131
+ throw new AddScaffoldError(ADD_FAILURE_CODES.collision, `${fileName} already declares ${path.join(".")}.`);
132
+ }
133
+ function unsupported(label) {
134
+ throw new AddScaffoldError(ADD_FAILURE_CODES.unsupportedSourceShape, `Cannot safely edit canonical object in ${label}.`);
135
+ }
136
+ //# sourceMappingURL=source-edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-edit.js","sourceRoot":"","sources":["../src/source-edit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Adds or merges one import declaration without reprinting the source file. */
2
+ export declare function addSourceImport(source: string, fileName: string, declaration: string): string;
3
+ //# sourceMappingURL=source-import-edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-import-edit.d.ts","sourceRoot":"","sources":["../src/source-import-edit.ts"],"names":[],"mappings":"AAGA,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAmC7F"}
@@ -0,0 +1,52 @@
1
+ import * as ts from "typescript";
2
+ import { ADD_FAILURE_CODES, AddScaffoldError } from "./add-types.js";
3
+ /** Adds or merges one import declaration without reprinting the source file. */
4
+ export function addSourceImport(source, fileName, declaration) {
5
+ if (source.includes(declaration))
6
+ return source;
7
+ const file = parse(fileName, source);
8
+ const wantedFile = parse("import.ts", declaration);
9
+ const wanted = wantedFile.statements.find(ts.isImportDeclaration);
10
+ if (!wanted || !ts.isStringLiteralLike(wanted.moduleSpecifier))
11
+ return append(source, file, declaration);
12
+ const moduleName = wanted.moduleSpecifier.text;
13
+ const existing = file.statements
14
+ .filter(ts.isImportDeclaration)
15
+ .find((item) => ts.isStringLiteralLike(item.moduleSpecifier) && item.moduleSpecifier.text === moduleName);
16
+ const currentBindings = existing?.importClause?.namedBindings;
17
+ const wantedBindings = wanted.importClause?.namedBindings;
18
+ if (existing &&
19
+ !existing.importClause?.name &&
20
+ !wanted.importClause?.name &&
21
+ currentBindings &&
22
+ ts.isNamedImports(currentBindings) &&
23
+ wantedBindings &&
24
+ ts.isNamedImports(wantedBindings)) {
25
+ const current = new Set(currentBindings.elements.map((item) => item.getText(file)));
26
+ const missing = wantedBindings.elements
27
+ .map((item) => item.getText(wantedFile))
28
+ .filter((item) => !current.has(item));
29
+ if (missing.length === 0)
30
+ return source;
31
+ const end = currentBindings.elements.at(-1)?.getEnd() ?? currentBindings.getStart() + 1;
32
+ const separator = currentBindings.elements.length ? ", " : "";
33
+ return `${source.slice(0, end)}${separator}${missing.join(", ")}${source.slice(end)}`;
34
+ }
35
+ return append(source, file, declaration);
36
+ }
37
+ function parse(fileName, source) {
38
+ const file = ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
39
+ const diagnostics = file.parseDiagnostics;
40
+ if (diagnostics?.length) {
41
+ throw new AddScaffoldError(ADD_FAILURE_CODES.unsupportedSourceShape, `Cannot safely edit imports in ${fileName}.`);
42
+ }
43
+ return file;
44
+ }
45
+ function append(source, file, declaration) {
46
+ const imports = file.statements.filter(ts.isImportDeclaration);
47
+ const offset = imports.at(-1)?.getEnd() ?? 0;
48
+ return offset === 0
49
+ ? `${declaration}\n${source}`
50
+ : `${source.slice(0, offset)}\n${declaration}${source.slice(offset)}`;
51
+ }
52
+ //# sourceMappingURL=source-import-edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-import-edit.js","sourceRoot":"","sources":["../src/source-import-edit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAErE,gFAAgF;AAChF,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,QAAgB,EAAE,WAAmB;IACnF,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,MAAM,CAAC;IAChD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAClE,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,eAAe,CAAC;QAC5D,OAAO,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU;SAC7B,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC;SAC9B,IAAI,CACH,CAAC,IAAI,EAAE,EAAE,CACP,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,KAAK,UAAU,CAC3F,CAAC;IACJ,MAAM,eAAe,GAAG,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC;IAC9D,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC;IAC1D,IACE,QAAQ;QACR,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI;QAC5B,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI;QAC1B,eAAe;QACf,EAAE,CAAC,cAAc,CAAC,eAAe,CAAC;QAClC,cAAc;QACd,EAAE,CAAC,cAAc,CAAC,cAAc,CAAC,EACjC,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpF,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ;aACpC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;aACvC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACxC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QACxC,MAAM,GAAG,GAAG,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACxF,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACxF,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,KAAK,CAAC,QAAgB,EAAE,MAAc;IAC7C,MAAM,IAAI,GAAG,EAAE,CAAC,gBAAgB,CAC9B,QAAQ,EACR,MAAM,EACN,EAAE,CAAC,YAAY,CAAC,MAAM,EACtB,IAAI,EACJ,EAAE,CAAC,UAAU,CAAC,EAAE,CACjB,CAAC;IACF,MAAM,WAAW,GACf,IACD,CAAC,gBAAgB,CAAC;IACnB,IAAI,WAAW,EAAE,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,gBAAgB,CACxB,iBAAiB,CAAC,sBAAsB,EACxC,iCAAiC,QAAQ,GAAG,CAC7C,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,MAAM,CAAC,MAAc,EAAE,IAAmB,EAAE,WAAmB;IACtE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7C,OAAO,MAAM,KAAK,CAAC;QACjB,CAAC,CAAC,GAAG,WAAW,KAAK,MAAM,EAAE;QAC7B,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function resolveTemplateRoot(context: {
2
+ readonly cwd?: string;
3
+ readonly templateRoot?: string;
4
+ }): string;
5
+ //# sourceMappingURL=template-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-root.d.ts","sourceRoot":"","sources":["../src/template-root.ts"],"names":[],"mappings":"AAIA,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,GAAG,MAAM,CAOT"}
@@ -0,0 +1,15 @@
1
+ import { existsSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ export function resolveTemplateRoot(context) {
5
+ if (context.templateRoot !== undefined)
6
+ return resolve(context.templateRoot);
7
+ const packaged = fileURLToPath(new URL("./templates/default/v1", import.meta.url));
8
+ if (existsSync(packaged))
9
+ return resolve(packaged);
10
+ const source = fileURLToPath(new URL("../../../templates/default/v1", import.meta.url));
11
+ if (existsSync(source))
12
+ return resolve(source);
13
+ return resolve(context.cwd ?? process.cwd(), "templates/default/v1");
14
+ }
15
+ //# sourceMappingURL=template-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-root.js","sourceRoot":"","sources":["../src/template-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,mBAAmB,CAAC,OAGnC;IACC,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACnF,IAAI,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,+BAA+B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxF,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,sBAAsB,CAAC,CAAC;AACvE,CAAC"}
@@ -8,6 +8,6 @@ scaffolder:
8
8
  - `agent` — the minimal example plus a read-only tool and agent descriptor.
9
9
 
10
10
  Each variant is self-contained and can be copied as a project root. It uses
11
- the current checked-in RelKit package version (`0.4.0`), Bun `1.3.10`, and
11
+ the current checked-in RelKit package version (`0.5.0`), Bun `1.3.10`, and
12
12
  TypeScript `5.9.3`. The generator owns project-name substitution and later
13
13
  installation/Git behavior.
@@ -1,3 +1 @@
1
1
  LOG_LEVEL=info
2
- OPENAI_API_KEY=
3
- ANTHROPIC_API_KEY=
@@ -1,11 +1,9 @@
1
1
  # my-app
2
2
 
3
- A RelKit TypeScript/Bun project with the minimal HTTP example and a bounded
4
- agent backed by a function-derived read-only tool. Tests use a deterministic
5
- scripted model, while production resolves the selected AI SDK profile.
6
-
7
- The agent may omit `model` to use the configured default profile. OpenAI and
8
- Anthropic credentials remain named binding-local values.
3
+ A RelKit TypeScript/Bun project with a bounded native LangChain agent and a
4
+ native LangGraph review workflow. The starter uses LangChain's deterministic
5
+ model plus local realtime and thread-state providers, so it runs without an API
6
+ key. Replace the model when connecting a production provider.
9
7
 
10
8
  ## Commands
11
9
 
@@ -18,5 +16,6 @@ bun run typecheck
18
16
  bun run build
19
17
  ```
20
18
 
21
- The example route is `GET /hello?name=RelKit`. Agent prompt and result content
22
- are not captured by default.
19
+ The example route is `GET /hello?name=RelKit`. The assistant exposes typed todo
20
+ state and both native and function-derived tools. The review graph demonstrates
21
+ a typed interrupt and resume on an application-owned `threadId`.
@@ -15,13 +15,15 @@
15
15
  "graph": "relkit graph print"
16
16
  },
17
17
  "dependencies": {
18
- "@relkit/ai-sdk": "0.4.0",
19
- "@relkit/app": "0.4.0"
18
+ "@langchain/langgraph": "1.4.14",
19
+ "@relkit/app": "0.5.0",
20
+ "@relkit/local": "0.5.0",
21
+ "langchain": "1.5.10"
20
22
  },
21
23
  "devDependencies": {
22
24
  "@types/bun": "1.3.10",
23
- "@relkit/cli": "0.4.0",
24
- "@relkit/testing": "0.4.0",
25
+ "@relkit/cli": "0.5.0",
26
+ "@relkit/testing": "0.5.0",
25
27
  "typescript": "5.9.3"
26
28
  }
27
29
  }
@@ -1,23 +1,13 @@
1
- import { aiSdk } from "@relkit/ai-sdk";
2
- import { defineApp, env as binding } from "@relkit/app/config";
1
+ import { defineApp } from "@relkit/app/config";
2
+ import { localAgentState, localRealtime } from "@relkit/local";
3
3
  import env from "@app/platform/env.js";
4
4
  // relkit:create:deployment-imports
5
5
 
6
6
  export default defineApp({
7
7
  env,
8
- model: {
9
- openai: aiSdk({
10
- provider: "openai",
11
- defaultModel: "gpt-5-mini",
12
- apiKey: binding.secret("OPENAI_API_KEY"),
13
- }),
14
- anthropic: aiSdk({
15
- provider: "anthropic",
16
- defaultModel: "claude-sonnet-4-5",
17
- apiKey: binding.secret("ANTHROPIC_API_KEY"),
18
- }),
19
- },
20
- defaults: { model: "openai" },
8
+ realtime: localRealtime(),
9
+ "agent-state": localAgentState(),
10
+ defaults: { realtime: "default", "agent-state": "default" },
21
11
  telemetry: { redaction: { mode: "development-redacted", maxBytes: 65_536 } },
22
12
  server: { port: 3000, maxBodyBytes: 1_048_576 },
23
13
  inspector: { port: 3210 },