@knpkv/herdr-coordinator 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/store.js CHANGED
@@ -1,8 +1,9 @@
1
- import { Effect, FileSystem, Path, Schema } from "effect";
2
- import { DatabaseSync } from "node:sqlite";
1
+ import { openPrivateSqlite } from "@knpkv/herdr-fleet/sqlite";
2
+ import { Effect, Schema } from "effect";
3
3
  import { ChatHistoryError } from "./errors.js";
4
4
  import { chatHistoryMaxEntries, StoredChatTurn } from "./model.js";
5
5
  const storeError = (operation) => (cause) => new ChatHistoryError({ cause, detail: String(cause), operation });
6
+ const fromPrivateDatabaseError = (error) => new ChatHistoryError({ cause: error.cause, detail: String(error.cause), operation: `chat.${error.operation}` });
6
7
  const StoredTurnRow = Schema.Struct({ record: Schema.String });
7
8
  const decodeTurn = (encoded) => Effect.try({
8
9
  try: () => Schema.decodeUnknownSync(StoredChatTurn)(JSON.parse(encoded)),
@@ -11,40 +12,25 @@ const decodeTurn = (encoded) => Effect.try({
11
12
  const decodeRow = (operation, row) => Schema.decodeUnknownEffect(StoredTurnRow)(row).pipe(Effect.mapError(storeError(operation)), Effect.flatMap(({ record }) => decodeTurn(record)));
12
13
  export class ChatStore {
13
14
  #database;
14
- #fileSystem;
15
+ #secureFiles;
15
16
  path;
16
- constructor(path, fileSystem) {
17
+ constructor(path, opened) {
17
18
  this.path = path;
18
- this.#fileSystem = fileSystem;
19
- this.#database = new DatabaseSync(path);
20
- try {
21
- this.#database.exec(`
22
- PRAGMA journal_mode = WAL;
23
- CREATE TABLE IF NOT EXISTS chat_turns (
24
- id TEXT PRIMARY KEY,
25
- job_id TEXT NOT NULL UNIQUE,
26
- created_at INTEGER NOT NULL,
27
- record TEXT NOT NULL
28
- );
29
- `);
30
- }
31
- catch (error) {
32
- this.#database.close();
33
- throw error;
34
- }
19
+ this.#database = opened.database;
20
+ this.#secureFiles = opened.secureFiles.pipe(Effect.mapError(fromPrivateDatabaseError));
35
21
  }
36
22
  static open = Effect.fn("ChatStore.open")(function* (path) {
37
- const fileSystem = yield* FileSystem.FileSystem;
38
- const paths = yield* Path.Path;
39
- const directory = paths.dirname(path);
40
- yield* fileSystem.makeDirectory(directory, { recursive: true, mode: 0o700 }).pipe(Effect.mapError(storeError("chat.openDirectory")));
41
- yield* fileSystem.chmod(directory, 0o700).pipe(Effect.mapError(storeError("chat.secureDirectory")));
42
- const store = yield* Effect.try({
43
- try: () => new ChatStore(path, fileSystem),
44
- catch: storeError("chat.openDatabase")
45
- });
46
- yield* store.secureFiles();
47
- return store;
23
+ const opened = yield* openPrivateSqlite(path, {
24
+ initialize: (database) => database.exec(`
25
+ CREATE TABLE IF NOT EXISTS chat_turns (
26
+ id TEXT PRIMARY KEY,
27
+ job_id TEXT NOT NULL UNIQUE,
28
+ created_at INTEGER NOT NULL,
29
+ record TEXT NOT NULL
30
+ );
31
+ `)
32
+ }).pipe(Effect.mapError(fromPrivateDatabaseError));
33
+ return new ChatStore(path, opened);
48
34
  });
49
35
  put = Effect.fn("ChatStore.put")(function* (turn) {
50
36
  const stored = yield* Effect.try({
@@ -80,11 +66,7 @@ export class ChatStore {
80
66
  return yield* Effect.forEach(rows, (row) => decodeRow("chat.list", row));
81
67
  });
82
68
  secureFiles() {
83
- const fileSystem = this.#fileSystem;
84
- const files = [this.path, `${this.path}-wal`, `${this.path}-shm`];
85
- return Effect.forEach(files, (path) => fileSystem.exists(path).pipe(Effect.mapError(storeError("chat.secureExists")), Effect.flatMap((exists) => exists
86
- ? fileSystem.chmod(path, 0o600).pipe(Effect.mapError(storeError("chat.secureChmod")))
87
- : Effect.void)), { discard: true });
69
+ return this.#secureFiles;
88
70
  }
89
71
  close() {
90
72
  this.#database.close();
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knpkv/herdr-coordinator",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "description": "Persistent coordinator chat contracts for Herdr fleet jobs",
5
5
  "license": "MIT",
6
6
  "author": "knpkv",
@@ -34,16 +34,18 @@
34
34
  "node": ">=26"
35
35
  },
36
36
  "dependencies": {
37
- "effect": "4.0.0-rc.109",
38
- "@knpkv/herdr-fleet": "^0.3.0"
37
+ "@effect/platform-node": "4.0.0",
38
+ "@effect/sql-sqlite-node": "4.0.0",
39
+ "effect": "4.0.0",
40
+ "@knpkv/herdr-fleet": "^0.5.0",
41
+ "@knpkv/herdr-work": "^0.5.1"
39
42
  },
40
43
  "devDependencies": {
41
- "@effect/platform-node": "4.0.0-rc.109",
42
- "@effect/vitest": "4.0.0-rc.109",
43
- "@types/node": "^26.2.0",
44
+ "@effect/vitest": "4.0.0",
45
+ "@types/node": "^26.6.4",
44
46
  "rimraf": "^6.1.3",
45
47
  "typescript": "npm:@typescript/typescript6@^6.0.2",
46
- "vitest": "^4.1.10"
48
+ "vitest": "^5.0.3"
47
49
  },
48
50
  "scripts": {
49
51
  "build": "rimraf dist && tsc -b --force",