@wowok/agent-mcp 2.5.5 → 2.6.1
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/README.md +5 -3
- package/dist/config/runtime.js +3 -6
- package/dist/extensions/capability-manifest.d.ts +125 -0
- package/dist/extensions/capability-manifest.js +594 -0
- package/dist/extensions/constraint-registry.d.ts +24 -0
- package/dist/extensions/constraint-registry.js +196 -0
- package/dist/extensions/index.d.ts +12 -0
- package/dist/extensions/index.js +6 -0
- package/dist/extensions/metric-registry.d.ts +26 -0
- package/dist/extensions/metric-registry.js +257 -0
- package/dist/extensions/mode-evaluator.d.ts +15 -0
- package/dist/extensions/mode-evaluator.js +170 -0
- package/dist/extensions/modes.d.ts +2 -0
- package/dist/extensions/modes.js +407 -0
- package/dist/extensions/registry.d.ts +48 -0
- package/dist/extensions/registry.js +629 -0
- package/dist/extensions/types.d.ts +218 -0
- package/dist/extensions/types.js +1 -0
- package/dist/harness/checkpoint.js +2 -2
- package/dist/knowledge/deployment-scanner.d.ts +3 -0
- package/dist/knowledge/deployment-scanner.js +64 -3
- package/dist/knowledge/flywheel-loop.js +2 -5
- package/dist/knowledge/guard-risk.d.ts +13 -0
- package/dist/knowledge/guard-risk.js +57 -0
- package/dist/knowledge/guard-templates.js +278 -0
- package/dist/knowledge/machine-templates.js +20 -1
- package/dist/knowledge/overrides-loader.js +2 -4
- package/dist/knowledge/progress-ledger.js +3 -0
- package/dist/knowledge/progress-translation.js +5 -1
- package/dist/knowledge/service-confirm.d.ts +14 -5
- package/dist/knowledge/service-confirm.js +116 -8
- package/dist/knowledge/tool-constraints.js +6 -2
- package/dist/loop-engineering/improve.js +2 -4
- package/dist/project/deployment-bridge.d.ts +5 -0
- package/dist/project/deployment-bridge.js +119 -0
- package/dist/project/deployment-doc.d.ts +3 -0
- package/dist/project/deployment-doc.js +72 -10
- package/dist/project/evaluation.d.ts +2 -0
- package/dist/project/evaluation.js +578 -86
- package/dist/project/graph-builder.d.ts +4 -1
- package/dist/project/graph-builder.js +141 -63
- package/dist/project/graph.d.ts +1 -0
- package/dist/project/handlers.d.ts +221 -5
- package/dist/project/handlers.js +933 -14
- package/dist/project/index.js +2 -6
- package/dist/project/project-store.js +2 -5
- package/dist/project/stage-gate.d.ts +4 -0
- package/dist/project/stage-gate.js +64 -5
- package/dist/project/task-tracker.d.ts +26 -0
- package/dist/project/task-tracker.js +78 -0
- package/dist/safety/preview.js +16 -0
- package/dist/schema/call/allocation.d.ts +16 -16
- package/dist/schema/call/base.d.ts +21 -13
- package/dist/schema/call/base.js +27 -6
- package/dist/schema/call/bridge.d.ts +5 -5
- package/dist/schema/call/bridge.js +3 -1
- package/dist/schema/call/demand.d.ts +23 -31
- package/dist/schema/call/guard.js +1 -1
- package/dist/schema/call/machine.d.ts +402 -376
- package/dist/schema/call/order.d.ts +149 -228
- package/dist/schema/call/order.js +7 -3
- package/dist/schema/call/payment.d.ts +183 -3
- package/dist/schema/call/payment.js +21 -3
- package/dist/schema/call/personal.d.ts +241 -52
- package/dist/schema/call/progress.d.ts +53 -61
- package/dist/schema/call/progress.js +18 -4
- package/dist/schema/call/repository.d.ts +23 -31
- package/dist/schema/call/semantic.d.ts +1 -1
- package/dist/schema/call/semantic.js +30 -1
- package/dist/schema/call/service.d.ts +95 -119
- package/dist/schema/call/service.js +22 -1
- package/dist/schema/common/index.d.ts +11 -2
- package/dist/schema/common/index.js +43 -14
- package/dist/schema/config/index.d.ts +12 -12
- package/dist/schema/local/index.d.ts +140 -143
- package/dist/schema/local/index.js +44 -23
- package/dist/schema/messenger/index.d.ts +290 -62
- package/dist/schema/messenger/index.js +2 -2
- package/dist/schema/operations.d.ts +680 -545
- package/dist/schema/operations.js +22 -0
- package/dist/schema/project/index.d.ts +2064 -84
- package/dist/schema/project/index.js +354 -12
- package/dist/schema/query/index.d.ts +715 -354
- package/dist/schema/query/index.js +164 -31
- package/dist/schema/schema-query/index.d.ts +15 -3
- package/dist/schema/schema-query/index.js +23 -5
- package/dist/schema/trust/index.d.ts +8 -8
- package/dist/schema/utils/node-parser.js +7 -4
- package/dist/schema-query/index.d.ts +7 -1
- package/dist/schema-query/index.js +204 -4
- package/dist/schemas/account_operation.output.json +14 -22
- package/dist/schemas/account_operation.schema.json +11 -25
- package/dist/schemas/bridge_operation.output.json +6 -0
- package/dist/schemas/bridge_operation.schema.json +1 -1
- package/dist/schemas/guard-templates.json +379 -0
- package/dist/schemas/guard2file.schema.json +1 -1
- package/dist/schemas/index.json +1 -1
- package/dist/schemas/local_info_operation.output.json +6 -0
- package/dist/schemas/local_mark_operation.output.json +7 -1
- package/dist/schemas/local_mark_operation.schema.json +1 -1
- package/dist/schemas/machineNode2file.schema.json +1 -1
- package/dist/schemas/messenger_operation.schema.json +10 -10
- package/dist/schemas/onchain_events.output.json +1 -1
- package/dist/schemas/onchain_operations.schema.json +348 -296
- package/dist/schemas/onchain_operations_allocation.schema.json +34 -25
- package/dist/schemas/onchain_operations_arbitration.schema.json +8 -8
- package/dist/schemas/onchain_operations_contact.schema.json +8 -8
- package/dist/schemas/onchain_operations_demand.schema.json +8 -8
- package/dist/schemas/onchain_operations_gen_passport.schema.json +14 -14
- package/dist/schemas/onchain_operations_gen_proof.schema.json +2 -2
- package/dist/schemas/onchain_operations_guard.schema.json +1 -1
- package/dist/schemas/onchain_operations_machine.schema.json +41 -33
- package/dist/schemas/onchain_operations_order.schema.json +71 -77
- package/dist/schemas/onchain_operations_payment.schema.json +141 -111
- package/dist/schemas/onchain_operations_permission.schema.json +2 -2
- package/dist/schemas/onchain_operations_personal.schema.json +7 -7
- package/dist/schemas/onchain_operations_progress.schema.json +8 -8
- package/dist/schemas/onchain_operations_proof.schema.json +7 -7
- package/dist/schemas/onchain_operations_repository.schema.json +8 -8
- package/dist/schemas/onchain_operations_reward.schema.json +10 -10
- package/dist/schemas/onchain_operations_service.schema.json +46 -35
- package/dist/schemas/onchain_operations_treasury.schema.json +8 -8
- package/dist/schemas/onchain_table_data.output.json +33 -25
- package/dist/schemas/onchain_table_data.schema.json +12 -12
- package/dist/schemas/project_operation.output.json +1352 -20
- package/dist/schemas/project_operation.schema.json +53 -4
- package/dist/schemas/query_toolkit.output.json +111 -82
- package/dist/schemas/query_toolkit.schema.json +9 -13
- package/dist/schemas/schema_query.output.json +7 -3
- package/dist/schemas/schema_query.schema.json +17 -3
- package/dist/telemetry/storage.js +2 -2
- package/dist/tools/handlers/local.js +20 -5
- package/dist/tools/handlers/onchain.js +36 -0
- package/dist/tools/handlers/project.js +72 -1
- package/dist/tools/handlers/query.js +27 -0
- package/dist/tools/handlers/schema-query.js +19 -0
- package/dist/tools/handlers/task-status.d.ts +170 -0
- package/dist/tools/handlers/task-status.js +55 -0
- package/dist/tools/handlers/wip.js +47 -1
- package/dist/tools/index.js +212 -8
- package/dist/tools/retry.d.ts +8 -0
- package/dist/tools/retry.js +85 -0
- package/dist/tools/wip-deploy-assist.d.ts +28 -0
- package/dist/tools/wip-deploy-assist.js +278 -0
- package/package.json +2 -2
- package/dist/schemas/guard-node-examples.md +0 -199
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { LocalProject } from "@wowok/wowok";
|
|
2
|
+
import { generateDeploymentDoc, validateDeploymentDoc } from "./deployment-doc.js";
|
|
3
|
+
export async function generateDeploymentDocFromProject(projectId, network, detailLevel) {
|
|
4
|
+
const project = await LocalProject.Instance().getProject(projectId);
|
|
5
|
+
if (!project) {
|
|
6
|
+
throw new Error(`Project not found: ${projectId}`);
|
|
7
|
+
}
|
|
8
|
+
const objects = await LocalProject.Instance().listObjects(projectId);
|
|
9
|
+
const graphEdges = await LocalProject.Instance().getGraph(projectId);
|
|
10
|
+
const evaluations = await LocalProject.Instance().listEvaluations(projectId, { evalType: "risk" });
|
|
11
|
+
const validObjects = objects.filter((o) => {
|
|
12
|
+
if (o.objectType === null || o.objectType === undefined)
|
|
13
|
+
return false;
|
|
14
|
+
if (o.objectName && /^0x[0-9a-fA-F]{40,}$/.test(o.objectName))
|
|
15
|
+
return false;
|
|
16
|
+
const meta = (o.metadata ?? {});
|
|
17
|
+
const typeRaw = meta.type_raw;
|
|
18
|
+
if (typeRaw && typeRaw.includes("dynamic_field::Field<"))
|
|
19
|
+
return false;
|
|
20
|
+
return true;
|
|
21
|
+
});
|
|
22
|
+
const deployObjects = validObjects.map((o) => {
|
|
23
|
+
const objectType = o.objectType;
|
|
24
|
+
const meta = (o.metadata ?? {});
|
|
25
|
+
const status = meta.status ??
|
|
26
|
+
(o.objectAddress.startsWith("draft:") ? "draft" : "deployed");
|
|
27
|
+
const config = meta.config ?? undefined;
|
|
28
|
+
const publishRequired = meta.publish_required ??
|
|
29
|
+
(objectType === "service" || objectType === "machine");
|
|
30
|
+
return {
|
|
31
|
+
entry_id: `${objectType}:${o.objectName || o.objectAddress || o.id}`,
|
|
32
|
+
object_type: normalizeObjectType(objectType),
|
|
33
|
+
name: o.objectName || o.objectAddress || o.id,
|
|
34
|
+
reused_from: status === "deployed" && o.objectAddress.startsWith("0x")
|
|
35
|
+
? o.objectAddress : undefined,
|
|
36
|
+
publish_required: publishRequired,
|
|
37
|
+
description: meta.description ??
|
|
38
|
+
(status === "draft" ? "[蓝图] 待上链" : "[已上链]"),
|
|
39
|
+
config,
|
|
40
|
+
status,
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
const addrToEntryId = new Map();
|
|
44
|
+
for (const o of validObjects) {
|
|
45
|
+
const objectType = o.objectType;
|
|
46
|
+
const entryId = `${objectType}:${o.objectName || o.objectAddress || o.id}`;
|
|
47
|
+
if (o.objectAddress) {
|
|
48
|
+
addrToEntryId.set(o.objectAddress, entryId);
|
|
49
|
+
}
|
|
50
|
+
if (o.objectName) {
|
|
51
|
+
addrToEntryId.set(o.objectName, entryId);
|
|
52
|
+
}
|
|
53
|
+
addrToEntryId.set(entryId, entryId);
|
|
54
|
+
}
|
|
55
|
+
const deployEdges = graphEdges.map((e) => ({
|
|
56
|
+
from: addrToEntryId.get(e.sourceObject) ?? e.sourceObject,
|
|
57
|
+
to: addrToEntryId.get(e.targetObject) ?? e.targetObject,
|
|
58
|
+
edge_kind: e.relationshipType,
|
|
59
|
+
field_path: e.fieldName || "",
|
|
60
|
+
required_at_publish: e.edgeSource === "internal",
|
|
61
|
+
}));
|
|
62
|
+
const steps = buildTopoSteps(deployObjects, deployEdges, network);
|
|
63
|
+
const riskEval = evaluations[0];
|
|
64
|
+
const risk_status = riskEval
|
|
65
|
+
? (riskEval.score !== null && riskEval.score < 50 ? "RISK_BLOCKED" : "RISK_PASSED")
|
|
66
|
+
: undefined;
|
|
67
|
+
const riskDetails = riskEval?.details;
|
|
68
|
+
const risk_critical_count = riskDetails?.critical_count;
|
|
69
|
+
const risk_high_count = riskDetails?.high_count;
|
|
70
|
+
const input = {
|
|
71
|
+
project_prefix: project.prefix,
|
|
72
|
+
business_intent: project.description || project.name,
|
|
73
|
+
industry: project.industry || "general",
|
|
74
|
+
version: project.currentVersion || "v1",
|
|
75
|
+
objects: deployObjects,
|
|
76
|
+
edges: deployEdges,
|
|
77
|
+
steps,
|
|
78
|
+
risk_status,
|
|
79
|
+
risk_critical_count,
|
|
80
|
+
risk_high_count,
|
|
81
|
+
detail_level: detailLevel,
|
|
82
|
+
};
|
|
83
|
+
const markdown = generateDeploymentDoc(input);
|
|
84
|
+
const validation = validateDeploymentDoc(input);
|
|
85
|
+
return { markdown, validation };
|
|
86
|
+
}
|
|
87
|
+
function normalizeObjectType(raw) {
|
|
88
|
+
const lower = raw.toLowerCase();
|
|
89
|
+
if (lower === "arbitration")
|
|
90
|
+
return "arb";
|
|
91
|
+
return lower;
|
|
92
|
+
}
|
|
93
|
+
function buildTopoSteps(objects, edges, network) {
|
|
94
|
+
const typeOrder = {
|
|
95
|
+
permission: 1, treasury: 2, allocation: 3, guard: 4,
|
|
96
|
+
service: 10, machine: 11, progress: 12,
|
|
97
|
+
order: 20, arb: 22,
|
|
98
|
+
reward: 30, proof: 32,
|
|
99
|
+
repository: 40, demand: 41, contact: 42,
|
|
100
|
+
personal: 51, payment: 52,
|
|
101
|
+
};
|
|
102
|
+
const sorted = [...objects].sort((a, b) => {
|
|
103
|
+
const oa = typeOrder[a.object_type] ?? 99;
|
|
104
|
+
const ob = typeOrder[b.object_type] ?? 99;
|
|
105
|
+
return oa - ob;
|
|
106
|
+
});
|
|
107
|
+
return sorted.map((obj, i) => ({
|
|
108
|
+
step: i + 1,
|
|
109
|
+
object_type: obj.object_type,
|
|
110
|
+
operation: obj.publish_required ? "publish" : "create",
|
|
111
|
+
substep_count: 1,
|
|
112
|
+
depends_on: edges
|
|
113
|
+
.filter((e) => e.to === obj.entry_id)
|
|
114
|
+
.map((e) => sorted.findIndex((o) => o.entry_id === e.from) + 1)
|
|
115
|
+
.filter((n) => n > 0),
|
|
116
|
+
entry_id: obj.entry_id,
|
|
117
|
+
network_phase: network,
|
|
118
|
+
}));
|
|
119
|
+
}
|
|
@@ -7,6 +7,8 @@ export interface DeploymentObject {
|
|
|
7
7
|
reused_from?: string;
|
|
8
8
|
publish_required: boolean;
|
|
9
9
|
description?: string;
|
|
10
|
+
config?: Record<string, unknown>;
|
|
11
|
+
status?: "draft" | "deployed";
|
|
10
12
|
}
|
|
11
13
|
export interface DeploymentDagEdge {
|
|
12
14
|
from: string;
|
|
@@ -45,6 +47,7 @@ export interface DeploymentDocInput {
|
|
|
45
47
|
risk_status?: "RISK_PASSED" | "RISK_BLOCKED" | "RISK_PENDING_CONFIRM" | "RISK_CANCELLED";
|
|
46
48
|
risk_critical_count?: number;
|
|
47
49
|
risk_high_count?: number;
|
|
50
|
+
detail_level?: "summary" | "detailed" | "full";
|
|
48
51
|
}
|
|
49
52
|
export interface DeploymentDocValidationResult {
|
|
50
53
|
valid: boolean;
|
|
@@ -75,33 +75,56 @@ function renderMeta(input) {
|
|
|
75
75
|
}
|
|
76
76
|
function renderODG(input) {
|
|
77
77
|
const lines = ["## 1. Object Dependency Graph (ODG)", ""];
|
|
78
|
+
const detailLevel = input.detail_level ?? "summary";
|
|
78
79
|
lines.push("### 1.1 Object List");
|
|
79
80
|
lines.push("");
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
const showDescription = detailLevel !== "summary";
|
|
82
|
+
if (showDescription) {
|
|
83
|
+
lines.push(tableHeader([
|
|
84
|
+
"entry_id", "object_type", "name", "reused_from", "publish_required", "description",
|
|
85
|
+
]));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
lines.push(tableHeader([
|
|
89
|
+
"entry_id", "object_type", "name", "reused_from", "publish_required",
|
|
90
|
+
]));
|
|
91
|
+
}
|
|
83
92
|
for (const o of input.objects) {
|
|
84
|
-
|
|
93
|
+
const row = [
|
|
85
94
|
o.entry_id,
|
|
86
95
|
o.object_type,
|
|
87
96
|
o.name,
|
|
88
97
|
o.reused_from ?? "",
|
|
89
98
|
String(o.publish_required),
|
|
90
|
-
|
|
91
|
-
|
|
99
|
+
];
|
|
100
|
+
if (showDescription)
|
|
101
|
+
row.push(o.description ?? "");
|
|
102
|
+
lines.push(tableRow(row));
|
|
92
103
|
}
|
|
93
104
|
lines.push("");
|
|
105
|
+
if (!showDescription) {
|
|
106
|
+
lines.push("_Use `detail_level='detailed'` or `'full'` to include object descriptions._");
|
|
107
|
+
lines.push("");
|
|
108
|
+
}
|
|
94
109
|
lines.push("### 1.2 Dependencies");
|
|
95
110
|
lines.push("");
|
|
96
111
|
lines.push(tableHeader([
|
|
97
112
|
"from", "to", "edge_kind", "field_path", "required_at_publish",
|
|
98
113
|
]));
|
|
99
|
-
|
|
114
|
+
const visibleEdges = detailLevel === "summary"
|
|
115
|
+
? input.edges.filter((e) => e.required_at_publish)
|
|
116
|
+
: input.edges;
|
|
117
|
+
for (const e of visibleEdges) {
|
|
100
118
|
lines.push(tableRow([
|
|
101
119
|
e.from, e.to, e.edge_kind, e.field_path, String(e.required_at_publish),
|
|
102
120
|
]));
|
|
103
121
|
}
|
|
104
122
|
lines.push("");
|
|
123
|
+
if (detailLevel === "summary" && input.edges.length > visibleEdges.length) {
|
|
124
|
+
lines.push(`_Showing ${visibleEdges.length} of ${input.edges.length} edges (required_at_publish only). ` +
|
|
125
|
+
`Use \`detail_level='detailed'\` or \`'full'\` to see all edges._`);
|
|
126
|
+
lines.push("");
|
|
127
|
+
}
|
|
105
128
|
if (input.scenarios && input.scenarios.length > 0) {
|
|
106
129
|
lines.push("### 1.3 Scenario Matrix");
|
|
107
130
|
lines.push("");
|
|
@@ -160,19 +183,56 @@ function renderNetworkSection(sectionNum, network, input) {
|
|
|
160
183
|
lines.push(tableRow(["gas_budget", "100000000"]));
|
|
161
184
|
lines.push(tableRow(["account", `${input.project_prefix}_merchant_${network}`]));
|
|
162
185
|
lines.push(tableRow(["dry_run", "false"]));
|
|
186
|
+
lines.push(tableRow(["detail_level", input.detail_level ?? "summary"]));
|
|
163
187
|
lines.push("");
|
|
164
188
|
lines.push(`### ${sectionNum}.2 ${network} JSON Operation Sequence`);
|
|
165
189
|
lines.push("");
|
|
190
|
+
const detailLevel = input.detail_level ?? "summary";
|
|
166
191
|
for (const step of input.steps) {
|
|
167
192
|
if (step.network_phase !== "both" && step.network_phase !== network)
|
|
168
193
|
continue;
|
|
194
|
+
const obj = input.objects.find(o => o.entry_id === step.entry_id);
|
|
195
|
+
const isDraft = obj?.status === "draft";
|
|
196
|
+
const objName = objectNameForStep(step, input);
|
|
197
|
+
const objectData = {
|
|
198
|
+
name: objName,
|
|
199
|
+
replaceExistName: network === "testnet",
|
|
200
|
+
};
|
|
201
|
+
if (isDraft && obj?.config) {
|
|
202
|
+
const summaryFields = new Set([
|
|
203
|
+
"name", "replaceExistName",
|
|
204
|
+
"machine", "permission", "buy_guard", "order_allocators",
|
|
205
|
+
"publish", "pause",
|
|
206
|
+
]);
|
|
207
|
+
const detailedFields = new Set([
|
|
208
|
+
"sales", "arbitrations", "rewards",
|
|
209
|
+
"repositories", "discount", "discount_destroy",
|
|
210
|
+
]);
|
|
211
|
+
for (const [k, v] of Object.entries(obj.config)) {
|
|
212
|
+
if (k === "name" || k === "replaceExistName")
|
|
213
|
+
continue;
|
|
214
|
+
if (detailLevel === "full") {
|
|
215
|
+
objectData[k] = v;
|
|
216
|
+
}
|
|
217
|
+
else if (detailLevel === "detailed"
|
|
218
|
+
&& (summaryFields.has(k) || detailedFields.has(k))) {
|
|
219
|
+
objectData[k] = v;
|
|
220
|
+
}
|
|
221
|
+
else if (detailLevel === "summary" && summaryFields.has(k)) {
|
|
222
|
+
objectData[k] = v;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
169
226
|
const block = {
|
|
170
227
|
step: step.step,
|
|
171
228
|
operation: "onchain_operations",
|
|
172
229
|
operation_type: step.object_type,
|
|
173
230
|
data: {
|
|
174
|
-
object:
|
|
175
|
-
description:
|
|
231
|
+
object: objectData,
|
|
232
|
+
description: isDraft
|
|
233
|
+
? `${stepDescription(step)} [蓝图:基于 ${input.industry} 行业模板生成]`
|
|
234
|
+
: stepDescription(step),
|
|
235
|
+
status: isDraft ? "draft" : "deployed",
|
|
176
236
|
},
|
|
177
237
|
env: {
|
|
178
238
|
account: `${input.project_prefix}_merchant_${network}`,
|
|
@@ -427,7 +487,9 @@ function runDCheck(item, input) {
|
|
|
427
487
|
}
|
|
428
488
|
for (const p of publishSteps) {
|
|
429
489
|
const created = createByType.get(p.object_type);
|
|
430
|
-
if (created === undefined
|
|
490
|
+
if (created === undefined)
|
|
491
|
+
continue;
|
|
492
|
+
if (created > p.step) {
|
|
431
493
|
return { status: "FAIL", notes: `publish ${p.step} before create for ${p.object_type}` };
|
|
432
494
|
}
|
|
433
495
|
}
|
|
@@ -30,6 +30,8 @@ export interface EvaluationInput {
|
|
|
30
30
|
objectCache: Map<string, ObjectCacheEntry>;
|
|
31
31
|
reputation?: Map<string, ReputationData>;
|
|
32
32
|
}
|
|
33
|
+
export declare function getNumberField(data: Record<string, unknown> | null, field: string): number;
|
|
34
|
+
export declare function getMachineNodeCount(data: Record<string, unknown> | null): number;
|
|
33
35
|
export declare function runEvaluation(input: EvaluationInput, evaluationType: EvaluationType, llmPrompt?: string): EvaluationResult;
|
|
34
36
|
export interface ProjectComparisonEntry {
|
|
35
37
|
projectId: string;
|