@paradigma-inc/flywheel 0.2.50 → 0.2.51

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paradigma-inc/flywheel",
3
- "version": "0.2.50",
3
+ "version": "0.2.51",
4
4
  "description": "One-command setup for Flywheel MCP hosts",
5
5
  "type": "module",
6
6
  "files": [
@@ -1,21 +1,67 @@
1
- import { assertAcyclicRelation, assertAllSemanticEdgesValid, assertLiveNodes, } from "../projection/rules.js";
1
+ import { assertAllSemanticEdgesValid, } from "../projection/rules.js";
2
2
  import { RepositoryStoreError } from "../sqlite/errors.js";
3
- import { allRows, runSql } from "../sqlite/rows.js";
3
+ import { allRows, iterateRows, runSql } from "../sqlite/rows.js";
4
4
  import { SNAPSHOT_DELETE_ORDER, SNAPSHOT_TABLES } from "./schema.js";
5
5
  import { validateSnapshotTables } from "./validate.js";
6
- export function assertProjectionInvariants(database, repositoryId) {
7
- for (const row of allRows(database.prepare("SELECT parent_repository_id, parent_node_id, child_node_id FROM repository_lineage WHERE repository_id = ?"), repositoryId)) {
8
- const parentRepositoryId = row.parent_repository_id;
9
- const parentNodeId = row.parent_node_id;
10
- const childNodeId = row.child_node_id;
11
- assertLiveNodes(database, repositoryId, parentRepositoryId === repositoryId ? [parentNodeId, childNodeId] : [childNodeId]);
12
- if (parentRepositoryId === repositoryId) {
13
- assertAcyclicRelation(database, repositoryId, parentNodeId, childNodeId, "repository_lineage");
6
+ /**
7
+ * Validate one whole relation in O(V + E) time, retaining O(V + E) graph state
8
+ * until this check returns. This trades memory for avoiding repeated descendant
9
+ * walks for every edge; V and E are the local relation's vertices and edges.
10
+ */
11
+ function assertAcyclicGraph(database, repositoryId, relation) {
12
+ const rows = iterateRows(database.prepare(relation === "lineage"
13
+ ? "SELECT parent_node_id AS parent, child_node_id AS child FROM repository_lineage WHERE repository_id = ? AND parent_repository_id = repository_id"
14
+ : "SELECT container_node_id AS parent, child_node_id AS child FROM repository_containments WHERE repository_id = ?"), repositoryId);
15
+ const children = new Map();
16
+ const incoming = new Map();
17
+ for (const row of rows) {
18
+ const parent = row.parent;
19
+ const child = row.child;
20
+ const siblings = children.get(parent);
21
+ if (siblings === undefined)
22
+ children.set(parent, [child]);
23
+ else
24
+ siblings.push(child);
25
+ if (!incoming.has(parent))
26
+ incoming.set(parent, 0);
27
+ incoming.set(child, (incoming.get(child) ?? 0) + 1);
28
+ }
29
+ const ready = [];
30
+ for (const [node, count] of incoming) {
31
+ if (count === 0)
32
+ ready.push(node);
33
+ }
34
+ for (let index = 0; index < ready.length; index++) {
35
+ const descendants = children.get(ready[index]);
36
+ if (descendants === undefined)
37
+ continue;
38
+ for (const child of descendants) {
39
+ const remaining = incoming.get(child) - 1;
40
+ incoming.set(child, remaining);
41
+ if (remaining === 0)
42
+ ready.push(child);
14
43
  }
15
44
  }
16
- for (const row of allRows(database.prepare("SELECT container_node_id, child_node_id FROM repository_containments WHERE repository_id = ?"), repositoryId)) {
17
- assertAcyclicRelation(database, repositoryId, row.container_node_id, row.child_node_id, "repository_containments");
45
+ if (ready.length !== incoming.size) {
46
+ throw new RepositoryStoreError(`${relation} cycle is invalid`);
47
+ }
48
+ }
49
+ export function assertProjectionInvariants(database, repositoryId) {
50
+ if (allRows(database.prepare(`
51
+ SELECT 1 FROM repository_lineage AS relation
52
+ LEFT JOIN repository_nodes AS child
53
+ ON child.repository_id = relation.repository_id AND child.node_id = relation.child_node_id
54
+ LEFT JOIN repository_nodes AS parent
55
+ ON parent.repository_id = relation.repository_id AND parent.node_id = relation.parent_node_id
56
+ WHERE relation.repository_id = ? AND (
57
+ child.lifecycle_state IS NOT 'live' OR
58
+ (relation.parent_repository_id = relation.repository_id AND parent.lifecycle_state IS NOT 'live')
59
+ ) LIMIT 1
60
+ `), repositoryId).length > 0) {
61
+ throw new RepositoryStoreError("structural relation requires live repository nodes");
18
62
  }
63
+ assertAcyclicGraph(database, repositoryId, "lineage");
64
+ assertAcyclicGraph(database, repositoryId, "containment");
19
65
  // Migration 008 dropped the assignments→definitions foreign key to permit
20
66
  // boundary scopes; local-scoped assignments must still resolve locally.
21
67
  if (allRows(database.prepare("SELECT 1 FROM repository_tag_assignments"
@@ -1 +1 @@
1
- {"version":3,"file":"replace.js","sourceRoot":"","sources":["../../../../src/local/store/snapshot/replace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"replace.js","sourceRoot":"","sources":["../../../../src/local/store/snapshot/replace.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  {
2
- "sourceDigest": "sha256:befdc22c02a0e98c4da435f8f5d7917781927a9889074a9b3695cf54eafb166c",
2
+ "sourceDigest": "sha256:5f3c15058db98bb0c9a6db9da80ee530dd750a914b686b8ca0c8324140ff5d89",
3
3
  "files": [
4
4
  "auth/active-key-id.js",
5
5
  "auth/active-key-id.js.map",