@postxl/generators 1.12.3 → 1.13.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 (121) hide show
  1. package/dist/backend-ai/ai.generator.d.ts +18 -0
  2. package/dist/backend-ai/ai.generator.js +174 -0
  3. package/dist/backend-ai/ai.generator.js.map +1 -0
  4. package/dist/backend-ai/generators/ai-agent-service.generator.d.ts +4 -0
  5. package/dist/backend-ai/generators/ai-agent-service.generator.js +264 -0
  6. package/dist/backend-ai/generators/ai-agent-service.generator.js.map +1 -0
  7. package/dist/backend-ai/generators/ai-cache-service.generator.d.ts +1 -0
  8. package/dist/backend-ai/generators/ai-cache-service.generator.js +110 -0
  9. package/dist/backend-ai/generators/ai-cache-service.generator.js.map +1 -0
  10. package/dist/backend-ai/generators/ai-config.generator.d.ts +1 -0
  11. package/dist/backend-ai/generators/ai-config.generator.js +27 -0
  12. package/dist/backend-ai/generators/ai-config.generator.js.map +1 -0
  13. package/dist/backend-ai/generators/ai-module.generator.d.ts +2 -0
  14. package/dist/backend-ai/generators/ai-module.generator.js +89 -0
  15. package/dist/backend-ai/generators/ai-module.generator.js.map +1 -0
  16. package/dist/backend-ai/generators/ai-route.generator.d.ts +1 -0
  17. package/dist/backend-ai/generators/ai-route.generator.js +29 -0
  18. package/dist/backend-ai/generators/ai-route.generator.js.map +1 -0
  19. package/dist/backend-ai/generators/ai-tools-service.generator.d.ts +4 -0
  20. package/dist/backend-ai/generators/ai-tools-service.generator.js +222 -0
  21. package/dist/backend-ai/generators/ai-tools-service.generator.js.map +1 -0
  22. package/dist/backend-ai/generators/model-provider-interface.generator.d.ts +1 -0
  23. package/dist/backend-ai/generators/model-provider-interface.generator.js +48 -0
  24. package/dist/backend-ai/generators/model-provider-interface.generator.js.map +1 -0
  25. package/dist/backend-ai/generators/openai-model-provider-service.generator.d.ts +1 -0
  26. package/dist/backend-ai/generators/openai-model-provider-service.generator.js +128 -0
  27. package/dist/backend-ai/generators/openai-model-provider-service.generator.js.map +1 -0
  28. package/dist/backend-ai/index.d.ts +4 -0
  29. package/dist/backend-ai/index.js +40 -0
  30. package/dist/backend-ai/index.js.map +1 -0
  31. package/dist/backend-core/generators/main.generator.js +4 -3
  32. package/dist/backend-core/generators/main.generator.js.map +1 -1
  33. package/dist/backend-e2e/backend-e2e.generator.js +4 -4
  34. package/dist/backend-e2e/backend-e2e.generator.js.map +1 -1
  35. package/dist/backend-import/generators/detect-delta/detect-delta-functions.generator.js +1 -1
  36. package/dist/backend-router-trpc/generators/app-routes.generator.js +3 -1
  37. package/dist/backend-router-trpc/generators/app-routes.generator.js.map +1 -1
  38. package/dist/backend-router-trpc/generators/trpc-plugin.generator.js +3 -0
  39. package/dist/backend-router-trpc/generators/trpc-plugin.generator.js.map +1 -1
  40. package/dist/backend-router-trpc/generators/trpc-router-module.generator.js +2 -1
  41. package/dist/backend-router-trpc/generators/trpc-router-module.generator.js.map +1 -1
  42. package/dist/backend-router-trpc/generators/trpc-shared.generator.js +7 -1
  43. package/dist/backend-router-trpc/generators/trpc-shared.generator.js.map +1 -1
  44. package/dist/backend-router-trpc/router-trpc.generator.d.ts +2 -1
  45. package/dist/backend-router-trpc/router-trpc.generator.js +2 -0
  46. package/dist/backend-router-trpc/router-trpc.generator.js.map +1 -1
  47. package/dist/backend-seed/seed.generator.js +10 -1
  48. package/dist/backend-seed/seed.generator.js.map +1 -1
  49. package/dist/base/template/scripts/setup.sh +9 -4
  50. package/dist/base/template/sonar-project.properties +9 -1
  51. package/dist/devops/generators/bitbucket-pipelines-yml.generator.js +1 -0
  52. package/dist/devops/generators/bitbucket-pipelines-yml.generator.js.map +1 -1
  53. package/dist/devops/generators/e2e-yml.generator.js +35 -10
  54. package/dist/devops/generators/e2e-yml.generator.js.map +1 -1
  55. package/dist/devops/generators/jenkinsfile.generator.js +25 -1
  56. package/dist/devops/generators/jenkinsfile.generator.js.map +1 -1
  57. package/dist/e2e/template/e2e/specs/example.spec.ts-snapshots/Navigate-to-homepage-and-take-snapshot-1-chromium-linux.png +0 -0
  58. package/dist/frontend-actions/actions.generator.d.ts +9 -0
  59. package/dist/frontend-actions/actions.generator.js +111 -0
  60. package/dist/frontend-actions/actions.generator.js.map +1 -0
  61. package/dist/frontend-actions/generators/ai-action-text.utils.generator.d.ts +1 -0
  62. package/dist/frontend-actions/generators/ai-action-text.utils.generator.js +52 -0
  63. package/dist/frontend-actions/generators/ai-action-text.utils.generator.js.map +1 -0
  64. package/dist/frontend-actions/generators/ai-assistant-store.generator.d.ts +1 -0
  65. package/dist/frontend-actions/generators/ai-assistant-store.generator.js +230 -0
  66. package/dist/frontend-actions/generators/ai-assistant-store.generator.js.map +1 -0
  67. package/dist/frontend-actions/generators/ai-sidebar-content.generator.d.ts +1 -0
  68. package/dist/frontend-actions/generators/ai-sidebar-content.generator.js +139 -0
  69. package/dist/frontend-actions/generators/ai-sidebar-content.generator.js.map +1 -0
  70. package/dist/frontend-actions/generators/ai-sidepane.generator.d.ts +1 -0
  71. package/dist/frontend-actions/generators/ai-sidepane.generator.js +98 -0
  72. package/dist/frontend-actions/generators/ai-sidepane.generator.js.map +1 -0
  73. package/dist/frontend-actions/generators/base-global-actions.generator.d.ts +1 -0
  74. package/dist/frontend-actions/generators/base-global-actions.generator.js +405 -0
  75. package/dist/frontend-actions/generators/base-global-actions.generator.js.map +1 -0
  76. package/dist/frontend-actions/generators/command-palette-action.generator.d.ts +1 -0
  77. package/dist/frontend-actions/generators/command-palette-action.generator.js +87 -0
  78. package/dist/frontend-actions/generators/command-palette-action.generator.js.map +1 -0
  79. package/dist/frontend-actions/generators/command-palette-store.generator.d.ts +1 -0
  80. package/dist/frontend-actions/generators/command-palette-store.generator.js +288 -0
  81. package/dist/frontend-actions/generators/command-palette-store.generator.js.map +1 -0
  82. package/dist/frontend-actions/generators/command-palette.generator.d.ts +5 -0
  83. package/dist/frontend-actions/generators/command-palette.generator.js +332 -0
  84. package/dist/frontend-actions/generators/command-palette.generator.js.map +1 -0
  85. package/dist/frontend-actions/generators/filter-utils.generator.d.ts +1 -0
  86. package/dist/frontend-actions/generators/filter-utils.generator.js +50 -0
  87. package/dist/frontend-actions/generators/filter-utils.generator.js.map +1 -0
  88. package/dist/frontend-actions/generators/sidepanel-toggle.generator.d.ts +1 -0
  89. package/dist/frontend-actions/generators/sidepanel-toggle.generator.js +37 -0
  90. package/dist/frontend-actions/generators/sidepanel-toggle.generator.js.map +1 -0
  91. package/dist/frontend-actions/index.d.ts +4 -0
  92. package/dist/frontend-actions/index.js +40 -0
  93. package/dist/frontend-actions/index.js.map +1 -0
  94. package/dist/frontend-admin/admin.generator.d.ts +3 -1
  95. package/dist/frontend-admin/admin.generator.js +8 -1
  96. package/dist/frontend-admin/admin.generator.js.map +1 -1
  97. package/dist/frontend-admin/generators/admin-global-actions.generator.d.ts +4 -0
  98. package/dist/frontend-admin/generators/admin-global-actions.generator.js +152 -0
  99. package/dist/frontend-admin/generators/admin-global-actions.generator.js.map +1 -0
  100. package/dist/frontend-admin/generators/detail-sidebar.generator.js +44 -32
  101. package/dist/frontend-admin/generators/detail-sidebar.generator.js.map +1 -1
  102. package/dist/frontend-admin/generators/model-admin-page.generator.js +172 -11
  103. package/dist/frontend-admin/generators/model-admin-page.generator.js.map +1 -1
  104. package/dist/frontend-admin/utils.d.ts +1 -0
  105. package/dist/frontend-admin/utils.js +1 -0
  106. package/dist/frontend-admin/utils.js.map +1 -1
  107. package/dist/frontend-core/generators/tsconfig.generator.js +1 -0
  108. package/dist/frontend-core/generators/tsconfig.generator.js.map +1 -1
  109. package/dist/frontend-core/template/.env.example +3 -0
  110. package/dist/frontend-core/template/src/components/ui/color-mode-toggle/color-mode-toggle.tsx +1 -1
  111. package/dist/frontend-core/template/src/lib/color.ts +6 -3
  112. package/dist/frontend-core/template/src/lib/config.ts +3 -1
  113. package/dist/generators.js +4 -0
  114. package/dist/generators.js.map +1 -1
  115. package/dist/index.d.ts +2 -0
  116. package/dist/index.js +8 -2
  117. package/dist/index.js.map +1 -1
  118. package/dist/types/template/ai.types.ts +34 -0
  119. package/dist/types/types.generator.js +1 -0
  120. package/dist/types/types.generator.js.map +1 -1
  121. package/package.json +4 -4
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.generateAiModule = generateAiModule;
37
+ const Generator = __importStar(require("@postxl/generator"));
38
+ function generateAiModule(context) {
39
+ const imports = Generator.ImportGenerator.from(Generator.toLocalFile(context.ai.module))
40
+ .add(context.ai.agentService)
41
+ .add({
42
+ name: Generator.toClassName('AiCacheService'),
43
+ location: Generator.toBackendModuleLocation('@ai/ai-cache.service'),
44
+ })
45
+ .add({
46
+ name: Generator.toClassName('AiToolsService'),
47
+ location: Generator.toBackendModuleLocation('@ai/ai-tools.service'),
48
+ })
49
+ .add({
50
+ name: Generator.toClassName('OpenAiModelProviderService'),
51
+ location: Generator.toBackendModuleLocation('@ai/model-provider/openai-model-provider.service'),
52
+ })
53
+ .add({
54
+ name: Generator.toConstantName('AI_MODEL_PROVIDER'),
55
+ location: Generator.toBackendModuleLocation('@ai/ai-agent.service'),
56
+ })
57
+ .add({ name: Generator.toClassName('AiConfig'), location: Generator.toBackendModuleLocation('@ai/ai-config') });
58
+ return /* ts */ `
59
+ import { DynamicModule } from '@nestjs/common'
60
+
61
+ ${imports.generate()}
62
+ import type { Config } from './ai-config'
63
+
64
+ export class ${context.ai.module.name} {
65
+ public static forRoot(config: Config): DynamicModule {
66
+ return {
67
+ module: ${context.ai.module.name},
68
+ providers: [
69
+ ${context.ai.agentService.name},
70
+ AiCacheService,
71
+ AiToolsService,
72
+ OpenAiModelProviderService,
73
+ {
74
+ provide: AI_MODEL_PROVIDER,
75
+ useExisting: OpenAiModelProviderService,
76
+ },
77
+ {
78
+ provide: AiConfig,
79
+ useFactory: () => new AiConfig(config),
80
+ },
81
+ ],
82
+ exports: [${context.ai.agentService.name}],
83
+ global: true,
84
+ }
85
+ }
86
+ }
87
+ `;
88
+ }
89
+ //# sourceMappingURL=ai-module.generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-module.generator.js","sourceRoot":"","sources":["../../../src/backend-ai/generators/ai-module.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,4CAmDC;AAvDD,6DAA8C;AAI9C,SAAgB,gBAAgB,CAAC,OAAsB;IACrD,MAAM,OAAO,GAAG,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;SACrF,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC;SAC5B,GAAG,CAAC;QACH,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,gBAAgB,CAAC;QAC7C,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,sBAAsB,CAAC;KACpE,CAAC;SACD,GAAG,CAAC;QACH,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,gBAAgB,CAAC;QAC7C,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,sBAAsB,CAAC;KACpE,CAAC;SACD,GAAG,CAAC;QACH,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,4BAA4B,CAAC;QACzD,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,kDAAkD,CAAC;KAChG,CAAC;SACD,GAAG,CAAC;QACH,IAAI,EAAE,SAAS,CAAC,cAAc,CAAC,mBAAmB,CAAC;QACnD,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,sBAAsB,CAAC;KACpE,CAAC;SACD,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;IAEjH,OAAO,QAAQ,CAAC;;;EAGhB,OAAO,CAAC,QAAQ,EAAE;;;eAGL,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI;;;gBAGrB,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI;;UAE5B,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI;;;;;;;;;;;;;kBAapB,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI;;;;;CAK7C,CAAA;AACD,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function generateAiRoute(): string;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateAiRoute = generateAiRoute;
4
+ function generateAiRoute() {
5
+ return /* ts */ `
6
+ import { z } from 'zod'
7
+
8
+ import { zAskStepInput, zAskTaskInput } from '@types'
9
+
10
+ import { authMiddleware } from '@router-trpc/middleware'
11
+ import { procedure, router } from '@router-trpc/trpc-shared'
12
+
13
+ export const ai = router({
14
+ ask: procedure
15
+ .use(authMiddleware)
16
+ .input(zAskTaskInput)
17
+ .mutation(async ({ input, ctx }) => ctx.aiAgent.startExecution(input, ctx.user.id)),
18
+ step: procedure
19
+ .use(authMiddleware)
20
+ .input(zAskStepInput)
21
+ .mutation(async ({ input, ctx }) => ctx.aiAgent.continueExecution(input, ctx.user.id)),
22
+ cancel: procedure
23
+ .use(authMiddleware)
24
+ .input(z.object({ conversation: z.string() }))
25
+ .mutation(({ input, ctx }) => ctx.aiAgent.cancelExecution(input.conversation, ctx.user.id)),
26
+ })
27
+ `;
28
+ }
29
+ //# sourceMappingURL=ai-route.generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-route.generator.js","sourceRoot":"","sources":["../../../src/backend-ai/generators/ai-route.generator.ts"],"names":[],"mappings":";;AAAA,0CAwBC;AAxBD,SAAgB,eAAe;IAC7B,OAAO,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;CAsBjB,CAAA;AACD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { ContextResult } from '../ai.generator';
2
+ export declare function generateAiToolsService({ context }: {
3
+ context: ContextResult;
4
+ }): string;
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.generateAiToolsService = generateAiToolsService;
37
+ const Generator = __importStar(require("@postxl/generator"));
38
+ function generateAiToolsService({ context }) {
39
+ const imports = Generator.ImportGenerator.from(Generator.toFilePath('./ai-tools.service.ts')).addImport({
40
+ from: context.types.location,
41
+ items: [Generator.toTypeName('ToolDefinition')],
42
+ });
43
+ return /* ts */ `
44
+ import { Injectable } from '@nestjs/common'
45
+
46
+ ${imports.generate()}
47
+
48
+ import type { OpenAITool } from './model-provider/model-provider.interface'
49
+
50
+ export type BackendToolContext = {
51
+ actorKey: string
52
+ }
53
+
54
+ export type BackendToolExecutionLog = {
55
+ toolKey: string
56
+ text: string
57
+ status: 'done' | 'error'
58
+ }
59
+
60
+ export type BackendTool = {
61
+ definition: ToolDefinition
62
+ execute: (
63
+ input: Record<string, unknown>,
64
+ context: BackendToolContext,
65
+ ) => Record<string, unknown> | undefined | Promise<Record<string, unknown> | undefined>
66
+ }
67
+
68
+ @Injectable()
69
+ export class AiToolsService {
70
+ private readonly backendTools = this.createBackendTools()
71
+ private readonly backendToolByKey = new Map<string, BackendTool>()
72
+
73
+ constructor() {
74
+ for (const tool of this.backendTools) {
75
+ const existing = this.backendToolByKey.get(tool.definition.key)
76
+ if (existing) {
77
+ throw new Error('Duplicate backend AI tool key: ' + tool.definition.key)
78
+ }
79
+
80
+ this.backendToolByKey.set(tool.definition.key, {
81
+ ...tool,
82
+ definition: {
83
+ ...tool.definition,
84
+ target: 'backend',
85
+ },
86
+ })
87
+ }
88
+ }
89
+
90
+ public normalizeFrontendTools(tools: ToolDefinition[]): ToolDefinition[] {
91
+ const seen = new Set<string>()
92
+ const normalized: ToolDefinition[] = []
93
+
94
+ for (const tool of tools) {
95
+ if (!this.isValidToolName(tool.key)) {
96
+ throw new Error('Invalid tool key: ' + tool.key)
97
+ }
98
+ if (typeof tool.label !== 'string' || tool.label.trim().length === 0) {
99
+ throw new Error('Invalid tool label for key: ' + tool.key)
100
+ }
101
+ if (tool.key === 'done') {
102
+ continue
103
+ }
104
+
105
+ if (seen.has(tool.key)) {
106
+ continue
107
+ }
108
+
109
+ seen.add(tool.key)
110
+ normalized.push({
111
+ ...tool,
112
+ target: 'frontend',
113
+ })
114
+ }
115
+
116
+ return normalized
117
+ }
118
+
119
+ public assertNoToolKeyCollision(frontendTools: ToolDefinition[]) {
120
+ for (const tool of frontendTools) {
121
+ if (this.backendToolByKey.has(tool.key)) {
122
+ throw new Error('Tool key collision between frontend and backend tools: ' + tool.key)
123
+ }
124
+ }
125
+ }
126
+
127
+ public getBackendTool(toolKey: string): BackendTool | undefined {
128
+ return this.backendToolByKey.get(toolKey)
129
+ }
130
+
131
+ public buildTools(frontendTools: ToolDefinition[]): OpenAITool[] {
132
+ const doneTool: OpenAITool = {
133
+ type: 'function',
134
+ function: {
135
+ name: 'done',
136
+ description: 'Finish the task and optionally provide a summary',
137
+ parameters: {
138
+ type: 'object',
139
+ properties: {
140
+ summary: { type: 'string' },
141
+ },
142
+ },
143
+ },
144
+ }
145
+
146
+ const frontendToolDefinitions = frontendTools.map((tool) => ({
147
+ ...tool,
148
+ target: 'frontend' as const,
149
+ }))
150
+
151
+ const toolDefinitions = [...frontendToolDefinitions, ...this.backendTools.map((tool) => tool.definition)]
152
+
153
+ const actionTools = toolDefinitions.map((tool) => ({
154
+ type: 'function' as const,
155
+ function: {
156
+ name: tool.key,
157
+ description: tool.label,
158
+ parameters:
159
+ tool.inputSchema ??
160
+ (tool.kind === 'input'
161
+ ? {
162
+ type: 'object',
163
+ properties: {
164
+ query: { type: 'string' },
165
+ },
166
+ required: ['query'],
167
+ }
168
+ : {
169
+ type: 'object',
170
+ properties: {},
171
+ }),
172
+ },
173
+ }))
174
+
175
+ return [doneTool, ...actionTools]
176
+ }
177
+
178
+ private isValidToolName(name: string): boolean {
179
+ return /^[a-z][a-z0-9-]{1,127}$/.test(name)
180
+ }
181
+
182
+ private createBackendTools(): BackendTool[] {
183
+ const tools: BackendTool[] = [
184
+ {
185
+ definition: {
186
+ key: 'backend-get-current-time',
187
+ kind: 'command',
188
+ label: 'Get current server time',
189
+ target: 'backend',
190
+ },
191
+ execute: () => ({
192
+ now: new Date().toISOString(),
193
+ }),
194
+ },
195
+ {
196
+ definition: {
197
+ key: 'backend-get-current-user',
198
+ kind: 'command',
199
+ label: 'Get current user identifier',
200
+ target: 'backend',
201
+ },
202
+ execute: (_input, context) => ({
203
+ actorKey: context.actorKey,
204
+ }),
205
+ },
206
+ ]
207
+
208
+ // @custom-start:backendAiTools
209
+ // @custom-end:backendAiTools
210
+
211
+ return tools.map((tool) => ({
212
+ ...tool,
213
+ definition: {
214
+ ...tool.definition,
215
+ target: 'backend',
216
+ },
217
+ }))
218
+ }
219
+ }
220
+ `;
221
+ }
222
+ //# sourceMappingURL=ai-tools-service.generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-tools-service.generator.js","sourceRoot":"","sources":["../../../src/backend-ai/generators/ai-tools-service.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,wDAwLC;AA5LD,6DAA8C;AAI9C,SAAgB,sBAAsB,CAAC,EAAE,OAAO,EAA8B;IAC5E,MAAM,OAAO,GAAG,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,SAAS,CAAC;QACtG,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ;QAC5B,KAAK,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;KAChD,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAC;;;EAGhB,OAAO,CAAC,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8KnB,CAAA;AACD,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function generateModelProviderInterface(): string;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateModelProviderInterface = generateModelProviderInterface;
4
+ function generateModelProviderInterface() {
5
+ return /* ts */ `
6
+ export type ChatMessage =
7
+ | { role: 'system' | 'user'; content: string }
8
+ | { role: 'assistant'; content: string | null; tool_calls?: OpenAIToolCall[] }
9
+ | { role: 'tool'; content: string; tool_call_id: string }
10
+
11
+ export type OpenAITool = {
12
+ type: 'function'
13
+ function: {
14
+ name: string
15
+ description: string
16
+ parameters: Record<string, unknown>
17
+ }
18
+ }
19
+
20
+ export type OpenAIToolCall = {
21
+ id: string
22
+ type: 'function'
23
+ function: {
24
+ name: string
25
+ arguments: string
26
+ }
27
+ }
28
+
29
+ export type AiProviderRequest = {
30
+ messages: ChatMessage[]
31
+ tools: OpenAITool[]
32
+ }
33
+
34
+ export type AiProviderResult = {
35
+ assistantMessage: {
36
+ role: 'assistant'
37
+ content: string | null
38
+ tool_calls: OpenAIToolCall[]
39
+ }
40
+ toolCall: OpenAIToolCall
41
+ }
42
+
43
+ export type AiModelProvider = {
44
+ requestSingleToolCall(request: AiProviderRequest): Promise<AiProviderResult>
45
+ }
46
+ `;
47
+ }
48
+ //# sourceMappingURL=model-provider-interface.generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-provider-interface.generator.js","sourceRoot":"","sources":["../../../src/backend-ai/generators/model-provider-interface.generator.ts"],"names":[],"mappings":";;AAAA,wEA2CC;AA3CD,SAAgB,8BAA8B;IAC5C,OAAO,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCjB,CAAA;AACD,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function generateOpenAiModelProviderService(): string;
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateOpenAiModelProviderService = generateOpenAiModelProviderService;
4
+ function generateOpenAiModelProviderService() {
5
+ return /* ts */ `
6
+ import { Injectable } from '@nestjs/common'
7
+
8
+ import { sanitizeSecretString } from '@postxl/utils'
9
+
10
+ import { AiConfig } from '../ai-config'
11
+ import type { AiModelProvider, AiProviderRequest, AiProviderResult } from './model-provider.interface'
12
+
13
+ @Injectable()
14
+ export class OpenAiModelProviderService implements AiModelProvider {
15
+ constructor(private readonly aiConfig: AiConfig) {}
16
+
17
+ public async requestSingleToolCall(request: AiProviderRequest): Promise<AiProviderResult> {
18
+ const apiKey = this.pickOpenAIApiKey(this.aiConfig.config.openAIApiKeys, this.aiConfig.config.openAIApiKey)
19
+ if (!apiKey) {
20
+ throw new Error('AI_OPENAI_KEY is not configured')
21
+ }
22
+ if (!/^sk-[A-Za-z0-9]/.test(apiKey)) {
23
+ throw new Error('AI_OPENAI_KEY appears invalid (expected to start with "sk-")')
24
+ }
25
+
26
+ const abortController = new AbortController()
27
+ const timeout = setTimeout(() => abortController.abort(), this.aiConfig.config.timeoutMs)
28
+
29
+ let response: Response
30
+ try {
31
+ response = await fetch('https://api.openai.com/v1/chat/completions', {
32
+ method: 'POST',
33
+ headers: {
34
+ Authorization: 'Bearer ' + apiKey,
35
+ 'Content-Type': 'application/json',
36
+ },
37
+ body: JSON.stringify({
38
+ model: this.aiConfig.config.model,
39
+ messages: request.messages,
40
+ tools: request.tools,
41
+ tool_choice: 'required',
42
+ parallel_tool_calls: false,
43
+ temperature: 0,
44
+ }),
45
+ signal: abortController.signal,
46
+ })
47
+ } catch (error) {
48
+ if ((error as { name?: string })?.name === 'AbortError') {
49
+ throw new Error('OpenAI request timed out')
50
+ }
51
+
52
+ const details = sanitizeSecretString(error instanceof Error ? error.message : String(error))
53
+ throw new Error('OpenAI request failed: ' + details)
54
+ } finally {
55
+ clearTimeout(timeout)
56
+ }
57
+
58
+ if (!response.ok) {
59
+ let reason = response.statusText || 'request error'
60
+ try {
61
+ const payload = (await response.json()) as {
62
+ error?: { message?: unknown }
63
+ }
64
+ if (payload?.error?.message != null) {
65
+ reason = sanitizeSecretString(payload.error.message)
66
+ }
67
+ } catch {
68
+ // Ignore body parse errors and fall back to statusText only.
69
+ }
70
+
71
+ throw new Error('OpenAI request failed (' + response.status + '): ' + reason)
72
+ }
73
+
74
+ const payload = (await response.json()) as {
75
+ choices?: Array<{
76
+ message?: {
77
+ content?: string | null
78
+ tool_calls?: Array<{
79
+ id: string
80
+ type: 'function'
81
+ function: {
82
+ name: string
83
+ arguments: string
84
+ }
85
+ }>
86
+ }
87
+ }>
88
+ }
89
+
90
+ const message = payload.choices?.[0]?.message
91
+ const toolCalls = message?.tool_calls ?? []
92
+
93
+ if (toolCalls.length !== 1) {
94
+ throw new Error('AI must return exactly one tool call')
95
+ }
96
+
97
+ const toolCall = toolCalls[0]
98
+
99
+ return {
100
+ assistantMessage: {
101
+ role: 'assistant',
102
+ content: message?.content ?? null,
103
+ tool_calls: toolCalls,
104
+ },
105
+ toolCall,
106
+ }
107
+ }
108
+
109
+ private keyRotationIndex = 0
110
+
111
+ private pickOpenAIApiKey(keysRaw?: string, fallbackKey?: string): string | undefined {
112
+ const keys = keysRaw
113
+ ?.split(',')
114
+ .map((value) => value.trim())
115
+ .filter(Boolean)
116
+
117
+ if (keys && keys.length > 0) {
118
+ const key = keys[this.keyRotationIndex % keys.length]
119
+ this.keyRotationIndex = (this.keyRotationIndex + 1) % keys.length
120
+ return key
121
+ }
122
+
123
+ return fallbackKey
124
+ }
125
+ }
126
+ `;
127
+ }
128
+ //# sourceMappingURL=openai-model-provider-service.generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-model-provider-service.generator.js","sourceRoot":"","sources":["../../../src/backend-ai/generators/openai-model-provider-service.generator.ts"],"names":[],"mappings":";;AAAA,gFA2HC;AA3HD,SAAgB,kCAAkC;IAChD,OAAO,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyHjB,CAAA;AACD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import * as Generator from './ai.generator';
2
+ export type WithBackendAi<Context> = Generator.WithBackendAi<Context>;
3
+ export declare const backendAiGenerator: import("@postxl/generator").GeneratorInterface;
4
+ export declare const backendAiGeneratorId: string & import("zod").$brand<"PXL.GeneratorInterfaceId">;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.backendAiGeneratorId = exports.backendAiGenerator = void 0;
37
+ const Generator = __importStar(require("./ai.generator"));
38
+ exports.backendAiGenerator = Generator.generator;
39
+ exports.backendAiGeneratorId = Generator.generatorId;
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/backend-ai/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0DAA2C;AAG9B,QAAA,kBAAkB,GAAG,SAAS,CAAC,SAAS,CAAA;AACxC,QAAA,oBAAoB,GAAG,SAAS,CAAC,WAAW,CAAA"}
@@ -11,7 +11,8 @@ import { Logger, NestApplicationOptions } from '@nestjs/common'
11
11
  import { NestFactory } from '@nestjs/core'
12
12
  import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'
13
13
 
14
- import { yellow } from 'colors/safe'
14
+ import { cyan, green, red, yellow } from 'colors/safe'
15
+
15
16
  import { fromError } from 'zod-validation-error'
16
17
 
17
18
  import { checkPortAvailability,removeSecrets } from '@postxl/utils'
@@ -129,8 +130,8 @@ export async function bootstrap({
129
130
  .join('\n\n')}
130
131
 
131
132
  const server = await app.listen(config.data.port, '0.0.0.0')
132
- logger.log(\`${schema.name} API is running on \${yellow(config.data.port.toString())}\`)
133
-
133
+ logger.log(\`${schema.name} API is running \${config.data.test.isStateful ? red('statefully') : cyan('statelessly')} \${green('in ')}\${config.data.test.isTest ? cyan('test ') : red('prod')}\${green(' mode on ')}\${yellow(config.data.port.toString())}\`)
134
+
134
135
  // handling shutdown signal, used in E2E testing
135
136
  process.on('SIGTERM', () => {
136
137
  logger.log('SIGTERM signal received: closing HTTP server')
@@ -1 +1 @@
1
- {"version":3,"file":"main.generator.js","sourceRoot":"","sources":["../../../src/backend-core/generators/main.generator.ts"],"names":[],"mappings":";;AAEA,oCA4JC;AA5JD,SAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAe;IACxE,OAAO,MAAM,CAAC;;;;;;;;;;;;;;;EAed,OAAO;SACN,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAU,CAAC,MAAM,CAAC;SAC/B,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuGT,OAAO;SACN,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAU,CAAC,IAAI,CAAC;SAC7B,IAAI,CAAC,MAAM,CAAC;;;iBAGA,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2B1B,CAAA;AACF,CAAC"}
1
+ {"version":3,"file":"main.generator.js","sourceRoot":"","sources":["../../../src/backend-core/generators/main.generator.ts"],"names":[],"mappings":";;AAEA,oCA6JC;AA7JD,SAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAe;IACxE,OAAO,MAAM,CAAC;;;;;;;;;;;;;;;;EAgBd,OAAO;SACN,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAU,CAAC,MAAM,CAAC;SAC/B,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuGT,OAAO;SACN,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAU,CAAC,IAAI,CAAC;SAC7B,IAAI,CAAC,MAAM,CAAC;;;iBAGA,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2B1B,CAAA;AACF,CAAC"}
@@ -97,16 +97,16 @@ exports.generator = {
97
97
  context.backend.modules.push(e2eModule);
98
98
  context.backend.packageJson.scripts.push({
99
99
  name: 'e2e:stateless',
100
- command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=false --env AUTH=false NODE_ENV=test -- nest start --watch --debug --entryFile apps/api/src/e2e.js',
100
+ command: 'AI_ENABLED=false NODE_ENV=test dotenvx run -f ./apps/api/.env --env STATEFUL=false --env AUTH=false -- nest start --watch --debug --entryFile apps/api/src/e2e.js',
101
101
  }, {
102
102
  name: 'e2e:stateful',
103
- command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=true --env AUTH=false NODE_ENV=test -- nest start --watch --debug --entryFile apps/api/src/e2e.js',
103
+ command: 'AI_ENABLED=false NODE_ENV=test dotenvx run -f ./apps/api/.env --env STATEFUL=true --env AUTH=false -- nest start --watch --debug --entryFile apps/api/src/e2e.js',
104
104
  }, {
105
105
  name: 'e2e:coverage:stateless',
106
- command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=false --env AUTH=false NODE_ENV=test -- c8 nest start --entryFile apps/api/src/e2e.js',
106
+ command: 'AI_ENABLED=false NODE_ENV=test dotenvx run -f ./apps/api/.env --env STATEFUL=false --env AUTH=false -- c8 nest start --entryFile apps/api/src/e2e.js',
107
107
  }, {
108
108
  name: 'e2e:coverage:stateful',
109
- command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=true --env AUTH=false NODE_ENV=test -- c8 nest start --entryFile apps/api/src/e2e.js',
109
+ command: 'AI_ENABLED=false NODE_ENV=test dotenvx run -f ./apps/api/.env --env STATEFUL=true --env AUTH=false -- c8 nest start --entryFile apps/api/src/e2e.js',
110
110
  });
111
111
  const serviceLocation = Generator.toBackendModuleLocation(`@e2e/e2e.service`);
112
112
  const service = {
@@ -1 +1 @@
1
- {"version":3,"file":"backend-e2e.generator.js","sourceRoot":"","sources":["../../src/backend-e2e/backend-e2e.generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backend-e2e.generator.js","sourceRoot":"","sources":["../../src/backend-e2e/backend-e2e.generator.ts"],"names":[],"mappings":"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"}