@haaaiawd/second-nature 0.1.18 → 0.1.20

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 (190) hide show
  1. package/index.js +911 -855
  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 +224 -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 +67 -58
  24. package/runtime/cli/ops/heartbeat-surface.d.ts +45 -38
  25. package/runtime/cli/ops/heartbeat-surface.js +79 -73
  26. package/runtime/cli/ops/ops-router.d.ts +32 -19
  27. package/runtime/cli/ops/ops-router.js +188 -89
  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 +40 -19
  31. package/runtime/cli/ops/workspace-heartbeat-runner.js +93 -39
  32. package/runtime/cli/read-models/index.d.ts +46 -29
  33. package/runtime/cli/read-models/index.js +391 -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 +129 -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 +162 -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 +47 -47
  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 -20
  114. package/runtime/observability/index.js +19 -19
  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/observability-retention.d.ts +10 -0
  128. package/runtime/observability/services/observability-retention.js +37 -0
  129. package/runtime/observability/services/runtime-decision-recorder.d.ts +29 -29
  130. package/runtime/observability/services/runtime-decision-recorder.js +94 -94
  131. package/runtime/storage/bootstrap/native-sqlite-probe.d.ts +7 -7
  132. package/runtime/storage/bootstrap/native-sqlite-probe.js +28 -28
  133. package/runtime/storage/bootstrap/repair-gate.d.ts +17 -17
  134. package/runtime/storage/bootstrap/repair-gate.js +71 -71
  135. package/runtime/storage/bootstrap/storage-mode-smoke.d.ts +38 -38
  136. package/runtime/storage/bootstrap/storage-mode-smoke.js +85 -85
  137. package/runtime/storage/db/index.js +61 -61
  138. package/runtime/storage/db/schema/delivery-attempts.d.ts +199 -199
  139. package/runtime/storage/db/schema/delivery-attempts.js +13 -13
  140. package/runtime/storage/db/schema/index.d.ts +9 -9
  141. package/runtime/storage/db/schema/index.js +9 -9
  142. package/runtime/storage/db/schema/life-evidence-index.d.ts +161 -161
  143. package/runtime/storage/db/schema/life-evidence-index.js +11 -11
  144. package/runtime/storage/db/schema/operator-fallback-artifacts.d.ts +161 -161
  145. package/runtime/storage/db/schema/operator-fallback-artifacts.js +11 -11
  146. package/runtime/storage/db/schema/policies.d.ts +98 -98
  147. package/runtime/storage/db/schema/policies.js +8 -8
  148. package/runtime/storage/delivery/query-delivery-attempts.d.ts +3 -3
  149. package/runtime/storage/delivery/query-delivery-attempts.js +32 -32
  150. package/runtime/storage/delivery/types.d.ts +27 -27
  151. package/runtime/storage/delivery/types.js +1 -1
  152. package/runtime/storage/delivery/write-delivery-attempt.d.ts +6 -6
  153. package/runtime/storage/delivery/write-delivery-attempt.js +36 -36
  154. package/runtime/storage/fallback/load-operator-fallback.d.ts +14 -14
  155. package/runtime/storage/fallback/load-operator-fallback.js +47 -47
  156. package/runtime/storage/fallback/operator-fallback-types.d.ts +9 -9
  157. package/runtime/storage/fallback/operator-fallback-types.js +1 -1
  158. package/runtime/storage/fallback/operator-fallback-view.d.ts +11 -11
  159. package/runtime/storage/fallback/operator-fallback-view.js +1 -1
  160. package/runtime/storage/fallback/write-operator-fallback.d.ts +6 -6
  161. package/runtime/storage/fallback/write-operator-fallback.js +21 -21
  162. package/runtime/storage/index.d.ts +37 -37
  163. package/runtime/storage/index.js +30 -30
  164. package/runtime/storage/life-evidence/append-life-evidence.d.ts +7 -7
  165. package/runtime/storage/life-evidence/append-life-evidence.js +64 -64
  166. package/runtime/storage/life-evidence/types.d.ts +45 -45
  167. package/runtime/storage/life-evidence/types.js +6 -6
  168. package/runtime/storage/quiet/persist-quiet-artifact.d.ts +7 -7
  169. package/runtime/storage/quiet/persist-quiet-artifact.js +22 -22
  170. package/runtime/storage/quiet/quiet-artifact-types.d.ts +18 -18
  171. package/runtime/storage/quiet/quiet-artifact-types.js +1 -1
  172. package/runtime/storage/quiet/quiet-artifact-writer.d.ts +15 -15
  173. package/runtime/storage/quiet/quiet-artifact-writer.js +56 -56
  174. package/runtime/storage/repositories/credential-repository.js +30 -30
  175. package/runtime/storage/rhythm/rhythm-policy-snapshot.d.ts +10 -10
  176. package/runtime/storage/rhythm/rhythm-policy-snapshot.js +34 -34
  177. package/runtime/storage/services/credential-vault.d.ts +13 -13
  178. package/runtime/storage/services/credential-vault.js +116 -116
  179. package/runtime/storage/snapshots/continuity-snapshot.d.ts +9 -9
  180. package/runtime/storage/snapshots/continuity-snapshot.js +41 -41
  181. package/runtime/storage/snapshots/life-evidence-snapshot.d.ts +6 -6
  182. package/runtime/storage/snapshots/life-evidence-snapshot.js +114 -114
  183. package/runtime/storage/snapshots/types.d.ts +58 -58
  184. package/runtime/storage/snapshots/types.js +1 -1
  185. package/runtime/storage/state-api.js +104 -104
  186. package/runtime/storage/user-interest/load-user-interest-snapshot.d.ts +2 -2
  187. package/runtime/storage/user-interest/load-user-interest-snapshot.js +150 -150
  188. package/runtime/storage/user-interest/types.d.ts +25 -25
  189. package/runtime/storage/user-interest/types.js +1 -1
  190. package/workspace-ops-bridge.js +90 -81
@@ -1,85 +1,85 @@
1
- /**
2
- * Storage driver mode smoke report (T4.1.4 / state-system §12.1.1).
3
- *
4
- * Actual runtime: `createStateDatabase` uses sql.js — no WAL; persistence via export + explicit flush on close.
5
- * Native SQLite (better-sqlite3) is probed separately; switching drivers is out of scope — report stays honest.
6
- */
7
- import fs from "node:fs";
8
- import os from "node:os";
9
- import path from "node:path";
10
- import { eq } from "drizzle-orm";
11
- import { appendLifeEvidence } from "../life-evidence/append-life-evidence.js";
12
- import { createStateDatabase } from "../db/index.js";
13
- import { lifeEvidenceIndex } from "../db/schema/life-evidence-index.js";
14
- import { repairStateIndexes } from "./repair-gate.js";
15
- import { probeNativeSqliteLoad } from "./native-sqlite-probe.js";
16
- const SEMANTICS = {
17
- sqlJs: {
18
- walAssumed: false,
19
- journalConcurrencyNotes: "sql.js (WASM) has no host SQLite WAL; treat writes as a single-writer/single connection path with explicit export() flush on close (design: single-writer queue + atomic artifact write + explicit flush) — do not assume POSIX WAL or multi-writer journal semantics.",
20
- backupNotes: "Backup for sql.js mode: export DB binary via sqlite.export(), pair with workspace artifact manifest; avoid copying a live in-memory DB without explicit flush/export.",
21
- repairNotes: "Index rebuild uses canonical filesystem evidence artifacts under .second-nature/evidence — repairStateIndexes can repopulate life_evidence_index without WAL replay.",
22
- },
23
- nativeSqliteWhenAvailable: {
24
- journalConcurrencyNotes: "Native better-sqlite3 may enable WAL where supported + busy timeout — applicable only if a future native-backed StateDatabase is wired.",
25
- backupNotes: "Preferred: SQLite Backup API / VACUUM INTO plus artifact manifest — only when native driver owns the DB file.",
26
- },
27
- };
28
- async function runRepairFixture(workspaceRoot) {
29
- const state = createStateDatabase(":memory:");
30
- await appendLifeEvidence(state, workspaceRoot, {
31
- timestamp: new Date().toISOString(),
32
- evidenceType: "platform_browse",
33
- summary: "storage-mode-smoke fixture",
34
- sourceRefs: [{ id: "smoke-ref", kind: "platform_item", uri: "platform://storage-smoke" }],
35
- sensitivity: "public",
36
- producer: "state-system",
37
- });
38
- const rows = await state.db.select().from(lifeEvidenceIndex);
39
- const evidenceId = rows[0]?.id;
40
- if (!evidenceId) {
41
- state.close();
42
- return {
43
- ran: true,
44
- workspaceRoot,
45
- repairStatus: "repair_required",
46
- repairNotes: ["fixture_failed_no_index_after_append"],
47
- };
48
- }
49
- await state.db.delete(lifeEvidenceIndex).where(eq(lifeEvidenceIndex.id, evidenceId));
50
- const repair = await repairStateIndexes(state, { startupGate: true, workspaceRoot });
51
- state.close();
52
- return {
53
- ran: true,
54
- workspaceRoot,
55
- repairStatus: repair.status,
56
- repairedEvidenceIndexRows: repair.repairedEvidenceIndexRows,
57
- repairNotes: repair.repairNotes,
58
- };
59
- }
60
- export async function runStorageModeSmoke(options = {}) {
61
- const nativeSqliteProbe = probeNativeSqliteLoad();
62
- let repairFromArtifactsFixture;
63
- if (options.runRepairFixture) {
64
- const ws = options.workspaceRoot ??
65
- fs.mkdtempSync(path.join(os.tmpdir(), "sn-storage-smoke-"));
66
- try {
67
- repairFromArtifactsFixture = await runRepairFixture(ws);
68
- }
69
- finally {
70
- if (!options.workspaceRoot) {
71
- fs.rmSync(ws, { recursive: true, force: true });
72
- }
73
- }
74
- }
75
- return {
76
- generatedAt: new Date().toISOString(),
77
- runtimeIndexDriver: "sql_js",
78
- nativeSqliteProbe: {
79
- ...nativeSqliteProbe,
80
- runtimeUsesNativeDriver: false,
81
- },
82
- semantics: SEMANTICS,
83
- repairFromArtifactsFixture,
84
- };
85
- }
1
+ /**
2
+ * Storage driver mode smoke report (T4.1.4 / state-system §12.1.1).
3
+ *
4
+ * Actual runtime: `createStateDatabase` uses sql.js — no WAL; persistence via export + explicit flush on close.
5
+ * Native SQLite (better-sqlite3) is probed separately; switching drivers is out of scope — report stays honest.
6
+ */
7
+ import fs from "node:fs";
8
+ import os from "node:os";
9
+ import path from "node:path";
10
+ import { eq } from "drizzle-orm";
11
+ import { appendLifeEvidence } from "../life-evidence/append-life-evidence.js";
12
+ import { createStateDatabase } from "../db/index.js";
13
+ import { lifeEvidenceIndex } from "../db/schema/life-evidence-index.js";
14
+ import { repairStateIndexes } from "./repair-gate.js";
15
+ import { probeNativeSqliteLoad } from "./native-sqlite-probe.js";
16
+ const SEMANTICS = {
17
+ sqlJs: {
18
+ walAssumed: false,
19
+ journalConcurrencyNotes: "sql.js (WASM) has no host SQLite WAL; treat writes as a single-writer/single connection path with explicit export() flush on close (design: single-writer queue + atomic artifact write + explicit flush) — do not assume POSIX WAL or multi-writer journal semantics.",
20
+ backupNotes: "Backup for sql.js mode: export DB binary via sqlite.export(), pair with workspace artifact manifest; avoid copying a live in-memory DB without explicit flush/export.",
21
+ repairNotes: "Index rebuild uses canonical filesystem evidence artifacts under .second-nature/evidence — repairStateIndexes can repopulate life_evidence_index without WAL replay.",
22
+ },
23
+ nativeSqliteWhenAvailable: {
24
+ journalConcurrencyNotes: "Native better-sqlite3 may enable WAL where supported + busy timeout — applicable only if a future native-backed StateDatabase is wired.",
25
+ backupNotes: "Preferred: SQLite Backup API / VACUUM INTO plus artifact manifest — only when native driver owns the DB file.",
26
+ },
27
+ };
28
+ async function runRepairFixture(workspaceRoot) {
29
+ const state = createStateDatabase(":memory:");
30
+ await appendLifeEvidence(state, workspaceRoot, {
31
+ timestamp: new Date().toISOString(),
32
+ evidenceType: "platform_browse",
33
+ summary: "storage-mode-smoke fixture",
34
+ sourceRefs: [{ id: "smoke-ref", kind: "platform_item", uri: "platform://storage-smoke" }],
35
+ sensitivity: "public",
36
+ producer: "state-system",
37
+ });
38
+ const rows = await state.db.select().from(lifeEvidenceIndex);
39
+ const evidenceId = rows[0]?.id;
40
+ if (!evidenceId) {
41
+ state.close();
42
+ return {
43
+ ran: true,
44
+ workspaceRoot,
45
+ repairStatus: "repair_required",
46
+ repairNotes: ["fixture_failed_no_index_after_append"],
47
+ };
48
+ }
49
+ await state.db.delete(lifeEvidenceIndex).where(eq(lifeEvidenceIndex.id, evidenceId));
50
+ const repair = await repairStateIndexes(state, { startupGate: true, workspaceRoot });
51
+ state.close();
52
+ return {
53
+ ran: true,
54
+ workspaceRoot,
55
+ repairStatus: repair.status,
56
+ repairedEvidenceIndexRows: repair.repairedEvidenceIndexRows,
57
+ repairNotes: repair.repairNotes,
58
+ };
59
+ }
60
+ export async function runStorageModeSmoke(options = {}) {
61
+ const nativeSqliteProbe = probeNativeSqliteLoad();
62
+ let repairFromArtifactsFixture;
63
+ if (options.runRepairFixture) {
64
+ const ws = options.workspaceRoot ??
65
+ fs.mkdtempSync(path.join(os.tmpdir(), "sn-storage-smoke-"));
66
+ try {
67
+ repairFromArtifactsFixture = await runRepairFixture(ws);
68
+ }
69
+ finally {
70
+ if (!options.workspaceRoot) {
71
+ fs.rmSync(ws, { recursive: true, force: true });
72
+ }
73
+ }
74
+ }
75
+ return {
76
+ generatedAt: new Date().toISOString(),
77
+ runtimeIndexDriver: "sql_js",
78
+ nativeSqliteProbe: {
79
+ ...nativeSqliteProbe,
80
+ runtimeUsesNativeDriver: false,
81
+ },
82
+ semantics: SEMANTICS,
83
+ repairFromArtifactsFixture,
84
+ };
85
+ }
@@ -1,11 +1,11 @@
1
- import initSqlJs from "sql.js";
2
- import { drizzle } from "drizzle-orm/sql-js";
3
- import path from "node:path";
4
- import fs from "node:fs";
5
- import { fileURLToPath } from "node:url";
6
- import * as schema from "./schema/index.js";
7
- // Pre-initialize sql.js WASM at module load time
8
- const SQL = await initSqlJs();
1
+ import initSqlJs from "sql.js";
2
+ import { drizzle } from "drizzle-orm/sql-js";
3
+ import path from "node:path";
4
+ import fs from "node:fs";
5
+ import { fileURLToPath } from "node:url";
6
+ import * as schema from "./schema/index.js";
7
+ // Pre-initialize sql.js WASM at module load time
8
+ const SQL = await initSqlJs();
9
9
  const STATE_SCHEMA_SQL = `
10
10
  CREATE TABLE IF NOT EXISTS credential_records (
11
11
  platform_id TEXT PRIMARY KEY,
@@ -99,56 +99,56 @@ const STATE_SCHEMA_SQL = `
99
99
  created_at TEXT NOT NULL
100
100
  );
101
101
  CREATE INDEX IF NOT EXISTS operator_fallback_decision_idx ON operator_fallback_artifacts(decision_id);
102
- `;
103
- function resolveDbPath(filename) {
104
- if (path.isAbsolute(filename) || filename === ":memory:") {
105
- return filename;
106
- }
107
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
108
- const pluginRoot = path.resolve(__dirname, "..", "..", "..");
109
- const dataDir = path.join(pluginRoot, "data");
110
- if (!fs.existsSync(dataDir)) {
111
- fs.mkdirSync(dataDir, { recursive: true });
112
- }
113
- return path.join(dataDir, filename);
114
- }
115
- function bootstrapStateSchema(sqlite) {
116
- sqlite.exec(STATE_SCHEMA_SQL);
117
- applyStateSchemaMigrations(sqlite);
118
- }
119
- function applyStateSchemaMigrations(sqlite) {
120
- const migrations = [
121
- "ALTER TABLE policy_records ADD COLUMN outreach_daily_budget INTEGER NOT NULL DEFAULT 2",
122
- ];
123
- for (const sql of migrations) {
124
- try {
125
- sqlite.exec(sql);
126
- }
127
- catch {
128
- /* duplicate column / already migrated */
129
- }
130
- }
131
- }
132
- export function createStateDatabase(filename = "state.db") {
133
- const dbPath = resolveDbPath(filename);
134
- const isMemory = filename === ":memory:";
135
- let dbBuffer;
136
- if (!isMemory && fs.existsSync(dbPath)) {
137
- dbBuffer = fs.readFileSync(dbPath);
138
- }
139
- const sqlite = new SQL.Database(dbBuffer);
140
- bootstrapStateSchema(sqlite);
141
- const db = drizzle(sqlite, { schema });
142
- return {
143
- sqlite,
144
- db,
145
- schema,
146
- close() {
147
- if (!isMemory) {
148
- const data = sqlite.export();
149
- fs.writeFileSync(dbPath, Buffer.from(data));
150
- }
151
- sqlite.close();
152
- },
153
- };
154
- }
102
+ `;
103
+ function resolveDbPath(filename) {
104
+ if (path.isAbsolute(filename) || filename === ":memory:") {
105
+ return filename;
106
+ }
107
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
108
+ const pluginRoot = path.resolve(__dirname, "..", "..", "..");
109
+ const dataDir = path.join(pluginRoot, "data");
110
+ if (!fs.existsSync(dataDir)) {
111
+ fs.mkdirSync(dataDir, { recursive: true });
112
+ }
113
+ return path.join(dataDir, filename);
114
+ }
115
+ function bootstrapStateSchema(sqlite) {
116
+ sqlite.exec(STATE_SCHEMA_SQL);
117
+ applyStateSchemaMigrations(sqlite);
118
+ }
119
+ function applyStateSchemaMigrations(sqlite) {
120
+ const migrations = [
121
+ "ALTER TABLE policy_records ADD COLUMN outreach_daily_budget INTEGER NOT NULL DEFAULT 2",
122
+ ];
123
+ for (const sql of migrations) {
124
+ try {
125
+ sqlite.exec(sql);
126
+ }
127
+ catch {
128
+ /* duplicate column / already migrated */
129
+ }
130
+ }
131
+ }
132
+ export function createStateDatabase(filename = "state.db") {
133
+ const dbPath = resolveDbPath(filename);
134
+ const isMemory = filename === ":memory:";
135
+ let dbBuffer;
136
+ if (!isMemory && fs.existsSync(dbPath)) {
137
+ dbBuffer = fs.readFileSync(dbPath);
138
+ }
139
+ const sqlite = new SQL.Database(dbBuffer);
140
+ bootstrapStateSchema(sqlite);
141
+ const db = drizzle(sqlite, { schema });
142
+ return {
143
+ sqlite,
144
+ db,
145
+ schema,
146
+ close() {
147
+ if (!isMemory) {
148
+ const data = sqlite.export();
149
+ fs.writeFileSync(dbPath, Buffer.from(data));
150
+ }
151
+ sqlite.close();
152
+ },
153
+ };
154
+ }