@tomflow/proflow-task-store-sqlite 0.1.3 → 0.1.4
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/DOCS.md +27 -0
- package/SETUP.md +7 -0
- package/dist/deployment/adapter.d.ts +53 -254
- package/dist/deployment/adapter.js +72 -119
- package/dist/deployment/descriptor.d.ts +6 -26
- package/dist/deployment/descriptor.js +6 -33
- package/package.json +6 -5
- package/proflow.module.json +6 -33
- package/CONFIGURATION.md +0 -23
package/DOCS.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# @tomflow/proflow-task-store-sqlite — Module Docs
|
|
2
|
+
|
|
3
|
+
Module ref: `task-store-sqlite`
|
|
4
|
+
Domain: `task-orchestration`
|
|
5
|
+
Kind: `library`
|
|
6
|
+
|
|
7
|
+
Provides the node:sqlite store and repository adapters for Task-owned structured facts.
|
|
8
|
+
|
|
9
|
+
## Standard management surface
|
|
10
|
+
|
|
11
|
+
`install / uninstall / status / setup / docs / start / stop`
|
|
12
|
+
|
|
13
|
+
## Provides
|
|
14
|
+
|
|
15
|
+
- None.
|
|
16
|
+
|
|
17
|
+
## Requires
|
|
18
|
+
|
|
19
|
+
- `task-orchestration` `>=1.0.0 <2.0.0`
|
|
20
|
+
|
|
21
|
+
## Public setup inputs
|
|
22
|
+
|
|
23
|
+
- None. Deterministic/private values and cross-Module shared facts are not public configuration.
|
|
24
|
+
|
|
25
|
+
## Ownership boundary
|
|
26
|
+
|
|
27
|
+
Module business APIs and any module-specific extra commands remain package-owned. Platform does not proxy or interpret them. Current human/external preparation is documented in `SETUP.md`.
|
package/SETUP.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# @tomflow/proflow-task-store-sqlite — Module Setup
|
|
2
|
+
|
|
3
|
+
No user or external setup is required by the current frozen Module contract. `Module.install` completes deterministic preparation; `Module.setup` only re-observes current reality and must not ask the user to supply private paths, loopback endpoints, tokens or cross-Module facts.
|
|
4
|
+
|
|
5
|
+
## Completion
|
|
6
|
+
|
|
7
|
+
Setup is complete only when the Module's own `status` reports `setupStatus=READY`. Re-running setup must re-observe reality; it must not resume from a blind historical step index.
|
|
@@ -1,297 +1,96 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
ok: boolean;
|
|
6
|
-
status: "SUCCEEDED";
|
|
7
|
-
moduleRef: "task-store-sqlite";
|
|
8
|
-
moduleVersion: "0.1.3";
|
|
9
|
-
checks?: unknown[];
|
|
10
|
-
};
|
|
11
|
-
observedEffects: never[];
|
|
12
|
-
};
|
|
13
|
-
preflight: () => {
|
|
14
|
-
result: {
|
|
15
|
-
contract: "deployment.result.v1";
|
|
16
|
-
ok: boolean;
|
|
17
|
-
status: "SUCCEEDED";
|
|
18
|
-
moduleRef: "task-store-sqlite";
|
|
19
|
-
moduleVersion: "0.1.3";
|
|
20
|
-
checks?: unknown[];
|
|
21
|
-
} | {
|
|
22
|
-
contract: "deployment.result.v1";
|
|
23
|
-
ok: boolean;
|
|
24
|
-
status: "ACTION_REQUIRED";
|
|
25
|
-
moduleRef: "task-store-sqlite";
|
|
26
|
-
moduleVersion: "0.1.3";
|
|
27
|
-
actionRequired: {
|
|
28
|
-
action: string;
|
|
29
|
-
description: string;
|
|
30
|
-
};
|
|
31
|
-
checks?: unknown[];
|
|
32
|
-
} | {
|
|
33
|
-
contract: "deployment.result.v1";
|
|
34
|
-
ok: boolean;
|
|
35
|
-
status: "BLOCKED";
|
|
36
|
-
moduleRef: "task-store-sqlite";
|
|
37
|
-
moduleVersion: "0.1.3";
|
|
38
|
-
error: {
|
|
39
|
-
code: "VERIFY_FAILED";
|
|
40
|
-
message: string;
|
|
41
|
-
retryable: boolean;
|
|
42
|
-
};
|
|
43
|
-
checks?: unknown[];
|
|
44
|
-
};
|
|
45
|
-
observedEffects: never[];
|
|
46
|
-
};
|
|
47
|
-
status: () => {
|
|
48
|
-
result: {
|
|
49
|
-
contract: "deployment.result.v1";
|
|
50
|
-
ok: boolean;
|
|
51
|
-
status: "SUCCEEDED";
|
|
52
|
-
moduleRef: "task-store-sqlite";
|
|
53
|
-
moduleVersion: "0.1.3";
|
|
54
|
-
checks?: unknown[];
|
|
55
|
-
data: {
|
|
56
|
-
configStatus: "INCOMPLETE";
|
|
57
|
-
missingConfig: string[];
|
|
58
|
-
runtimeStatus: "UNKNOWN";
|
|
59
|
-
};
|
|
60
|
-
};
|
|
61
|
-
observedEffects: never[];
|
|
62
|
-
} | {
|
|
1
|
+
import type { ModuleCommandContext } from "@tomflow/proflow-module-contract";
|
|
2
|
+
export declare const taskDatabasePath: (context: ModuleCommandContext) => string;
|
|
3
|
+
export declare const behaviorAdapter: {
|
|
4
|
+
readonly install: (context: ModuleCommandContext) => Promise<{
|
|
63
5
|
result: {
|
|
64
6
|
contract: "deployment.result.v1";
|
|
65
|
-
ok:
|
|
7
|
+
ok: true;
|
|
66
8
|
status: "SUCCEEDED";
|
|
67
9
|
moduleRef: "task-store-sqlite";
|
|
68
|
-
moduleVersion: "0.1.
|
|
69
|
-
checks?: unknown[];
|
|
10
|
+
moduleVersion: "0.1.4";
|
|
70
11
|
data: {
|
|
71
|
-
|
|
72
|
-
configStatus: "INVALID" | "READY";
|
|
73
|
-
runtimeStatus: "UNKNOWN";
|
|
12
|
+
databasePath: string;
|
|
74
13
|
};
|
|
75
14
|
};
|
|
76
15
|
observedEffects: never[];
|
|
77
|
-
}
|
|
78
|
-
|
|
16
|
+
}>;
|
|
17
|
+
readonly uninstall: (_context: ModuleCommandContext) => Promise<{
|
|
79
18
|
result: {
|
|
80
|
-
contract: "deployment.result.v1";
|
|
81
|
-
ok:
|
|
82
|
-
status: "SUCCEEDED";
|
|
83
|
-
moduleRef: "task-store-sqlite";
|
|
84
|
-
moduleVersion: "0.1.
|
|
85
|
-
checks?: unknown[];
|
|
86
|
-
} | {
|
|
87
|
-
contract: "deployment.result.v1";
|
|
88
|
-
ok: boolean;
|
|
89
|
-
status: "ACTION_REQUIRED";
|
|
90
|
-
moduleRef: "task-store-sqlite";
|
|
91
|
-
moduleVersion: "0.1.3";
|
|
92
|
-
actionRequired: {
|
|
93
|
-
action: string;
|
|
94
|
-
description: string;
|
|
95
|
-
};
|
|
96
|
-
checks?: unknown[];
|
|
97
|
-
} | {
|
|
98
|
-
contract: "deployment.result.v1";
|
|
99
|
-
ok: boolean;
|
|
100
|
-
status: "BLOCKED";
|
|
101
|
-
moduleRef: "task-store-sqlite";
|
|
102
|
-
moduleVersion: "0.1.3";
|
|
103
|
-
error: {
|
|
104
|
-
code: "VERIFY_FAILED";
|
|
105
|
-
message: string;
|
|
106
|
-
retryable: boolean;
|
|
107
|
-
};
|
|
108
|
-
checks?: unknown[];
|
|
19
|
+
readonly contract: "deployment.result.v1";
|
|
20
|
+
readonly ok: true;
|
|
21
|
+
readonly status: "SUCCEEDED";
|
|
22
|
+
readonly moduleRef: "task-store-sqlite";
|
|
23
|
+
readonly moduleVersion: "0.1.4";
|
|
109
24
|
};
|
|
110
25
|
observedEffects: never[];
|
|
111
|
-
}
|
|
112
|
-
|
|
26
|
+
}>;
|
|
27
|
+
readonly status: (context: ModuleCommandContext) => Promise<{
|
|
113
28
|
result: {
|
|
114
29
|
contract: "deployment.result.v1";
|
|
115
|
-
ok:
|
|
30
|
+
ok: true;
|
|
116
31
|
status: "SUCCEEDED";
|
|
117
32
|
moduleRef: "task-store-sqlite";
|
|
118
|
-
moduleVersion: "0.1.
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
ok: boolean;
|
|
123
|
-
status: "ACTION_REQUIRED";
|
|
124
|
-
moduleRef: "task-store-sqlite";
|
|
125
|
-
moduleVersion: "0.1.3";
|
|
126
|
-
actionRequired: {
|
|
127
|
-
action: string;
|
|
128
|
-
description: string;
|
|
129
|
-
};
|
|
130
|
-
checks?: unknown[];
|
|
131
|
-
} | {
|
|
132
|
-
contract: "deployment.result.v1";
|
|
133
|
-
ok: boolean;
|
|
134
|
-
status: "BLOCKED";
|
|
135
|
-
moduleRef: "task-store-sqlite";
|
|
136
|
-
moduleVersion: "0.1.3";
|
|
137
|
-
error: {
|
|
138
|
-
code: "VERIFY_FAILED";
|
|
139
|
-
message: string;
|
|
140
|
-
retryable: boolean;
|
|
33
|
+
moduleVersion: "0.1.4";
|
|
34
|
+
data: {
|
|
35
|
+
setupStatus: "FAILED" | "READY";
|
|
36
|
+
runtimeStatus: "NOT_APPLICABLE";
|
|
141
37
|
};
|
|
142
|
-
checks?: unknown[];
|
|
143
|
-
};
|
|
144
|
-
observedEffects: never[];
|
|
145
|
-
};
|
|
146
|
-
};
|
|
147
|
-
export declare const behaviorAdapter: {
|
|
148
|
-
describe: () => {
|
|
149
|
-
result: {
|
|
150
|
-
contract: "deployment.result.v1";
|
|
151
|
-
ok: boolean;
|
|
152
|
-
status: "SUCCEEDED";
|
|
153
|
-
moduleRef: "task-store-sqlite";
|
|
154
|
-
moduleVersion: "0.1.3";
|
|
155
|
-
checks?: unknown[];
|
|
156
38
|
};
|
|
157
39
|
observedEffects: never[];
|
|
158
|
-
}
|
|
159
|
-
|
|
40
|
+
}>;
|
|
41
|
+
readonly setup: (context: ModuleCommandContext) => Promise<{
|
|
160
42
|
result: {
|
|
161
|
-
contract: "deployment.result.v1";
|
|
162
|
-
ok:
|
|
163
|
-
status: "SUCCEEDED";
|
|
164
|
-
moduleRef: "task-store-sqlite";
|
|
165
|
-
moduleVersion: "0.1.
|
|
166
|
-
checks?: unknown[];
|
|
43
|
+
readonly contract: "deployment.result.v1";
|
|
44
|
+
readonly ok: true;
|
|
45
|
+
readonly status: "SUCCEEDED";
|
|
46
|
+
readonly moduleRef: "task-store-sqlite";
|
|
47
|
+
readonly moduleVersion: "0.1.4";
|
|
167
48
|
} | {
|
|
168
49
|
contract: "deployment.result.v1";
|
|
169
|
-
ok: boolean;
|
|
170
|
-
status: "ACTION_REQUIRED";
|
|
171
50
|
moduleRef: "task-store-sqlite";
|
|
172
|
-
moduleVersion: "0.1.
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
description: string;
|
|
176
|
-
};
|
|
177
|
-
checks?: unknown[];
|
|
178
|
-
} | {
|
|
179
|
-
contract: "deployment.result.v1";
|
|
180
|
-
ok: boolean;
|
|
181
|
-
status: "BLOCKED";
|
|
182
|
-
moduleRef: "task-store-sqlite";
|
|
183
|
-
moduleVersion: "0.1.3";
|
|
51
|
+
moduleVersion: "0.1.4";
|
|
52
|
+
ok: false;
|
|
53
|
+
status: "FAILED";
|
|
184
54
|
error: {
|
|
185
|
-
code: "
|
|
55
|
+
code: "SETUP_FAILED";
|
|
186
56
|
message: string;
|
|
187
57
|
retryable: boolean;
|
|
188
58
|
};
|
|
189
|
-
checks?: unknown[];
|
|
190
59
|
};
|
|
191
60
|
observedEffects: never[];
|
|
192
|
-
}
|
|
193
|
-
|
|
61
|
+
}>;
|
|
62
|
+
readonly docs: (_context: ModuleCommandContext) => Promise<{
|
|
194
63
|
result: {
|
|
195
64
|
contract: "deployment.result.v1";
|
|
196
|
-
ok:
|
|
65
|
+
ok: true;
|
|
197
66
|
status: "SUCCEEDED";
|
|
198
67
|
moduleRef: "task-store-sqlite";
|
|
199
|
-
moduleVersion: "0.1.
|
|
200
|
-
checks?: unknown[];
|
|
68
|
+
moduleVersion: "0.1.4";
|
|
201
69
|
data: {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
runtimeStatus: "UNKNOWN";
|
|
70
|
+
docs: string;
|
|
71
|
+
setup: string;
|
|
205
72
|
};
|
|
206
73
|
};
|
|
207
74
|
observedEffects: never[];
|
|
208
|
-
}
|
|
75
|
+
}>;
|
|
76
|
+
readonly start: (_context: ModuleCommandContext) => Promise<{
|
|
209
77
|
result: {
|
|
210
|
-
contract: "deployment.result.v1";
|
|
211
|
-
ok:
|
|
212
|
-
status: "SUCCEEDED";
|
|
213
|
-
moduleRef: "task-store-sqlite";
|
|
214
|
-
moduleVersion: "0.1.
|
|
215
|
-
checks?: unknown[];
|
|
216
|
-
data: {
|
|
217
|
-
missingConfig?: never;
|
|
218
|
-
configStatus: "INVALID" | "READY";
|
|
219
|
-
runtimeStatus: "UNKNOWN";
|
|
220
|
-
};
|
|
221
|
-
};
|
|
222
|
-
observedEffects: never[];
|
|
223
|
-
};
|
|
224
|
-
verify: () => {
|
|
225
|
-
result: {
|
|
226
|
-
contract: "deployment.result.v1";
|
|
227
|
-
ok: boolean;
|
|
228
|
-
status: "SUCCEEDED";
|
|
229
|
-
moduleRef: "task-store-sqlite";
|
|
230
|
-
moduleVersion: "0.1.3";
|
|
231
|
-
checks?: unknown[];
|
|
232
|
-
} | {
|
|
233
|
-
contract: "deployment.result.v1";
|
|
234
|
-
ok: boolean;
|
|
235
|
-
status: "ACTION_REQUIRED";
|
|
236
|
-
moduleRef: "task-store-sqlite";
|
|
237
|
-
moduleVersion: "0.1.3";
|
|
238
|
-
actionRequired: {
|
|
239
|
-
action: string;
|
|
240
|
-
description: string;
|
|
241
|
-
};
|
|
242
|
-
checks?: unknown[];
|
|
243
|
-
} | {
|
|
244
|
-
contract: "deployment.result.v1";
|
|
245
|
-
ok: boolean;
|
|
246
|
-
status: "BLOCKED";
|
|
247
|
-
moduleRef: "task-store-sqlite";
|
|
248
|
-
moduleVersion: "0.1.3";
|
|
249
|
-
error: {
|
|
250
|
-
code: "VERIFY_FAILED";
|
|
251
|
-
message: string;
|
|
252
|
-
retryable: boolean;
|
|
253
|
-
};
|
|
254
|
-
checks?: unknown[];
|
|
78
|
+
readonly contract: "deployment.result.v1";
|
|
79
|
+
readonly ok: true;
|
|
80
|
+
readonly status: "SUCCEEDED";
|
|
81
|
+
readonly moduleRef: "task-store-sqlite";
|
|
82
|
+
readonly moduleVersion: "0.1.4";
|
|
255
83
|
};
|
|
256
84
|
observedEffects: never[];
|
|
257
|
-
}
|
|
258
|
-
|
|
85
|
+
}>;
|
|
86
|
+
readonly stop: (_context: ModuleCommandContext) => Promise<{
|
|
259
87
|
result: {
|
|
260
|
-
contract: "deployment.result.v1";
|
|
261
|
-
ok:
|
|
262
|
-
status: "SUCCEEDED";
|
|
263
|
-
moduleRef: "task-store-sqlite";
|
|
264
|
-
moduleVersion: "0.1.
|
|
265
|
-
checks?: unknown[];
|
|
266
|
-
} | {
|
|
267
|
-
contract: "deployment.result.v1";
|
|
268
|
-
ok: boolean;
|
|
269
|
-
status: "ACTION_REQUIRED";
|
|
270
|
-
moduleRef: "task-store-sqlite";
|
|
271
|
-
moduleVersion: "0.1.3";
|
|
272
|
-
actionRequired: {
|
|
273
|
-
action: string;
|
|
274
|
-
description: string;
|
|
275
|
-
};
|
|
276
|
-
checks?: unknown[];
|
|
277
|
-
} | {
|
|
278
|
-
contract: "deployment.result.v1";
|
|
279
|
-
ok: boolean;
|
|
280
|
-
status: "BLOCKED";
|
|
281
|
-
moduleRef: "task-store-sqlite";
|
|
282
|
-
moduleVersion: "0.1.3";
|
|
283
|
-
error: {
|
|
284
|
-
code: "VERIFY_FAILED";
|
|
285
|
-
message: string;
|
|
286
|
-
retryable: boolean;
|
|
287
|
-
};
|
|
288
|
-
checks?: unknown[];
|
|
88
|
+
readonly contract: "deployment.result.v1";
|
|
89
|
+
readonly ok: true;
|
|
90
|
+
readonly status: "SUCCEEDED";
|
|
91
|
+
readonly moduleRef: "task-store-sqlite";
|
|
92
|
+
readonly moduleVersion: "0.1.4";
|
|
289
93
|
};
|
|
290
94
|
observedEffects: never[];
|
|
291
|
-
}
|
|
292
|
-
};
|
|
293
|
-
export declare function createProductionBinding(input: {
|
|
294
|
-
config: Record<string, string>;
|
|
295
|
-
}): {
|
|
296
|
-
behaviorAdapter: Record<string, unknown>;
|
|
95
|
+
}>;
|
|
297
96
|
};
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
+
import { mkdir } from "node:fs/promises";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
2
4
|
import { DatabaseSync } from "node:sqlite";
|
|
3
5
|
import { descriptor } from "./descriptor.js";
|
|
4
6
|
const REQUIRED_TABLES = [
|
|
@@ -13,137 +15,88 @@ const REQUIRED_TABLES = [
|
|
|
13
15
|
"task_events",
|
|
14
16
|
"idempotency_records",
|
|
15
17
|
];
|
|
16
|
-
const
|
|
18
|
+
const base = {
|
|
17
19
|
contract: "deployment.result.v1",
|
|
18
20
|
ok: true,
|
|
19
21
|
status: "SUCCEEDED",
|
|
20
22
|
moduleRef: descriptor.moduleRef,
|
|
21
23
|
moduleVersion: descriptor.moduleVersion,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
moduleRef: descriptor.moduleRef,
|
|
29
|
-
moduleVersion: descriptor.moduleVersion,
|
|
30
|
-
actionRequired: { action: "configure-task-store", description },
|
|
31
|
-
...(checks === undefined ? {} : { checks }),
|
|
32
|
-
});
|
|
33
|
-
const blocked = (message, checks) => ({
|
|
34
|
-
contract: "deployment.result.v1",
|
|
35
|
-
ok: false,
|
|
36
|
-
status: "BLOCKED",
|
|
37
|
-
moduleRef: descriptor.moduleRef,
|
|
38
|
-
moduleVersion: descriptor.moduleVersion,
|
|
39
|
-
error: { code: "VERIFY_FAILED", message, retryable: true },
|
|
40
|
-
...(checks === undefined ? {} : { checks }),
|
|
41
|
-
});
|
|
42
|
-
function inspect(databasePath) {
|
|
43
|
-
if (!databasePath)
|
|
44
|
-
return { ok: false, message: "databasePath is required" };
|
|
45
|
-
if (!existsSync(databasePath)) {
|
|
46
|
-
return {
|
|
47
|
-
ok: false,
|
|
48
|
-
message: `Task SQLite database does not exist at ${databasePath}`,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
let database;
|
|
24
|
+
};
|
|
25
|
+
export const taskDatabasePath = (context) => join(resolve(context.workspaceRoot), ".proflow", "state", "task.sqlite");
|
|
26
|
+
function inspect(path) {
|
|
27
|
+
if (!existsSync(path))
|
|
28
|
+
return false;
|
|
29
|
+
let db;
|
|
52
30
|
try {
|
|
53
|
-
|
|
54
|
-
const integrity =
|
|
55
|
-
const tables = new Set(
|
|
31
|
+
db = new DatabaseSync(path, { readOnly: true });
|
|
32
|
+
const integrity = db.prepare("PRAGMA integrity_check").get();
|
|
33
|
+
const tables = new Set(db
|
|
56
34
|
.prepare("SELECT name FROM sqlite_master WHERE type='table'")
|
|
57
35
|
.all().map((row) => row.name));
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return {
|
|
61
|
-
ok: false,
|
|
62
|
-
message: `SQLite integrity_check returned ${integrity?.integrity_check ?? "unknown"}`,
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
if (missing.length > 0) {
|
|
66
|
-
return {
|
|
67
|
-
ok: false,
|
|
68
|
-
message: `Task SQLite schema is missing tables: ${missing.join(", ")}`,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
return {
|
|
72
|
-
ok: true,
|
|
73
|
-
message: "Task SQLite schema is present and integrity_check is ok",
|
|
74
|
-
};
|
|
36
|
+
return (integrity?.integrity_check === "ok" &&
|
|
37
|
+
REQUIRED_TABLES.every((table) => tables.has(table)));
|
|
75
38
|
}
|
|
76
|
-
catch
|
|
77
|
-
return
|
|
78
|
-
ok: false,
|
|
79
|
-
message: error instanceof Error
|
|
80
|
-
? error.message
|
|
81
|
-
: "Task SQLite reality could not be read",
|
|
82
|
-
};
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
83
41
|
}
|
|
84
42
|
finally {
|
|
85
|
-
|
|
43
|
+
db?.close();
|
|
86
44
|
}
|
|
87
45
|
}
|
|
88
|
-
export
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
:
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
46
|
+
export const behaviorAdapter = {
|
|
47
|
+
install: async (context) => {
|
|
48
|
+
const path = taskDatabasePath(context);
|
|
49
|
+
await mkdir(resolve(path, ".."), { recursive: true, mode: 0o700 });
|
|
50
|
+
if (!existsSync(path)) {
|
|
51
|
+
const db = new DatabaseSync(path);
|
|
52
|
+
db.close();
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
result: { ...base, data: { databasePath: path } },
|
|
56
|
+
observedEffects: [],
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
uninstall: async (_context) => ({
|
|
60
|
+
result: base,
|
|
61
|
+
observedEffects: [],
|
|
62
|
+
}),
|
|
63
|
+
status: async (context) => ({
|
|
64
|
+
result: {
|
|
65
|
+
...base,
|
|
66
|
+
data: {
|
|
67
|
+
setupStatus: inspect(taskDatabasePath(context))
|
|
68
|
+
? "READY"
|
|
69
|
+
: "FAILED",
|
|
70
|
+
runtimeStatus: "NOT_APPLICABLE",
|
|
71
|
+
},
|
|
99
72
|
},
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
const reality = inspect(config.databasePath);
|
|
115
|
-
return {
|
|
116
|
-
result: {
|
|
117
|
-
...success(),
|
|
118
|
-
data: {
|
|
119
|
-
configStatus: reality.ok
|
|
120
|
-
? "READY"
|
|
121
|
-
: "INVALID",
|
|
122
|
-
runtimeStatus: "UNKNOWN",
|
|
123
|
-
},
|
|
73
|
+
observedEffects: [],
|
|
74
|
+
}),
|
|
75
|
+
setup: async (context) => ({
|
|
76
|
+
result: inspect(taskDatabasePath(context))
|
|
77
|
+
? base
|
|
78
|
+
: {
|
|
79
|
+
...base,
|
|
80
|
+
ok: false,
|
|
81
|
+
status: "FAILED",
|
|
82
|
+
error: {
|
|
83
|
+
code: "SETUP_FAILED",
|
|
84
|
+
message: "Task SQLite schema is not materialized; task-migration-runner must complete deterministic install",
|
|
85
|
+
retryable: true,
|
|
124
86
|
},
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
const reality = inspect(config.databasePath);
|
|
142
|
-
return { result: resultForReality(reality), observedEffects: [] };
|
|
143
|
-
},
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
export const behaviorAdapter = createBehaviorAdapter();
|
|
147
|
-
export function createProductionBinding(input) {
|
|
148
|
-
return { behaviorAdapter: createBehaviorAdapter(input.config) };
|
|
149
|
-
}
|
|
87
|
+
},
|
|
88
|
+
observedEffects: [],
|
|
89
|
+
}),
|
|
90
|
+
docs: async (_context) => ({
|
|
91
|
+
result: { ...base, data: { docs: "DOCS.md", setup: "SETUP.md" } },
|
|
92
|
+
observedEffects: [],
|
|
93
|
+
}),
|
|
94
|
+
start: async (_context) => ({
|
|
95
|
+
result: base,
|
|
96
|
+
observedEffects: [],
|
|
97
|
+
}),
|
|
98
|
+
stop: async (_context) => ({
|
|
99
|
+
result: base,
|
|
100
|
+
observedEffects: [],
|
|
101
|
+
}),
|
|
102
|
+
};
|
|
@@ -3,7 +3,7 @@ export declare const descriptor: {
|
|
|
3
3
|
readonly contractVersion: "1.0.0";
|
|
4
4
|
readonly moduleRef: "task-store-sqlite";
|
|
5
5
|
readonly packageName: "@tomflow/proflow-task-store-sqlite";
|
|
6
|
-
readonly moduleVersion: "0.1.
|
|
6
|
+
readonly moduleVersion: "0.1.4";
|
|
7
7
|
readonly kind: "library";
|
|
8
8
|
readonly templateVersion: "1.0.0";
|
|
9
9
|
readonly platformCompatibility: ">=1.0.0 <2.0.0";
|
|
@@ -21,34 +21,14 @@ export declare const descriptor: {
|
|
|
21
21
|
readonly runtime: "node";
|
|
22
22
|
readonly versionRange: ">=24.19.0";
|
|
23
23
|
}];
|
|
24
|
-
readonly configSlots: readonly [
|
|
25
|
-
readonly key: "databasePath";
|
|
26
|
-
readonly type: "path";
|
|
27
|
-
readonly required: true;
|
|
28
|
-
readonly description: "Task SQLite database path";
|
|
29
|
-
}];
|
|
30
|
-
readonly lifecycle: {
|
|
31
|
-
readonly supported: readonly ["describe", "preflight", "status", "verify", "doctor"];
|
|
32
|
-
};
|
|
33
|
-
readonly verification: {
|
|
34
|
-
readonly checks: readonly [{
|
|
35
|
-
readonly id: "sqlite-integrity-pass";
|
|
36
|
-
readonly description: "SQLite schema and integrity checks pass";
|
|
37
|
-
readonly lifecycle: "verify";
|
|
38
|
-
}];
|
|
39
|
-
};
|
|
24
|
+
readonly configSlots: readonly [];
|
|
40
25
|
readonly effects: readonly [{
|
|
41
26
|
readonly kind: "filesystem";
|
|
42
27
|
readonly description: "Persists Task-owned structured facts in SQLite";
|
|
43
28
|
readonly retention: "preserve";
|
|
44
29
|
}];
|
|
45
|
-
readonly documentation:
|
|
46
|
-
readonly
|
|
47
|
-
readonly
|
|
48
|
-
|
|
49
|
-
}, {
|
|
50
|
-
readonly id: "configuration";
|
|
51
|
-
readonly path: "./CONFIGURATION.md";
|
|
52
|
-
readonly description: "Module configuration fields, sources and materialization instructions";
|
|
53
|
-
}];
|
|
30
|
+
readonly documentation: {
|
|
31
|
+
readonly docs: "DOCS.md";
|
|
32
|
+
readonly setup: "SETUP.md";
|
|
33
|
+
};
|
|
54
34
|
};
|
|
@@ -3,7 +3,7 @@ export const descriptor = {
|
|
|
3
3
|
contractVersion: "1.0.0",
|
|
4
4
|
moduleRef: "task-store-sqlite",
|
|
5
5
|
packageName: "@tomflow/proflow-task-store-sqlite",
|
|
6
|
-
moduleVersion: "0.1.
|
|
6
|
+
moduleVersion: "0.1.4",
|
|
7
7
|
kind: "library",
|
|
8
8
|
templateVersion: "1.0.0",
|
|
9
9
|
platformCompatibility: ">=1.0.0 <2.0.0",
|
|
@@ -25,26 +25,7 @@ export const descriptor = {
|
|
|
25
25
|
versionRange: ">=24.19.0",
|
|
26
26
|
},
|
|
27
27
|
],
|
|
28
|
-
configSlots: [
|
|
29
|
-
{
|
|
30
|
-
key: "databasePath",
|
|
31
|
-
type: "path",
|
|
32
|
-
required: true,
|
|
33
|
-
description: "Task SQLite database path",
|
|
34
|
-
},
|
|
35
|
-
],
|
|
36
|
-
lifecycle: {
|
|
37
|
-
supported: ["describe", "preflight", "status", "verify", "doctor"],
|
|
38
|
-
},
|
|
39
|
-
verification: {
|
|
40
|
-
checks: [
|
|
41
|
-
{
|
|
42
|
-
id: "sqlite-integrity-pass",
|
|
43
|
-
description: "SQLite schema and integrity checks pass",
|
|
44
|
-
lifecycle: "verify",
|
|
45
|
-
},
|
|
46
|
-
],
|
|
47
|
-
},
|
|
28
|
+
configSlots: [],
|
|
48
29
|
effects: [
|
|
49
30
|
{
|
|
50
31
|
kind: "filesystem",
|
|
@@ -52,16 +33,8 @@ export const descriptor = {
|
|
|
52
33
|
retention: "preserve",
|
|
53
34
|
},
|
|
54
35
|
],
|
|
55
|
-
documentation:
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
description: "Package-owned module overview",
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
id: "configuration",
|
|
63
|
-
path: "./CONFIGURATION.md",
|
|
64
|
-
description: "Module configuration fields, sources and materialization instructions",
|
|
65
|
-
},
|
|
66
|
-
],
|
|
36
|
+
documentation: {
|
|
37
|
+
docs: "DOCS.md",
|
|
38
|
+
setup: "SETUP.md",
|
|
39
|
+
},
|
|
67
40
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tomflow/proflow-task-store-sqlite",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -16,14 +16,15 @@
|
|
|
16
16
|
"proflow.module.json",
|
|
17
17
|
"conformance.json",
|
|
18
18
|
"README.md",
|
|
19
|
-
"
|
|
19
|
+
"DOCS.md",
|
|
20
|
+
"SETUP.md"
|
|
20
21
|
],
|
|
21
22
|
"dependencies": {
|
|
22
|
-
"@tomflow/proflow-
|
|
23
|
-
"@tomflow/proflow-
|
|
23
|
+
"@tomflow/proflow-module-contract": "^0.1.4",
|
|
24
|
+
"@tomflow/proflow-task-orchestration": "^0.1.3"
|
|
24
25
|
},
|
|
25
26
|
"devDependencies": {
|
|
26
|
-
"@tomflow/proflow-task-migration-runner": "^0.1.
|
|
27
|
+
"@tomflow/proflow-task-migration-runner": "^0.1.4"
|
|
27
28
|
},
|
|
28
29
|
"description": "Provides the node:sqlite store and repository adapters for Task-owned structured facts.",
|
|
29
30
|
"keywords": [
|
package/proflow.module.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"contractVersion": "1.0.0",
|
|
4
4
|
"moduleRef": "task-store-sqlite",
|
|
5
5
|
"packageName": "@tomflow/proflow-task-store-sqlite",
|
|
6
|
-
"moduleVersion": "0.1.
|
|
6
|
+
"moduleVersion": "0.1.4",
|
|
7
7
|
"kind": "library",
|
|
8
8
|
"templateVersion": "1.0.0",
|
|
9
9
|
"platformCompatibility": ">=1.0.0 <2.0.0",
|
|
@@ -25,26 +25,7 @@
|
|
|
25
25
|
"versionRange": ">=24.19.0"
|
|
26
26
|
}
|
|
27
27
|
],
|
|
28
|
-
"configSlots": [
|
|
29
|
-
{
|
|
30
|
-
"key": "databasePath",
|
|
31
|
-
"type": "path",
|
|
32
|
-
"required": true,
|
|
33
|
-
"description": "Task SQLite database path"
|
|
34
|
-
}
|
|
35
|
-
],
|
|
36
|
-
"lifecycle": {
|
|
37
|
-
"supported": ["describe", "preflight", "status", "verify", "doctor"]
|
|
38
|
-
},
|
|
39
|
-
"verification": {
|
|
40
|
-
"checks": [
|
|
41
|
-
{
|
|
42
|
-
"id": "sqlite-integrity-pass",
|
|
43
|
-
"description": "SQLite schema and integrity checks pass",
|
|
44
|
-
"lifecycle": "verify"
|
|
45
|
-
}
|
|
46
|
-
]
|
|
47
|
-
},
|
|
28
|
+
"configSlots": [],
|
|
48
29
|
"effects": [
|
|
49
30
|
{
|
|
50
31
|
"kind": "filesystem",
|
|
@@ -52,16 +33,8 @@
|
|
|
52
33
|
"retention": "preserve"
|
|
53
34
|
}
|
|
54
35
|
],
|
|
55
|
-
"documentation":
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
"description": "Package-owned module overview"
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
"id": "configuration",
|
|
63
|
-
"path": "./CONFIGURATION.md",
|
|
64
|
-
"description": "Module configuration fields, sources and materialization instructions"
|
|
65
|
-
}
|
|
66
|
-
]
|
|
36
|
+
"documentation": {
|
|
37
|
+
"docs": "DOCS.md",
|
|
38
|
+
"setup": "SETUP.md"
|
|
39
|
+
}
|
|
67
40
|
}
|
package/CONFIGURATION.md
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
# task-store-sqlite configuration
|
|
2
|
-
|
|
3
|
-
Canonical public config: `.proflow/config/task-store-sqlite.json`
|
|
4
|
-
|
|
5
|
-
This file is Workspace-owned data. `platform uninstall` does not delete it. Values are JSON strings. Raw secrets must not be stored here; `secretRef` fields contain opaque references only.
|
|
6
|
-
|
|
7
|
-
## Fields
|
|
8
|
-
|
|
9
|
-
| Key | Type | Required | Sensitive | Source | Meaning |
|
|
10
|
-
|---|---|---:|---:|---|---|
|
|
11
|
-
| `databasePath` | `path` | yes | no | User or owning Module supplies an absolute/local path that exists on this Workspace. | Task SQLite database path |
|
|
12
|
-
|
|
13
|
-
## Materialize
|
|
14
|
-
|
|
15
|
-
Create or update the canonical JSON object at:
|
|
16
|
-
|
|
17
|
-
`.proflow/config/task-store-sqlite.json`
|
|
18
|
-
|
|
19
|
-
Use only declared keys and string values. Do not create a second Platform configuration database.
|
|
20
|
-
|
|
21
|
-
## Base completion check
|
|
22
|
-
|
|
23
|
-
Run `platform modules`. This Module should no longer report required keys in `missingConfig`. `platform start` performs the authoritative Module-owned validation before starting anything.
|