@haaaiawd/second-nature 0.1.16 → 0.1.18
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.js +855 -851
- package/openclaw.plugin.json +29 -29
- package/package.json +52 -52
- package/runtime/cli/commands/index.d.ts +14 -14
- package/runtime/cli/commands/index.js +193 -193
- package/runtime/cli/explain/explain-surface-subject.d.ts +8 -8
- package/runtime/cli/explain/explain-surface-subject.js +9 -9
- package/runtime/cli/explain/format-explanation.d.ts +12 -12
- package/runtime/cli/explain/format-explanation.js +12 -12
- package/runtime/cli/explain/resolve-subject.js +41 -41
- package/runtime/cli/host-capability/classify-delivery.d.ts +14 -14
- package/runtime/cli/host-capability/classify-delivery.js +20 -20
- package/runtime/cli/host-capability/probe-host-capability.d.ts +2 -2
- package/runtime/cli/host-capability/probe-host-capability.js +58 -58
- package/runtime/cli/host-capability/record-host-capability.d.ts +6 -6
- package/runtime/cli/host-capability/record-host-capability.js +14 -14
- package/runtime/cli/host-capability/types.d.ts +71 -71
- package/runtime/cli/host-capability/types.js +6 -6
- package/runtime/cli/host-smoke/run-host-smoke.d.ts +2 -2
- package/runtime/cli/host-smoke/run-host-smoke.js +40 -40
- package/runtime/cli/host-smoke/types.d.ts +35 -35
- package/runtime/cli/host-smoke/types.js +6 -6
- package/runtime/cli/index.js +58 -54
- package/runtime/cli/ops/heartbeat-surface.d.ts +38 -35
- package/runtime/cli/ops/heartbeat-surface.js +73 -71
- package/runtime/cli/ops/ops-router.d.ts +19 -16
- package/runtime/cli/ops/ops-router.js +89 -87
- package/runtime/cli/ops/show-operator-fallback.d.ts +13 -13
- package/runtime/cli/ops/show-operator-fallback.js +22 -22
- package/runtime/cli/ops/workspace-heartbeat-runner.d.ts +19 -10
- package/runtime/cli/ops/workspace-heartbeat-runner.js +39 -26
- package/runtime/cli/read-models/index.d.ts +29 -29
- package/runtime/cli/read-models/index.js +256 -256
- package/runtime/cli/read-models/operator-explain-map.d.ts +6 -6
- package/runtime/cli/read-models/operator-explain-map.js +10 -10
- package/runtime/cli/read-models/types.d.ts +79 -79
- package/runtime/cli/runtime/runtime-artifact-boundary.d.ts +28 -28
- package/runtime/cli/runtime/runtime-artifact-boundary.js +94 -94
- package/runtime/connectors/base/contract.d.ts +87 -87
- package/runtime/connectors/base/execution-policy.d.ts +47 -47
- package/runtime/connectors/base/execution-policy.js +82 -82
- package/runtime/connectors/base/index.d.ts +8 -8
- package/runtime/connectors/base/index.js +8 -8
- package/runtime/connectors/base/manifest.d.ts +64 -64
- package/runtime/connectors/base/manifest.js +86 -86
- package/runtime/connectors/base/map-life-evidence.d.ts +16 -16
- package/runtime/connectors/base/map-life-evidence.js +79 -79
- package/runtime/connectors/base/policy-layer.d.ts +29 -29
- package/runtime/connectors/base/policy-layer.js +198 -198
- package/runtime/connectors/base/route-planner.js +99 -99
- package/runtime/connectors/index.d.ts +5 -5
- package/runtime/connectors/index.js +5 -5
- package/runtime/connectors/near-real/near-real-connector-smoke.d.ts +19 -19
- package/runtime/connectors/near-real/near-real-connector-smoke.js +152 -152
- package/runtime/core/second-nature/heartbeat/heartbeat-executor.js +114 -114
- package/runtime/core/second-nature/heartbeat/heartbeat-loop.d.ts +63 -63
- package/runtime/core/second-nature/heartbeat/heartbeat-loop.js +139 -139
- package/runtime/core/second-nature/heartbeat/index.d.ts +8 -8
- package/runtime/core/second-nature/heartbeat/index.js +7 -7
- package/runtime/core/second-nature/heartbeat/run-heartbeat-cycle.d.ts +21 -21
- package/runtime/core/second-nature/heartbeat/run-heartbeat-cycle.js +35 -35
- package/runtime/core/second-nature/heartbeat/runtime-snapshot.d.ts +28 -28
- package/runtime/core/second-nature/heartbeat/runtime-snapshot.js +35 -35
- package/runtime/core/second-nature/heartbeat/signal.d.ts +42 -42
- package/runtime/core/second-nature/heartbeat/snapshot-builder.d.ts +51 -51
- package/runtime/core/second-nature/index.d.ts +22 -22
- package/runtime/core/second-nature/index.js +22 -22
- package/runtime/core/second-nature/orchestrator/effect-dispatcher.d.ts +100 -100
- package/runtime/core/second-nature/orchestrator/effect-dispatcher.js +144 -144
- package/runtime/core/second-nature/orchestrator/guard-layer.d.ts +8 -8
- package/runtime/core/second-nature/orchestrator/guard-layer.js +110 -110
- package/runtime/core/second-nature/orchestrator/intent-planner.d.ts +13 -13
- package/runtime/core/second-nature/orchestrator/intent-planner.js +199 -199
- package/runtime/core/second-nature/orchestrator/lease-manager.d.ts +14 -14
- package/runtime/core/second-nature/orchestrator/lease-manager.js +58 -58
- package/runtime/core/second-nature/outreach/build-outreach-draft-request.d.ts +6 -6
- package/runtime/core/second-nature/outreach/build-outreach-draft-request.js +63 -63
- package/runtime/core/second-nature/outreach/delivery-target.d.ts +26 -26
- package/runtime/core/second-nature/outreach/delivery-target.js +70 -70
- package/runtime/core/second-nature/outreach/dispatch-user-outreach.d.ts +38 -38
- package/runtime/core/second-nature/outreach/dispatch-user-outreach.js +119 -119
- package/runtime/core/second-nature/outreach/judge-input-from-snapshot.d.ts +7 -7
- package/runtime/core/second-nature/outreach/judge-input-from-snapshot.js +45 -45
- package/runtime/core/second-nature/outreach/judge-outreach.d.ts +40 -40
- package/runtime/core/second-nature/outreach/judge-outreach.js +121 -121
- package/runtime/core/second-nature/quiet/run-source-backed-quiet.d.ts +21 -21
- package/runtime/core/second-nature/quiet/run-source-backed-quiet.js +123 -123
- package/runtime/core/second-nature/rhythm/planner-rhythm-window.d.ts +15 -15
- package/runtime/core/second-nature/rhythm/planner-rhythm-window.js +52 -52
- package/runtime/core/second-nature/rhythm/policy-bridge.d.ts +19 -19
- package/runtime/core/second-nature/rhythm/policy-bridge.js +34 -34
- package/runtime/core/second-nature/runtime/service-entry.js +45 -45
- package/runtime/core/second-nature/types.d.ts +51 -51
- package/runtime/guidance/draft-outreach-message.d.ts +7 -7
- package/runtime/guidance/draft-outreach-message.js +42 -42
- package/runtime/guidance/evidence-guidance.d.ts +40 -40
- package/runtime/guidance/evidence-guidance.js +52 -52
- package/runtime/guidance/index.d.ts +11 -11
- package/runtime/guidance/index.js +11 -11
- package/runtime/guidance/outreach-draft-schema.d.ts +228 -228
- package/runtime/guidance/outreach-draft-schema.js +80 -80
- package/runtime/observability/audit/append-only-audit-store.d.ts +14 -14
- package/runtime/observability/audit/append-only-audit-store.js +21 -21
- package/runtime/observability/audit/audit-envelope.d.ts +51 -51
- package/runtime/observability/audit/audit-envelope.js +130 -130
- package/runtime/observability/audit/verify-audit-hash-chain.d.ts +23 -23
- package/runtime/observability/audit/verify-audit-hash-chain.js +83 -83
- package/runtime/observability/db/index.js +124 -124
- package/runtime/observability/db/schema/host-capability-reports.d.ts +180 -180
- package/runtime/observability/db/schema/host-capability-reports.js +12 -12
- package/runtime/observability/db/schema/index.d.ts +947 -947
- package/runtime/observability/db/schema/index.js +71 -71
- package/runtime/observability/index.d.ts +20 -19
- package/runtime/observability/index.js +19 -18
- package/runtime/observability/query/explain-query.d.ts +48 -48
- package/runtime/observability/query/explain-query.js +114 -114
- package/runtime/observability/query/export-audit-bundle.d.ts +22 -22
- package/runtime/observability/query/export-audit-bundle.js +27 -27
- package/runtime/observability/services/decision-ledger.d.ts +46 -46
- package/runtime/observability/services/decision-ledger.js +161 -161
- package/runtime/observability/services/governance-audit.d.ts +41 -41
- package/runtime/observability/services/governance-audit.js +163 -163
- package/runtime/observability/services/governance-plane-recorder.d.ts +47 -47
- package/runtime/observability/services/governance-plane-recorder.js +55 -55
- package/runtime/observability/services/lived-experience-audit.d.ts +97 -97
- package/runtime/observability/services/lived-experience-audit.js +162 -162
- package/runtime/observability/services/runtime-decision-recorder.d.ts +29 -0
- package/runtime/observability/services/runtime-decision-recorder.js +94 -0
- package/runtime/storage/bootstrap/native-sqlite-probe.d.ts +7 -7
- package/runtime/storage/bootstrap/native-sqlite-probe.js +28 -28
- package/runtime/storage/bootstrap/repair-gate.d.ts +17 -17
- package/runtime/storage/bootstrap/repair-gate.js +71 -71
- package/runtime/storage/bootstrap/storage-mode-smoke.d.ts +38 -38
- package/runtime/storage/bootstrap/storage-mode-smoke.js +85 -85
- package/runtime/storage/db/index.js +154 -154
- package/runtime/storage/db/schema/delivery-attempts.d.ts +199 -199
- package/runtime/storage/db/schema/delivery-attempts.js +13 -13
- package/runtime/storage/db/schema/index.d.ts +9 -9
- package/runtime/storage/db/schema/index.js +9 -9
- package/runtime/storage/db/schema/life-evidence-index.d.ts +161 -161
- package/runtime/storage/db/schema/life-evidence-index.js +11 -11
- package/runtime/storage/db/schema/operator-fallback-artifacts.d.ts +161 -161
- package/runtime/storage/db/schema/operator-fallback-artifacts.js +11 -11
- package/runtime/storage/db/schema/policies.d.ts +98 -98
- package/runtime/storage/db/schema/policies.js +8 -8
- package/runtime/storage/delivery/query-delivery-attempts.d.ts +3 -3
- package/runtime/storage/delivery/query-delivery-attempts.js +32 -32
- package/runtime/storage/delivery/types.d.ts +27 -27
- package/runtime/storage/delivery/types.js +1 -1
- package/runtime/storage/delivery/write-delivery-attempt.d.ts +6 -6
- package/runtime/storage/delivery/write-delivery-attempt.js +36 -36
- package/runtime/storage/fallback/load-operator-fallback.d.ts +14 -14
- package/runtime/storage/fallback/load-operator-fallback.js +47 -47
- package/runtime/storage/fallback/operator-fallback-types.d.ts +9 -9
- package/runtime/storage/fallback/operator-fallback-types.js +1 -1
- package/runtime/storage/fallback/operator-fallback-view.d.ts +11 -11
- package/runtime/storage/fallback/operator-fallback-view.js +1 -1
- package/runtime/storage/fallback/write-operator-fallback.d.ts +6 -6
- package/runtime/storage/fallback/write-operator-fallback.js +21 -21
- package/runtime/storage/index.d.ts +37 -37
- package/runtime/storage/index.js +30 -30
- package/runtime/storage/life-evidence/append-life-evidence.d.ts +7 -7
- package/runtime/storage/life-evidence/append-life-evidence.js +64 -64
- package/runtime/storage/life-evidence/types.d.ts +45 -45
- package/runtime/storage/life-evidence/types.js +6 -6
- package/runtime/storage/quiet/persist-quiet-artifact.d.ts +7 -7
- package/runtime/storage/quiet/persist-quiet-artifact.js +22 -22
- package/runtime/storage/quiet/quiet-artifact-types.d.ts +18 -18
- package/runtime/storage/quiet/quiet-artifact-types.js +1 -1
- package/runtime/storage/quiet/quiet-artifact-writer.d.ts +15 -15
- package/runtime/storage/quiet/quiet-artifact-writer.js +56 -56
- package/runtime/storage/repositories/credential-repository.js +30 -30
- package/runtime/storage/rhythm/rhythm-policy-snapshot.d.ts +10 -10
- package/runtime/storage/rhythm/rhythm-policy-snapshot.js +34 -34
- package/runtime/storage/services/credential-vault.d.ts +13 -13
- package/runtime/storage/services/credential-vault.js +116 -116
- package/runtime/storage/snapshots/continuity-snapshot.d.ts +9 -9
- package/runtime/storage/snapshots/continuity-snapshot.js +41 -41
- package/runtime/storage/snapshots/life-evidence-snapshot.d.ts +6 -6
- package/runtime/storage/snapshots/life-evidence-snapshot.js +114 -114
- package/runtime/storage/snapshots/types.d.ts +58 -58
- package/runtime/storage/snapshots/types.js +1 -1
- package/runtime/storage/state-api.js +104 -104
- package/runtime/storage/user-interest/load-user-interest-snapshot.d.ts +2 -2
- package/runtime/storage/user-interest/load-user-interest-snapshot.js +150 -150
- package/runtime/storage/user-interest/types.d.ts +25 -25
- package/runtime/storage/user-interest/types.js +1 -1
- package/workspace-ops-bridge.js +81 -80
|
@@ -1,163 +1,163 @@
|
|
|
1
|
-
import { eq } from "drizzle-orm";
|
|
2
|
-
import { governanceAudit } from "../db/schema/index.js";
|
|
3
|
-
import { createEmptyManifest, redactEvent } from "../redaction/manifest.js";
|
|
4
|
-
import { persistRedactionManifest } from "./redaction-store.js";
|
|
5
|
-
export class GovernanceAudit {
|
|
6
|
-
db;
|
|
7
|
-
constructor(db) {
|
|
8
|
-
this.db = db;
|
|
9
|
-
}
|
|
10
|
-
async recordAnchorChangeAudit(event) {
|
|
11
|
-
const { redacted, manifest } = redactEvent(event);
|
|
12
|
-
await this.db.db.insert(governanceAudit).values({
|
|
13
|
-
id: redacted.id,
|
|
14
|
-
eventType: "anchor_change",
|
|
15
|
-
proposalId: redacted.proposalId,
|
|
16
|
-
targetAssetId: redacted.targetAssetId,
|
|
17
|
-
assetPath: redacted.assetPath,
|
|
18
|
-
statusFrom: null,
|
|
19
|
-
statusTo: redacted.status,
|
|
20
|
-
beforeHash: redacted.beforeHash ?? null,
|
|
21
|
-
afterHash: redacted.afterHash ?? null,
|
|
22
|
-
supportingSources: JSON.stringify(redacted.supportingSources),
|
|
23
|
-
reason: redacted.reason,
|
|
24
|
-
verificationDeadline: null,
|
|
25
|
-
attemptsRemaining: null,
|
|
26
|
-
createdAt: redacted.createdAt,
|
|
27
|
-
});
|
|
28
|
-
await persistRedactionManifest(this.db, redacted.id, "anchor.change", manifest);
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Generic governance-plane events (T5.1.2): fallback_written, effect_commit_advanced, connector_failure, etc.
|
|
32
|
-
* traceId is stored on target_asset_id for explain/trace correlation until a dedicated column exists.
|
|
33
|
-
*/
|
|
34
|
-
async recordOperationalGovernanceEvent(input) {
|
|
35
|
-
const createdAt = input.createdAt ?? new Date().toISOString();
|
|
36
|
-
await this.db.db.insert(governanceAudit).values({
|
|
37
|
-
id: input.id,
|
|
38
|
-
eventType: input.eventType,
|
|
39
|
-
proposalId: null,
|
|
40
|
-
targetAssetId: input.traceId,
|
|
41
|
-
assetPath: input.assetPath ?? null,
|
|
42
|
-
statusFrom: null,
|
|
43
|
-
statusTo: input.statusTo,
|
|
44
|
-
beforeHash: null,
|
|
45
|
-
afterHash: null,
|
|
46
|
-
supportingSources: JSON.stringify(input.supportingSources ?? []),
|
|
47
|
-
reason: input.reason,
|
|
48
|
-
verificationDeadline: null,
|
|
49
|
-
attemptsRemaining: null,
|
|
50
|
-
createdAt,
|
|
51
|
-
});
|
|
52
|
-
await persistRedactionManifest(this.db, input.id, input.eventType, createEmptyManifest());
|
|
53
|
-
}
|
|
54
|
-
async recordCredentialLifecycle(event) {
|
|
55
|
-
const { redacted, manifest } = redactEvent(event);
|
|
56
|
-
await this.db.db.insert(governanceAudit).values({
|
|
57
|
-
id: redacted.id,
|
|
58
|
-
eventType: "credential_lifecycle",
|
|
59
|
-
proposalId: null,
|
|
60
|
-
targetAssetId: redacted.platformId,
|
|
61
|
-
assetPath: redacted.credentialId,
|
|
62
|
-
statusFrom: redacted.statusFrom ?? null,
|
|
63
|
-
statusTo: redacted.statusTo,
|
|
64
|
-
beforeHash: null,
|
|
65
|
-
afterHash: null,
|
|
66
|
-
supportingSources: "[]",
|
|
67
|
-
reason: redacted.explanationCapsule,
|
|
68
|
-
verificationDeadline: redacted.verificationDeadline ?? null,
|
|
69
|
-
attemptsRemaining: redacted.attemptsRemaining ?? null,
|
|
70
|
-
createdAt: redacted.createdAt,
|
|
71
|
-
});
|
|
72
|
-
await persistRedactionManifest(this.db, redacted.id, "credential.lifecycle", manifest);
|
|
73
|
-
}
|
|
74
|
-
async recordProposalApply(proposalId, targetAssetId, assetPath, beforeHash, afterHash, supportingSources, reason) {
|
|
75
|
-
const id = `anchor-${proposalId}-${Date.now()}`;
|
|
76
|
-
const event = {
|
|
77
|
-
id,
|
|
78
|
-
proposalId,
|
|
79
|
-
targetAssetId,
|
|
80
|
-
assetPath,
|
|
81
|
-
status: "applied",
|
|
82
|
-
beforeHash,
|
|
83
|
-
afterHash,
|
|
84
|
-
supportingSources,
|
|
85
|
-
reason,
|
|
86
|
-
appliedAt: new Date().toISOString(),
|
|
87
|
-
createdAt: new Date().toISOString(),
|
|
88
|
-
};
|
|
89
|
-
await this.recordAnchorChangeAudit(event);
|
|
90
|
-
}
|
|
91
|
-
async recordProposalReject(proposalId, targetAssetId, assetPath, reason) {
|
|
92
|
-
const id = `anchor-reject-${proposalId}-${Date.now()}`;
|
|
93
|
-
const event = {
|
|
94
|
-
id,
|
|
95
|
-
proposalId,
|
|
96
|
-
targetAssetId,
|
|
97
|
-
assetPath,
|
|
98
|
-
status: "rejected",
|
|
99
|
-
supportingSources: [],
|
|
100
|
-
reason,
|
|
101
|
-
createdAt: new Date().toISOString(),
|
|
102
|
-
};
|
|
103
|
-
await this.recordAnchorChangeAudit(event);
|
|
104
|
-
}
|
|
105
|
-
async queryByProposalId(proposalId) {
|
|
106
|
-
const results = await this.db.db
|
|
107
|
-
.select()
|
|
108
|
-
.from(governanceAudit)
|
|
109
|
-
.where(eq(governanceAudit.proposalId, proposalId));
|
|
110
|
-
return results.map(this.mapToAnchorAudit);
|
|
111
|
-
}
|
|
112
|
-
async queryByAssetId(assetId) {
|
|
113
|
-
const results = await this.db.db
|
|
114
|
-
.select()
|
|
115
|
-
.from(governanceAudit)
|
|
116
|
-
.where(eq(governanceAudit.targetAssetId, assetId));
|
|
117
|
-
return results.map(this.mapToAnchorAudit);
|
|
118
|
-
}
|
|
119
|
-
async queryByEventType(eventType) {
|
|
120
|
-
const results = await this.db.db
|
|
121
|
-
.select()
|
|
122
|
-
.from(governanceAudit)
|
|
123
|
-
.where(eq(governanceAudit.eventType, eventType));
|
|
124
|
-
return results.map(this.mapToAnchorAudit);
|
|
125
|
-
}
|
|
126
|
-
async queryCredentialByPlatform(platformId) {
|
|
127
|
-
const results = await this.db.db
|
|
128
|
-
.select()
|
|
129
|
-
.from(governanceAudit)
|
|
130
|
-
.where(eq(governanceAudit.targetAssetId, platformId));
|
|
131
|
-
return results
|
|
132
|
-
.filter(r => r.eventType === "credential_lifecycle")
|
|
133
|
-
.map(this.mapToCredentialAudit);
|
|
134
|
-
}
|
|
135
|
-
mapToAnchorAudit(row) {
|
|
136
|
-
return {
|
|
137
|
-
id: row.id,
|
|
138
|
-
proposalId: row.proposalId ?? "",
|
|
139
|
-
targetAssetId: row.targetAssetId ?? "",
|
|
140
|
-
assetPath: row.assetPath ?? "",
|
|
141
|
-
status: row.statusTo,
|
|
142
|
-
beforeHash: row.beforeHash ?? undefined,
|
|
143
|
-
afterHash: row.afterHash ?? undefined,
|
|
144
|
-
supportingSources: JSON.parse(row.supportingSources ?? "[]"),
|
|
145
|
-
reason: row.reason ?? "",
|
|
146
|
-
appliedAt: row.statusTo === "applied" ? row.createdAt : undefined,
|
|
147
|
-
createdAt: row.createdAt,
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
mapToCredentialAudit(row) {
|
|
151
|
-
return {
|
|
152
|
-
id: row.id,
|
|
153
|
-
platformId: row.targetAssetId ?? "",
|
|
154
|
-
credentialId: row.assetPath ?? "",
|
|
155
|
-
statusFrom: row.statusFrom ?? undefined,
|
|
156
|
-
statusTo: row.statusTo,
|
|
157
|
-
verificationDeadline: row.verificationDeadline ?? undefined,
|
|
158
|
-
attemptsRemaining: row.attemptsRemaining ?? undefined,
|
|
159
|
-
explanationCapsule: row.reason ?? "",
|
|
160
|
-
createdAt: row.createdAt,
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
}
|
|
1
|
+
import { eq } from "drizzle-orm";
|
|
2
|
+
import { governanceAudit } from "../db/schema/index.js";
|
|
3
|
+
import { createEmptyManifest, redactEvent } from "../redaction/manifest.js";
|
|
4
|
+
import { persistRedactionManifest } from "./redaction-store.js";
|
|
5
|
+
export class GovernanceAudit {
|
|
6
|
+
db;
|
|
7
|
+
constructor(db) {
|
|
8
|
+
this.db = db;
|
|
9
|
+
}
|
|
10
|
+
async recordAnchorChangeAudit(event) {
|
|
11
|
+
const { redacted, manifest } = redactEvent(event);
|
|
12
|
+
await this.db.db.insert(governanceAudit).values({
|
|
13
|
+
id: redacted.id,
|
|
14
|
+
eventType: "anchor_change",
|
|
15
|
+
proposalId: redacted.proposalId,
|
|
16
|
+
targetAssetId: redacted.targetAssetId,
|
|
17
|
+
assetPath: redacted.assetPath,
|
|
18
|
+
statusFrom: null,
|
|
19
|
+
statusTo: redacted.status,
|
|
20
|
+
beforeHash: redacted.beforeHash ?? null,
|
|
21
|
+
afterHash: redacted.afterHash ?? null,
|
|
22
|
+
supportingSources: JSON.stringify(redacted.supportingSources),
|
|
23
|
+
reason: redacted.reason,
|
|
24
|
+
verificationDeadline: null,
|
|
25
|
+
attemptsRemaining: null,
|
|
26
|
+
createdAt: redacted.createdAt,
|
|
27
|
+
});
|
|
28
|
+
await persistRedactionManifest(this.db, redacted.id, "anchor.change", manifest);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generic governance-plane events (T5.1.2): fallback_written, effect_commit_advanced, connector_failure, etc.
|
|
32
|
+
* traceId is stored on target_asset_id for explain/trace correlation until a dedicated column exists.
|
|
33
|
+
*/
|
|
34
|
+
async recordOperationalGovernanceEvent(input) {
|
|
35
|
+
const createdAt = input.createdAt ?? new Date().toISOString();
|
|
36
|
+
await this.db.db.insert(governanceAudit).values({
|
|
37
|
+
id: input.id,
|
|
38
|
+
eventType: input.eventType,
|
|
39
|
+
proposalId: null,
|
|
40
|
+
targetAssetId: input.traceId,
|
|
41
|
+
assetPath: input.assetPath ?? null,
|
|
42
|
+
statusFrom: null,
|
|
43
|
+
statusTo: input.statusTo,
|
|
44
|
+
beforeHash: null,
|
|
45
|
+
afterHash: null,
|
|
46
|
+
supportingSources: JSON.stringify(input.supportingSources ?? []),
|
|
47
|
+
reason: input.reason,
|
|
48
|
+
verificationDeadline: null,
|
|
49
|
+
attemptsRemaining: null,
|
|
50
|
+
createdAt,
|
|
51
|
+
});
|
|
52
|
+
await persistRedactionManifest(this.db, input.id, input.eventType, createEmptyManifest());
|
|
53
|
+
}
|
|
54
|
+
async recordCredentialLifecycle(event) {
|
|
55
|
+
const { redacted, manifest } = redactEvent(event);
|
|
56
|
+
await this.db.db.insert(governanceAudit).values({
|
|
57
|
+
id: redacted.id,
|
|
58
|
+
eventType: "credential_lifecycle",
|
|
59
|
+
proposalId: null,
|
|
60
|
+
targetAssetId: redacted.platformId,
|
|
61
|
+
assetPath: redacted.credentialId,
|
|
62
|
+
statusFrom: redacted.statusFrom ?? null,
|
|
63
|
+
statusTo: redacted.statusTo,
|
|
64
|
+
beforeHash: null,
|
|
65
|
+
afterHash: null,
|
|
66
|
+
supportingSources: "[]",
|
|
67
|
+
reason: redacted.explanationCapsule,
|
|
68
|
+
verificationDeadline: redacted.verificationDeadline ?? null,
|
|
69
|
+
attemptsRemaining: redacted.attemptsRemaining ?? null,
|
|
70
|
+
createdAt: redacted.createdAt,
|
|
71
|
+
});
|
|
72
|
+
await persistRedactionManifest(this.db, redacted.id, "credential.lifecycle", manifest);
|
|
73
|
+
}
|
|
74
|
+
async recordProposalApply(proposalId, targetAssetId, assetPath, beforeHash, afterHash, supportingSources, reason) {
|
|
75
|
+
const id = `anchor-${proposalId}-${Date.now()}`;
|
|
76
|
+
const event = {
|
|
77
|
+
id,
|
|
78
|
+
proposalId,
|
|
79
|
+
targetAssetId,
|
|
80
|
+
assetPath,
|
|
81
|
+
status: "applied",
|
|
82
|
+
beforeHash,
|
|
83
|
+
afterHash,
|
|
84
|
+
supportingSources,
|
|
85
|
+
reason,
|
|
86
|
+
appliedAt: new Date().toISOString(),
|
|
87
|
+
createdAt: new Date().toISOString(),
|
|
88
|
+
};
|
|
89
|
+
await this.recordAnchorChangeAudit(event);
|
|
90
|
+
}
|
|
91
|
+
async recordProposalReject(proposalId, targetAssetId, assetPath, reason) {
|
|
92
|
+
const id = `anchor-reject-${proposalId}-${Date.now()}`;
|
|
93
|
+
const event = {
|
|
94
|
+
id,
|
|
95
|
+
proposalId,
|
|
96
|
+
targetAssetId,
|
|
97
|
+
assetPath,
|
|
98
|
+
status: "rejected",
|
|
99
|
+
supportingSources: [],
|
|
100
|
+
reason,
|
|
101
|
+
createdAt: new Date().toISOString(),
|
|
102
|
+
};
|
|
103
|
+
await this.recordAnchorChangeAudit(event);
|
|
104
|
+
}
|
|
105
|
+
async queryByProposalId(proposalId) {
|
|
106
|
+
const results = await this.db.db
|
|
107
|
+
.select()
|
|
108
|
+
.from(governanceAudit)
|
|
109
|
+
.where(eq(governanceAudit.proposalId, proposalId));
|
|
110
|
+
return results.map(this.mapToAnchorAudit);
|
|
111
|
+
}
|
|
112
|
+
async queryByAssetId(assetId) {
|
|
113
|
+
const results = await this.db.db
|
|
114
|
+
.select()
|
|
115
|
+
.from(governanceAudit)
|
|
116
|
+
.where(eq(governanceAudit.targetAssetId, assetId));
|
|
117
|
+
return results.map(this.mapToAnchorAudit);
|
|
118
|
+
}
|
|
119
|
+
async queryByEventType(eventType) {
|
|
120
|
+
const results = await this.db.db
|
|
121
|
+
.select()
|
|
122
|
+
.from(governanceAudit)
|
|
123
|
+
.where(eq(governanceAudit.eventType, eventType));
|
|
124
|
+
return results.map(this.mapToAnchorAudit);
|
|
125
|
+
}
|
|
126
|
+
async queryCredentialByPlatform(platformId) {
|
|
127
|
+
const results = await this.db.db
|
|
128
|
+
.select()
|
|
129
|
+
.from(governanceAudit)
|
|
130
|
+
.where(eq(governanceAudit.targetAssetId, platformId));
|
|
131
|
+
return results
|
|
132
|
+
.filter(r => r.eventType === "credential_lifecycle")
|
|
133
|
+
.map(this.mapToCredentialAudit);
|
|
134
|
+
}
|
|
135
|
+
mapToAnchorAudit(row) {
|
|
136
|
+
return {
|
|
137
|
+
id: row.id,
|
|
138
|
+
proposalId: row.proposalId ?? "",
|
|
139
|
+
targetAssetId: row.targetAssetId ?? "",
|
|
140
|
+
assetPath: row.assetPath ?? "",
|
|
141
|
+
status: row.statusTo,
|
|
142
|
+
beforeHash: row.beforeHash ?? undefined,
|
|
143
|
+
afterHash: row.afterHash ?? undefined,
|
|
144
|
+
supportingSources: JSON.parse(row.supportingSources ?? "[]"),
|
|
145
|
+
reason: row.reason ?? "",
|
|
146
|
+
appliedAt: row.statusTo === "applied" ? row.createdAt : undefined,
|
|
147
|
+
createdAt: row.createdAt,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
mapToCredentialAudit(row) {
|
|
151
|
+
return {
|
|
152
|
+
id: row.id,
|
|
153
|
+
platformId: row.targetAssetId ?? "",
|
|
154
|
+
credentialId: row.assetPath ?? "",
|
|
155
|
+
statusFrom: row.statusFrom ?? undefined,
|
|
156
|
+
statusTo: row.statusTo,
|
|
157
|
+
verificationDeadline: row.verificationDeadline ?? undefined,
|
|
158
|
+
attemptsRemaining: row.attemptsRemaining ?? undefined,
|
|
159
|
+
explanationCapsule: row.reason ?? "",
|
|
160
|
+
createdAt: row.createdAt,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* T5.1.2 governance plane: connector attempts + state governance audit append ports.
|
|
3
|
-
*
|
|
4
|
-
* Core logic: connector attempts map to executionAttempts telemetry; governance kinds map to
|
|
5
|
-
* governance_audit rows with traceId on target_asset_id for explain correlation.
|
|
6
|
-
*
|
|
7
|
-
* Test coverage: tests/unit/observability/governance-plane-recorder.test.ts
|
|
8
|
-
*/
|
|
9
|
-
import type { ObservabilityDatabase } from "../db/index.js";
|
|
10
|
-
import { ExecutionTelemetry } from "./execution-telemetry.js";
|
|
11
|
-
import { GovernanceAudit } from "./governance-audit.js";
|
|
12
|
-
export interface AuditAppendAck {
|
|
13
|
-
recordId: string;
|
|
14
|
-
appendedAt: string;
|
|
15
|
-
}
|
|
16
|
-
export type ConnectorAttemptOutcome = "started" | "succeeded" | "failed" | "sampled_telemetry";
|
|
17
|
-
export interface ConnectorAttemptAudit {
|
|
18
|
-
traceId: string;
|
|
19
|
-
decisionId: string;
|
|
20
|
-
intentId: string;
|
|
21
|
-
platformId: string;
|
|
22
|
-
capability: string;
|
|
23
|
-
channel: string;
|
|
24
|
-
outcome: ConnectorAttemptOutcome;
|
|
25
|
-
failureClass?: string;
|
|
26
|
-
idempotencyKey?: string;
|
|
27
|
-
metadata?: Record<string, unknown>;
|
|
28
|
-
}
|
|
29
|
-
export type StateGovernanceKind = "fallback_written" | "effect_commit_advanced" | "connector_failure" | "anchor_proposal_received";
|
|
30
|
-
export interface StateGovernanceAudit {
|
|
31
|
-
id: string;
|
|
32
|
-
traceId: string;
|
|
33
|
-
kind: StateGovernanceKind;
|
|
34
|
-
reason: string;
|
|
35
|
-
decisionId?: string;
|
|
36
|
-
artifactPath?: string;
|
|
37
|
-
supportingSources?: string[];
|
|
38
|
-
createdAt?: string;
|
|
39
|
-
}
|
|
40
|
-
export declare class GovernancePlaneRecorder {
|
|
41
|
-
private readonly telemetry;
|
|
42
|
-
private readonly governance;
|
|
43
|
-
constructor(telemetry: ExecutionTelemetry, governance: GovernanceAudit);
|
|
44
|
-
recordConnectorAttempt(audit: ConnectorAttemptAudit): Promise<AuditAppendAck>;
|
|
45
|
-
recordStateGovernance(event: StateGovernanceAudit): Promise<AuditAppendAck>;
|
|
46
|
-
}
|
|
47
|
-
export declare function createGovernancePlaneRecorder(db: ObservabilityDatabase): GovernancePlaneRecorder;
|
|
1
|
+
/**
|
|
2
|
+
* T5.1.2 governance plane: connector attempts + state governance audit append ports.
|
|
3
|
+
*
|
|
4
|
+
* Core logic: connector attempts map to executionAttempts telemetry; governance kinds map to
|
|
5
|
+
* governance_audit rows with traceId on target_asset_id for explain correlation.
|
|
6
|
+
*
|
|
7
|
+
* Test coverage: tests/unit/observability/governance-plane-recorder.test.ts
|
|
8
|
+
*/
|
|
9
|
+
import type { ObservabilityDatabase } from "../db/index.js";
|
|
10
|
+
import { ExecutionTelemetry } from "./execution-telemetry.js";
|
|
11
|
+
import { GovernanceAudit } from "./governance-audit.js";
|
|
12
|
+
export interface AuditAppendAck {
|
|
13
|
+
recordId: string;
|
|
14
|
+
appendedAt: string;
|
|
15
|
+
}
|
|
16
|
+
export type ConnectorAttemptOutcome = "started" | "succeeded" | "failed" | "sampled_telemetry";
|
|
17
|
+
export interface ConnectorAttemptAudit {
|
|
18
|
+
traceId: string;
|
|
19
|
+
decisionId: string;
|
|
20
|
+
intentId: string;
|
|
21
|
+
platformId: string;
|
|
22
|
+
capability: string;
|
|
23
|
+
channel: string;
|
|
24
|
+
outcome: ConnectorAttemptOutcome;
|
|
25
|
+
failureClass?: string;
|
|
26
|
+
idempotencyKey?: string;
|
|
27
|
+
metadata?: Record<string, unknown>;
|
|
28
|
+
}
|
|
29
|
+
export type StateGovernanceKind = "fallback_written" | "effect_commit_advanced" | "connector_failure" | "anchor_proposal_received";
|
|
30
|
+
export interface StateGovernanceAudit {
|
|
31
|
+
id: string;
|
|
32
|
+
traceId: string;
|
|
33
|
+
kind: StateGovernanceKind;
|
|
34
|
+
reason: string;
|
|
35
|
+
decisionId?: string;
|
|
36
|
+
artifactPath?: string;
|
|
37
|
+
supportingSources?: string[];
|
|
38
|
+
createdAt?: string;
|
|
39
|
+
}
|
|
40
|
+
export declare class GovernancePlaneRecorder {
|
|
41
|
+
private readonly telemetry;
|
|
42
|
+
private readonly governance;
|
|
43
|
+
constructor(telemetry: ExecutionTelemetry, governance: GovernanceAudit);
|
|
44
|
+
recordConnectorAttempt(audit: ConnectorAttemptAudit): Promise<AuditAppendAck>;
|
|
45
|
+
recordStateGovernance(event: StateGovernanceAudit): Promise<AuditAppendAck>;
|
|
46
|
+
}
|
|
47
|
+
export declare function createGovernancePlaneRecorder(db: ObservabilityDatabase): GovernancePlaneRecorder;
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
import { ExecutionTelemetry } from "./execution-telemetry.js";
|
|
2
|
-
import { GovernanceAudit } from "./governance-audit.js";
|
|
3
|
-
export class GovernancePlaneRecorder {
|
|
4
|
-
telemetry;
|
|
5
|
-
governance;
|
|
6
|
-
constructor(telemetry, governance) {
|
|
7
|
-
this.telemetry = telemetry;
|
|
8
|
-
this.governance = governance;
|
|
9
|
-
}
|
|
10
|
-
async recordConnectorAttempt(audit) {
|
|
11
|
-
const id = `ca-${audit.traceId}-${Date.now()}`;
|
|
12
|
-
const status = audit.outcome === "failed" ? "failed" : audit.outcome === "started" ? "started" : "succeeded";
|
|
13
|
-
const now = new Date().toISOString();
|
|
14
|
-
const attempt = {
|
|
15
|
-
id,
|
|
16
|
-
traceId: audit.traceId,
|
|
17
|
-
decisionId: audit.decisionId,
|
|
18
|
-
intentId: audit.intentId,
|
|
19
|
-
platformId: audit.platformId,
|
|
20
|
-
capability: audit.capability,
|
|
21
|
-
channel: audit.channel,
|
|
22
|
-
status,
|
|
23
|
-
failureClass: audit.failureClass,
|
|
24
|
-
idempotencyKey: audit.idempotencyKey,
|
|
25
|
-
metadata: {
|
|
26
|
-
...(audit.metadata ?? {}),
|
|
27
|
-
...(audit.outcome === "sampled_telemetry" ? { sampledTelemetry: true } : {}),
|
|
28
|
-
},
|
|
29
|
-
startedAt: now,
|
|
30
|
-
finishedAt: status === "started" ? undefined : now,
|
|
31
|
-
};
|
|
32
|
-
await this.telemetry.recordExecutionAttempt(attempt);
|
|
33
|
-
return { recordId: id, appendedAt: attempt.finishedAt ?? attempt.startedAt ?? now };
|
|
34
|
-
}
|
|
35
|
-
async recordStateGovernance(event) {
|
|
36
|
-
const createdAt = event.createdAt ?? new Date().toISOString();
|
|
37
|
-
const reason = event.decisionId !== undefined && event.decisionId.length > 0
|
|
38
|
-
? `${event.reason} decisionId=${event.decisionId}`
|
|
39
|
-
: event.reason;
|
|
40
|
-
await this.governance.recordOperationalGovernanceEvent({
|
|
41
|
-
id: event.id,
|
|
42
|
-
eventType: event.kind,
|
|
43
|
-
traceId: event.traceId,
|
|
44
|
-
statusTo: "recorded",
|
|
45
|
-
reason,
|
|
46
|
-
assetPath: event.artifactPath,
|
|
47
|
-
supportingSources: event.supportingSources,
|
|
48
|
-
createdAt,
|
|
49
|
-
});
|
|
50
|
-
return { recordId: event.id, appendedAt: createdAt };
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
export function createGovernancePlaneRecorder(db) {
|
|
54
|
-
return new GovernancePlaneRecorder(new ExecutionTelemetry(db), new GovernanceAudit(db));
|
|
55
|
-
}
|
|
1
|
+
import { ExecutionTelemetry } from "./execution-telemetry.js";
|
|
2
|
+
import { GovernanceAudit } from "./governance-audit.js";
|
|
3
|
+
export class GovernancePlaneRecorder {
|
|
4
|
+
telemetry;
|
|
5
|
+
governance;
|
|
6
|
+
constructor(telemetry, governance) {
|
|
7
|
+
this.telemetry = telemetry;
|
|
8
|
+
this.governance = governance;
|
|
9
|
+
}
|
|
10
|
+
async recordConnectorAttempt(audit) {
|
|
11
|
+
const id = `ca-${audit.traceId}-${Date.now()}`;
|
|
12
|
+
const status = audit.outcome === "failed" ? "failed" : audit.outcome === "started" ? "started" : "succeeded";
|
|
13
|
+
const now = new Date().toISOString();
|
|
14
|
+
const attempt = {
|
|
15
|
+
id,
|
|
16
|
+
traceId: audit.traceId,
|
|
17
|
+
decisionId: audit.decisionId,
|
|
18
|
+
intentId: audit.intentId,
|
|
19
|
+
platformId: audit.platformId,
|
|
20
|
+
capability: audit.capability,
|
|
21
|
+
channel: audit.channel,
|
|
22
|
+
status,
|
|
23
|
+
failureClass: audit.failureClass,
|
|
24
|
+
idempotencyKey: audit.idempotencyKey,
|
|
25
|
+
metadata: {
|
|
26
|
+
...(audit.metadata ?? {}),
|
|
27
|
+
...(audit.outcome === "sampled_telemetry" ? { sampledTelemetry: true } : {}),
|
|
28
|
+
},
|
|
29
|
+
startedAt: now,
|
|
30
|
+
finishedAt: status === "started" ? undefined : now,
|
|
31
|
+
};
|
|
32
|
+
await this.telemetry.recordExecutionAttempt(attempt);
|
|
33
|
+
return { recordId: id, appendedAt: attempt.finishedAt ?? attempt.startedAt ?? now };
|
|
34
|
+
}
|
|
35
|
+
async recordStateGovernance(event) {
|
|
36
|
+
const createdAt = event.createdAt ?? new Date().toISOString();
|
|
37
|
+
const reason = event.decisionId !== undefined && event.decisionId.length > 0
|
|
38
|
+
? `${event.reason} decisionId=${event.decisionId}`
|
|
39
|
+
: event.reason;
|
|
40
|
+
await this.governance.recordOperationalGovernanceEvent({
|
|
41
|
+
id: event.id,
|
|
42
|
+
eventType: event.kind,
|
|
43
|
+
traceId: event.traceId,
|
|
44
|
+
statusTo: "recorded",
|
|
45
|
+
reason,
|
|
46
|
+
assetPath: event.artifactPath,
|
|
47
|
+
supportingSources: event.supportingSources,
|
|
48
|
+
createdAt,
|
|
49
|
+
});
|
|
50
|
+
return { recordId: event.id, appendedAt: createdAt };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function createGovernancePlaneRecorder(db) {
|
|
54
|
+
return new GovernancePlaneRecorder(new ExecutionTelemetry(db), new GovernanceAudit(db));
|
|
55
|
+
}
|