@wowok/agent-mcp 2.7.8 → 2.7.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/config/runtime.d.ts +1 -1
- package/dist/config/runtime.js +1 -1
- package/dist/examples/rental-ziroom-machine-create.json +1 -2
- package/dist/examples/rental-ziroom-permission-create.json +1 -2
- package/dist/examples/rental-ziroom-service-create.json +1 -2
- package/dist/experience/experience-reuse.js +1 -1
- package/dist/experience/index.d.ts +2 -1
- package/dist/experience/index.js +1 -1
- package/dist/experience/persistence-config.d.ts +6 -0
- package/dist/experience/persistence-config.js +1 -0
- package/dist/experience/persistence.d.ts +21 -0
- package/dist/experience/persistence.js +1 -0
- package/dist/experience/realtime-feedback.js +1 -1
- package/dist/experience/user-profile.js +1 -1
- package/dist/extensions/business-modules.d.ts +1 -1
- package/dist/extensions/capability-manifest.d.ts +1 -1
- package/dist/extensions/types.d.ts +1 -1
- package/dist/goal/GoalClassifier.d.ts +17 -0
- package/dist/goal/GoalClassifier.js +1 -0
- package/dist/goal/GoalEngine.d.ts +120 -0
- package/dist/goal/GoalEngine.js +1 -0
- package/dist/goal/GoalStore.d.ts +27 -0
- package/dist/goal/GoalStore.js +1 -0
- package/dist/goal/plan-approval.d.ts +5 -0
- package/dist/goal/plan-approval.js +1 -0
- package/dist/goal/types.d.ts +76 -0
- package/dist/goal/types.js +1 -0
- package/dist/harness/index.d.ts +2 -7
- package/dist/harness/index.js +1 -1
- package/dist/harness/plan.d.ts +1 -1
- package/dist/harness/types.d.ts +0 -35
- package/dist/index.js +1 -1
- package/dist/knowledge/account-marks.d.ts +35 -0
- package/dist/knowledge/account-marks.js +1 -0
- package/dist/knowledge/audit-rules.d.ts +3 -1
- package/dist/knowledge/audit-rules.js +1 -1
- package/dist/knowledge/examples-scanner-cli.js +1 -1
- package/dist/knowledge/examples-scanner.js +1 -1
- package/dist/knowledge/goal-completion.d.ts +19 -0
- package/dist/knowledge/goal-completion.js +1 -0
- package/dist/knowledge/guard-translation.js +1 -1
- package/dist/knowledge/index.d.ts +3 -2
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/mcp-schema-audit-cli.js +1 -1
- package/dist/knowledge/mcp-schema-audit.js +1 -1
- package/dist/knowledge/operation-dictionary.js +1 -1
- package/dist/knowledge/passport-confirm.js +1 -1
- package/dist/knowledge/passport-puzzle.js +1 -1
- package/dist/knowledge/passport-translation.js +1 -1
- package/dist/knowledge/proof-risk.js +1 -1
- package/dist/knowledge/safety-rules.js +1 -1
- package/dist/knowledge/service-translation.js +1 -1
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/knowledge/workflow-guidance.d.ts +1 -0
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/knowledge/workspace-lists.d.ts +56 -0
- package/dist/knowledge/workspace-lists.js +1 -0
- package/dist/loop-engineering/context-collect.d.ts +1 -1
- package/dist/monitor/EventRouter.d.ts +10 -0
- package/dist/monitor/EventRouter.js +1 -0
- package/dist/monitor/EventStore.d.ts +32 -12
- package/dist/monitor/EventStore.js +1 -1
- package/dist/monitor/MonitorLoop.d.ts +79 -0
- package/dist/monitor/MonitorLoop.js +1 -0
- package/dist/monitor/ProblemBridge.d.ts +32 -0
- package/dist/monitor/ProblemBridge.js +1 -0
- package/dist/monitor/ScopeResolver.d.ts +59 -0
- package/dist/monitor/ScopeResolver.js +1 -0
- package/dist/monitor/SubscriptionStore.d.ts +13 -0
- package/dist/monitor/SubscriptionStore.js +1 -0
- package/dist/monitor/normalize.d.ts +8 -0
- package/dist/monitor/normalize.js +1 -0
- package/dist/monitor/types.d.ts +89 -0
- package/dist/monitor/types.js +1 -0
- package/dist/persona/address-format.d.ts +1 -1
- package/dist/persona/address-format.js +1 -1
- package/dist/persona/distill-goal.d.ts +20 -0
- package/dist/persona/distill-goal.js +1 -0
- package/dist/persona/index.d.ts +2 -0
- package/dist/persona/index.js +1 -1
- package/dist/persona/model.js +1 -1
- package/dist/playbooks/service-build/business-puzzle.js +1 -0
- package/dist/{project → playbooks/service-build}/context-assembly.d.ts +9 -4
- package/dist/playbooks/service-build/context-assembly.js +1 -0
- package/dist/{project → playbooks/service-build}/game-theory.d.ts +1 -1
- package/dist/playbooks/service-build/index.d.ts +14 -0
- package/dist/playbooks/service-build/index.js +1 -0
- package/dist/{project → playbooks/service-build}/intent-analyzer.d.ts +1 -1
- package/dist/playbooks/service-build/intent-analyzer.js +1 -0
- package/dist/{project → playbooks/service-build}/machine-panorama.d.ts +5 -3
- package/dist/playbooks/service-build/machine-panorama.js +1 -0
- package/dist/{project → playbooks/service-build}/merchant-guide.d.ts +1 -1
- package/dist/playbooks/service-build/merchant-guide.js +1 -0
- package/dist/{project → playbooks/service-build}/mode-actions.d.ts +2 -2
- package/dist/playbooks/service-build/mode-actions.js +1 -0
- package/dist/playbooks/service-build/namespace.d.ts +2 -0
- package/dist/playbooks/service-build/namespace.js +1 -0
- package/dist/{project → playbooks/service-build}/object-panorama.d.ts +2 -3
- package/dist/playbooks/service-build/object-panorama.js +1 -0
- package/dist/{project → playbooks/service-build}/participation-radar.d.ts +4 -5
- package/dist/playbooks/service-build/participation-radar.js +1 -0
- package/dist/{project → playbooks/service-build}/pipeline-actions.d.ts +9 -9
- package/dist/playbooks/service-build/pipeline-actions.js +1 -0
- package/dist/playbooks/service-build/process.d.ts +6 -0
- package/dist/playbooks/service-build/process.js +1 -0
- package/dist/playbooks/service-build/risk-aggregator.js +1 -0
- package/dist/{project → playbooks/service-build}/semantic-graph.d.ts +2 -2
- package/dist/{project → playbooks/service-build}/service-panorama.d.ts +3 -19
- package/dist/playbooks/service-build/service-panorama.js +1 -0
- package/dist/review/arb.d.ts +6 -0
- package/dist/review/arb.js +1 -0
- package/dist/review/demand.d.ts +3 -0
- package/dist/review/demand.js +1 -0
- package/dist/review/index.d.ts +3 -0
- package/dist/review/index.js +1 -0
- package/dist/review/machine.d.ts +3 -0
- package/dist/review/machine.js +1 -0
- package/dist/review/order.d.ts +9 -0
- package/dist/review/order.js +1 -0
- package/dist/review/progress.d.ts +3 -0
- package/dist/review/progress.js +1 -0
- package/dist/review/repository.d.ts +3 -0
- package/dist/review/repository.js +1 -0
- package/dist/review/service.d.ts +5 -0
- package/dist/review/service.js +1 -0
- package/dist/review/types.d.ts +156 -0
- package/dist/review/types.js +1 -0
- package/dist/rules.d.ts +2 -2
- package/dist/rules.js +1 -1
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/safety/index.d.ts +1 -1
- package/dist/safety/index.js +1 -1
- package/dist/safety/preview.d.ts +1 -0
- package/dist/safety/preview.js +1 -1
- package/dist/schema/call/allocation.d.ts +1 -1
- package/dist/schema/call/arbitration.d.ts +1 -1
- package/dist/schema/call/base.d.ts +1 -1
- package/dist/schema/call/base.js +1 -1
- package/dist/schema/call/bridge.d.ts +4 -4
- package/dist/schema/call/contact.d.ts +1 -1
- package/dist/schema/call/contact.js +1 -1
- package/dist/schema/call/demand.d.ts +1 -1
- package/dist/schema/call/demand.js +1 -1
- package/dist/schema/call/guard.d.ts +3 -3
- package/dist/schema/call/handler.d.ts +0 -3
- package/dist/schema/call/handler.js +1 -1
- package/dist/schema/call/machine.d.ts +2 -2
- package/dist/schema/call/order.d.ts +1 -1
- package/dist/schema/call/payment.d.ts +1 -1
- package/dist/schema/call/permission.d.ts +1 -1
- package/dist/schema/call/personal.d.ts +1 -1
- package/dist/schema/call/progress.d.ts +1 -1
- package/dist/schema/call/proof.d.ts +2 -2
- package/dist/schema/call/repository.d.ts +1 -1
- package/dist/schema/call/repository.js +1 -1
- package/dist/schema/call/reward.d.ts +1 -1
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.d.ts +1 -1
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/call/treasury.d.ts +1 -1
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/goal/index.d.ts +317 -0
- package/dist/schema/goal/index.js +1 -0
- package/dist/schema/goal/planning.d.ts +465 -0
- package/dist/schema/goal/planning.js +1 -0
- package/dist/schema/index.d.ts +1 -2
- package/dist/schema/index.js +1 -1
- package/dist/schema/industry-pack/index.d.ts +265 -1
- package/dist/schema/industry-pack/index.js +1 -1
- package/dist/schema/industry-pack/modes.d.ts +268 -0
- package/dist/schema/industry-pack/modes.js +1 -0
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/operations.d.ts +216 -19
- package/dist/schema/operations.js +1 -1
- package/dist/schema/permission/index.d.ts +1 -0
- package/dist/schema/permission/index.js +1 -1
- package/dist/schema/persona/index.d.ts +40 -0
- package/dist/schema/persona/index.js +1 -1
- package/dist/schema/query/bi.d.ts +783 -0
- package/dist/schema/query/bi.js +1 -0
- package/dist/schema/query/index.d.ts +661 -0
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/utils/skills-recommendation.d.ts +0 -1
- package/dist/schema/utils/skills-recommendation.js +1 -1
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.output.json +3 -3
- package/dist/schemas/account_operation.schema.json +2 -2
- package/dist/schemas/bridge_operation.output.json +2 -2
- package/dist/schemas/bridge_operation.schema.json +12 -12
- package/dist/schemas/config_operation.output.json +1 -1
- package/dist/schemas/config_operation.schema.json +1 -1
- package/dist/schemas/goal_operation.schema.json +1016 -0
- package/dist/schemas/guard2file.schema.json +3 -3
- package/dist/schemas/index.json +12 -13
- package/dist/schemas/industry_pack_operation.output.json +898 -0
- package/dist/schemas/industry_pack_operation.schema.json +217 -2
- package/dist/schemas/local_info_operation.output.json +2 -2
- package/dist/schemas/local_mark_operation.output.json +2 -2
- package/dist/schemas/machineNode2file.schema.json +3 -3
- package/dist/schemas/messenger_operation.output.json +2 -2
- package/dist/schemas/monitor_events.output.json +78 -3
- package/dist/schemas/monitor_events.schema.json +24 -1
- package/dist/schemas/monitor_subscription.output.json +1462 -0
- package/dist/schemas/monitor_subscription.schema.json +327 -0
- package/dist/schemas/onchain_events.output.json +4 -4
- package/dist/schemas/onchain_operations.output.json +2 -2
- package/dist/schemas/onchain_operations.schema.json +59 -59
- package/dist/schemas/onchain_operations_allocation.schema.json +3 -3
- package/dist/schemas/onchain_operations_arbitration.schema.json +3 -3
- package/dist/schemas/onchain_operations_contact.schema.json +4 -4
- package/dist/schemas/onchain_operations_demand.schema.json +4 -4
- package/dist/schemas/onchain_operations_gen_passport.schema.json +3 -3
- package/dist/schemas/onchain_operations_gen_proof.schema.json +3 -3
- package/dist/schemas/onchain_operations_guard.schema.json +3 -3
- package/dist/schemas/onchain_operations_machine.schema.json +3 -3
- package/dist/schemas/onchain_operations_order.schema.json +3 -3
- package/dist/schemas/onchain_operations_payment.schema.json +3 -3
- package/dist/schemas/onchain_operations_permission.schema.json +3 -3
- package/dist/schemas/onchain_operations_personal.schema.json +3 -3
- package/dist/schemas/onchain_operations_progress.schema.json +3 -3
- package/dist/schemas/onchain_operations_proof.schema.json +3 -3
- package/dist/schemas/onchain_operations_repository.schema.json +5 -5
- package/dist/schemas/onchain_operations_reward.schema.json +3 -3
- package/dist/schemas/onchain_operations_service.schema.json +4 -4
- package/dist/schemas/onchain_operations_treasury.schema.json +3 -3
- package/dist/schemas/onchain_table_data.output.json +346 -2
- package/dist/schemas/onchain_table_data.schema.json +22 -22
- package/dist/schemas/permission_operation.schema.json +6 -2
- package/dist/schemas/persona_operation.output.json +145 -0
- package/dist/schemas/persona_operation.schema.json +28 -2
- package/dist/schemas/query_toolkit.output.json +1274 -15
- package/dist/schemas/query_toolkit.schema.json +412 -11
- package/dist/schemas/workflow_operation.schema.json +4 -4
- package/dist/task/ProcessStore.d.ts +81 -0
- package/dist/task/ProcessStore.js +1 -0
- package/dist/task/playbook.d.ts +11 -0
- package/dist/task/playbook.js +1 -0
- package/dist/task/stage-gate.d.ts +22 -0
- package/dist/task/stage-gate.js +1 -0
- package/dist/{project → task}/substep-trace.d.ts +6 -45
- package/dist/task/types.d.ts +120 -0
- package/dist/task/types.js +1 -0
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/goal.d.ts +4 -0
- package/dist/tools/handlers/goal.js +1 -0
- package/dist/tools/handlers/industry-pack.js +1 -1
- package/dist/tools/handlers/monitor.d.ts +24 -0
- package/dist/tools/handlers/monitor.js +1 -1
- package/dist/tools/handlers/network.d.ts +1 -0
- package/dist/tools/handlers/network.js +1 -0
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/permission.js +1 -1
- package/dist/tools/handlers/persona.js +1 -1
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/watch.js +1 -1
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.js +1 -1
- package/dist/tools/shared.js +1 -1
- package/dist/tools/wrap.js +1 -1
- package/package.json +5 -4
- package/dist/harness/checkpoint.d.ts +0 -8
- package/dist/harness/checkpoint.js +0 -1
- package/dist/knowledge/deployment-scanner.d.ts +0 -66
- package/dist/knowledge/deployment-scanner.js +0 -1
- package/dist/project/business-puzzle.js +0 -1
- package/dist/project/context-assembly.js +0 -1
- package/dist/project/deployment-bridge.d.ts +0 -5
- package/dist/project/deployment-bridge.js +0 -1
- package/dist/project/deployment-doc.d.ts +0 -190
- package/dist/project/deployment-doc.js +0 -1
- package/dist/project/edit-planner.d.ts +0 -123
- package/dist/project/edit-planner.js +0 -1
- package/dist/project/evaluation-fix.spec.d.ts +0 -1
- package/dist/project/evaluation-fix.spec.js +0 -1
- package/dist/project/evaluation.d.ts +0 -127
- package/dist/project/evaluation.js +0 -1
- package/dist/project/graph-builder.d.ts +0 -51
- package/dist/project/graph-builder.js +0 -1
- package/dist/project/graph.d.ts +0 -70
- package/dist/project/graph.js +0 -1
- package/dist/project/handlers.d.ts +0 -524
- package/dist/project/handlers.js +0 -1
- package/dist/project/index.d.ts +0 -91
- package/dist/project/index.js +0 -1
- package/dist/project/intent-analyzer.js +0 -1
- package/dist/project/machine-panorama.js +0 -1
- package/dist/project/merchant-guide.js +0 -1
- package/dist/project/mode-actions.js +0 -1
- package/dist/project/namespace.d.ts +0 -72
- package/dist/project/namespace.js +0 -1
- package/dist/project/object-panorama.js +0 -1
- package/dist/project/participation-radar.js +0 -1
- package/dist/project/pipeline-actions.js +0 -1
- package/dist/project/project-store.d.ts +0 -110
- package/dist/project/project-store.js +0 -1
- package/dist/project/query.d.ts +0 -43
- package/dist/project/query.js +0 -1
- package/dist/project/risk-aggregator.js +0 -1
- package/dist/project/semantic-assembler.d.ts +0 -93
- package/dist/project/semantic-assembler.js +0 -1
- package/dist/project/service-panorama.js +0 -1
- package/dist/project/stage-gate.d.ts +0 -52
- package/dist/project/stage-gate.js +0 -1
- package/dist/project/task-tracker.d.ts +0 -30
- package/dist/project/task-tracker.js +0 -1
- package/dist/schema/project/index.d.ts +0 -2021
- package/dist/schema/project/index.js +0 -1
- package/dist/schema/task-status.d.ts +0 -62
- package/dist/schema/task-status.js +0 -1
- package/dist/schemas/project_operation.output.json +0 -7877
- package/dist/schemas/project_operation.schema.json +0 -1139
- package/dist/schemas/query_task_status.output.json +0 -211
- package/dist/schemas/query_task_status.schema.json +0 -18
- package/dist/tools/handlers/project.d.ts +0 -2
- package/dist/tools/handlers/project.js +0 -1
- package/dist/tools/handlers/task-status.d.ts +0 -2
- package/dist/tools/handlers/task-status.js +0 -1
- /package/dist/{project → playbooks/service-build}/business-puzzle.d.ts +0 -0
- /package/dist/{project → playbooks/service-build}/game-theory.js +0 -0
- /package/dist/{project → playbooks/service-build}/machine-nodes.d.ts +0 -0
- /package/dist/{project → playbooks/service-build}/machine-nodes.js +0 -0
- /package/dist/{project → playbooks/service-build}/object-type.d.ts +0 -0
- /package/dist/{project → playbooks/service-build}/object-type.js +0 -0
- /package/dist/{project → playbooks/service-build}/reverse-mapping.d.ts +0 -0
- /package/dist/{project → playbooks/service-build}/reverse-mapping.js +0 -0
- /package/dist/{project → playbooks/service-build}/risk-aggregator.d.ts +0 -0
- /package/dist/{project → playbooks/service-build}/semantic-graph.js +0 -0
- /package/dist/{project → playbooks/service-build}/workflow-design-assessment.d.ts +0 -0
- /package/dist/{project → playbooks/service-build}/workflow-design-assessment.js +0 -0
- /package/dist/{project → task}/substep-trace.js +0 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { SQLiteStorage } from "@wowok/wowok/w/local";
|
|
2
|
+
import { MonitorEventStore } from "./EventStore.js";
|
|
3
|
+
import { SubscriptionStore } from "./SubscriptionStore.js";
|
|
4
|
+
import { type ResolveScopeResult } from "./ScopeResolver.js";
|
|
5
|
+
import { annotateBatch } from "./EventRouter.js";
|
|
6
|
+
import { type ProblemBridgeInput } from "./ProblemBridge.js";
|
|
7
|
+
import { type ScopeSnapshot, type SubscriptionConfig } from "./types.js";
|
|
8
|
+
export interface MonitorLoopStatus {
|
|
9
|
+
running: boolean;
|
|
10
|
+
lease_holder: string | null;
|
|
11
|
+
last_tick_at: number;
|
|
12
|
+
last_new_count: number;
|
|
13
|
+
scope_version: number;
|
|
14
|
+
backoff_ms: number;
|
|
15
|
+
}
|
|
16
|
+
export interface MonitorTickSummary {
|
|
17
|
+
captured: number;
|
|
18
|
+
annotated: number;
|
|
19
|
+
duration_ms: number;
|
|
20
|
+
}
|
|
21
|
+
export interface MonitorLoopQuery {
|
|
22
|
+
type: string;
|
|
23
|
+
cursor: {
|
|
24
|
+
eventSeq: string;
|
|
25
|
+
txDigest: string;
|
|
26
|
+
} | null;
|
|
27
|
+
limit: number;
|
|
28
|
+
order: "ascending" | "descending";
|
|
29
|
+
network?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface MonitorLoopQueryResult {
|
|
32
|
+
data?: any[];
|
|
33
|
+
hasNextPage?: boolean;
|
|
34
|
+
nextCursor?: {
|
|
35
|
+
eventSeq: string;
|
|
36
|
+
txDigest: string;
|
|
37
|
+
} | null;
|
|
38
|
+
}
|
|
39
|
+
export interface MonitorLoopDeps {
|
|
40
|
+
store: MonitorEventStore;
|
|
41
|
+
configStore: Pick<SubscriptionStore, "getConfig">;
|
|
42
|
+
storage: Pick<SQLiteStorage, "get" | "put" | "del">;
|
|
43
|
+
resolveScope(network: string, config: SubscriptionConfig): Promise<ResolveScopeResult>;
|
|
44
|
+
loadScope(network: string): Promise<ScopeSnapshot | undefined>;
|
|
45
|
+
router: {
|
|
46
|
+
annotateBatch: typeof annotateBatch;
|
|
47
|
+
backfillAnnotations: (network: string, store: MonitorEventStore, snapshot: ScopeSnapshot, windowDays: number, config: SubscriptionConfig) => Promise<{
|
|
48
|
+
rescanned: number;
|
|
49
|
+
updated: number;
|
|
50
|
+
}>;
|
|
51
|
+
};
|
|
52
|
+
queryEvents(query: MonitorLoopQuery): Promise<MonitorLoopQueryResult | undefined>;
|
|
53
|
+
defaultNetwork(): Promise<string>;
|
|
54
|
+
now(): number;
|
|
55
|
+
pid: number;
|
|
56
|
+
bootId: string;
|
|
57
|
+
logger(message: string): void;
|
|
58
|
+
openProblems?(input: ProblemBridgeInput): Promise<number>;
|
|
59
|
+
setTimer(cb: () => void, ms: number): unknown;
|
|
60
|
+
clearTimer(handle: unknown): void;
|
|
61
|
+
}
|
|
62
|
+
export declare class MonitorLoop {
|
|
63
|
+
private deps;
|
|
64
|
+
private runtimes;
|
|
65
|
+
constructor(deps?: Partial<MonitorLoopDeps>);
|
|
66
|
+
start(networks?: string[]): Promise<string[]>;
|
|
67
|
+
stop(network?: string): Promise<void>;
|
|
68
|
+
status(network?: string): MonitorLoopStatus & {
|
|
69
|
+
last_tick?: MonitorTickSummary;
|
|
70
|
+
};
|
|
71
|
+
kick(network: string): void;
|
|
72
|
+
invalidateScope(network: string): void;
|
|
73
|
+
tick(network: string): Promise<MonitorTickSummary | undefined>;
|
|
74
|
+
private schedule;
|
|
75
|
+
private acquireLease;
|
|
76
|
+
private getScope;
|
|
77
|
+
private capture;
|
|
78
|
+
}
|
|
79
|
+
export declare const monitorLoop: MonitorLoop;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{randomUUID}from'node:crypto';import{Config,SQLiteStorage}from'@wowok/wowok/w/local';import{query_events}from'@wowok/wowok';import{monitorEventStore}from'./EventStore.js';import{subscriptionStore}from'./SubscriptionStore.js';import{loadScopeSnapshot,resolveScope}from'./ScopeResolver.js';import{annotateBatch,backfillAnnotations}from'./EventRouter.js';import{bridgeMonitorProblems}from'./ProblemBridge.js';import{EVENT_MODULE_OF,MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE,normalizeMonitorEvent}from'./normalize.js';import{LOOP_DEFAULTS}from'./types.js';import{goalStore}from'../goal/GoalStore.js';import{addProblem,listProblems}from'../task/ProcessStore.js';const LEASE_PREFIX='mon_lease:v4:',SEED_PAGE=0x64,SEED_MAX=0x7d0,POLL_BATCH=0x32,MAX_BACKOFF_MS=0x493e0;function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function leaseKey(a){return''+LEASE_PREFIX+netKey(a);}function realDeps(){return{'store':monitorEventStore,'configStore':subscriptionStore,'storage':new SQLiteStorage(),'resolveScope':(a,b)=>resolveScope(a,b),'loadScope':a=>loadScopeSnapshot(a),'router':{'annotateBatch':annotateBatch,'backfillAnnotations':backfillAnnotations},'queryEvents':a=>query_events({'type':a['type'],'cursor':a['cursor'],'limit':a['limit'],'order':a['order'],'network':a['network']}),'defaultNetwork':()=>Config['Instance']()['network_get'](),'now':()=>Date['now'](),'pid':process['pid'],'bootId':randomUUID(),'logger':a=>console['error']('[monitor]\x20'+a),'openProblems':a=>bridgeMonitorProblems(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addProblem':addProblem,'listProblems':listProblems,'logger':b=>console['error']('[monitor]\x20'+b)}),'setTimer':(a,b)=>setTimeout(a,b),'clearTimer':a=>clearTimeout(a)};}function newRuntime(a){return{'network':a,'started':![],'holdsLease':![],'leaseHolder':null,'timer':undefined,'ticking':![],'scope':undefined,'lastScopeRefreshAt':0x0,'pollIntervalMs':LOOP_DEFAULTS['poll_interval_ms'],'lastTickAt':0x0,'lastNewCount':0x0,'lastSummary':undefined,'consecutiveErrors':0x0,'backoffMs':0x0};}export class MonitorLoop{['deps'];['runtimes']=new Map();constructor(a){this['deps']={...realDeps(),...a??{}};}async['start'](a){let b=a&&a['length']>0x0?a:undefined;if(!b)b=[await this['deps']['defaultNetwork']()];for(const c of b){const d=netKey(c);if(this['runtimes']['has'](d)){const f=this['runtimes']['get'](d);if(f['started'])continue;f['started']=!![],this['schedule'](f,0x0);continue;}const e=newRuntime(c);e['started']=!![],this['runtimes']['set'](d,e);try{const g=await this['deps']['loadScope'](c);g&&(e['scope']=g,e['lastScopeRefreshAt']=Number(g['resolved_at'])||0x0);}catch{}this['schedule'](e,0x0);}return b;}async['stop'](a){const b=a?[netKey(a)]:[...this['runtimes']['keys']()];for(const c of b){const d=this['runtimes']['get'](c);if(!d)continue;d['started']=![];d['timer']!==undefined&&(this['deps']['clearTimer'](d['timer']),d['timer']=undefined);if(d['holdsLease']){d['holdsLease']=![];try{await this['deps']['storage']['del'](leaseKey(d['network']));}catch{}}this['runtimes']['delete'](c);}}['status'](a){const b=a?this['runtimes']['get'](netKey(a)):[...this['runtimes']['values']()][0x0];if(!b)return{'running':![],'lease_holder':null,'last_tick_at':0x0,'last_new_count':0x0,'scope_version':0x0,'backoff_ms':0x0};return{'running':b['started']&&b['holdsLease'],'lease_holder':b['leaseHolder']?b['leaseHolder']['pid']+':'+b['leaseHolder']['boot_id']:null,'last_tick_at':b['lastTickAt'],'last_new_count':b['lastNewCount'],'scope_version':b['scope']?.['version']??0x0,'backoff_ms':b['backoffMs'],...b['lastSummary']?{'last_tick':b['lastSummary']}:{}};}['kick'](a){const b=this['runtimes']['get'](netKey(a));if(!b||!b['started']||!b['holdsLease']||b['ticking'])return;if(this['deps']['now']()-b['lastTickAt']<b['pollIntervalMs'])return;void this['tick'](b['network']);}['invalidateScope'](a){const b=this['runtimes']['get'](netKey(a));if(!b)return;b['scope']=undefined,b['lastScopeRefreshAt']=0x0;}async['tick'](a){const b=netKey(a);let c=this['runtimes']['get'](b);!c&&(c=newRuntime(a),this['runtimes']['set'](b,c));if(c['ticking'])return undefined;c['ticking']=!![];const d=this['deps']['now']();try{const f=await this['deps']['configStore']['getConfig'](a),g=Number(f['loop']?.['poll_interval_ms'])||LOOP_DEFAULTS['poll_interval_ms'];c['pollIntervalMs']=g;const h=await this['acquireLease'](c,g);if(!h)return undefined;const {newCount:i,events:j}=await this['capture'](c,f),k=await this['getScope'](c,f);let l=0x0,m=[];if(i>0x0&&j['length']>0x0){const p=this['deps']['router']['annotateBatch'](j,k,f)['filter'](q=>q['rules']['length']>0x0||q['focus_hit']||q['matched_filters']['length']>0x0);p['length']>0x0&&(await this['deps']['store']['saveAnnotations'](a,p),l=p['length'],m=p);}if(m['length']>0x0&&this['deps']['openProblems'])try{await this['deps']['openProblems']({'network':a,'events':j,'annotations':m,'scope':k});}catch(q){this['deps']['logger']('monitor\x20loop:\x20problem\x20bridge\x20error\x20on\x20'+a+':\x20'+String(q?.['message']??q));}const n=Number(f['loop']?.['scope_refresh_ms'])||LOOP_DEFAULTS['scope_refresh_ms'];if(this['deps']['now']()-c['lastScopeRefreshAt']>=n){c['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:s,changed:t}=await this['deps']['resolveScope'](a,f);c['scope']=s;if(t){const u=Number(f['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']),v=await this['deps']['router']['backfillAnnotations'](a,this['deps']['store'],s,u,f);this['deps']['logger']('monitor\x20loop:\x20scope\x20v'+s['version']+'\x20on\x20'+a+'\x20changed\x20—\x20backfill\x20rescanned\x20'+v['rescanned']+',\x20updated\x20'+v['updated']);}}c['lastTickAt']=this['deps']['now'](),c['lastNewCount']=i,c['consecutiveErrors']=0x0,c['backoffMs']=0x0;const o={'captured':j['length'],'annotated':l,'duration_ms':this['deps']['now']()-d};return c['lastSummary']=o,o;}catch(w){const x=String(w?.['message']??w);return this['deps']['logger']('monitor\x20loop:\x20tick\x20error\x20on\x20'+a+':\x20'+x),c['consecutiveErrors']+=0x1,c['backoffMs']=Math['min'](c['pollIntervalMs']*0x2**c['consecutiveErrors'],MAX_BACKOFF_MS),undefined;}finally{c['ticking']=![],c['started']&&this['schedule'](c,c['backoffMs']>0x0?c['backoffMs']:c['pollIntervalMs']);}}['schedule'](a,b){if(a['timer']!==undefined)this['deps']['clearTimer'](a['timer']);const c=this['deps']['setTimer'](()=>{a['timer']=undefined,void this['tick'](a['network']);},Math['max'](0x0,b));c?.['unref']?.(),a['timer']=c;}async['acquireLease'](a,b){const c=leaseKey(a['network']),d=this['deps']['now']();let e;try{const i=await this['deps']['storage']['get'](c);e=i?JSON['parse'](i):undefined;}catch{e=undefined;}const f={'pid':this['deps']['pid'],'boot_id':this['deps']['bootId']},g=!!e&&e['boot_id']===f['boot_id']&&e['pid']===f['pid'],h=!e||d-Number(e['heartbeat_at']??0x0)>0x2*b;if(g||h)return await this['deps']['storage']['put'](c,JSON['stringify']({...f,'heartbeat_at':d})),a['holdsLease']=!![],a['leaseHolder']=f,!![];return a['holdsLease']=![],a['leaseHolder']={'pid':e['pid'],'boot_id':e['boot_id']},![];}async['getScope'](a,b){if(!a['scope'])try{const c=await this['deps']['loadScope'](a['network']);c&&(a['scope']=c,a['lastScopeRefreshAt']=Number(c['resolved_at'])||0x0);}catch{}if(!a['scope']){a['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:d,changed:e}=await this['deps']['resolveScope'](a['network'],b);a['scope']=d;if(e){const f=Number(b['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']);await this['deps']['router']['backfillAnnotations'](a['network'],this['deps']['store'],d,f,b);}}return a['scope'];}async['capture'](a,b){const c=a['network'],d=await this['deps']['store']['getCursors'](c);let f=0x0;const g=[],h=[...MONITOR_CAPTURE_TYPES];if(b['events']?.[PAYMENT_EVENT_TYPE]===!![])h['push'](PAYMENT_EVENT_TYPE);for(const i of h){const j=EVENT_MODULE_OF[i];if(!j)continue;try{const k=d['cursors'][i];let l=null;if(!k){let m=null,n=0x0;while(n<SEED_MAX){const o=await this['deps']['queryEvents']({'type':i,'cursor':m,'limit':Math['min'](SEED_PAGE,SEED_MAX-n),'order':'descending','network':c}),p=(o?.['data']??[])['map'](q=>normalizeMonitorEvent(q));if(p['length']===0x0)break;if(l===null)l=p[0x0];n+=p['length'],f+=await this['deps']['store']['insert'](c,j,p),g['push'](...p);if(!o?.['hasNextPage']||!o?.['nextCursor'])break;m=o['nextCursor'];}}else{const q=await this['deps']['queryEvents']({'type':i,'cursor':k,'limit':POLL_BATCH,'order':'ascending','network':c}),r=(q?.['data']??[])['map'](s=>normalizeMonitorEvent(s));f+=await this['deps']['store']['insert'](c,j,r),g['push'](...r);if(r['length']>0x0)l=r[r['length']-0x1];}if(l?.['id']){const s=d['cursors'][i];(!s||BigInt(l['id']['eventSeq'])>BigInt(s['eventSeq']||'0'))&&(d['cursors'][i]={'eventSeq':String(l['id']['eventSeq']),'txDigest':String(l['id']['txDigest'])});}}catch(t){const u=String(t?.['message']??t);this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20poll\x20error:\x20'+u),/referenced transaction/i['test'](u)&&(delete d['cursors'][i],this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20cursor\x20invalid\x20—\x20dropped,\x20will\x20re-seed\x20next\x20cycle'));}}return await this['deps']['store']['saveCursors'](c,d['cursors'],this['deps']['now']()),{'newCount':f,'events':g};}}export const monitorLoop=new MonitorLoop();
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { GoalRecord } from "../goal/types.js";
|
|
2
|
+
import type { ProblemRecord } from "../task/types.js";
|
|
3
|
+
import type { RelevanceAnnotation, ScopeSnapshot } from "./types.js";
|
|
4
|
+
export interface AnomalyClassification {
|
|
5
|
+
severity: ProblemRecord["severity"];
|
|
6
|
+
title: string;
|
|
7
|
+
detail: string;
|
|
8
|
+
object: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function classifyAnomaly(ev: any): AnomalyClassification | null;
|
|
11
|
+
export interface ProblemBridgeDeps {
|
|
12
|
+
getGoal(network: string, id: string): Promise<GoalRecord | undefined>;
|
|
13
|
+
addProblem(dir: string, input: {
|
|
14
|
+
stage?: string;
|
|
15
|
+
object?: string;
|
|
16
|
+
severity: ProblemRecord["severity"];
|
|
17
|
+
title: string;
|
|
18
|
+
detail?: string;
|
|
19
|
+
origin?: ProblemRecord["origin"];
|
|
20
|
+
}): ProblemRecord;
|
|
21
|
+
listProblems(dir: string, filter?: {
|
|
22
|
+
status?: ProblemRecord["status"];
|
|
23
|
+
}): ProblemRecord[];
|
|
24
|
+
logger(message: string): void;
|
|
25
|
+
}
|
|
26
|
+
export interface ProblemBridgeInput {
|
|
27
|
+
network: string;
|
|
28
|
+
events: any[];
|
|
29
|
+
annotations: RelevanceAnnotation[];
|
|
30
|
+
scope: ScopeSnapshot;
|
|
31
|
+
}
|
|
32
|
+
export declare function bridgeMonitorProblems(input: ProblemBridgeInput, deps: ProblemBridgeDeps): Promise<number>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{monitorEventId}from'./EventStore.js';const ARB_STATUS_PRINCIPAL_CONFIRMING=0x0,ARB_STATUS_VOTING=0x2,ARB_STATUS_OBJECTIONABLE=0x4;export function classifyAnomaly(a){if(!a||typeof a!=='object')return null;if(a['type']==='ArbEvent'){const b=Number(a['status']),c=typeof a['order']==='string'?a['order']:null,d=typeof a['arb']==='string'?a['arb']:null,e=c??d;if(!e)return null;if(b===ARB_STATUS_PRINCIPAL_CONFIRMING)return{'severity':'high','title':'Arbitration\x20opened\x20on\x20a\x20monitored\x20order','detail':'Dispute\x20opened\x20(ArbEvent\x20Principal_confirming)\x20on\x20'+e+(a['arbitration']?'\x20—\x20arbitration\x20'+a['arbitration']:'')+'.\x20Parties\x20should\x20prepare\x20evidence;\x20see\x20the\x20order\x27s\x20Arb\x20object.','object':e};if(b===ARB_STATUS_OBJECTIONABLE)return{'severity':'high','title':'Arbitration\x20verdict\x20marked\x20objectionable','detail':'An\x20arbitrated\x20verdict\x20on\x20'+e+'\x20was\x20contested\x20(ArbEvent\x20Objectionable)'+'.\x20Re-read\x20the\x20Arb\x20object\x20—\x20the\x20case\x20re-enters\x20resolution.','object':e};if(b===ARB_STATUS_VOTING)return{'severity':'medium','title':'Arbitration\x20voting\x20started','detail':'Voting\x20opened\x20on\x20the\x20arbitration\x20covering\x20'+e+'.\x20Voters/parties\x20should\x20act\x20(vote,\x20submit\x20evidence)\x20before\x20it\x20closes.','object':e};return null;}return null;}const EVENT_OBJECT_FIELDS=['order','arb','arbitration','object','service','demand','progress','machine'];export async function bridgeMonitorProblems(b,c){const {network:d,events:g,annotations:h,scope:i}=b;try{const j=new Set(h['map'](n=>n['event_id'])),k=new Map();for(const n of h){k['set'](n['event_id'],n['rules']['map'](o=>o['object']));}const l=new Map();for(const o of i['focus']??[]){if(o['goal_id']&&o['object'])l['set'](o['object'],o['goal_id']);}if(l['size']===0x0)return 0x0;const m=[];for(const p of g){const q=monitorEventId(p?.['id']);if(!q||!j['has'](q))continue;const r=classifyAnomaly(p);if(!r)continue;const s=[...k['get'](q)??[],...EVENT_OBJECT_FIELDS['map'](x=>p[x])['filter'](x=>typeof x==='string'&&x['length']>0x0)];let t;for(const x of s){const y=l['get'](x);if(y){t=y;break;}}if(!t)continue;const u=await c['getGoal'](d,t),v=u?.['process']?.['dir'];if(!u||!v)continue;const w=c['listProblems'](v)['some'](z=>z['origin']?.['source']==='monitor'&&z['origin']?.['event_id']===q);if(w)continue;c['addProblem'](v,{'object':r['object'],'severity':r['severity'],'title':r['title'],'detail':r['detail'],'origin':{'source':'monitor','network':d,'event_id':q,'event_type':String(p['type']??'unknown')}}),m['push'](q);}return m['length']>0x0&&c['logger']('problem\x20bridge:\x20opened\x20'+m['length']+'\x20problem(s)\x20on\x20'+d+'\x20from\x20monitor\x20anomalies'),m['length'];}catch(z){return c['logger']('problem\x20bridge:\x20skipped\x20('+String(z?.['message']??z)+')'),0x0;}}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { SQLiteStorage } from "@wowok/wowok/w/local";
|
|
2
|
+
import { MonitorEventStore } from "./EventStore.js";
|
|
3
|
+
import { type ScopeSnapshot, type SubscriptionConfig } from "./types.js";
|
|
4
|
+
export interface ScopeResolverDeps {
|
|
5
|
+
listLocalAccounts(): Promise<{
|
|
6
|
+
address: string;
|
|
7
|
+
name?: string;
|
|
8
|
+
}[]>;
|
|
9
|
+
fetchEntityPermission(addr: string, network?: string): Promise<{
|
|
10
|
+
items: {
|
|
11
|
+
permission: string;
|
|
12
|
+
role?: number;
|
|
13
|
+
time?: number;
|
|
14
|
+
}[];
|
|
15
|
+
} | undefined>;
|
|
16
|
+
fetchObjectLinkerCore(target: string, network?: string): Promise<{
|
|
17
|
+
items: {
|
|
18
|
+
who: string;
|
|
19
|
+
}[];
|
|
20
|
+
} | undefined>;
|
|
21
|
+
fetchObjectLinkerTx(target: string, network?: string): Promise<{
|
|
22
|
+
items: {
|
|
23
|
+
who: string;
|
|
24
|
+
}[];
|
|
25
|
+
} | undefined>;
|
|
26
|
+
queryServiceOrders(query: {
|
|
27
|
+
address: string;
|
|
28
|
+
network?: string;
|
|
29
|
+
}): Promise<{
|
|
30
|
+
items: {
|
|
31
|
+
who: string;
|
|
32
|
+
}[];
|
|
33
|
+
} | undefined>;
|
|
34
|
+
queryOrdersByUser(query: {
|
|
35
|
+
address: string;
|
|
36
|
+
network?: string;
|
|
37
|
+
}): Promise<{
|
|
38
|
+
is_owner: boolean;
|
|
39
|
+
is_agent: boolean;
|
|
40
|
+
time?: number;
|
|
41
|
+
order: any;
|
|
42
|
+
}[]>;
|
|
43
|
+
queryObjects(query: {
|
|
44
|
+
objects: string[];
|
|
45
|
+
network?: string;
|
|
46
|
+
}): Promise<{
|
|
47
|
+
objects?: any[];
|
|
48
|
+
}>;
|
|
49
|
+
objectTypeFromAddress(addr: string): string | null;
|
|
50
|
+
store: Pick<MonitorEventStore, "list">;
|
|
51
|
+
storage: Pick<SQLiteStorage, "get" | "put">;
|
|
52
|
+
now(): number;
|
|
53
|
+
}
|
|
54
|
+
export interface ResolveScopeResult {
|
|
55
|
+
snapshot: ScopeSnapshot;
|
|
56
|
+
changed: boolean;
|
|
57
|
+
}
|
|
58
|
+
export declare function loadScopeSnapshot(network: string, storage?: Pick<SQLiteStorage, "get">): Promise<ScopeSnapshot | undefined>;
|
|
59
|
+
export declare function resolveScope(network: string, config: SubscriptionConfig, deps?: Partial<ScopeResolverDeps>): Promise<ResolveScopeResult>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{SQLiteStorage}from'@wowok/wowok/w/local';import{query_objects,queryOrdersByUser,queryTableItem_ServiceOrders,objectTypeFromAddress}from'@wowok/wowok';import{fetchEntityPermission,fetchObjectLinkerCore,fetchObjectLinkerTx,listLocalAccounts}from'../knowledge/workflow-guidance.js';import{monitorEventStore}from'./EventStore.js';import{LOOP_DEFAULTS,normalizeAddr,shortId}from'./types.js';const SCOPE_PREFIX='mon_scope:v4:',SCOPE_HIST_PREFIX='mon_scope_hist:v4:',SCOPE_HISTORY_KEEP=0x5,FAVOR_SCAN_MAX=0x1388;function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function realDeps(){return{'listLocalAccounts':()=>listLocalAccounts(),'fetchEntityPermission':(a,b)=>fetchEntityPermission(a,b),'fetchObjectLinkerCore':(a,b)=>fetchObjectLinkerCore(a,b),'fetchObjectLinkerTx':(a,b)=>fetchObjectLinkerTx(a,b),'queryServiceOrders':a=>queryTableItem_ServiceOrders({'address':a['address'],'network':a['network']}),'queryOrdersByUser':a=>queryOrdersByUser({'address':a['address'],'network':a['network']}),'queryObjects':a=>query_objects({'objects':a['objects'],'network':a['network']}),'objectTypeFromAddress':a=>objectTypeFromAddress(a),'store':monitorEventStore,'storage':new SQLiteStorage(),'now':()=>Date['now']()};}function canonicalize(a){if(Array['isArray'](a))return a['map'](canonicalize)['sort']((c,d)=>{const e=JSON['stringify'](c),f=JSON['stringify'](d);return e<f?-0x1:e>f?0x1:0x0;});if(a&&typeof a==='object'){const b={};for(const c of Object['keys'](a)['sort']()){b[c]=canonicalize(a[c]);}return b;}return a;}function semanticHashOf(a){return JSON['stringify'](canonicalize({'accounts':a['accounts'],'permissions':a['permissions'],'managed_objects':a['managed_objects'],'services':a['services'],'orders':a['orders'],'order_children':a['order_children'],'focus':a['focus']}));}function lowerTypeOf(a,b){try{return a['objectTypeFromAddress'](b)?.['toLowerCase']()??null;}catch{return null;}}function objectFields(a){return a?.['data']??a??{};}function childrenOfOrder(a){const b=[],c=Array['isArray'](a?.['dispute'])?a['dispute']:[];for(const e of c){if(typeof e==='string'&&e)b['push']({'type':'arb','object':e});}return typeof a?.['progress']==='string'&&a['progress']&&b['push']({'type':'progress','object':a['progress']}),typeof a?.['allocation']==='string'&&a['allocation']&&b['push']({'type':'allocation','object':a['allocation']}),b;}export async function loadScopeSnapshot(a,b){try{const c=await(b??new SQLiteStorage())['get'](''+SCOPE_PREFIX+netKey(a));if(!c)return undefined;const d=JSON['parse'](c);return d&&typeof d['version']==='number'?d:undefined;}catch{return undefined;}}export async function resolveScope(a,b,e){const g={...realDeps(),...e??{}},h=g['now'](),j=[],k=async(N,O)=>{try{return await O();}catch{return j['push'](N),undefined;}},l=''+SCOPE_PREFIX+netKey(a),n=''+SCOPE_HIST_PREFIX+netKey(a);let p;try{const N=await g['storage']['get'](l);p=N?JSON['parse'](N):undefined;}catch{p=undefined;}let q;if(b['scope']['accounts']==='local-all'){const O=await k('accounts',()=>g['listLocalAccounts']());q=(O??[])['map'](P=>P['address'])['filter'](P=>typeof P==='string'&&P);}else q=[...b['scope']['accounts']];q=[...new Set(q)];const s=b['scope']['rules'],t=[],u=[],w=new Map();if(s['managed_objects']||s['merchant_orders']){for(const R of q){const S=await k('entity_permission:'+shortId(R),()=>g['fetchEntityPermission'](R,a));for(const T of S?.['items']??[]){if(T?.['permission'])t['push'](T['permission']);}}const P=[...new Set(t)];t['length']=0x0,t['push'](...P);const Q=new Set();for(const U of P){const V=await k('object_linker_core:'+shortId(U),()=>g['fetchObjectLinkerCore'](U,a)),W=await k('object_linker_tx:'+shortId(U),()=>g['fetchObjectLinkerTx'](U,a)),X=[...(V?.['items']??[])['map'](Y=>Y?.['who']),...(W?.['items']??[])['map'](Y=>Y?.['who'])];for(const Y of X){if(typeof Y!=='string'||!Y)continue;const Z=lowerTypeOf(g,Y);if(!Z)continue;const a0=normalizeAddr(Y);if(Q['has'](a0))continue;Q['add'](a0),u['push']({'type':Z,'object':Y}),w['set'](a0,U);}}}const x=u['filter'](a1=>a1['type']==='service')['map'](a1=>a1['object']),y=new Map(),z=(a1,a2)=>{const a3=normalizeAddr(a1);if(!a3)return;const a4=y['get'](a3)??{'order':a1,'merchant':![],'buyer':![]};a4[a2]=!![],y['set'](a3,a4);};if(s['merchant_orders'])for(const a1 of x){const a2=await k('service_orders:'+shortId(a1),()=>g['queryServiceOrders']({'address':a1,'network':a}));for(const a3 of a2?.['items']??[]){if(typeof a3?.['who']==='string'&&a3['who'])z(a3['who'],'merchant');}}if(s['my_orders'])for(const a4 of q){const a5=await k('user_orders:'+shortId(a4),()=>g['queryOrdersByUser']({'address':a4,'network':a}));for(const a6 of a5??[]){if(!a6?.['is_owner']&&!a6?.['is_agent'])continue;const a7=a6?.['order']?.['object']??a6?.['order']?.['id'];if(typeof a7==='string'&&a7)z(a7,'buyer');}}const A=[...y['values']()]['map'](a8=>({'order':a8['order'],'role':a8['merchant']&&a8['buyer']?'both':a8['merchant']?'merchant':'buyer'})),B=[],C=new Map();if(s['order_children']&&y['size']>0x0){const a8=[...y['values']()]['map'](a9=>a9['order']);for(let a9=0x0;a9<a8['length'];a9+=0x32){const aa=a8['slice'](a9,a9+0x32),ab=await k('order_objects:'+shortId(aa[0x0]),()=>g['queryObjects']({'objects':aa,'network':a}));for(const ac of ab?.['objects']??[]){const ad=objectFields(ac),ae=ac?.['object']??ad?.['object']??ad?.['id'];if(typeof ae!=='string'||!ae)continue;for(const af of childrenOfOrder(ad)){const ag=normalizeAddr(af['object']);if(C['has'](ag))continue;C['set'](ag,ae),B['push'](af);}}}}const D=(b['scope']['focus_objects']??[])['map'](ah=>({...ah})),E=new Set(D['map'](ah=>normalizeAddr(ah['object']))),F=new Map();for(const ah of p?.['focus']??[]){if(ah?.['reason']==='favor'&&ah['object'])F['set'](normalizeAddr(ah['object']),ah['added_at']);}if(s['favor_objects']&&q['length']>0x0){const ai=Number(b['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']),aj=h-Math['max'](0x0,ai)*0x5265c00,ak=new Set(q['map'](al=>normalizeAddr(al)));try{let al=0x0;for(;;){const am=await g['store']['list'](a,{'module':'arb','eventType':'FeedbackEvent','since':aj,'offset':al,'limit':0xc8});if(am['events']['length']===0x0)break;for(const an of am['events']){const ao=an['event'],ap=normalizeAddr(ao?.['sender']);if(!ap||!ak['has'](ap))continue;const aq=ao?.['object'],ar=normalizeAddr(typeof aq==='string'?aq:'');if(!ar||E['has'](ar))continue;E['add'](ar),D['push']({'object':aq,'added_at':F['get'](ar)??h,'reason':'favor','closure':!![]});}al+=am['events']['length'];if(al>=am['total']||al>=FAVOR_SCAN_MAX)break;}}catch{j['push']('favor_scan');}}const G={},H=(as,at)=>{const au=normalizeAddr(as);if(!au)return;const av=G[au]??=[],aw=av['some'](ax=>ax['rule']===at['rule']&&normalizeAddr(ax['object'])===normalizeAddr(at['object']));if(!aw)av['push'](at);};if(s['managed_objects'])for(const as of u){const at=w['get'](normalizeAddr(as['object']));H(as['object'],{'rule':'managed_objects','object':as['object'],'detail':at?as['type']+'\x20'+shortId(as['object'])+'\x20of\x20permission\x20'+shortId(at):as['type']+'\x20'+shortId(as['object'])+'\x20(managed)'});}for(const au of A){(au['role']==='merchant'||au['role']==='both')&&H(au['order'],{'rule':'merchant_orders','object':au['order'],'detail':'order\x20'+shortId(au['order'])+'\x20(merchant)'}),(au['role']==='buyer'||au['role']==='both')&&H(au['order'],{'rule':'my_orders','object':au['order'],'detail':'order\x20'+shortId(au['order'])+'\x20(buyer)'});}if(s['order_children'])for(const av of B){const aw=C['get'](normalizeAddr(av['object']));H(av['object'],{'rule':'order_children','object':av['object'],'detail':aw?av['type']+'\x20'+shortId(av['object'])+'\x20of\x20order\x20'+shortId(aw):av['type']+'\x20'+shortId(av['object'])+'\x20(order\x20child)'});}for(const ax of D){const ay=lowerTypeOf(g,ax['object']);H(ax['object'],{'rule':'focus','object':ax['object'],'detail':'focused\x20'+(ay??'object')+'\x20'+shortId(ax['object'])});if(!ax['closure'])continue;if(ay==='service'){const az=await k('focus_service_orders:'+shortId(ax['object']),()=>g['queryServiceOrders']({'address':ax['object'],'network':a}));for(const aA of az?.['items']??[]){if(typeof aA?.['who']!=='string'||!aA['who'])continue;H(aA['who'],{'rule':'focus','object':aA['who'],'detail':'order\x20'+shortId(aA['who'])+'\x20of\x20focused\x20service\x20'+shortId(ax['object'])});}}else{if(ay==='order'){const aB=await k('focus_order:'+shortId(ax['object']),()=>g['queryObjects']({'objects':[ax['object']],'network':a})),aC=objectFields(aB?.['objects']?.[0x0]);for(const aD of childrenOfOrder(aC)){H(aD['object'],{'rule':'focus','object':aD['object'],'detail':aD['type']+'\x20'+shortId(aD['object'])+'\x20of\x20focused\x20order\x20'+shortId(ax['object'])});}}}}const I={'accounts':q,'permissions':t,'managed_objects':u,'services':x,'orders':A,'order_children':B,'focus':D},J=semanticHashOf(I),K=!p||semanticHashOf(p)!==J,L=p?K?p['version']+0x1:p['version']:0x1,M={'version':L,'resolved_at':h,...I,'index':G,...j['length']>0x0?{'data_gaps':j}:{}};try{await g['storage']['put'](l,JSON['stringify'](M));if(K){let aE=[];try{const aF=await g['storage']['get'](n),aG=aF?JSON['parse'](aF):undefined;aE=Array['isArray'](aG?.['snapshots'])?aG['snapshots']:[];}catch{aE=[];}aE['unshift'](M),await g['storage']['put'](n,JSON['stringify']({'snapshots':aE['slice'](0x0,SCOPE_HISTORY_KEEP)}));}}catch{j['push']('snapshot_persist');}return{'snapshot':M,'changed':K};}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SQLiteStorage } from "@wowok/wowok/w/local";
|
|
2
|
+
import { type SubscriptionConfig } from "./types.js";
|
|
3
|
+
export declare function clampLoopParams(loop: SubscriptionConfig["loop"]): SubscriptionConfig["loop"];
|
|
4
|
+
export declare function mergeSubscriptionConfig(base: SubscriptionConfig, partial?: Partial<SubscriptionConfig> | null): SubscriptionConfig;
|
|
5
|
+
export declare class SubscriptionStore {
|
|
6
|
+
private storage;
|
|
7
|
+
constructor(storage?: SQLiteStorage);
|
|
8
|
+
private cfgKey;
|
|
9
|
+
getConfig(network: string): Promise<SubscriptionConfig>;
|
|
10
|
+
saveConfig(network: string, partial: Partial<SubscriptionConfig>): Promise<SubscriptionConfig>;
|
|
11
|
+
resetConfig(network: string): Promise<SubscriptionConfig>;
|
|
12
|
+
}
|
|
13
|
+
export declare const subscriptionStore: SubscriptionStore;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{SQLiteStorage}from'@wowok/wowok/w/local';import{defaultSubscriptionConfig,LOOP_DEFAULTS,LOOP_MIN}from'./types.js';const CFG_PREFIX='mon_cfg:v4:';function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}export function clampLoopParams(a){const b={...a??{}},c=Number(b['poll_interval_ms']);b['poll_interval_ms']=Number['isFinite'](c)?Math['max'](LOOP_MIN['poll_interval_ms'],Math['floor'](c)):LOOP_DEFAULTS['poll_interval_ms'];const d=Number(b['scope_refresh_ms']);b['scope_refresh_ms']=Number['isFinite'](d)?Math['max'](LOOP_MIN['scope_refresh_ms'],Math['floor'](d)):LOOP_DEFAULTS['scope_refresh_ms'];const e=Number(b['backfill_days']);return b['backfill_days']=Number['isFinite'](e)?Math['max'](LOOP_MIN['backfill_days'],Math['floor'](e)):LOOP_DEFAULTS['backfill_days'],b;}export function mergeSubscriptionConfig(a,b){const c=b??{};return{'version':0x2,'enabled':typeof c['enabled']==='boolean'?c['enabled']:a['enabled'],'scope':{'accounts':c['scope']?.['accounts']??a['scope']['accounts'],'rules':{...a['scope']['rules'],...c['scope']?.['rules']??{}},'focus_objects':(c['scope']?.['focus_objects']??a['scope']['focus_objects'])['map'](d=>({...d}))},'events':{...a['events'],...c['events']??{}},'filters':(c['filters']??a['filters'])['map'](d=>({...d})),'loop':clampLoopParams({...a['loop'],...c['loop']??{}})};}export class SubscriptionStore{['storage'];constructor(a){this['storage']=a??new SQLiteStorage();}['cfgKey'](a){return''+CFG_PREFIX+netKey(a);}async['getConfig'](a){let b;try{const c=await this['storage']['get'](this['cfgKey'](a));b=c?JSON['parse'](c):undefined;}catch{b=undefined;}return mergeSubscriptionConfig(defaultSubscriptionConfig(),b);}async['saveConfig'](a,b){const c=mergeSubscriptionConfig(await this['getConfig'](a),b);return await this['storage']['put'](this['cfgKey'](a),JSON['stringify'](c)),c;}async['resetConfig'](a){const b=defaultSubscriptionConfig();return await this['storage']['put'](this['cfgKey'](a),JSON['stringify'](b)),b;}}export const subscriptionStore=new SubscriptionStore();
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { MonitorEventModule } from "./types.js";
|
|
2
|
+
export declare const MONITOR_CAPTURE_TYPES: readonly ["NewOrderEvent", "ArbEvent", "VoteEvent", "FeedbackEvent", "DemandPresentEvent", "DemandFeedbackEvent", "DemandChangedEvent", "ProgressEvent", "AllocationEvent", "TreasuryEvent", "RewardClaimEvent", "RewardFundEvent", "ServiceEvent", "NewEntityEvent"];
|
|
3
|
+
export declare const PAYMENT_EVENT_TYPE = "NewPaymentEvent";
|
|
4
|
+
export declare const MONITOR_KNOWN_TYPES: readonly string[];
|
|
5
|
+
export declare const EVENT_MODULE_OF: Record<string, MonitorEventModule>;
|
|
6
|
+
export declare function monitorEventShortType(typeRaw: unknown): string | null;
|
|
7
|
+
export declare function normalizeMonitorEvent(ev: any): any;
|
|
8
|
+
export declare const EVENT_ADDRESS_FIELDS: readonly string[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const MONITOR_CAPTURE_TYPES=['NewOrderEvent','ArbEvent','VoteEvent','FeedbackEvent','DemandPresentEvent','DemandFeedbackEvent','DemandChangedEvent','ProgressEvent','AllocationEvent','TreasuryEvent','RewardClaimEvent','RewardFundEvent','ServiceEvent','NewEntityEvent'];export const PAYMENT_EVENT_TYPE='NewPaymentEvent';export const MONITOR_KNOWN_TYPES=[...MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE];export const EVENT_MODULE_OF={'NewOrderEvent':'order','ArbEvent':'arb','VoteEvent':'arb','FeedbackEvent':'arb','DemandPresentEvent':'demand','DemandFeedbackEvent':'demand','DemandChangedEvent':'demand','ProgressEvent':'progress','AllocationEvent':'treasury','TreasuryEvent':'treasury','RewardClaimEvent':'reward','RewardFundEvent':'reward','ServiceEvent':'service','NewEntityEvent':'entity','NewPaymentEvent':'payment'};export function monitorEventShortType(a){if(!a||typeof a!=='string')return null;if(a['includes']('::order::NewOrderEvent'))return'NewOrderEvent';if(a['includes']('::demand::PresentEvent'))return'DemandPresentEvent';if(a['includes']('::demand::DemandChangedEvent'))return'DemandChangedEvent';if(a['includes']('::demand::DemandEvent'))return'DemandFeedbackEvent';if(a['includes']('::progress::ProgressEvent'))return'ProgressEvent';if(a['includes']('::arb::VoteEvent'))return'VoteEvent';if(a['includes']('::arb::FeedbackEvent'))return'FeedbackEvent';if(a['includes']('::arb::ArbEvent'))return'ArbEvent';if(a['includes']('::registrar::NewEntityEvent'))return'NewEntityEvent';if(a['includes']('::service::ServiceEvent'))return'ServiceEvent';if(a['includes']('::allocation::AllocationEvent'))return'AllocationEvent';if(a['includes']('::treasury::TreasuryEvent'))return'TreasuryEvent';if(a['includes']('::reward::RewardClaimEvent'))return'RewardClaimEvent';if(a['includes']('::reward::RewardFundEvent'))return'RewardFundEvent';if(a['includes']('::payment::NewPaymentEvent'))return'NewPaymentEvent';return null;}export function normalizeMonitorEvent(a){if(!a||typeof a!=='object')return a;if(MONITOR_KNOWN_TYPES['includes'](a['type'])&&!a['parsedJson_raw'])return a;const b=MONITOR_KNOWN_TYPES['includes'](a['type'])?a['type']:monitorEventShortType(a['type_raw']??a['type']);if(!b)return a;const c=a['parsedJson_raw']??{},d=f=>f&&typeof f==='object'&&!Array['isArray'](f)&&'some'in f?f['some']:f,e={...a,'type':b};switch(b){case'NewOrderEvent':return{...e,'order':d(c['object']),'service':d(c['service'])??null,'progress':d(c['progress'])??null,'discount':d(c['discount'])??null,'allocation':d(c['allocation'])??null,'amount':d(c['amount'])??null};case'DemandPresentEvent':return{...e,'demand':d(c['object']),'service':d(c['service'])??null,'recommend':d(c['recommend'])??null};case'DemandFeedbackEvent':return{...e,'demand':d(c['object']),'service':d(c['service'])??null,'feedback':d(c['feedback'])??null,'acceptance_score':d(c['acceptance_score'])??null};case'ProgressEvent':return{...e,'progress':d(c['object']),'machine':d(c['machine'])??null,'task':d(c['task'])??null,'node':d(c['node'])??null,'forward':d(c['forward'])??null,'hold':d(c['hold'])??null};case'ArbEvent':return{...e,'arb':d(c['object']),'arbitration':d(c['arbitration'])??null,'order':d(c['order'])??null,'status':d(c['status'])??null};case'NewEntityEvent':return{...e,'resource':d(c['resource'])??null,'address':a['sender'],'referrer':d(c['referrer'])??null};case'ServiceEvent':return{...e,'object':d(c['object']),'location':d(c['location'])??null,'description':d(c['description'])??null};case'DemandChangedEvent':return{...e,'object':d(c['object']),'location':d(c['location'])??null,'description':d(c['description'])??null,'rewards':d(c['rewards'])??[]};case'VoteEvent':return{...e,'object':d(c['object']),'voter':d(c['voter'])??null,'agrees':d(c['agrees'])??[],'weight':d(c['weight'])??null};case'FeedbackEvent':return{...e,'object':d(c['object']),'feedback':d(c['feedback'])??null};case'AllocationEvent':return{...e,'object':d(c['object']),'payment':d(c['payment'])??null,'guard':d(c['guard'])??null,'amount':d(c['amount'])??null};case'TreasuryEvent':return{...e,'object':d(c['object']),'op':d(c['op'])??null,'payment':d(c['payment'])??null,'amount':d(c['amount'])??null,'external_guard':d(c['external_guard'])??null,'store_from_id':d(c['store_from_id'])??null};case'RewardClaimEvent':return{...e,'object':d(c['object']),'guard':d(c['guard'])??null,'recipient':d(c['recipient'])??null,'amount':d(c['amount'])??null,'total':d(c['total'])??null,'balance_left':d(c['balance_left'])??null,'store_from_id':d(c['store_from_id'])??null};case'RewardFundEvent':return{...e,'object':d(c['object']),'amount':d(c['amount'])??null,'balance':d(c['balance'])??null,'from_payment':d(c['from_payment'])??null};case'NewPaymentEvent':return{...e,'object':d(c['object']),'info':c['info']?{...c['info'],'for_object':d(c['info']?.['for_object'])??null,'for_guard':d(c['info']?.['for_guard'])??null}:null,'record':Array['isArray'](c['record'])?c['record']:[],'amount':d(c['amount'])??null,'from_object':d(c['from_object'])??null};default:return e;}}export const EVENT_ADDRESS_FIELDS=['object','order','service','demand','progress','arb','arbitration','allocation','discount','machine','task','address','resource','payment','from_payment','from_object'];
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export declare const MONITOR_EVENT_MODULES: readonly ["order", "arb", "demand", "progress", "treasury", "reward", "service", "entity", "payment"];
|
|
2
|
+
export type MonitorEventModule = (typeof MONITOR_EVENT_MODULES)[number];
|
|
3
|
+
export interface RuleHit {
|
|
4
|
+
rule: "managed_objects" | "merchant_orders" | "my_orders" | "order_children" | "focus";
|
|
5
|
+
object: string;
|
|
6
|
+
detail: string;
|
|
7
|
+
}
|
|
8
|
+
export interface RelevanceAnnotation {
|
|
9
|
+
event_id: string;
|
|
10
|
+
event_type: string;
|
|
11
|
+
rules: RuleHit[];
|
|
12
|
+
focus_hit: boolean;
|
|
13
|
+
matched_filters: string[];
|
|
14
|
+
scope_version: number;
|
|
15
|
+
annotated_at: number;
|
|
16
|
+
}
|
|
17
|
+
export interface EventFilter {
|
|
18
|
+
id: string;
|
|
19
|
+
enabled: boolean;
|
|
20
|
+
event?: string;
|
|
21
|
+
field: string;
|
|
22
|
+
op: "eq" | "neq" | "contains" | "gte" | "lte" | "in";
|
|
23
|
+
value: string | number | string[];
|
|
24
|
+
}
|
|
25
|
+
export interface FocusEntry {
|
|
26
|
+
object: string;
|
|
27
|
+
added_at: number;
|
|
28
|
+
reason: "favor" | "manual" | "radar" | "goal";
|
|
29
|
+
note?: string;
|
|
30
|
+
closure: boolean;
|
|
31
|
+
goal_id?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface SubscriptionConfig {
|
|
34
|
+
version: 2;
|
|
35
|
+
enabled: boolean;
|
|
36
|
+
scope: {
|
|
37
|
+
accounts: "local-all" | string[];
|
|
38
|
+
rules: {
|
|
39
|
+
managed_objects: boolean;
|
|
40
|
+
merchant_orders: boolean;
|
|
41
|
+
my_orders: boolean;
|
|
42
|
+
order_children: boolean;
|
|
43
|
+
favor_objects: boolean;
|
|
44
|
+
};
|
|
45
|
+
focus_objects: FocusEntry[];
|
|
46
|
+
};
|
|
47
|
+
events: Partial<Record<string, boolean>>;
|
|
48
|
+
filters: EventFilter[];
|
|
49
|
+
loop: {
|
|
50
|
+
poll_interval_ms?: number;
|
|
51
|
+
scope_refresh_ms?: number;
|
|
52
|
+
backfill_days?: number;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export interface ObjectRef {
|
|
56
|
+
type: string;
|
|
57
|
+
object: string;
|
|
58
|
+
}
|
|
59
|
+
export interface OrderRef {
|
|
60
|
+
order: string;
|
|
61
|
+
role: "merchant" | "buyer" | "both";
|
|
62
|
+
}
|
|
63
|
+
export interface ScopeSnapshot {
|
|
64
|
+
version: number;
|
|
65
|
+
resolved_at: number;
|
|
66
|
+
accounts: string[];
|
|
67
|
+
permissions: string[];
|
|
68
|
+
managed_objects: ObjectRef[];
|
|
69
|
+
services: string[];
|
|
70
|
+
orders: OrderRef[];
|
|
71
|
+
order_children: ObjectRef[];
|
|
72
|
+
focus: FocusEntry[];
|
|
73
|
+
index: Record<string, RuleHit[]>;
|
|
74
|
+
data_gaps?: string[];
|
|
75
|
+
}
|
|
76
|
+
export declare const LOOP_DEFAULTS: {
|
|
77
|
+
readonly poll_interval_ms: 15000;
|
|
78
|
+
readonly scope_refresh_ms: 300000;
|
|
79
|
+
readonly backfill_days: 7;
|
|
80
|
+
};
|
|
81
|
+
export declare const LOOP_MIN: {
|
|
82
|
+
readonly poll_interval_ms: 5000;
|
|
83
|
+
readonly scope_refresh_ms: 60000;
|
|
84
|
+
readonly backfill_days: 0;
|
|
85
|
+
};
|
|
86
|
+
export declare const DEFAULT_EVENT_SWITCHES: Record<string, boolean>;
|
|
87
|
+
export declare function defaultSubscriptionConfig(): SubscriptionConfig;
|
|
88
|
+
export declare function normalizeAddr(addr?: string | null): string;
|
|
89
|
+
export declare function shortId(addr?: string | null): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const MONITOR_EVENT_MODULES=['order','arb','demand','progress','treasury','reward','service','entity','payment'];export const LOOP_DEFAULTS={'poll_interval_ms':0x3a98,'scope_refresh_ms':0x493e0,'backfill_days':0x7};export const LOOP_MIN={'poll_interval_ms':0x1388,'scope_refresh_ms':0xea60,'backfill_days':0x0};export const DEFAULT_EVENT_SWITCHES={'NewOrderEvent':!![],'ProgressEvent':!![],'ArbEvent':!![],'VoteEvent':!![],'TreasuryEvent':!![],'RewardFundEvent':!![],'RewardClaimEvent':!![],'AllocationEvent':!![],'FeedbackEvent':![],'NewPaymentEvent':![],'DemandChangedEvent':![],'DemandPresentEvent':![],'DemandFeedbackEvent':![],'ServiceEvent':![],'NewEntityEvent':![]};export function defaultSubscriptionConfig(){return{'version':0x2,'enabled':!![],'scope':{'accounts':'local-all','rules':{'managed_objects':!![],'merchant_orders':!![],'my_orders':!![],'order_children':!![],'favor_objects':!![]},'focus_objects':[]},'events':{...DEFAULT_EVENT_SWITCHES},'filters':[],'loop':{...LOOP_DEFAULTS}};}export function normalizeAddr(a){if(!a)return'';const b=a['startsWith']('0x')?a['slice'](0x2):a;return b['toLowerCase']();}export function shortId(a){const b=normalizeAddr(a);if(!b)return'';if(b['length']<=0x7)return b['toUpperCase']();return b['slice'](0x0,0x4)['toUpperCase']()+'-'+b['slice'](-0x3)['toUpperCase']();}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type AddressFormat = "short-4-3" | "
|
|
1
|
+
export type AddressFormat = "short-4-3" | "full";
|
|
2
2
|
export declare const ADDRESS_FORMAT_DEFAULT: AddressFormat;
|
|
3
3
|
export declare const ADDRESS_FORMATS: readonly AddressFormat[];
|
|
4
4
|
export declare const ADDRESS_FORMAT_PREF_KEY = "address_format";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const ADDRESS_FORMAT_DEFAULT='short-4-3';export const ADDRESS_FORMATS=['short-4-3','
|
|
1
|
+
export const ADDRESS_FORMAT_DEFAULT='short-4-3';export const ADDRESS_FORMATS=['short-4-3','full'];export const ADDRESS_FORMAT_PREF_KEY='address_format';export function isAddressFormat(a){return a==='short-4-3'||a==='full';}export function formatShortAddress(a,b=ADDRESS_FORMAT_DEFAULT){if(!a)return'--';if(b==='full')return a;const c=a['startsWith']('0x')?a['slice'](0x2):a;if(c['length']<=0x7)return c['toUpperCase']();return c['slice'](0x0,0x4)['toUpperCase']()+'-'+c['slice'](-0x3)['toUpperCase']();}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { GoalRecord } from "../goal/types.js";
|
|
2
|
+
import type { PersonaLayer } from "./types.js";
|
|
3
|
+
export interface GoalEvidence {
|
|
4
|
+
goal_type: string;
|
|
5
|
+
stage: string;
|
|
6
|
+
outcome_success?: boolean;
|
|
7
|
+
objects_count: number;
|
|
8
|
+
problems_open: number;
|
|
9
|
+
problems_resolved: number;
|
|
10
|
+
feedback_positive: number;
|
|
11
|
+
feedback_negative: number;
|
|
12
|
+
duration_days?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare function gatherGoalEvidence(goal: GoalRecord): GoalEvidence;
|
|
15
|
+
export declare function distillGoalToProposal(goal: GoalRecord, evidence: GoalEvidence): {
|
|
16
|
+
summary: string;
|
|
17
|
+
current_delta: PersonaLayer;
|
|
18
|
+
evidence: GoalEvidence;
|
|
19
|
+
apply_via: string;
|
|
20
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{existsSync}from'fs';import{listFeedback,listProblems}from'../task/ProcessStore.js';export function gatherGoalEvidence(a){const b={'goal_type':a['goal_type'],'stage':a['stage'],...a['outcome']?{'outcome_success':a['outcome']['success']}:{},'objects_count':a['objects']['length'],'problems_open':0x0,'problems_resolved':0x0,'feedback_positive':0x0,'feedback_negative':0x0,...a['outcome']?{'duration_days':Math['max'](0x0,Math['round']((a['outcome']['completed_at']-a['created_at'])/0x5265c00*0xa)/0xa)}:{}};if(a['process']&&existsSync(a['process']['dir']))try{const c=listProblems(a['process']['dir']);b['problems_open']=c['filter'](e=>e['status']==='open')['length'],b['problems_resolved']=c['filter'](e=>e['status']==='resolved')['length'];const d=listFeedback(a['process']['dir']);b['feedback_positive']=d['filter'](e=>e['sentiment']==='positive')['length'],b['feedback_negative']=d['filter'](e=>e['sentiment']==='negative')['length'];}catch{}return b;}const MAX_RULES=0x3;export function distillGoalToProposal(a,b){const c=[];if(a['process']&&existsSync(a['process']['dir']))try{const h=listProblems(a['process']['dir'])['filter'](i=>i['status']==='open');for(const i of h['slice'](0x0,MAX_RULES)){c['push']('avoid:\x20'+i['title']);}}catch{}const d={};if(b['feedback_negative']>b['feedback_positive'])d['last_goal_sentiment']='negative';else b['outcome_success']===!![]&&b['feedback_negative']===0x0&&(d['last_goal_sentiment']='positive');const e={};if(c['length'])e['rules']=c;if(Object['keys'](d)['length'])e['preferences']=d;const f=b['outcome_success']===!![]?'completed':b['outcome_success']===![]?'ended':'is\x20in\x20progress',g='Goal\x20\x22'+a['title']+'\x22\x20('+b['goal_type']+')\x20'+f+('\x20with\x20'+b['objects_count']+'\x20object(s)')+(b['duration_days']!==undefined?'\x20over\x20~'+b['duration_days']+'\x20day(s)':'')+(';\x20problems\x20open/resolved\x20'+b['problems_open']+'/'+b['problems_resolved'])+(',\x20feedback\x20+'+b['feedback_positive']+'/-'+b['feedback_negative']+'.')+(c['length']?'\x20Carried\x20'+c['length']+'\x20avoid-rule(s)\x20into\x20the\x20proposal.':'\x20No\x20avoid-rules\x20derived.');return{'summary':g,'current_delta':e,'evidence':b,'apply_via':'Review\x20the\x20proposal,\x20then\x20persist\x20it\x20with\x20persona_operation\x20{action:\x27set\x27,\x20current:<current_delta>}\x20(merge\x20with\x20the\x20existing\x20current\x20layer\x20as\x20needed).\x20set/apply\x20are\x20user-driven\x20and\x20pass\x20the\x20client\x27s\x20confirmation\x20gate;\x20distill\x20itself\x20never\x20writes.'};}
|
package/dist/persona/index.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export { countPersonaLines, emptyPersona, mergeLayers, mutateLayer, resolveEffec
|
|
|
8
8
|
export { personaToContextText, personaToInjection, mergeInjections } from "./bridge.js";
|
|
9
9
|
export { analyzePersonaContext } from "./analyzer.js";
|
|
10
10
|
export { profileToCurrentLayer } from "./experience-bridge.js";
|
|
11
|
+
export { distillGoalToProposal, gatherGoalEvidence } from "./distill-goal.js";
|
|
12
|
+
export type { GoalEvidence } from "./distill-goal.js";
|
|
11
13
|
export { registerIndustryPersonae, getIndustryPersona, listPersonaeIndustries, unregisterIndustryPersonae } from "./pack-personae.js";
|
|
12
14
|
export type { IndustryPersona } from "./pack-personae.js";
|
|
13
15
|
export { resolveOverrides, validateLayerOverrides, getOverrideDefault, SYSTEM_OVERRIDE_SETTINGS, } from "./overrides.js";
|
package/dist/persona/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{GENERIC_PERSONA,getIndustryDefault}from'./defaults.js';import{getPersonaStore}from'./store.js';import{emptyPersona,mergeLayers,mutateLayer,resolveEffective,validatePersona}from'./model.js';import{getIndustryPersona}from'./pack-personae.js';import{resolveOverrides}from'./overrides.js';import{profileToCurrentLayer}from'./experience-bridge.js';import{getProfile}from'../experience/index.js';import{ADDRESS_FORMAT_DEFAULT,ADDRESS_FORMAT_PREF_KEY,isAddressFormat}from'./address-format.js';export{GENERIC_PERSONA,getIndustryDefault,listIndustryDefaults}from'./defaults.js';export{SqlitePersonaStore,getPersonaStore,setPersonaStore}from'./store.js';export{countPersonaLines,emptyPersona,mergeLayers,mutateLayer,resolveEffective,validatePersona}from'./model.js';export{personaToContextText,personaToInjection,mergeInjections}from'./bridge.js';export{analyzePersonaContext}from'./analyzer.js';export{profileToCurrentLayer}from'./experience-bridge.js';export{registerIndustryPersonae,getIndustryPersona,listPersonaeIndustries,unregisterIndustryPersonae}from'./pack-personae.js';export{resolveOverrides,validateLayerOverrides,getOverrideDefault,SYSTEM_OVERRIDE_SETTINGS}from'./overrides.js';export*from'./strategy-intent.js';export*from'./local-region.js';export*from'./address-format.js';export async function getEffectivePersona(a,b,c){const d=getPersonaStore(),e=await d['get']('system'),f=a?await d['get']('account',a):null,g=b?mergeIndustryExternal(c??'customer',b):{...GENERIC_PERSONA,'role':c??'customer'};return resolveEffective(e,f,g);}export async function resolveAddressFormat(a,b,c){try{const d=await getEffectivePersona(a,b,c),e=d['layer']['preferences']?.[ADDRESS_FORMAT_PREF_KEY];if(isAddressFormat(e))return e;}catch{}return ADDRESS_FORMAT_DEFAULT;}function mergeIndustryExternal(a,b){const c=getIndustryDefault(a,b),d=getIndustryPersona(b,a);if(!d)return c;return{...c,'long_term':mergeLayers([c['long_term'],d['long_term']]),'current':mergeLayers([c['current'],d['current']])};}export async function resolveEffectiveOverrides(a){const b=getPersonaStore(),c=await b['get']('system'),d=a?await b['get']('account',a):null,e=[];if(c)e['push'](c['long_term'],c['current']);if(d)e['push'](d['long_term'],d['current']);return resolveOverrides(e);}export function analysisToLayerDelta(a){const b={};a['preferences']&&Object['keys'](a['preferences'])['length']&&(b['preferences']=a['preferences']);if(a['requirements']['length'])b['requirements']=a['requirements'];if(a['rules']['length'])b['rules']=a['rules'];return b;}export async function applyAnalysisToCurrent(a,b,c,d='merge',e,f){const g=getPersonaStore(),h=a==='account'&&b?await g['get']('account',b):await g['get']('system'),i=e??c['role']??h?.['role']??'customer',j=f??c['industries'],k=h??emptyPersona(a,b,i,j),l=Array['from'](new Set([...k['industries'],...j??[]])),m=analysisToLayerDelta(c),n=mutateLayer(k['current'],m,d),o={...k,'role':i,'industries':l,'current':n,'updated_at':Date['now']()},p=validatePersona(o);if(p['length']>0x0)throw new Error('persona\x20invalid\x20after\x20apply:\x20'+p['join'](';\x20'));return await g['put'](o),o;}export async function syncExperienceToCurrent(a,b){const c=getPersonaStore(),d=a?'account':'system',e=a?await c['get']('account',a):await c['get']('system'),f=e??emptyPersona(d,a,'customer',[]),g=profileToCurrentLayer(b??getProfile()),h=mutateLayer(f['current'],g,'merge'),i={...f,'current':h,'updated_at':Date['now']()},j=validatePersona(i);if(j['length']>0x0)throw new Error('persona\x20invalid\x20after\x20sync:\x20'+j['join'](';\x20'));return await c['put'](i),{'persona':i,'applied':g,'effective':await getEffectivePersona(a)};}
|
|
1
|
+
import{GENERIC_PERSONA,getIndustryDefault}from'./defaults.js';import{getPersonaStore}from'./store.js';import{emptyPersona,mergeLayers,mutateLayer,resolveEffective,validatePersona}from'./model.js';import{getIndustryPersona}from'./pack-personae.js';import{resolveOverrides}from'./overrides.js';import{profileToCurrentLayer}from'./experience-bridge.js';import{getProfile}from'../experience/index.js';import{ADDRESS_FORMAT_DEFAULT,ADDRESS_FORMAT_PREF_KEY,isAddressFormat}from'./address-format.js';export{GENERIC_PERSONA,getIndustryDefault,listIndustryDefaults}from'./defaults.js';export{SqlitePersonaStore,getPersonaStore,setPersonaStore}from'./store.js';export{countPersonaLines,emptyPersona,mergeLayers,mutateLayer,resolveEffective,validatePersona}from'./model.js';export{personaToContextText,personaToInjection,mergeInjections}from'./bridge.js';export{analyzePersonaContext}from'./analyzer.js';export{profileToCurrentLayer}from'./experience-bridge.js';export{distillGoalToProposal,gatherGoalEvidence}from'./distill-goal.js';export{registerIndustryPersonae,getIndustryPersona,listPersonaeIndustries,unregisterIndustryPersonae}from'./pack-personae.js';export{resolveOverrides,validateLayerOverrides,getOverrideDefault,SYSTEM_OVERRIDE_SETTINGS}from'./overrides.js';export*from'./strategy-intent.js';export*from'./local-region.js';export*from'./address-format.js';export async function getEffectivePersona(a,b,c){const d=getPersonaStore(),e=await d['get']('system'),f=a?await d['get']('account',a):null,g=b?mergeIndustryExternal(c??'customer',b):{...GENERIC_PERSONA,'role':c??'customer'};return resolveEffective(e,f,g);}export async function resolveAddressFormat(a,b,c){try{const d=await getEffectivePersona(a,b,c),e=d['layer']['preferences']?.[ADDRESS_FORMAT_PREF_KEY];if(isAddressFormat(e))return e;}catch{}return ADDRESS_FORMAT_DEFAULT;}function mergeIndustryExternal(a,b){const c=getIndustryDefault(a,b),d=getIndustryPersona(b,a);if(!d)return c;return{...c,'long_term':mergeLayers([c['long_term'],d['long_term']]),'current':mergeLayers([c['current'],d['current']])};}export async function resolveEffectiveOverrides(a){const b=getPersonaStore(),c=await b['get']('system'),d=a?await b['get']('account',a):null,e=[];if(c)e['push'](c['long_term'],c['current']);if(d)e['push'](d['long_term'],d['current']);return resolveOverrides(e);}export function analysisToLayerDelta(a){const b={};a['preferences']&&Object['keys'](a['preferences'])['length']&&(b['preferences']=a['preferences']);if(a['requirements']['length'])b['requirements']=a['requirements'];if(a['rules']['length'])b['rules']=a['rules'];return b;}export async function applyAnalysisToCurrent(a,b,c,d='merge',e,f){const g=getPersonaStore(),h=a==='account'&&b?await g['get']('account',b):await g['get']('system'),i=e??c['role']??h?.['role']??'customer',j=f??c['industries'],k=h??emptyPersona(a,b,i,j),l=Array['from'](new Set([...k['industries'],...j??[]])),m=analysisToLayerDelta(c),n=mutateLayer(k['current'],m,d),o={...k,'role':i,'industries':l,'current':n,'updated_at':Date['now']()},p=validatePersona(o);if(p['length']>0x0)throw new Error('persona\x20invalid\x20after\x20apply:\x20'+p['join'](';\x20'));return await g['put'](o),o;}export async function syncExperienceToCurrent(a,b){const c=getPersonaStore(),d=a?'account':'system',e=a?await c['get']('account',a):await c['get']('system'),f=e??emptyPersona(d,a,'customer',[]),g=profileToCurrentLayer(b??getProfile()),h=mutateLayer(f['current'],g,'merge'),i={...f,'current':h,'updated_at':Date['now']()},j=validatePersona(i);if(j['length']>0x0)throw new Error('persona\x20invalid\x20after\x20sync:\x20'+j['join'](';\x20'));return await c['put'](i),{'persona':i,'applied':g,'effective':await getEffectivePersona(a)};}
|
package/dist/persona/model.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{PERSONA_MAX_LINES,PERSONA_ROLES,PERSONA_VERSION}from'./types.js';import{validateLayerOverrides}from'./overrides.js';function dedupe(a){return Array['from'](new Set(a['filter'](b=>typeof b==='string'&&b['length']>0x0)));}export function mergeLayers(a){const b={};for(const c of a){if(!c)continue;c['identity']&&(b['identity']={...b['identity'],...c['identity']},c['identity']['languages']&&(b['identity']['languages']=dedupe([...b['identity']['languages']??[],...c['identity']['languages']]))),c['preferences']&&(b['preferences']={...b['preferences'],...c['preferences']}),c['overrides']&&(b['overrides']={...b['overrides'],...c['overrides']}),c['strategy']&&(b['strategy']=dedupe([...b['strategy']??[],...c['strategy']])),c['rules']&&(b['rules']=dedupe([...b['rules']??[],...c['rules']])),c['requirements']&&(b['requirements']=dedupe([...b['requirements']??[],...c['requirements']])),c['spec']&&(b['spec']=[b['spec'],c['spec']]['filter'](Boolean)['join']('\x0a\x0a'));}return b;}export function mutateLayer(a,b,c){if(c==='replace')return{...b};return mergeLayers([a,b]);}export function resolveEffective(a,b,c){const d=[],e=[];a&&(d['push'](a['long_term']),e['push']({'scope':'system','part':'long_term'}),d['push'](a['current']),e['push']({'scope':'system','part':'current'}));c&&(d['push'](c['long_term']),e['push']({'scope':c['scope'],'part':'long_term'}),d['push'](c['current']),e['push']({'scope':c['scope'],'part':'current'}));b&&(d['push'](b['long_term']),e['push']({'scope':'account','account':b['account'],'part':'long_term'}),d['push'](b['current']),e['push']({'scope':'account','account':b['account'],'part':'current'}));const f=b
|
|
1
|
+
import{PERSONA_MAX_LINES,PERSONA_ROLES,PERSONA_VERSION}from'./types.js';import{validateLayerOverrides}from'./overrides.js';function dedupe(a){return Array['from'](new Set(a['filter'](b=>typeof b==='string'&&b['length']>0x0)));}export function mergeLayers(a){const b={};for(const c of a){if(!c)continue;c['identity']&&(b['identity']={...b['identity'],...c['identity']},c['identity']['languages']&&(b['identity']['languages']=dedupe([...b['identity']['languages']??[],...c['identity']['languages']]))),c['preferences']&&(b['preferences']={...b['preferences'],...c['preferences']}),c['overrides']&&(b['overrides']={...b['overrides'],...c['overrides']}),c['strategy']&&(b['strategy']=dedupe([...b['strategy']??[],...c['strategy']])),c['rules']&&(b['rules']=dedupe([...b['rules']??[],...c['rules']])),c['requirements']&&(b['requirements']=dedupe([...b['requirements']??[],...c['requirements']])),c['spec']&&(b['spec']=[b['spec'],c['spec']]['filter'](Boolean)['join']('\x0a\x0a'));}return b;}export function mutateLayer(a,b,c){if(c==='replace')return{...b};return mergeLayers([a,b]);}function isEmptyLayer(a){return!a||Object['keys'](a)['length']===0x0;}export function resolveEffective(a,b,c){const d=[],e=[];a&&(d['push'](a['long_term']),e['push']({'scope':'system','part':'long_term'}),d['push'](a['current']),e['push']({'scope':'system','part':'current'}));c&&(d['push'](c['long_term']),e['push']({'scope':c['scope'],'part':'long_term'}),d['push'](c['current']),e['push']({'scope':c['scope'],'part':'current'}));b&&(d['push'](b['long_term']),e['push']({'scope':'account','account':b['account'],'part':'long_term'}),d['push'](b['current']),e['push']({'scope':'account','account':b['account'],'part':'current'}));const f=!!b&&(!isEmptyLayer(b['long_term'])||!isEmptyLayer(b['current'])),g=f?b:c??a;return{'scope':b?'account':'system','account':b?.['account']??a?.['account'],'role':g?.['role']??'customer','industries':g?.['industries']??[],'layer':mergeLayers(d),'sources':e};}export function countPersonaLines(a){return JSON['stringify'](a,null,0x2)['split']('\x0a')['length'];}export function validatePersona(a){const b=[];a['version']!==PERSONA_VERSION&&b['push']('version\x20must\x20be\x20'+PERSONA_VERSION);a['scope']==='account'&&!a['account']&&b['push']('account\x20is\x20required\x20when\x20scope=account');a['scope']!=='account'&&a['account']&&b['push']('account\x20should\x20only\x20be\x20set\x20when\x20scope=account');(!a['role']||!PERSONA_ROLES['includes'](a['role']))&&b['push']('role\x20must\x20be\x20a\x20persona\x20role\x20(merchant|customer|prospect|supplier|collaborator|arbitrator)');!Array['isArray'](a['industries'])&&b['push']('industries\x20must\x20be\x20an\x20array');b['push'](...validateLayerOverrides(a['long_term'])),b['push'](...validateLayerOverrides(a['current']));const c=countPersonaLines(a);return c>PERSONA_MAX_LINES&&b['push']('persona\x20is\x20'+c+'\x20lines\x20(max\x20'+PERSONA_MAX_LINES+')'),b;}export function emptyPersona(a,b,c,d){return{'version':PERSONA_VERSION,'scope':a,'account':b,'role':c,'industries':d,'long_term':{},'current':{},'updated_at':Date['now']()};}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{initServicePuzzleFromIntent,initMachinePuzzleFromIntent,initAllocationPuzzleFromIntent,initTreasuryPuzzleFromIntent,initArbitrationPuzzleFromIntent,initRewardPuzzleFromIntent,initProgressPuzzleFromIntent,initOrderPuzzleFromIntent,initPuzzleFromIntent as a283a,checkServicePuzzleCompleteness,checkMachinePuzzleCompleteness,checkAllocationPuzzleCompleteness,checkTreasuryPuzzleCompleteness,checkArbitrationPuzzleCompleteness,checkRewardPuzzleCompleteness,checkProgressPuzzleCompleteness,checkOrderPuzzleCompleteness,checkPuzzleCompleteness as a283b}from'../../knowledge/index.js';import{initPuzzleFromIntent as a283c,checkPuzzleCompleteness as a283d}from'../../knowledge/permission-puzzle.js';const KEYWORD_TABLE=[{'category':'Product/Service','keywords_zh':['product','selling','sell','sales','store','open\x20shop'],'keywords_en':['sell','product','sale','shop','store'],'objects':['service','order','progress'],'required_level':'R','scene_id':'retail'},{'category':'Subscription','keywords_zh':['subscription','cycle','renewal'],'keywords_en':['subscribe','recurring','subscription'],'objects':['service','machine','reward'],'required_level':'C','scene_id':'subscription'},{'category':'Rental','keywords_zh':['rent','lease','return'],'keywords_en':['rent','lease','return'],'objects':['service','machine','arb'],'required_level':'C','scene_id':'rental_return'},{'category':'Trust','keywords_zh':['deposit','pledge','verify','trust'],'keywords_en':['deposit','trust','verify'],'objects':['guard','permission','treasury'],'required_level':'R','scene_id':'trust_deposit'},{'category':'Funds','keywords_zh':['split','collect','share\x20profit','income','incentive'],'keywords_en':['split','revenue','reward'],'objects':['allocation','treasury','reward'],'required_level':'R','scene_id':'revenue_split'},{'category':'Workflow','keywords_zh':['node','stage','process','workflow'],'keywords_en':['workflow','stage','node'],'objects':['machine','progress'],'required_level':'R','scene_id':'workflow'},{'category':'Dispute','keywords_zh':['arbitration','refund','conflict','rights\x20protection'],'keywords_en':['arbitration','refund','dispute'],'objects':['arb','proof'],'required_level':'C','scene_id':'arbitration_dispute'},{'category':'Contact','keywords_zh':['customer\x20service','contact','communication'],'keywords_en':['contact','support','im'],'objects':['contact'],'required_level':'C','scene_id':'contact_im'},{'category':'Data','keywords_zh':['evidence','record','data'],'keywords_en':['evidence','record','data'],'objects':['repository','proof'],'required_level':'C','scene_id':'evidence_record'},{'category':'User\x20Profile','keywords_zh':['personal\x20info','preference','privacy'],'keywords_en':['personal','profile','privacy'],'objects':['personal','contact'],'required_level':'OPTIONAL','scene_id':'user_profile'},{'category':'Demand\x20Submission','keywords_zh':['demand','publish','inquiry'],'keywords_en':['demand','request','inquiry'],'objects':['demand'],'required_level':'OPTIONAL','scene_id':'demand_inquiry'}],INDUSTRY_KEYWORDS=[{'industry':'freelance','words':['freelance','outsourcing','freelance','gig']},{'industry':'rental','words':['rental','lease','rental','rent']},{'industry':'education','words':['education','course','training','education','course']},{'industry':'travel','words':['travel','tour','itinerary','travel','trip']},{'industry':'subscription','words':['subscription','cycle','subscription','recurring']}];function buildPuzzleDispatch(){const a=(c,d)=>{try{return c(d);}catch{return undefined;}},b=(c,d)=>{if(!c)return{'missing':[],'complete':![],'next_step':'init\x20failed'};try{return d(c);}catch{return{'missing':[],'complete':![],'next_step':'check\x20failed'};}};return{'service':{'init':c=>a(initServicePuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkServicePuzzleCompleteness)},'machine':{'init':c=>a(initMachinePuzzleFromIntent,c),'check':c=>b(c,checkMachinePuzzleCompleteness)},'allocation':{'init':c=>a(initAllocationPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkAllocationPuzzleCompleteness)},'treasury':{'init':c=>a(initTreasuryPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkTreasuryPuzzleCompleteness)},'arb':{'init':c=>a(initArbitrationPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkArbitrationPuzzleCompleteness)},'reward':{'init':c=>a(initRewardPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkRewardPuzzleCompleteness)},'progress':{'init':c=>a(initProgressPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkProgressPuzzleCompleteness)},'order':{'init':c=>a(initOrderPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkOrderPuzzleCompleteness)},'permission':{'init':c=>a(a283c,{'primary_goal':c}),'check':c=>b(c,a283d)},'guard':{'init':c=>a(a283a,{'primary_goal':c}),'check':c=>b(c,a283b)}};}export function extractKeywords(a){if(!a||typeof a!=='string')return[];const b=[];for(const c of KEYWORD_TABLE){const d=[...c['keywords_zh'],...c['keywords_en']];for(const e of d){try{const f=new RegExp(escapeRegex(e),'gi'),g=(a['match'](f)||[])['length'];g>0x0&&b['push']({'keyword':e,'category':c['category'],'matched_objects':[...c['objects']],'required_level':c['required_level'],'match_count':g});}catch{}}}return b['sort']((h,i)=>i['match_count']-h['match_count']),b;}function escapeRegex(a){return a['replace'](/[.*+?^${}()|[\]\\]/g,'\x5c$&');}export function resolveIndustry(a,b){const c=((a??'')+'\x20'+(b??''))['toLowerCase']();for(const d of INDUSTRY_KEYWORDS){for(const e of d['words']){if(c['includes'](e['toLowerCase']()))return d['industry'];}}return'general';}export function identifyObjects(a,b){if(b['length']===0x0)return{'primary':'service','secondary':['permission','machine','progress'],'scenes':[{'object':'service','scene_id':'general'}]};const c=b['find'](i=>i['required_level']==='R'),d=(c??b[0x0])['matched_objects'][0x0],e=new Set([d]),f=[];for(const i of b){for(const j of i['matched_objects']){!e['has'](j)&&(e['add'](j),f['push'](j));}}const g=[],h=new Set();for(const k of KEYWORD_TABLE){const l=b['find'](n=>n['category']===k['category']);if(!l)continue;if(h['has'](k['scene_id']))continue;h['add'](k['scene_id']),g['push']({'object':k['objects'][0x0],'scene_id':k['scene_id']});}return{'primary':d,'secondary':f,'scenes':g};}export function analyzeBusinessIntent(a){const b=[];if(!a||!a['user_intent']||typeof a['user_intent']!=='string')return{'intent_parsed':{'primary_object':'service','secondary_objects':[],'detected_scenes':[],'industry':'general','keyword_matches':[]},'puzzles':{},'overall_completeness':'empty','next_step':'Please\x20provide\x20a\x20non-empty\x20business\x20intent.','recommended_creation_order':[],'warnings':['input.user_intent\x20is\x20empty']};const c=a['user_intent'],e=extractKeywords(c),f=resolveIndustry(c,a['industry']),{primary:g,secondary:h,scenes:i}=identifyObjects(c,e);let j=[g,...h];if(a['target_objects']&&a['target_objects']['length']>0x0){const p=a['target_objects']['filter'](q=>['service','machine','guard','permission','reward','arb','progress','treasury','demand','repository','contact','order','allocation','personal','payment','proof']['includes'](q));if(p['length']>0x0)j=p;}const k=buildPuzzleDispatch(),l={};for(const q of j){const r=k[q];if(!r){b['push']('No\x20puzzle\x20module\x20for\x20\x27'+q+'\x27\x20—\x20skipped\x20(L3\x20object)');continue;}const s=r['init'](c),t=s?r['check'](s):undefined,u=extractMissingDimensions(t);l[q]={'puzzle':s,'completeness':t,'missing_dimensions':u},!s&&b['push']('Puzzle\x20init\x20failed\x20for\x20\x27'+q+'\x27');}const m=aggregatePuzzleCompleteness(l),n=suggestNextPuzzleStep({'intent_parsed':{'primary_object':g,'secondary_objects':h,'detected_scenes':i,'industry':f,'keyword_matches':e},'puzzles':l,'overall_completeness':m,'next_step':'','recommended_creation_order':[],'warnings':b}),o=['permission','progress','guard','allocation','machine','service'];return{'intent_parsed':{'primary_object':g,'secondary_objects':h,'detected_scenes':i,'industry':f,'keyword_matches':e},'puzzles':l,'overall_completeness':m,'next_step':n,'recommended_creation_order':o,'warnings':b};}function extractMissingDimensions(a){if(!a||typeof a!=='object')return[];const b=a,d=b['missing'];if(Array['isArray'](d))return d['map'](f=>String(f));const e=b['missing_details'];if(Array['isArray'](e))return e['map'](f=>String(f?.['dimension']??f));return[];}export function aggregatePuzzleCompleteness(a){const b=Object['values'](a??{});if(b['length']===0x0)return'empty';const c=b['filter'](f=>!f['puzzle'])['length'];if(c===b['length'])return'empty';const d=b['reduce']((f,g)=>f+(g['missing_dimensions']?.['length']??0x0),0x0);if(d===0x0)return'complete';return'partial';}export function suggestNextPuzzleStep(a){if(!a)return'No\x20result\x20to\x20suggest\x20from.';if(a['overall_completeness']==='complete')return'All\x20puzzle\x20dimensions\x20are\x20complete\x20—\x20ready\x20for\x20risk\x20calibration\x20(stage\x203).';if(a['overall_completeness']==='empty')return'No\x20puzzle\x20has\x20been\x20initialized.\x20Provide\x20more\x20concrete\x20business\x20intent\x20so\x20the\x20primary\x20object\x20can\x20be\x20identified.';const b=['permission','treasury','allocation','guard','machine','service','order','progress','arb','reward','proof','repository','demand','contact','personal','payment'],d=a['puzzles']??{},e=b['filter'](f=>d[f]);for(const f of e){const g=d[f];if(!g)continue;const h=g['missing_dimensions']??[];if(h['length']===0x0)continue;const i=g['completeness'],j=i&&typeof i==='object'?i['next_step']:undefined;if(typeof j==='string'&&j['trim']())return'['+f+']\x20'+j;return'['+f+']\x20Complete\x20dimension'+(h['length']>0x1?'s':'')+'\x20'+h['join'](',\x20')+'\x20to\x20advance\x20the\x20puzzle.';}return'Continue\x20dialog\x20to\x20fill\x20remaining\x20pending\x20fields.';}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import { type ContextCollectionResult } from "
|
|
4
|
-
type ValidatedInput =
|
|
1
|
+
import type { ObjectBase } from "@wowok/wowok";
|
|
2
|
+
import type { AssembleContextInput } from "../../schema/query/bi.js";
|
|
3
|
+
import { type ContextCollectionResult } from "../../loop-engineering/context-collect.js";
|
|
4
|
+
type ValidatedInput = AssembleContextInput;
|
|
5
5
|
export interface DependencyEdge {
|
|
6
6
|
object: string;
|
|
7
7
|
depth: number;
|
|
@@ -22,4 +22,9 @@ export interface AssembleContextResult {
|
|
|
22
22
|
flywheel_collected?: ContextCollectionResult;
|
|
23
23
|
}
|
|
24
24
|
export declare function assembleContext(validated: ValidatedInput): Promise<AssembleContextResult>;
|
|
25
|
+
export declare function extractAddressFields(obj: ObjectBase): Array<{
|
|
26
|
+
address: string;
|
|
27
|
+
field: string;
|
|
28
|
+
type: string;
|
|
29
|
+
}>;
|
|
25
30
|
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createHash}from'crypto';import{query_objects,query_events}from'@wowok/wowok';import{annotateEventsMonetaryFields}from'../../knowledge/fund-layer.js';import{buildDataSemantic}from'../../schema/call/semantic.js';import{collectContextExperience}from'../../loop-engineering/context-collect.js';const STATE_TRANSITION_EVENTS=['NewOrderEvent','ProgressEvent','ArbEvent','DemandPresentEvent','DemandFeedbackEvent','NewEntityEvent'],MAX_OBJECTS_PER_QUERY=0x32;export async function assembleContext(a){const b=a['context_objects'];if(!b||b['length']===0x0)throw new Error('assemble_context\x20requires\x20\x27context_objects\x27\x20—\x20an\x20array\x20of\x20object\x20IDs\x20or\x20LocalMark\x20names.');const c=a['context_network']??'testnet',d=a['include_events']??![],e=Math['max'](0x0,Math['min'](0x5,a['context_depth']??0x0)),g=a['context_include']?.['length']?new Set(a['context_include']):null,h=await query_objects({'objects':b,'no_cache':![],'network':c}),k=h?.['objects']??[],l=[],m=[];if(e>0x0){const A=new Set();for(const C of k){const D=C?.['object'];if(typeof D==='string')A['add'](D);}let B=[];for(const E of k){const F=safeExtractAddressFields(E);for(const G of F){if(g&&!g['has'](G['field']))continue;if(A['has'](G['address']))continue;B['push']({'id':G['address'],'parent':E?.['object']??'','viaField':G['field'],'viaType':G['type'],'depth':0x1});}}for(let H=0x1;H<=e&&B['length']>0x0;H++){const I=new Set(),J=[];for(const L of B){if(A['has'](L['id'])||I['has'](L['id']))continue;I['add'](L['id']),A['add'](L['id']),J['push'](L);}if(J['length']===0x0)break;const K=[];for(let M=0x0;M<J['length'];M+=MAX_OBJECTS_PER_QUERY){const N=J['slice'](M,M+MAX_OBJECTS_PER_QUERY);let O;try{O=await query_objects({'objects':N['map'](Q=>Q['id']),'no_cache':![],'network':c});}catch{continue;}const P=O?.['objects']??[];for(let Q=0x0;Q<N['length'];Q++){const R=N[Q],S=P[Q];if(!S)continue;l['push']({'object':R['id'],'depth':R['depth'],'via_field':R['viaField'],'via_type':R['viaType'],'parent':R['parent']}),m['push'](S);if(H<e){const T=safeExtractAddressFields(S);for(const U of T){if(g&&!g['has'](U['field']))continue;if(A['has'](U['address']))continue;K['push']({'id':U['address'],'parent':R['id'],'viaField':U['field'],'viaType':U['type'],'depth':H+0x1});}}}}B=K;}}const n=[...k,...m],p=extractEmbeddedHistory(n),q=Object['keys'](p)['length']>0x0;let s;if(d){s=[];for(const V of STATE_TRANSITION_EVENTS){try{const W=await query_events({'type':V,'limit':0x5,'order':'descending','network':c});W?.['data']&&W['data']['length']>0x0&&s['push'](...W['data']);}catch{}}if(s['length']===0x0)s=undefined;else try{await annotateEventsMonetaryFields(s,c);}catch{}}const t={'operation_type':'assemble_context','data':{'context_objects':k,'embedded_history':p,'events':s}},u=buildDataSemantic({'objects':k,'embedded_history':p,'events':s},t),v=k['map'](X=>(X?.['object']??X?.['data']?.['object']??'?')+':'+(X?.['version']??X?.['data']?.['version']??'?'));m['length']>0x0&&v['push']('deps:'+m['map'](X=>(X?.['object']??'?')+':'+(X?.['version']??'?'))['join'](','));v['push']('ts:'+Date['now']());const w=createHash('sha256')['update'](v['join']('|'))['digest']('hex')['substring'](0x0,0x10),x=l['length']>0x0,y=x?'Context\x20assembled\x20with\x20'+l['length']+'\x20dependency\x20object(s)\x20across\x20'+e+'\x20level(s).\x20'+'Use\x20onchain_transaction\x20with\x20a\x20specific\x20digest\x20to\x20verify\x20a\x20past\x20operation,\x20'+'or\x20proceed\x20with\x20onchain_operations\x20(consider\x20dry_run=true\x20first\x20to\x20validate).':q?'Context\x20assembled\x20with\x20embedded\x20operation\x20history.\x20Use\x20onchain_transaction\x20with\x20a\x20specific\x20digest\x20to\x20verify\x20a\x20past\x20operation,\x20or\x20proceed\x20with\x20onchain_operations\x20(consider\x20dry_run=true\x20first\x20to\x20validate).':s&&s['length']>0x0?'Context\x20assembled\x20with\x20recent\x20events.\x20Use\x20onchain_transaction\x20with\x20a\x20specific\x20digest\x20to\x20verify\x20any\x20event\x27s\x20tx,\x20or\x20proceed\x20with\x20onchain_operations.':'Context\x20assembled\x20(current\x20state\x20only).\x20Proceed\x20with\x20onchain_operations\x20(consider\x20dry_run=true\x20first\x20to\x20validate).';let z;try{z=collectContextExperience({'action':'assemble_context','objects':k,'events':s,'embedded_history':q?p:undefined,'semantic_summary':u,'context_digest':w,'next_action':y},c);}catch{}return{'action':'assemble_context','objects':k,'events':s,'embedded_history':q?p:undefined,'dependencies':x?l:undefined,'dependency_objects':x?m:undefined,'semantic_summary':u,'context_digest':w,'next_action':y,'flywheel_collected':z};}export function extractAddressFields(a){const b=[],c=a['type'];let d=c;if(c&&c['includes']('::')){const k=c['split']('::');d=k[k['length']-0x1];}const e=l=>typeof l==='string'&&l['startsWith']('0x')&&l['length']>=0xa,f=(l,m,n)=>{e(l)&&l!=='0x0'&&l!==a['object']&&b['push']({'address':l,'field':m,'type':n});},h=(l,m,n)=>{if(Array['isArray'](l))for(const o of l){f(o,m,n);}},i=(l,m,n)=>{l!==null&&l!==undefined&&f(l,m,n);},j=a;switch(d){case'Service':{i(j['machine'],'machine','bind'),i(j['buy_guard'],'buy_guard','validate'),i(j['um'],'um','bind'),f(j['permission'],'permission','validate'),h(j['repositories'],'repositories','consume'),h(j['arbitrations'],'arbitrations','trigger'),h(j['rewards'],'rewards','trigger');if(j['order_allocators']?.['allocators']){for(const m of j['order_allocators']['allocators']){f(m['guard'],'allocator_guard','validate');}const l=j['order_allocators']['allocators'][0x0]?.['guard'];f(l,'order_allocators','create');}break;}case'Machine':{f(j['permission'],'permission','validate'),h(j['consensus_repositories'],'consensus_repositories','consume');break;}case'Order':{f(j['service'],'service','consume'),i(j['machine'],'machine','consume'),i(j['progress'],'progress','trigger'),h(j['dispute'],'dispute','trigger'),i(j['allocation'],'allocation','bind');break;}case'Progress':{f(j['machine'],'machine','bind'),h(j['context_repositories'],'context_repositories','consume');break;}case'Treasury':{f(j['permission'],'permission','validate');if(Array['isArray'](j['external_deposit_guard'])){for(const n of j['external_deposit_guard'])f(n?.['guard'],'external_deposit_guard','validate');}if(Array['isArray'](j['external_withdraw_guard'])){for(const o of j['external_withdraw_guard'])f(o?.['guard'],'external_withdraw_guard','validate');}break;}case'Allocation':{if(Array['isArray'](j['allocators'])){for(const p of j['allocators'])f(p?.['guard'],'allocator_guard','validate');}i(j['payment_info']?.['for_object'],'for_object','bind'),i(j['payment_info']?.['for_guard'],'for_guard','validate'),h(j['payment'],'payment','trigger');break;}case'Arbitration':{f(j['permission'],'permission','validate');if(Array['isArray'](j['voting_guard'])){for(const q of j['voting_guard'])f(q?.['guard'],'voting_guard','validate');}i(j['usage_guard'],'usage_guard','validate');break;}case'Reward':{f(j['permission'],'permission','validate');if(Array['isArray'](j['guards'])){for(const s of j['guards'])f(s?.['guard'],'guard','validate');}break;}case'Repository':{f(j['permission'],'permission','validate'),h(j['rewards'],'rewards','trigger');if(Array['isArray'](j['policies']))for(const t of j['policies']){if(Array['isArray'](t?.['write_guard'])){for(const u of t['write_guard'])f(u?.['guard'],'write_guard','validate');}i(t?.['quote_guard'],'quote_guard','validate');}break;}case'Demand':{f(j['permission'],'permission','validate');if(Array['isArray'](j['guards'])){for(const v of j['guards'])f(v?.['guard'],'guard','validate');}h(j['rewards'],'rewards','trigger');break;}case'Contact':{f(j['permission'],'permission','validate');break;}case'Permission':{break;}case'Payment':{i(j['info']?.['for_object'],'for_object','bind'),i(j['info']?.['for_guard'],'for_guard','validate');if(Array['isArray'](j['record']))for(const w of j['record']){const x=w?.['recipient'];x&&typeof x==='object'&&typeof x['Entity']==='string'&&f(x['Entity'],'recipient_entity','consume');}break;}case'Guard':{break;}default:break;}return b;}function safeExtractAddressFields(a){if(!a||typeof a!=='object')return[];try{return extractAddressFields(a);}catch{return[];}}function extractEmbeddedHistory(a){const b={};for(const c of a){const d=c?.['data']??c,e=c?.['object']??d?.['object'];if(!e)continue;const f=d?.['type']??'',g={};f['includes']('Progress')&&d?.['session']?.['forwards']&&(g['operation_history']=d['session']['forwards']['map'](h=>({'operation':h['forward'],'operator':h['who'],'accomplished':h['accomplished'],'time':h['time'],'message':h['msg']})),g['next_node']=d['session']?.['next_node'],g['threshold']=d['session']?.['threshold']),f['includes']('Order')&&(d?.['dispute']&&Array['isArray'](d['dispute'])&&d['dispute']['length']>0x0&&(g['disputes']=d['dispute']),d?.['claimed_by']&&(g['claimed_by']=d['claimed_by']),d?.['progress']&&(g['progress_object']=d['progress'])),f['includes']('Service')&&d?.['sales']&&(g['sale_count']=Array['isArray'](d['sales'])?d['sales']['length']:0x0),Object['keys'](g)['length']>0x0&&(b[e]=g);}return b;}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { SemanticObjectGraph } from "./semantic-graph.js";
|
|
2
2
|
import type { BusinessIntent } from "./intent-analyzer.js";
|
|
3
|
-
import type { BusinessModuleId } from "
|
|
3
|
+
import type { BusinessModuleId } from "../../extensions/business-modules.js";
|
|
4
4
|
export type GameScenario = "merchant_may_deliver_late" | "merchant_may_abandon" | "customer_may_deny_acceptance" | "customer_may_false_claim" | "supplier_may_not_deliver";
|
|
5
5
|
export interface GameTheoryConstraint {
|
|
6
6
|
scenario: GameScenario;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface StageCacheEntry {
|
|
2
|
+
stage: string;
|
|
3
|
+
updated_at: number;
|
|
4
|
+
puzzles?: Record<string, unknown>;
|
|
5
|
+
risk_status?: string;
|
|
6
|
+
risk_can_proceed?: boolean;
|
|
7
|
+
trace_coherent?: boolean;
|
|
8
|
+
trace_can_proceed?: boolean;
|
|
9
|
+
business_intent?: string;
|
|
10
|
+
industry?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function getStageCache(prefix: string, version: string): StageCacheEntry | undefined;
|
|
13
|
+
export declare function updateStageCache(prefix: string, version: string, update: Partial<StageCacheEntry>): StageCacheEntry;
|
|
14
|
+
export declare const SERVICE_BUILD_CACHE_VERSION = 1;
|