create-relkit 0.3.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.
- package/dist/add-name.d.ts +9 -0
- package/dist/add-name.d.ts.map +1 -0
- package/dist/add-name.js +18 -0
- package/dist/add-name.js.map +1 -0
- package/dist/add-options-parser.d.ts +21 -0
- package/dist/add-options-parser.d.ts.map +1 -0
- package/dist/add-options-parser.js +103 -0
- package/dist/add-options-parser.js.map +1 -0
- package/dist/add-options-resource.d.ts +5 -0
- package/dist/add-options-resource.d.ts.map +1 -0
- package/dist/add-options-resource.js +18 -0
- package/dist/add-options-resource.js.map +1 -0
- package/dist/add-options.d.ts +6 -0
- package/dist/add-options.d.ts.map +1 -0
- package/dist/add-options.js +165 -0
- package/dist/add-options.js.map +1 -0
- package/dist/add-output.d.ts +4 -0
- package/dist/add-output.d.ts.map +1 -0
- package/dist/add-output.js +33 -0
- package/dist/add-output.js.map +1 -0
- package/dist/add-plan.d.ts +4 -0
- package/dist/add-plan.d.ts.map +1 -0
- package/dist/add-plan.js +62 -0
- package/dist/add-plan.js.map +1 -0
- package/dist/add-resolution-discovery.d.ts +13 -0
- package/dist/add-resolution-discovery.d.ts.map +1 -0
- package/dist/add-resolution-discovery.js +70 -0
- package/dist/add-resolution-discovery.js.map +1 -0
- package/dist/add-resolution-state.d.ts +23 -0
- package/dist/add-resolution-state.d.ts.map +1 -0
- package/dist/add-resolution-state.js +89 -0
- package/dist/add-resolution-state.js.map +1 -0
- package/dist/add-resolver-domain.d.ts +4 -0
- package/dist/add-resolver-domain.d.ts.map +1 -0
- package/dist/add-resolver-domain.js +150 -0
- package/dist/add-resolver-domain.js.map +1 -0
- package/dist/add-resolver-platform.d.ts +4 -0
- package/dist/add-resolver-platform.d.ts.map +1 -0
- package/dist/add-resolver-platform.js +112 -0
- package/dist/add-resolver-platform.js.map +1 -0
- package/dist/add-resolver-resources.d.ts +4 -0
- package/dist/add-resolver-resources.d.ts.map +1 -0
- package/dist/add-resolver-resources.js +150 -0
- package/dist/add-resolver-resources.js.map +1 -0
- package/dist/add-resolver.d.ts +14 -0
- package/dist/add-resolver.d.ts.map +1 -0
- package/dist/add-resolver.js +41 -0
- package/dist/add-resolver.js.map +1 -0
- package/dist/add-transaction-files.d.ts +12 -0
- package/dist/add-transaction-files.d.ts.map +1 -0
- package/dist/add-transaction-files.js +103 -0
- package/dist/add-transaction-files.js.map +1 -0
- package/dist/add-transaction.d.ts +17 -0
- package/dist/add-transaction.d.ts.map +1 -0
- package/dist/add-transaction.js +115 -0
- package/dist/add-transaction.js.map +1 -0
- package/dist/add-types.d.ts +136 -0
- package/dist/add-types.d.ts.map +1 -0
- package/dist/add-types.js +41 -0
- package/dist/add-types.js.map +1 -0
- package/dist/bucket-profiles.d.ts +4 -0
- package/dist/bucket-profiles.d.ts.map +1 -0
- package/dist/bucket-profiles.js +18 -0
- package/dist/bucket-profiles.js.map +1 -0
- package/dist/create-additions.d.ts +7 -0
- package/dist/create-additions.d.ts.map +1 -0
- package/dist/create-additions.js +27 -0
- package/dist/create-additions.js.map +1 -0
- package/dist/create-preview.d.ts +12 -0
- package/dist/create-preview.d.ts.map +1 -0
- package/dist/create-preview.js +50 -0
- package/dist/create-preview.js.map +1 -0
- package/dist/create-resolver.d.ts +14 -0
- package/dist/create-resolver.d.ts.map +1 -0
- package/dist/create-resolver.js +96 -0
- package/dist/create-resolver.js.map +1 -0
- package/dist/domain-planning.d.ts +24 -0
- package/dist/domain-planning.d.ts.map +1 -0
- package/dist/domain-planning.js +94 -0
- package/dist/domain-planning.js.map +1 -0
- package/dist/generate-files-utilities.d.ts +18 -0
- package/dist/generate-files-utilities.d.ts.map +1 -0
- package/dist/generate-files-utilities.js +87 -0
- package/dist/generate-files-utilities.js.map +1 -0
- package/dist/generate-files.d.ts +1 -12
- package/dist/generate-files.d.ts.map +1 -1
- package/dist/generate-files.js +38 -89
- package/dist/generate-files.js.map +1 -1
- package/dist/generate-output.d.ts +2 -1
- package/dist/generate-output.d.ts.map +1 -1
- package/dist/generate-output.js +9 -0
- package/dist/generate-output.js.map +1 -1
- package/dist/generate-process.d.ts +1 -1
- package/dist/generate-process.d.ts.map +1 -1
- package/dist/generate-process.js +7 -3
- package/dist/generate-process.js.map +1 -1
- package/dist/generate-types.d.ts +46 -0
- package/dist/generate-types.d.ts.map +1 -0
- package/dist/generate-types.js +20 -0
- package/dist/generate-types.js.map +1 -0
- package/dist/generate.d.ts +1 -38
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +34 -32
- package/dist/generate.js.map +1 -1
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +79 -9
- package/dist/index.js.map +1 -1
- package/dist/options.d.ts +5 -1
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +10 -1
- package/dist/options.js.map +1 -1
- package/dist/plan-builder.d.ts +33 -0
- package/dist/plan-builder.d.ts.map +1 -0
- package/dist/plan-builder.js +139 -0
- package/dist/plan-builder.js.map +1 -0
- package/dist/plan-manifest.d.ts +6 -0
- package/dist/plan-manifest.d.ts.map +1 -0
- package/dist/plan-manifest.js +40 -0
- package/dist/plan-manifest.js.map +1 -0
- package/dist/project-discovery-app.d.ts +7 -0
- package/dist/project-discovery-app.d.ts.map +1 -0
- package/dist/project-discovery-app.js +122 -0
- package/dist/project-discovery-app.js.map +1 -0
- package/dist/project-discovery-database.d.ts +11 -0
- package/dist/project-discovery-database.d.ts.map +1 -0
- package/dist/project-discovery-database.js +46 -0
- package/dist/project-discovery-database.js.map +1 -0
- package/dist/project-discovery-types.d.ts +45 -0
- package/dist/project-discovery-types.d.ts.map +1 -0
- package/dist/project-discovery-types.js +2 -0
- package/dist/project-discovery-types.js.map +1 -0
- package/dist/project-discovery.d.ts +4 -0
- package/dist/project-discovery.d.ts.map +1 -0
- package/dist/project-discovery.js +152 -0
- package/dist/project-discovery.js.map +1 -0
- package/dist/prompt-driver.d.ts +32 -0
- package/dist/prompt-driver.d.ts.map +1 -0
- package/dist/prompt-driver.js +42 -0
- package/dist/prompt-driver.js.map +1 -0
- package/dist/provider-planning-definitions.d.ts +35 -0
- package/dist/provider-planning-definitions.d.ts.map +1 -0
- package/dist/provider-planning-definitions.js +109 -0
- package/dist/provider-planning-definitions.js.map +1 -0
- package/dist/provider-planning.d.ts +11 -0
- package/dist/provider-planning.d.ts.map +1 -0
- package/dist/provider-planning.js +131 -0
- package/dist/provider-planning.js.map +1 -0
- package/dist/render-ai-sources.d.ts +18 -0
- package/dist/render-ai-sources.d.ts.map +1 -0
- package/dist/render-ai-sources.js +49 -0
- package/dist/render-ai-sources.js.map +1 -0
- package/dist/render-ai.d.ts +11 -0
- package/dist/render-ai.d.ts.map +1 -0
- package/dist/render-ai.js +61 -0
- package/dist/render-ai.js.map +1 -0
- package/dist/render-auth-schema.d.ts +3 -0
- package/dist/render-auth-schema.d.ts.map +1 -0
- package/dist/render-auth-schema.js +85 -0
- package/dist/render-auth-schema.js.map +1 -0
- package/dist/render-auth-sources.d.ts +3 -0
- package/dist/render-auth-sources.d.ts.map +1 -0
- package/dist/render-auth-sources.js +17 -0
- package/dist/render-auth-sources.js.map +1 -0
- package/dist/render-auth.d.ts +6 -0
- package/dist/render-auth.d.ts.map +1 -0
- package/dist/render-auth.js +84 -0
- package/dist/render-auth.js.map +1 -0
- package/dist/render-database-sources.d.ts +5 -0
- package/dist/render-database-sources.d.ts.map +1 -0
- package/dist/render-database-sources.js +65 -0
- package/dist/render-database-sources.js.map +1 -0
- package/dist/render-database.d.ts +13 -0
- package/dist/render-database.d.ts.map +1 -0
- package/dist/render-database.js +40 -0
- package/dist/render-database.js.map +1 -0
- package/dist/render-domain-register.d.ts +4 -0
- package/dist/render-domain-register.d.ts.map +1 -0
- package/dist/render-domain-register.js +11 -0
- package/dist/render-domain-register.js.map +1 -0
- package/dist/render-domain-sources.d.ts +19 -0
- package/dist/render-domain-sources.d.ts.map +1 -0
- package/dist/render-domain-sources.js +132 -0
- package/dist/render-domain-sources.js.map +1 -0
- package/dist/render-domain.d.ts +26 -0
- package/dist/render-domain.d.ts.map +1 -0
- package/dist/render-domain.js +98 -0
- package/dist/render-domain.js.map +1 -0
- package/dist/render-resource-sources.d.ts +4 -0
- package/dist/render-resource-sources.d.ts.map +1 -0
- package/dist/render-resource-sources.js +31 -0
- package/dist/render-resource-sources.js.map +1 -0
- package/dist/render-resources.d.ts +11 -0
- package/dist/render-resources.d.ts.map +1 -0
- package/dist/render-resources.js +53 -0
- package/dist/render-resources.js.map +1 -0
- package/dist/render-route-sources.d.ts +6 -0
- package/dist/render-route-sources.d.ts.map +1 -0
- package/dist/render-route-sources.js +35 -0
- package/dist/render-route-sources.js.map +1 -0
- package/dist/render-routes.d.ts +13 -0
- package/dist/render-routes.d.ts.map +1 -0
- package/dist/render-routes.js +48 -0
- package/dist/render-routes.js.map +1 -0
- package/dist/render-service.d.ts +6 -0
- package/dist/render-service.d.ts.map +1 -0
- package/dist/render-service.js +124 -0
- package/dist/render-service.js.map +1 -0
- package/dist/scaffold-catalog.d.ts +75 -0
- package/dist/scaffold-catalog.d.ts.map +1 -0
- package/dist/scaffold-catalog.js +24 -0
- package/dist/scaffold-catalog.js.map +1 -0
- package/dist/source-edit.d.ts +10 -0
- package/dist/source-edit.d.ts.map +1 -0
- package/dist/source-edit.js +136 -0
- package/dist/source-edit.js.map +1 -0
- package/dist/source-import-edit.d.ts +3 -0
- package/dist/source-import-edit.d.ts.map +1 -0
- package/dist/source-import-edit.js +52 -0
- package/dist/source-import-edit.js.map +1 -0
- package/dist/template-root.d.ts +5 -0
- package/dist/template-root.d.ts.map +1 -0
- package/dist/template-root.js +15 -0
- package/dist/template-root.js.map +1 -0
- package/dist/templates/default/README.md +1 -1
- package/dist/templates/default/v1/agent/.env.example +0 -2
- package/dist/templates/default/v1/agent/README.md +7 -8
- package/dist/templates/default/v1/agent/package.json +6 -4
- package/dist/templates/default/v1/agent/relkit.config.ts +5 -15
- package/dist/templates/default/v1/agent/src/hello/agents/assistant.agent.ts +37 -4
- package/dist/templates/default/v1/agent/src/hello/agents/review.agent.ts +43 -0
- package/dist/templates/default/v1/agent/src/platform/env.ts +0 -2
- package/dist/templates/default/v1/agent/tests/integration/hello.route.test.ts +17 -6
- package/dist/templates/default/v1/agent/tests/unit/assistant.agent.test.ts +14 -36
- package/dist/templates/default/v1/agent/tests/unit/review.agent.test.ts +19 -0
- package/dist/templates/default/v1/api/package.json +3 -3
- package/dist/templates/default/v1/fullstack/.env.example +1 -0
- package/dist/templates/default/v1/fullstack/README.md +15 -0
- package/dist/templates/default/v1/fullstack/gitignore +4 -0
- package/dist/templates/default/v1/fullstack/package.json +35 -0
- package/dist/templates/default/v1/fullstack/relkit.config.ts +15 -0
- package/dist/templates/default/v1/fullstack/src/hello/agents/assistant.agent.ts +46 -0
- package/dist/templates/default/v1/fullstack/src/hello/agents/review.agent.ts +43 -0
- package/dist/templates/default/v1/fullstack/src/hello/functions/hello.function.ts +10 -0
- package/dist/templates/default/v1/fullstack/src/hello/service.ts +4 -0
- package/dist/templates/default/v1/fullstack/src/hello/tools/lookup.tool.ts +9 -0
- package/dist/templates/default/v1/fullstack/src/platform/env.ts +5 -0
- package/dist/templates/default/v1/fullstack/src/routes/hello/route.ts +4 -0
- package/dist/templates/default/v1/fullstack/tests/integration/hello.route.test.ts +29 -0
- package/dist/templates/default/v1/fullstack/tests/unit/assistant.agent.test.ts +18 -0
- package/dist/templates/default/v1/fullstack/tests/unit/hello.function.test.ts +7 -0
- package/dist/templates/default/v1/fullstack/tests/unit/review.agent.test.ts +19 -0
- package/dist/templates/default/v1/fullstack/tsconfig.json +21 -0
- package/dist/templates/default/v1/fullstack/web/app/agent-config.ts +7 -0
- package/dist/templates/default/v1/fullstack/web/app/layout.tsx +12 -0
- package/dist/templates/default/v1/fullstack/web/app/page.tsx +85 -0
- package/dist/templates/default/v1/fullstack/web/app/providers.tsx +29 -0
- package/dist/templates/default/v1/fullstack/web/next-env.d.ts +2 -0
- package/dist/templates/default/v1/fullstack/web/next.config.ts +5 -0
- package/dist/templates/default/v1/fullstack/web/tsconfig.json +10 -0
- package/dist/templates/default/v1/minimal/package.json +3 -3
- package/dist/templates/default/v1/tasks/.env.example +2 -0
- package/dist/templates/default/v1/tasks/README.md +15 -0
- package/dist/templates/default/v1/tasks/examples/export-orders.json +1 -0
- package/dist/templates/default/v1/tasks/gitignore +10 -0
- package/dist/templates/default/v1/tasks/package.json +24 -0
- package/dist/templates/default/v1/tasks/relkit.config.ts +11 -0
- package/dist/templates/default/v1/tasks/src/orders/functions/health.function.ts +9 -0
- package/dist/templates/default/v1/tasks/src/orders/jobs/export-orders.job.ts +15 -0
- package/dist/templates/default/v1/tasks/src/orders/service.ts +10 -0
- package/dist/templates/default/v1/tasks/src/orders/tasks/export-orders.task.ts +19 -0
- package/dist/templates/default/v1/tasks/src/platform/env.ts +3 -0
- package/dist/templates/default/v1/tasks/src/routes/health/route.ts +4 -0
- package/dist/templates/default/v1/tasks/tests/unit/export-orders.task.test.ts +7 -0
- package/dist/templates/default/v1/tasks/tsconfig.json +14 -0
- package/package.json +6 -1
- package/dist/templates/default/v1/agent/src/hello/functions/ask-assistant.function.ts +0 -16
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { sourceImport } from "./domain-planning.js";
|
|
2
|
+
export function toolSource(artifact, target, targetModule, sideEffect, approval) {
|
|
3
|
+
return `${sourceImport(target.binding, targetModule, target.exportKind)}
|
|
4
|
+
|
|
5
|
+
const ${artifact.binding} = ${target.binding}.asTool({
|
|
6
|
+
id: "${artifact.id}",
|
|
7
|
+
description: "${artifact.name.input}",
|
|
8
|
+
sideEffect: "${sideEffect}",
|
|
9
|
+
approval: "${approval}",
|
|
10
|
+
timeoutMs: 2_000,
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
export default ${artifact.binding};
|
|
14
|
+
`;
|
|
15
|
+
}
|
|
16
|
+
export function agentSource(artifact, model, tools, instructions) {
|
|
17
|
+
const imports = [
|
|
18
|
+
`import { defineAgent } from "@relkit/app/agents";`,
|
|
19
|
+
`import { z } from "@relkit/app/schema";`,
|
|
20
|
+
...(model === undefined ? [`import { FakeToolCallingModel } from "langchain";`] : []),
|
|
21
|
+
...tools.map((tool) => sourceImport(tool.binding, tool.module, tool.exportKind)),
|
|
22
|
+
...(instructions.binding && instructions.module
|
|
23
|
+
? [sourceImport(instructions.binding, instructions.module, instructions.exportKind)]
|
|
24
|
+
: []),
|
|
25
|
+
];
|
|
26
|
+
const prompt = instructions.binding ?? JSON.stringify(instructions.text);
|
|
27
|
+
return `${imports.join("\n")}\n\nconst ${artifact.binding} = defineAgent({
|
|
28
|
+
id: "${artifact.id}",
|
|
29
|
+
input: z.object({ question: z.string().min(1) }),
|
|
30
|
+
output: z.object({ answer: z.string() }),
|
|
31
|
+
model: ${model === undefined ? offlineModel() : JSON.stringify(model)},
|
|
32
|
+
instructions: ${prompt},
|
|
33
|
+
tools: [${tools.map((tool) => tool.binding).join(", ")}],
|
|
34
|
+
limits: { maxSteps: 4, maxToolCalls: 4, timeoutMs: 10_000 },
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
export default ${artifact.binding};
|
|
38
|
+
`;
|
|
39
|
+
}
|
|
40
|
+
function offlineModel() {
|
|
41
|
+
return `new FakeToolCallingModel({
|
|
42
|
+
toolCalls: [[{
|
|
43
|
+
name: "relkit_output",
|
|
44
|
+
args: { value: { answer: "Hello from the offline LangChain model." } },
|
|
45
|
+
id: "output-1",
|
|
46
|
+
}]],
|
|
47
|
+
})`;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=render-ai-sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-ai-sources.js","sourceRoot":"","sources":["../src/render-ai-sources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuB,MAAM,sBAAsB,CAAC;AAOzE,MAAM,UAAU,UAAU,CACxB,QAAwB,EACxB,MAAyB,EACzB,YAAoB,EACpB,UAAkD,EAClD,QAAyC;IAEzC,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC;;QAEjE,QAAQ,CAAC,OAAO,MAAM,MAAM,CAAC,OAAO;SACnC,QAAQ,CAAC,EAAE;kBACF,QAAQ,CAAC,IAAI,CAAC,KAAK;iBACpB,UAAU;eACZ,QAAQ;;;;iBAIN,QAAQ,CAAC,OAAO;CAChC,CAAC;AACF,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,QAAwB,EACxB,KAAyB,EACzB,KAIG,EACH,YAKC;IAED,MAAM,OAAO,GAAG;QACd,mDAAmD;QACnD,yCAAyC;QACzC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAChF,GAAG,CAAC,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,MAAM;YAC7C,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;YACpF,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IACF,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,OAAO;SAClD,QAAQ,CAAC,EAAE;;;WAGT,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;kBACrD,MAAM;YACZ,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;iBAIvC,QAAQ,CAAC,OAAO;CAChC,CAAC;AACF,CAAC;AAED,SAAS,YAAY;IACnB,OAAO;;;;;;KAMJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type AddRequest } from "./add-types.js";
|
|
2
|
+
import { type DomainTarget } from "./domain-planning.js";
|
|
3
|
+
import { PlanBuilder } from "./plan-builder.js";
|
|
4
|
+
import { type RenderedArtifact } from "./render-domain.js";
|
|
5
|
+
export declare function renderTool(builder: PlanBuilder, target: DomainTarget, request: Extract<AddRequest, {
|
|
6
|
+
kind: "tool";
|
|
7
|
+
}>): Promise<RenderedArtifact>;
|
|
8
|
+
export declare function renderAgent(builder: PlanBuilder, target: DomainTarget, request: Extract<AddRequest, {
|
|
9
|
+
kind: "agent";
|
|
10
|
+
}>): Promise<RenderedArtifact>;
|
|
11
|
+
//# sourceMappingURL=render-ai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-ai.d.ts","sourceRoot":"","sources":["../src/render-ai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,wBAAsB,UAAU,CAC9B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC7C,OAAO,CAAC,gBAAgB,CAAC,CA6B3B;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,GAC9C,OAAO,CAAC,gBAAgB,CAAC,CAkC3B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { ADD_FAILURE_CODES, AddScaffoldError } from "./add-types.js";
|
|
2
|
+
import { assertAvailableId, domainArtifact, resolveArtifact, sourceModule, } from "./domain-planning.js";
|
|
3
|
+
import { PlanBuilder } from "./plan-builder.js";
|
|
4
|
+
import { agentSource, toolSource } from "./render-ai-sources.js";
|
|
5
|
+
import { renderFunction } from "./render-domain.js";
|
|
6
|
+
export async function renderTool(builder, target, request) {
|
|
7
|
+
const functionTarget = !request.createFunction &&
|
|
8
|
+
(target.service ||
|
|
9
|
+
builder.artifacts.some((item) => item.domain === target.domain.fileStem && item.kind === "function"))
|
|
10
|
+
? resolveArtifact(builder, target, "function", request.target)
|
|
11
|
+
: await renderFunction(builder, target, request.target);
|
|
12
|
+
const artifact = domainArtifact(target, request.name, "tools", "tool", "tool");
|
|
13
|
+
assertAvailableId(builder, artifact.id);
|
|
14
|
+
await builder.create(artifact.path, toolSource(artifact, functionTarget, sourceModule(functionTarget.path), request.sideEffect, request.approval));
|
|
15
|
+
builder.registerArtifact("tool", {
|
|
16
|
+
domain: target.domain.fileStem,
|
|
17
|
+
path: artifact.path,
|
|
18
|
+
binding: artifact.binding,
|
|
19
|
+
id: artifact.id,
|
|
20
|
+
exportKind: artifact.exportKind,
|
|
21
|
+
});
|
|
22
|
+
return artifact;
|
|
23
|
+
}
|
|
24
|
+
export async function renderAgent(builder, target, request) {
|
|
25
|
+
const artifact = domainArtifact(target, request.name, "agents", "agent", "agent");
|
|
26
|
+
assertAvailableId(builder, artifact.id);
|
|
27
|
+
if (request.model !== undefined) {
|
|
28
|
+
const [profile] = request.model.split(":", 1);
|
|
29
|
+
if (!builder.discovery.profiles.some((item) => item.capability === "model" && item.name === profile)) {
|
|
30
|
+
throw new AddScaffoldError(ADD_FAILURE_CODES.usage, `Model profile ${profile} does not exist; configure a native model profile first.`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
builder.dependency("langchain");
|
|
35
|
+
}
|
|
36
|
+
const tools = request.tools.map((value) => {
|
|
37
|
+
const tool = resolveArtifact(builder, target, "tool", value);
|
|
38
|
+
return { binding: tool.binding, module: sourceModule(tool.path), exportKind: tool.exportKind };
|
|
39
|
+
});
|
|
40
|
+
const instructions = request.prompt
|
|
41
|
+
? promptInstructions(builder, target, request.prompt)
|
|
42
|
+
: { text: request.instructions };
|
|
43
|
+
await builder.create(artifact.path, agentSource(artifact, request.model, tools, instructions));
|
|
44
|
+
builder.registerArtifact("agent", {
|
|
45
|
+
domain: target.domain.fileStem,
|
|
46
|
+
path: artifact.path,
|
|
47
|
+
binding: artifact.binding,
|
|
48
|
+
id: artifact.id,
|
|
49
|
+
exportKind: artifact.exportKind,
|
|
50
|
+
});
|
|
51
|
+
return artifact;
|
|
52
|
+
}
|
|
53
|
+
function promptInstructions(builder, target, value) {
|
|
54
|
+
const prompt = resolveArtifact(builder, target, "prompt", value);
|
|
55
|
+
return {
|
|
56
|
+
binding: prompt.binding,
|
|
57
|
+
module: sourceModule(prompt.path),
|
|
58
|
+
exportKind: prompt.exportKind,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=render-ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-ai.js","sourceRoot":"","sources":["../src/render-ai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-auth-schema.d.ts","sourceRoot":"","sources":["../src/render-auth-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAsCtD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAyDjE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
const DIALECTS = {
|
|
2
|
+
sqlite: {
|
|
3
|
+
imports: "integer, sqliteTable, text, uniqueIndex",
|
|
4
|
+
table: "sqliteTable",
|
|
5
|
+
string: "text()",
|
|
6
|
+
token: "text()",
|
|
7
|
+
boolean: `integer({ mode: "boolean" })`,
|
|
8
|
+
timestamp: `integer({ mode: "timestamp" })`,
|
|
9
|
+
},
|
|
10
|
+
postgresql: {
|
|
11
|
+
imports: "boolean, pgTable, text, timestamp, uniqueIndex",
|
|
12
|
+
table: "pgTable",
|
|
13
|
+
string: "text()",
|
|
14
|
+
token: "text()",
|
|
15
|
+
boolean: "boolean()",
|
|
16
|
+
timestamp: `timestamp({ withTimezone: true })`,
|
|
17
|
+
},
|
|
18
|
+
mysql: {
|
|
19
|
+
imports: "boolean, datetime, mysqlTable, text, uniqueIndex, varchar",
|
|
20
|
+
table: "mysqlTable",
|
|
21
|
+
string: "varchar({ length: 255 })",
|
|
22
|
+
token: "text()",
|
|
23
|
+
boolean: "boolean()",
|
|
24
|
+
timestamp: "datetime()",
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
export function authSchemaSource(dialect) {
|
|
28
|
+
const value = DIALECTS[dialect];
|
|
29
|
+
const module = dialect === "postgresql" ? "pg" : dialect;
|
|
30
|
+
return `import { ${value.imports} } from "drizzle-orm/${module}-core";
|
|
31
|
+
|
|
32
|
+
const timestamps = {
|
|
33
|
+
createdAt: ${value.timestamp}.notNull(),
|
|
34
|
+
updatedAt: ${value.timestamp}.notNull(),
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const user = ${value.table}("user", {
|
|
38
|
+
id: ${value.string}.primaryKey(),
|
|
39
|
+
name: ${value.string}.notNull(),
|
|
40
|
+
email: ${value.string}.notNull().unique(),
|
|
41
|
+
emailVerified: ${value.boolean}.notNull(),
|
|
42
|
+
image: ${value.token},
|
|
43
|
+
...timestamps,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
export const session = ${value.table}("session", {
|
|
47
|
+
id: ${value.string}.primaryKey(),
|
|
48
|
+
expiresAt: ${value.timestamp}.notNull(),
|
|
49
|
+
token: ${value.string}.notNull().unique(),
|
|
50
|
+
ipAddress: ${value.string},
|
|
51
|
+
userAgent: ${value.token},
|
|
52
|
+
userId: ${value.string}.notNull(),
|
|
53
|
+
...timestamps,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
export const account = ${value.table}(
|
|
57
|
+
"account",
|
|
58
|
+
{
|
|
59
|
+
id: ${value.string}.primaryKey(),
|
|
60
|
+
accountId: ${value.string}.notNull(),
|
|
61
|
+
issuer: ${value.string}.notNull(),
|
|
62
|
+
providerId: ${value.string}.notNull(),
|
|
63
|
+
userId: ${value.string}.notNull(),
|
|
64
|
+
accessToken: ${value.token},
|
|
65
|
+
refreshToken: ${value.token},
|
|
66
|
+
idToken: ${value.token},
|
|
67
|
+
accessTokenExpiresAt: ${value.timestamp},
|
|
68
|
+
refreshTokenExpiresAt: ${value.timestamp},
|
|
69
|
+
scope: ${value.string},
|
|
70
|
+
password: ${value.token},
|
|
71
|
+
...timestamps,
|
|
72
|
+
},
|
|
73
|
+
(table) => [uniqueIndex("account_issuer_account_id").on(table.issuer, table.accountId)],
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
export const verification = ${value.table}("verification", {
|
|
77
|
+
id: ${value.string}.primaryKey(),
|
|
78
|
+
identifier: ${value.string}.notNull(),
|
|
79
|
+
value: ${value.token}.notNull(),
|
|
80
|
+
expiresAt: ${value.timestamp}.notNull(),
|
|
81
|
+
...timestamps,
|
|
82
|
+
});
|
|
83
|
+
`;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=render-auth-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-auth-schema.js","sourceRoot":"","sources":["../src/render-auth-schema.ts"],"names":[],"mappings":"AAWA,MAAM,QAAQ,GAAmD;IAC/D,MAAM,EAAE;QACN,OAAO,EAAE,yCAAyC;QAClD,KAAK,EAAE,aAAa;QACpB,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,8BAA8B;QACvC,SAAS,EAAE,gCAAgC;KAC5C;IACD,UAAU,EAAE;QACV,OAAO,EAAE,gDAAgD;QACzD,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,mCAAmC;KAC/C;IACD,KAAK,EAAE;QACL,OAAO,EAAE,2DAA2D;QACpE,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,0BAA0B;QAClC,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,YAAY;KACxB;CACF,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,OAAwB;IACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IACzD,OAAO,YAAY,KAAK,CAAC,OAAO,wBAAwB,MAAM;;;eAGjD,KAAK,CAAC,SAAS;eACf,KAAK,CAAC,SAAS;;;sBAGR,KAAK,CAAC,KAAK;QACzB,KAAK,CAAC,MAAM;UACV,KAAK,CAAC,MAAM;WACX,KAAK,CAAC,MAAM;mBACJ,KAAK,CAAC,OAAO;WACrB,KAAK,CAAC,KAAK;;;;yBAIG,KAAK,CAAC,KAAK;QAC5B,KAAK,CAAC,MAAM;eACL,KAAK,CAAC,SAAS;WACnB,KAAK,CAAC,MAAM;eACR,KAAK,CAAC,MAAM;eACZ,KAAK,CAAC,KAAK;YACd,KAAK,CAAC,MAAM;;;;yBAIC,KAAK,CAAC,KAAK;;;UAG1B,KAAK,CAAC,MAAM;iBACL,KAAK,CAAC,MAAM;cACf,KAAK,CAAC,MAAM;kBACR,KAAK,CAAC,MAAM;cAChB,KAAK,CAAC,MAAM;mBACP,KAAK,CAAC,KAAK;oBACV,KAAK,CAAC,KAAK;eAChB,KAAK,CAAC,KAAK;4BACE,KAAK,CAAC,SAAS;6BACd,KAAK,CAAC,SAAS;aAC/B,KAAK,CAAC,MAAM;gBACT,KAAK,CAAC,KAAK;;;;;;8BAMG,KAAK,CAAC,KAAK;QACjC,KAAK,CAAC,MAAM;gBACJ,KAAK,CAAC,MAAM;WACjB,KAAK,CAAC,KAAK;eACP,KAAK,CAAC,SAAS;;;CAG7B,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-auth-sources.d.ts","sourceRoot":"","sources":["../src/render-auth-sources.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,IAAI,MAAM,CAQ1C;AAED,wBAAgB,eAAe,IAAI,MAAM,CAMxC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function authServiceSource() {
|
|
2
|
+
return `import { defineBetterAuthService } from "@relkit/better-auth";
|
|
3
|
+
|
|
4
|
+
export default defineBetterAuthService({
|
|
5
|
+
baseURL: process.env.BETTER_AUTH_URL ?? "http://127.0.0.1:3000",
|
|
6
|
+
emailAndPassword: { enabled: true },
|
|
7
|
+
});
|
|
8
|
+
`;
|
|
9
|
+
}
|
|
10
|
+
export function authRouteSource() {
|
|
11
|
+
return `import { defineRoute } from "@relkit/app/routes";
|
|
12
|
+
import auth from "@app/auth/service.js";
|
|
13
|
+
|
|
14
|
+
export const ALL = defineRoute({ handler: auth.handler });
|
|
15
|
+
`;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=render-auth-sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-auth-sources.js","sourceRoot":"","sources":["../src/render-auth-sources.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB;IAC/B,OAAO;;;;;;CAMR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;CAIR,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type AddRequest } from "./add-types.js";
|
|
2
|
+
import { PlanBuilder } from "./plan-builder.js";
|
|
3
|
+
export declare function renderAuth(builder: PlanBuilder, request: Extract<AddRequest, {
|
|
4
|
+
kind: "auth";
|
|
5
|
+
}>): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=render-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-auth.d.ts","sourceRoot":"","sources":["../src/render-auth.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuC,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAUhD,wBAAsB,UAAU,CAC9B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC7C,OAAO,CAAC,IAAI,CAAC,CA0Cf"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { dirname, posix } from "node:path";
|
|
2
|
+
import { routePathToFilePath } from "@relkit/compiler";
|
|
3
|
+
import { ADD_FAILURE_CODES, AddScaffoldError } from "./add-types.js";
|
|
4
|
+
import { PlanBuilder } from "./plan-builder.js";
|
|
5
|
+
import { ensureEnvironment } from "./provider-planning.js";
|
|
6
|
+
import { authSchemaSource } from "./render-auth-schema.js";
|
|
7
|
+
import { authRouteSource, authServiceSource } from "./render-auth-sources.js";
|
|
8
|
+
import { renderDatabase } from "./render-database.js";
|
|
9
|
+
import { addSourceExport } from "./source-edit.js";
|
|
10
|
+
const AUTH_TABLES = ["user", "session", "account", "verification"];
|
|
11
|
+
export async function renderAuth(builder, request) {
|
|
12
|
+
if (builder.discovery.services.some((service) => service.capability === "auth")) {
|
|
13
|
+
collision("An auth service already exists.");
|
|
14
|
+
}
|
|
15
|
+
validateBasePath(request.basePath);
|
|
16
|
+
const existing = builder.discovery.services.filter((service) => service.capability === "database");
|
|
17
|
+
if (existing.length > 1)
|
|
18
|
+
collision("Multiple database services exist.");
|
|
19
|
+
const database = existing[0]
|
|
20
|
+
? existingDatabase(existing[0], request.databaseDialect)
|
|
21
|
+
: await renderDatabase(builder, {
|
|
22
|
+
kind: "database",
|
|
23
|
+
projectRoot: builder.discovery.projectRoot,
|
|
24
|
+
install: request.install,
|
|
25
|
+
orm: "drizzle",
|
|
26
|
+
dialect: request.databaseDialect,
|
|
27
|
+
authSchema: true,
|
|
28
|
+
});
|
|
29
|
+
if (existing[0])
|
|
30
|
+
await addAuthSchema(builder, database);
|
|
31
|
+
await builder.create("src/auth/service.ts", authServiceSource());
|
|
32
|
+
await builder.create(routePathToFilePath(`${request.basePath}/*auth?`), authRouteSource());
|
|
33
|
+
builder.dependency("@relkit/better-auth");
|
|
34
|
+
builder.dependency("better-auth");
|
|
35
|
+
await ensureEnvironment(builder, "BETTER_AUTH_SECRET", "env.secret()");
|
|
36
|
+
await ensureEnvironment(builder, "BETTER_AUTH_URL", `env.url().default(new URL("http://127.0.0.1:3000"))`, "http://127.0.0.1:3000");
|
|
37
|
+
builder.warning("auth-secret-required", "Populate BETTER_AUTH_SECRET with a strong secret before starting auth.");
|
|
38
|
+
builder.nextStep("Set BETTER_AUTH_SECRET in your environment.");
|
|
39
|
+
builder.registerArtifact("service", {
|
|
40
|
+
domain: "auth",
|
|
41
|
+
path: "src/auth/service.ts",
|
|
42
|
+
binding: "auth",
|
|
43
|
+
id: "auth",
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
async function addAuthSchema(builder, database) {
|
|
47
|
+
const directory = dirname(database.schemaPath).replaceAll("\\", "/");
|
|
48
|
+
await assertNoAuthTables(builder.discovery.projectRoot, directory);
|
|
49
|
+
await builder.create(`${directory}/auth.ts`, authSchemaSource(database.dialect));
|
|
50
|
+
await builder.update(database.schemaPath, (source) => addSourceExport(source, database.schemaPath, `export * from "./auth.js";`));
|
|
51
|
+
}
|
|
52
|
+
async function assertNoAuthTables(root, directory) {
|
|
53
|
+
const files = await Array.fromAsync(new Bun.Glob("**/*.ts").scan({ cwd: posix.join(root, directory) }));
|
|
54
|
+
for (const file of files) {
|
|
55
|
+
const source = await Bun.file(posix.join(root, directory, file)).text();
|
|
56
|
+
if (AUTH_TABLES.some((name) => new RegExp(`\\bexport\\s+const\\s+${name}\\b`).test(source))) {
|
|
57
|
+
collision(`The database schema already exports Better Auth table names (${file}).`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function existingDatabase(service, requested) {
|
|
62
|
+
if (!service.dialect || !service.schemaPath) {
|
|
63
|
+
unsupported("The existing database service has no statically discoverable dialect or schema import.");
|
|
64
|
+
}
|
|
65
|
+
if (service.dialect !== requested) {
|
|
66
|
+
collision(`The existing database uses ${service.dialect}, not ${requested}.`);
|
|
67
|
+
}
|
|
68
|
+
return { dialect: service.dialect, servicePath: service.path, schemaPath: service.schemaPath };
|
|
69
|
+
}
|
|
70
|
+
function validateBasePath(value) {
|
|
71
|
+
if (!/^\/(?:[A-Za-z0-9._~-]+(?:\/[A-Za-z0-9._~-]+)*)?$/.test(value) || value === "/") {
|
|
72
|
+
usage(`Invalid auth base path: ${value}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function collision(message) {
|
|
76
|
+
throw new AddScaffoldError(ADD_FAILURE_CODES.collision, message);
|
|
77
|
+
}
|
|
78
|
+
function unsupported(message) {
|
|
79
|
+
throw new AddScaffoldError(ADD_FAILURE_CODES.unsupportedSourceShape, message);
|
|
80
|
+
}
|
|
81
|
+
function usage(message) {
|
|
82
|
+
throw new AddScaffoldError(ADD_FAILURE_CODES.usage, message);
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=render-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-auth.js","sourceRoot":"","sources":["../src/render-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { DatabaseDialect } from "./add-types.js";
|
|
2
|
+
export declare function databaseServiceSource(dialect: DatabaseDialect): string;
|
|
3
|
+
export declare function itemsSchemaSource(dialect: DatabaseDialect): string;
|
|
4
|
+
export declare function drizzleConfigSource(dialect: DatabaseDialect): string;
|
|
5
|
+
//# sourceMappingURL=render-database-sources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-database-sources.d.ts","sourceRoot":"","sources":["../src/render-database-sources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAiBtE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CA0BlE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAkBpE"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export function databaseServiceSource(dialect) {
|
|
2
|
+
const sqlite = dialect === "sqlite";
|
|
3
|
+
const client = sqlite
|
|
4
|
+
? `const sqlite = new Database(env.DATABASE_PATH);\n return drizzle({ client: sqlite });`
|
|
5
|
+
: `const url = env.DATABASE_URL;\n if (!url) throw new Error("DATABASE_URL is required");\n return drizzle.${dialect === "postgresql" ? "postgres" : "mysql"}(url);`;
|
|
6
|
+
return `${sqlite ? `import { Database } from "bun:sqlite";\n` : ""}import { defineDrizzleService } from "@relkit/drizzle";
|
|
7
|
+
import { drizzle } from "drizzle-orm/${sqlite ? "bun-sqlite" : "bun-sql"}";
|
|
8
|
+
import * as schema from "./schema/index.js";
|
|
9
|
+
|
|
10
|
+
export default defineDrizzleService({
|
|
11
|
+
schema,
|
|
12
|
+
client: ({ env }) => {
|
|
13
|
+
${client}
|
|
14
|
+
},
|
|
15
|
+
dispose: (database) => database.$client.close(),
|
|
16
|
+
});
|
|
17
|
+
`;
|
|
18
|
+
}
|
|
19
|
+
export function itemsSchemaSource(dialect) {
|
|
20
|
+
if (dialect === "sqlite") {
|
|
21
|
+
return `import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
|
|
22
|
+
|
|
23
|
+
export const items = sqliteTable("items", {
|
|
24
|
+
id: integer().primaryKey({ autoIncrement: true }),
|
|
25
|
+
name: text().notNull(),
|
|
26
|
+
});
|
|
27
|
+
`;
|
|
28
|
+
}
|
|
29
|
+
if (dialect === "postgresql") {
|
|
30
|
+
return `import { pgTable, serial, text } from "drizzle-orm/pg-core";
|
|
31
|
+
|
|
32
|
+
export const items = pgTable("items", {
|
|
33
|
+
id: serial().primaryKey(),
|
|
34
|
+
name: text().notNull(),
|
|
35
|
+
});
|
|
36
|
+
`;
|
|
37
|
+
}
|
|
38
|
+
return `import { int, mysqlTable, varchar } from "drizzle-orm/mysql-core";
|
|
39
|
+
|
|
40
|
+
export const items = mysqlTable("items", {
|
|
41
|
+
id: int().autoincrement().primaryKey(),
|
|
42
|
+
name: varchar({ length: 255 }).notNull(),
|
|
43
|
+
});
|
|
44
|
+
`;
|
|
45
|
+
}
|
|
46
|
+
export function drizzleConfigSource(dialect) {
|
|
47
|
+
const variable = dialect === "sqlite" ? "DATABASE_PATH" : "DATABASE_URL";
|
|
48
|
+
const value = dialect === "sqlite" ? "path" : "url";
|
|
49
|
+
const invalid = dialect === "sqlite" ? ` || path === ":memory:"` : "";
|
|
50
|
+
return `import { defineConfig } from "drizzle-kit";
|
|
51
|
+
|
|
52
|
+
const ${value} = process.env.${variable};
|
|
53
|
+
if (${value} === undefined || ${value}.trim() === ""${invalid}) {
|
|
54
|
+
throw new Error("Set ${variable} to the database you intend to migrate");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export default defineConfig({
|
|
58
|
+
schema: "./src/database/schema/index.ts",
|
|
59
|
+
dialect: "${dialect}",
|
|
60
|
+
out: "./drizzle",
|
|
61
|
+
dbCredentials: { url: ${value} },
|
|
62
|
+
});
|
|
63
|
+
`;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=render-database-sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-database-sources.js","sourceRoot":"","sources":["../src/render-database-sources.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,OAAwB;IAC5D,MAAM,MAAM,GAAG,OAAO,KAAK,QAAQ,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM;QACnB,CAAC,CAAC,0FAA0F;QAC5F,CAAC,CAAC,iHAAiH,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC;IAC7K,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAC,EAAE;uCAC7B,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;;;;;;MAMlE,MAAM;;;;CAIX,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAwB;IACxD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO;;;;;;CAMV,CAAC;IACA,CAAC;IACD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,OAAO;;;;;;CAMV,CAAC;IACA,CAAC;IACD,OAAO;;;;;;CAMR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAwB;IAC1D,MAAM,QAAQ,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC;IACzE,MAAM,KAAK,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IACpD,MAAM,OAAO,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,OAAO;;QAED,KAAK,kBAAkB,QAAQ;MACjC,KAAK,qBAAqB,KAAK,iBAAiB,OAAO;yBACpC,QAAQ;;;;;cAKnB,OAAO;;0BAEK,KAAK;;CAE9B,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type AddRequest } from "./add-types.js";
|
|
2
|
+
import { PlanBuilder } from "./plan-builder.js";
|
|
3
|
+
export interface RenderedDatabase {
|
|
4
|
+
readonly dialect: Extract<AddRequest, {
|
|
5
|
+
kind: "database";
|
|
6
|
+
}>["dialect"];
|
|
7
|
+
readonly servicePath: string;
|
|
8
|
+
readonly schemaPath: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function renderDatabase(builder: PlanBuilder, request: Extract<AddRequest, {
|
|
11
|
+
kind: "database";
|
|
12
|
+
}>): Promise<RenderedDatabase>;
|
|
13
|
+
//# sourceMappingURL=render-database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-database.d.ts","sourceRoot":"","sources":["../src/render-database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAShD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IACvE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,GACjD,OAAO,CAAC,gBAAgB,CAAC,CA2C3B"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ADD_FAILURE_CODES, AddScaffoldError } from "./add-types.js";
|
|
2
|
+
import { PlanBuilder } from "./plan-builder.js";
|
|
3
|
+
import { ensureEnvironment } from "./provider-planning.js";
|
|
4
|
+
import { authSchemaSource } from "./render-auth-schema.js";
|
|
5
|
+
import { databaseServiceSource, drizzleConfigSource, itemsSchemaSource, } from "./render-database-sources.js";
|
|
6
|
+
export async function renderDatabase(builder, request) {
|
|
7
|
+
if (builder.discovery.services.some((service) => service.capability === "database")) {
|
|
8
|
+
throw new AddScaffoldError(ADD_FAILURE_CODES.collision, "A database service already exists.");
|
|
9
|
+
}
|
|
10
|
+
const servicePath = "src/database/service.ts";
|
|
11
|
+
const schemaPath = "src/database/schema/index.ts";
|
|
12
|
+
await builder.create(servicePath, databaseServiceSource(request.dialect));
|
|
13
|
+
await builder.create(schemaPath, request.authSchema ? authSchemaSource(request.dialect) : itemsSchemaSource(request.dialect));
|
|
14
|
+
await builder.create("drizzle.config.ts", drizzleConfigSource(request.dialect));
|
|
15
|
+
for (const dependency of ["@relkit/drizzle", "drizzle-orm", "drizzle-kit"]) {
|
|
16
|
+
builder.dependency(dependency);
|
|
17
|
+
}
|
|
18
|
+
builder.script("db:generate", "bun --bun drizzle-kit generate");
|
|
19
|
+
builder.script("db:migrate", "bun --bun drizzle-kit migrate");
|
|
20
|
+
await builder.gitignore("/drizzle/");
|
|
21
|
+
if (request.dialect === "sqlite") {
|
|
22
|
+
await ensureEnvironment(builder, "DATABASE_PATH", `env.string().default("./app.sqlite")`, "./app.sqlite");
|
|
23
|
+
await builder.gitignore("*.sqlite");
|
|
24
|
+
await builder.gitignore("*.sqlite-*");
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
await ensureEnvironment(builder, "DATABASE_URL", "env.string()");
|
|
28
|
+
builder.warning("database-url-required", "Populate DATABASE_URL before starting the database service.");
|
|
29
|
+
}
|
|
30
|
+
builder.nextStep("bun run db:generate");
|
|
31
|
+
builder.nextStep("bun run db:migrate");
|
|
32
|
+
builder.registerArtifact("service", {
|
|
33
|
+
domain: "database",
|
|
34
|
+
path: servicePath,
|
|
35
|
+
binding: "database",
|
|
36
|
+
id: "database",
|
|
37
|
+
});
|
|
38
|
+
return { dialect: request.dialect, servicePath, schemaPath };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=render-database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-database.js","sourceRoot":"","sources":["../src/render-database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAmB,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AAQtC,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAoB,EACpB,OAAkD;IAElD,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,KAAK,UAAU,CAAC,EAAE,CAAC;QACpF,MAAM,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,EAAE,oCAAoC,CAAC,CAAC;IAChG,CAAC;IACD,MAAM,WAAW,GAAG,yBAAyB,CAAC;IAC9C,MAAM,UAAU,GAAG,8BAA8B,CAAC;IAClD,MAAM,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1E,MAAM,OAAO,CAAC,MAAM,CAClB,UAAU,EACV,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAC5F,CAAC;IACF,MAAM,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAChF,KAAK,MAAM,UAAU,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,aAAa,CAAU,EAAE,CAAC;QACpF,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,gCAAgC,CAAC,CAAC;IAChE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,+BAA+B,CAAC,CAAC;IAC9D,MAAM,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACrC,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,iBAAiB,CACrB,OAAO,EACP,eAAe,EACf,sCAAsC,EACtC,cAAc,CACf,CAAC;QACF,MAAM,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACpC,MAAM,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,MAAM,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;QACjE,OAAO,CAAC,OAAO,CACb,uBAAuB,EACvB,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IACxC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACvC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE;QAClC,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,UAAU;QACnB,EAAE,EAAE,UAAU;KACf,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DomainTarget, DomainArtifact } from "./domain-planning.js";
|
|
2
|
+
import { PlanBuilder } from "./plan-builder.js";
|
|
3
|
+
export declare function register(builder: PlanBuilder, target: DomainTarget, kind: "function" | "error" | "event" | "task" | "job" | "prompt" | "constants", artifact: DomainArtifact): void;
|
|
4
|
+
//# sourceMappingURL=render-domain-register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-domain-register.d.ts","sourceRoot":"","sources":["../src/render-domain-register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,wBAAgB,QAAQ,CACtB,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,EAC9E,QAAQ,EAAE,cAAc,GACvB,IAAI,CAQN"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { PlanBuilder } from "./plan-builder.js";
|
|
2
|
+
export function register(builder, target, kind, artifact) {
|
|
3
|
+
builder.registerArtifact(kind, {
|
|
4
|
+
domain: target.domain.fileStem,
|
|
5
|
+
path: artifact.path,
|
|
6
|
+
binding: artifact.binding,
|
|
7
|
+
id: artifact.id,
|
|
8
|
+
exportKind: artifact.exportKind,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=render-domain-register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-domain-register.js","sourceRoot":"","sources":["../src/render-domain-register.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,UAAU,QAAQ,CACtB,OAAoB,EACpB,MAAoB,EACpB,IAA8E,EAC9E,QAAwB;IAExB,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE;QAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ;QAC9B,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type DomainArtifact } from "./domain-planning.js";
|
|
2
|
+
type ArtifactReference = {
|
|
3
|
+
readonly binding: string;
|
|
4
|
+
readonly exportKind?: "default" | "named" | undefined;
|
|
5
|
+
};
|
|
6
|
+
export declare function functionSource(artifact: DomainArtifact, relationships?: {
|
|
7
|
+
readonly error?: DomainArtifact;
|
|
8
|
+
readonly event?: DomainArtifact;
|
|
9
|
+
}): string;
|
|
10
|
+
export declare function errorSource(artifact: DomainArtifact): string;
|
|
11
|
+
export declare function eventSource(artifact: DomainArtifact, profile?: string): string;
|
|
12
|
+
export declare function eventFunctionSource(artifact: DomainArtifact, eventId: string, delivery: "transient" | "durable", profile?: string): string;
|
|
13
|
+
export declare function jobSource(artifact: DomainArtifact, target: ArtifactReference, targetModule: string, profile?: string): string;
|
|
14
|
+
export declare function taskSource(artifact: DomainArtifact, version: string, execution: "durable" | "retryable"): string;
|
|
15
|
+
export declare function taskJobSource(artifact: DomainArtifact, target: ArtifactReference, targetModule: string, profile?: string, domain?: string): string;
|
|
16
|
+
export declare function promptSource(artifact: DomainArtifact, text: readonly string[]): string;
|
|
17
|
+
export declare function constantsSource(artifact: DomainArtifact): string;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=render-domain-sources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-domain-sources.d.ts","sourceRoot":"","sources":["../src/render-domain-sources.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEvF,KAAK,iBAAiB,GAAG;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;CACvD,CAAC;AAEF,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,cAAc,EACxB,aAAa,GAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAA;CAAO,GACvF,MAAM,CAyBR;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAa5D;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAoB9E;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAcR;AAED,wBAAgB,SAAS,CACvB,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAaR;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,GAAG,WAAW,GACjC,MAAM,CAkBR;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAgBR;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAEtF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAEhE"}
|