amalgm 0.1.245 → 0.1.246
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/README.md +12 -0
- package/lib/cli.js +146 -8
- package/lib/layout.js +89 -4
- package/lib/shared-realtime-tunnel.js +384 -43
- package/lib/supervisor.js +0 -3
- package/package.json +2 -2
- package/runtime/scripts/amalgm-mcp/adapters/contract.js +197 -0
- package/runtime/scripts/amalgm-mcp/adapters/filesystem.js +135 -0
- package/runtime/scripts/amalgm-mcp/adapters/git.js +84 -0
- package/runtime/scripts/amalgm-mcp/adapters/index.js +43 -0
- package/runtime/scripts/amalgm-mcp/adapters/reference.js +31 -0
- package/runtime/scripts/amalgm-mcp/adapters/truth.js +19 -0
- package/runtime/scripts/amalgm-mcp/browser/cookie-jar.js +20 -68
- package/runtime/scripts/amalgm-mcp/index.js +4 -0
- package/runtime/scripts/amalgm-mcp/lib/layout.js +89 -4
- package/runtime/scripts/amalgm-mcp/observer/README.md +259 -0
- package/runtime/scripts/amalgm-mcp/observer/apply.js +150 -0
- package/runtime/scripts/amalgm-mcp/observer/continuity.js +111 -0
- package/runtime/scripts/amalgm-mcp/observer/edges.js +111 -0
- package/runtime/scripts/amalgm-mcp/observer/index.js +1146 -0
- package/runtime/scripts/amalgm-mcp/observer/scan.js +387 -0
- package/runtime/scripts/amalgm-mcp/observer/store.js +262 -0
- package/runtime/scripts/amalgm-mcp/observer/verify.js +200 -0
- package/runtime/scripts/amalgm-mcp/observer/watch.js +62 -0
- package/runtime/scripts/amalgm-mcp/project-context/store.js +19 -87
- package/runtime/scripts/amalgm-mcp/registration/classify.js +33 -0
- package/runtime/scripts/amalgm-mcp/registration/entity-cloud.js +456 -0
- package/runtime/scripts/amalgm-mcp/registration/entity-content.js +345 -0
- package/runtime/scripts/amalgm-mcp/registration/index.js +752 -0
- package/runtime/scripts/amalgm-mcp/registration/refusal.js +42 -0
- package/runtime/scripts/amalgm-mcp/registration/repo-followers.js +127 -0
- package/runtime/scripts/amalgm-mcp/registration/repo-states.js +109 -0
- package/runtime/scripts/amalgm-mcp/registration/service.js +310 -0
- package/runtime/scripts/amalgm-mcp/registration/tree.js +178 -0
- package/runtime/scripts/amalgm-mcp/registry/evidence.js +826 -0
- package/runtime/scripts/amalgm-mcp/registry/index.js +666 -0
- package/runtime/scripts/amalgm-mcp/registry/store.js +290 -0
- package/runtime/scripts/amalgm-mcp/repocard/README.md +103 -0
- package/runtime/scripts/amalgm-mcp/repocard/apply.js +111 -0
- package/runtime/scripts/amalgm-mcp/repocard/capture-worker.js +94 -0
- package/runtime/scripts/amalgm-mcp/repocard/capture.js +149 -0
- package/runtime/scripts/amalgm-mcp/repocard/follow.js +310 -0
- package/runtime/scripts/amalgm-mcp/repocard/git.js +48 -0
- package/runtime/scripts/amalgm-mcp/repocard/index.js +48 -0
- package/runtime/scripts/amalgm-mcp/server/local-service-router.js +2 -0
- package/runtime/scripts/amalgm-mcp/server/routes/entities.js +287 -0
- package/runtime/scripts/amalgm-mcp/server/routes/state.js +0 -13
- package/runtime/scripts/amalgm-mcp/state/attachments.js +11 -45
- package/runtime/scripts/amalgm-mcp/state/db.js +46 -215
- package/runtime/scripts/amalgm-mcp/state/docs.js +301 -1101
- package/runtime/scripts/amalgm-mcp/state/mutation-contracts.js +0 -99
- package/runtime/scripts/amalgm-mcp/state/mutations.js +130 -507
- package/runtime/scripts/amalgm-mcp/state/promotions.js +1 -21
- package/runtime/scripts/amalgm-mcp/state/replicas.js +13 -134
- package/runtime/scripts/amalgm-mcp/state/shared-rest.js +3 -46
- package/runtime/scripts/amalgm-mcp/tests/adapters.test.js +379 -0
- package/runtime/scripts/amalgm-mcp/tests/browser-cookie-cloud.test.js +0 -193
- package/runtime/scripts/amalgm-mcp/tests/doorbell.matrix.life.test.js +449 -0
- package/runtime/scripts/amalgm-mcp/tests/doorbell.matrix.rig.js +107 -0
- package/runtime/scripts/amalgm-mcp/tests/doorbell.matrix.watch.test.js +213 -0
- package/runtime/scripts/amalgm-mcp/tests/entity-oracle/adapter.js +72 -0
- package/runtime/scripts/amalgm-mcp/tests/entity-oracle/assert.js +497 -0
- package/runtime/scripts/amalgm-mcp/tests/entity-oracle/bind.js +91 -0
- package/runtime/scripts/amalgm-mcp/tests/entity-oracle/graph.js +1031 -0
- package/runtime/scripts/amalgm-mcp/tests/entity-oracle/ledger.js +234 -0
- package/runtime/scripts/amalgm-mcp/tests/entity-oracle/referee.js +118 -0
- package/runtime/scripts/amalgm-mcp/tests/entity.oracle.test.js +1365 -0
- package/runtime/scripts/amalgm-mcp/tests/entity.registry.test.js +967 -0
- package/runtime/scripts/amalgm-mcp/tests/entity.rig.js +239 -0
- package/runtime/scripts/amalgm-mcp/tests/entity.storm.test.js +486 -0
- package/runtime/scripts/amalgm-mcp/tests/fake-watch.js +35 -0
- package/runtime/scripts/amalgm-mcp/tests/observer.links.test.js +289 -0
- package/runtime/scripts/amalgm-mcp/tests/observer.rig.js +103 -0
- package/runtime/scripts/amalgm-mcp/tests/observer.roots.test.js +505 -0
- package/runtime/scripts/amalgm-mcp/tests/observer.storm.test.js +389 -0
- package/runtime/scripts/amalgm-mcp/tests/observer.territory.test.js +845 -0
- package/runtime/scripts/amalgm-mcp/tests/observer.test.js +657 -0
- package/runtime/scripts/amalgm-mcp/tests/project-context.test.js +17 -32
- package/runtime/scripts/amalgm-mcp/tests/registration.service.test.js +256 -0
- package/runtime/scripts/amalgm-mcp/tests/registration.test.js +931 -0
- package/runtime/scripts/amalgm-mcp/tests/repocard.storm.test.js +284 -0
- package/runtime/scripts/amalgm-mcp/tests/repocard.test.js +371 -0
- package/runtime/scripts/amalgm-mcp/tests/repofollow.storm.test.js +435 -0
- package/runtime/scripts/amalgm-mcp/tests/repofollow.test.js +675 -0
- package/runtime/scripts/amalgm-mcp/tests/shared-tunnel-rehydration.test.js +0 -84
- package/runtime/scripts/amalgm-mcp/tests/state-docs.test.js +13 -376
- package/runtime/scripts/amalgm-mcp/tests/state-mutations.test.js +0 -309
- package/runtime/scripts/amalgm-mcp/tests/state-shared-replica.test.js +30 -758
- package/runtime/scripts/amalgm-mcp/tests/workspace-cards-store.test.js +3 -72
- package/runtime/scripts/amalgm-mcp/tests/workspace-cards.test.js +1 -89
- package/runtime/scripts/amalgm-mcp/tests/workspace-checkpoint-reducer.test.js +24 -55
- package/runtime/scripts/amalgm-mcp/tests/workspace-checkpoint.test.js +141 -424
- package/runtime/scripts/amalgm-mcp/tests/workspace-object-tunnel.test.js +3 -171
- package/runtime/scripts/amalgm-mcp/tests/workspace-objects.test.js +7 -220
- package/runtime/scripts/amalgm-mcp/tests/workspace-publication-invariants.test.js +236 -179
- package/runtime/scripts/amalgm-mcp/tests/workspace-reducer.test.js +326 -2228
- package/runtime/scripts/amalgm-mcp/tests/workspace-tree-cloud.test.js +3 -5319
- package/runtime/scripts/amalgm-mcp/tests/workspace-tree-core.test.js +1 -191
- package/runtime/scripts/amalgm-mcp/tests/workspace-tree-store.test.js +17 -3140
- package/runtime/scripts/amalgm-mcp/tests/workspace-wall.test.js +740 -137
- package/runtime/scripts/amalgm-mcp/workspace/access-store.js +1 -5
- package/runtime/scripts/amalgm-mcp/workspace/card.js +11 -35
- package/runtime/scripts/amalgm-mcp/workspace/cards.js +14 -39
- package/runtime/scripts/amalgm-mcp/workspace/checkpoint.js +147 -587
- package/runtime/scripts/amalgm-mcp/workspace/git.js +34 -406
- package/runtime/scripts/amalgm-mcp/workspace/merge.js +181 -102
- package/runtime/scripts/amalgm-mcp/workspace/objects.js +56 -221
- package/runtime/scripts/amalgm-mcp/workspace/reducer.js +538 -1964
- package/runtime/scripts/amalgm-mcp/workspace/rest.js +28 -49
- package/runtime/scripts/amalgm-mcp/workspace/store.js +4 -77
- package/runtime/scripts/amalgm-mcp/workspace/transition.js +192 -1734
- package/runtime/scripts/amalgm-mcp/workspace/tree/inclusion.js +1 -7
- package/runtime/scripts/amalgm-mcp/workspace/tree/local-state.js +61 -73
- package/runtime/scripts/amalgm-mcp/workspace/tree/reducer.js +6 -51
- package/runtime/scripts/amalgm-mcp/workspace/tree/snapshot.js +8 -79
- package/runtime/scripts/amalgm-mcp/workspace/tree-cloud.js +146 -3461
- package/runtime/scripts/amalgm-mcp/workspace/tree-store.js +71 -899
- package/runtime/scripts/amalgm-mcp/workspace/wall.js +538 -370
- package/runtime/scripts/local-gateway.js +1 -0
- package/runtime/scripts/amalgm-mcp/state/doc-disk.js +0 -550
- package/runtime/scripts/amalgm-mcp/tests/code-project-stream.test.js +0 -399
- package/runtime/scripts/amalgm-mcp/tests/fixtures/code-project-stream-v2.json +0 -1
- package/runtime/scripts/amalgm-mcp/tests/workspace-durable.test.js +0 -24
- package/runtime/scripts/amalgm-mcp/tests/workspace-local-intent.test.js +0 -1999
- package/runtime/scripts/amalgm-mcp/tests/workspace-native-file-transaction.test.js +0 -364
- package/runtime/scripts/amalgm-mcp/tests/workspace-provenance.test.js +0 -185
- package/runtime/scripts/amalgm-mcp/tests/workspace-reducer-liveness.test.js +0 -26
- package/runtime/scripts/amalgm-mcp/tests/workspace-sync-stats.test.js +0 -119
- package/runtime/scripts/amalgm-mcp/tests/workspace-transition.test.js +0 -1446
- package/runtime/scripts/amalgm-mcp/workspace/content.js +0 -32
- package/runtime/scripts/amalgm-mcp/workspace/durable.js +0 -45
- package/runtime/scripts/amalgm-mcp/workspace/intent.js +0 -535
- package/runtime/scripts/amalgm-mcp/workspace/native-file-transaction/BUILD.md +0 -31
- package/runtime/scripts/amalgm-mcp/workspace/native-file-transaction/bin/darwin-arm64/amalgm-file-transaction +0 -0
- package/runtime/scripts/amalgm-mcp/workspace/native-file-transaction/bin/linux-x64/amalgm-file-transaction +0 -0
- package/runtime/scripts/amalgm-mcp/workspace/native-file-transaction/build.mjs +0 -72
- package/runtime/scripts/amalgm-mcp/workspace/native-file-transaction/client.js +0 -165
- package/runtime/scripts/amalgm-mcp/workspace/native-file-transaction/go.mod +0 -5
- package/runtime/scripts/amalgm-mcp/workspace/native-file-transaction/go.sum +0 -2
- package/runtime/scripts/amalgm-mcp/workspace/native-file-transaction/main.go +0 -2201
- package/runtime/scripts/amalgm-mcp/workspace/native-file-transaction/manifest.json +0 -19
- package/runtime/scripts/amalgm-mcp/workspace/native-file-transaction/move_darwin.go +0 -18
- package/runtime/scripts/amalgm-mcp/workspace/native-file-transaction/move_linux.go +0 -18
- package/runtime/scripts/amalgm-mcp/workspace/native-file-transaction/process_darwin.go +0 -33
- package/runtime/scripts/amalgm-mcp/workspace/native-file-transaction/process_linux.go +0 -47
- package/runtime/scripts/amalgm-mcp/workspace/native-file-transaction/verify.mjs +0 -43
- package/runtime/scripts/amalgm-mcp/workspace/native-file-transaction/writers_darwin.go +0 -114
- package/runtime/scripts/amalgm-mcp/workspace/native-file-transaction/writers_linux.go +0 -84
- package/runtime/scripts/amalgm-mcp/workspace/project-stream.js +0 -771
- package/runtime/scripts/amalgm-mcp/workspace/provenance.js +0 -240
- package/runtime/scripts/amalgm-mcp/workspace/sync-stats.js +0 -240
- package/runtime/scripts/amalgm-mcp/workspace/tree/floor.js +0 -100
- package/runtime/scripts/amalgm-mcp/workspace/tree/observation-holds.js +0 -127
- package/runtime/scripts/amalgm-mcp/workspace/tree/path-state.js +0 -12
- package/runtime/scripts/amalgm-mcp/workspace/tree/root-binding.js +0 -125
- package/runtime/scripts/amalgm-mcp/workspace/tree/symlinks.js +0 -76
- package/runtime/scripts/amalgm-mcp/workspace/tree-materialization.js +0 -3766
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Enrollment follows symlink edges (ratified 2026-08-01): adding a
|
|
5
|
+
* workspace authorizes every reachable real target. The observer itself
|
|
6
|
+
* NEVER follows a pointer — walks record edges and stop — so this
|
|
7
|
+
* operation is where the ratified policy acts: it reads every enrolled
|
|
8
|
+
* root's edges (`observer.linkEdges` — files ground from detected truth,
|
|
9
|
+
* repo ground from a fresh worktree census, a single-ground pointer root
|
|
10
|
+
* from its own one edge), resolves each to real ground, and enrolls what
|
|
11
|
+
* is not yet covered. Every reachable real entity ends up registered
|
|
12
|
+
* exactly once: enrollment is idempotent by real path, so shared targets
|
|
13
|
+
* deduplicate and cycles terminate on their own.
|
|
14
|
+
*
|
|
15
|
+
* What gets enrolled is EXACTLY the target the link names — never more
|
|
16
|
+
* (amended 2026-08-01, replacing the vetoed snap-to-enclosing-repo
|
|
17
|
+
* default): a link authorizes the ground it points at, not an enclosing
|
|
18
|
+
* boundary the user never named. A directory target that is itself a
|
|
19
|
+
* repository root enrolls as the repo; a plain directory enrolls as
|
|
20
|
+
* files ground; a file enrolls as a single-ground root — never its
|
|
21
|
+
* parent, which would share siblings the edge never named. A target
|
|
22
|
+
* already inside enrolled ground reuses that owner and enrolls nothing.
|
|
23
|
+
*
|
|
24
|
+
* The rules, in the order they decide:
|
|
25
|
+
* - a broken pointer enrolls nothing — there is no target to enroll
|
|
26
|
+
* until it becomes available;
|
|
27
|
+
* - ground already inside enrolled ground is already watched;
|
|
28
|
+
* - ground amalgm's enrollment policy excludes is refused and reported:
|
|
29
|
+
* EVERY route that expands coverage asks the same policy about the
|
|
30
|
+
* COMPLETE candidate path — a benign name inside excluded ground is
|
|
31
|
+
* still excluded — and following an edge is never a way around it
|
|
32
|
+
* (an explicit override is a future deliberate operation, never a
|
|
33
|
+
* default);
|
|
34
|
+
* - ground that CONTAINS enrolled ground is refused and reported:
|
|
35
|
+
* every path has exactly one owner, and overlapping roots would give
|
|
36
|
+
* it two — swallowing an enrolled root is a bigger act than following
|
|
37
|
+
* an edge;
|
|
38
|
+
* - anything else enrolls — repo, files, or single ground as disk
|
|
39
|
+
* decides — and its own edges are followed in turn (the loop runs to
|
|
40
|
+
* a fixpoint).
|
|
41
|
+
*
|
|
42
|
+
* Following adds, only: a retargeted link enrolls its new target and the
|
|
43
|
+
* old one stays enrolled — removing coverage is an explicit act, never a
|
|
44
|
+
* side effect of detection.
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
const fs = require('fs');
|
|
48
|
+
const path = require('path');
|
|
49
|
+
|
|
50
|
+
/** The directory an edge's relative target resolves against: the link's
|
|
51
|
+
* own parent. A single-ground pointer root records its edge at relPath
|
|
52
|
+
* '', so its base is the root path's parent, not the root path itself. */
|
|
53
|
+
function edgeBase(root, relPath) {
|
|
54
|
+
if (root.kind === 'file') return path.dirname(root.path);
|
|
55
|
+
return path.resolve(root.path, path.dirname(relPath));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function followEdges(observer) {
|
|
59
|
+
const enrolled = [];
|
|
60
|
+
const reported = [];
|
|
61
|
+
const seen = new Set(); // real grounds judged this call, whatever the verdict
|
|
62
|
+
let settled = true; // every edge surface answered completely
|
|
63
|
+
let grew = true;
|
|
64
|
+
while (grew) {
|
|
65
|
+
grew = false;
|
|
66
|
+
for (const root of observer.listRoots()) {
|
|
67
|
+
const surface = observer.linkEdges(root.rootId);
|
|
68
|
+
// Unreadable ground may hide an edge: what WAS readable still
|
|
69
|
+
// enrolls (adding is idempotent), but the pass never claims
|
|
70
|
+
// completeness — the boundary stays dirty and the retry decides.
|
|
71
|
+
if (surface.unsettled.length > 0) settled = false;
|
|
72
|
+
for (const link of surface.edges) {
|
|
73
|
+
const abs = path.resolve(edgeBase(root, link.relPath), link.target);
|
|
74
|
+
let real;
|
|
75
|
+
try {
|
|
76
|
+
real = fs.realpathSync(abs);
|
|
77
|
+
} catch {
|
|
78
|
+
continue; // broken: no target to enroll until it becomes available
|
|
79
|
+
}
|
|
80
|
+
if (seen.has(real)) continue;
|
|
81
|
+
seen.add(real);
|
|
82
|
+
const roots = observer.listRoots();
|
|
83
|
+
if (roots.some((other) => real === other.path || real.startsWith(`${other.path}/`))) {
|
|
84
|
+
continue; // already enrolled ground, already watched
|
|
85
|
+
}
|
|
86
|
+
// The policy judges the COMPLETE candidate path: it excludes by
|
|
87
|
+
// path segment (.ssh, node_modules, ...), so a benign final name
|
|
88
|
+
// inside excluded ground is still refused.
|
|
89
|
+
if (!observer.shouldEnroll(real)) {
|
|
90
|
+
reported.push({ path: real, via: link.relPath, reason: 'excluded by amalgm\'s enrollment policy — an edge is never a way around it; an explicit override is a future deliberate operation' });
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (roots.some((other) => other.path.startsWith(`${real}/`))) {
|
|
94
|
+
reported.push({ path: real, via: link.relPath, reason: 'target ground contains enrolled ground — one owner per path, so enrolling it would overlap' });
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
// An enrollment failure is never silence: it propagates, the
|
|
98
|
+
// boundary above stays dirty, and the retry decides — a target
|
|
99
|
+
// that vanished between judgment and enrollment is simply broken
|
|
100
|
+
// ground on the next pass, while a real identity failure stays
|
|
101
|
+
// loud instead of masquerading as a clean registration.
|
|
102
|
+
observer.enrollRoot(real);
|
|
103
|
+
enrolled.push(real);
|
|
104
|
+
grew = true; // the new ground's own edges get their turn
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return { enrolled, reported, settled };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
module.exports = { followEdges };
|