@southwind-ai/shared 0.2.7 → 0.3.0

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/index.ts CHANGED
@@ -2,6 +2,9 @@ export * from "./src/audit.js";
2
2
  export * from "./src/ai-operation-readiness.js";
3
3
  // @windy-module system.agent begin
4
4
  export * from "./src/ai-runtime-report.js";
5
+ export * from "./src/agent-workflow.js";
6
+ export * from "./src/agent-workflow-events.js";
7
+ export * from "./src/agent-workflow-evaluation.js";
5
8
  // @windy-module system.agent end
6
9
  export * from "./src/database.js";
7
10
  export * from "./src/data-governance.js";
@@ -20,7 +23,6 @@ export * from "./src/platform-settings.js";
20
23
  export * from "./src/profile.js";
21
24
  export * from "./src/primitives.js";
22
25
  export * from "./src/rbac.js";
23
- export * from "./src/ruoyi.js";
24
26
  export * from "./src/scheduler.js";
25
27
  export * from "./src/search-provider.js";
26
28
  // @windy-module system.agent begin
@@ -28,3 +30,5 @@ export * from "./src/screenshot-context-digest.js";
28
30
  // @windy-module system.agent end
29
31
  export * from "./src/stable-key.js";
30
32
  export * from "./src/workflow.js";
33
+
34
+ export * from "./src/license-console-capabilities.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@southwind-ai/shared",
3
- "version": "0.2.7",
3
+ "version": "0.3.0",
4
4
  "license": "UNLICENSED",
5
5
  "type": "module",
6
6
  "engines": {
@@ -0,0 +1,113 @@
1
+ import type { ISODateTime } from "./primitives.js";
2
+ import type { AgentWorkflowBudget } from "./agent-workflow-run.js";
3
+
4
+ export const AGENT_WORKFLOW_SCHEMA_VERSION = 1 as const;
5
+
6
+ export type AgentWorkflowNodeType =
7
+ | "model"
8
+ | "tool"
9
+ | "subagent"
10
+ | "condition"
11
+ | "parallel"
12
+ | "join"
13
+ | "approval"
14
+ | "job"
15
+ | "wait"
16
+ | "artifact"
17
+ | "final";
18
+
19
+ export type AgentWorkflowFailurePolicy =
20
+ | { readonly mode: "fail-run" }
21
+ | {
22
+ readonly mode: "retry";
23
+ readonly maxAttempts: number;
24
+ readonly backoffSeconds: number;
25
+ readonly exhausted: "fail-run" | "skip";
26
+ }
27
+ | { readonly mode: "fallback"; readonly nodeId: string }
28
+ | { readonly mode: "skip" };
29
+
30
+ interface NodeBase<T extends AgentWorkflowNodeType> {
31
+ readonly id: string;
32
+ readonly type: T;
33
+ readonly label: string;
34
+ readonly inputSchemaKey?: string;
35
+ readonly outputSchemaKey?: string;
36
+ readonly timeoutSeconds?: number;
37
+ readonly failurePolicy: AgentWorkflowFailurePolicy;
38
+ }
39
+
40
+ export type AgentWorkflowNode =
41
+ | (NodeBase<"model"> & {
42
+ readonly operationKey: string;
43
+ readonly promptKey: string;
44
+ })
45
+ | (NodeBase<"tool"> & {
46
+ readonly toolKey: string;
47
+ readonly effect: "read" | "write";
48
+ })
49
+ | (NodeBase<"subagent"> & {
50
+ readonly capabilityKey: string;
51
+ readonly operationKey: string;
52
+ readonly allowedToolKeys: readonly string[];
53
+ readonly requiredFeatureKeys: readonly string[];
54
+ readonly requiredPermissionKeys: readonly string[];
55
+ readonly allowedLicenseVersions?: readonly string[];
56
+ readonly workspacePolicyKey: string;
57
+ readonly scopePolicyKey: string;
58
+ readonly budget: AgentWorkflowBudget;
59
+ })
60
+ | (NodeBase<"condition"> & {
61
+ readonly conditionKey: string;
62
+ readonly branches: readonly string[];
63
+ })
64
+ | (NodeBase<"parallel"> & { readonly maxConcurrency: number })
65
+ | (NodeBase<"join"> & { readonly strategy: "all" | "all-settled" | "any" })
66
+ | (NodeBase<"approval"> & {
67
+ readonly title: string;
68
+ readonly candidateRoles: readonly string[];
69
+ })
70
+ | (NodeBase<"job"> & { readonly taskKey: string })
71
+ | (NodeBase<"wait"> & { readonly signalKey: string })
72
+ | (NodeBase<"artifact"> & {
73
+ readonly policyKey: string;
74
+ readonly artifactKind: string;
75
+ })
76
+ | (NodeBase<"final"> & { readonly outputSchemaKey: string });
77
+
78
+ export interface AgentWorkflowEdge {
79
+ readonly from: string;
80
+ readonly to: string;
81
+ readonly branch?: string;
82
+ }
83
+
84
+ export interface AgentWorkflowDefinition {
85
+ readonly schemaVersion: typeof AGENT_WORKFLOW_SCHEMA_VERSION;
86
+ readonly workflowKey: string;
87
+ readonly version: string;
88
+ readonly label: string;
89
+ readonly description?: string;
90
+ readonly entryNodeId: string;
91
+ readonly nodes: readonly AgentWorkflowNode[];
92
+ readonly edges: readonly AgentWorkflowEdge[];
93
+ readonly budget: AgentWorkflowBudget;
94
+ }
95
+
96
+ export interface AgentWorkflowReleaseCoordinates {
97
+ readonly runtimeVersion: string;
98
+ readonly routeVersion: string;
99
+ readonly promptVersion: string;
100
+ readonly toolSchemaVersion: string;
101
+ readonly manifestDigest: string;
102
+ }
103
+
104
+ export interface AgentWorkflowRelease {
105
+ readonly releaseId: string;
106
+ readonly releaseDigest: string;
107
+ readonly definitionId: string;
108
+ readonly definitionDigest: string;
109
+ readonly definition: AgentWorkflowDefinition;
110
+ readonly coordinates: AgentWorkflowReleaseCoordinates;
111
+ readonly publishedBy: string;
112
+ readonly publishedAt: ISODateTime;
113
+ }
@@ -0,0 +1,123 @@
1
+ import type { JsonValue } from "./json.js";
2
+ import type { ISODateTime } from "./primitives.js";
3
+ import type {
4
+ AgentWorkflowArtifactRef,
5
+ AgentWorkflowBudget,
6
+ AgentWorkflowUsage,
7
+ } from "./agent-workflow-run.js";
8
+
9
+ export interface AgentDelegationGrant {
10
+ readonly delegationId: string;
11
+ readonly parentRunId: string;
12
+ readonly parentNodeId: string;
13
+ readonly parentNodeRunId: string;
14
+ readonly childSessionId: string;
15
+ readonly childAgentRunId?: string;
16
+ readonly capabilityCeiling: {
17
+ readonly capabilityKey: string;
18
+ readonly allowedToolKeys: readonly string[];
19
+ readonly requiredFeatureKeys: readonly string[];
20
+ readonly requiredPermissionKeys: readonly string[];
21
+ readonly allowedLicenseVersions?: readonly string[];
22
+ readonly workspacePolicyKey: string;
23
+ readonly workspaceId: string;
24
+ readonly scopeSnapshot: import("./rbac.js").AuthorizationScopeSnapshot;
25
+ readonly scopePolicyDigest: string;
26
+ readonly policyDigest: string;
27
+ readonly authorizationProofId: string;
28
+ readonly runPolicyDigest: string;
29
+ readonly scopeDigest: string;
30
+ readonly authorizationSnapshotDigest: string;
31
+ };
32
+ readonly budget: AgentWorkflowBudget;
33
+ readonly status: "created" | "running" | "completed" | "failed" | "cancelled";
34
+ readonly outputArtifacts: readonly AgentWorkflowArtifactRef[];
35
+ }
36
+
37
+ export interface AgentWorkflowBudgetReservation {
38
+ readonly reservationId: string;
39
+ readonly parentRunId: string;
40
+ readonly parentNodeRunId: string;
41
+ readonly delegationId: string;
42
+ readonly idempotencyKey: string;
43
+ readonly authorizationProofId: string;
44
+ readonly authorizationSnapshotDigest: string;
45
+ readonly runPolicyDigest: string;
46
+ readonly reserved: AgentWorkflowBudget;
47
+ readonly consumed: AgentWorkflowUsage;
48
+ readonly status: "active" | "settled" | "released";
49
+ readonly usageReceiptId?: string;
50
+ readonly reasonCode?: string;
51
+ readonly settledAt?: ISODateTime;
52
+ readonly version: number;
53
+ readonly createdAt: ISODateTime;
54
+ readonly updatedAt: ISODateTime;
55
+ }
56
+
57
+ export interface AgentWorkflowSideEffectCommand {
58
+ readonly commandId: string;
59
+ readonly runId: string;
60
+ readonly nodeRunId: string;
61
+ readonly effectKind: "tool" | "approval" | "job" | "subagent";
62
+ readonly effectKey: string;
63
+ readonly adapter: {
64
+ readonly kind:
65
+ | "agent-tool"
66
+ | "approval-work-item"
67
+ | "durable-job"
68
+ | "child-agent";
69
+ readonly coordinate: string;
70
+ };
71
+ readonly idempotencyKey: string;
72
+ readonly requestDigest: string;
73
+ readonly generation: number;
74
+ readonly fenceTokenDigest?: string;
75
+ readonly authorizationSnapshotDigest?: string;
76
+ readonly runPolicyDigest?: string;
77
+ readonly budgetReservationId?: string;
78
+ readonly delegationId?: string;
79
+ readonly status:
80
+ | "prepared"
81
+ | "dispatched"
82
+ | "cancellation-requested"
83
+ | "committed"
84
+ | "reconciled"
85
+ | "cancelled"
86
+ | "failed";
87
+ readonly safeErrorCode?: string;
88
+ readonly claimedAt?: ISODateTime;
89
+ readonly committedAt?: ISODateTime;
90
+ readonly version: number;
91
+ readonly createdAt: ISODateTime;
92
+ readonly updatedAt: ISODateTime;
93
+ }
94
+
95
+ export interface AgentWorkflowSideEffectReceipt {
96
+ readonly receiptId: string;
97
+ readonly commandId: string;
98
+ readonly runId: string;
99
+ readonly nodeRunId: string;
100
+ readonly effectKind: AgentWorkflowSideEffectCommand["effectKind"];
101
+ readonly generation: number;
102
+ readonly fenceTokenDigest: string;
103
+ readonly requestDigest: string;
104
+ readonly externalReceiptId: string;
105
+ readonly resultDigest: string;
106
+ readonly smallResult?: JsonValue;
107
+ readonly artifactRefs?: readonly AgentWorkflowArtifactRef[];
108
+ readonly authorizationSnapshotDigest: string;
109
+ readonly runPolicyDigest: string;
110
+ readonly committedAt: ISODateTime;
111
+ }
112
+
113
+ export function budgetFitsWithin(
114
+ child: AgentWorkflowBudget,
115
+ parent: AgentWorkflowBudget,
116
+ ): boolean {
117
+ return (Object.keys(parent) as Array<keyof AgentWorkflowBudget>).every(
118
+ (key) =>
119
+ Number.isSafeInteger(child[key]) &&
120
+ child[key] >= 0 &&
121
+ child[key] <= parent[key],
122
+ );
123
+ }
@@ -0,0 +1,159 @@
1
+ import type { ISODateTime } from "./primitives.js";
2
+ import type {
3
+ AgentWorkflowArtifactRef,
4
+ AgentWorkflowBudget,
5
+ AgentWorkflowMeasuredCost,
6
+ AgentWorkflowMeasuredCount,
7
+ } from "./agent-workflow-run.js";
8
+
9
+ export type AgentWorkflowEvaluationArmKind = "single-agent" | "multi-agent";
10
+
11
+ export interface AgentWorkflowEvaluationReleaseIdentity {
12
+ readonly releaseDigest: string;
13
+ readonly routeVersion: string;
14
+ readonly promptVersion: string;
15
+ readonly manifestDigest: string;
16
+ }
17
+
18
+ export interface AgentWorkflowEvaluationConditions {
19
+ readonly inputDigest: string | null;
20
+ readonly modelRouteKey: string | null;
21
+ readonly model: string | null;
22
+ readonly modelDeploymentDigest: string | null;
23
+ readonly modelConfigurationDigest: string | null;
24
+ readonly toolSchemaDigest: string;
25
+ readonly toolRuntimePolicyDigest: string | null;
26
+ readonly allowedToolKeys: readonly string[];
27
+ readonly budget: AgentWorkflowBudget;
28
+ readonly scopeDigest: string;
29
+ readonly authorizationSnapshotDigest: string | null;
30
+ readonly workspacePolicyDigest: string | null;
31
+ readonly executionPolicyDigest: string | null;
32
+ readonly runtimeVersion: string;
33
+ }
34
+
35
+ export type AgentWorkflowEvaluationAvailability =
36
+ | { readonly status: "run"; readonly runId: string }
37
+ | { readonly status: "unavailable"; readonly reasonCode: string };
38
+
39
+ export interface AgentWorkflowEvaluationArmCoordinates {
40
+ readonly releaseId: string;
41
+ readonly release: AgentWorkflowEvaluationReleaseIdentity;
42
+ readonly conditions: AgentWorkflowEvaluationConditions;
43
+ readonly availability: AgentWorkflowEvaluationAvailability;
44
+ }
45
+
46
+ export interface AgentWorkflowEvaluationIdentity {
47
+ readonly evaluationSetKey: string;
48
+ readonly evaluationSetVersion: string;
49
+ readonly caseKey: string;
50
+ readonly caseVersion: string;
51
+ readonly trialKey: string;
52
+ readonly trialIndex: number;
53
+ readonly scopeDigest: string;
54
+ readonly singleAgent: AgentWorkflowEvaluationArmCoordinates;
55
+ readonly multiAgent: AgentWorkflowEvaluationArmCoordinates;
56
+ readonly rubricKey: string;
57
+ readonly rubricVersion: string;
58
+ }
59
+
60
+ export interface AgentWorkflowEvaluationMismatchEvidence {
61
+ readonly source: "requested-vs-observed" | "arm-comparison";
62
+ readonly field: string;
63
+ readonly reasonCode: string;
64
+ readonly expectedDigest: string;
65
+ readonly observedDigest?: string;
66
+ readonly counterpartArm?: AgentWorkflowEvaluationArmKind;
67
+ }
68
+
69
+ export interface AgentWorkflowEvaluationFailure {
70
+ readonly category:
71
+ | "model"
72
+ | "tool"
73
+ | "authorization"
74
+ | "approval"
75
+ | "job"
76
+ | "recovery"
77
+ | "budget"
78
+ | "runtime";
79
+ readonly stage: string;
80
+ readonly safeCode: string;
81
+ }
82
+
83
+ export interface AgentWorkflowHumanHandoff {
84
+ readonly reason: string;
85
+ readonly outcome: "resolved" | "unresolved" | "cancelled";
86
+ readonly durationMs: number;
87
+ }
88
+
89
+ export interface AgentWorkflowEvaluationMetrics {
90
+ readonly outcome:
91
+ | "completed"
92
+ | "failed"
93
+ | "cancelled"
94
+ | "timed-out"
95
+ | "invalid";
96
+ readonly latencyMs: number;
97
+ readonly cost: AgentWorkflowMeasuredCost;
98
+ readonly inputTokens: AgentWorkflowMeasuredCount;
99
+ readonly outputTokens: AgentWorkflowMeasuredCount;
100
+ readonly failures: readonly AgentWorkflowEvaluationFailure[];
101
+ readonly humanHandoffs: readonly AgentWorkflowHumanHandoff[];
102
+ readonly evidenceQuality:
103
+ | {
104
+ readonly status: "graded";
105
+ readonly score: number;
106
+ readonly source: "rubric-evidence";
107
+ }
108
+ | { readonly status: "unknown"; readonly reasonCode: string };
109
+ readonly safety:
110
+ | {
111
+ readonly status: "measured";
112
+ readonly refusalCount: number;
113
+ readonly unsafeAllowCount: number;
114
+ readonly source: "host-audit";
115
+ }
116
+ | { readonly status: "unknown"; readonly reasonCode: string };
117
+ readonly recovery:
118
+ | {
119
+ readonly status: "measured";
120
+ readonly attemptCount: number;
121
+ readonly succeeded: boolean;
122
+ readonly source: "workflow-run";
123
+ }
124
+ | { readonly status: "unknown"; readonly reasonCode: string };
125
+ }
126
+
127
+ export interface AgentWorkflowEvaluationArm {
128
+ readonly kind: AgentWorkflowEvaluationArmKind;
129
+ readonly status: "pending" | "completed" | "unavailable" | "invalid";
130
+ readonly coordinates: AgentWorkflowEvaluationArmCoordinates;
131
+ readonly runId?: string;
132
+ readonly metrics?: AgentWorkflowEvaluationMetrics;
133
+ readonly evidenceArtifacts: readonly AgentWorkflowArtifactRef[];
134
+ readonly mismatchEvidence: readonly AgentWorkflowEvaluationMismatchEvidence[];
135
+ readonly dispositionReason?: string;
136
+ }
137
+
138
+ export interface AgentWorkflowEvaluationRecord {
139
+ readonly evaluationId: string;
140
+ readonly tenantId: string;
141
+ readonly createdBy: string;
142
+ readonly identity: AgentWorkflowEvaluationIdentity;
143
+ readonly identityDigest: string;
144
+ readonly singleAgent: AgentWorkflowEvaluationArm;
145
+ readonly multiAgent: AgentWorkflowEvaluationArm;
146
+ readonly status: "pending" | "completed" | "unavailable" | "non-comparable";
147
+ readonly dispositionReason?: string;
148
+ readonly createdAt: ISODateTime;
149
+ readonly completedAt?: ISODateTime;
150
+ }
151
+
152
+ export interface AgentWorkflowEvaluationSummary {
153
+ readonly evaluationSetKey: string;
154
+ readonly evaluationSetVersion: string;
155
+ readonly comparableSampleCount: number;
156
+ readonly totalSampleCount: number;
157
+ readonly singleAgentCompletionRate?: number;
158
+ readonly multiAgentCompletionRate?: number;
159
+ }
@@ -0,0 +1,99 @@
1
+ import type { ISODateTime } from "./primitives.js";
2
+ import type {
3
+ AgentWorkflowArtifactRef,
4
+ AgentWorkflowInputReceipt,
5
+ } from "./agent-workflow.js";
6
+
7
+ export const AGENT_WORKFLOW_EVENT_SCHEMA_VERSION = 1 as const;
8
+
9
+ export type AgentWorkflowEventData =
10
+ | {
11
+ readonly type: "workflow.run-created";
12
+ readonly releaseId: string;
13
+ readonly inputReceipt: AgentWorkflowInputReceipt;
14
+ readonly parentRunId?: string;
15
+ readonly parentNodeId?: string;
16
+ readonly parentNodeRunId?: string;
17
+ readonly delegationId?: string;
18
+ }
19
+ | { readonly type: "workflow.run-started" }
20
+ | {
21
+ readonly type: "workflow.wait-signalled";
22
+ readonly nodeRunId: string;
23
+ readonly signalKey: string;
24
+ readonly payloadDigest: string;
25
+ readonly receiptId: string;
26
+ }
27
+ | {
28
+ readonly type:
29
+ | "workflow.run-completed"
30
+ | "workflow.run-failed"
31
+ | "workflow.run-cancelled"
32
+ | "workflow.run-timed-out";
33
+ readonly safeCode?: string;
34
+ }
35
+ | {
36
+ readonly type: "workflow.cancellation-requested";
37
+ readonly reasonCode: string;
38
+ }
39
+ | {
40
+ readonly type:
41
+ | "workflow.recovery-started"
42
+ | "workflow.recovery-completed";
43
+ readonly recoveryNumber: number;
44
+ }
45
+ | {
46
+ readonly type: "workflow.recovery-waiting" | "workflow.recovery-failed";
47
+ readonly recoveryNumber: number;
48
+ readonly safeCode: string;
49
+ readonly unresolvedCount: number;
50
+ }
51
+ | {
52
+ readonly type:
53
+ | "workflow.node-ready"
54
+ | "workflow.node-started"
55
+ | "workflow.node-waiting"
56
+ | "workflow.node-completed"
57
+ | "workflow.node-failed"
58
+ | "workflow.node-cancelled"
59
+ | "workflow.node-skipped"
60
+ | "workflow.node-timed-out"
61
+ | "workflow.node-retry-scheduled";
62
+ readonly nodeRunId: string;
63
+ readonly nodeId: string;
64
+ readonly resultDigest?: string;
65
+ readonly receiptId?: string;
66
+ readonly safeCode?: string;
67
+ }
68
+ | {
69
+ readonly type:
70
+ | "workflow.delegation-created"
71
+ | "workflow.delegation-child-linked"
72
+ | "workflow.delegation-completed"
73
+ | "workflow.delegation-failed"
74
+ | "workflow.delegation-cancel-requested";
75
+ readonly delegationId: string;
76
+ readonly parentNodeId: string;
77
+ readonly parentNodeRunId: string;
78
+ readonly childSessionId: string;
79
+ readonly childAgentRunId?: string;
80
+ readonly artifactIds?: readonly string[];
81
+ readonly safeCode?: string;
82
+ }
83
+ | {
84
+ readonly type: "workflow.artifact-linked";
85
+ readonly nodeRunId: string;
86
+ readonly artifact: AgentWorkflowArtifactRef;
87
+ };
88
+
89
+ export interface AgentWorkflowEventEnvelope {
90
+ readonly schemaVersion: typeof AGENT_WORKFLOW_EVENT_SCHEMA_VERSION;
91
+ readonly eventId: string;
92
+ readonly workflowRunId: string;
93
+ readonly sequence: number;
94
+ readonly occurredAt: ISODateTime;
95
+ readonly causationEventId?: string;
96
+ readonly parentEventId?: string;
97
+ readonly childWorkflowRunId?: string;
98
+ readonly data: AgentWorkflowEventData;
99
+ }
@@ -0,0 +1,259 @@
1
+ import type { JsonValue } from "./json.js";
2
+ import type { ISODateTime } from "./primitives.js";
3
+ import type { AgentWorkflowNodeType } from "./agent-workflow-definition.js";
4
+
5
+ export interface AgentWorkflowBudget {
6
+ readonly maxDurationSeconds: number;
7
+ readonly maxModelAttempts: number;
8
+ readonly maxToolCalls: number;
9
+ readonly maxSubagents: number;
10
+ readonly maxParallelism: number;
11
+ readonly maxInputTokens: number;
12
+ readonly maxOutputTokens: number;
13
+ readonly maxCostMicros: number;
14
+ }
15
+
16
+ export interface AgentWorkflowArtifactRef {
17
+ readonly artifactId: string;
18
+ readonly kind: string;
19
+ readonly mediaType: string;
20
+ readonly byteSize: number;
21
+ readonly sha256: string;
22
+ readonly retentionPolicyKey: string;
23
+ readonly source: {
24
+ readonly moduleKey: string;
25
+ readonly kind: string;
26
+ readonly id: string;
27
+ readonly version: string;
28
+ readonly sequence: number;
29
+ readonly digest?: string;
30
+ };
31
+ }
32
+
33
+ export type AgentWorkflowMeasuredCount =
34
+ | {
35
+ readonly status: "measured";
36
+ readonly value: number;
37
+ readonly source: "provider-reported" | "host-measured";
38
+ }
39
+ | { readonly status: "unknown"; readonly reasonCode: string };
40
+
41
+ export type AgentWorkflowMeasuredCost =
42
+ | {
43
+ readonly status: "measured";
44
+ readonly amountMicros: number;
45
+ readonly currency: string;
46
+ readonly source:
47
+ | "provider-reported"
48
+ | "catalog-estimated"
49
+ | "host-measured";
50
+ }
51
+ | { readonly status: "unknown"; readonly reasonCode: string };
52
+
53
+ export interface AgentWorkflowUsage {
54
+ readonly durationMs: number;
55
+ readonly modelAttempts: number;
56
+ readonly toolCalls: number;
57
+ readonly subagents: number;
58
+ readonly inputTokens: AgentWorkflowMeasuredCount;
59
+ readonly outputTokens: AgentWorkflowMeasuredCount;
60
+ readonly cost: AgentWorkflowMeasuredCost;
61
+ }
62
+
63
+ export interface AgentWorkflowInputReceipt {
64
+ readonly schemaKey: string;
65
+ readonly value: JsonValue;
66
+ readonly valueDigest: string;
67
+ readonly recordedAt: ISODateTime;
68
+ }
69
+
70
+ export type AgentWorkflowRunStatus =
71
+ | "accepted"
72
+ | "running"
73
+ | "waiting"
74
+ | "completed"
75
+ | "failed"
76
+ | "cancelled"
77
+ | "timed-out";
78
+ export type AgentWorkflowNodeRunStatus =
79
+ | "pending"
80
+ | "ready"
81
+ | "running"
82
+ | "waiting"
83
+ | "retry-scheduled"
84
+ | "completed"
85
+ | "failed"
86
+ | "cancelled"
87
+ | "skipped"
88
+ | "timed-out";
89
+
90
+ export interface AgentWorkflowRun {
91
+ readonly runId: string;
92
+ readonly releaseId: string;
93
+ readonly tenantId: string;
94
+ readonly actorId: string;
95
+ readonly routeKey: string;
96
+ readonly inputDigest: string;
97
+ readonly inputReceipt: AgentWorkflowInputReceipt;
98
+ readonly scopeDigest: string;
99
+ readonly authorizationSnapshotDigest: string;
100
+ readonly toolPolicyDigest: string;
101
+ readonly workspacePolicyDigest: string;
102
+ readonly executionPolicyDigest: string;
103
+ readonly status: AgentWorkflowRunStatus;
104
+ readonly budget: AgentWorkflowBudget;
105
+ readonly usage: AgentWorkflowUsage;
106
+ readonly deadlineAt: ISODateTime;
107
+ readonly sessionId?: string;
108
+ readonly parentRunId?: string;
109
+ readonly parentNodeId?: string;
110
+ readonly parentNodeRunId?: string;
111
+ readonly cancellationRequestedAt?: ISODateTime;
112
+ readonly createdAt: ISODateTime;
113
+ readonly updatedAt: ISODateTime;
114
+ readonly finishedAt?: ISODateTime;
115
+ readonly version: number;
116
+ readonly safeErrorCode?: string;
117
+ }
118
+
119
+ export interface AgentWorkflowNodeResultReceipt {
120
+ readonly receiptId: string;
121
+ readonly nodeRunId: string;
122
+ readonly resultDigest: string;
123
+ readonly outputSchemaKey?: string;
124
+ readonly selectedBranch?: string;
125
+ readonly smallResult?: JsonValue;
126
+ readonly executionEvidence?: {
127
+ readonly source: "agent-runtime-report";
128
+ readonly agentRunId: string;
129
+ readonly modelRouteKey: string;
130
+ readonly model: string;
131
+ readonly modelDeploymentDigest: string;
132
+ readonly modelConfigurationDigest: string;
133
+ };
134
+ readonly artifactIds: readonly string[];
135
+ readonly recordedAt: ISODateTime;
136
+ }
137
+
138
+ export interface AgentWorkflowNodeRun {
139
+ readonly nodeRunId: string;
140
+ readonly runId: string;
141
+ readonly nodeId: string;
142
+ readonly previousNodeRunId?: string;
143
+ readonly nodeType: AgentWorkflowNodeType;
144
+ readonly status: AgentWorkflowNodeRunStatus;
145
+ readonly attempt: number;
146
+ readonly maxAttempts: number;
147
+ readonly idempotencyKey: string;
148
+ readonly adapter?: {
149
+ readonly kind:
150
+ | "model-operation"
151
+ | "agent-tool"
152
+ | "child-agent"
153
+ | "approval-work-item"
154
+ | "durable-job"
155
+ | "wait-signal"
156
+ | "artifact-store"
157
+ | "finalizer";
158
+ readonly coordinate: string;
159
+ };
160
+ readonly inputArtifacts: readonly AgentWorkflowArtifactRef[];
161
+ readonly outputArtifacts: readonly AgentWorkflowArtifactRef[];
162
+ readonly resultReceipt?: AgentWorkflowNodeResultReceipt;
163
+ readonly safeErrorCode?: string;
164
+ readonly createdAt: ISODateTime;
165
+ readonly updatedAt: ISODateTime;
166
+ readonly startedAt?: ISODateTime;
167
+ readonly finishedAt?: ISODateTime;
168
+ readonly version: number;
169
+ }
170
+
171
+ export function isAgentWorkflowTerminal(
172
+ status: AgentWorkflowRunStatus,
173
+ ): boolean {
174
+ return ["completed", "failed", "cancelled", "timed-out"].includes(status);
175
+ }
176
+
177
+ export function isAgentWorkflowNodeTerminal(
178
+ status: AgentWorkflowNodeRunStatus,
179
+ ): boolean {
180
+ return ["completed", "failed", "cancelled", "skipped", "timed-out"].includes(
181
+ status,
182
+ );
183
+ }
184
+
185
+ export function isAgentWorkflowRunTransitionAllowed(
186
+ from: AgentWorkflowRunStatus,
187
+ to: AgentWorkflowRunStatus,
188
+ ): boolean {
189
+ const allowed: Record<
190
+ AgentWorkflowRunStatus,
191
+ readonly AgentWorkflowRunStatus[]
192
+ > = {
193
+ accepted: ["running", "cancelled", "timed-out", "failed"],
194
+ running: ["waiting", "completed", "failed", "cancelled", "timed-out"],
195
+ waiting: ["running", "failed", "cancelled", "timed-out"],
196
+ completed: [],
197
+ failed: [],
198
+ cancelled: [],
199
+ "timed-out": [],
200
+ };
201
+ return allowed[from].includes(to);
202
+ }
203
+
204
+ export function isAgentWorkflowNodeTransitionAllowed(
205
+ from: AgentWorkflowNodeRunStatus,
206
+ to: AgentWorkflowNodeRunStatus,
207
+ ): boolean {
208
+ const allowed: Record<
209
+ AgentWorkflowNodeRunStatus,
210
+ readonly AgentWorkflowNodeRunStatus[]
211
+ > = {
212
+ pending: ["ready", "skipped", "cancelled", "timed-out"],
213
+ ready: ["running", "cancelled", "timed-out"],
214
+ running: [
215
+ "waiting",
216
+ "completed",
217
+ "failed",
218
+ "cancelled",
219
+ "skipped",
220
+ "timed-out",
221
+ ],
222
+ waiting: [
223
+ "running",
224
+ "completed",
225
+ "failed",
226
+ "cancelled",
227
+ "skipped",
228
+ "timed-out",
229
+ ],
230
+ failed: ["retry-scheduled"],
231
+ "retry-scheduled": ["cancelled", "timed-out"],
232
+ completed: [],
233
+ cancelled: [],
234
+ skipped: [],
235
+ "timed-out": [],
236
+ };
237
+ return allowed[from].includes(to);
238
+ }
239
+
240
+ export function usageFitsWithinBudget(
241
+ usage: AgentWorkflowUsage,
242
+ budget: AgentWorkflowBudget,
243
+ ): boolean {
244
+ if (
245
+ usage.inputTokens.status !== "measured" ||
246
+ usage.outputTokens.status !== "measured" ||
247
+ usage.cost.status !== "measured"
248
+ )
249
+ return false;
250
+ return (
251
+ usage.durationMs <= budget.maxDurationSeconds * 1_000 &&
252
+ usage.modelAttempts <= budget.maxModelAttempts &&
253
+ usage.toolCalls <= budget.maxToolCalls &&
254
+ usage.subagents <= budget.maxSubagents &&
255
+ usage.inputTokens.value <= budget.maxInputTokens &&
256
+ usage.outputTokens.value <= budget.maxOutputTokens &&
257
+ usage.cost.amountMicros <= budget.maxCostMicros
258
+ );
259
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./agent-workflow-definition.js";
2
+ export * from "./agent-workflow-run.js";
3
+ export * from "./agent-workflow-delegation.js";
@@ -107,6 +107,8 @@ export interface AiRuntimeRunModelDeployment {
107
107
 
108
108
  export interface AiRuntimeRunListItem {
109
109
  runId: string;
110
+ /** 创建该 Run 的稳定 Engine 实现标识;历史 ADK Run 保持原值。 */
111
+ engineId: string;
110
112
  operationKey: string;
111
113
  actor: AiRuntimeActorSummary | null;
112
114
  status: AiRuntimeRunStatus;
@@ -142,11 +144,34 @@ export interface AiRuntimeAttemptDetail extends AiRuntimeRunUsage {
142
144
  finishedAt: ISODateTime | null;
143
145
  }
144
146
 
147
+ export interface AiRuntimeTrajectoryEvent {
148
+ sequence: number;
149
+ sequenceEnd: number;
150
+ type: string;
151
+ title: string;
152
+ toolKey?: string;
153
+ approvalOutcome?: string;
154
+ attemptSequence?: number;
155
+ totalTokens?: number;
156
+ artifactCount?: number;
157
+ inputModalities?: string[];
158
+ deltaCount?: number;
159
+ outputCharacters?: number;
160
+ errorCode?: string;
161
+ }
162
+
163
+ export interface AiRuntimeTrajectory {
164
+ /** canonical Run 超过既有留存期后,报表仍可读但轨迹不再可用。 */
165
+ available: boolean;
166
+ events: AiRuntimeTrajectoryEvent[];
167
+ }
168
+
145
169
  export interface AiRuntimeRunDetail extends AiRuntimeRunListItem {
146
170
  releaseId: string;
147
171
  traceId: string;
148
172
  safeErrorCode: string | null;
149
173
  attempts: AiRuntimeAttemptDetail[];
174
+ trajectory: AiRuntimeTrajectory;
150
175
  }
151
176
 
152
177
  export type AiRuntimeRunPage = PageResult<AiRuntimeRunListItem>;
@@ -0,0 +1,163 @@
1
+ import type { LicenseOperatorPermission } from "./license.js";
2
+
3
+ /** 厂商签发中心独立认证域;不装配到客户 system.license。 */
4
+ export const LICENSE_CONSOLE_CAPABILITIES = {
5
+ records: {
6
+ feature: "license.record",
7
+ permission: "license.record.read",
8
+ entry: "records",
9
+ apis: [
10
+ "GET /api/licenses",
11
+ "GET /api/licenses/:id",
12
+ "GET /api/licenses/:id/download",
13
+ "GET /api/licenses/:id/activation-code",
14
+ "GET /api/licenses/:id/events",
15
+ "GET /api/events",
16
+ "GET /api/customers",
17
+ "GET /api/customers/:id",
18
+ "GET /api/projects",
19
+ "GET /api/projects/:id",
20
+ "GET /api/contracts",
21
+ "GET /api/contracts/:id",
22
+ "GET /api/license-versions",
23
+ "GET /api/license-versions/:id",
24
+ "GET /api/nodes",
25
+ "GET /api/nodes/:id",
26
+ "GET /api/keys/active",
27
+ "GET /api/projects/:projectId/contracts",
28
+ "GET /api/projects/:projectId/nodes",
29
+ "GET /api/projects/:projectId/license-versions",
30
+ "GET /api/projects/:projectId/licenses",
31
+ "GET /api/keys",
32
+ "GET /api/signing/diagnostics",
33
+ ],
34
+ auditActions: ["license.downloaded"],
35
+ },
36
+ projects: {
37
+ feature: "license.project",
38
+ permission: "license.project.manage",
39
+ entry: "maintenance",
40
+ apis: [
41
+ "POST /api/customers",
42
+ "POST /api/projects",
43
+ "POST /api/contracts",
44
+ "POST /api/license-versions",
45
+ "POST /api/nodes",
46
+ "PATCH /api/customers/:id",
47
+ "PATCH /api/projects/:id",
48
+ "PATCH /api/contracts/:id",
49
+ "PATCH /api/license-versions/:id",
50
+ "PATCH /api/nodes/:id",
51
+ "PATCH /api/customers/:id/archive",
52
+ "PATCH /api/projects/:id/archive",
53
+ "PATCH /api/contracts/:id/archive",
54
+ "PATCH /api/license-versions/:id/archive",
55
+ "PATCH /api/nodes/:id/archive",
56
+ ],
57
+ auditActions: ["crud.create", "crud.update"],
58
+ },
59
+ issuance: {
60
+ feature: "license.issue",
61
+ permission: "license.issue",
62
+ entry: "project-issuance",
63
+ apis: [
64
+ "POST /api/projects/:projectId/licenses",
65
+ "POST /api/projects/:projectId/license-review",
66
+ "GET /api/projects/:projectId/issuance-requests/:key",
67
+ "POST /api/licenses",
68
+ "POST /api/licenses/:id/revocation-marks",
69
+ "POST /api/licenses/:id/note-corrections",
70
+ ],
71
+ auditActions: [
72
+ "license.issued",
73
+ "license.replaced",
74
+ "license.superseded",
75
+ "license.revocation-marked",
76
+ "license.note-corrected",
77
+ ],
78
+ },
79
+ keys: {
80
+ feature: "license.key",
81
+ permission: "license.key.rotate",
82
+ entry: "operations",
83
+ apis: ["POST /api/keys/rotate", "POST /api/keys/:keyId/compatibility"],
84
+ auditActions: ["license.key.rotated", "license.key.compatibility-declared"],
85
+ },
86
+ operators: {
87
+ feature: "license.operator",
88
+ permission: "license.operator.manage",
89
+ entry: "administration",
90
+ apis: [
91
+ "GET /api/operators",
92
+ "POST /api/operators",
93
+ "PATCH /api/operators/:id",
94
+ ],
95
+ auditActions: ["license.operator.created", "license.operator.updated"],
96
+ },
97
+ sessions: {
98
+ feature: "license.session",
99
+ permission: "license.session.revoke",
100
+ entry: "administration",
101
+ apis: ["POST /api/auth/sessions/:id/revoke"],
102
+ auditActions: ["auth.session.revoke"],
103
+ },
104
+ audit: {
105
+ feature: "license.audit",
106
+ permission: "license.audit.read",
107
+ entry: "administration",
108
+ apis: ["GET /api/audit-logs"],
109
+ auditActions: [],
110
+ },
111
+ } as const satisfies Record<
112
+ string,
113
+ {
114
+ feature: string;
115
+ permission: LicenseOperatorPermission;
116
+ entry: string;
117
+ apis: readonly string[];
118
+ auditActions: readonly string[];
119
+ }
120
+ >;
121
+
122
+ export interface LicenseConsoleCapability {
123
+ feature: string;
124
+ permission: LicenseOperatorPermission;
125
+ entry: string;
126
+ apis: readonly string[];
127
+ auditActions: readonly string[];
128
+ }
129
+ export function validateLicenseConsoleCapabilities(
130
+ items: readonly LicenseConsoleCapability[] = Object.values(
131
+ LICENSE_CONSOLE_CAPABILITIES,
132
+ ),
133
+ ): void {
134
+ const features = new Set<string>();
135
+ const permissions = new Set<string>();
136
+ const apis = new Set<string>();
137
+ for (const item of items) {
138
+ if (features.has(item.feature) || permissions.has(item.permission))
139
+ throw new Error("签发中心能力声明重复");
140
+ if (
141
+ item.permission !== item.feature &&
142
+ !item.permission.startsWith(`${item.feature}.`)
143
+ )
144
+ throw new Error("签发中心权限基础 Key 不匹配");
145
+ features.add(item.feature);
146
+ permissions.add(item.permission);
147
+ for (const api of item.apis) {
148
+ if (apis.has(api)) throw new Error("签发中心 API 声明重复");
149
+ apis.add(api);
150
+ }
151
+ }
152
+ }
153
+
154
+ export function hasLicenseConsolePermission(
155
+ permissions: readonly string[],
156
+ permission: string,
157
+ ): boolean {
158
+ return (
159
+ Object.values(LICENSE_CONSOLE_CAPABILITIES).some(
160
+ (item) => item.permission === permission,
161
+ ) && permissions.includes(permission)
162
+ );
163
+ }
@@ -0,0 +1,94 @@
1
+ import type {
2
+ LicenseContractVersion,
3
+ LicenseCustomer,
4
+ LicenseIssueRecord,
5
+ LicenseNode,
6
+ LicenseProject,
7
+ LicenseReplacement,
8
+ LicenseV1Claims,
9
+ LicenseVersion,
10
+ } from "./license.js";
11
+
12
+ export interface LicenseIssueSummary {
13
+ id: string;
14
+ customerId: string;
15
+ projectId: string;
16
+ contractVersionId: string;
17
+ nodeId: string;
18
+ operatorId: string;
19
+ claims: LicenseV1Claims;
20
+ targetSoftwareVersion?: string;
21
+ predecessor?: LicenseReplacement;
22
+ successor?: LicenseReplacement;
23
+ revocationMarked: boolean;
24
+ }
25
+ export interface LicenseConsoleCollections {
26
+ customers: LicenseCustomer;
27
+ projects: LicenseProject;
28
+ contracts: LicenseContractVersion;
29
+ nodes: LicenseNode;
30
+ "license-versions": LicenseVersion;
31
+ licenses: LicenseIssueSummary;
32
+ }
33
+ export interface LicenseListQuery {
34
+ page: number;
35
+ pageSize: number;
36
+ q?: string;
37
+ customerId?: string;
38
+ projectId?: string;
39
+ status?: string;
40
+ contractVersionId?: string;
41
+ nodeId?: string;
42
+ machineCode?: string;
43
+ licenseVersionKey?: string;
44
+ issuedFrom?: string;
45
+ issuedTo?: string;
46
+ expiresFrom?: string;
47
+ expiresTo?: string;
48
+ expiresWithinDays?: 7 | 30 | 60;
49
+ }
50
+ export interface LicensePage<T> {
51
+ items: T[];
52
+ total: number;
53
+ page: number;
54
+ pageSize: number;
55
+ }
56
+ export interface LicenseNewNode {
57
+ code: string;
58
+ name: string;
59
+ purpose?: string;
60
+ machineCode: string;
61
+ }
62
+ export interface LicenseReviewCommand {
63
+ contractVersionId: string;
64
+ nodeId?: string;
65
+ newNode?: LicenseNewNode;
66
+ expiresAt: string;
67
+ softwareVersion: string;
68
+ replacementOfLicenseId?: string;
69
+ replacementReason?: string;
70
+ }
71
+ export interface LicenseReviewConfirmation {
72
+ customer: LicenseCustomer;
73
+ project: LicenseProject;
74
+ contract: LicenseContractVersion;
75
+ licenseVersion: LicenseVersion;
76
+ node: LicenseNewNode;
77
+ keyId: string;
78
+ expiresAt: string;
79
+ softwareVersion: string;
80
+ replacementOfLicenseId?: string;
81
+ replacementReason?: string;
82
+ }
83
+ export interface LicenseReviewResult {
84
+ reviewDigest: string;
85
+ confirmation: LicenseReviewConfirmation;
86
+ blockingReasons: string[];
87
+ }
88
+ export interface LicenseRequestStatus {
89
+ status: "processing" | "failed" | "completed";
90
+ licenseId: string;
91
+ result?: LicenseIssueRecord;
92
+ error?: { code: string; reason: string };
93
+ retryAfterSeconds?: number;
94
+ }
package/src/license.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { EntityId, ISODateTime } from "./primitives.js";
2
2
 
3
3
  export * from "./license-legacy.js";
4
+ export * from "./license-console.js";
4
5
 
5
6
  declare const entitlementKeyBrand: unique symbol;
6
7
  declare const licenseVersionKeyBrand: unique symbol;
@@ -132,6 +133,8 @@ export interface LicenseProject {
132
133
  }
133
134
 
134
135
  export interface LicenseContractVersion {
136
+ predecessorId?: EntityId;
137
+ issuedCount?: number;
135
138
  id: EntityId;
136
139
  projectId: EntityId;
137
140
  contractNumber: string;
@@ -147,6 +150,7 @@ export interface LicenseContractVersion {
147
150
  }
148
151
 
149
152
  export interface LicenseNode {
153
+ issuedCount?: number;
150
154
  id: EntityId;
151
155
  projectId: EntityId;
152
156
  code: string;
@@ -200,6 +204,7 @@ export type LicenseOperatorRole =
200
204
 
201
205
  export type LicenseOperatorPermission =
202
206
  | "license.record.read"
207
+ | "license.audit.read"
203
208
  | "license.issue"
204
209
  | "license.project.manage"
205
210
  | "license.key.rotate"
package/src/rbac.ts CHANGED
@@ -69,6 +69,30 @@ export interface AgentRunAuthorizationSnapshot {
69
69
  featureKey: string;
70
70
  allowedToolKeys: string[];
71
71
  toolNetworkMode: "forbidden";
72
+ /** Host-normalized current Case coordinate; absent forbids Case Memory. */
73
+ memoryScopeCaseId?: string;
74
+ // @windy-module system.agent begin
75
+ /** Workflow-only: binds the narrowed runtime budget to the Run grant. */
76
+ runtimeBudgetDigest?: string;
77
+ /** Workflow-only: frozen provider deployment and model used for this Run. */
78
+ modelPin?: {
79
+ deploymentKey: string;
80
+ model: string;
81
+ };
82
+ /** Child Agent only: immutable effective delegation ceiling. */
83
+ delegation?: {
84
+ delegationId: string;
85
+ policyDigest: string;
86
+ budgetDigest: string;
87
+ workspaceId: string;
88
+ workspacePolicyKey: string;
89
+ scopeDigest: string;
90
+ scopePolicyDigest: string;
91
+ capabilityKey: string;
92
+ requiredFeatureKeys: string[];
93
+ requiredPermissionKeys: string[];
94
+ };
95
+ // @windy-module system.agent end
72
96
  }
73
97
 
74
98
  export type CredentialState = "active" | "must-change-password";
package/src/ruoyi.ts DELETED
@@ -1,98 +0,0 @@
1
- import type { AuditEvent, AuditLogWriter } from "./audit.js";
2
- import type { LegacyTableMapping } from "./database.js";
3
- import type { EntityId, ISODateTime } from "./primitives.js";
4
- import type {
5
- MenuNode,
6
- PermissionDefinition,
7
- RoleDefinition,
8
- UserAccount,
9
- } from "./rbac.js";
10
-
11
- export type RuoYiCoreTable =
12
- | "sys_user"
13
- | "sys_role"
14
- | "sys_user_role"
15
- | "sys_dept"
16
- | "sys_post"
17
- | "sys_user_post"
18
- | "sys_menu"
19
- | "sys_role_menu"
20
- | "sys_role_dept"
21
- | "sys_dict_type"
22
- | "sys_dict_data"
23
- | "sys_config"
24
- | "sys_notice"
25
- | "sys_logininfor"
26
- | "sys_oper_log"
27
- | "sys_job"
28
- | "sys_job_log";
29
-
30
- export interface RuoYiConnectionConfig {
31
- mysqlDsn: string;
32
- redisDsn?: string;
33
- readonly: boolean;
34
- }
35
-
36
- export interface RuoYiMigrationPlan {
37
- id: EntityId;
38
- createdAt: ISODateTime;
39
- tables: RuoYiCoreTable[];
40
- dryRun: boolean;
41
- resetPasswords: boolean;
42
- }
43
-
44
- export interface RuoYiMigrationReport {
45
- planId: EntityId;
46
- startedAt: ISODateTime;
47
- finishedAt?: ISODateTime;
48
- importedRows: Record<RuoYiCoreTable, number>;
49
- failedRows: Record<RuoYiCoreTable, number>;
50
- warnings: string[];
51
- auditEvents: AuditEvent[];
52
- }
53
-
54
- export interface RuoYiPermissionSnapshot {
55
- user: UserAccount;
56
- roles: RoleDefinition[];
57
- menus: MenuNode[];
58
- permissions: PermissionDefinition[];
59
- }
60
-
61
- export interface RuoYiImportAdapter {
62
- dryRun(plan: RuoYiMigrationPlan): Promise<RuoYiMigrationReport>;
63
- import(
64
- plan: RuoYiMigrationPlan,
65
- audit: AuditLogWriter,
66
- ): Promise<RuoYiMigrationReport>;
67
- }
68
-
69
- export interface RuoYiLegacyRuntimeAdapter {
70
- connect(config: RuoYiConnectionConfig): Promise<void>;
71
- disconnect(): Promise<void>;
72
- readPermissionSnapshot(userId: EntityId): Promise<RuoYiPermissionSnapshot>;
73
- }
74
-
75
- export interface RuoYiReportAdapter {
76
- compareUserPermissions(userId: EntityId): Promise<RuoYiMigrationReport>;
77
- tableMappings(): LegacyTableMapping[];
78
- }
79
-
80
- export const ruoyiCoreTables: RuoYiCoreTable[] = [
81
- "sys_user",
82
- "sys_role",
83
- "sys_user_role",
84
- "sys_dept",
85
- "sys_post",
86
- "sys_user_post",
87
- "sys_menu",
88
- "sys_role_menu",
89
- "sys_role_dept",
90
- "sys_dict_type",
91
- "sys_dict_data",
92
- "sys_config",
93
- "sys_notice",
94
- "sys_logininfor",
95
- "sys_oper_log",
96
- "sys_job",
97
- "sys_job_log",
98
- ];