@wowok/agent-mcp 2.6.1 → 2.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/customer/customer-advice.d.ts +31 -0
- package/dist/customer/customer-advice.js +129 -0
- package/dist/customer/index.d.ts +2 -0
- package/dist/customer/index.js +2 -0
- package/dist/customer/info-puzzle.d.ts +9 -2
- package/dist/customer/info-puzzle.js +34 -7
- package/dist/customer/order-monitor.d.ts +2 -0
- package/dist/customer/order-monitor.js +3 -2
- package/dist/customer/post-purchase.d.ts +2 -0
- package/dist/customer/post-purchase.js +6 -5
- package/dist/customer/preorder-compare.d.ts +24 -0
- package/dist/customer/preorder-compare.js +34 -0
- package/dist/customer/reminder-system.d.ts +2 -0
- package/dist/customer/reminder-system.js +2 -1
- package/dist/customer/risk-assessment.js +30 -7
- package/dist/customer/types.d.ts +7 -0
- package/dist/examples/arbitration-dispute-create.json +41 -0
- package/dist/examples/arbitration-vote-weighted.json +35 -0
- package/dist/examples/arbitration-voting-guard-add.json +38 -0
- package/dist/examples/demand-present-service.json +33 -0
- package/dist/examples/gen-passport-verify-guard.json +48 -0
- package/dist/examples/guard-template-balance-check.json +59 -0
- package/dist/examples/guard-template-time-lock.json +60 -0
- package/dist/examples/insurance-guard-claim-timelock.json +75 -0
- package/dist/examples/insurance-guard-withdraw-allocation.json +96 -0
- package/dist/examples/insurance-machine-create-publish.json +75 -0
- package/dist/examples/insurance-service-allocators-publish.json +56 -0
- package/dist/examples/machine-multisig-threshold.json +86 -0
- package/dist/examples/machine-template-7node-rental.json +119 -0
- package/dist/examples/payment-scenario-bound.json +45 -0
- package/dist/examples/rental-ziroom-machine-create.json +149 -0
- package/dist/examples/rental-ziroom-permission-create.json +42 -0
- package/dist/examples/rental-ziroom-service-create.json +89 -0
- package/dist/examples/retail-adv-guard-customer-win-create.json +80 -0
- package/dist/examples/retail-adv-guard-messenger-proof-create.json +65 -0
- package/dist/examples/retail-adv-guard-reward-timeout-create.json +92 -0
- package/dist/examples/retail-adv-reward-guard-add.json +51 -0
- package/dist/examples/retail-myshop-allocation-activate.json +55 -0
- package/dist/examples/retail-myshop-arbitration-create.json +40 -0
- package/dist/examples/retail-myshop-contact-create.json +43 -0
- package/dist/examples/retail-myshop-order-create.json +56 -0
- package/dist/examples/retail-myshop-progress-operate.json +38 -0
- package/dist/examples/retail-myshop-reward-create.json +35 -0
- package/dist/examples/retail-myshop-service-create.json +88 -0
- package/dist/examples/service-discount-issue.json +46 -0
- package/dist/examples/threebody-guard-create.json +56 -0
- package/dist/examples/threebody-machine-create.json +72 -0
- package/dist/examples/threebody-permission-create.json +38 -0
- package/dist/examples/threebody-service-allocators.json +49 -0
- package/dist/examples/travel-guard-time-lock.json +69 -0
- package/dist/examples/travel-guard-weather-oracle.json +70 -0
- package/dist/examples/travel-machine-create.json +136 -0
- package/dist/examples/travel-repository-create.json +47 -0
- package/dist/examples/travel-service-create.json +102 -0
- package/dist/examples/travel-treasury-create.json +34 -0
- package/dist/examples/treasury-deposit.json +37 -0
- package/dist/examples/treasury-withdraw.json +38 -0
- package/dist/extensions/business-modules.d.ts +49 -0
- package/dist/extensions/business-modules.js +287 -0
- package/dist/extensions/capability-manifest.js +216 -29
- package/dist/extensions/constraint-registry.js +21 -19
- package/dist/extensions/metric-registry.js +14 -14
- package/dist/extensions/mode-evaluator.js +16 -16
- package/dist/extensions/modes.js +141 -49
- package/dist/extensions/registry.d.ts +16 -9
- package/dist/extensions/registry.js +132 -44
- package/dist/extensions/types.d.ts +2 -0
- package/dist/index.js +50 -0
- package/dist/knowledge/deployment-scanner.js +1 -1
- package/dist/knowledge/fund-layer.d.ts +138 -0
- package/dist/knowledge/fund-layer.js +969 -0
- package/dist/knowledge/guard-render.d.ts +57 -0
- package/dist/knowledge/guard-render.js +700 -0
- package/dist/knowledge/guard-submission-prompt.d.ts +31 -0
- package/dist/knowledge/guard-submission-prompt.js +171 -0
- package/dist/knowledge/guard-templates.d.ts +10 -0
- package/dist/knowledge/guard-templates.js +50 -0
- package/dist/knowledge/index.d.ts +2 -2
- package/dist/knowledge/index.js +2 -2
- package/dist/knowledge/machine-ledger.js +1 -1
- package/dist/knowledge/machine-render.d.ts +41 -0
- package/dist/knowledge/machine-render.js +565 -0
- package/dist/knowledge/machine-risk.js +4 -1
- package/dist/knowledge/machine-templates.js +4 -4
- package/dist/knowledge/progress-context.js +1 -1
- package/dist/knowledge/progress-ledger.js +3 -3
- package/dist/knowledge/progress-templates.js +1 -1
- package/dist/knowledge/progress-translation.js +1 -1
- package/dist/knowledge/reward-confirm.js +2 -2
- package/dist/knowledge/reward-puzzle.js +1 -1
- package/dist/knowledge/reward-risk.js +9 -9
- package/dist/knowledge/reward-templates.js +2 -2
- package/dist/knowledge/safety-rules.d.ts +83 -1
- package/dist/knowledge/safety-rules.js +166 -2
- package/dist/knowledge/scenario-modes.d.ts +1 -1
- package/dist/knowledge/scenario-modes.js +13 -11
- package/dist/knowledge/service-confirm.d.ts +1 -1
- package/dist/knowledge/service-confirm.js +3 -3
- package/dist/knowledge/service-context.js +1 -1
- package/dist/knowledge/service-ledger.js +1 -1
- package/dist/knowledge/service-risk.d.ts +1 -1
- package/dist/knowledge/service-risk.js +3 -3
- package/dist/knowledge/service-templates.js +2 -2
- package/dist/knowledge/service-translation.d.ts +1 -1
- package/dist/knowledge/service-translation.js +7 -7
- package/dist/knowledge/template-registry.d.ts +48 -0
- package/dist/knowledge/template-registry.js +341 -0
- package/dist/knowledge/tool-constraints.js +6 -6
- package/dist/knowledge/tools-reference.js +11 -8
- package/dist/participation/merchant-interest.d.ts +32 -0
- package/dist/participation/merchant-interest.js +100 -0
- package/dist/participation/radar-core.d.ts +104 -0
- package/dist/participation/radar-core.js +269 -0
- package/dist/project/context-assembly.js +8 -0
- package/dist/project/deployment-bridge.js +6 -5
- package/dist/project/deployment-doc.js +5 -5
- package/dist/project/edit-planner.d.ts +123 -0
- package/dist/project/edit-planner.js +1342 -0
- package/dist/project/evaluation.d.ts +36 -0
- package/dist/project/evaluation.js +734 -68
- package/dist/project/game-theory.d.ts +43 -0
- package/dist/project/game-theory.js +177 -0
- package/dist/project/graph-builder.js +7 -1
- package/dist/project/handlers.d.ts +137 -2
- package/dist/project/handlers.js +423 -51
- package/dist/project/intent-analyzer.d.ts +71 -0
- package/dist/project/intent-analyzer.js +149 -0
- package/dist/project/machine-nodes.d.ts +2 -0
- package/dist/project/machine-nodes.js +36 -0
- package/dist/project/merchant-guide.d.ts +165 -0
- package/dist/project/merchant-guide.js +264 -0
- package/dist/project/mode-actions.d.ts +199 -0
- package/dist/project/mode-actions.js +309 -0
- package/dist/project/participation-radar.d.ts +18 -0
- package/dist/project/participation-radar.js +428 -0
- package/dist/project/pipeline-actions.d.ts +101 -0
- package/dist/project/pipeline-actions.js +109 -0
- package/dist/project/semantic-graph.d.ts +95 -0
- package/dist/project/semantic-graph.js +245 -0
- package/dist/project/stage-gate.js +4 -4
- package/dist/schema/call/allocation.d.ts +11 -11
- package/dist/schema/call/allocation.js +13 -3
- package/dist/schema/call/arbitration.d.ts +21 -21
- package/dist/schema/call/arbitration.js +30 -9
- package/dist/schema/call/base.d.ts +2 -2
- package/dist/schema/call/base.js +1 -1
- package/dist/schema/call/bridge.d.ts +127 -127
- package/dist/schema/call/bridge.js +12 -12
- package/dist/schema/call/contact.d.ts +3 -3
- package/dist/schema/call/contact.js +2 -2
- package/dist/schema/call/demand.d.ts +3 -3
- package/dist/schema/call/demand.js +2 -2
- package/dist/schema/call/guard.d.ts +11 -11
- package/dist/schema/call/guard.js +2 -2
- package/dist/schema/call/machine.d.ts +2072 -679
- package/dist/schema/call/machine.js +51 -5
- package/dist/schema/call/order.d.ts +7 -7
- package/dist/schema/call/order.js +3 -6
- package/dist/schema/call/payment.d.ts +3 -3
- package/dist/schema/call/permission.d.ts +3 -3
- package/dist/schema/call/permission.js +2 -2
- package/dist/schema/call/personal.d.ts +337 -3
- package/dist/schema/call/personal.js +10 -0
- package/dist/schema/call/progress.d.ts +177 -9
- package/dist/schema/call/progress.js +7 -3
- package/dist/schema/call/proof.d.ts +6 -6
- package/dist/schema/call/repository.d.ts +3 -3
- package/dist/schema/call/repository.js +2 -2
- package/dist/schema/call/reward.d.ts +57 -57
- package/dist/schema/call/reward.js +3 -3
- package/dist/schema/call/semantic.js +48 -2
- package/dist/schema/call/service.d.ts +285 -113
- package/dist/schema/call/service.js +92 -28
- package/dist/schema/call/treasury.d.ts +57 -57
- package/dist/schema/call/treasury.js +3 -3
- package/dist/schema/common/index.d.ts +2 -0
- package/dist/schema/common/index.js +46 -10
- package/dist/schema/local/index.js +5 -1
- package/dist/schema/messenger/index.js +4 -1
- package/dist/schema/operations.d.ts +1318 -317
- package/dist/schema/operations.js +76 -7
- package/dist/schema/project/index.d.ts +5662 -164
- package/dist/schema/project/index.js +1136 -5
- package/dist/schema/query/index.d.ts +580 -19
- package/dist/schema/query/index.js +88 -36
- package/dist/schema/schema-query/index.d.ts +59 -3
- package/dist/schema/schema-query/index.js +45 -6
- package/dist/schema/trust/index.d.ts +1012 -6
- package/dist/schema/trust/index.js +212 -11
- package/dist/schema/utils/node-parser.js +13 -0
- package/dist/schema/utils/object-type-utils.d.ts +12 -0
- package/dist/schema/utils/object-type-utils.js +35 -0
- package/dist/schema/utils/permission-machine-check.d.ts +49 -0
- package/dist/schema/utils/permission-machine-check.js +121 -0
- package/dist/schema/utils/skills-recommendation.d.ts +2 -0
- package/dist/schema/utils/skills-recommendation.js +77 -0
- package/dist/schema-query/index.d.ts +17 -1
- package/dist/schema-query/index.js +359 -3
- package/dist/schemas/account_operation.schema.json +1 -1
- package/dist/schemas/bridge_operation.schema.json +14 -7
- package/dist/schemas/guard2file.schema.json +2 -0
- package/dist/schemas/index.json +1 -1
- package/dist/schemas/machineNode2file.schema.json +2 -0
- package/dist/schemas/messenger_operation.schema.json +1 -1
- package/dist/schemas/onchain_events.output.json +1 -1
- package/dist/schemas/onchain_operations.output.json +2820 -0
- package/dist/schemas/onchain_operations.schema.json +255 -65
- package/dist/schemas/onchain_operations_allocation.schema.json +7 -6
- package/dist/schemas/onchain_operations_arbitration.schema.json +14 -10
- package/dist/schemas/onchain_operations_contact.schema.json +4 -3
- package/dist/schemas/onchain_operations_demand.schema.json +4 -3
- package/dist/schemas/onchain_operations_gen_passport.schema.json +4 -2
- package/dist/schemas/onchain_operations_gen_proof.schema.json +2 -0
- package/dist/schemas/onchain_operations_guard.schema.json +579 -1
- package/dist/schemas/onchain_operations_machine.schema.json +5 -4
- package/dist/schemas/onchain_operations_order.schema.json +7 -6
- package/dist/schemas/onchain_operations_payment.schema.json +2 -1
- package/dist/schemas/onchain_operations_permission.schema.json +3 -2
- package/dist/schemas/onchain_operations_personal.schema.json +37 -0
- package/dist/schemas/onchain_operations_progress.schema.json +91 -4
- package/dist/schemas/onchain_operations_proof.schema.json +2 -1
- package/dist/schemas/onchain_operations_repository.schema.json +4 -3
- package/dist/schemas/onchain_operations_reward.schema.json +7 -6
- package/dist/schemas/onchain_operations_service.schema.json +80 -19
- package/dist/schemas/onchain_operations_treasury.schema.json +5 -4
- package/dist/schemas/onchain_table_data.output.json +1 -1
- package/dist/schemas/onchain_table_data.schema.json +10 -9
- package/dist/schemas/project_operation.output.json +3318 -57
- package/dist/schemas/project_operation.schema.json +728 -4
- package/dist/schemas/query_toolkit.output.json +16 -16
- package/dist/schemas/query_toolkit.schema.json +40 -3
- package/dist/schemas/schema_query.output.json +65 -2
- package/dist/schemas/schema_query.schema.json +31 -5
- package/dist/schemas/trust_score.output.json +392 -1
- package/dist/schemas/trust_score.schema.json +275 -1
- package/dist/schemas/wowok_buildin_info.output.json +81 -8
- package/dist/schemas/wowok_buildin_info.schema.json +46 -2
- package/dist/tools/handlers/onchain.js +636 -6
- package/dist/tools/handlers/project.js +71 -2
- package/dist/tools/handlers/query.js +117 -2
- package/dist/tools/handlers/schema-query.js +65 -1
- package/dist/tools/handlers/trust.js +192 -6
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.js +229 -15
- package/dist/tools/wrap.js +194 -15
- package/package.json +2 -2
package/dist/project/handlers.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
import { LocalProject, LocalMark, query_objects,
|
|
1
|
+
import { LocalProject, LocalMark, query_objects, } from "@wowok/wowok";
|
|
2
|
+
import { fetchMachineNodes } from "./machine-nodes.js";
|
|
2
3
|
import { GraphBuilder } from "./graph-builder.js";
|
|
3
4
|
import { SemanticAssembler } from "./semantic-assembler.js";
|
|
4
5
|
import { runEvaluation, compareProjects, } from "./evaluation.js";
|
|
5
6
|
import { TaskTracker } from "./task-tracker.js";
|
|
7
|
+
import { renderGuardMermaid, renderGuardTreeIndented, renderGuardAscii, renderGuardMarkmap, } from "../knowledge/guard-render.js";
|
|
8
|
+
import { renderMachineMermaid, renderMachineTreeIndented, renderMachineAscii, renderMachineMarkmap, } from "../knowledge/machine-render.js";
|
|
9
|
+
import { inferTraitsFromDescription, findSimilarIndustries, } from "../knowledge/industry-generalizer.js";
|
|
10
|
+
import { isObjectOfType } from "../schema/utils/object-type-utils.js";
|
|
6
11
|
const localProject = LocalProject.Instance();
|
|
7
12
|
function requireField(value, name) {
|
|
8
13
|
if (value === undefined || value === null) {
|
|
@@ -41,6 +46,17 @@ async function resolveObjectAddress(v) {
|
|
|
41
46
|
}
|
|
42
47
|
throw new Error("Either 'object_address' or 'object_name_add' is required for add_object");
|
|
43
48
|
}
|
|
49
|
+
function isDraftObject(obj) {
|
|
50
|
+
if (obj.objectAddress && obj.objectAddress.startsWith("draft:"))
|
|
51
|
+
return true;
|
|
52
|
+
const meta = obj.metadata;
|
|
53
|
+
return !!(meta && meta.status === "draft");
|
|
54
|
+
}
|
|
55
|
+
function isOnchainObject(obj) {
|
|
56
|
+
if (isDraftObject(obj))
|
|
57
|
+
return false;
|
|
58
|
+
return !!obj.objectAddress && obj.objectAddress.startsWith("0x");
|
|
59
|
+
}
|
|
44
60
|
export async function handleListProjects(v) {
|
|
45
61
|
const filter = {};
|
|
46
62
|
if (v.filter_status)
|
|
@@ -60,12 +76,13 @@ export async function handleListProjects(v) {
|
|
|
60
76
|
if (o.objectType)
|
|
61
77
|
types.add(o.objectType);
|
|
62
78
|
}
|
|
79
|
+
const onchainCount = objs.filter(o => isOnchainObject(o)).length;
|
|
63
80
|
if (p.status === "draft" && objs.length > 0) {
|
|
64
81
|
const updated = await localProject.updateProject(p.id, { status: "active" });
|
|
65
82
|
if (updated) {
|
|
66
83
|
return {
|
|
67
84
|
...updated,
|
|
68
|
-
objectCount:
|
|
85
|
+
objectCount: onchainCount,
|
|
69
86
|
evaluationCount: evals.length,
|
|
70
87
|
objectTypes: Array.from(types),
|
|
71
88
|
};
|
|
@@ -73,7 +90,7 @@ export async function handleListProjects(v) {
|
|
|
73
90
|
}
|
|
74
91
|
return {
|
|
75
92
|
...p,
|
|
76
|
-
objectCount:
|
|
93
|
+
objectCount: onchainCount,
|
|
77
94
|
evaluationCount: evals.length,
|
|
78
95
|
objectTypes: Array.from(types),
|
|
79
96
|
};
|
|
@@ -85,12 +102,30 @@ export async function handleListProjects(v) {
|
|
|
85
102
|
};
|
|
86
103
|
}
|
|
87
104
|
export async function handleCreateProject(v) {
|
|
88
|
-
const prefix = requireField(v.project, "project (prefix)");
|
|
89
105
|
const name = requireField(v.project_name, "project_name");
|
|
106
|
+
let prefix = v.project;
|
|
107
|
+
if (!prefix) {
|
|
108
|
+
prefix = name
|
|
109
|
+
.toLowerCase()
|
|
110
|
+
.trim()
|
|
111
|
+
.replace(/[^a-z0-9]+/g, "_")
|
|
112
|
+
.replace(/^_+|_+$/g, "")
|
|
113
|
+
.substring(0, 60);
|
|
114
|
+
if (!prefix) {
|
|
115
|
+
prefix = `proj_${Date.now().toString(36)}`;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
90
118
|
const existing = await localProject.getProjectByPrefix(prefix);
|
|
91
119
|
if (existing) {
|
|
92
|
-
|
|
93
|
-
|
|
120
|
+
if (v.project) {
|
|
121
|
+
throw new Error(`Project prefix '${prefix}' already exists (project: '${existing.name}', id: '${existing.id}'). ` +
|
|
122
|
+
`Use a different prefix or update the existing project.`);
|
|
123
|
+
}
|
|
124
|
+
let suffix = 2;
|
|
125
|
+
while (await localProject.getProjectByPrefix(`${prefix}_${suffix}`)) {
|
|
126
|
+
suffix++;
|
|
127
|
+
}
|
|
128
|
+
prefix = `${prefix}_${suffix}`;
|
|
94
129
|
}
|
|
95
130
|
const create = {
|
|
96
131
|
prefix,
|
|
@@ -103,6 +138,26 @@ export async function handleCreateProject(v) {
|
|
|
103
138
|
network: v.project_network ?? "testnet",
|
|
104
139
|
};
|
|
105
140
|
const project = await localProject.createProject(create);
|
|
141
|
+
if (v.service_address) {
|
|
142
|
+
try {
|
|
143
|
+
await localProject.addObject(project.id, {
|
|
144
|
+
objectAddress: v.service_address,
|
|
145
|
+
objectType: "Service",
|
|
146
|
+
objectName: v.service_address.startsWith("0x")
|
|
147
|
+
? undefined
|
|
148
|
+
: v.service_address,
|
|
149
|
+
role: "core",
|
|
150
|
+
metadata: {
|
|
151
|
+
auto_added_from_service_address: true,
|
|
152
|
+
added_at: new Date().toISOString(),
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
console.warn(`[create_project] Failed to auto-add Service '${v.service_address}': ${err.message}. ` +
|
|
158
|
+
`Use add_object action to manually add it.`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
106
161
|
const industry = v.project_industry;
|
|
107
162
|
const skipTemplates = v.skip_templates === true;
|
|
108
163
|
if (industry && industry !== "general" && !skipTemplates) {
|
|
@@ -116,7 +171,28 @@ export async function handleCreateProject(v) {
|
|
|
116
171
|
business_intent: v.project_description ?? name,
|
|
117
172
|
industry,
|
|
118
173
|
};
|
|
119
|
-
const blueprint = registry.applyTemplate(industry, context.business_intent, context);
|
|
174
|
+
const blueprint = await registry.applyTemplate(industry, context.business_intent, context);
|
|
175
|
+
const intentInference = inferTraitsFromDescription(context.business_intent);
|
|
176
|
+
const industryMatches = findSimilarIndustries(intentInference.traits, 3);
|
|
177
|
+
const intentInferenceSummary = {
|
|
178
|
+
traits: intentInference.traits,
|
|
179
|
+
confidence: intentInference.confidence,
|
|
180
|
+
matched_keywords: intentInference.matched_keywords,
|
|
181
|
+
top_matches: industryMatches.map((m) => ({
|
|
182
|
+
industry: m.industry,
|
|
183
|
+
similarity: m.similarity,
|
|
184
|
+
})),
|
|
185
|
+
};
|
|
186
|
+
const topMatch = industryMatches[0];
|
|
187
|
+
const industryMismatchHint = topMatch &&
|
|
188
|
+
!industryMatches.some((m) => m.industry === industry) &&
|
|
189
|
+
intentInference.confidence >= 0.3 &&
|
|
190
|
+
topMatch.similarity >= 0.6
|
|
191
|
+
? `Intent inference suggests industry '${topMatch.industry}' ` +
|
|
192
|
+
`(similarity ${(topMatch.similarity * 100).toFixed(0)}%) may fit the description ` +
|
|
193
|
+
`better than the chosen '${industry}'. Call action='recommend_industry' for the full ` +
|
|
194
|
+
`recommendation chain, or ignore this hint if '${industry}' was chosen intentionally.`
|
|
195
|
+
: undefined;
|
|
120
196
|
const draftObjects = [];
|
|
121
197
|
for (const obj of blueprint.objects) {
|
|
122
198
|
const projectObj = await localProject.addObject(project.id, {
|
|
@@ -150,6 +226,20 @@ export async function handleCreateProject(v) {
|
|
|
150
226
|
},
|
|
151
227
|
}));
|
|
152
228
|
await localProject.saveGraphEdges(project.id, graphEdges);
|
|
229
|
+
try {
|
|
230
|
+
await localProject.saveDocument(project.id, context.network, JSON.stringify({
|
|
231
|
+
applied_template: blueprint.applied_template,
|
|
232
|
+
industry_source: blueprint.industry_source,
|
|
233
|
+
steps: blueprint.steps,
|
|
234
|
+
scenarios: blueprint.scenarios ?? [],
|
|
235
|
+
validation: blueprint.validation,
|
|
236
|
+
intent_inference: intentInferenceSummary,
|
|
237
|
+
generated_at: new Date().toISOString(),
|
|
238
|
+
}, null, 2), "blueprint");
|
|
239
|
+
}
|
|
240
|
+
catch (docErr) {
|
|
241
|
+
console.warn(`[create_project] Failed to persist blueprint document: ${docErr.message}`);
|
|
242
|
+
}
|
|
153
243
|
return {
|
|
154
244
|
action: "create_project",
|
|
155
245
|
project,
|
|
@@ -161,6 +251,8 @@ export async function handleCreateProject(v) {
|
|
|
161
251
|
steps_count: blueprint.steps.length,
|
|
162
252
|
scenarios_count: blueprint.scenarios?.length ?? 0,
|
|
163
253
|
key_risk: registry.getMode(industry)?.key_risk,
|
|
254
|
+
intent_inference: intentInferenceSummary,
|
|
255
|
+
...(industryMismatchHint ? { industry_mismatch_hint: industryMismatchHint } : {}),
|
|
164
256
|
},
|
|
165
257
|
recommended_creation_order: getRecommendedCreationOrder(industry),
|
|
166
258
|
};
|
|
@@ -183,6 +275,29 @@ export async function handleCreateProject(v) {
|
|
|
183
275
|
recommended_creation_order: getRecommendedCreationOrder(industry),
|
|
184
276
|
};
|
|
185
277
|
}
|
|
278
|
+
if (!industry) {
|
|
279
|
+
const intentText = (v.project_description ?? name).trim();
|
|
280
|
+
if (intentText) {
|
|
281
|
+
try {
|
|
282
|
+
const { handleRecommendIndustry } = await import("./mode-actions.js");
|
|
283
|
+
const rec = handleRecommendIndustry({ intent: intentText });
|
|
284
|
+
if (rec.recommendations.length > 0) {
|
|
285
|
+
return {
|
|
286
|
+
action: "create_project",
|
|
287
|
+
project,
|
|
288
|
+
recommended_creation_order: getRecommendedCreationOrder(industry),
|
|
289
|
+
recommended_industries: rec.recommendations,
|
|
290
|
+
hint: "No industry specified. Based on your description, top match is '" +
|
|
291
|
+
rec.recommendations[0].industry + "'. To get a ready-made blueprint " +
|
|
292
|
+
"(~10 draft objects + graph edges), recreate with project_industry set — " +
|
|
293
|
+
"or continue from scratch with add_object.",
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
186
301
|
return {
|
|
187
302
|
action: "create_project",
|
|
188
303
|
project,
|
|
@@ -264,7 +379,11 @@ export async function handleCreateProjectFromOnchain(v) {
|
|
|
264
379
|
throw new Error(`Service object not found on ${network}: the address ${serviceAddress} does not exist on this network. ` +
|
|
265
380
|
`Switch to the ${otherNetwork} network and try again.`);
|
|
266
381
|
}
|
|
267
|
-
|
|
382
|
+
const normalizedType = rootType.toLowerCase();
|
|
383
|
+
const isService = normalizedType.includes("::service::service") ||
|
|
384
|
+
normalizedType === "service" ||
|
|
385
|
+
normalizedType.endsWith("::service");
|
|
386
|
+
if (!isService) {
|
|
268
387
|
throw new Error(`Object ${serviceAddress} is not a Service (its on-chain type is "${rootType}"). ` +
|
|
269
388
|
`Only on-chain Service objects can be imported as a project root.`);
|
|
270
389
|
}
|
|
@@ -406,6 +525,8 @@ export async function handleGetProjectDetail(v) {
|
|
|
406
525
|
}
|
|
407
526
|
}
|
|
408
527
|
const VALID_ROLES = new Set(["core", "dependency", "reference"]);
|
|
528
|
+
const draftObjs = objects.filter(o => isDraftObject(o));
|
|
529
|
+
const onchainObjs = objects.filter(o => isOnchainObject(o));
|
|
409
530
|
const core = objects.filter(o => o.role === "core");
|
|
410
531
|
const dependency = objects.filter(o => o.role === "dependency");
|
|
411
532
|
const reference = objects.filter(o => o.role === "reference");
|
|
@@ -421,8 +542,11 @@ export async function handleGetProjectDetail(v) {
|
|
|
421
542
|
dependency,
|
|
422
543
|
reference,
|
|
423
544
|
other,
|
|
545
|
+
draft: draftObjs,
|
|
424
546
|
stats: {
|
|
425
547
|
total: objects.length,
|
|
548
|
+
onchain_count: onchainObjs.length,
|
|
549
|
+
draft_count: draftObjs.length,
|
|
426
550
|
core_count: core.length,
|
|
427
551
|
dependency_count: dependency.length,
|
|
428
552
|
reference_count: reference.length,
|
|
@@ -435,10 +559,17 @@ export async function handleGetProjectDetail(v) {
|
|
|
435
559
|
}, {}),
|
|
436
560
|
},
|
|
437
561
|
};
|
|
562
|
+
const objectsWithDraftFlag = objects.map(o => ({
|
|
563
|
+
...o,
|
|
564
|
+
isDraft: isDraftObject(o),
|
|
565
|
+
}));
|
|
438
566
|
return {
|
|
439
567
|
action: "get_project_detail",
|
|
440
568
|
project: effectiveProject,
|
|
441
|
-
objects,
|
|
569
|
+
objects: objectsWithDraftFlag,
|
|
570
|
+
objectCount: objects.length,
|
|
571
|
+
onchainCount: onchainObjs.length,
|
|
572
|
+
draftCount: draftObjs.length,
|
|
442
573
|
objectGroups,
|
|
443
574
|
graphEdgeCount: edges.length,
|
|
444
575
|
serviceStatus,
|
|
@@ -593,7 +724,8 @@ async function buildGraphSync(projectId, project, v) {
|
|
|
593
724
|
if (objects.length === 0) {
|
|
594
725
|
throw new Error("Cannot build graph: project has no objects and no service_address");
|
|
595
726
|
}
|
|
596
|
-
const coreObj = objects.find(o => o.role === "core")
|
|
727
|
+
const coreObj = objects.find(o => o.role === "core")
|
|
728
|
+
?? objects.find(o => o.objectType?.includes("service::Service") || o.objectType === "Service");
|
|
597
729
|
rootAddress = (coreObj ?? objects[0]).objectAddress;
|
|
598
730
|
}
|
|
599
731
|
const builder = new GraphBuilder({
|
|
@@ -689,6 +821,40 @@ async function verifyServiceBindings(serviceAddress, network) {
|
|
|
689
821
|
return null;
|
|
690
822
|
}
|
|
691
823
|
}
|
|
824
|
+
function synthesizeOnchainFallbackEdges(serviceAddress, bindings) {
|
|
825
|
+
const edges = [];
|
|
826
|
+
const now = Date.now();
|
|
827
|
+
const fieldMap = [
|
|
828
|
+
{ key: "Service.machine", fieldName: "machine", relationshipType: "machine" },
|
|
829
|
+
{ key: "Service.permission", fieldName: "permission", relationshipType: "permission" },
|
|
830
|
+
{ key: "Service.buy_guard", fieldName: "buy_guard", relationshipType: "guard" },
|
|
831
|
+
{ key: "Service.um", fieldName: "um", relationshipType: "um" },
|
|
832
|
+
{ key: "Service.order_allocators", fieldName: "order_allocators", relationshipType: "guard" },
|
|
833
|
+
{ key: "Service.arbitrations", fieldName: "arbitrations", relationshipType: "arbitration" },
|
|
834
|
+
];
|
|
835
|
+
for (const fm of fieldMap) {
|
|
836
|
+
const b = bindings.bindings[fm.key];
|
|
837
|
+
if (!b || !b.verified)
|
|
838
|
+
continue;
|
|
839
|
+
const target = b.actual ?? `${serviceAddress}#${fm.fieldName}#synthetic`;
|
|
840
|
+
edges.push({
|
|
841
|
+
id: `onchain-fallback-${fm.fieldName}-${now}`,
|
|
842
|
+
projectId: null,
|
|
843
|
+
sourceObject: serviceAddress,
|
|
844
|
+
targetObject: target,
|
|
845
|
+
edgeSource: "internal",
|
|
846
|
+
relationshipType: fm.relationshipType,
|
|
847
|
+
fieldName: fm.fieldName,
|
|
848
|
+
depth: 1,
|
|
849
|
+
verified: true,
|
|
850
|
+
weight: 1,
|
|
851
|
+
direction: "outbound",
|
|
852
|
+
metadata: { onchain_fallback: true },
|
|
853
|
+
cachedAt: now,
|
|
854
|
+
});
|
|
855
|
+
}
|
|
856
|
+
return edges;
|
|
857
|
+
}
|
|
692
858
|
function shortLabel(addrOrName) {
|
|
693
859
|
if (!addrOrName)
|
|
694
860
|
return "(empty)";
|
|
@@ -721,11 +887,26 @@ export async function handleEvaluateProject(v) {
|
|
|
721
887
|
const project = await localProject.getProject(projectId);
|
|
722
888
|
if (!project)
|
|
723
889
|
throw new Error(`Project not found: ${projectId}`);
|
|
724
|
-
|
|
725
|
-
|
|
890
|
+
let refreshWarning;
|
|
891
|
+
if (v.refresh_before_eval !== false) {
|
|
892
|
+
const refreshResult = await refreshProjectObjects(projectId, project.network);
|
|
893
|
+
if (refreshResult.failedCount > 0) {
|
|
894
|
+
refreshWarning = `Refresh completed with ${refreshResult.failedCount} failed object(s) ` +
|
|
895
|
+
`out of ${refreshResult.refreshedCount + refreshResult.failedCount} total. ` +
|
|
896
|
+
`Evaluation may use stale data for failed objects.`;
|
|
897
|
+
}
|
|
726
898
|
}
|
|
727
899
|
const objects = await localProject.listObjects(projectId);
|
|
728
|
-
|
|
900
|
+
let edges = await localProject.getGraph(projectId);
|
|
901
|
+
let graphFallbackWarning;
|
|
902
|
+
if (edges.length === 0 && project.serviceAddress) {
|
|
903
|
+
const bindings = await verifyServiceBindings(project.serviceAddress, project.network);
|
|
904
|
+
if (bindings && Object.values(bindings.bindings).some(b => b.verified)) {
|
|
905
|
+
edges = synthesizeOnchainFallbackEdges(project.serviceAddress, bindings);
|
|
906
|
+
const verifiedCount = Object.values(bindings.bindings).filter(b => b.verified).length;
|
|
907
|
+
graphFallbackWarning = `Graph is empty; fell back to on-chain direct query (${verifiedCount}/${Object.keys(bindings.bindings).length} Service bindings verified). Call build_graph to construct the full relationship graph.`;
|
|
908
|
+
}
|
|
909
|
+
}
|
|
729
910
|
const addresses = objects.map(o => o.objectAddress);
|
|
730
911
|
const cacheEntries = await localProject.getCachedObjects(addresses);
|
|
731
912
|
const objectCache = new Map();
|
|
@@ -778,6 +959,8 @@ export async function handleEvaluateProject(v) {
|
|
|
778
959
|
needsLlm: result.needsLlm,
|
|
779
960
|
llmPrompt: result.llmPrompt,
|
|
780
961
|
evaluationId,
|
|
962
|
+
refreshWarning,
|
|
963
|
+
graphFallbackWarning,
|
|
781
964
|
};
|
|
782
965
|
}
|
|
783
966
|
export async function handleSaveEvaluation(v) {
|
|
@@ -930,6 +1113,123 @@ export async function handleCloneProjectToNetwork(v) {
|
|
|
930
1113
|
next_steps: `Execute the same onchain_operations sequence with env.network='${targetNetwork}' to deploy objects. Then call update_project to set service_address, and build_graph to construct the new project's relationship graph.`,
|
|
931
1114
|
};
|
|
932
1115
|
}
|
|
1116
|
+
export async function handleMigrateToMainnet(v) {
|
|
1117
|
+
const sourceProjectId = await resolveProjectId(v);
|
|
1118
|
+
const sourceProject = await localProject.getProject(sourceProjectId);
|
|
1119
|
+
if (!sourceProject) {
|
|
1120
|
+
throw new Error(`Source project not found: ${sourceProjectId}`);
|
|
1121
|
+
}
|
|
1122
|
+
if (sourceProject.network === "mainnet") {
|
|
1123
|
+
throw new Error(`Source project '${sourceProject.prefix}' is already on mainnet. ` +
|
|
1124
|
+
`migrate_to_mainnet is for testnet→mainnet migration only. ` +
|
|
1125
|
+
`To clone to testnet, use clone_project_to_network with target_network='testnet'.`);
|
|
1126
|
+
}
|
|
1127
|
+
const cloneInput = { ...v, target_network: "mainnet" };
|
|
1128
|
+
const cloneResult = await handleCloneProjectToNetwork(cloneInput);
|
|
1129
|
+
const sourceObjects = await localProject.listObjects(sourceProjectId);
|
|
1130
|
+
const deploymentPlan = sourceObjects
|
|
1131
|
+
.filter(obj => obj.objectType !== null)
|
|
1132
|
+
.map((obj, idx) => ({
|
|
1133
|
+
order: idx + 1,
|
|
1134
|
+
object_type: obj.objectType,
|
|
1135
|
+
object_name: obj.objectName ?? "<unnamed>",
|
|
1136
|
+
operation_type: mapObjectTypeToOperationType(obj.objectType),
|
|
1137
|
+
localmark_name: obj.objectName ?? `<unnamed_${idx + 1}>`,
|
|
1138
|
+
note: `Deploy on mainnet with env.network='mainnet'. Use the SAME LocalMark name '${obj.objectName ?? "<unnamed>"}' — it will resolve to a DIFFERENT mainnet address. The testnet address is NOT reused.`,
|
|
1139
|
+
}));
|
|
1140
|
+
return {
|
|
1141
|
+
action: "migrate_to_mainnet",
|
|
1142
|
+
migration_status: "step_1_complete_steps_2_5_pending_user_action",
|
|
1143
|
+
source_project: {
|
|
1144
|
+
prefix: sourceProject.prefix,
|
|
1145
|
+
network: sourceProject.network,
|
|
1146
|
+
preserved: true,
|
|
1147
|
+
},
|
|
1148
|
+
target_project: {
|
|
1149
|
+
prefix: cloneResult.new_prefix,
|
|
1150
|
+
project_id: cloneResult.new_project_id,
|
|
1151
|
+
network: "mainnet",
|
|
1152
|
+
cloned_objects_count: cloneResult.cloned_objects_count,
|
|
1153
|
+
},
|
|
1154
|
+
key_principle: "testnet and mainnet are DIFFERENT projects. Same LocalMark names may exist in both networks, " +
|
|
1155
|
+
"but they correspond to DIFFERENT on-chain addresses. The testnet project is preserved unchanged. " +
|
|
1156
|
+
"LocalMark names are NETWORK-SCOPED: a name resolves to a testnet address when env.network=testnet, " +
|
|
1157
|
+
"and to a mainnet address when env.network=mainnet. Register the SAME name TWICE (once per network).",
|
|
1158
|
+
migration_plan: [
|
|
1159
|
+
{
|
|
1160
|
+
step: 1,
|
|
1161
|
+
status: "completed",
|
|
1162
|
+
action: "clone_project_to_network",
|
|
1163
|
+
description: "Clone source project metadata to mainnet project",
|
|
1164
|
+
result: `Created mainnet project '${cloneResult.new_prefix}' with ${cloneResult.cloned_objects_count} draft object(s).`,
|
|
1165
|
+
},
|
|
1166
|
+
{
|
|
1167
|
+
step: 2,
|
|
1168
|
+
status: "pending_user_action",
|
|
1169
|
+
action: "onchain_operations",
|
|
1170
|
+
description: "Re-deploy all objects on mainnet. Set env.network='mainnet' and env.project='" +
|
|
1171
|
+
cloneResult.new_prefix + "'. Use the SAME LocalMark names — they will resolve to " +
|
|
1172
|
+
"DIFFERENT mainnet addresses. Mainnet accounts need real (non-test) SUI for gas.",
|
|
1173
|
+
deployment_plan: deploymentPlan,
|
|
1174
|
+
critical_note: "Re-deploy in dependency order: Permission → Machine → Contact → Guard(s) → Service. " +
|
|
1175
|
+
"For the Service↔Guard circular dependency, use the 3-step pattern " +
|
|
1176
|
+
"(Service without order_allocators → Guards → Service with order_allocators + publish).",
|
|
1177
|
+
},
|
|
1178
|
+
{
|
|
1179
|
+
step: 3,
|
|
1180
|
+
status: "pending_user_action",
|
|
1181
|
+
action: "local_mark_operation",
|
|
1182
|
+
description: "Re-register LocalMark names on mainnet. Each name from step 2 must be registered " +
|
|
1183
|
+
"with its NEW mainnet address. The testnet LocalMark entries are NOT migrated " +
|
|
1184
|
+
"automatically — mainnet has its own name registry.",
|
|
1185
|
+
names_to_register: sourceObjects
|
|
1186
|
+
.filter(obj => obj.objectName !== null)
|
|
1187
|
+
.map(obj => obj.objectName),
|
|
1188
|
+
},
|
|
1189
|
+
{
|
|
1190
|
+
step: 4,
|
|
1191
|
+
status: "pending_user_action",
|
|
1192
|
+
action: "update_project",
|
|
1193
|
+
description: "Set service_address on the mainnet project to the mainnet Service address " +
|
|
1194
|
+
"(from step 2). Use project='" + cloneResult.new_prefix + "' and the mainnet " +
|
|
1195
|
+
"Service LocalMark name or 0x address.",
|
|
1196
|
+
},
|
|
1197
|
+
{
|
|
1198
|
+
step: 5,
|
|
1199
|
+
status: "pending_user_action",
|
|
1200
|
+
action: "build_graph",
|
|
1201
|
+
description: "Rebuild the relationship graph on the mainnet project. Use project='" +
|
|
1202
|
+
cloneResult.new_prefix + "'. This constructs edges from the newly-deployed " +
|
|
1203
|
+
"mainnet object bindings (machine, order_allocators, guards, etc.).",
|
|
1204
|
+
},
|
|
1205
|
+
],
|
|
1206
|
+
summary: "Migration step 1 (clone) complete. Steps 2-5 require user action: deploy objects on mainnet, " +
|
|
1207
|
+
"re-register LocalMark names, set service_address, and rebuild the graph. The testnet project " +
|
|
1208
|
+
"is preserved unchanged — you can run both in parallel until ready to deprecate the testnet version.",
|
|
1209
|
+
};
|
|
1210
|
+
}
|
|
1211
|
+
function mapObjectTypeToOperationType(objectType) {
|
|
1212
|
+
const map = {
|
|
1213
|
+
service: "service",
|
|
1214
|
+
machine: "machine",
|
|
1215
|
+
guard: "guard",
|
|
1216
|
+
permission: "permission",
|
|
1217
|
+
progress: "progress",
|
|
1218
|
+
arb: "arbitration",
|
|
1219
|
+
arbitration: "arbitration",
|
|
1220
|
+
contact: "contact",
|
|
1221
|
+
treasury: "treasury",
|
|
1222
|
+
reward: "reward",
|
|
1223
|
+
allocation: "allocation",
|
|
1224
|
+
repository: "repository",
|
|
1225
|
+
demand: "demand",
|
|
1226
|
+
order: "order",
|
|
1227
|
+
personal: "personal",
|
|
1228
|
+
payment: "payment",
|
|
1229
|
+
proof: "proof",
|
|
1230
|
+
};
|
|
1231
|
+
return map[objectType.toLowerCase()] ?? objectType.toLowerCase();
|
|
1232
|
+
}
|
|
933
1233
|
export async function handleGetObjectDiff(v) {
|
|
934
1234
|
const address = requireField(v.diff_address, "diff_address");
|
|
935
1235
|
const fromTime = requireField(v.diff_from_time, "diff_from_time");
|
|
@@ -1009,39 +1309,7 @@ export async function handleGetMachineGraph(v) {
|
|
|
1009
1309
|
const edgeList = [];
|
|
1010
1310
|
let rawNodes = [];
|
|
1011
1311
|
try {
|
|
1012
|
-
|
|
1013
|
-
let cursor = undefined;
|
|
1014
|
-
for (;;) {
|
|
1015
|
-
const tableResult = await query_table({
|
|
1016
|
-
parent: machineAddress,
|
|
1017
|
-
cursor: cursor ?? undefined,
|
|
1018
|
-
network,
|
|
1019
|
-
});
|
|
1020
|
-
if (!tableResult?.items || tableResult.items.length === 0)
|
|
1021
|
-
break;
|
|
1022
|
-
for (const item of tableResult.items) {
|
|
1023
|
-
if (item.object)
|
|
1024
|
-
allFieldObjectIds.push(item.object);
|
|
1025
|
-
}
|
|
1026
|
-
if (!tableResult.hasNextPage || !tableResult.nextCursor)
|
|
1027
|
-
break;
|
|
1028
|
-
cursor = tableResult.nextCursor;
|
|
1029
|
-
}
|
|
1030
|
-
if (allFieldObjectIds.length > 0) {
|
|
1031
|
-
const BATCH = 50;
|
|
1032
|
-
for (let i = 0; i < allFieldObjectIds.length; i += BATCH) {
|
|
1033
|
-
const batch = allFieldObjectIds.slice(i, i + BATCH);
|
|
1034
|
-
const nodeQueryResult = await query_objects({
|
|
1035
|
-
objects: batch,
|
|
1036
|
-
network,
|
|
1037
|
-
});
|
|
1038
|
-
for (const obj of nodeQueryResult?.objects ?? []) {
|
|
1039
|
-
if (obj.type === "TableItem_MachineNode") {
|
|
1040
|
-
rawNodes.push(obj);
|
|
1041
|
-
}
|
|
1042
|
-
}
|
|
1043
|
-
}
|
|
1044
|
-
}
|
|
1312
|
+
rawNodes = await fetchMachineNodes(machineAddress, network);
|
|
1045
1313
|
}
|
|
1046
1314
|
catch (e) {
|
|
1047
1315
|
throw new Error(`Failed to query Machine nodes on ${network}: ${e instanceof Error ? e.message : String(e)}`);
|
|
@@ -1082,6 +1350,106 @@ export async function handleGetMachineGraph(v) {
|
|
|
1082
1350
|
edges: edgeList,
|
|
1083
1351
|
published,
|
|
1084
1352
|
paused,
|
|
1353
|
+
mermaid: renderMachineMermaid(Array.from(nodeMap.values()), edgeList),
|
|
1354
|
+
tree_outline: renderMachineTreeIndented({
|
|
1355
|
+
nodes: Array.from(nodeMap.values()),
|
|
1356
|
+
edges: edgeList,
|
|
1357
|
+
machineName,
|
|
1358
|
+
machineAddress,
|
|
1359
|
+
published,
|
|
1360
|
+
paused,
|
|
1361
|
+
}),
|
|
1362
|
+
ascii_art: renderMachineAscii({
|
|
1363
|
+
nodes: Array.from(nodeMap.values()),
|
|
1364
|
+
edges: edgeList,
|
|
1365
|
+
machineName,
|
|
1366
|
+
machineAddress,
|
|
1367
|
+
published,
|
|
1368
|
+
paused,
|
|
1369
|
+
}),
|
|
1370
|
+
markmap: renderMachineMarkmap({
|
|
1371
|
+
nodes: Array.from(nodeMap.values()),
|
|
1372
|
+
edges: edgeList,
|
|
1373
|
+
machineName,
|
|
1374
|
+
machineAddress,
|
|
1375
|
+
published,
|
|
1376
|
+
paused,
|
|
1377
|
+
}),
|
|
1378
|
+
};
|
|
1379
|
+
}
|
|
1380
|
+
export async function handleGetGuardGraph(v) {
|
|
1381
|
+
const projectId = await resolveProjectId(v);
|
|
1382
|
+
const guardAddress = await resolveObjectAddress(v);
|
|
1383
|
+
const project = await localProject.getProject(projectId);
|
|
1384
|
+
if (!project)
|
|
1385
|
+
throw new Error(`Project not found (id: ${projectId})`);
|
|
1386
|
+
const objects = await localProject.listObjects(projectId);
|
|
1387
|
+
const guardObj = objects.find(o => o.objectAddress === guardAddress);
|
|
1388
|
+
if (!guardObj) {
|
|
1389
|
+
throw new Error(`Object ${guardAddress} is not part of project '${project.prefix}'. ` +
|
|
1390
|
+
`Add it via add_object first.`);
|
|
1391
|
+
}
|
|
1392
|
+
const network = (project.network ?? "testnet");
|
|
1393
|
+
let guardData = null;
|
|
1394
|
+
try {
|
|
1395
|
+
const queryResult = await query_objects({
|
|
1396
|
+
objects: [guardAddress],
|
|
1397
|
+
network,
|
|
1398
|
+
});
|
|
1399
|
+
guardData = queryResult?.objects?.[0] ?? null;
|
|
1400
|
+
}
|
|
1401
|
+
catch (e) {
|
|
1402
|
+
throw new Error(`Failed to query Guard on ${network}: ${e instanceof Error ? e.message : String(e)}`);
|
|
1403
|
+
}
|
|
1404
|
+
if (!guardData) {
|
|
1405
|
+
throw new Error(`Guard ${guardAddress} not found on ${network}. ` +
|
|
1406
|
+
`It may not exist on this network — try switching networks.`);
|
|
1407
|
+
}
|
|
1408
|
+
let guardName = null;
|
|
1409
|
+
try {
|
|
1410
|
+
const mark = await LocalMark.Instance().get(guardAddress);
|
|
1411
|
+
guardName = mark?.name ?? null;
|
|
1412
|
+
}
|
|
1413
|
+
catch {
|
|
1414
|
+
}
|
|
1415
|
+
const root = guardData.root ?? guardData.data?.root ?? null;
|
|
1416
|
+
const table = guardData.table ?? guardData.data?.table ?? [];
|
|
1417
|
+
const rely = guardData.rely ?? guardData.data?.rely ?? null;
|
|
1418
|
+
const immutable = guardData.immutable ?? guardData.data?.immutable ?? null;
|
|
1419
|
+
if (!root) {
|
|
1420
|
+
throw new Error(`Guard ${guardAddress} has no root node. The Guard may be empty or corrupted. ` +
|
|
1421
|
+
`Use query_toolkit to inspect the raw object data.`);
|
|
1422
|
+
}
|
|
1423
|
+
const mermaidStr = renderGuardMermaid(root);
|
|
1424
|
+
const tableForRender = Array.isArray(table) ? table.map((t) => ({
|
|
1425
|
+
identifier: t.identifier,
|
|
1426
|
+
name: t.name,
|
|
1427
|
+
value_type: t.value_type,
|
|
1428
|
+
b_submission: t.b_submission,
|
|
1429
|
+
value: t.value,
|
|
1430
|
+
})) : [];
|
|
1431
|
+
const guardRenderInput = {
|
|
1432
|
+
root: root,
|
|
1433
|
+
table: tableForRender,
|
|
1434
|
+
guardName,
|
|
1435
|
+
guardAddress,
|
|
1436
|
+
rely: rely ?? null,
|
|
1437
|
+
};
|
|
1438
|
+
const treeOutline = renderGuardTreeIndented(guardRenderInput);
|
|
1439
|
+
const asciiArt = renderGuardAscii(guardRenderInput);
|
|
1440
|
+
const markmap = renderGuardMarkmap(guardRenderInput);
|
|
1441
|
+
return {
|
|
1442
|
+
action: "get_guard_graph",
|
|
1443
|
+
guardAddress,
|
|
1444
|
+
guardName,
|
|
1445
|
+
root,
|
|
1446
|
+
table: Array.isArray(table) ? table : [],
|
|
1447
|
+
rely: rely ?? null,
|
|
1448
|
+
immutable: immutable ?? null,
|
|
1449
|
+
mermaid: mermaidStr,
|
|
1450
|
+
tree_outline: treeOutline,
|
|
1451
|
+
ascii_art: asciiArt,
|
|
1452
|
+
markmap: markmap,
|
|
1085
1453
|
};
|
|
1086
1454
|
}
|
|
1087
1455
|
export async function handlePreEvaluateCheck(v) {
|
|
@@ -1164,7 +1532,7 @@ export async function handlePreEvaluateCheck(v) {
|
|
|
1164
1532
|
});
|
|
1165
1533
|
}
|
|
1166
1534
|
if (project.perspective === "producer") {
|
|
1167
|
-
const hasService = objects.some(o => o.objectType
|
|
1535
|
+
const hasService = objects.some(o => isObjectOfType(o.objectType, "service"));
|
|
1168
1536
|
if (!hasService) {
|
|
1169
1537
|
missing.push({
|
|
1170
1538
|
id: "PE-06",
|
|
@@ -1271,8 +1639,12 @@ export async function handleVerifyDeployment(v) {
|
|
|
1271
1639
|
const chainObjects = chainResult?.objects ?? [];
|
|
1272
1640
|
const chainByAddress = new Map();
|
|
1273
1641
|
for (const co of chainObjects) {
|
|
1274
|
-
if (co && typeof co === "object"
|
|
1275
|
-
|
|
1642
|
+
if (co && typeof co === "object") {
|
|
1643
|
+
const coRecord = co;
|
|
1644
|
+
const addr = coRecord.object ?? coRecord.objectId ?? coRecord.object_id;
|
|
1645
|
+
if (typeof addr === "string") {
|
|
1646
|
+
chainByAddress.set(addr, co);
|
|
1647
|
+
}
|
|
1276
1648
|
}
|
|
1277
1649
|
}
|
|
1278
1650
|
const results = [];
|
|
@@ -1294,7 +1666,7 @@ export async function handleVerifyDeployment(v) {
|
|
|
1294
1666
|
const sqliteFields = sqliteData?.data ?? {};
|
|
1295
1667
|
const differences = [];
|
|
1296
1668
|
let bindings;
|
|
1297
|
-
if (obj.objectType
|
|
1669
|
+
if (isObjectOfType(obj.objectType, "service")) {
|
|
1298
1670
|
const fieldsToCompare = ["machine", "permission", "buy_guard", "arbitrations", "rewards", "repositories"];
|
|
1299
1671
|
for (const f of fieldsToCompare) {
|
|
1300
1672
|
const sqliteVal = sqliteFields[f];
|
|
@@ -1319,7 +1691,7 @@ export async function handleVerifyDeployment(v) {
|
|
|
1319
1691
|
});
|
|
1320
1692
|
}
|
|
1321
1693
|
}
|
|
1322
|
-
else if (obj.objectType
|
|
1694
|
+
else if (isObjectOfType(obj.objectType, "machine")) {
|
|
1323
1695
|
if (sqliteFields.bPublished !== undefined && chainData.bPublished !== undefined
|
|
1324
1696
|
&& sqliteFields.bPublished !== chainData.bPublished) {
|
|
1325
1697
|
differences.push({
|