@stalfh233/omc-cli 0.6.23 → 0.6.24
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/coverage/m1-coverage-manifest-v1.json +24 -0
- package/dist/endpoints.js +2 -0
- package/dist/lanes/businessrule-coverage.js +8 -0
- package/dist/lanes/rulelog-contract.js +15 -0
- package/dist/lanes/rulelog.js +68 -0
- package/dist/tools.js +2 -0
- package/package.json +3 -3
- package/skills/omc-capabilities.md +1 -1
|
@@ -1449,6 +1449,30 @@
|
|
|
1449
1449
|
"custom page body publish (custom/page/content/publish)",
|
|
1450
1450
|
"custom page delete (custom/delete)"
|
|
1451
1451
|
]
|
|
1452
|
+
},
|
|
1453
|
+
{
|
|
1454
|
+
"capability": "rule execution log search (trigger rows, optional node chains)",
|
|
1455
|
+
"status": "executable",
|
|
1456
|
+
"scope": "POST /api/api/launcher/domain_service_runtime/{schemaCode}/search_rule_log paged rule-execution-log search (triggerTime desc) with client-side bizObjectId row matching over inputSummaries (bounded 5-page scan) and optional query_rule_activity_log node chains for the first 3 hits; honest notes for ~5s async flush, retention cleanup, and CODING-mode absence.",
|
|
1457
|
+
"version_family": "8.6",
|
|
1458
|
+
"anchor_version": "8.6.26",
|
|
1459
|
+
"evidence": [
|
|
1460
|
+
{
|
|
1461
|
+
"path": ".scratch/r43-forensic/FORENSIC-rulelog.md",
|
|
1462
|
+
"anchor": "r43 源码+真机双证(DomainServiceController/RuleLogSearchAssembler/RuleLogManagerImpl + seal_apply 历史日志 + r43x 自建触发)"
|
|
1463
|
+
},
|
|
1464
|
+
{
|
|
1465
|
+
"path": "packages/omc-cli/test/rulelog.test.ts",
|
|
1466
|
+
"anchor": "contract tests"
|
|
1467
|
+
}
|
|
1468
|
+
],
|
|
1469
|
+
"lane": "B1-businessrule",
|
|
1470
|
+
"tools": [
|
|
1471
|
+
"rulelog.search"
|
|
1472
|
+
],
|
|
1473
|
+
"scopes": [
|
|
1474
|
+
"rule execution log search (trigger-time desc, row match client-side)"
|
|
1475
|
+
]
|
|
1452
1476
|
}
|
|
1453
1477
|
]
|
|
1454
1478
|
}
|
package/dist/endpoints.js
CHANGED
|
@@ -108,6 +108,8 @@ export const ENDPOINTS = {
|
|
|
108
108
|
* reacquireDataFromDb:false), so effects must be read back separately.
|
|
109
109
|
*/
|
|
110
110
|
ruleRuntimeExecuteBase: "/api/api/launcher/domain_service_runtime",
|
|
111
|
+
ruleLogSearch: "/api/api/launcher/domain_service_runtime/{schemaCode}/search_rule_log",
|
|
112
|
+
ruleActivityLog: "/api/api/launcher/domain_service_runtime/{schemaCode}/query_rule_activity_log",
|
|
111
113
|
/**
|
|
112
114
|
* Form-toolbar button execution — a DIFFERENT face from the list-button one.
|
|
113
115
|
* Live 2026-10-23 (1.1.25, Playwright capture of a `triggerType=FORM` button
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { claim, declareLaneCoverage } from "./coverage-declaration.js";
|
|
2
2
|
import { BUSINESSRULE_LANE_CONTRACT } from "./businessrule-contract.js";
|
|
3
|
+
import { RULELOG_LANE_CONTRACT } from "./rulelog-contract.js";
|
|
3
4
|
const T = BUSINESSRULE_LANE_CONTRACT.tools;
|
|
4
5
|
export const BUSINESSRULE_COVERAGE = declareLaneCoverage(BUSINESSRULE_LANE_CONTRACT.lane, [
|
|
5
6
|
{
|
|
@@ -12,5 +13,12 @@ export const BUSINESSRULE_COVERAGE = declareLaneCoverage(BUSINESSRULE_LANE_CONTR
|
|
|
12
13
|
evidence: ["packages/omc-cli/src/tools.ts", "packages/omc-cli/test/rule-list.test.ts"],
|
|
13
14
|
tools: [claim("rule.list", T["rule.list"].scope), claim("rule.get", T["rule.get"].scope), claim("rule.references", T["rule.references"].scope)],
|
|
14
15
|
},
|
|
16
|
+
{
|
|
17
|
+
// r43a(2026-11-08):规则执行日志只读面。证据=运行版 v1.1.25 反编译(DomainServiceController/
|
|
18
|
+
// RuleLogSearchAssembler/RuleLogManagerImpl)+ 真机双证(seal_apply 历史日志 + r43x 自建触发)。
|
|
19
|
+
capability: "rule execution log search (trigger rows, optional node chains)",
|
|
20
|
+
evidence: [".scratch/r43-forensic/FORENSIC-rulelog.md", "packages/omc-cli/test/rulelog.test.ts"],
|
|
21
|
+
tools: [claim("rulelog.search", RULELOG_LANE_CONTRACT.tools["rulelog.search"].scope)],
|
|
22
|
+
},
|
|
15
23
|
]);
|
|
16
24
|
//# sourceMappingURL=businessrule-coverage.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { assertLaneContract } from "./contract-support.js";
|
|
2
|
+
import { CONTRACT_FAMILY, CONTRACT_REFERENCE_VERSION } from "./contract-support.js";
|
|
3
|
+
import { LANES } from "./lane-ids.js";
|
|
4
|
+
const description = "查询规则执行日志;支持时间/规则/状态筛选、按触发行 id 客户端匹配,以及前 3 条日志的节点链。日志异步约 5 秒落库,未见不等于未触发;历史按平台保留天数清理,CODING 在线开发规则不记日志。";
|
|
5
|
+
export const RULELOG_LANE_CONTRACT = Object.freeze({
|
|
6
|
+
lane: LANES.businessrule,
|
|
7
|
+
family: CONTRACT_FAMILY,
|
|
8
|
+
referenceVersion: CONTRACT_REFERENCE_VERSION,
|
|
9
|
+
endpoints: Object.freeze({ search: "ruleLogSearch", activity: "ruleActivityLog" }),
|
|
10
|
+
wire: Object.freeze({ page: 0, size: 20, triggerRows: "inputSummaries[].id", nodeId: "平台 VO 不提供 targetBizObjectId" }),
|
|
11
|
+
evidence: ["TASK-r43a.md §一"],
|
|
12
|
+
tools: Object.freeze({ "rulelog.search": Object.freeze({ scope: "rule execution log search (trigger-time desc, row match client-side)", description }) }),
|
|
13
|
+
});
|
|
14
|
+
export function assertRuleLogContract() { assertLaneContract(RULELOG_LANE_CONTRACT); }
|
|
15
|
+
//# sourceMappingURL=rulelog-contract.js.map
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ENDPOINTS } from "../endpoints.js";
|
|
3
|
+
import { capabilityArg, environmentArg } from "../args.js";
|
|
4
|
+
import { governedRead } from "../read.js";
|
|
5
|
+
import { defineTool } from "../tool-types.js";
|
|
6
|
+
import { wireCall } from "../wire.js";
|
|
7
|
+
import { RULELOG_LANE_CONTRACT } from "./rulelog-contract.js";
|
|
8
|
+
const path = (template, schemaCode) => template.replace("{schemaCode}", encodeURIComponent(schemaCode));
|
|
9
|
+
const notes = ["日志异步落库约 5 秒,未见不等于未触发", "成功/失败日志按平台配置天数清理,历史有限", "CODING 模式在线开发 Java 规则不记日志"];
|
|
10
|
+
export function registerRuleLogLane(tools) {
|
|
11
|
+
tools.push(defineTool({
|
|
12
|
+
name: "rulelog.search", layer: "low", kind: "read", lane: RULELOG_LANE_CONTRACT.lane,
|
|
13
|
+
scope: RULELOG_LANE_CONTRACT.tools["rulelog.search"].scope,
|
|
14
|
+
description: RULELOG_LANE_CONTRACT.tools["rulelog.search"].description,
|
|
15
|
+
inputSchema: {
|
|
16
|
+
environment: environmentArg, schemaCode: z.string().min(1), bizObjectId: z.string().min(1).optional(),
|
|
17
|
+
since: z.string().optional(), until: z.string().optional(), ruleCode: z.string().optional(), status: z.boolean().optional(),
|
|
18
|
+
includeNodes: z.boolean().optional(), page: z.number().int().min(0).optional(), size: z.number().int().min(1).max(50).optional(), capability: capabilityArg,
|
|
19
|
+
},
|
|
20
|
+
handler: async (ctx, args, self) => governedRead(ctx, self, args, async (session) => {
|
|
21
|
+
const requestedPage = args.page ?? 0, requestedSize = args.size ?? 20;
|
|
22
|
+
const fetch = async (page, size) => {
|
|
23
|
+
const body = { page, size };
|
|
24
|
+
for (const [key, value] of [["startTime", args.since], ["endTime", args.until], ["ruleCode", args.ruleCode], ["status", args.status]])
|
|
25
|
+
if (value !== undefined)
|
|
26
|
+
body[key] = value;
|
|
27
|
+
return (await wireCall(session, { path: path(ENDPOINTS.ruleLogSearch, args.schemaCode), method: "POST", body })).data;
|
|
28
|
+
};
|
|
29
|
+
let data;
|
|
30
|
+
let rows;
|
|
31
|
+
let rowFilter;
|
|
32
|
+
if (args.bizObjectId === undefined) {
|
|
33
|
+
data = await fetch(requestedPage, requestedSize);
|
|
34
|
+
rows = Array.isArray(data.content) ? data.content : [];
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
rows = [];
|
|
38
|
+
let scannedElements = 0;
|
|
39
|
+
let scannedPages = 0;
|
|
40
|
+
let found = false;
|
|
41
|
+
for (let p = 0; p < 5; p += 1) {
|
|
42
|
+
const candidate = await fetch(p, 20);
|
|
43
|
+
scannedPages += 1;
|
|
44
|
+
const pageRows = Array.isArray(candidate.content) ? candidate.content : [];
|
|
45
|
+
scannedElements += pageRows.length;
|
|
46
|
+
const hit = pageRows.filter((row) => Array.isArray(row.inputSummaries) && row.inputSummaries.some((v) => v && typeof v === "object" && v.id === args.bizObjectId));
|
|
47
|
+
rows.push(...hit);
|
|
48
|
+
if (hit.length) {
|
|
49
|
+
found = true;
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
data = { totalElements: rows.length, totalPages: scannedPages };
|
|
54
|
+
rowFilter = { bizObjectId: args.bizObjectId, matched: found, scannedPages, scannedElements };
|
|
55
|
+
}
|
|
56
|
+
const logs = await Promise.all(rows.map(async (row, index) => {
|
|
57
|
+
const log = { ruleCode: row.code, name: row.name, triggerType: row.triggerType, status: row.status, triggerTime: row.triggerTime, finishTime: row.finishTime, ...(row.errMsg ? { errMsg: row.errMsg } : {}), ruleVersion: row.ruleVersion, traceId: row.traceId, triggerRows: Array.isArray(row.inputSummaries) ? row.inputSummaries.map((v) => ({ id: v.id, name: v.name })) : [] };
|
|
58
|
+
if (args.includeNodes === true && index < 3) {
|
|
59
|
+
const nodeData = (await wireCall(session, { path: path(ENDPOINTS.ruleActivityLog, args.schemaCode), method: "POST", body: { ruleLogId: row.id } })).data;
|
|
60
|
+
log.nodes = Array.isArray(nodeData) ? nodeData.map((node) => ({ type: node.type, name: node.name, status: node.status, ...(node.targetSchemaCode ? { targetSchemaCode: node.targetSchemaCode } : {}), ...(node.errMsg ? { errMsg: node.errMsg } : {}) })) : [];
|
|
61
|
+
}
|
|
62
|
+
return log;
|
|
63
|
+
}));
|
|
64
|
+
return { index: { schemaCode: args.schemaCode, page: requestedPage, size: requestedSize, totalElements: data.totalElements ?? logs.length, totalPages: data.totalPages ?? 0, ...(rowFilter ? { rowFilter } : {}) }, logs, notes: [...notes, ...(args.includeNodes === true ? ["节点 VO 不提供 targetBizObjectId,节点行级 id 不可得;仅前 3 条命中日志拉取节点链"] : [])] };
|
|
65
|
+
}, { target: `rulelog.search:${args.schemaCode}:${JSON.stringify(args)}` }),
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=rulelog.js.map
|
package/dist/tools.js
CHANGED
|
@@ -13,6 +13,7 @@ import { registerFieldLane } from "./lanes/field.js";
|
|
|
13
13
|
import { registerDataRuleLane } from "./lanes/datarule.js";
|
|
14
14
|
import { registerFormLane } from "./lanes/form.js";
|
|
15
15
|
import { registerBusinessRuleLane } from "./lanes/businessrule.js";
|
|
16
|
+
import { registerRuleLogLane } from "./lanes/rulelog.js";
|
|
16
17
|
import { registerRuleLifecycleLane } from "./lanes/rule-lifecycle.js";
|
|
17
18
|
import { registerRuntimeDataLane } from "./lanes/runtime-data.js";
|
|
18
19
|
import { registerWorkflowLane } from "./lanes/workflow.js";
|
|
@@ -57,6 +58,7 @@ export function buildToolRegistry() {
|
|
|
57
58
|
registerDataRuleLane(tools);
|
|
58
59
|
registerFormLane(tools);
|
|
59
60
|
registerBusinessRuleLane(tools);
|
|
61
|
+
registerRuleLogLane(tools);
|
|
60
62
|
registerRuleLifecycleLane(tools);
|
|
61
63
|
registerRuntimeDataLane(tools);
|
|
62
64
|
registerWorkflowLane(tools);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stalfh233/omc-cli",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.24",
|
|
4
4
|
"description": "CloudPivot 8.6 configuration capability CLI — governed, fail-closed, coverage-manifest bounded.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"commander": "14.0.3",
|
|
58
|
-
"omc-core": "0.6.
|
|
58
|
+
"omc-core": "0.6.24",
|
|
59
59
|
"proper-lockfile": "4.1.2",
|
|
60
60
|
"write-file-atomic": "6.0.0",
|
|
61
61
|
"zod": "^3.23.8",
|
|
@@ -73,6 +73,6 @@
|
|
|
73
73
|
"directory": "packages/omc-cli"
|
|
74
74
|
},
|
|
75
75
|
"optionalDependencies": {
|
|
76
|
-
"@stalfh233/omc-fake-platform": "0.6.
|
|
76
|
+
"@stalfh233/omc-fake-platform": "0.6.24"
|
|
77
77
|
}
|
|
78
78
|
}
|
|
@@ -132,7 +132,7 @@ only the section for the capability you need —
|
|
|
132
132
|
## 业务规则 `businessrule`
|
|
133
133
|
|
|
134
134
|
- **能做哪些事**:图形规则图(nodeGraph)——数据事件(Create/Update/Delete)触发、按钮/流程触发、动作节点(UPDATE/CREATE/DELETE/QUERY/ASSIGN/MESSAGE/BIZ_ACTION/GET_LIST…)、BRANCH 条件分支、**定时任务 TIMING_TASK**(每天/周期,SCHEDULER 节点)。
|
|
135
|
-
- **工具**:`rule.list`、`rule.get`、`rule.references`(跨规则引用检索:谁引用了服务/模型/字段)、`rule.save`、`rule.node.update
|
|
135
|
+
- **工具**:`rule.list`、`rule.get`、`rule.references`(跨规则引用检索:谁引用了服务/模型/字段)、`rule.save`、`rule.node.update`、`rulelog.search`(**规则执行日志**:触发了没有/哪行触发/节点链——data.update 后查 F31)
|
|
136
136
|
- **recipe**:
|
|
137
137
|
- `omc describe rule.save --example standard-business-rule-graph`
|
|
138
138
|
- `omc describe rule.save --example business-rule-branch-conditional`
|