@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,114 +1,114 @@
1
- /**
2
- * Bounded life evidence snapshot read model (T4.2.1).
3
- */
4
- import * as crypto from "node:crypto";
5
- import fs from "node:fs";
6
- import path from "node:path";
7
- import { and, desc, gte, inArray, lte } from "drizzle-orm";
8
- import { lifeEvidenceIndex } from "../db/schema/life-evidence-index.js";
9
- import { repairStateIndexes } from "../bootstrap/repair-gate.js";
10
- function toReadModel(stored) {
11
- return {
12
- id: stored.id,
13
- timestamp: stored.timestamp,
14
- evidenceType: stored.evidenceType,
15
- platformId: stored.platformId,
16
- summary: stored.summary,
17
- rawContentRef: stored.rawContentRef,
18
- sourceRefs: stored.sourceRefs,
19
- sensitivity: stored.sensitivity,
20
- confidence: stored.confidence,
21
- tags: stored.tags,
22
- producer: stored.producer,
23
- };
24
- }
25
- function buildCoverage(events) {
26
- if (events.length === 0) {
27
- return { coverageRatio: 1, unsupportedClaims: [], claimCoverage: [] };
28
- }
29
- const backed = events.filter((e) => e.sourceRefs.length > 0).length;
30
- return {
31
- coverageRatio: backed / events.length,
32
- unsupportedClaims: [],
33
- claimCoverage: events.map((e, i) => ({
34
- claimId: `ev:${e.id}:${i}`,
35
- backed: e.sourceRefs.length > 0,
36
- sourceRefs: e.sourceRefs,
37
- })),
38
- };
39
- }
40
- export async function loadLifeEvidenceSnapshot(state, workspaceRoot, query, options) {
41
- const runGate = options?.runRepairGate !== false;
42
- if (runGate) {
43
- const repair = await repairStateIndexes(state, { startupGate: true, workspaceRoot });
44
- if (repair.status === "repair_required") {
45
- const err = new Error("state_repair_required");
46
- err.code = "repair_required";
47
- throw err;
48
- }
49
- }
50
- const now = new Date().toISOString();
51
- const windowEnd = query.windowEnd ?? now;
52
- const windowStart = query.windowStart ?? new Date(Date.now() - 7 * 86400000).toISOString();
53
- const limit = query.limit ?? 50;
54
- const conditions = [gte(lifeEvidenceIndex.timestamp, windowStart), lte(lifeEvidenceIndex.timestamp, windowEnd)];
55
- if (query.evidenceTypes?.length) {
56
- conditions.push(inArray(lifeEvidenceIndex.evidenceType, query.evidenceTypes));
57
- }
58
- const rows = await state.db
59
- .select()
60
- .from(lifeEvidenceIndex)
61
- .where(and(...conditions))
62
- .orderBy(desc(lifeEvidenceIndex.timestamp))
63
- .limit(limit);
64
- const platformEvents = [];
65
- const workEvents = [];
66
- const userInteractionEvents = [];
67
- const quietArtifacts = [];
68
- const evidenceRefs = [];
69
- for (const row of rows) {
70
- const abs = path.join(workspaceRoot, row.artifactPath.replace(/\//g, path.sep));
71
- if (!fs.existsSync(abs)) {
72
- continue;
73
- }
74
- const stored = JSON.parse(fs.readFileSync(abs, "utf-8"));
75
- const model = toReadModel(stored);
76
- evidenceRefs.push({
77
- id: `ref:${model.id}`,
78
- kind: "workspace_artifact",
79
- uri: row.artifactPath,
80
- });
81
- if (model.evidenceType === "platform_browse" || model.evidenceType === "platform_interaction") {
82
- platformEvents.push(model);
83
- }
84
- else if (model.evidenceType === "work_progress" || model.evidenceType === "task_discovery") {
85
- workEvents.push(model);
86
- }
87
- else if (model.evidenceType === "user_interaction") {
88
- userInteractionEvents.push(model);
89
- }
90
- else if (model.evidenceType === "quiet_reflection") {
91
- quietArtifacts.push({
92
- id: `quiet:${model.id}`,
93
- kind: "workspace_artifact",
94
- uri: row.artifactPath,
95
- });
96
- }
97
- }
98
- const all = [...platformEvents, ...workEvents, ...userInteractionEvents];
99
- const coverage = buildCoverage(all);
100
- const empty = all.length === 0;
101
- return {
102
- snapshotId: crypto.randomUUID(),
103
- generatedAt: now,
104
- windowStart,
105
- windowEnd,
106
- evidenceRefs,
107
- platformEvents,
108
- workEvents,
109
- userInteractionEvents,
110
- quietArtifacts,
111
- coverage,
112
- empty,
113
- };
114
- }
1
+ /**
2
+ * Bounded life evidence snapshot read model (T4.2.1).
3
+ */
4
+ import * as crypto from "node:crypto";
5
+ import fs from "node:fs";
6
+ import path from "node:path";
7
+ import { and, desc, gte, inArray, lte } from "drizzle-orm";
8
+ import { lifeEvidenceIndex } from "../db/schema/life-evidence-index.js";
9
+ import { repairStateIndexes } from "../bootstrap/repair-gate.js";
10
+ function toReadModel(stored) {
11
+ return {
12
+ id: stored.id,
13
+ timestamp: stored.timestamp,
14
+ evidenceType: stored.evidenceType,
15
+ platformId: stored.platformId,
16
+ summary: stored.summary,
17
+ rawContentRef: stored.rawContentRef,
18
+ sourceRefs: stored.sourceRefs,
19
+ sensitivity: stored.sensitivity,
20
+ confidence: stored.confidence,
21
+ tags: stored.tags,
22
+ producer: stored.producer,
23
+ };
24
+ }
25
+ function buildCoverage(events) {
26
+ if (events.length === 0) {
27
+ return { coverageRatio: 1, unsupportedClaims: [], claimCoverage: [] };
28
+ }
29
+ const backed = events.filter((e) => e.sourceRefs.length > 0).length;
30
+ return {
31
+ coverageRatio: backed / events.length,
32
+ unsupportedClaims: [],
33
+ claimCoverage: events.map((e, i) => ({
34
+ claimId: `ev:${e.id}:${i}`,
35
+ backed: e.sourceRefs.length > 0,
36
+ sourceRefs: e.sourceRefs,
37
+ })),
38
+ };
39
+ }
40
+ export async function loadLifeEvidenceSnapshot(state, workspaceRoot, query, options) {
41
+ const runGate = options?.runRepairGate !== false;
42
+ if (runGate) {
43
+ const repair = await repairStateIndexes(state, { startupGate: true, workspaceRoot });
44
+ if (repair.status === "repair_required") {
45
+ const err = new Error("state_repair_required");
46
+ err.code = "repair_required";
47
+ throw err;
48
+ }
49
+ }
50
+ const now = new Date().toISOString();
51
+ const windowEnd = query.windowEnd ?? now;
52
+ const windowStart = query.windowStart ?? new Date(Date.now() - 7 * 86400000).toISOString();
53
+ const limit = query.limit ?? 50;
54
+ const conditions = [gte(lifeEvidenceIndex.timestamp, windowStart), lte(lifeEvidenceIndex.timestamp, windowEnd)];
55
+ if (query.evidenceTypes?.length) {
56
+ conditions.push(inArray(lifeEvidenceIndex.evidenceType, query.evidenceTypes));
57
+ }
58
+ const rows = await state.db
59
+ .select()
60
+ .from(lifeEvidenceIndex)
61
+ .where(and(...conditions))
62
+ .orderBy(desc(lifeEvidenceIndex.timestamp))
63
+ .limit(limit);
64
+ const platformEvents = [];
65
+ const workEvents = [];
66
+ const userInteractionEvents = [];
67
+ const quietArtifacts = [];
68
+ const evidenceRefs = [];
69
+ for (const row of rows) {
70
+ const abs = path.join(workspaceRoot, row.artifactPath.replace(/\//g, path.sep));
71
+ if (!fs.existsSync(abs)) {
72
+ continue;
73
+ }
74
+ const stored = JSON.parse(fs.readFileSync(abs, "utf-8"));
75
+ const model = toReadModel(stored);
76
+ evidenceRefs.push({
77
+ id: `ref:${model.id}`,
78
+ kind: "workspace_artifact",
79
+ uri: row.artifactPath,
80
+ });
81
+ if (model.evidenceType === "platform_browse" || model.evidenceType === "platform_interaction") {
82
+ platformEvents.push(model);
83
+ }
84
+ else if (model.evidenceType === "work_progress" || model.evidenceType === "task_discovery") {
85
+ workEvents.push(model);
86
+ }
87
+ else if (model.evidenceType === "user_interaction") {
88
+ userInteractionEvents.push(model);
89
+ }
90
+ else if (model.evidenceType === "quiet_reflection") {
91
+ quietArtifacts.push({
92
+ id: `quiet:${model.id}`,
93
+ kind: "workspace_artifact",
94
+ uri: row.artifactPath,
95
+ });
96
+ }
97
+ }
98
+ const all = [...platformEvents, ...workEvents, ...userInteractionEvents];
99
+ const coverage = buildCoverage(all);
100
+ const empty = all.length === 0;
101
+ return {
102
+ snapshotId: crypto.randomUUID(),
103
+ generatedAt: now,
104
+ windowStart,
105
+ windowEnd,
106
+ evidenceRefs,
107
+ platformEvents,
108
+ workEvents,
109
+ userInteractionEvents,
110
+ quietArtifacts,
111
+ coverage,
112
+ empty,
113
+ };
114
+ }
@@ -1,58 +1,58 @@
1
- /**
2
- * Read-model snapshots aligned with state-system v5 (subset for S1/S2).
3
- */
4
- import type { LifeEvidenceType, SourceRef } from "../life-evidence/types.js";
5
- export interface LifeEvidenceQuery {
6
- windowStart?: string;
7
- windowEnd?: string;
8
- evidenceTypes?: LifeEvidenceType[];
9
- limit?: number;
10
- }
11
- export interface SourceCoverage {
12
- coverageRatio: number;
13
- unsupportedClaims: string[];
14
- claimCoverage: Array<{
15
- claimId: string;
16
- backed: boolean;
17
- sourceRefs: SourceRef[];
18
- }>;
19
- }
20
- export interface LifeEvidenceReadModel {
21
- id: string;
22
- timestamp: string;
23
- evidenceType: LifeEvidenceType;
24
- platformId?: string;
25
- summary: string;
26
- rawContentRef?: string;
27
- sourceRefs: SourceRef[];
28
- sensitivity: import("../life-evidence/types.js").Sensitivity;
29
- confidence: number;
30
- tags: string[];
31
- producer: string;
32
- }
33
- export interface LifeEvidenceSnapshot {
34
- snapshotId: string;
35
- generatedAt: string;
36
- windowStart: string;
37
- windowEnd: string;
38
- evidenceRefs: SourceRef[];
39
- platformEvents: LifeEvidenceReadModel[];
40
- workEvents: LifeEvidenceReadModel[];
41
- userInteractionEvents: LifeEvidenceReadModel[];
42
- quietArtifacts: SourceRef[];
43
- coverage: SourceCoverage;
44
- empty: boolean;
45
- }
46
- export interface ContinuitySnapshot {
47
- snapshotId: string;
48
- generatedAt: string;
49
- lastHeartbeatAt?: string;
50
- recentDecisionRefs: SourceRef[];
51
- openObligations: SourceRef[];
52
- quietDebt: {
53
- hasUnprocessedEvidence: boolean;
54
- oldestUnprocessedEvidenceAt?: string;
55
- pendingCount: number;
56
- };
57
- fallbackRefs: SourceRef[];
58
- }
1
+ /**
2
+ * Read-model snapshots aligned with state-system v5 (subset for S1/S2).
3
+ */
4
+ import type { LifeEvidenceType, SourceRef } from "../life-evidence/types.js";
5
+ export interface LifeEvidenceQuery {
6
+ windowStart?: string;
7
+ windowEnd?: string;
8
+ evidenceTypes?: LifeEvidenceType[];
9
+ limit?: number;
10
+ }
11
+ export interface SourceCoverage {
12
+ coverageRatio: number;
13
+ unsupportedClaims: string[];
14
+ claimCoverage: Array<{
15
+ claimId: string;
16
+ backed: boolean;
17
+ sourceRefs: SourceRef[];
18
+ }>;
19
+ }
20
+ export interface LifeEvidenceReadModel {
21
+ id: string;
22
+ timestamp: string;
23
+ evidenceType: LifeEvidenceType;
24
+ platformId?: string;
25
+ summary: string;
26
+ rawContentRef?: string;
27
+ sourceRefs: SourceRef[];
28
+ sensitivity: import("../life-evidence/types.js").Sensitivity;
29
+ confidence: number;
30
+ tags: string[];
31
+ producer: string;
32
+ }
33
+ export interface LifeEvidenceSnapshot {
34
+ snapshotId: string;
35
+ generatedAt: string;
36
+ windowStart: string;
37
+ windowEnd: string;
38
+ evidenceRefs: SourceRef[];
39
+ platformEvents: LifeEvidenceReadModel[];
40
+ workEvents: LifeEvidenceReadModel[];
41
+ userInteractionEvents: LifeEvidenceReadModel[];
42
+ quietArtifacts: SourceRef[];
43
+ coverage: SourceCoverage;
44
+ empty: boolean;
45
+ }
46
+ export interface ContinuitySnapshot {
47
+ snapshotId: string;
48
+ generatedAt: string;
49
+ lastHeartbeatAt?: string;
50
+ recentDecisionRefs: SourceRef[];
51
+ openObligations: SourceRef[];
52
+ quietDebt: {
53
+ hasUnprocessedEvidence: boolean;
54
+ oldestUnprocessedEvidenceAt?: string;
55
+ pendingCount: number;
56
+ };
57
+ fallbackRefs: SourceRef[];
58
+ }
@@ -1 +1 @@
1
- export {};
1
+ export {};
@@ -1,104 +1,104 @@
1
- import { AssetRepository } from "./repositories/asset-repository.js";
2
- import { CredentialRepository } from "./repositories/credential-repository.js";
3
- import { ProposalRepository } from "./repositories/proposal-repository.js";
4
- import { ProvenanceRepository } from "./repositories/provenance-repository.js";
5
- import { IntentCommitRepository } from "./repositories/intent-commit-repository.js";
6
- import { PolicyRepository } from "./repositories/policy-repository.js";
7
- import { createDailyLogPipeline, } from "./services/daily-log-pipeline.js";
8
- import { createQuietInputLoader, } from "./services/quiet-input-loader.js";
9
- import { createPersonaCandidateLoader } from "./services/persona-candidate-loader.js";
10
- import { encryptCredentialAtRest, isCredentialCiphertext } from "./services/credential-vault.js";
11
- export class DefaultStateAPI {
12
- database;
13
- read;
14
- write;
15
- credentials;
16
- commits;
17
- provenance;
18
- constructor(database) {
19
- this.database = database;
20
- const assetRepository = new AssetRepository(database);
21
- const credentialRepository = new CredentialRepository(database);
22
- const proposalRepository = new ProposalRepository(database);
23
- const provenanceRepository = new ProvenanceRepository(database);
24
- const intentCommitRepository = new IntentCommitRepository(database);
25
- const policyRepository = new PolicyRepository(database);
26
- const dailyLogPipeline = createDailyLogPipeline(assetRepository, provenanceRepository);
27
- const quietInputLoader = createQuietInputLoader(assetRepository);
28
- const personaCandidateLoader = createPersonaCandidateLoader();
29
- this.read = {
30
- loadQuietInputs: (query) => quietInputLoader.loadQuietInputs(query),
31
- loadPolicy: async (platformId) => {
32
- const record = await policyRepository.findByPlatformId(platformId);
33
- if (!record)
34
- return undefined;
35
- const r = record;
36
- return {
37
- platformId: r.platformId ?? r.platform_id ?? platformId,
38
- socialDailyLimit: r.socialDailyLimit ?? r.social_daily_limit ?? 0,
39
- quietEnabled: r.quietEnabled ?? Boolean(r.quiet_enabled),
40
- outreachDailyBudget: r.outreachDailyBudget ?? r.outreach_daily_budget ?? 2,
41
- updatedAt: r.updatedAt ?? r.updated_at ?? "",
42
- };
43
- },
44
- loadPersonaCandidates: (sceneContext) => personaCandidateLoader.loadPersonaCandidates(sceneContext),
45
- };
46
- this.write = {
47
- appendActivityLog: (entry) => dailyLogPipeline.appendActivityLog(entry),
48
- appendObservation: (entry) => dailyLogPipeline.appendObservation(entry),
49
- generateDailyReport: (input) => dailyLogPipeline.generateDailyReport(input),
50
- upsertCuratedMemory: (item) => dailyLogPipeline.upsertCuratedMemory(item),
51
- savePolicy: async (policy) => {
52
- await policyRepository.upsert({
53
- platformId: policy.platformId,
54
- socialDailyLimit: policy.socialDailyLimit,
55
- quietEnabled: policy.quietEnabled,
56
- outreachDailyBudget: policy.outreachDailyBudget ?? 2,
57
- updatedAt: new Date().toISOString(),
58
- });
59
- },
60
- };
61
- this.credentials = {
62
- loadCredentialContext: async (platformId) => {
63
- const record = await credentialRepository.findByPlatformId(platformId);
64
- if (!record)
65
- return null;
66
- const r = record;
67
- return {
68
- platformId: (r.platformId ?? r.platform_id),
69
- credentialType: (r.credentialType ?? r.credential_type),
70
- encryptedValue: (r.encryptedValue ?? r.encrypted_value),
71
- status: (r.status ?? ""),
72
- verificationCode: (r.verificationCode ?? r.verification_code ?? null),
73
- challengeText: (r.challengeText ?? r.challenge_text ?? null),
74
- expiresAt: (r.expiresAt ?? r.expires_at ?? null),
75
- attemptsRemaining: (r.attemptsRemaining ?? r.attempts_remaining ?? null),
76
- updatedAt: (r.updatedAt ?? r.updated_at ?? ""),
77
- };
78
- },
79
- saveCredentialContext: async (input) => {
80
- const ctx = input;
81
- const raw = ctx.encryptedValue != null ? String(ctx.encryptedValue) : "";
82
- const encryptedValue = !raw || isCredentialCiphertext(raw) ? raw : encryptCredentialAtRest(raw);
83
- await credentialRepository.upsert({
84
- ...ctx,
85
- encryptedValue,
86
- updatedAt: ctx.updatedAt ?? new Date().toISOString(),
87
- });
88
- },
89
- };
90
- this.commits = {
91
- loadIntentCommitRecord: async (intentId) => {
92
- return intentCommitRepository.findByIntentId(intentId);
93
- },
94
- };
95
- this.provenance = {
96
- explainProvenance: async (assetId) => {
97
- return provenanceRepository.traceAsset(assetId);
98
- },
99
- };
100
- }
101
- }
102
- export function createStateAPI(database) {
103
- return new DefaultStateAPI(database);
104
- }
1
+ import { AssetRepository } from "./repositories/asset-repository.js";
2
+ import { CredentialRepository } from "./repositories/credential-repository.js";
3
+ import { ProposalRepository } from "./repositories/proposal-repository.js";
4
+ import { ProvenanceRepository } from "./repositories/provenance-repository.js";
5
+ import { IntentCommitRepository } from "./repositories/intent-commit-repository.js";
6
+ import { PolicyRepository } from "./repositories/policy-repository.js";
7
+ import { createDailyLogPipeline, } from "./services/daily-log-pipeline.js";
8
+ import { createQuietInputLoader, } from "./services/quiet-input-loader.js";
9
+ import { createPersonaCandidateLoader } from "./services/persona-candidate-loader.js";
10
+ import { encryptCredentialAtRest, isCredentialCiphertext } from "./services/credential-vault.js";
11
+ export class DefaultStateAPI {
12
+ database;
13
+ read;
14
+ write;
15
+ credentials;
16
+ commits;
17
+ provenance;
18
+ constructor(database) {
19
+ this.database = database;
20
+ const assetRepository = new AssetRepository(database);
21
+ const credentialRepository = new CredentialRepository(database);
22
+ const proposalRepository = new ProposalRepository(database);
23
+ const provenanceRepository = new ProvenanceRepository(database);
24
+ const intentCommitRepository = new IntentCommitRepository(database);
25
+ const policyRepository = new PolicyRepository(database);
26
+ const dailyLogPipeline = createDailyLogPipeline(assetRepository, provenanceRepository);
27
+ const quietInputLoader = createQuietInputLoader(assetRepository);
28
+ const personaCandidateLoader = createPersonaCandidateLoader();
29
+ this.read = {
30
+ loadQuietInputs: (query) => quietInputLoader.loadQuietInputs(query),
31
+ loadPolicy: async (platformId) => {
32
+ const record = await policyRepository.findByPlatformId(platformId);
33
+ if (!record)
34
+ return undefined;
35
+ const r = record;
36
+ return {
37
+ platformId: r.platformId ?? r.platform_id ?? platformId,
38
+ socialDailyLimit: r.socialDailyLimit ?? r.social_daily_limit ?? 0,
39
+ quietEnabled: r.quietEnabled ?? Boolean(r.quiet_enabled),
40
+ outreachDailyBudget: r.outreachDailyBudget ?? r.outreach_daily_budget ?? 2,
41
+ updatedAt: r.updatedAt ?? r.updated_at ?? "",
42
+ };
43
+ },
44
+ loadPersonaCandidates: (sceneContext) => personaCandidateLoader.loadPersonaCandidates(sceneContext),
45
+ };
46
+ this.write = {
47
+ appendActivityLog: (entry) => dailyLogPipeline.appendActivityLog(entry),
48
+ appendObservation: (entry) => dailyLogPipeline.appendObservation(entry),
49
+ generateDailyReport: (input) => dailyLogPipeline.generateDailyReport(input),
50
+ upsertCuratedMemory: (item) => dailyLogPipeline.upsertCuratedMemory(item),
51
+ savePolicy: async (policy) => {
52
+ await policyRepository.upsert({
53
+ platformId: policy.platformId,
54
+ socialDailyLimit: policy.socialDailyLimit,
55
+ quietEnabled: policy.quietEnabled,
56
+ outreachDailyBudget: policy.outreachDailyBudget ?? 2,
57
+ updatedAt: new Date().toISOString(),
58
+ });
59
+ },
60
+ };
61
+ this.credentials = {
62
+ loadCredentialContext: async (platformId) => {
63
+ const record = await credentialRepository.findByPlatformId(platformId);
64
+ if (!record)
65
+ return null;
66
+ const r = record;
67
+ return {
68
+ platformId: (r.platformId ?? r.platform_id),
69
+ credentialType: (r.credentialType ?? r.credential_type),
70
+ encryptedValue: (r.encryptedValue ?? r.encrypted_value),
71
+ status: (r.status ?? ""),
72
+ verificationCode: (r.verificationCode ?? r.verification_code ?? null),
73
+ challengeText: (r.challengeText ?? r.challenge_text ?? null),
74
+ expiresAt: (r.expiresAt ?? r.expires_at ?? null),
75
+ attemptsRemaining: (r.attemptsRemaining ?? r.attempts_remaining ?? null),
76
+ updatedAt: (r.updatedAt ?? r.updated_at ?? ""),
77
+ };
78
+ },
79
+ saveCredentialContext: async (input) => {
80
+ const ctx = input;
81
+ const raw = ctx.encryptedValue != null ? String(ctx.encryptedValue) : "";
82
+ const encryptedValue = !raw || isCredentialCiphertext(raw) ? raw : encryptCredentialAtRest(raw);
83
+ await credentialRepository.upsert({
84
+ ...ctx,
85
+ encryptedValue,
86
+ updatedAt: ctx.updatedAt ?? new Date().toISOString(),
87
+ });
88
+ },
89
+ };
90
+ this.commits = {
91
+ loadIntentCommitRecord: async (intentId) => {
92
+ return intentCommitRepository.findByIntentId(intentId);
93
+ },
94
+ };
95
+ this.provenance = {
96
+ explainProvenance: async (assetId) => {
97
+ return provenanceRepository.traceAsset(assetId);
98
+ },
99
+ };
100
+ }
101
+ }
102
+ export function createStateAPI(database) {
103
+ return new DefaultStateAPI(database);
104
+ }
@@ -1,2 +1,2 @@
1
- import type { UserInterestSnapshot } from "./types.js";
2
- export declare function loadUserInterestSnapshot(workspaceRoot: string): Promise<UserInterestSnapshot>;
1
+ import type { UserInterestSnapshot } from "./types.js";
2
+ export declare function loadUserInterestSnapshot(workspaceRoot: string): Promise<UserInterestSnapshot>;