@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.
- package/AI.md +40 -43
- package/README.md +70 -0
- package/dist/architect/core/errors.d.ts +39 -0
- package/dist/architect/core/errors.js +143 -0
- package/dist/architect/core/errors.js.map +1 -0
- package/dist/architect/core/index.d.ts +3 -0
- package/dist/architect/core/index.js +21 -0
- package/dist/architect/core/index.js.map +1 -0
- package/dist/architect/core/interfaces.d.ts +158 -0
- package/dist/architect/core/interfaces.js +3 -0
- package/dist/architect/core/interfaces.js.map +1 -0
- package/dist/architect/core/types.d.ts +544 -0
- package/dist/architect/core/types.js +49 -0
- package/dist/architect/core/types.js.map +1 -0
- package/dist/architect/execution/executor.d.ts +23 -0
- package/dist/architect/execution/executor.js +476 -0
- package/dist/architect/execution/executor.js.map +1 -0
- package/dist/architect/execution/index.d.ts +1 -0
- package/dist/architect/execution/index.js +19 -0
- package/dist/architect/execution/index.js.map +1 -0
- package/dist/architect/executor.d.ts +7 -0
- package/dist/architect/executor.js +150 -0
- package/dist/architect/executor.js.map +1 -0
- package/dist/architect/index.d.ts +45 -0
- package/dist/architect/index.js +76 -0
- package/dist/architect/index.js.map +1 -0
- package/dist/architect/llmClient.d.ts +10 -0
- package/dist/architect/llmClient.js +33 -0
- package/dist/architect/llmClient.js.map +1 -0
- package/dist/architect/models/base.d.ts +16 -0
- package/dist/architect/models/base.js +68 -0
- package/dist/architect/models/base.js.map +1 -0
- package/dist/architect/models/factory.d.ts +16 -0
- package/dist/architect/models/factory.js +73 -0
- package/dist/architect/models/factory.js.map +1 -0
- package/dist/architect/models/index.d.ts +3 -0
- package/dist/architect/models/index.js +21 -0
- package/dist/architect/models/index.js.map +1 -0
- package/dist/architect/models/openai.d.ts +7 -0
- package/dist/architect/models/openai.js +71 -0
- package/dist/architect/models/openai.js.map +1 -0
- package/dist/architect/planner.d.ts +9 -0
- package/dist/architect/planner.js +42 -0
- package/dist/architect/planner.js.map +1 -0
- package/dist/architect/planning/index.d.ts +4 -0
- package/dist/architect/planning/index.js +22 -0
- package/dist/architect/planning/index.js.map +1 -0
- package/dist/architect/planning/optimizer.d.ts +14 -0
- package/dist/architect/planning/optimizer.js +275 -0
- package/dist/architect/planning/optimizer.js.map +1 -0
- package/dist/architect/planning/planner.d.ts +15 -0
- package/dist/architect/planning/planner.js +124 -0
- package/dist/architect/planning/planner.js.map +1 -0
- package/dist/architect/planning/prompts.d.ts +6 -0
- package/dist/architect/planning/prompts.js +111 -0
- package/dist/architect/planning/prompts.js.map +1 -0
- package/dist/architect/planning/validator.d.ts +16 -0
- package/dist/architect/planning/validator.js +331 -0
- package/dist/architect/planning/validator.js.map +1 -0
- package/dist/architect/prompt.d.ts +1 -0
- package/dist/architect/prompt.js +13 -0
- package/dist/architect/prompt.js.map +1 -0
- package/dist/architect/types.d.ts +4 -0
- package/dist/architect/types.js +24 -0
- package/dist/architect/types.js.map +1 -0
- package/dist/cli/format.d.ts +19 -0
- package/dist/cli/format.js +62 -0
- package/dist/cli/format.js.map +1 -0
- package/dist/cli/init.d.ts +1 -0
- package/dist/cli/init.js +279 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/query.js +69 -0
- package/dist/cli/query.js.map +1 -1
- package/dist/cli.js +48 -21
- package/dist/cli.js.map +1 -1
- package/dist/code.d.ts +50 -0
- package/dist/code.js +357 -0
- package/dist/code.js.map +1 -0
- package/dist/generated/resolvers-types.d.ts +150 -29
- package/dist/index.d.ts +6 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/resources/cli.config.resource.d.ts +7 -0
- package/dist/resources/cli.config.resource.js +11 -0
- package/dist/resources/cli.config.resource.js.map +1 -0
- package/dist/resources/coverage.resource.d.ts +19 -0
- package/dist/resources/coverage.resource.js +213 -0
- package/dist/resources/coverage.resource.js.map +1 -0
- package/dist/resources/dev.resource.js +0 -2
- package/dist/resources/dev.resource.js.map +1 -1
- package/dist/resources/graphql.cli.resource.d.ts +4 -0
- package/dist/resources/graphql.cli.resource.js +27 -0
- package/dist/resources/graphql.cli.resource.js.map +1 -0
- package/dist/resources/graphql.query.cli.task.d.ts +47 -0
- package/dist/resources/graphql.query.cli.task.js +54 -0
- package/dist/resources/graphql.query.cli.task.js.map +1 -0
- package/dist/resources/introspector.cli.resource.d.ts +6 -0
- package/dist/resources/introspector.cli.resource.js +17 -0
- package/dist/resources/introspector.cli.resource.js.map +1 -0
- package/dist/resources/live.resource.d.ts +2 -1
- package/dist/resources/live.resource.js +4 -2
- package/dist/resources/live.resource.js.map +1 -1
- package/dist/resources/models/Introspector.d.ts +1 -1
- package/dist/resources/models/Introspector.js +5 -34
- package/dist/resources/models/Introspector.js.map +1 -1
- package/dist/resources/models/initializeFromStore.js +26 -34
- package/dist/resources/models/initializeFromStore.js.map +1 -1
- package/dist/resources/models/initializeFromStore.utils.js +25 -6
- package/dist/resources/models/initializeFromStore.utils.js.map +1 -1
- package/dist/resources/models/introspector.tools.js +2 -2
- package/dist/resources/models/introspector.tools.js.map +1 -1
- package/dist/resources/routeHandlers/getDocsData.d.ts +6 -0
- package/dist/resources/routeHandlers/getDocsData.js +106 -0
- package/dist/resources/routeHandlers/getDocsData.js.map +1 -1
- package/dist/resources/routeHandlers/registerHttpRoutes.hook.d.ts +4 -0
- package/dist/resources/routeHandlers/registerHttpRoutes.hook.js +9 -7
- package/dist/resources/routeHandlers/registerHttpRoutes.hook.js.map +1 -1
- package/dist/resources/server.resource.d.ts +3 -0
- package/dist/resources/server.resource.js +8 -1
- package/dist/resources/server.resource.js.map +1 -1
- package/dist/resources/swap.cli.resource.d.ts +11 -0
- package/dist/resources/swap.cli.resource.js +54 -0
- package/dist/resources/swap.cli.resource.js.map +1 -0
- package/dist/schema/context.d.ts +2 -0
- package/dist/schema/model.d.ts +4 -1
- package/dist/schema/model.js.map +1 -1
- package/dist/schema/mutation.js +38 -0
- package/dist/schema/mutation.js.map +1 -1
- package/dist/schema/query.js +22 -18
- package/dist/schema/query.js.map +1 -1
- package/dist/schema/types/BaseElementCommon.d.ts +2 -4
- package/dist/schema/types/BaseElementCommon.js +28 -0
- package/dist/schema/types/BaseElementCommon.js.map +1 -1
- package/dist/schema/types/CoverageType.d.ts +7 -0
- package/dist/schema/types/CoverageType.js +54 -0
- package/dist/schema/types/CoverageType.js.map +1 -0
- package/dist/schema/types/LiveType.js +4 -0
- package/dist/schema/types/LiveType.js.map +1 -1
- package/dist/schema/types/ResourceType.js +6 -0
- package/dist/schema/types/ResourceType.js.map +1 -1
- package/dist/schema/types/TagType.js +4 -3
- package/dist/schema/types/TagType.js.map +1 -1
- package/dist/schema/types/index.d.ts +1 -0
- package/dist/schema/types/index.js +3 -1
- package/dist/schema/types/index.js.map +1 -1
- package/dist/ui/.vite/manifest.json +2 -2
- package/dist/ui/assets/docs-DR80KoAA.js +416 -0
- package/dist/ui/assets/docs-DR80KoAA.js.map +1 -0
- package/dist/ui/assets/docs-WKK9Zcu5.css +1 -0
- package/dist/utils/path.js +10 -0
- package/dist/utils/path.js.map +1 -1
- package/package.json +12 -8
- package/dist/ui/assets/docs-DVEzFAJo.css +0 -1
- 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,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":"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"}
|
|
@@ -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
|