@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.
Files changed (188) hide show
  1. package/index.js +855 -851
  2. package/openclaw.plugin.json +29 -29
  3. package/package.json +52 -52
  4. package/runtime/cli/commands/index.d.ts +14 -14
  5. package/runtime/cli/commands/index.js +193 -193
  6. package/runtime/cli/explain/explain-surface-subject.d.ts +8 -8
  7. package/runtime/cli/explain/explain-surface-subject.js +9 -9
  8. package/runtime/cli/explain/format-explanation.d.ts +12 -12
  9. package/runtime/cli/explain/format-explanation.js +12 -12
  10. package/runtime/cli/explain/resolve-subject.js +41 -41
  11. package/runtime/cli/host-capability/classify-delivery.d.ts +14 -14
  12. package/runtime/cli/host-capability/classify-delivery.js +20 -20
  13. package/runtime/cli/host-capability/probe-host-capability.d.ts +2 -2
  14. package/runtime/cli/host-capability/probe-host-capability.js +58 -58
  15. package/runtime/cli/host-capability/record-host-capability.d.ts +6 -6
  16. package/runtime/cli/host-capability/record-host-capability.js +14 -14
  17. package/runtime/cli/host-capability/types.d.ts +71 -71
  18. package/runtime/cli/host-capability/types.js +6 -6
  19. package/runtime/cli/host-smoke/run-host-smoke.d.ts +2 -2
  20. package/runtime/cli/host-smoke/run-host-smoke.js +40 -40
  21. package/runtime/cli/host-smoke/types.d.ts +35 -35
  22. package/runtime/cli/host-smoke/types.js +6 -6
  23. package/runtime/cli/index.js +58 -54
  24. package/runtime/cli/ops/heartbeat-surface.d.ts +38 -35
  25. package/runtime/cli/ops/heartbeat-surface.js +73 -71
  26. package/runtime/cli/ops/ops-router.d.ts +19 -16
  27. package/runtime/cli/ops/ops-router.js +89 -87
  28. package/runtime/cli/ops/show-operator-fallback.d.ts +13 -13
  29. package/runtime/cli/ops/show-operator-fallback.js +22 -22
  30. package/runtime/cli/ops/workspace-heartbeat-runner.d.ts +19 -10
  31. package/runtime/cli/ops/workspace-heartbeat-runner.js +39 -26
  32. package/runtime/cli/read-models/index.d.ts +29 -29
  33. package/runtime/cli/read-models/index.js +256 -256
  34. package/runtime/cli/read-models/operator-explain-map.d.ts +6 -6
  35. package/runtime/cli/read-models/operator-explain-map.js +10 -10
  36. package/runtime/cli/read-models/types.d.ts +79 -79
  37. package/runtime/cli/runtime/runtime-artifact-boundary.d.ts +28 -28
  38. package/runtime/cli/runtime/runtime-artifact-boundary.js +94 -94
  39. package/runtime/connectors/base/contract.d.ts +87 -87
  40. package/runtime/connectors/base/execution-policy.d.ts +47 -47
  41. package/runtime/connectors/base/execution-policy.js +82 -82
  42. package/runtime/connectors/base/index.d.ts +8 -8
  43. package/runtime/connectors/base/index.js +8 -8
  44. package/runtime/connectors/base/manifest.d.ts +64 -64
  45. package/runtime/connectors/base/manifest.js +86 -86
  46. package/runtime/connectors/base/map-life-evidence.d.ts +16 -16
  47. package/runtime/connectors/base/map-life-evidence.js +79 -79
  48. package/runtime/connectors/base/policy-layer.d.ts +29 -29
  49. package/runtime/connectors/base/policy-layer.js +198 -198
  50. package/runtime/connectors/base/route-planner.js +99 -99
  51. package/runtime/connectors/index.d.ts +5 -5
  52. package/runtime/connectors/index.js +5 -5
  53. package/runtime/connectors/near-real/near-real-connector-smoke.d.ts +19 -19
  54. package/runtime/connectors/near-real/near-real-connector-smoke.js +152 -152
  55. package/runtime/core/second-nature/heartbeat/heartbeat-executor.js +114 -114
  56. package/runtime/core/second-nature/heartbeat/heartbeat-loop.d.ts +63 -63
  57. package/runtime/core/second-nature/heartbeat/heartbeat-loop.js +139 -139
  58. package/runtime/core/second-nature/heartbeat/index.d.ts +8 -8
  59. package/runtime/core/second-nature/heartbeat/index.js +7 -7
  60. package/runtime/core/second-nature/heartbeat/run-heartbeat-cycle.d.ts +21 -21
  61. package/runtime/core/second-nature/heartbeat/run-heartbeat-cycle.js +35 -35
  62. package/runtime/core/second-nature/heartbeat/runtime-snapshot.d.ts +28 -28
  63. package/runtime/core/second-nature/heartbeat/runtime-snapshot.js +35 -35
  64. package/runtime/core/second-nature/heartbeat/signal.d.ts +42 -42
  65. package/runtime/core/second-nature/heartbeat/snapshot-builder.d.ts +51 -51
  66. package/runtime/core/second-nature/index.d.ts +22 -22
  67. package/runtime/core/second-nature/index.js +22 -22
  68. package/runtime/core/second-nature/orchestrator/effect-dispatcher.d.ts +100 -100
  69. package/runtime/core/second-nature/orchestrator/effect-dispatcher.js +144 -144
  70. package/runtime/core/second-nature/orchestrator/guard-layer.d.ts +8 -8
  71. package/runtime/core/second-nature/orchestrator/guard-layer.js +110 -110
  72. package/runtime/core/second-nature/orchestrator/intent-planner.d.ts +13 -13
  73. package/runtime/core/second-nature/orchestrator/intent-planner.js +199 -199
  74. package/runtime/core/second-nature/orchestrator/lease-manager.d.ts +14 -14
  75. package/runtime/core/second-nature/orchestrator/lease-manager.js +58 -58
  76. package/runtime/core/second-nature/outreach/build-outreach-draft-request.d.ts +6 -6
  77. package/runtime/core/second-nature/outreach/build-outreach-draft-request.js +63 -63
  78. package/runtime/core/second-nature/outreach/delivery-target.d.ts +26 -26
  79. package/runtime/core/second-nature/outreach/delivery-target.js +70 -70
  80. package/runtime/core/second-nature/outreach/dispatch-user-outreach.d.ts +38 -38
  81. package/runtime/core/second-nature/outreach/dispatch-user-outreach.js +119 -119
  82. package/runtime/core/second-nature/outreach/judge-input-from-snapshot.d.ts +7 -7
  83. package/runtime/core/second-nature/outreach/judge-input-from-snapshot.js +45 -45
  84. package/runtime/core/second-nature/outreach/judge-outreach.d.ts +40 -40
  85. package/runtime/core/second-nature/outreach/judge-outreach.js +121 -121
  86. package/runtime/core/second-nature/quiet/run-source-backed-quiet.d.ts +21 -21
  87. package/runtime/core/second-nature/quiet/run-source-backed-quiet.js +123 -123
  88. package/runtime/core/second-nature/rhythm/planner-rhythm-window.d.ts +15 -15
  89. package/runtime/core/second-nature/rhythm/planner-rhythm-window.js +52 -52
  90. package/runtime/core/second-nature/rhythm/policy-bridge.d.ts +19 -19
  91. package/runtime/core/second-nature/rhythm/policy-bridge.js +34 -34
  92. package/runtime/core/second-nature/runtime/service-entry.js +45 -45
  93. package/runtime/core/second-nature/types.d.ts +51 -51
  94. package/runtime/guidance/draft-outreach-message.d.ts +7 -7
  95. package/runtime/guidance/draft-outreach-message.js +42 -42
  96. package/runtime/guidance/evidence-guidance.d.ts +40 -40
  97. package/runtime/guidance/evidence-guidance.js +52 -52
  98. package/runtime/guidance/index.d.ts +11 -11
  99. package/runtime/guidance/index.js +11 -11
  100. package/runtime/guidance/outreach-draft-schema.d.ts +228 -228
  101. package/runtime/guidance/outreach-draft-schema.js +80 -80
  102. package/runtime/observability/audit/append-only-audit-store.d.ts +14 -14
  103. package/runtime/observability/audit/append-only-audit-store.js +21 -21
  104. package/runtime/observability/audit/audit-envelope.d.ts +51 -51
  105. package/runtime/observability/audit/audit-envelope.js +130 -130
  106. package/runtime/observability/audit/verify-audit-hash-chain.d.ts +23 -23
  107. package/runtime/observability/audit/verify-audit-hash-chain.js +83 -83
  108. package/runtime/observability/db/index.js +124 -124
  109. package/runtime/observability/db/schema/host-capability-reports.d.ts +180 -180
  110. package/runtime/observability/db/schema/host-capability-reports.js +12 -12
  111. package/runtime/observability/db/schema/index.d.ts +947 -947
  112. package/runtime/observability/db/schema/index.js +71 -71
  113. package/runtime/observability/index.d.ts +20 -19
  114. package/runtime/observability/index.js +19 -18
  115. package/runtime/observability/query/explain-query.d.ts +48 -48
  116. package/runtime/observability/query/explain-query.js +114 -114
  117. package/runtime/observability/query/export-audit-bundle.d.ts +22 -22
  118. package/runtime/observability/query/export-audit-bundle.js +27 -27
  119. package/runtime/observability/services/decision-ledger.d.ts +46 -46
  120. package/runtime/observability/services/decision-ledger.js +161 -161
  121. package/runtime/observability/services/governance-audit.d.ts +41 -41
  122. package/runtime/observability/services/governance-audit.js +163 -163
  123. package/runtime/observability/services/governance-plane-recorder.d.ts +47 -47
  124. package/runtime/observability/services/governance-plane-recorder.js +55 -55
  125. package/runtime/observability/services/lived-experience-audit.d.ts +97 -97
  126. package/runtime/observability/services/lived-experience-audit.js +162 -162
  127. package/runtime/observability/services/runtime-decision-recorder.d.ts +29 -0
  128. package/runtime/observability/services/runtime-decision-recorder.js +94 -0
  129. package/runtime/storage/bootstrap/native-sqlite-probe.d.ts +7 -7
  130. package/runtime/storage/bootstrap/native-sqlite-probe.js +28 -28
  131. package/runtime/storage/bootstrap/repair-gate.d.ts +17 -17
  132. package/runtime/storage/bootstrap/repair-gate.js +71 -71
  133. package/runtime/storage/bootstrap/storage-mode-smoke.d.ts +38 -38
  134. package/runtime/storage/bootstrap/storage-mode-smoke.js +85 -85
  135. package/runtime/storage/db/index.js +154 -154
  136. package/runtime/storage/db/schema/delivery-attempts.d.ts +199 -199
  137. package/runtime/storage/db/schema/delivery-attempts.js +13 -13
  138. package/runtime/storage/db/schema/index.d.ts +9 -9
  139. package/runtime/storage/db/schema/index.js +9 -9
  140. package/runtime/storage/db/schema/life-evidence-index.d.ts +161 -161
  141. package/runtime/storage/db/schema/life-evidence-index.js +11 -11
  142. package/runtime/storage/db/schema/operator-fallback-artifacts.d.ts +161 -161
  143. package/runtime/storage/db/schema/operator-fallback-artifacts.js +11 -11
  144. package/runtime/storage/db/schema/policies.d.ts +98 -98
  145. package/runtime/storage/db/schema/policies.js +8 -8
  146. package/runtime/storage/delivery/query-delivery-attempts.d.ts +3 -3
  147. package/runtime/storage/delivery/query-delivery-attempts.js +32 -32
  148. package/runtime/storage/delivery/types.d.ts +27 -27
  149. package/runtime/storage/delivery/types.js +1 -1
  150. package/runtime/storage/delivery/write-delivery-attempt.d.ts +6 -6
  151. package/runtime/storage/delivery/write-delivery-attempt.js +36 -36
  152. package/runtime/storage/fallback/load-operator-fallback.d.ts +14 -14
  153. package/runtime/storage/fallback/load-operator-fallback.js +47 -47
  154. package/runtime/storage/fallback/operator-fallback-types.d.ts +9 -9
  155. package/runtime/storage/fallback/operator-fallback-types.js +1 -1
  156. package/runtime/storage/fallback/operator-fallback-view.d.ts +11 -11
  157. package/runtime/storage/fallback/operator-fallback-view.js +1 -1
  158. package/runtime/storage/fallback/write-operator-fallback.d.ts +6 -6
  159. package/runtime/storage/fallback/write-operator-fallback.js +21 -21
  160. package/runtime/storage/index.d.ts +37 -37
  161. package/runtime/storage/index.js +30 -30
  162. package/runtime/storage/life-evidence/append-life-evidence.d.ts +7 -7
  163. package/runtime/storage/life-evidence/append-life-evidence.js +64 -64
  164. package/runtime/storage/life-evidence/types.d.ts +45 -45
  165. package/runtime/storage/life-evidence/types.js +6 -6
  166. package/runtime/storage/quiet/persist-quiet-artifact.d.ts +7 -7
  167. package/runtime/storage/quiet/persist-quiet-artifact.js +22 -22
  168. package/runtime/storage/quiet/quiet-artifact-types.d.ts +18 -18
  169. package/runtime/storage/quiet/quiet-artifact-types.js +1 -1
  170. package/runtime/storage/quiet/quiet-artifact-writer.d.ts +15 -15
  171. package/runtime/storage/quiet/quiet-artifact-writer.js +56 -56
  172. package/runtime/storage/repositories/credential-repository.js +30 -30
  173. package/runtime/storage/rhythm/rhythm-policy-snapshot.d.ts +10 -10
  174. package/runtime/storage/rhythm/rhythm-policy-snapshot.js +34 -34
  175. package/runtime/storage/services/credential-vault.d.ts +13 -13
  176. package/runtime/storage/services/credential-vault.js +116 -116
  177. package/runtime/storage/snapshots/continuity-snapshot.d.ts +9 -9
  178. package/runtime/storage/snapshots/continuity-snapshot.js +41 -41
  179. package/runtime/storage/snapshots/life-evidence-snapshot.d.ts +6 -6
  180. package/runtime/storage/snapshots/life-evidence-snapshot.js +114 -114
  181. package/runtime/storage/snapshots/types.d.ts +58 -58
  182. package/runtime/storage/snapshots/types.js +1 -1
  183. package/runtime/storage/state-api.js +104 -104
  184. package/runtime/storage/user-interest/load-user-interest-snapshot.d.ts +2 -2
  185. package/runtime/storage/user-interest/load-user-interest-snapshot.js +150 -150
  186. package/runtime/storage/user-interest/types.d.ts +25 -25
  187. package/runtime/storage/user-interest/types.js +1 -1
  188. 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
+ }