@wowok/agent-mcp 2.7.10 → 3.0.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.
Files changed (334) hide show
  1. package/dist/communication/evidence.d.ts +6 -0
  2. package/dist/communication/evidence.js +1 -0
  3. package/dist/evaluation/acceptance.d.ts +24 -0
  4. package/dist/evaluation/acceptance.js +1 -0
  5. package/dist/evaluation/builtins/demand-match.d.ts +3 -2
  6. package/dist/evaluation/builtins/demand-match.js +1 -1
  7. package/dist/evaluation/builtins/service-risk.d.ts +2 -1
  8. package/dist/evaluation/builtins/service-risk.js +1 -1
  9. package/dist/evaluation/index.d.ts +1 -0
  10. package/dist/evaluation/index.js +1 -1
  11. package/dist/evaluation/match-operation.d.ts +14 -0
  12. package/dist/evaluation/match-operation.js +1 -0
  13. package/dist/experience/realtime-feedback.js +1 -1
  14. package/dist/extensions/capability-manifest.d.ts +1 -82
  15. package/dist/extensions/capability-manifest.js +1 -1
  16. package/dist/extensions/constraint-registry.d.ts +6 -4
  17. package/dist/extensions/constraint-registry.js +1 -1
  18. package/dist/extensions/index.d.ts +4 -5
  19. package/dist/extensions/index.js +1 -1
  20. package/dist/extensions/industry-pack.js +1 -1
  21. package/dist/extensions/metric-registry.d.ts +6 -4
  22. package/dist/extensions/metric-registry.js +1 -1
  23. package/dist/extensions/mode-evaluator.d.ts +2 -3
  24. package/dist/extensions/mode-evaluator.js +1 -1
  25. package/dist/extensions/modes.js +1 -1
  26. package/dist/extensions/registry.d.ts +3 -25
  27. package/dist/extensions/registry.js +1 -1
  28. package/dist/extensions/types.d.ts +0 -68
  29. package/dist/goal/GoalClassifier.js +1 -1
  30. package/dist/goal/GoalEngine.d.ts +44 -1
  31. package/dist/goal/GoalEngine.js +1 -1
  32. package/dist/goal/types.d.ts +5 -1
  33. package/dist/harness/auto-escalation.d.ts +0 -12
  34. package/dist/harness/auto-escalation.js +1 -1
  35. package/dist/harness/index.d.ts +1 -14
  36. package/dist/harness/index.js +1 -1
  37. package/dist/harness/types.d.ts +0 -38
  38. package/dist/keeper/KeeperScan.d.ts +39 -0
  39. package/dist/keeper/KeeperScan.js +1 -0
  40. package/dist/keeper/KeeperStore.d.ts +43 -0
  41. package/dist/keeper/KeeperStore.js +1 -0
  42. package/dist/keeper/detectors.d.ts +23 -0
  43. package/dist/keeper/detectors.js +1 -0
  44. package/dist/keeper/keeper.spec.d.ts +1 -0
  45. package/dist/keeper/keeper.spec.js +1 -0
  46. package/dist/keeper/types.d.ts +65 -0
  47. package/dist/keeper/types.js +1 -0
  48. package/dist/knowledge/account-marks.d.ts +1 -0
  49. package/dist/knowledge/account-marks.js +1 -1
  50. package/dist/knowledge/demand-risk.js +1 -1
  51. package/dist/knowledge/event-semantics.d.ts +3 -0
  52. package/dist/knowledge/event-semantics.js +1 -1
  53. package/dist/knowledge/event-semantics.spec.d.ts +1 -0
  54. package/dist/knowledge/event-semantics.spec.js +1 -0
  55. package/dist/knowledge/evidence-review.d.ts +23 -0
  56. package/dist/knowledge/evidence-review.js +1 -1
  57. package/dist/knowledge/examples-scanner-cli.js +1 -1
  58. package/dist/knowledge/examples-scanner.js +1 -1
  59. package/dist/knowledge/fund-layer.d.ts +13 -9
  60. package/dist/knowledge/fund-layer.js +1 -1
  61. package/dist/knowledge/goal-completion.js +1 -1
  62. package/dist/knowledge/guard-bindings.d.ts +21 -0
  63. package/dist/knowledge/guard-bindings.js +1 -0
  64. package/dist/knowledge/guard-bytecode-spec.d.ts +82 -0
  65. package/dist/knowledge/guard-bytecode-spec.js +1 -0
  66. package/dist/knowledge/guard-design-patterns.d.ts +1 -1
  67. package/dist/knowledge/guard-design-patterns.js +1 -1
  68. package/dist/knowledge/index.d.ts +13 -7
  69. package/dist/knowledge/index.js +1 -1
  70. package/dist/knowledge/industry-registry.js +1 -1
  71. package/dist/knowledge/mcp-schema-audit-cli.js +1 -1
  72. package/dist/knowledge/mcp-schema-audit.js +1 -1
  73. package/dist/knowledge/reward-risk.d.ts +1 -1
  74. package/dist/knowledge/reward-risk.js +1 -1
  75. package/dist/knowledge/safety-rules.d.ts +2 -1
  76. package/dist/knowledge/safety-rules.js +1 -1
  77. package/dist/knowledge/scenario-modes.d.ts +1 -1
  78. package/dist/knowledge/scenario-modes.js +1 -1
  79. package/dist/knowledge/scenario-topology.d.ts +43 -0
  80. package/dist/knowledge/scenario-topology.js +1 -0
  81. package/dist/knowledge/supply-chain.js +1 -1
  82. package/dist/knowledge/template-registry.js +1 -1
  83. package/dist/knowledge/tools-reference.js +1 -1
  84. package/dist/knowledge/workflow-guidance.d.ts +55 -0
  85. package/dist/knowledge/workflow-guidance.js +1 -1
  86. package/dist/knowledge/workspace-lists.d.ts +1 -0
  87. package/dist/knowledge/workspace-lists.js +1 -1
  88. package/dist/monitor/MonitorLoop.d.ts +3 -0
  89. package/dist/monitor/MonitorLoop.js +1 -1
  90. package/dist/monitor/ScopeResolver.js +1 -1
  91. package/dist/monitor/SuggestionBridge.d.ts +38 -0
  92. package/dist/monitor/SuggestionBridge.js +1 -0
  93. package/dist/monitor/SuggestionBridge.spec.d.ts +1 -0
  94. package/dist/monitor/SuggestionBridge.spec.js +1 -0
  95. package/dist/monitor/types.d.ts +0 -1
  96. package/dist/monitor/types.js +1 -1
  97. package/dist/participation/arbitrator-interest.d.ts +20 -0
  98. package/dist/participation/arbitrator-interest.js +1 -0
  99. package/dist/participation/demander-interest.d.ts +23 -0
  100. package/dist/participation/demander-interest.js +1 -0
  101. package/dist/participation/employee-kpi.d.ts +12 -0
  102. package/dist/participation/employee-kpi.js +1 -1
  103. package/dist/participation/employee-kpi.spec.d.ts +1 -0
  104. package/dist/participation/employee-kpi.spec.js +1 -0
  105. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  106. package/dist/playbooks/service-build/context-assembly.js +1 -1
  107. package/dist/playbooks/service-build/machine-nodes.js +1 -1
  108. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  109. package/dist/playbooks/service-build/merchant-guide.d.ts +20 -0
  110. package/dist/playbooks/service-build/merchant-guide.js +1 -1
  111. package/dist/playbooks/service-build/mode-actions.d.ts +30 -12
  112. package/dist/playbooks/service-build/mode-actions.js +1 -1
  113. package/dist/playbooks/service-build/object-panorama.js +1 -1
  114. package/dist/playbooks/service-build/participation-radar.js +1 -1
  115. package/dist/playbooks/service-build/relationship-profile.d.ts +2 -0
  116. package/dist/playbooks/service-build/relationship-profile.js +1 -0
  117. package/dist/playbooks/service-build/semantic-graph.d.ts +5 -1
  118. package/dist/playbooks/service-build/semantic-graph.js +1 -1
  119. package/dist/playbooks/service-build/service-panorama.js +1 -1
  120. package/dist/relationship/derivation.d.ts +94 -0
  121. package/dist/relationship/derivation.js +1 -0
  122. package/dist/relationship/derivation.spec.d.ts +1 -0
  123. package/dist/relationship/derivation.spec.js +1 -0
  124. package/dist/relationship/incentive.d.ts +38 -0
  125. package/dist/relationship/incentive.js +1 -0
  126. package/dist/relationship/index.d.ts +4 -0
  127. package/dist/relationship/index.js +1 -0
  128. package/dist/relationship/registry.d.ts +13 -0
  129. package/dist/relationship/registry.js +1 -0
  130. package/dist/relationship/types.d.ts +45 -0
  131. package/dist/relationship/types.js +1 -0
  132. package/dist/review/progress.js +1 -1
  133. package/dist/role/index.d.ts +2 -2
  134. package/dist/role/index.js +1 -1
  135. package/dist/role/model.d.ts +2 -1
  136. package/dist/role/model.js +1 -1
  137. package/dist/role/types.d.ts +5 -0
  138. package/dist/rules.d.ts +1 -1
  139. package/dist/safety/confirm-gate.js +1 -1
  140. package/dist/safety/preview.js +1 -1
  141. package/dist/schema/call/bridge.d.ts +25 -3
  142. package/dist/schema/call/bridge.js +1 -1
  143. package/dist/schema/call/semantic.js +1 -1
  144. package/dist/schema/common/index.js +1 -1
  145. package/dist/schema/employee/index.d.ts +61 -1
  146. package/dist/schema/employee/index.js +1 -1
  147. package/dist/schema/evaluation/index.d.ts +70 -5
  148. package/dist/schema/evaluation/index.js +1 -1
  149. package/dist/schema/goal/index.d.ts +40 -14
  150. package/dist/schema/goal/index.js +1 -1
  151. package/dist/schema/goal/planning.d.ts +6 -6
  152. package/dist/schema/index.d.ts +1 -0
  153. package/dist/schema/index.js +1 -1
  154. package/dist/schema/industry-pack/index.d.ts +59 -7
  155. package/dist/schema/industry-pack/index.js +1 -1
  156. package/dist/schema/industry-pack/modes.d.ts +59 -7
  157. package/dist/schema/industry-pack/modes.js +1 -1
  158. package/dist/schema/intent-radar/index.d.ts +19 -19
  159. package/dist/schema/keeper/index.d.ts +475 -0
  160. package/dist/schema/keeper/index.js +1 -0
  161. package/dist/schema/local/index.d.ts +11 -0
  162. package/dist/schema/local/index.js +1 -1
  163. package/dist/schema/messenger/index.d.ts +2 -0
  164. package/dist/schema/messenger/index.js +1 -1
  165. package/dist/schema/operations.d.ts +64 -16
  166. package/dist/schema/persona/index.d.ts +1 -1
  167. package/dist/schema/query/bi.d.ts +244 -16
  168. package/dist/schema/query/bi.js +1 -1
  169. package/dist/schema/query/index.d.ts +2 -2
  170. package/dist/schema/schema-query/index.d.ts +2 -11
  171. package/dist/schema/schema-query/index.js +1 -1
  172. package/dist/schema/schema-version.js +1 -1
  173. package/dist/schema/utils/skills-recommendation.js +1 -1
  174. package/dist/schema/watch/index.d.ts +4 -0
  175. package/dist/schema/watch/index.js +1 -1
  176. package/dist/schema-query-impl/index.d.ts +33 -14
  177. package/dist/schema-query-impl/index.js +1 -1
  178. package/dist/schemas/account_operation.output.json +29 -0
  179. package/dist/schemas/account_operation.schema.json +6 -2
  180. package/dist/schemas/bridge_operation.output.json +24 -1
  181. package/dist/schemas/bridge_operation.schema.json +73 -1
  182. package/dist/schemas/employee_operation.output.json +100 -0
  183. package/dist/schemas/employee_operation.schema.json +148 -5
  184. package/dist/schemas/evaluation_operation.output.json +135 -9
  185. package/dist/schemas/evaluation_operation.schema.json +176 -7
  186. package/dist/schemas/goal_operation.schema.json +76 -0
  187. package/dist/schemas/index.json +7 -1
  188. package/dist/schemas/industry_pack_operation.output.json +172 -27
  189. package/dist/schemas/industry_pack_operation.schema.json +19 -0
  190. package/dist/schemas/keeper_operation.output.json +1274 -0
  191. package/dist/schemas/keeper_operation.schema.json +359 -0
  192. package/dist/schemas/messenger_operation.schema.json +8 -0
  193. package/dist/schemas/onchain_events.output.json +1 -1
  194. package/dist/schemas/onchain_operations.schema.json +41 -41
  195. package/dist/schemas/onchain_operations_allocation.schema.json +4 -4
  196. package/dist/schemas/onchain_operations_arbitration.schema.json +3 -3
  197. package/dist/schemas/onchain_operations_contact.schema.json +2 -2
  198. package/dist/schemas/onchain_operations_demand.schema.json +2 -2
  199. package/dist/schemas/onchain_operations_machine.schema.json +2 -2
  200. package/dist/schemas/onchain_operations_order.schema.json +2 -2
  201. package/dist/schemas/onchain_operations_payment.schema.json +1 -1
  202. package/dist/schemas/onchain_operations_permission.schema.json +2 -2
  203. package/dist/schemas/onchain_operations_progress.schema.json +2 -2
  204. package/dist/schemas/onchain_operations_repository.schema.json +2 -2
  205. package/dist/schemas/onchain_operations_reward.schema.json +6 -6
  206. package/dist/schemas/onchain_operations_service.schema.json +7 -7
  207. package/dist/schemas/onchain_operations_treasury.schema.json +6 -6
  208. package/dist/schemas/onchain_table_data.output.json +71 -0
  209. package/dist/schemas/query_toolkit.output.json +485 -7
  210. package/dist/schemas/query_toolkit.schema.json +71 -0
  211. package/dist/schemas/schema_query.output.json +1 -64
  212. package/dist/schemas/schema_query.schema.json +18 -3
  213. package/dist/schemas/watch_operation.output.json +21 -1
  214. package/dist/task/ProcessStore.d.ts +18 -1
  215. package/dist/task/ProcessStore.js +1 -1
  216. package/dist/task/playbook.js +1 -1
  217. package/dist/task/types.d.ts +24 -0
  218. package/dist/tools/handlers/bridge.js +1 -1
  219. package/dist/tools/handlers/config.js +1 -1
  220. package/dist/tools/handlers/employee.d.ts +6 -0
  221. package/dist/tools/handlers/employee.js +1 -1
  222. package/dist/tools/handlers/employee.spec.d.ts +1 -0
  223. package/dist/tools/handlers/employee.spec.js +1 -0
  224. package/dist/tools/handlers/evaluation.js +1 -1
  225. package/dist/tools/handlers/evaluation.spec.d.ts +1 -0
  226. package/dist/tools/handlers/evaluation.spec.js +1 -0
  227. package/dist/tools/handlers/goal.js +1 -1
  228. package/dist/tools/handlers/industry-pack.js +1 -1
  229. package/dist/tools/handlers/keeper.d.ts +12 -0
  230. package/dist/tools/handlers/keeper.js +1 -0
  231. package/dist/tools/handlers/local.d.ts +4 -3
  232. package/dist/tools/handlers/local.js +1 -1
  233. package/dist/tools/handlers/messenger.js +1 -1
  234. package/dist/tools/handlers/onchain.js +1 -1
  235. package/dist/tools/handlers/permission.js +1 -1
  236. package/dist/tools/handlers/query.js +1 -1
  237. package/dist/tools/handlers/schema-query.js +1 -1
  238. package/dist/tools/handlers/watch.js +1 -1
  239. package/dist/tools/handlers/workflow.js +1 -1
  240. package/dist/tools/index.js +1 -1
  241. package/dist/tools/registry/agent.d.ts +2 -0
  242. package/dist/tools/registry/agent.js +1 -0
  243. package/dist/tools/registry/bridge.d.ts +2 -0
  244. package/dist/tools/registry/bridge.js +1 -0
  245. package/dist/tools/registry/business.d.ts +2 -0
  246. package/dist/tools/registry/business.js +1 -0
  247. package/dist/tools/registry/config.d.ts +2 -0
  248. package/dist/tools/registry/config.js +1 -0
  249. package/dist/tools/registry/files.d.ts +2 -0
  250. package/dist/tools/registry/files.js +1 -0
  251. package/dist/tools/registry/identity.d.ts +2 -0
  252. package/dist/tools/registry/identity.js +1 -0
  253. package/dist/tools/registry/local.d.ts +2 -0
  254. package/dist/tools/registry/local.js +1 -0
  255. package/dist/tools/registry/messenger.d.ts +2 -0
  256. package/dist/tools/registry/messenger.js +1 -0
  257. package/dist/tools/registry/monitor.d.ts +2 -0
  258. package/dist/tools/registry/monitor.js +1 -0
  259. package/dist/tools/registry/onchain.d.ts +2 -0
  260. package/dist/tools/registry/onchain.js +1 -0
  261. package/dist/tools/registry/query.d.ts +2 -0
  262. package/dist/tools/registry/query.js +1 -0
  263. package/dist/tools/registry/trust.d.ts +2 -0
  264. package/dist/tools/registry/trust.js +1 -0
  265. package/dist/tools/rules-hook.d.ts +1 -0
  266. package/dist/tools/rules-hook.js +1 -1
  267. package/dist/tools/shared.js +1 -1
  268. package/dist/tools/wrap.js +1 -1
  269. package/package.json +2 -2
  270. package/dist/examples/arbitration-dispute-create.json +0 -41
  271. package/dist/examples/arbitration-vote-weighted.json +0 -35
  272. package/dist/examples/arbitration-voting-guard-add.json +0 -38
  273. package/dist/examples/demand-present-service.json +0 -33
  274. package/dist/examples/education-contact-create.json +0 -40
  275. package/dist/examples/freelance-contact-create.json +0 -40
  276. package/dist/examples/gen-passport-verify-guard.json +0 -48
  277. package/dist/examples/guard-template-balance-check.json +0 -59
  278. package/dist/examples/guard-template-time-lock.json +0 -60
  279. package/dist/examples/insurance-guard-claim-timelock.json +0 -75
  280. package/dist/examples/insurance-guard-withdraw-allocation.json +0 -96
  281. package/dist/examples/insurance-machine-create.json +0 -75
  282. package/dist/examples/insurance-service-allocators.json +0 -55
  283. package/dist/examples/machine-multisig-threshold.json +0 -87
  284. package/dist/examples/machine-publish.json +0 -30
  285. package/dist/examples/machine-template-7node-rental.json +0 -119
  286. package/dist/examples/payment-scenario-bound.json +0 -45
  287. package/dist/examples/rental-ziroom-machine-create.json +0 -148
  288. package/dist/examples/rental-ziroom-permission-create.json +0 -41
  289. package/dist/examples/rental-ziroom-service-create.json +0 -36
  290. package/dist/examples/retail-adv-guard-customer-win-create.json +0 -80
  291. package/dist/examples/retail-adv-guard-messenger-proof-create.json +0 -65
  292. package/dist/examples/retail-adv-guard-reward-timeout-create.json +0 -92
  293. package/dist/examples/retail-adv-reward-guard-add.json +0 -51
  294. package/dist/examples/retail-myshop-allocation-activate.json +0 -55
  295. package/dist/examples/retail-myshop-arbitration-create.json +0 -40
  296. package/dist/examples/retail-myshop-contact-create.json +0 -43
  297. package/dist/examples/retail-myshop-order-create.json +0 -56
  298. package/dist/examples/retail-myshop-progress-operate.json +0 -38
  299. package/dist/examples/retail-myshop-reward-create.json +0 -35
  300. package/dist/examples/retail-myshop-service-create.json +0 -38
  301. package/dist/examples/retail-myshop-service-customer-required.json +0 -31
  302. package/dist/examples/service-discount-issue.json +0 -46
  303. package/dist/examples/subscription-contact-create.json +0 -40
  304. package/dist/examples/threebody-guard-create.json +0 -56
  305. package/dist/examples/threebody-machine-create.json +0 -71
  306. package/dist/examples/threebody-permission-create.json +0 -38
  307. package/dist/examples/threebody-service-allocators.json +0 -48
  308. package/dist/examples/travel-guard-time-lock.json +0 -69
  309. package/dist/examples/travel-guard-weather-oracle.json +0 -70
  310. package/dist/examples/travel-machine-create.json +0 -135
  311. package/dist/examples/travel-repository-create.json +0 -47
  312. package/dist/examples/travel-service-create.json +0 -34
  313. package/dist/examples/travel-treasury-create.json +0 -34
  314. package/dist/examples/treasury-deposit.json +0 -37
  315. package/dist/examples/treasury-withdraw.json +0 -38
  316. package/dist/harness/plan.d.ts +0 -33
  317. package/dist/harness/plan.js +0 -1
  318. package/dist/knowledge/demand-matching.d.ts +0 -29
  319. package/dist/knowledge/demand-matching.js +0 -1
  320. package/dist/knowledge/guard-context.d.ts +0 -56
  321. package/dist/knowledge/guard-context.js +0 -1
  322. package/dist/knowledge/guard-migration.d.ts +0 -48
  323. package/dist/knowledge/guard-migration.js +0 -1
  324. package/dist/mode-market/index.d.ts +0 -3
  325. package/dist/mode-market/index.js +0 -1
  326. package/dist/mode-market/registry.d.ts +0 -53
  327. package/dist/mode-market/registry.js +0 -1
  328. package/dist/mode-market/review.d.ts +0 -27
  329. package/dist/mode-market/review.js +0 -1
  330. package/dist/mode-market/submission.d.ts +0 -25
  331. package/dist/mode-market/submission.js +0 -1
  332. package/dist/schemas/guard-node-schema.json +0 -1000
  333. package/dist/task/stage-gate.d.ts +0 -22
  334. package/dist/task/stage-gate.js +0 -1
@@ -1193,6 +1193,69 @@
1193
1193
  "additionalProperties": false,
1194
1194
  "description": "In-flight order participation analysis for ONE account (GLM6/94): customer / operator / observer perspective derived from on-chain permission matching (never caller-asserted) — per-order operable forwards (branch choices), waiting_on roles, pending claims (reward/discount/compensation/rating), perspective-specific interest hints, aggregated account dashboard. Read-only."
1195
1195
  },
1196
+ {
1197
+ "type": "object",
1198
+ "properties": {
1199
+ "query_type": {
1200
+ "type": "string",
1201
+ "const": "relationship_profile"
1202
+ },
1203
+ "radar_account": {
1204
+ "description": "Anchor account to analyze — address (0x...) or LocalMark name. Required when query_type='relationship_profile'. ANY distributed account works (not only local accounts): the anchor is just an address; all relationships derive from on-chain power carriers.",
1205
+ "type": "string"
1206
+ },
1207
+ "relation_kinds": {
1208
+ "description": "Filter to specific relationship kinds (default: all). employment = merchant × staff (principal-agent); process_operation = machine node operators; agency = order owner × agents; transaction = customer × merchant; supply = demander × presenters; arbitration_delegation = service owner × arbitrators; dispute_resolution = arbitrator × disputants; value_distribution = payer × allocation recipients; contact_membership = communication channel members.",
1209
+ "type": "array",
1210
+ "items": {
1211
+ "type": "string",
1212
+ "enum": [
1213
+ "employment",
1214
+ "process_operation",
1215
+ "agency",
1216
+ "transaction",
1217
+ "supply",
1218
+ "arbitration_delegation",
1219
+ "dispute_resolution",
1220
+ "value_distribution",
1221
+ "contact_membership"
1222
+ ]
1223
+ }
1224
+ },
1225
+ "context_network": {
1226
+ "type": "string",
1227
+ "enum": [
1228
+ "testnet",
1229
+ "mainnet",
1230
+ "localnet"
1231
+ ],
1232
+ "description": "Network for the query. Defaults to 'testnet' if omitted. 'localnet' is for internal test use against a local fullnode."
1233
+ }
1234
+ },
1235
+ "required": [
1236
+ "query_type"
1237
+ ],
1238
+ "additionalProperties": false,
1239
+ "description": "Business Relationship Graph (K3/19): derive ONE account's full relationship web from on-chain power carriers (Permission memberships, Machine forwards, Orders, Demand presenters, Allocation sharing, Arbitration bindings, Contact ims). Each edge carries the three dimensions — 权属 power (what each side CAN do, and where that power lives on-chain), 利益 interest (gains/exposures, with registry-declared goal tensions like principal-agent divergence), and 价值交互 value flows (escrow → allocation → payment chains). Read-only; roles are DERIVED from chain data, never asserted."
1240
+ },
1241
+ {
1242
+ "type": "object",
1243
+ "properties": {
1244
+ "query_type": {
1245
+ "type": "string",
1246
+ "const": "scenario_topology"
1247
+ },
1248
+ "chain_id": {
1249
+ "description": "Optional scenario-chain id (chain.standard_ecommerce | chain.procurement_tender | chain.data_subscription | chain.collaborative_operations). When given, only that chain is returned; otherwise ALL scenario chains + bridges are returned.",
1250
+ "type": "string"
1251
+ }
1252
+ },
1253
+ "required": [
1254
+ "query_type"
1255
+ ],
1256
+ "additionalProperties": false,
1257
+ "description": "Scenario Topology knowledge (K3 03 §3.5 / Part 2): the STATIC registry of how WoWok objects INTEGRATE each other. Bridges weld object pairs into a capability that belongs to no single object (e.g. Demand.present(service) grants MATCHMAKING); chains compose bridges into whole applications (e.g. standard e-commerce, procurement tender). Pure knowledge, read-only — no on-chain reads. Use to explain HOW a business scenario is assembled from on-chain objects and why the integration (not the objects themselves) yields the capability."
1258
+ },
1196
1259
  {
1197
1260
  "type": "object",
1198
1261
  "properties": {
@@ -1216,6 +1279,10 @@
1216
1279
  "account": {
1217
1280
  "description": "Scope the aggregation to ONE account address (the client's current account). Omit to aggregate across ALL local accounts.",
1218
1281
  "type": "string"
1282
+ },
1283
+ "light": {
1284
+ "description": "Set to true for the fast first-paint phase: rows carry address / type / name / time only, skipping the per-object enrichment (dead-object probe, registrar votes, per-family extras). Used for progressive list loading; the client merges the full result afterwards.",
1285
+ "type": "boolean"
1219
1286
  }
1220
1287
  },
1221
1288
  "required": [
@@ -1247,6 +1314,10 @@
1247
1314
  "account": {
1248
1315
  "description": "Scope to ONE account address (the client's current account). Omit to merge across ALL local accounts.",
1249
1316
  "type": "string"
1317
+ },
1318
+ "light": {
1319
+ "description": "Set to true for the fast first-paint phase: rows carry address / type only (vote_kinds is empty until the full result), skipping the per-target registrar-vote reads + object enrichment. Used for progressive list loading; the client merges the full result afterwards.",
1320
+ "type": "boolean"
1250
1321
  }
1251
1322
  },
1252
1323
  "required": [
@@ -40,69 +40,6 @@
40
40
  },
41
41
  "description": "List of schema summaries (list/search/list_operations)."
42
42
  },
43
- {
44
- "type": "array",
45
- "items": {
46
- "type": "object",
47
- "properties": {
48
- "file": {
49
- "type": "string",
50
- "description": "Example file name (e.g. 'rental-ziroom-service-create.json')."
51
- },
52
- "title": {
53
- "type": "string",
54
- "description": "Human-readable title from the example metadata."
55
- },
56
- "description": {
57
- "type": "string",
58
- "description": "Longer description from the example metadata."
59
- },
60
- "tags": {
61
- "type": "array",
62
- "items": {
63
- "type": "string"
64
- },
65
- "description": "Tags from the example metadata."
66
- },
67
- "industry": {
68
- "type": "string",
69
- "description": "Industry category (e.g. 'rental', 'retail', 'general')."
70
- },
71
- "operation_type": {
72
- "type": "string",
73
- "description": "Operation type (e.g. 'service', 'machine', 'guard', 'permission')."
74
- },
75
- "verified": {
76
- "type": "boolean",
77
- "description": "Whether the example is marked as verified."
78
- },
79
- "score": {
80
- "type": "number",
81
- "description": "Relevance score — number of fields that matched the query (0-5)."
82
- },
83
- "matched_fields": {
84
- "type": "array",
85
- "items": {
86
- "type": "string"
87
- },
88
- "description": "List of fields that matched the query."
89
- }
90
- },
91
- "required": [
92
- "file",
93
- "title",
94
- "description",
95
- "tags",
96
- "industry",
97
- "operation_type",
98
- "verified",
99
- "score",
100
- "matched_fields"
101
- ],
102
- "additionalProperties": false
103
- },
104
- "description": "List of matching examples (search_examples)."
105
- },
106
43
  {
107
44
  "type": "object",
108
45
  "propertyNames": {
@@ -116,7 +53,7 @@
116
53
  "description": "No data — lookup failed or returned nothing, or data was written to output_file."
117
54
  }
118
55
  ],
119
- "description": "Response data — array of schema summaries for list-like actions, array of example results for search_examples, JSON Schema object for get/get_output/get_field, Guard template data for get_guard_templates, null on failure or when output_file is used."
56
+ "description": "Response data — array of schema summaries for list-like actions, JSON Schema object for get/get_output/get_field, Guard template data for get_guard_templates, null on failure or when output_file is used."
120
57
  },
121
58
  "message": {
122
59
  "type": "string",
@@ -15,13 +15,13 @@
15
15
  "list_operations",
16
16
  "get_guard_templates",
17
17
  "get_field",
18
- "search_examples",
19
18
  "get_tool_reference",
20
19
  "get_guard_design_patterns",
21
20
  "get_safety_rules",
22
- "get_templates"
21
+ "get_templates",
22
+ "analyze_guard_semantics"
23
23
  ],
24
- "description": "Action to perform: 'list' (all schemas), 'get' (specific input schema), 'get_output' (tool output schema), 'get_field' (field-path query e.g. field_path='data.node'), 'search' (by keyword), 'list_operations' (on-chain operations), 'get_guard_templates' (Guard creation templates + best practices), 'search_examples' (search verified example files by keyword — matches title, description, tags, operation_type, industry), 'get_tool_reference' (MCP tool usage reference: summaries, actions, prerequisites, notes — sunk from wowok-tools skill), 'get_guard_design_patterns' (curated Guard design pattern catalog: business requirement → logic tree template — sunk from wowok-guard skill), 'get_safety_rules' (object reuse/immutability/operation-classification/naming rules — sunk from wowok-safety skill), 'get_templates' (unified template registry: ~90 parameterized templates across 11 object types — guard/machine/service/order/progress/arbitration/treasury/permission/passport/allocation/reward; omit 'template' to list metadata, provide 'template' for full detail, provide 'template' + 'params' to instantiate into executable JSON)."
24
+ "description": "Action to perform: 'list' (all schemas), 'get' (specific input schema), 'get_output' (tool output schema), 'get_field' (field-path query e.g. field_path='data.node'), 'search' (by keyword), 'list_operations' (on-chain operations), 'get_guard_templates' (Guard creation templates + best practices), 'get_tool_reference' (MCP tool usage reference: summaries, actions, prerequisites, notes — sunk from wowok-tools skill), 'get_guard_design_patterns' (curated Guard design pattern catalog: business requirement → logic tree template — sunk from wowok-guard skill), 'get_safety_rules' (object reuse/immutability/operation-classification/naming rules — sunk from wowok-safety skill), 'get_templates' (unified template registry: ~90 parameterized templates across 11 object types — guard/machine/service/order/progress/arbitration/treasury/permission/passport/allocation/reward; omit 'template' to list metadata, provide 'template' for full detail, provide 'template' + 'params' to instantiate into executable JSON), 'analyze_guard_semantics' (parse + evaluate any Guard JSON: rendered logic tree, lint diagnostics, risk assessment, and a party-perspective reading — who can trigger, under what conditions, with what evidence. Both transacting parties should run this BEFORE relying on a Guard)."
25
25
  },
26
26
  "name": {
27
27
  "description": "Schema/tool name for 'get'/'get_output'/'get_field'/'get_tool_reference' action (e.g., 'onchain_operations', 'onchain_operations_machine'), or pattern id for 'get_guard_design_patterns' (e.g., 'pattern.identity_check_allowlist').",
@@ -63,6 +63,21 @@
63
63
  "output_file": {
64
64
  "description": "When set, writes the response data to this file path (relative to cwd) and returns the path instead of inline data. Use for large schemas that would be truncated. Prefer workspace paths like '.trae/tmp/schema.json' so the Read tool can access them.",
65
65
  "type": "string"
66
+ },
67
+ "guard": {
68
+ "description": "Guard JSON for 'analyze_guard_semantics' action (object or JSON-encoded string). Shape: {description?, table: [{identifier, b_submission?, value_type?, value?, name?, object_type?}], root: {...}, rely?: {guards, logic_or?}, binding_hint?: {host_object?, binding_field?, action?, sharing_recipients?}}. This is the export format of guard2file / the 'data' payload of onchain_operations guard creation.",
69
+ "anyOf": [
70
+ {
71
+ "type": "string"
72
+ },
73
+ {
74
+ "type": "object",
75
+ "propertyNames": {
76
+ "type": "string"
77
+ },
78
+ "additionalProperties": {}
79
+ }
80
+ ]
66
81
  }
67
82
  },
68
83
  "required": [
@@ -598,6 +598,25 @@
598
598
  "sensitivity": {
599
599
  "type": "number",
600
600
  "description": "Risk sensitivity (1.0 neutral; >1 more risk-averse)."
601
+ },
602
+ "value_proposition": {
603
+ "type": "object",
604
+ "properties": {
605
+ "offers": {
606
+ "type": "string",
607
+ "description": "What this role contributes / provides into the transaction."
608
+ },
609
+ "seeks": {
610
+ "type": "string",
611
+ "description": "What this role wants / gets out of the transaction."
612
+ }
613
+ },
614
+ "required": [
615
+ "offers",
616
+ "seeks"
617
+ ],
618
+ "additionalProperties": false,
619
+ "description": "Value proposition — what the role offers and seeks (K3 27 G6)."
601
620
  }
602
621
  },
603
622
  "required": [
@@ -605,7 +624,8 @@
605
624
  "interest_analyzer",
606
625
  "prefer",
607
626
  "avoid",
608
- "sensitivity"
627
+ "sensitivity",
628
+ "value_proposition"
609
629
  ],
610
630
  "additionalProperties": false
611
631
  },
@@ -1,4 +1,4 @@
1
- import { type DecisionRecord, type FeedbackRecord, type ProblemRecord, type ProcessEvent, type ProcessManifest, type ProcessStageState, type SubstepRecord, type StageMeta } from "./types.js";
1
+ import { type DecisionRecord, type FeedbackRecord, type ProblemRecord, type ProcessEvent, type ProcessManifest, type ProcessStageState, type SubstepRecord, type SuggestionRecord, type StageMeta } from "./types.js";
2
2
  export declare function processesRootDir(): string;
3
3
  export declare function processDir(id: string): string;
4
4
  export declare function deleteProcessDir(dir: string): void;
@@ -32,6 +32,22 @@ export declare function updateProblem(dir: string, id: string, patch: Partial<Pi
32
32
  export declare function listProblems(dir: string, filter?: {
33
33
  status?: ProblemRecord["status"];
34
34
  }): ProblemRecord[];
35
+ export declare function addSuggestion(dir: string, input: {
36
+ object?: string;
37
+ kind: SuggestionRecord["kind"];
38
+ stage?: string;
39
+ objects?: {
40
+ type: string;
41
+ object: string;
42
+ }[];
43
+ title: string;
44
+ detail?: string;
45
+ origin?: SuggestionRecord["origin"];
46
+ }): SuggestionRecord;
47
+ export declare function updateSuggestion(dir: string, id: string, patch: Partial<Pick<SuggestionRecord, "status" | "resolution_note" | "applied" | "stage" | "object">>): SuggestionRecord;
48
+ export declare function listSuggestions(dir: string, filter?: {
49
+ status?: SuggestionRecord["status"];
50
+ }): SuggestionRecord[];
35
51
  export declare function addFeedback(dir: string, input: {
36
52
  source: FeedbackRecord["source"];
37
53
  sentiment: FeedbackRecord["sentiment"];
@@ -58,6 +74,7 @@ export interface ProcessBundle {
58
74
  stage?: ProcessStageState;
59
75
  events: ProcessEvent[];
60
76
  problems: ProblemRecord[];
77
+ suggestions: SuggestionRecord[];
61
78
  feedback: FeedbackRecord[];
62
79
  decisions: DecisionRecord[];
63
80
  substeps: Record<string, SubstepRecord[]>;
@@ -1 +1 @@
1
- import{appendFileSync,copyFileSync,existsSync,mkdirSync,readFileSync,readdirSync,rmSync,statSync,writeFileSync}from'fs';import{basename,dirname,join,relative,sep}from'path';import{getWowMcpDir}from'@wowok/wowok';import{PROCESS_SCHEMA_VERSION}from'./types.js';export function processesRootDir(){return join(getWowMcpDir(),'processes');}export function processDir(a){return join(processesRootDir(),a);}export function deleteProcessDir(a){rmSync(a,{'recursive':!![],'force':!![]});}function manifestPath(a){return join(a,'manifest.json');}function stageStatePath(a){return join(a,'stage.json');}function eventsPath(a){return join(a,'events.jsonl');}function problemsPath(a){return join(a,'problems.jsonl');}function feedbackPath(a){return join(a,'feedback.jsonl');}function decisionsPath(a){return join(a,'decisions.jsonl');}function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function substepsPath(a,b){return join(a,'substeps-'+netKey(b)+'.jsonl');}function relKey(a,b){return relative(a,b)['split'](sep)['join']('/');}function zeroStageMeta(){return{'committed':![],'gate_passed':![],'blocking_issues':[],'completion':0x0};}function newRecordId(a){return a+'_'+Date['now']()['toString'](0x24)+'_'+Math['random']()['toString'](0x24)['slice'](0x2,0x8);}export function initProcess(a,b,c){if(c['length']===0x0)throw new Error('initProcess\x20requires\x20a\x20non-empty\x20stage\x20sequence');mkdirSync(a,{'recursive':!![]}),writeFileSync(manifestPath(a),JSON['stringify'](b,null,0x2),'utf-8');const d={};for(const e of c)d[e]=zeroStageMeta();return saveStageState(a,{'stages':[...c],'current_stage':c[0x0],'stage_meta':d,'updated_at':Date['now']()}),appendEvent(a,{'timestamp':b['created_at'],'event':'process_init','stage':c[0x0],'reason':'process\x20initialized\x20(playbook:\x20'+b['playbook']+')','data':{'playbook':b['playbook'],'stages':[...c]}}),b;}export function loadManifest(a){const b=manifestPath(a);if(!existsSync(b))throw new Error('process\x20not\x20initialized:\x20'+a+'\x20(missing\x20manifest.json)');return JSON['parse'](readFileSync(b,'utf-8'));}export function saveManifest(a,b){b['updated_at']=new Date()['toISOString'](),writeFileSync(manifestPath(a),JSON['stringify'](b,null,0x2),'utf-8');}export function loadStageState(a){const b=stageStatePath(a);if(!existsSync(b))return undefined;return JSON['parse'](readFileSync(b,'utf-8'));}export function saveStageState(a,b){b['updated_at']=Date['now'](),mkdirSync(a,{'recursive':!![]}),writeFileSync(stageStatePath(a),JSON['stringify'](b,null,0x2),'utf-8');}export function advanceStage(a,b,c={}){const d=loadStageState(a);if(!d)throw new Error('process\x20not\x20initialized:\x20'+a+'\x20(missing\x20stage.json)');const e=d['stages']['indexOf'](b);if(e<0x0)throw new Error('unknown\x20stage\x20\x27'+b+'\x27\x20(stages:\x20'+d['stages']['join']('\x20→\x20')+')');const f=d['stages']['indexOf'](d['current_stage']);if(b===d['current_stage'])return d;if(e<f)throw new Error('invalid\x20stage\x20transition:\x20'+d['current_stage']+'\x20→\x20'+b+'\x20(forward-only)');if(e>f+0x1&&!c['allowSkip'])throw new Error('invalid\x20stage\x20transition:\x20'+d['current_stage']+'\x20→\x20'+b+'\x20(skips\x20'+d['stages'][f+0x1]+';\x20pass\x20allowSkip\x20to\x20jump)');const g=d['current_stage'],h=d['stage_meta'][g]??zeroStageMeta();return d['stage_meta'][g]={...h,'committed':!![],'committed_at':h['committed_at']??Date['now'](),'completion':h['committed']?h['completion']:0x64},d['current_stage']=b,saveStageState(a,d),appendEvent(a,{'timestamp':new Date()['toISOString'](),'event':'stage_commit','stage':g,'reason':'stage\x20\x27'+g+'\x27\x20committed;\x20advanced\x20to\x20\x27'+b+'\x27','data':{'from':g,'to':b}}),d;}export function updateStageMeta(a,b,c){const d=loadStageState(a);if(!d)throw new Error('process\x20not\x20initialized:\x20'+a+'\x20(missing\x20stage.json)');if(!d['stages']['includes'](b))throw new Error('unknown\x20stage\x20\x27'+b+'\x27\x20(stages:\x20'+d['stages']['join']('\x20→\x20')+')');const e={...d['stage_meta'][b]??zeroStageMeta(),...c};return d['stage_meta'][b]=e,saveStageState(a,d),e;}export function appendEvent(a,b){mkdirSync(a,{'recursive':!![]}),appendFileSync(eventsPath(a),JSON['stringify'](b)+'\x0a','utf-8');}export function readEvents(a){return readJsonl(eventsPath(a));}function readJsonl(a){if(!existsSync(a))return[];return readFileSync(a,'utf-8')['split']('\x0a')['filter'](b=>b['trim']()['length']>0x0)['map'](b=>JSON['parse'](b));}function appendJsonlRecord(a,b){mkdirSync(dirname(a),{'recursive':!![]}),appendFileSync(a,JSON['stringify'](b)+'\x0a','utf-8');}function foldLatest(a){const b=new Map();for(const c of a)b['set'](c['id'],c);return[...b['values']()];}export function addProblem(a,b){const c={'id':newRecordId('prob'),'created_at':new Date()['toISOString'](),...b['stage']?{'stage':b['stage']}:{},...b['object']?{'object':b['object']}:{},'severity':b['severity'],'status':'open','title':b['title'],...b['detail']?{'detail':b['detail']}:{},'notes':b['note']?[{'at':new Date()['toISOString'](),'by':b['note']['by'],'text':b['note']['text']}]:[],...b['origin']?{'origin':b['origin']}:{}};return appendJsonlRecord(problemsPath(a),c),c;}export function updateProblem(a,b,c,d){const e=foldLatest(readJsonl(problemsPath(a)))['find'](g=>g['id']===b);if(!e)throw new Error('problem\x20not\x20found:\x20'+b);const f={...e,...Object['fromEntries'](Object['entries'](c)['filter'](([,g])=>g!==undefined)),'notes':d?[...e['notes'],{'at':new Date()['toISOString'](),'by':d['by'],'text':d['text']}]:e['notes']};return appendJsonlRecord(problemsPath(a),f),f;}export function listProblems(a,b={}){const c=foldLatest(readJsonl(problemsPath(a)));return b['status']?c['filter'](d=>d['status']===b['status']):c;}export function addFeedback(a,b){const c={'id':newRecordId('fb'),'at':new Date()['toISOString'](),'source':b['source'],'sentiment':b['sentiment'],'comment':b['comment'],...b['refs']?{'refs':b['refs']}:{}};return appendJsonlRecord(feedbackPath(a),c),c;}export function listFeedback(a){return readJsonl(feedbackPath(a));}export function addDecision(a,b){const c={'id':newRecordId('dec'),'at':new Date()['toISOString'](),...b['stage']?{'stage':b['stage']}:{},'by':b['by'],'decision':b['decision'],...b['rationale']?{'rationale':b['rationale']}:{},'reversible':b['reversible']};return appendJsonlRecord(decisionsPath(a),c),c;}export function listDecisions(a){return readJsonl(decisionsPath(a));}export function appendSubstep(a,b,c){appendJsonlRecord(substepsPath(a,b),c);}export function readSubsteps(a,b){return readJsonl(substepsPath(a,b));}export function savePayload(a,b,c){const d=join(a,b);return mkdirSync(dirname(d),{'recursive':!![]}),writeFileSync(d,JSON['stringify'](c,null,0x2),'utf-8'),d;}export function loadPayload(a,b){const c=join(a,b);if(!existsSync(c))return undefined;return JSON['parse'](readFileSync(c,'utf-8'));}export function exportBundle(a){const b=loadManifest(a),c={},d={};function e(f){if(!existsSync(f))return;for(const g of readdirSync(f,{'withFileTypes':!![]})){const h=join(f,g['name']);if(g['isDirectory']())e(h);else{if(g['isFile']()){const i=relKey(a,h);if(i==='manifest.json'||i==='stage.json')continue;if(g['name']['endsWith']('.json'))try{c[i]=JSON['parse'](readFileSync(h,'utf-8'));}catch{}else{const j=g['name']['match'](/^substeps-(.+)\.jsonl$/);if(j)d[j[0x1]]=readJsonl(h);}}}}}return e(a),{'schema_version':PROCESS_SCHEMA_VERSION,'exported_at':new Date()['toISOString'](),'manifest':b,'stage':loadStageState(a),'events':readEvents(a),'problems':listProblems(a),'feedback':listFeedback(a),'decisions':listDecisions(a),'substeps':d,'payloads':c};}function remapDeep(a,b,c){if(typeof a==='string'){const d=b[a];if(d!==undefined)return c['n']+=0x1,d;return a;}if(Array['isArray'](a))return a['map'](e=>remapDeep(e,b,c));if(a!==null&&typeof a==='object'){const e={};for(const [f,g]of Object['entries'](a)){e[f]=remapDeep(g,b,c);}return e;}return a;}export function importBundle(a,b,c={}){const g=c['remap']??{},h={'n':0x0};mkdirSync(a,{'recursive':!![]});const i=remapDeep(b['manifest'],g,h);i['updated_at']=new Date()['toISOString'](),writeFileSync(manifestPath(a),JSON['stringify'](i,null,0x2),'utf-8');b['stage']&&writeFileSync(stageStatePath(a),JSON['stringify'](b['stage'],null,0x2),'utf-8');for(const j of b['events'])appendJsonlRecord(eventsPath(a),j);for(const k of b['problems'])appendJsonlRecord(problemsPath(a),k);for(const l of b['feedback'])appendJsonlRecord(feedbackPath(a),l);for(const m of b['decisions'])appendJsonlRecord(decisionsPath(a),m);for(const [n,o]of Object['entries'](b['substeps'])){for(const q of o){appendJsonlRecord(substepsPath(a,n),remapDeep(q,g,h));}}for(const [s,t]of Object['entries'](b['payloads'])){savePayload(a,s,remapDeep(t,g,h));}return appendEvent(a,{'timestamp':new Date()['toISOString'](),'event':'process_imported','reason':'process\x20imported\x20from\x20bundle\x20(exported_at\x20'+b['exported_at']+')','data':{'remapped':h['n']}}),i;}export function forkProcess(a,b){const c=loadManifest(a);mkdirSync(b,{'recursive':!![]});function d(f,g){for(const h of readdirSync(f,{'withFileTypes':!![]})){const i=join(f,h['name']),j=join(g,h['name']);if(h['isDirectory']())mkdirSync(j,{'recursive':!![]}),d(i,j);else h['isFile']()&&copyFileSync(i,j);}}d(a,b);const e={...c,'process_id':basename(b),'forked_from':c['process_id'],'archived':![],'updated_at':new Date()['toISOString']()};return writeFileSync(manifestPath(b),JSON['stringify'](e,null,0x2),'utf-8'),appendEvent(b,{'timestamp':new Date()['toISOString'](),'event':'process_forked','reason':'forked\x20from\x20'+c['process_id']+'\x20('+a+')','data':{'source_dir':a,'source_process':c['process_id']}}),e;}export function listProcesses(a=processesRootDir()){if(!existsSync(a))return[];const b=[];for(const c of readdirSync(a,{'withFileTypes':!![]})){if(!c['isDirectory']())continue;const d=join(a,c['name']);if(!existsSync(manifestPath(d)))continue;const f={'dir_name':c['name'],'path':d,'archived':![],'mtime':0x0};try{f['manifest']=loadManifest(d),f['archived']=f['manifest']['archived'];}catch{}try{const g=loadStageState(d);g&&(f['current_stage']=g['current_stage'],f['stages']=g['stages'],f['committed_stages']=g['stages']['filter'](h=>g['stage_meta'][h]?.['committed']));}catch{}try{f['mtime']=statSync(d)['mtimeMs'];}catch{}b['push'](f);}return b['sort']((h,i)=>i['mtime']-h['mtime']);}
1
+ import{appendFileSync,copyFileSync,existsSync,mkdirSync,readFileSync,readdirSync,rmSync,statSync,writeFileSync}from'fs';import{basename,dirname,join,relative,sep}from'path';import{getWowMcpDir}from'@wowok/wowok';import{PROCESS_SCHEMA_VERSION}from'./types.js';export function processesRootDir(){return join(getWowMcpDir(),'processes');}export function processDir(a){return join(processesRootDir(),a);}export function deleteProcessDir(a){rmSync(a,{'recursive':!![],'force':!![]});}function manifestPath(a){return join(a,'manifest.json');}function stageStatePath(a){return join(a,'stage.json');}function eventsPath(a){return join(a,'events.jsonl');}function problemsPath(a){return join(a,'problems.jsonl');}function suggestionsPath(a){return join(a,'suggestions.jsonl');}function feedbackPath(a){return join(a,'feedback.jsonl');}function decisionsPath(a){return join(a,'decisions.jsonl');}function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function substepsPath(a,b){return join(a,'substeps-'+netKey(b)+'.jsonl');}function relKey(a,b){return relative(a,b)['split'](sep)['join']('/');}function zeroStageMeta(){return{'committed':![],'gate_passed':![],'blocking_issues':[],'completion':0x0};}function newRecordId(a){return a+'_'+Date['now']()['toString'](0x24)+'_'+Math['random']()['toString'](0x24)['slice'](0x2,0x8);}export function initProcess(a,b,c){if(c['length']===0x0)throw new Error('initProcess\x20requires\x20a\x20non-empty\x20stage\x20sequence');mkdirSync(a,{'recursive':!![]}),writeFileSync(manifestPath(a),JSON['stringify'](b,null,0x2),'utf-8');const d={};for(const e of c)d[e]=zeroStageMeta();return saveStageState(a,{'stages':[...c],'current_stage':c[0x0],'stage_meta':d,'updated_at':Date['now']()}),appendEvent(a,{'timestamp':b['created_at'],'event':'process_init','stage':c[0x0],'reason':'process\x20initialized\x20(playbook:\x20'+b['playbook']+')','data':{'playbook':b['playbook'],'stages':[...c]}}),b;}export function loadManifest(a){const b=manifestPath(a);if(!existsSync(b))throw new Error('process\x20not\x20initialized:\x20'+a+'\x20(missing\x20manifest.json)');return JSON['parse'](readFileSync(b,'utf-8'));}export function saveManifest(a,b){b['updated_at']=new Date()['toISOString'](),writeFileSync(manifestPath(a),JSON['stringify'](b,null,0x2),'utf-8');}export function loadStageState(a){const b=stageStatePath(a);if(!existsSync(b))return undefined;return JSON['parse'](readFileSync(b,'utf-8'));}export function saveStageState(a,b){b['updated_at']=Date['now'](),mkdirSync(a,{'recursive':!![]}),writeFileSync(stageStatePath(a),JSON['stringify'](b,null,0x2),'utf-8');}export function advanceStage(a,b,c={}){const d=loadStageState(a);if(!d)throw new Error('process\x20not\x20initialized:\x20'+a+'\x20(missing\x20stage.json)');const e=d['stages']['indexOf'](b);if(e<0x0)throw new Error('unknown\x20stage\x20\x27'+b+'\x27\x20(stages:\x20'+d['stages']['join']('\x20→\x20')+')');const f=d['stages']['indexOf'](d['current_stage']);if(b===d['current_stage'])return d;if(e<f)throw new Error('invalid\x20stage\x20transition:\x20'+d['current_stage']+'\x20→\x20'+b+'\x20(forward-only)');if(e>f+0x1&&!c['allowSkip'])throw new Error('invalid\x20stage\x20transition:\x20'+d['current_stage']+'\x20→\x20'+b+'\x20(skips\x20'+d['stages'][f+0x1]+';\x20pass\x20allowSkip\x20to\x20jump)');const g=d['current_stage'],h=d['stage_meta'][g]??zeroStageMeta();return d['stage_meta'][g]={...h,'committed':!![],'committed_at':h['committed_at']??Date['now'](),'completion':h['committed']?h['completion']:0x64},d['current_stage']=b,saveStageState(a,d),appendEvent(a,{'timestamp':new Date()['toISOString'](),'event':'stage_commit','stage':g,'reason':'stage\x20\x27'+g+'\x27\x20committed;\x20advanced\x20to\x20\x27'+b+'\x27','data':{'from':g,'to':b}}),d;}export function updateStageMeta(a,b,c){const d=loadStageState(a);if(!d)throw new Error('process\x20not\x20initialized:\x20'+a+'\x20(missing\x20stage.json)');if(!d['stages']['includes'](b))throw new Error('unknown\x20stage\x20\x27'+b+'\x27\x20(stages:\x20'+d['stages']['join']('\x20→\x20')+')');const e={...d['stage_meta'][b]??zeroStageMeta(),...c};return d['stage_meta'][b]=e,saveStageState(a,d),e;}export function appendEvent(a,b){mkdirSync(a,{'recursive':!![]}),appendFileSync(eventsPath(a),JSON['stringify'](b)+'\x0a','utf-8');}export function readEvents(a){return readJsonl(eventsPath(a));}function readJsonl(a){if(!existsSync(a))return[];return readFileSync(a,'utf-8')['split']('\x0a')['filter'](b=>b['trim']()['length']>0x0)['map'](b=>JSON['parse'](b));}function appendJsonlRecord(a,b){mkdirSync(dirname(a),{'recursive':!![]}),appendFileSync(a,JSON['stringify'](b)+'\x0a','utf-8');}function foldLatest(a){const b=new Map();for(const c of a)b['set'](c['id'],c);return[...b['values']()];}export function addProblem(a,b){const c={'id':newRecordId('prob'),'created_at':new Date()['toISOString'](),...b['stage']?{'stage':b['stage']}:{},...b['object']?{'object':b['object']}:{},'severity':b['severity'],'status':'open','title':b['title'],...b['detail']?{'detail':b['detail']}:{},'notes':b['note']?[{'at':new Date()['toISOString'](),'by':b['note']['by'],'text':b['note']['text']}]:[],...b['origin']?{'origin':b['origin']}:{}};return appendJsonlRecord(problemsPath(a),c),c;}export function updateProblem(a,b,c,d){const e=foldLatest(readJsonl(problemsPath(a)))['find'](g=>g['id']===b);if(!e)throw new Error('problem\x20not\x20found:\x20'+b);const f={...e,...Object['fromEntries'](Object['entries'](c)['filter'](([,g])=>g!==undefined)),'notes':d?[...e['notes'],{'at':new Date()['toISOString'](),'by':d['by'],'text':d['text']}]:e['notes']};return appendJsonlRecord(problemsPath(a),f),f;}export function listProblems(a,b={}){const c=foldLatest(readJsonl(problemsPath(a)));return b['status']?c['filter'](d=>d['status']===b['status']):c;}export function addSuggestion(a,b){const c={'id':newRecordId('sug'),'created_at':new Date()['toISOString'](),...b['object']?{'object':b['object']}:{},'kind':b['kind'],...b['stage']?{'stage':b['stage']}:{},...b['objects']?{'objects':b['objects']}:{},'title':b['title'],...b['detail']?{'detail':b['detail']}:{},'status':'pending',...b['origin']?{'origin':b['origin']}:{}};return appendJsonlRecord(suggestionsPath(a),c),c;}export function updateSuggestion(a,b,c){const d=foldLatest(readJsonl(suggestionsPath(a)))['find'](f=>f['id']===b);if(!d)throw new Error('suggestion\x20not\x20found:\x20'+b);if(d['status']!=='pending'&&c['status']&&c['status']!==d['status'])throw new Error('suggestion\x20'+b+'\x20already\x20resolved\x20('+d['status']+')');const e={...d,...Object['fromEntries'](Object['entries'](c)['filter'](([,f])=>f!==undefined)),...c['status']&&c['status']!=='pending'?{'resolved_at':new Date()['toISOString']()}:{}};return appendJsonlRecord(suggestionsPath(a),e),e;}export function listSuggestions(a,b={}){const c=foldLatest(readJsonl(suggestionsPath(a)));return b['status']?c['filter'](d=>d['status']===b['status']):c;}export function addFeedback(a,b){const c={'id':newRecordId('fb'),'at':new Date()['toISOString'](),'source':b['source'],'sentiment':b['sentiment'],'comment':b['comment'],...b['refs']?{'refs':b['refs']}:{}};return appendJsonlRecord(feedbackPath(a),c),c;}export function listFeedback(a){return readJsonl(feedbackPath(a));}export function addDecision(a,b){const c={'id':newRecordId('dec'),'at':new Date()['toISOString'](),...b['stage']?{'stage':b['stage']}:{},'by':b['by'],'decision':b['decision'],...b['rationale']?{'rationale':b['rationale']}:{},'reversible':b['reversible']};return appendJsonlRecord(decisionsPath(a),c),c;}export function listDecisions(a){return readJsonl(decisionsPath(a));}export function appendSubstep(a,b,c){appendJsonlRecord(substepsPath(a,b),c);}export function readSubsteps(a,b){return readJsonl(substepsPath(a,b));}export function savePayload(a,b,c){const d=join(a,b);return mkdirSync(dirname(d),{'recursive':!![]}),writeFileSync(d,JSON['stringify'](c,null,0x2),'utf-8'),d;}export function loadPayload(a,b){const c=join(a,b);if(!existsSync(c))return undefined;return JSON['parse'](readFileSync(c,'utf-8'));}export function exportBundle(a){const b=loadManifest(a),c={},d={};function e(f){if(!existsSync(f))return;for(const g of readdirSync(f,{'withFileTypes':!![]})){const h=join(f,g['name']);if(g['isDirectory']())e(h);else{if(g['isFile']()){const i=relKey(a,h);if(i==='manifest.json'||i==='stage.json')continue;if(g['name']['endsWith']('.json'))try{c[i]=JSON['parse'](readFileSync(h,'utf-8'));}catch{}else{const j=g['name']['match'](/^substeps-(.+)\.jsonl$/);if(j)d[j[0x1]]=readJsonl(h);}}}}}return e(a),{'schema_version':PROCESS_SCHEMA_VERSION,'exported_at':new Date()['toISOString'](),'manifest':b,'stage':loadStageState(a),'events':readEvents(a),'problems':listProblems(a),'suggestions':listSuggestions(a),'feedback':listFeedback(a),'decisions':listDecisions(a),'substeps':d,'payloads':c};}function remapDeep(a,b,c){if(typeof a==='string'){const d=b[a];if(d!==undefined)return c['n']+=0x1,d;return a;}if(Array['isArray'](a))return a['map'](e=>remapDeep(e,b,c));if(a!==null&&typeof a==='object'){const e={};for(const [f,g]of Object['entries'](a)){e[f]=remapDeep(g,b,c);}return e;}return a;}export function importBundle(a,b,c={}){const g=c['remap']??{},h={'n':0x0};mkdirSync(a,{'recursive':!![]});const i=remapDeep(b['manifest'],g,h);i['updated_at']=new Date()['toISOString'](),writeFileSync(manifestPath(a),JSON['stringify'](i,null,0x2),'utf-8');b['stage']&&writeFileSync(stageStatePath(a),JSON['stringify'](b['stage'],null,0x2),'utf-8');for(const j of b['events'])appendJsonlRecord(eventsPath(a),j);for(const k of b['problems'])appendJsonlRecord(problemsPath(a),k);for(const l of b['suggestions']??[])appendJsonlRecord(suggestionsPath(a),l);for(const m of b['feedback'])appendJsonlRecord(feedbackPath(a),m);for(const n of b['decisions'])appendJsonlRecord(decisionsPath(a),n);for(const [o,q]of Object['entries'](b['substeps'])){for(const t of q){appendJsonlRecord(substepsPath(a,o),remapDeep(t,g,h));}}for(const [u,v]of Object['entries'](b['payloads'])){savePayload(a,u,remapDeep(v,g,h));}return appendEvent(a,{'timestamp':new Date()['toISOString'](),'event':'process_imported','reason':'process\x20imported\x20from\x20bundle\x20(exported_at\x20'+b['exported_at']+')','data':{'remapped':h['n']}}),i;}export function forkProcess(a,b){const c=loadManifest(a);mkdirSync(b,{'recursive':!![]});function d(f,g){for(const h of readdirSync(f,{'withFileTypes':!![]})){const i=join(f,h['name']),j=join(g,h['name']);if(h['isDirectory']())mkdirSync(j,{'recursive':!![]}),d(i,j);else h['isFile']()&&copyFileSync(i,j);}}d(a,b);const e={...c,'process_id':basename(b),'forked_from':c['process_id'],'archived':![],'updated_at':new Date()['toISOString']()};return writeFileSync(manifestPath(b),JSON['stringify'](e,null,0x2),'utf-8'),appendEvent(b,{'timestamp':new Date()['toISOString'](),'event':'process_forked','reason':'forked\x20from\x20'+c['process_id']+'\x20('+a+')','data':{'source_dir':a,'source_process':c['process_id']}}),e;}export function listProcesses(a=processesRootDir()){if(!existsSync(a))return[];const b=[];for(const c of readdirSync(a,{'withFileTypes':!![]})){if(!c['isDirectory']())continue;const d=join(a,c['name']);if(!existsSync(manifestPath(d)))continue;const f={'dir_name':c['name'],'path':d,'archived':![],'mtime':0x0};try{f['manifest']=loadManifest(d),f['archived']=f['manifest']['archived'];}catch{}try{const g=loadStageState(d);g&&(f['current_stage']=g['current_stage'],f['stages']=g['stages'],f['committed_stages']=g['stages']['filter'](h=>g['stage_meta'][h]?.['committed']));}catch{}try{f['mtime']=statSync(d)['mtimeMs'];}catch{}b['push'](f);}return b['sort']((h,i)=>i['mtime']-h['mtime']);}
@@ -1 +1 @@
1
- const registry=new Map();export function registerPlaybook(a){if(!a['name'])throw new Error('playbook\x20requires\x20a\x20name');if(a['stages']['length']===0x0)throw new Error('playbook\x20\x27'+a['name']+'\x27\x20requires\x20stages');registry['set'](a['name'],{...a,'stages':[...a['stages']]});}export function getPlaybook(a){return registry['get'](a);}export function listPlaybooks(){return[...registry['values']()];}export function hasPlaybook(a){return registry['has'](a);}export const GENERIC_PLAYBOOK='generic';export function playbookForGoalType(a){switch(a){case'publish_service':return registry['get']('service-build');case'fulfill_order':return registry['get']('order-fulfillment');case'capture_demand':return registry['get']('demand-capture');case'publish_demand':return registry['get']('demand-publish');case'purchase_service':return registry['get']('purchase');default:return registry['get'](GENERIC_PLAYBOOK);}}registerPlaybook({'name':GENERIC_PLAYBOOK,'stages':['prepare','execute','verify','close'],'description':'Fallback\x20stage\x20sequence\x20for\x20goals\x20without\x20a\x20dedicated\x20playbook.'}),registerPlaybook({'name':'service-build','stages':['namespace','puzzle','risk','doc','substeps'],'description':'Design\x20&\x20publish\x20a\x20commercial\x20service\x20(content:\x20src/playbooks/service-build/).'}),registerPlaybook({'name':'order-fulfillment','stages':['confirm','deliver','accept','settle'],'description':'Merchant-side\x20order\x20fulfillment.'}),registerPlaybook({'name':'demand-capture','stages':['discover','evaluate','engage','close'],'description':'Discover\x20and\x20capture\x20demand\x20opportunities.'}),registerPlaybook({'name':'demand-publish','stages':['draft','fund','publish','close'],'description':'Publish\x20a\x20funded\x20demand.'}),registerPlaybook({'name':'purchase','stages':['select','order','monitor','review'],'description':'Purchase\x20a\x20service\x20and\x20see\x20it\x20delivered.'});
1
+ const registry=new Map();export function registerPlaybook(a){if(!a['name'])throw new Error('playbook\x20requires\x20a\x20name');if(a['stages']['length']===0x0)throw new Error('playbook\x20\x27'+a['name']+'\x27\x20requires\x20stages');registry['set'](a['name'],{...a,'stages':[...a['stages']]});}export function getPlaybook(a){return registry['get'](a);}export function listPlaybooks(){return[...registry['values']()];}export function hasPlaybook(a){return registry['has'](a);}export const GENERIC_PLAYBOOK='generic';export function playbookForGoalType(a){switch(a){case'publish_service':return registry['get']('service-build');case'fulfill_order':return registry['get']('order-fulfillment');case'capture_demand':return registry['get']('demand-capture');case'publish_demand':return registry['get']('demand-publish');case'purchase_service':return registry['get']('purchase');case'manage_assets':return registry['get']('governance');default:return registry['get'](GENERIC_PLAYBOOK);}}registerPlaybook({'name':GENERIC_PLAYBOOK,'stages':['prepare','execute','verify','close'],'description':'Fallback\x20stage\x20sequence\x20for\x20goals\x20without\x20a\x20dedicated\x20playbook.'}),registerPlaybook({'name':'service-build','stages':['namespace','puzzle','risk','doc','substeps'],'description':'Design\x20&\x20publish\x20a\x20commercial\x20service\x20(content:\x20src/playbooks/service-build/).'}),registerPlaybook({'name':'order-fulfillment','stages':['confirm','deliver','accept','settle'],'description':'Merchant-side\x20order\x20fulfillment.'}),registerPlaybook({'name':'demand-capture','stages':['discover','evaluate','engage','close'],'description':'Discover\x20and\x20capture\x20demand\x20opportunities.'}),registerPlaybook({'name':'demand-publish','stages':['draft','fund','publish','close'],'description':'Publish\x20a\x20funded\x20demand.'}),registerPlaybook({'name':'purchase','stages':['select','order','monitor','review'],'description':'Purchase\x20a\x20service\x20and\x20see\x20it\x20delivered.'}),registerPlaybook({'name':'governance','stages':['inventory','decide','execute','audit'],'description':'On-chain\x20permission/data/financial\x20governance\x20loop\x20(08\x20§七\x20N-4;\x20skill:\x20wowok-governance).'});
@@ -58,6 +58,30 @@ export interface ProblemRecord {
58
58
  event_type: string;
59
59
  };
60
60
  }
61
+ export type SuggestionKind = "advance_stage" | "complete_goal" | "register_object" | "note" | "incentive";
62
+ export interface SuggestionRecord {
63
+ id: string;
64
+ created_at: string;
65
+ object?: string;
66
+ kind: SuggestionKind;
67
+ stage?: string;
68
+ objects?: {
69
+ type: string;
70
+ object: string;
71
+ }[];
72
+ title: string;
73
+ detail?: string;
74
+ status: "pending" | "confirmed" | "dismissed";
75
+ resolved_at?: string;
76
+ resolution_note?: string;
77
+ applied?: boolean;
78
+ origin?: {
79
+ source: "monitor";
80
+ network: string;
81
+ event_id: string;
82
+ event_type: string;
83
+ };
84
+ }
61
85
  export interface FeedbackRecord {
62
86
  id: string;
63
87
  at: string;
@@ -1 +1 @@
1
- import{BridgeClient,LocalMark}from'@wowok/wowok';import{classifyError,buildSemantic,buildDataSemantic}from'../../schema/call/semantic.js';let _bridgeClient=null,_bridgeClientEnv=null;function getBridgeClient(a){const b=a||{},c=b?.['account'];return(_bridgeClient===null||_bridgeClientEnv===null||c!==_bridgeClientEnv?.['account'])&&(_bridgeClient=new BridgeClient({'wowEnv':b}),_bridgeClientEnv=b),_bridgeClient;}function getBridgeClientForQuery(){if(_bridgeClient!==null)return _bridgeClient;return _bridgeClient=new BridgeClient({}),_bridgeClientEnv={},_bridgeClient;}function validateMainnet(a){const b=a?.['network'];if(b&&b!=='mainnet')throw new Error('Bridge\x20only\x20supports\x20WOW\x20mainnet\x20(current\x20network:\x20\x27'+b+'\x27).\x20Only\x20mainnet\x20provides\x20cross-chain\x20functionality.');}async function resolveWowAddress(a,b){if(!a){const c=b?.['account'];return c;}if(/^0x[0-9a-fA-F]{64}$/['test'](a))return a;try{const d=await LocalMark['Instance']()['get_address'](a);if(d)return d;return a;}catch{return a;}}function safeJson(a){return JSON['stringify'](a,(b,c)=>typeof c==='bigint'?c['toString']():c,0x2);}function convertBigInts(a){if(typeof a==='bigint')return a['toString']();if(Array['isArray'](a))return a['map'](convertBigInts);if(a&&typeof a==='object'){const b={};for(const c of Object['keys'](a))b[c]=convertBigInts(a[c]);return b;}return a;}function ok(a,b,c){const d=convertBigInts(b),e=buildSemantic(d,c),f={'message':a,'result':{'type':'data','data':d},'semantic':e};return{'content':[{'type':'text','text':a},{'type':'text','text':safeJson(d)}],'structuredContent':f};}function err(a,b){const c=classifyError(a),d=buildDataSemantic(undefined,b,!![],a),e={'message':a,'result':{'type':'error','error':a,'error_code':c['error_code'],'retryable':c['retryable'],'recovery_hint':c['recovery_hint']},'semantic':d};return{'content':[{'type':'text','text':a}],'structuredContent':e};}export async function handleBridgeOperations(a){if(!a||typeof a!=='object')return err('Invalid\x20args:\x20expected\x20an\x20object\x20with\x20operation_type');let b;try{const {strictParse:f}=await import('../../schema/call/base.js');b=f((await import('../../schema/call/bridge.js'))['BridgeOperationsSchema'],a,'bridge_operations\x20input');}catch(g){return err('Parameter\x20validation\x20failed:\x20'+(g?.['message']??String(g)));}const c=b['env'],d={'operation_type':'bridge_'+b['operation_type'],'data':b['data']};try{switch(b['operation_type']){case'cross_chain_wow_to_evm':{validateMainnet(c);const h=b['data'],i=getBridgeClient(c),j=await i['bridgeWowToEvmSimple']({'token':h['token'],'amount':BigInt(h['amount']),'withdrawTo':h['withdrawTo'],'waitForFinalization':![],'idempotencyKey':h['idempotencyKey'],'idempotentByParams':h['idempotentByParams']}),k=j['idempotentHit']?'\x20[IDEMPOTENT\x20HIT\x20—\x20no\x20new\x20deposit]':'';return ok('WOW→EVM\x20cross-chain\x20step\x201\x20(deposit)\x20submitted.\x20transferId='+j['transferId']+',\x20activeEvmAccount='+j['activeEvmAccount']+'.'+k+'\x20'+'Next:\x20poll\x20query_transfer_status\x20until\x20bridge\x20signs\x20(~1-5\x20min),\x20then\x20call\x20claim_wow_to_evm\x20to\x20complete.',j,d);}case'cross_chain_evm_to_wow':{validateMainnet(c);const l=b['data'],m=await resolveWowAddress(l['recipientWowAddress'],c),n=getBridgeClient(c),o=await n['bridgeEvmToWowSimple']({'token':l['token'],'amount':BigInt(l['amount']),'recipientWowAddress':m,'waitForFinalization':![],'idempotencyKey':l['idempotencyKey'],'idempotentByParams':l['idempotentByParams']}),p=o['idempotentHit']?'\x20[IDEMPOTENT\x20HIT\x20—\x20no\x20new\x20deposit]':'';return ok('EVM→WOW\x20cross-chain\x20submitted.\x20transferId='+o['transferId']+',\x20activeEvmAccount='+o['activeEvmAccount']+'.'+p+'\x20'+'Bridge\x20will\x20auto-claim\x20on\x20WOW\x20(~10-20\x20min).\x20Poll\x20query_transfer_status\x20to\x20monitor\x20progress.',o,d);}case'claim_wow_to_evm':{validateMainnet(c);const q=b['data'],r=getBridgeClient(c),s=await r['claimWowToEvm'](q['transferId']);return ok('WOW→EVM\x20claim\x20(step\x202)\x20completed.\x20transferId='+s['transferId']+',\x20claimTxHash='+s['claimTxHash'],s,d);}case'resume_transfer':{validateMainnet(c);const t=b['data'],u=getBridgeClient(c),v=await u['resumeTransfer'](t['transferId']);return ok('Transfer\x20'+t['transferId']+'\x20resumed.\x20Current\x20step:\x20'+v['step']+',\x20status:\x20'+v['status']+'.',v,d);}case'withdraw':{const w=b['data'],x=getBridgeClientForQuery();let y=w['tokenAddress'];if(!y&&w['token']&&w['token']!=='ETH'){const A=x['config'],B=A?.['evmChains']?.['find'](D=>D['name']===(w['network']??'mainnet')),C=B?.['tokens']?.['find'](D=>D['symbol']===w['token']);y=C?.['evmAddress'];if(!y)return err('Cannot\x20resolve\x20ERC20\x20token\x20address\x20for\x20symbol\x20\x27'+w['token']+'\x27\x20on\x20chain\x20\x27'+(w['network']??'mainnet')+'\x27.\x20Please\x20pass\x20tokenAddress\x20explicitly.',d);}const z=await x['withdrawFromActiveEvmAccount']({'to':w['to'],'amount':BigInt(w['amount']),'tokenAddress':y,'token':w['token']?w['token']:undefined,'network':w['network']});return ok('Withdrawal\x20submitted.\x20transferId='+z['transferId']+',\x20txHash='+z['txHash'],z,d);}case'query_active_evm_account':{const D=b['data']??{},E=getBridgeClientForQuery(),F=await E['queryActiveEvmAccount']({'network':D['network'],'tokens':D['tokens']});return ok('activeEvmAccount:\x20'+F['address']+'\x20('+F['chains']['length']+'\x20chain(s))',F,d);}case'query_supported_evm_chains':{const G=getBridgeClientForQuery(),H=await G['querySupportedEvmChains']();return ok(H['length']+'\x20EVM\x20chain(s)\x20supported:\x20'+H['map'](I=>I['name']+'(chainId='+I['chainId']+')')['join'](',\x20'),H,d);}case'query_supported_tokens':{const I=b['data']??{},J=getBridgeClientForQuery(),K=await J['querySupportedTokens']({'network':I['network']}),L=K['reduce']((M,N)=>M+N['tokens']['length'],0x0);return ok(K['length']+'\x20chain(s),\x20'+L+'\x20token\x20entries:\x20'+K['map'](M=>M['chainName']+'('+M['tokens']['length']+'\x20tokens)')['join'](',\x20'),K,d);}case'query_transfer_list':{const M=b['data']??{},N=getBridgeClientForQuery();let O=await N['queryTransferList']({'onlyActive':M['onlyActive']});M['status']&&(O=O['filter'](Q=>Q['status']===M['status']));M['direction']&&(O=O['filter'](Q=>Q['direction']===M['direction']));M['token']&&(O=O['filter'](Q=>Q['token']===M['token']));M['limit']&&M['limit']>0x0&&(O=O['slice'](0x0,M['limit']));const P=O['filter'](Q=>Q['status']!=='success'&&Q['status']!=='failed')['length'];return ok(O['length']+'\x20transfer\x20record(s)\x20('+P+'\x20in\x20progress)'+(M['status']||M['direction']||M['token']?'\x20(filtered)':''),O,d);}case'query_transfer_status':{const Q=b['data'],R=getBridgeClientForQuery(),S=Q['refresh']!==![];if(S)try{await Promise['race']([R['refreshTransferStatus'](Q['transferId']),new Promise((U,V)=>setTimeout(()=>V(new Error('refresh\x20timeout')),0x3a98))]);}catch{}const T=await R['queryTransferStatus'](Q['transferId']);if(!T)return err('transferId\x20\x27'+Q['transferId']+'\x27\x20not\x20found.\x20'+'Use\x20query_transfer_list\x20to\x20see\x20all\x20valid\x20transferIds.\x20'+'Note:\x20transfer\x20history\x20is\x20persisted\x20in\x20cache.db\x20and\x20restored\x20on\x20MCP\x20restart,\x20'+'so\x20this\x20transferId\x20may\x20never\x20have\x20been\x20created\x20in\x20this\x20environment.',d);return ok('Transfer\x20'+Q['transferId']+':\x20'+T['direction']+'\x20/\x20'+T['step']+'\x20/\x20'+T['status'],T,d);}case'manage_evm_rpc':{const U=b['data'],V=getBridgeClientForQuery(),W=await V['manageEvmRpc']({'op':U['op'],'network':U['network'],'rpcUrls':U['rpcUrls']});return ok('RPC\x20\x27'+U['op']+'\x27\x20operation\x20'+(W['success']?'succeeded':'failed'),W,d);}default:{return err('Unsupported\x20operation_type:\x20'+b['operation_type'],d);}}}catch(X){const Y=X?.['message']??String(X);return err('Bridge\x20operation\x20failed:\x20'+Y,d);}}
1
+ import{BridgeClient,LocalMark}from'@wowok/wowok';import{classifyError,buildSemantic,buildDataSemantic}from'../../schema/call/semantic.js';let _bridgeClient=null,_bridgeClientEnv=null;function getBridgeClient(a){const b=a||{},c=b?.['account'],d=b?.['network'];return(_bridgeClient===null||_bridgeClientEnv===null||c!==_bridgeClientEnv?.['account']||d!==_bridgeClientEnv?.['network'])&&(_bridgeClient=new BridgeClient({'wowEnv':b}),_bridgeClientEnv=b),_bridgeClient;}function getBridgeClientForQuery(){if(_bridgeClient!==null)return _bridgeClient;return _bridgeClient=new BridgeClient({}),_bridgeClientEnv={},_bridgeClient;}function validateMainnet(a){const b=a?.['network'];if(b&&b!=='mainnet')throw new Error('Bridge\x20only\x20supports\x20WOW\x20mainnet\x20(current\x20network:\x20\x27'+b+'\x27).\x20Only\x20mainnet\x20provides\x20cross-chain\x20functionality.');}async function resolveWowAddress(a,b){if(!a){const c=b?.['account'];return c;}if(/^0x[0-9a-fA-F]{64}$/['test'](a))return a;try{const d=await LocalMark['Instance']()['get_address'](a);if(d)return d;return a;}catch{return a;}}function safeJson(a){return JSON['stringify'](a,(b,c)=>typeof c==='bigint'?c['toString']():c,0x2);}function convertBigInts(a){if(typeof a==='bigint')return a['toString']();if(Array['isArray'](a))return a['map'](convertBigInts);if(a&&typeof a==='object'){const b={};for(const c of Object['keys'](a))b[c]=convertBigInts(a[c]);return b;}return a;}function ok(a,b,c){const d=convertBigInts(b),e=buildSemantic(d,c),f={'message':a,'result':{'type':'data','data':d},'semantic':e};return{'content':[{'type':'text','text':a},{'type':'text','text':safeJson(d)}],'structuredContent':f};}function err(a,b){const c=classifyError(a),d=buildDataSemantic(undefined,b,!![],a),e={'message':a,'result':{'type':'error','error':a,'error_code':c['error_code'],'retryable':c['retryable'],'recovery_hint':c['recovery_hint']},'semantic':d};return{'content':[{'type':'text','text':a}],'structuredContent':e};}export async function handleBridgeOperations(a){if(!a||typeof a!=='object')return err('Invalid\x20args:\x20expected\x20an\x20object\x20with\x20operation_type');let b;try{const {strictParse:f}=await import('../../schema/call/base.js');b=f((await import('../../schema/call/bridge.js'))['BridgeOperationsSchema'],a,'bridge_operations\x20input');}catch(g){return err('Parameter\x20validation\x20failed:\x20'+(g?.['message']??String(g)));}const c=b['env'],d={'operation_type':'bridge_'+b['operation_type'],'data':b['data']};try{switch(b['operation_type']){case'cross_chain_wow_to_evm':{validateMainnet(c);const h=b['data'],i=getBridgeClient(c),j=await i['bridgeWowToEvmSimple']({'token':h['token'],'amount':BigInt(h['amount']),'withdrawTo':h['withdrawTo'],'waitForFinalization':![],'idempotencyKey':h['idempotencyKey'],'idempotentByParams':h['idempotentByParams']}),k=j['idempotentHit']?'\x20[IDEMPOTENT\x20HIT\x20—\x20no\x20new\x20deposit]':'';return ok('WOW→EVM\x20cross-chain\x20step\x201\x20(deposit)\x20submitted.\x20transferId='+j['transferId']+',\x20activeEvmAccount='+j['activeEvmAccount']+'.'+k+'\x20'+'Next:\x20poll\x20query_transfer_status\x20until\x20bridge\x20signs\x20(~1-5\x20min),\x20then\x20call\x20claim_wow_to_evm\x20to\x20complete.',j,d);}case'cross_chain_evm_to_wow':{validateMainnet(c);const l=b['data'],m=await resolveWowAddress(l['recipientWowAddress'],c),n=getBridgeClient(c),o=await n['bridgeEvmToWowSimple']({'token':l['token'],'amount':BigInt(l['amount']),'recipientWowAddress':m,'waitForFinalization':![],'idempotencyKey':l['idempotencyKey'],'idempotentByParams':l['idempotentByParams']}),p=o['idempotentHit']?'\x20[IDEMPOTENT\x20HIT\x20—\x20no\x20new\x20deposit]':'';return ok('EVM→WOW\x20cross-chain\x20submitted.\x20transferId='+o['transferId']+',\x20activeEvmAccount='+o['activeEvmAccount']+'.'+p+'\x20'+'Bridge\x20will\x20auto-claim\x20on\x20WOW\x20(~10-20\x20min).\x20Poll\x20query_transfer_status\x20to\x20monitor\x20progress.',o,d);}case'claim_wow_to_evm':{validateMainnet(c);const q=b['data'],r=getBridgeClient(c),s=await r['claimWowToEvm'](q['transferId']);return ok('WOW→EVM\x20claim\x20(step\x202)\x20completed.\x20transferId='+s['transferId']+',\x20claimTxHash='+s['claimTxHash'],s,d);}case'resume_transfer':{validateMainnet(c);const t=b['data'],u=getBridgeClient(c),v=await u['resumeTransfer'](t['transferId']);return ok('Transfer\x20'+t['transferId']+'\x20resumed.\x20Current\x20step:\x20'+v['step']+',\x20status:\x20'+v['status']+'.',v,d);}case'withdraw':{const w=b['data'],x=getBridgeClientForQuery();let y=w['tokenAddress'];if(!y&&w['token']&&w['token']!=='ETH'){const A=x['config'],B=A?.['evmChains']?.['find'](D=>D['name']===(w['network']??'mainnet')),C=B?.['tokens']?.['find'](D=>D['symbol']===w['token']);y=C?.['evmAddress'];if(!y)return err('Cannot\x20resolve\x20ERC20\x20token\x20address\x20for\x20symbol\x20\x27'+w['token']+'\x27\x20on\x20chain\x20\x27'+(w['network']??'mainnet')+'\x27.\x20Please\x20pass\x20tokenAddress\x20explicitly.',d);}const z=await x['withdrawFromActiveEvmAccount']({'to':w['to'],'amount':BigInt(w['amount']),'tokenAddress':y,'token':w['token']?w['token']:undefined,'network':w['network']});return ok('Withdrawal\x20submitted.\x20transferId='+z['transferId']+',\x20txHash='+z['txHash'],z,d);}case'query_active_evm_account':{const D=b['data']??{},E=getBridgeClientForQuery(),F=await E['queryActiveEvmAccount']({'network':D['network'],'tokens':D['tokens']});return ok('activeEvmAccount:\x20'+F['address']+'\x20('+F['chains']['length']+'\x20chain(s))',F,d);}case'query_supported_evm_chains':{const G=getBridgeClientForQuery(),H=await G['querySupportedEvmChains']();return ok(H['length']+'\x20EVM\x20chain(s)\x20supported:\x20'+H['map'](I=>I['name']+'(chainId='+I['chainId']+')')['join'](',\x20'),H,d);}case'query_supported_tokens':{const I=b['data']??{},J=getBridgeClientForQuery(),K=await J['querySupportedTokens']({'network':I['network']}),L=K['reduce']((M,N)=>M+N['tokens']['length'],0x0);return ok(K['length']+'\x20chain(s),\x20'+L+'\x20token\x20entries:\x20'+K['map'](M=>M['chainName']+'('+M['tokens']['length']+'\x20tokens)')['join'](',\x20'),K,d);}case'query_transfer_list':{const M=b['data']??{},N=getBridgeClientForQuery();let O=await N['queryTransferList']({'onlyActive':M['onlyActive']});M['status']&&(O=O['filter'](Q=>Q['status']===M['status']));M['direction']&&(O=O['filter'](Q=>Q['direction']===M['direction']));M['token']&&(O=O['filter'](Q=>Q['token']===M['token']));M['limit']&&M['limit']>0x0&&(O=O['slice'](0x0,M['limit']));const P=O['filter'](Q=>Q['status']!=='success'&&Q['status']!=='failed')['length'];return ok(O['length']+'\x20transfer\x20record(s)\x20('+P+'\x20in\x20progress)'+(M['status']||M['direction']||M['token']?'\x20(filtered)':''),O,d);}case'query_transfer_status':{const Q=b['data'],R=getBridgeClientForQuery(),S=Q['refresh']!==![];if(S)try{await Promise['race']([R['refreshTransferStatus'](Q['transferId']),new Promise((U,V)=>setTimeout(()=>V(new Error('refresh\x20timeout')),0x3a98))]);}catch{}const T=await R['queryTransferStatus'](Q['transferId']);if(!T)return err('transferId\x20\x27'+Q['transferId']+'\x27\x20not\x20found.\x20'+'Use\x20query_transfer_list\x20to\x20see\x20all\x20valid\x20transferIds.\x20'+'Note:\x20transfer\x20history\x20is\x20persisted\x20in\x20cache.db\x20and\x20restored\x20on\x20MCP\x20restart,\x20'+'so\x20this\x20transferId\x20may\x20never\x20have\x20been\x20created\x20in\x20this\x20environment.',d);return ok('Transfer\x20'+Q['transferId']+':\x20'+T['direction']+'\x20/\x20'+T['step']+'\x20/\x20'+T['status'],T,d);}case'manage_evm_rpc':{const U=b['data'],V=getBridgeClientForQuery(),W=await V['manageEvmRpc']({'op':U['op'],'network':U['network'],'rpcUrls':U['rpcUrls']});return ok('RPC\x20\x27'+U['op']+'\x27\x20operation\x20'+(W['success']?'succeeded':'failed'),W,d);}default:{return err('Unsupported\x20operation_type:\x20'+b['operation_type'],d);}}}catch(X){const Y=X?.['message']??String(X);return err('Bridge\x20operation\x20failed:\x20'+Y,d);}}
@@ -1 +1 @@
1
- import{listServices,getServiceInfo,toggle as a384a,setEnabled as a384b,reset as a384c}from'../../config/index.js';import{strictParse}from'../../schema/index.js';import{ConfigOperationInputSchema}from'../../schema/config/index.js';export async function handleConfigOperation(a){const b=strictParse(ConfigOperationInputSchema,a,'config_operation\x20input'),{action:c,service:d}=b;let e;switch(c){case'list':e={'action':'list','services':listServices()};break;case'toggle':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20toggle');const f=d,g=getServiceInfo(f);if(!g)throw new Error('Unknown\x20service:\x20'+f+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');const h=a384a(f);e={'action':'toggle','service':f,'enabled':h,'reminder':g['reminder']};break;}case'enable':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20enable');const i=d,j=getServiceInfo(i);if(!j)throw new Error('Unknown\x20service:\x20'+i+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');a384b(i,!![]),e={'action':'enable','service':i,'enabled':!![],'reminder':j['reminder']};break;}case'disable':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20disable');const k=d,l=getServiceInfo(k);if(!l)throw new Error('Unknown\x20service:\x20'+k+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');a384b(k,![]),e={'action':'disable','service':k,'enabled':![],'reminder':l['reminder']};break;}case'reset':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20reset');const m=d,n=getServiceInfo(m);if(!n)throw new Error('Unknown\x20service:\x20'+m+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');a384c(m),e={'action':'reset','service':m,'enabled':getServiceInfo(m)?.['enabled'],'reminder':n['reminder'],'reset':!![]};break;}case'info':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20info');const o=d,p=getServiceInfo(o);if(!p)throw new Error('Unknown\x20service:\x20'+o+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');e={'action':'info',...p};break;}default:throw new Error('Unknown\x20config_operation\x20action:\x20'+String(c));}return{'content':[{'type':'text','text':JSON['stringify']({'result':e})}],'structuredContent':{'result':e}};}
1
+ import{listServices,getServiceInfo,toggle as a400a,setEnabled as a400b,reset as a400c}from'../../config/index.js';import{strictParse}from'../../schema/index.js';import{ConfigOperationInputSchema}from'../../schema/config/index.js';export async function handleConfigOperation(a){const b=strictParse(ConfigOperationInputSchema,a,'config_operation\x20input'),{action:c,service:d}=b;let e;switch(c){case'list':e={'action':'list','services':listServices()};break;case'toggle':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20toggle');const f=d,g=getServiceInfo(f);if(!g)throw new Error('Unknown\x20service:\x20'+f+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');const h=a400a(f);e={'action':'toggle','service':f,'enabled':h,'reminder':g['reminder']};break;}case'enable':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20enable');const i=d,j=getServiceInfo(i);if(!j)throw new Error('Unknown\x20service:\x20'+i+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');a400b(i,!![]),e={'action':'enable','service':i,'enabled':!![],'reminder':j['reminder']};break;}case'disable':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20disable');const k=d,l=getServiceInfo(k);if(!l)throw new Error('Unknown\x20service:\x20'+k+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');a400b(k,![]),e={'action':'disable','service':k,'enabled':![],'reminder':l['reminder']};break;}case'reset':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20reset');const m=d,n=getServiceInfo(m);if(!n)throw new Error('Unknown\x20service:\x20'+m+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');a400c(m),e={'action':'reset','service':m,'enabled':getServiceInfo(m)?.['enabled'],'reminder':n['reminder'],'reset':!![]};break;}case'info':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20info');const o=d,p=getServiceInfo(o);if(!p)throw new Error('Unknown\x20service:\x20'+o+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');e={'action':'info',...p};break;}default:throw new Error('Unknown\x20config_operation\x20action:\x20'+String(c));}return{'content':[{'type':'text','text':JSON['stringify']({'result':e})}],'structuredContent':{'result':e}};}
@@ -1,2 +1,8 @@
1
+ import { type MonitorEventStore } from "../../monitor/EventStore.js";
1
2
  import type { ToolDispatchResult } from "../types.js";
3
+ export interface AssessKpiDeps {
4
+ events: Pick<MonitorEventStore, "list">;
5
+ resolveNetwork: (network?: string) => Promise<string>;
6
+ }
7
+ export declare function setAssessKpiDeps(deps?: AssessKpiDeps): void;
2
8
  export declare function handleEmployeeOperation(args: unknown): Promise<ToolDispatchResult>;
@@ -1 +1 @@
1
- import{strictParse}from'../../schema/index.js';import{EmployeeOperationInputSchema}from'../../schema/employee/index.js';import{getEmployeeStore}from'../../participation/employee-store.js';import{assessReactionKpi,resolveLiability}from'../../participation/employee-kpi.js';export async function handleEmployeeOperation(a){const b=strictParse(EmployeeOperationInputSchema,a,'employee_operation\x20input'),c=getEmployeeStore();let d;switch(b['action']){case'set':{await c['save'](b['account'],b['profile']),d={'action':'set','account':b['account'],'profile':b['profile']};break;}case'get':{d={'action':'get','account':b['account'],'profile':await c['get'](b['account'])};break;}case'remove':{d={'action':'remove','account':b['account'],'removed':await c['remove'](b['account'])};break;}case'assess_kpi':{let e=b['budget_ms'];if(e===undefined&&b['account']){const f=await c['get'](b['account']);e=f?.['response_time_budget_ms'];}d={'action':'assess_kpi',...assessReactionKpi(b['node'],b['assigned_at'],b['advanced_at'],e)};break;}case'resolve_liability':{let g=b['liability'];if(g===undefined&&b['account']){const h=await c['get'](b['account']);g=h?.['liability'];}if(g===undefined)throw new Error('resolve_liability\x20requires\x20`account`\x20(with\x20a\x20stored\x20profile)\x20or\x20an\x20explicit\x20`liability`');d={'action':'resolve_liability',...resolveLiability(g,b['loss_amount'],b['hybrid_threshold']??0x0)};break;}default:throw new Error('Unknown\x20employee_operation\x20action');}return{'content':[{'type':'text','text':JSON['stringify']({'result':d})}],'structuredContent':{'result':d}};}
1
+ import{strictParse}from'../../schema/index.js';import{EmployeeOperationInputSchema}from'../../schema/employee/index.js';import{getEmployeeStore}from'../../participation/employee-store.js';import{assessReactionKpi,deriveNodeTiming,resolveLiability}from'../../participation/employee-kpi.js';import{suggestIncentive}from'../../relationship/incentive.js';import{monitorEventStore}from'../../monitor/EventStore.js';import{resolveNetwork}from'./network.js';let assessKpiDeps;export function setAssessKpiDeps(a){assessKpiDeps=a;}const PROGRESS_EVENT_SCAN_LIMIT=0x1f4;function normalizeAddress(b){return b['toLowerCase']()['replace'](/^0x/,'')['padStart'](0x40,'0');}export async function handleEmployeeOperation(a){const b=strictParse(EmployeeOperationInputSchema,a,'employee_operation\x20input'),c=getEmployeeStore();let d;switch(b['action']){case'set':{await c['save'](b['account'],b['profile']),d={'action':'set','account':b['account'],'profile':b['profile']};break;}case'get':{d={'action':'get','account':b['account'],'profile':await c['get'](b['account'])};break;}case'remove':{d={'action':'remove','account':b['account'],'removed':await c['remove'](b['account'])};break;}case'assess_kpi':{let e=b['budget_ms'];if(e===undefined&&b['account']){const i=await c['get'](b['account']);e=i?.['response_time_budget_ms'];}let f=b['assigned_at'],g=b['advanced_at'],h;if((f===undefined||g===undefined)&&b['progress']){const j=assessKpiDeps??{'events':monitorEventStore,'resolveNetwork':resolveNetwork},k=await j['resolveNetwork'](b['network']),l=await j['events']['list'](k,{'module':'progress','eventType':'ProgressEvent','relevantOnly':![],'limit':PROGRESS_EVENT_SCAN_LIMIT}),m=normalizeAddress(b['progress']),n=l['events']['filter'](o=>{const q=o['event']?.['progress'];return typeof q==='string'&&normalizeAddress(q)===m;})['map'](o=>{const p=o['event'];return{'node':p['node'],'time':o['time'],'hold':p['hold']};})['sort']((o,p)=>o['time']-p['time']);h=deriveNodeTiming(n,b['node']),f=f??h['assigned_at'],g=g??h['advanced_at'];}if(f===undefined){if(h?.['gap'])throw new Error('assess_kpi\x20could\x20not\x20derive\x20timing:\x20'+h['gap']);throw new Error('assess_kpi\x20requires\x20`assigned_at`\x20(explicit)\x20or\x20`progress`\x20with\x20monitored\x20'+'ProgressEvents\x20to\x20derive\x20it\x20from');}d={'action':'assess_kpi',...assessReactionKpi(b['node'],f,g,e),...h?{'timing':h}:{}};break;}case'resolve_liability':{let o=b['liability'];if(o===undefined&&b['account']){const p=await c['get'](b['account']);o=p?.['liability'];}if(o===undefined)throw new Error('resolve_liability\x20requires\x20`account`\x20(with\x20a\x20stored\x20profile)\x20or\x20an\x20explicit\x20`liability`');d={'action':'resolve_liability',...resolveLiability(o,b['loss_amount'],b['hybrid_threshold']??0x0)};break;}case'suggest_incentive':{d={'action':'suggest_incentive',...suggestIncentive({'employee':b['account'],'kpis':b['kpis'],'acceptance':b['acceptance']??[],'liability':b['liability'],'available_rewards':b['available_rewards'],'prior_compensation':b['prior_compensation']})};break;}default:throw new Error('Unknown\x20employee_operation\x20action');}return{'content':[{'type':'text','text':JSON['stringify']({'result':d})}],'structuredContent':{'result':d}};}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{afterEach,beforeAll,describe,expect,it}from'vitest';import{handleEmployeeOperation,setAssessKpiDeps}from'./employee.js';import{setEmployeeStore}from'../../participation/employee-store.js';const EMP='0xaaa111';beforeAll(()=>{const a={'save':async()=>{},'get':async()=>null,'remove':async()=>![]};setEmployeeStore(a);}),afterEach(()=>setAssessKpiDeps(undefined));function resultOf(a){return a['structuredContent']['result'];}describe('employee_operation\x20suggest_incentive',()=>{it('all-pass\x20KPIs\x20+\x20available\x20rewards\x20→\x20reward_grant\x20requiring\x20confirmation',async()=>{const a=await handleEmployeeOperation({'action':'suggest_incentive','account':EMP,'kpis':[{'node':'deliver','reaction_ms':0x36ee80,'within_budget':!![],'status':'pass'}],'acceptance':[{'node':'deliver','wip_hashes':['0xhash1']}],'available_rewards':[{'address':'0xreward1','description':'bonus'}]}),b=resultOf(a);expect(b['action'])['toBe']('suggest_incentive'),expect(b['kind'])['toBe']('reward_grant'),expect(b['requires_confirmation'])['toBe'](!![]),expect(b['reward_candidates'])['toHaveLength'](0x1),expect(b['employee'])['toBe'](EMP);}),it('employee\x20liability\x20→\x20compensation_offset\x20takes\x20precedence',async()=>{const a=await handleEmployeeOperation({'action':'suggest_incentive','account':EMP,'kpis':[{'node':'deliver','reaction_ms':0x36ee80,'within_budget':!![],'status':'pass'}],'acceptance':[{'node':'deliver','wip_hashes':['0xhash1']}],'liability':{'bears':'employee','must_compensate_before_resume':!![],'note':'self_bears\x20rule'}});expect(resultOf(a)['kind'])['toBe']('compensation_offset');}),it('acceptance\x20gap\x20(missing\x20evidence)\x20→\x20correction_notice',async()=>{const a=await handleEmployeeOperation({'action':'suggest_incentive','account':EMP,'kpis':[{'node':'deliver','reaction_ms':0x36ee80,'within_budget':!![],'status':'pass'}]});expect(resultOf(a)['kind'])['toBe']('correction_notice');}),it('pending\x20(warn)\x20nodes\x20only\x20→\x20none',async()=>{const a=await handleEmployeeOperation({'action':'suggest_incentive','account':EMP,'kpis':[{'node':'deliver','reaction_ms':-0x1,'within_budget':![],'status':'warn'}]});expect(resultOf(a)['kind'])['toBe']('none');}),it('schema\x20gate\x20rejects\x20malformed\x20input',async()=>{await expect(handleEmployeeOperation({'action':'suggest_incentive','account':EMP,'kpis':[{'node':'x'}]}))['rejects']['toThrow']();});});const PROGRESS='0x'+'0'['repeat'](0x3a)+'abc123',OTHER_PROGRESS='0x'+'0'['repeat'](0x3a)+'fff999';function progressEvent(a,b,c,d=null){return{'id':c+':tx','seen':!![],'module':'progress','type':'ProgressEvent','time':c,'event':{'progress':a,'machine':null,'task':null,'node':b,'forward':d===null?null:'f','hold':d}};}function listResult(a){return{'events':a,'total':a['length'],'moduleCounts':{},'unreadByModule':{},'totalUnread':0x0};}function injectEvents(a){setAssessKpiDeps({'events':{'list':async()=>listResult(a)},'resolveNetwork':async()=>'testnet'});}describe('employee_operation\x20assess_kpi\x20timing\x20derivation\x20(P1-3)',()=>{it('derives\x20assigned_at/advanced_at\x20from\x20the\x20progress\x20object\x27s\x20ProgressEvents',async()=>{injectEvents([progressEvent(PROGRESS,'received',0x3e8),progressEvent(OTHER_PROGRESS,'received',0x5dc),progressEvent(PROGRESS,'preparing',0x7d0),progressEvent(PROGRESS,'shipped',0x9c4,!![]),progressEvent(PROGRESS,'shipped',0x2328)]);const a=await handleEmployeeOperation({'action':'assess_kpi','node':'preparing','progress':'0xABC123','budget_ms':0x1388}),b=resultOf(a);expect(b['node'])['toBe']('preparing'),expect(b['reaction_ms'])['toBe'](0x1b58),expect(b['within_budget'])['toBe'](![]),expect(b['status'])['toBe']('fail'),expect(b['timing'])['toEqual']({'node':'preparing','assigned_at':0x7d0,'advanced_at':0x2328,'source':'monitor_events'});}),it('explicit\x20timestamps\x20win\x20and\x20skip\x20the\x20event\x20lookup\x20entirely',async()=>{setAssessKpiDeps({'events':{'list':async()=>{throw new Error('list\x20must\x20not\x20be\x20called');}},'resolveNetwork':async()=>'testnet'});const a=await handleEmployeeOperation({'action':'assess_kpi','node':'preparing','assigned_at':0x3e8,'advanced_at':0x7d0,'progress':'0xABC123','budget_ms':0x1388}),b=resultOf(a);expect(b['reaction_ms'])['toBe'](0x3e8),expect(b['status'])['toBe']('pass'),expect(b['timing'])['toBeUndefined']();}),it('partial\x20override:\x20explicit\x20assigned_at\x20+\x20derived\x20advanced_at',async()=>{injectEvents([progressEvent(PROGRESS,'received',0x3e8),progressEvent(PROGRESS,'preparing',0x7d0),progressEvent(PROGRESS,'shipped',0x2328)]);const a=await handleEmployeeOperation({'action':'assess_kpi','node':'preparing','assigned_at':0x5dc,'progress':PROGRESS,'budget_ms':0x1f40}),b=resultOf(a);expect(b['reaction_ms'])['toBe'](0x1d4c),expect(b['status'])['toBe']('pass'),expect(b['timing']['assigned_at'])['toBe'](0x7d0),expect(b['timing']['advanced_at'])['toBe'](0x2328);}),it('node\x20still\x20current\x20→\x20status\x20warn\x20(still\x20waiting),\x20timing\x20without\x20advanced_at',async()=>{injectEvents([progressEvent(PROGRESS,'received',0x3e8),progressEvent(PROGRESS,'preparing',0x7d0)]);const a=await handleEmployeeOperation({'action':'assess_kpi','node':'preparing','progress':PROGRESS}),b=resultOf(a);expect(b['reaction_ms'])['toBe'](-0x1),expect(b['status'])['toBe']('warn'),expect(b['timing']['assigned_at'])['toBe'](0x7d0),expect(b['timing']['advanced_at'])['toBeUndefined']();}),it('node\x20not\x20found\x20in\x20the\x20monitored\x20window\x20→\x20actionable\x20error\x20naming\x20the\x20gap',async()=>{injectEvents([progressEvent(PROGRESS,'received',0x3e8)]),await expect(handleEmployeeOperation({'action':'assess_kpi','node':'preparing','progress':PROGRESS}))['rejects']['toThrow'](/could not derive timing.*no ProgressEvent entering node 'preparing'/);}),it('no\x20assigned_at\x20and\x20no\x20progress\x20→\x20error\x20asking\x20for\x20one\x20of\x20them',async()=>{await expect(handleEmployeeOperation({'action':'assess_kpi','node':'preparing'}))['rejects']['toThrow'](/requires `assigned_at` \(explicit\) or `progress`/);});});