@bluelibs/runner-dev 4.1.0 → 4.2.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 (154) hide show
  1. package/AI.md +40 -43
  2. package/README.md +70 -0
  3. package/dist/architect/core/errors.d.ts +39 -0
  4. package/dist/architect/core/errors.js +143 -0
  5. package/dist/architect/core/errors.js.map +1 -0
  6. package/dist/architect/core/index.d.ts +3 -0
  7. package/dist/architect/core/index.js +21 -0
  8. package/dist/architect/core/index.js.map +1 -0
  9. package/dist/architect/core/interfaces.d.ts +158 -0
  10. package/dist/architect/core/interfaces.js +3 -0
  11. package/dist/architect/core/interfaces.js.map +1 -0
  12. package/dist/architect/core/types.d.ts +544 -0
  13. package/dist/architect/core/types.js +49 -0
  14. package/dist/architect/core/types.js.map +1 -0
  15. package/dist/architect/execution/executor.d.ts +23 -0
  16. package/dist/architect/execution/executor.js +476 -0
  17. package/dist/architect/execution/executor.js.map +1 -0
  18. package/dist/architect/execution/index.d.ts +1 -0
  19. package/dist/architect/execution/index.js +19 -0
  20. package/dist/architect/execution/index.js.map +1 -0
  21. package/dist/architect/executor.d.ts +7 -0
  22. package/dist/architect/executor.js +150 -0
  23. package/dist/architect/executor.js.map +1 -0
  24. package/dist/architect/index.d.ts +45 -0
  25. package/dist/architect/index.js +76 -0
  26. package/dist/architect/index.js.map +1 -0
  27. package/dist/architect/llmClient.d.ts +10 -0
  28. package/dist/architect/llmClient.js +33 -0
  29. package/dist/architect/llmClient.js.map +1 -0
  30. package/dist/architect/models/base.d.ts +16 -0
  31. package/dist/architect/models/base.js +68 -0
  32. package/dist/architect/models/base.js.map +1 -0
  33. package/dist/architect/models/factory.d.ts +16 -0
  34. package/dist/architect/models/factory.js +73 -0
  35. package/dist/architect/models/factory.js.map +1 -0
  36. package/dist/architect/models/index.d.ts +3 -0
  37. package/dist/architect/models/index.js +21 -0
  38. package/dist/architect/models/index.js.map +1 -0
  39. package/dist/architect/models/openai.d.ts +7 -0
  40. package/dist/architect/models/openai.js +71 -0
  41. package/dist/architect/models/openai.js.map +1 -0
  42. package/dist/architect/planner.d.ts +9 -0
  43. package/dist/architect/planner.js +42 -0
  44. package/dist/architect/planner.js.map +1 -0
  45. package/dist/architect/planning/index.d.ts +4 -0
  46. package/dist/architect/planning/index.js +22 -0
  47. package/dist/architect/planning/index.js.map +1 -0
  48. package/dist/architect/planning/optimizer.d.ts +14 -0
  49. package/dist/architect/planning/optimizer.js +275 -0
  50. package/dist/architect/planning/optimizer.js.map +1 -0
  51. package/dist/architect/planning/planner.d.ts +15 -0
  52. package/dist/architect/planning/planner.js +124 -0
  53. package/dist/architect/planning/planner.js.map +1 -0
  54. package/dist/architect/planning/prompts.d.ts +6 -0
  55. package/dist/architect/planning/prompts.js +111 -0
  56. package/dist/architect/planning/prompts.js.map +1 -0
  57. package/dist/architect/planning/validator.d.ts +16 -0
  58. package/dist/architect/planning/validator.js +331 -0
  59. package/dist/architect/planning/validator.js.map +1 -0
  60. package/dist/architect/prompt.d.ts +1 -0
  61. package/dist/architect/prompt.js +13 -0
  62. package/dist/architect/prompt.js.map +1 -0
  63. package/dist/architect/types.d.ts +4 -0
  64. package/dist/architect/types.js +24 -0
  65. package/dist/architect/types.js.map +1 -0
  66. package/dist/cli/format.d.ts +19 -0
  67. package/dist/cli/format.js +62 -0
  68. package/dist/cli/format.js.map +1 -0
  69. package/dist/cli/init.d.ts +1 -0
  70. package/dist/cli/init.js +279 -0
  71. package/dist/cli/init.js.map +1 -0
  72. package/dist/cli/query.js +69 -0
  73. package/dist/cli/query.js.map +1 -1
  74. package/dist/cli.js +48 -21
  75. package/dist/cli.js.map +1 -1
  76. package/dist/code.d.ts +50 -0
  77. package/dist/code.js +357 -0
  78. package/dist/code.js.map +1 -0
  79. package/dist/generated/resolvers-types.d.ts +150 -29
  80. package/dist/index.d.ts +6 -0
  81. package/dist/index.js +2 -0
  82. package/dist/index.js.map +1 -1
  83. package/dist/resources/cli.config.resource.d.ts +7 -0
  84. package/dist/resources/cli.config.resource.js +11 -0
  85. package/dist/resources/cli.config.resource.js.map +1 -0
  86. package/dist/resources/coverage.resource.d.ts +19 -0
  87. package/dist/resources/coverage.resource.js +213 -0
  88. package/dist/resources/coverage.resource.js.map +1 -0
  89. package/dist/resources/dev.resource.js +0 -2
  90. package/dist/resources/dev.resource.js.map +1 -1
  91. package/dist/resources/graphql.cli.resource.d.ts +4 -0
  92. package/dist/resources/graphql.cli.resource.js +27 -0
  93. package/dist/resources/graphql.cli.resource.js.map +1 -0
  94. package/dist/resources/graphql.query.cli.task.d.ts +47 -0
  95. package/dist/resources/graphql.query.cli.task.js +54 -0
  96. package/dist/resources/graphql.query.cli.task.js.map +1 -0
  97. package/dist/resources/introspector.cli.resource.d.ts +6 -0
  98. package/dist/resources/introspector.cli.resource.js +17 -0
  99. package/dist/resources/introspector.cli.resource.js.map +1 -0
  100. package/dist/resources/live.resource.d.ts +2 -1
  101. package/dist/resources/live.resource.js +4 -2
  102. package/dist/resources/live.resource.js.map +1 -1
  103. package/dist/resources/models/Introspector.d.ts +1 -1
  104. package/dist/resources/models/Introspector.js +5 -34
  105. package/dist/resources/models/Introspector.js.map +1 -1
  106. package/dist/resources/models/initializeFromStore.js +26 -34
  107. package/dist/resources/models/initializeFromStore.js.map +1 -1
  108. package/dist/resources/models/initializeFromStore.utils.js +25 -6
  109. package/dist/resources/models/initializeFromStore.utils.js.map +1 -1
  110. package/dist/resources/models/introspector.tools.js +2 -2
  111. package/dist/resources/models/introspector.tools.js.map +1 -1
  112. package/dist/resources/routeHandlers/getDocsData.d.ts +6 -0
  113. package/dist/resources/routeHandlers/getDocsData.js +106 -0
  114. package/dist/resources/routeHandlers/getDocsData.js.map +1 -1
  115. package/dist/resources/routeHandlers/registerHttpRoutes.hook.d.ts +4 -0
  116. package/dist/resources/routeHandlers/registerHttpRoutes.hook.js +9 -7
  117. package/dist/resources/routeHandlers/registerHttpRoutes.hook.js.map +1 -1
  118. package/dist/resources/server.resource.d.ts +3 -0
  119. package/dist/resources/server.resource.js +8 -1
  120. package/dist/resources/server.resource.js.map +1 -1
  121. package/dist/resources/swap.cli.resource.d.ts +11 -0
  122. package/dist/resources/swap.cli.resource.js +54 -0
  123. package/dist/resources/swap.cli.resource.js.map +1 -0
  124. package/dist/schema/context.d.ts +2 -0
  125. package/dist/schema/model.d.ts +4 -1
  126. package/dist/schema/model.js.map +1 -1
  127. package/dist/schema/mutation.js +38 -0
  128. package/dist/schema/mutation.js.map +1 -1
  129. package/dist/schema/query.js +22 -18
  130. package/dist/schema/query.js.map +1 -1
  131. package/dist/schema/types/BaseElementCommon.d.ts +2 -4
  132. package/dist/schema/types/BaseElementCommon.js +28 -0
  133. package/dist/schema/types/BaseElementCommon.js.map +1 -1
  134. package/dist/schema/types/CoverageType.d.ts +7 -0
  135. package/dist/schema/types/CoverageType.js +54 -0
  136. package/dist/schema/types/CoverageType.js.map +1 -0
  137. package/dist/schema/types/LiveType.js +4 -0
  138. package/dist/schema/types/LiveType.js.map +1 -1
  139. package/dist/schema/types/ResourceType.js +6 -0
  140. package/dist/schema/types/ResourceType.js.map +1 -1
  141. package/dist/schema/types/TagType.js +4 -3
  142. package/dist/schema/types/TagType.js.map +1 -1
  143. package/dist/schema/types/index.d.ts +1 -0
  144. package/dist/schema/types/index.js +3 -1
  145. package/dist/schema/types/index.js.map +1 -1
  146. package/dist/ui/.vite/manifest.json +2 -2
  147. package/dist/ui/assets/docs-DR80KoAA.js +416 -0
  148. package/dist/ui/assets/docs-DR80KoAA.js.map +1 -0
  149. package/dist/ui/assets/docs-WKK9Zcu5.css +1 -0
  150. package/dist/utils/path.js +10 -0
  151. package/dist/utils/path.js.map +1 -1
  152. package/package.json +12 -8
  153. package/dist/ui/assets/docs-DVEzFAJo.css +0 -1
  154. package/dist/ui/assets/docs-l9XdmrRL.js +0 -174
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ // Legacy planner - deprecated in favor of the new planning system
3
+ // This file is kept for backward compatibility
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.planFromPrompt = planFromPrompt;
6
+ const llmClient_1 = require("./llmClient");
7
+ const types_1 = require("./core/types");
8
+ /**
9
+ * @deprecated Use ArchitectPlanner class instead
10
+ *
11
+ * Sends the user prompt to the LLM and returns a validated ArchitectPlan.
12
+ * If the LLM response cannot be parsed/validated, the function returns a plan
13
+ * containing a single log action that explains the problem.
14
+ */
15
+ async function planFromPrompt(userPrompt) {
16
+ try {
17
+ const raw = await (0, llmClient_1.queryLlm)(userPrompt);
18
+ // The LLM is instructed to return pure JSON, but it might include surrounding text.
19
+ // Try to locate the first "{" and the matching closing "}".
20
+ const firstBrace = raw.indexOf("{");
21
+ const lastBrace = raw.lastIndexOf("}");
22
+ const jsonString = firstBrace !== -1 && lastBrace !== -1 ? raw.slice(firstBrace, lastBrace + 1) : raw;
23
+ const parsed = JSON.parse(jsonString);
24
+ const result = types_1.architectPlanSchema.parse(parsed);
25
+ return result;
26
+ }
27
+ catch (e) {
28
+ // On any error, produce a minimal plan with a log action.
29
+ const message = e instanceof Error ? e.message : String(e);
30
+ const logAction = {
31
+ type: "log",
32
+ level: "error",
33
+ message: `Planner error: ${message}`
34
+ };
35
+ return {
36
+ id: `error-${Date.now()}`,
37
+ description: "Error plan due to parsing failure",
38
+ actions: [logAction]
39
+ };
40
+ }
41
+ }
42
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/architect/planner.ts"],"names":[],"mappings":";AAAA,kEAAkE;AAClE,+CAA+C;;AAa/C,wCAyBC;AApCD,2CAAuC;AACvC,wCAAmD;AAGnD;;;;;;GAMG;AACI,KAAK,UAAU,cAAc,CAAC,UAAkB;IACrD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAA,oBAAQ,EAAC,UAAU,CAAC,CAAC;QACvC,oFAAoF;QACpF,4DAA4D;QAC5D,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,UAAU,KAAK,CAAC,CAAC,IAAI,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACtG,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,2BAAmB,CAAC,KAAK,CAAC,MAAM,CAAkB,CAAC;QAClE,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,0DAA0D;QAC1D,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAoB;YACjC,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,kBAAkB,OAAO,EAAE;SACrC,CAAC;QACF,OAAO;YACL,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE;YACzB,WAAW,EAAE,mCAAmC;YAChD,OAAO,EAAE,CAAC,SAAS,CAAC;SACrB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './planner';
2
+ export * from './prompts';
3
+ export * from './validator';
4
+ export * from './optimizer';
@@ -0,0 +1,22 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ // Planning module exports
18
+ __exportStar(require("./planner"), exports);
19
+ __exportStar(require("./prompts"), exports);
20
+ __exportStar(require("./validator"), exports);
21
+ __exportStar(require("./optimizer"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/architect/planning/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0BAA0B;AAC1B,4CAA0B;AAC1B,4CAA0B;AAC1B,8CAA4B;AAC5B,8CAA4B"}
@@ -0,0 +1,14 @@
1
+ import { ArchitectPlan, PlanningContext, PlanEstimate } from '../core';
2
+ export declare class PlanOptimizer {
3
+ optimize(plan: ArchitectPlan, _context?: PlanningContext): Promise<ArchitectPlan>;
4
+ estimate(plan: ArchitectPlan, context?: PlanningContext): Promise<PlanEstimate>;
5
+ private removeDuplicateActions;
6
+ private mergeFileOperations;
7
+ private reorderActions;
8
+ private groupPackageInstallations;
9
+ private calculateComplexity;
10
+ private estimateDuration;
11
+ private identifyRiskFactors;
12
+ private identifyPrerequisites;
13
+ private getActionKey;
14
+ }
@@ -0,0 +1,275 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PlanOptimizer = void 0;
4
+ class PlanOptimizer {
5
+ async optimize(plan, _context) {
6
+ let optimizedActions = [...plan.actions];
7
+ // Remove duplicate actions
8
+ optimizedActions = this.removeDuplicateActions(optimizedActions);
9
+ // Merge related file operations
10
+ optimizedActions = this.mergeFileOperations(optimizedActions);
11
+ // Reorder actions for better execution flow
12
+ optimizedActions = this.reorderActions(optimizedActions);
13
+ // Group package installations
14
+ optimizedActions = this.groupPackageInstallations(optimizedActions);
15
+ return {
16
+ ...plan,
17
+ id: `${plan.id}-optimized`,
18
+ actions: optimizedActions,
19
+ metadata: {
20
+ ...plan.metadata,
21
+ timestamp: Date.now(),
22
+ complexity: this.calculateComplexity(optimizedActions)
23
+ }
24
+ };
25
+ }
26
+ async estimate(plan, context) {
27
+ const complexity = this.calculateComplexity(plan.actions);
28
+ const duration = this.estimateDuration(plan.actions);
29
+ const risks = this.identifyRiskFactors(plan.actions);
30
+ const prerequisites = this.identifyPrerequisites(plan.actions, context);
31
+ return {
32
+ complexity,
33
+ estimatedDuration: duration,
34
+ riskFactors: risks,
35
+ prerequisites
36
+ };
37
+ }
38
+ removeDuplicateActions(actions) {
39
+ const seen = new Set();
40
+ return actions.filter(action => {
41
+ const key = this.getActionKey(action);
42
+ if (seen.has(key)) {
43
+ return false;
44
+ }
45
+ seen.add(key);
46
+ return true;
47
+ });
48
+ }
49
+ mergeFileOperations(actions) {
50
+ const merged = [];
51
+ const fileUpdates = new Map();
52
+ for (const action of actions) {
53
+ if (action.type === 'updateFile') {
54
+ const updates = fileUpdates.get(action.path) || [];
55
+ updates.push(action);
56
+ fileUpdates.set(action.path, updates);
57
+ }
58
+ else {
59
+ merged.push(action);
60
+ }
61
+ }
62
+ // Merge multiple updates to the same file
63
+ for (const [path, updates] of fileUpdates.entries()) {
64
+ if (updates.length === 1) {
65
+ merged.push(updates[0]);
66
+ }
67
+ else {
68
+ // Combine all updates into a single action
69
+ const combinedContent = updates
70
+ .map(u => u.content)
71
+ .join('\n\n// --- Merged Update ---\n\n');
72
+ merged.push({
73
+ type: 'updateFile',
74
+ path,
75
+ content: combinedContent,
76
+ strategy: 'replace'
77
+ });
78
+ }
79
+ }
80
+ return merged;
81
+ }
82
+ reorderActions(actions) {
83
+ const ordered = [];
84
+ const remaining = [...actions];
85
+ // Priority order for action types
86
+ const priorityOrder = [
87
+ 'createDirectory',
88
+ 'installPackage',
89
+ 'createFile',
90
+ 'updateFile',
91
+ 'registerTask',
92
+ 'registerTest',
93
+ 'runCommand',
94
+ 'moveFile',
95
+ 'copyFile',
96
+ 'deleteFile',
97
+ 'log'
98
+ ];
99
+ // Group by priority and maintain relative order within groups
100
+ for (const actionType of priorityOrder) {
101
+ const actionsOfType = remaining.filter(a => a.type === actionType);
102
+ ordered.push(...actionsOfType);
103
+ }
104
+ // Add any remaining actions not in priority list
105
+ const unhandled = remaining.filter(a => !priorityOrder.includes(a.type));
106
+ ordered.push(...unhandled);
107
+ return ordered;
108
+ }
109
+ groupPackageInstallations(actions) {
110
+ const packageInstalls = [];
111
+ const otherActions = [];
112
+ for (const action of actions) {
113
+ if (action.type === 'installPackage') {
114
+ packageInstalls.push(action);
115
+ }
116
+ else {
117
+ otherActions.push(action);
118
+ }
119
+ }
120
+ // Group packages by dev/prod and create batch install commands
121
+ if (packageInstalls.length > 1) {
122
+ const prodPackages = packageInstalls.filter(p => !p.dev).map(p => p.name);
123
+ const devPackages = packageInstalls.filter(p => p.dev).map(p => p.name);
124
+ const batchActions = [];
125
+ if (prodPackages.length > 0) {
126
+ batchActions.push({
127
+ type: 'runCommand',
128
+ command: 'npm',
129
+ args: ['install', ...prodPackages]
130
+ });
131
+ }
132
+ if (devPackages.length > 0) {
133
+ batchActions.push({
134
+ type: 'runCommand',
135
+ command: 'npm',
136
+ args: ['install', '--save-dev', ...devPackages]
137
+ });
138
+ }
139
+ // Insert batch installs at the beginning, after directory creation
140
+ const directoryActions = otherActions.filter(a => a.type === 'createDirectory');
141
+ const restActions = otherActions.filter(a => a.type !== 'createDirectory');
142
+ return [...directoryActions, ...batchActions, ...restActions];
143
+ }
144
+ return [...packageInstalls, ...otherActions];
145
+ }
146
+ calculateComplexity(actions) {
147
+ const complexityScore = actions.reduce((score, action) => {
148
+ switch (action.type) {
149
+ case 'createFile':
150
+ case 'updateFile':
151
+ return score + (action.content.length > 1000 ? 3 : 1);
152
+ case 'runCommand':
153
+ return score + 4;
154
+ case 'installPackage':
155
+ return score + 2;
156
+ case 'deleteFile':
157
+ return score + 2;
158
+ case 'registerTask':
159
+ case 'registerTest':
160
+ return score + 2;
161
+ default:
162
+ return score + 1;
163
+ }
164
+ }, 0);
165
+ if (complexityScore < 10)
166
+ return 'low';
167
+ if (complexityScore < 25)
168
+ return 'medium';
169
+ return 'high';
170
+ }
171
+ estimateDuration(actions) {
172
+ return actions.reduce((duration, action) => {
173
+ switch (action.type) {
174
+ case 'createFile':
175
+ case 'updateFile':
176
+ return duration + Math.max(5, action.content.length / 100);
177
+ case 'runCommand':
178
+ return duration + 30; // Commands can be slow
179
+ case 'installPackage':
180
+ return duration + 20; // Package downloads
181
+ case 'deleteFile':
182
+ case 'moveFile':
183
+ case 'copyFile':
184
+ return duration + 2;
185
+ case 'createDirectory':
186
+ return duration + 1;
187
+ case 'registerTask':
188
+ case 'registerTest':
189
+ return duration + 5;
190
+ case 'log':
191
+ return duration + 0.1;
192
+ default:
193
+ return duration + 2;
194
+ }
195
+ }, 0);
196
+ }
197
+ identifyRiskFactors(actions) {
198
+ const risks = [];
199
+ const hasDeletes = actions.some(a => a.type === 'deleteFile');
200
+ if (hasDeletes) {
201
+ risks.push('File deletion operations present');
202
+ }
203
+ const hasCommands = actions.some(a => a.type === 'runCommand');
204
+ if (hasCommands) {
205
+ risks.push('Shell command execution required');
206
+ }
207
+ const packageCount = actions.filter(a => a.type === 'installPackage').length;
208
+ if (packageCount > 5) {
209
+ risks.push('Many package installations may impact build size');
210
+ }
211
+ const fileCreationCount = actions.filter(a => a.type === 'createFile').length;
212
+ if (fileCreationCount > 10) {
213
+ risks.push('Large number of files being created');
214
+ }
215
+ const hasSystemFiles = actions.some(a => (a.type === 'createFile' || a.type === 'updateFile') &&
216
+ (a.path.startsWith('/') || a.path.includes('system') || a.path.includes('etc')));
217
+ if (hasSystemFiles) {
218
+ risks.push('System-level file modifications detected');
219
+ }
220
+ return risks;
221
+ }
222
+ identifyPrerequisites(actions, context) {
223
+ const prerequisites = [];
224
+ const needsNodeModules = actions.some(a => a.type === 'installPackage');
225
+ if (needsNodeModules) {
226
+ prerequisites.push('Node.js and npm must be installed');
227
+ }
228
+ const needsTypeScript = actions.some(a => (a.type === 'createFile' || a.type === 'updateFile') &&
229
+ a.path.endsWith('.ts'));
230
+ if (needsTypeScript) {
231
+ prerequisites.push('TypeScript must be configured');
232
+ }
233
+ const needsBlueLibsRunner = actions.some(a => (a.type === 'createFile' || a.type === 'updateFile') &&
234
+ a.content.includes('@bluelibs/runner'));
235
+ if (needsBlueLibsRunner) {
236
+ prerequisites.push('@bluelibs/runner must be installed');
237
+ }
238
+ const needsWritePermissions = actions.some(a => ['createFile', 'updateFile', 'deleteFile', 'createDirectory', 'moveFile'].includes(a.type));
239
+ if (needsWritePermissions) {
240
+ prerequisites.push('Write permissions in project directory');
241
+ }
242
+ const needsExecutePermissions = actions.some(a => a.type === 'runCommand');
243
+ if (needsExecutePermissions) {
244
+ prerequisites.push('Permission to execute shell commands');
245
+ }
246
+ return prerequisites;
247
+ }
248
+ getActionKey(action) {
249
+ switch (action.type) {
250
+ case 'createFile':
251
+ case 'updateFile':
252
+ case 'deleteFile':
253
+ return `${action.type}:${action.path}`;
254
+ case 'createDirectory':
255
+ return `${action.type}:${action.path}`;
256
+ case 'moveFile':
257
+ case 'copyFile':
258
+ return `${action.type}:${action.from}->${action.to}`;
259
+ case 'runCommand':
260
+ return `${action.type}:${action.command}${action.args?.join(' ') || ''}`;
261
+ case 'installPackage':
262
+ return `${action.type}:${action.name}@${action.version || 'latest'}:${action.dev ? 'dev' : 'prod'}`;
263
+ case 'registerTask':
264
+ return `${action.type}:${action.taskId}`;
265
+ case 'registerTest':
266
+ return `${action.type}:${action.testId}`;
267
+ case 'log':
268
+ return `${action.type}:${action.level}:${action.message}`;
269
+ default:
270
+ return `${action.type}:${JSON.stringify(action)}`;
271
+ }
272
+ }
273
+ }
274
+ exports.PlanOptimizer = PlanOptimizer;
275
+ //# sourceMappingURL=optimizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimizer.js","sourceRoot":"","sources":["../../../src/architect/planning/optimizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { IArchitectPlanner, IAIModel, IArchitectLogger, PlanningContext, ValidationResult, PlanEstimate, ArchitectPlan } from '../core';
2
+ export declare class ArchitectPlanner implements IArchitectPlanner {
3
+ private model;
4
+ private logger;
5
+ private context?;
6
+ private promptGenerator;
7
+ private validator;
8
+ private optimizer;
9
+ constructor(model: IAIModel, logger: IArchitectLogger, context?: PlanningContext | undefined);
10
+ plan(prompt: string, context?: PlanningContext): Promise<ArchitectPlan>;
11
+ validate(plan: ArchitectPlan): Promise<ValidationResult>;
12
+ optimize(plan: ArchitectPlan): Promise<ArchitectPlan>;
13
+ estimate(plan: ArchitectPlan): Promise<PlanEstimate>;
14
+ private parseResponse;
15
+ }
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ArchitectPlanner = void 0;
4
+ const errors_1 = require("../core/errors");
5
+ const types_1 = require("../core/types");
6
+ const prompts_1 = require("./prompts");
7
+ const validator_1 = require("./validator");
8
+ const optimizer_1 = require("./optimizer");
9
+ class ArchitectPlanner {
10
+ model;
11
+ logger;
12
+ context;
13
+ promptGenerator;
14
+ validator;
15
+ optimizer;
16
+ constructor(model, logger, context) {
17
+ this.model = model;
18
+ this.logger = logger;
19
+ this.context = context;
20
+ this.promptGenerator = new prompts_1.PromptGenerator();
21
+ this.validator = new validator_1.PlanValidator();
22
+ this.optimizer = new optimizer_1.PlanOptimizer();
23
+ }
24
+ async plan(prompt, context) {
25
+ const planningContext = context || this.context;
26
+ if (!planningContext) {
27
+ throw new errors_1.PlanningError('Planning context is required', prompt);
28
+ }
29
+ try {
30
+ this.logger.info('Starting plan generation', { prompt: prompt.substring(0, 100) + '...' });
31
+ // Generate system prompt with context
32
+ const systemPrompt = this.promptGenerator.generateSystemPrompt(planningContext);
33
+ const userPrompt = this.promptGenerator.generateUserPrompt(prompt, planningContext);
34
+ const messages = [
35
+ { role: 'system', content: systemPrompt },
36
+ { role: 'user', content: userPrompt }
37
+ ];
38
+ // Get response from AI model
39
+ const response = await this.model.complete(messages);
40
+ // Parse and validate the plan
41
+ const plan = this.parseResponse(response);
42
+ this.logger.info('Plan generated successfully', {
43
+ actionsCount: plan.actions.length,
44
+ planId: plan.id
45
+ });
46
+ return plan;
47
+ }
48
+ catch (error) {
49
+ this.logger.error('Failed to generate plan', error, { prompt });
50
+ throw new errors_1.PlanningError(`Failed to generate plan: ${error instanceof Error ? error.message : String(error)}`, prompt, { originalError: error });
51
+ }
52
+ }
53
+ async validate(plan) {
54
+ this.logger.info('Validating plan', { planId: plan.id });
55
+ const result = await this.validator.validate(plan, this.context);
56
+ this.logger.info('Plan validation complete', {
57
+ planId: plan.id,
58
+ valid: result.valid,
59
+ errorCount: result.errors.length,
60
+ warningCount: result.warnings.length
61
+ });
62
+ return result;
63
+ }
64
+ async optimize(plan) {
65
+ this.logger.info('Optimizing plan', { planId: plan.id });
66
+ const optimizedPlan = await this.optimizer.optimize(plan, this.context);
67
+ this.logger.info('Plan optimization complete', {
68
+ originalId: plan.id,
69
+ optimizedId: optimizedPlan.id,
70
+ originalActionsCount: plan.actions.length,
71
+ optimizedActionsCount: optimizedPlan.actions.length
72
+ });
73
+ return optimizedPlan;
74
+ }
75
+ async estimate(plan) {
76
+ this.logger.info('Estimating plan complexity', { planId: plan.id });
77
+ const estimate = await this.optimizer.estimate(plan, this.context);
78
+ this.logger.info('Plan estimation complete', {
79
+ planId: plan.id,
80
+ complexity: estimate.complexity,
81
+ estimatedDuration: estimate.estimatedDuration
82
+ });
83
+ return estimate;
84
+ }
85
+ parseResponse(response) {
86
+ try {
87
+ // Try to extract JSON from response
88
+ const jsonStart = response.indexOf('{');
89
+ const jsonEnd = response.lastIndexOf('}');
90
+ if (jsonStart === -1 || jsonEnd === -1) {
91
+ throw new Error('No JSON found in response');
92
+ }
93
+ const jsonString = response.slice(jsonStart, jsonEnd + 1);
94
+ const parsed = JSON.parse(jsonString);
95
+ // Validate against schema
96
+ const validated = types_1.architectPlanSchema.parse(parsed);
97
+ // Ensure plan has an ID
98
+ if (!validated.id) {
99
+ validated.id = `plan-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
100
+ }
101
+ return validated;
102
+ }
103
+ catch (error) {
104
+ // Create a fallback plan with a log action
105
+ return {
106
+ id: `fallback-${Date.now()}`,
107
+ description: 'Fallback plan due to parsing error',
108
+ actions: [
109
+ {
110
+ type: 'log',
111
+ level: 'error',
112
+ message: `Failed to parse AI response: ${error instanceof Error ? error.message : String(error)}`
113
+ }
114
+ ],
115
+ metadata: {
116
+ timestamp: Date.now(),
117
+ complexity: 'low'
118
+ }
119
+ };
120
+ }
121
+ }
122
+ }
123
+ exports.ArchitectPlanner = ArchitectPlanner;
124
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../../src/architect/planning/planner.ts"],"names":[],"mappings":";;;AAUA,2CAAgE;AAChE,yCAAoD;AACpD,uCAA4C;AAC5C,2CAA4C;AAC5C,2CAA4C;AAE5C,MAAa,gBAAgB;IAMjB;IACA;IACA;IAPF,eAAe,CAAkB;IACjC,SAAS,CAAgB;IACzB,SAAS,CAAgB;IAEjC,YACU,KAAe,EACf,MAAwB,EACxB,OAAyB;QAFzB,UAAK,GAAL,KAAK,CAAU;QACf,WAAM,GAAN,MAAM,CAAkB;QACxB,YAAO,GAAP,OAAO,CAAkB;QAEjC,IAAI,CAAC,eAAe,GAAG,IAAI,yBAAe,EAAE,CAAC;QAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,yBAAa,EAAE,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,IAAI,yBAAa,EAAE,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,OAAyB;QAClD,MAAM,eAAe,GAAG,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;QAChD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,sBAAa,CAAC,8BAA8B,EAAE,MAAM,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;YAE3F,sCAAsC;YACtC,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC;YAChF,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;YAEpF,MAAM,QAAQ,GAAkB;gBAC9B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;gBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE;aACtC,CAAC;YAEF,6BAA6B;YAC7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAErD,8BAA8B;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAE1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBAC9C,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;gBACjC,MAAM,EAAE,IAAI,CAAC,EAAE;aAChB,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAc,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACzE,MAAM,IAAI,sBAAa,CACrB,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACpF,MAAM,EACN,EAAE,aAAa,EAAE,KAAK,EAAE,CACzB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAmB;QAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAEzD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;YAC3C,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;YAChC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;SACrC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAmB;QAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAEzD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAExE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;YAC7C,UAAU,EAAE,IAAI,CAAC,EAAE;YACnB,WAAW,EAAE,aAAa,CAAC,EAAE;YAC7B,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YACzC,qBAAqB,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM;SACpD,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAmB;QAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAEpE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAEnE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;YAC3C,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;SAC9C,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,aAAa,CAAC,QAAgB;QACpC,IAAI,CAAC;YACH,oCAAoC;YACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAE1C,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAEtC,0BAA0B;YAC1B,MAAM,SAAS,GAAG,2BAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAEpD,wBAAwB;YACxB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;gBAClB,SAAS,CAAC,EAAE,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACpF,CAAC;YAED,OAAO,SAA0B,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,2CAA2C;YAC3C,OAAO;gBACL,EAAE,EAAE,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE;gBAC5B,WAAW,EAAE,oCAAoC;gBACjD,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,KAAK;wBACX,KAAK,EAAE,OAAO;wBACd,OAAO,EAAE,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAClG;iBACF;gBACD,QAAQ,EAAE;oBACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;oBACrB,UAAU,EAAE,KAAK;iBAClB;aACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AA5ID,4CA4IC"}
@@ -0,0 +1,6 @@
1
+ import { PlanningContext } from '../core';
2
+ export declare class PromptGenerator {
3
+ generateSystemPrompt(context: PlanningContext): string;
4
+ generateUserPrompt(userRequest: string, context: PlanningContext): string;
5
+ generateOptimizationPrompt(plan: string, issues: string[]): string;
6
+ }
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PromptGenerator = void 0;
4
+ class PromptGenerator {
5
+ generateSystemPrompt(context) {
6
+ return `You are an expert software architect for BlueLibs Runner applications. Your role is to analyze user requests and generate precise, executable plans using the ArchitectPlan JSON schema.
7
+
8
+ ## Context Information
9
+ - Project Root: ${context.projectRoot}
10
+ - Package.json exists: ${context.packageJson ? 'Yes' : 'No'}
11
+ - TypeScript Config: ${context.tsConfig ? 'Yes' : 'No'}
12
+ - Runner Config: ${context.runnerConfig ? 'Yes' : 'No'}
13
+ - Existing Files: ${context.existingFiles.length} files detected
14
+
15
+ ## Available Actions
16
+ You can use these action types in your plan:
17
+ - createFile: Create new files with content
18
+ - updateFile: Modify existing files (replace or merge strategy)
19
+ - deleteFile: Remove files (use sparingly)
20
+ - createDirectory: Create directory structure
21
+ - moveFile/copyFile: Reorganize files
22
+ - registerTask: Register BlueLibs Runner tasks
23
+ - registerTest: Register test files
24
+ - runCommand: Execute shell commands
25
+ - installPackage: Add npm packages
26
+ - log: Output information/warnings/errors
27
+
28
+ ## BlueLibs Runner Patterns
29
+ When working with Runner applications, follow these patterns:
30
+ - Use proper dependency injection with resources and tasks
31
+ - Follow the recommended naming convention: {domain}.{type}.{name}
32
+ - Resources should have init/dispose lifecycle methods
33
+ - Tasks should have proper input/result schemas using Zod
34
+ - Use middleware for cross-cutting concerns
35
+ - Emit events for decoupled communication
36
+ - Implement proper error handling
37
+
38
+ ## Response Format
39
+ Respond with ONLY valid JSON matching the ArchitectPlan schema:
40
+ {
41
+ "id": "unique-plan-id",
42
+ "description": "Brief description of what this plan accomplishes",
43
+ "actions": [
44
+ // Array of action objects
45
+ ],
46
+ "dependencies": ["optional array of required packages"],
47
+ "metadata": {
48
+ "complexity": "low|medium|high",
49
+ "estimatedDuration": 300
50
+ }
51
+ }
52
+
53
+ ## Guidelines
54
+ - Be precise and specific in file paths and content
55
+ - Include proper TypeScript types and imports
56
+ - Add comprehensive error handling
57
+ - Include relevant tests when creating new functionality
58
+ - Use existing project conventions and patterns
59
+ - Validate inputs and outputs with Zod schemas
60
+ - Keep actions atomic and focused
61
+ - Add helpful log messages for debugging`;
62
+ }
63
+ generateUserPrompt(userRequest, context) {
64
+ let prompt = `User Request: ${userRequest}\n\n`;
65
+ // Add context-specific information
66
+ if (context.constraints && context.constraints.length > 0) {
67
+ prompt += `Constraints:\n${context.constraints.map(c => `- ${c}`).join('\n')}\n\n`;
68
+ }
69
+ if (context.preferences) {
70
+ prompt += `Preferences:\n${Object.entries(context.preferences)
71
+ .map(([key, value]) => `- ${key}: ${value}`)
72
+ .join('\n')}\n\n`;
73
+ }
74
+ // Add file structure if relevant
75
+ if (context.existingFiles.length > 0 && context.existingFiles.length < 20) {
76
+ prompt += `Existing Files:\n${context.existingFiles.map(f => `- ${f}`).join('\n')}\n\n`;
77
+ }
78
+ // Add package.json info if available
79
+ if (context.packageJson) {
80
+ const deps = Object.keys(context.packageJson.dependencies || {});
81
+ const devDeps = Object.keys(context.packageJson.devDependencies || {});
82
+ if (deps.length > 0) {
83
+ prompt += `Dependencies: ${deps.join(', ')}\n`;
84
+ }
85
+ if (devDeps.length > 0) {
86
+ prompt += `Dev Dependencies: ${devDeps.join(', ')}\n`;
87
+ }
88
+ prompt += '\n';
89
+ }
90
+ prompt += 'Generate a comprehensive plan to fulfill this request. Consider the existing project structure and follow BlueLibs Runner best practices.';
91
+ return prompt;
92
+ }
93
+ generateOptimizationPrompt(plan, issues) {
94
+ return `Review and optimize this plan:
95
+
96
+ ${plan}
97
+
98
+ Issues to address:
99
+ ${issues.map(issue => `- ${issue}`).join('\n')}
100
+
101
+ Provide an optimized version that:
102
+ - Fixes the identified issues
103
+ - Reduces complexity where possible
104
+ - Improves execution efficiency
105
+ - Maintains the original intent
106
+
107
+ Respond with the complete optimized plan in JSON format.`;
108
+ }
109
+ }
110
+ exports.PromptGenerator = PromptGenerator;
111
+ //# sourceMappingURL=prompts.js.map