@younndai/lyt-mesh 0.9.0

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 (96) hide show
  1. package/LICENSE +200 -0
  2. package/NOTICE +23 -0
  3. package/README.md +135 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +34 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/clone-all.d.ts +3 -0
  9. package/dist/commands/clone-all.d.ts.map +1 -0
  10. package/dist/commands/clone-all.js +66 -0
  11. package/dist/commands/clone-all.js.map +1 -0
  12. package/dist/commands/mesh-init.d.ts +3 -0
  13. package/dist/commands/mesh-init.d.ts.map +1 -0
  14. package/dist/commands/mesh-init.js +70 -0
  15. package/dist/commands/mesh-init.js.map +1 -0
  16. package/dist/commands/pod-status.d.ts +3 -0
  17. package/dist/commands/pod-status.d.ts.map +1 -0
  18. package/dist/commands/pod-status.js +67 -0
  19. package/dist/commands/pod-status.js.map +1 -0
  20. package/dist/commands/source.d.ts +3 -0
  21. package/dist/commands/source.d.ts.map +1 -0
  22. package/dist/commands/source.js +83 -0
  23. package/dist/commands/source.js.map +1 -0
  24. package/dist/commands/status.d.ts +4 -0
  25. package/dist/commands/status.d.ts.map +1 -0
  26. package/dist/commands/status.js +121 -0
  27. package/dist/commands/status.js.map +1 -0
  28. package/dist/commands/sync.d.ts +3 -0
  29. package/dist/commands/sync.d.ts.map +1 -0
  30. package/dist/commands/sync.js +234 -0
  31. package/dist/commands/sync.js.map +1 -0
  32. package/dist/commands/validate.d.ts +3 -0
  33. package/dist/commands/validate.d.ts.map +1 -0
  34. package/dist/commands/validate.js +66 -0
  35. package/dist/commands/validate.js.map +1 -0
  36. package/dist/discovery/github.d.ts +19 -0
  37. package/dist/discovery/github.d.ts.map +1 -0
  38. package/dist/discovery/github.js +90 -0
  39. package/dist/discovery/github.js.map +1 -0
  40. package/dist/discovery/walk.d.ts +28 -0
  41. package/dist/discovery/walk.d.ts.map +1 -0
  42. package/dist/discovery/walk.js +78 -0
  43. package/dist/discovery/walk.js.map +1 -0
  44. package/dist/flows/clone-all.d.ts +53 -0
  45. package/dist/flows/clone-all.d.ts.map +1 -0
  46. package/dist/flows/clone-all.js +123 -0
  47. package/dist/flows/clone-all.js.map +1 -0
  48. package/dist/flows/mesh-init-validate.d.ts +22 -0
  49. package/dist/flows/mesh-init-validate.d.ts.map +1 -0
  50. package/dist/flows/mesh-init-validate.js +195 -0
  51. package/dist/flows/mesh-init-validate.js.map +1 -0
  52. package/dist/flows/mesh-init.d.ts +46 -0
  53. package/dist/flows/mesh-init.d.ts.map +1 -0
  54. package/dist/flows/mesh-init.js +302 -0
  55. package/dist/flows/mesh-init.js.map +1 -0
  56. package/dist/flows/pod-status.d.ts +37 -0
  57. package/dist/flows/pod-status.d.ts.map +1 -0
  58. package/dist/flows/pod-status.js +269 -0
  59. package/dist/flows/pod-status.js.map +1 -0
  60. package/dist/flows/status.d.ts +16 -0
  61. package/dist/flows/status.d.ts.map +1 -0
  62. package/dist/flows/status.js +76 -0
  63. package/dist/flows/status.js.map +1 -0
  64. package/dist/flows/sync-check.d.ts +38 -0
  65. package/dist/flows/sync-check.d.ts.map +1 -0
  66. package/dist/flows/sync-check.js +180 -0
  67. package/dist/flows/sync-check.js.map +1 -0
  68. package/dist/flows/sync-watch.d.ts +24 -0
  69. package/dist/flows/sync-watch.d.ts.map +1 -0
  70. package/dist/flows/sync-watch.js +217 -0
  71. package/dist/flows/sync-watch.js.map +1 -0
  72. package/dist/flows/sync.d.ts +45 -0
  73. package/dist/flows/sync.d.ts.map +1 -0
  74. package/dist/flows/sync.js +513 -0
  75. package/dist/flows/sync.js.map +1 -0
  76. package/dist/flows/validate.d.ts +22 -0
  77. package/dist/flows/validate.d.ts.map +1 -0
  78. package/dist/flows/validate.js +62 -0
  79. package/dist/flows/validate.js.map +1 -0
  80. package/dist/index.d.ts +35 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +39 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/mesh-command.d.ts +3 -0
  85. package/dist/mesh-command.d.ts.map +1 -0
  86. package/dist/mesh-command.js +31 -0
  87. package/dist/mesh-command.js.map +1 -0
  88. package/dist/source/repo.d.ts +14 -0
  89. package/dist/source/repo.d.ts.map +1 -0
  90. package/dist/source/repo.js +71 -0
  91. package/dist/source/repo.js.map +1 -0
  92. package/dist/source/types.d.ts +22 -0
  93. package/dist/source/types.d.ts.map +1 -0
  94. package/dist/source/types.js +49 -0
  95. package/dist/source/types.js.map +1 -0
  96. package/package.json +77 -0
@@ -0,0 +1,269 @@
1
+ /*
2
+ * Copyright 2026 MARLINK TRADING SRL (YounndAI)
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { existsSync, readdirSync, statSync } from "node:fs";
17
+ import { join } from "node:path";
18
+ import { closeRegistry, getDefaultVaultsRoot, getFederationRepoDir, isProvisionalIdentity, listFederationStates, listVaults, openRegistry, readIdentityCache, readPodIdentity, runGit as defaultRunGit, } from "@younndai/lyt-vault";
19
+ async function probeGitDrift(path, runGit, noFetch) {
20
+ const gitDir = await runGit(["rev-parse", "--git-dir"], { cwd: path, allowFailure: true });
21
+ if (gitDir.code !== 0) {
22
+ return { isRepo: false, hasRemote: false, hasUpstream: false, ahead: 0, dirty: 0 };
23
+ }
24
+ const origin = await runGit(["remote", "get-url", "origin"], { cwd: path, allowFailure: true });
25
+ const hasRemote = origin.code === 0;
26
+ const upstream = await runGit(["rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"], {
27
+ cwd: path,
28
+ allowFailure: true,
29
+ });
30
+ const hasUpstream = upstream.code === 0;
31
+ if (hasUpstream && !noFetch) {
32
+ await runGit(["fetch", "--quiet"], { cwd: path, allowFailure: true });
33
+ }
34
+ let ahead = 0;
35
+ if (hasUpstream) {
36
+ const ab = await runGit(["rev-list", "--left-right", "--count", "HEAD...@{u}"], {
37
+ cwd: path,
38
+ allowFailure: true,
39
+ });
40
+ if (ab.code === 0)
41
+ ahead = Number(ab.stdout.trim().split(/\s+/)[0]) || 0;
42
+ }
43
+ else {
44
+ // No upstream — count local commits (everything is "ahead" of nothing).
45
+ const count = await runGit(["rev-list", "--count", "HEAD"], { cwd: path, allowFailure: true });
46
+ if (count.code === 0)
47
+ ahead = Number(count.stdout.trim()) || 0;
48
+ }
49
+ const status = await runGit(["status", "--porcelain"], { cwd: path, allowFailure: true });
50
+ const dirty = status.code === 0 ? status.stdout.split(/\r?\n/).filter((l) => l.trim().length > 0).length : 0;
51
+ return { isRepo: true, hasRemote, hasUpstream, ahead, dirty };
52
+ }
53
+ // Best-effort stale-index probe: a clean+pushed vault whose newest note is more
54
+ // recent than its on-disk index db. Cheap mtime compare; if the index db isn't
55
+ // found, returns false (NOT stale) — we never fabricate a stale signal.
56
+ function isIndexStale(vaultPath) {
57
+ const dbCandidates = [join(vaultPath, ".lyt", "lyt.db"), join(vaultPath, ".lyt", "indexes")];
58
+ let dbMtime = 0;
59
+ for (const c of dbCandidates) {
60
+ if (existsSync(c)) {
61
+ try {
62
+ dbMtime = Math.max(dbMtime, statSync(c).mtimeMs);
63
+ }
64
+ catch {
65
+ /* ignore */
66
+ }
67
+ }
68
+ }
69
+ if (dbMtime === 0)
70
+ return false; // no index db located → cannot assert stale
71
+ const notesDir = join(vaultPath, "notes");
72
+ if (!existsSync(notesDir))
73
+ return false;
74
+ let newestNote = 0;
75
+ try {
76
+ for (const f of readdirSync(notesDir)) {
77
+ if (!f.endsWith(".md"))
78
+ continue;
79
+ newestNote = Math.max(newestNote, statSync(join(notesDir, f)).mtimeMs);
80
+ }
81
+ }
82
+ catch {
83
+ return false;
84
+ }
85
+ return newestNote > dbMtime;
86
+ }
87
+ function classifyVault(drift, vaultPath) {
88
+ if (!drift.isRepo)
89
+ return { status: "not-git-repo", detail: "no .git — run `lyt sync` to initialize + publish" };
90
+ if (!drift.hasRemote)
91
+ return {
92
+ status: "no-remote",
93
+ detail: "no remote configured — run `lyt sync` to create + publish",
94
+ };
95
+ if (drift.dirty > 0 || drift.ahead > 0) {
96
+ const parts = [];
97
+ if (drift.dirty > 0)
98
+ parts.push(`${drift.dirty} uncommitted`);
99
+ if (drift.ahead > 0)
100
+ parts.push(`${drift.ahead} unpushed commit(s)`);
101
+ return { status: "unpushed", detail: parts.join(", ") };
102
+ }
103
+ if (isIndexStale(vaultPath)) {
104
+ return { status: "stale-index", detail: "search index behind content — run `lyt sync`" };
105
+ }
106
+ return { status: "clean", detail: "published + up to date" };
107
+ }
108
+ export async function podStatusFlow(args = {}) {
109
+ const runGit = args.runGit ?? defaultRunGit;
110
+ const noFetch = args.noFetch === true;
111
+ const db = await openRegistry();
112
+ let vaults;
113
+ let handle;
114
+ try {
115
+ vaults = (await listVaults(db)).filter((v) => v.status !== "tombstoned");
116
+ const states = await listFederationStates(db);
117
+ handle = states.length === 1 ? states[0].handle : null;
118
+ }
119
+ finally {
120
+ await closeRegistry(db);
121
+ }
122
+ const vaultReports = [];
123
+ const registeredPaths = new Set();
124
+ for (const v of vaults) {
125
+ registeredPaths.add(v.path);
126
+ if (!existsSync(v.path)) {
127
+ vaultReports.push({
128
+ name: v.name,
129
+ path: v.path,
130
+ status: "missing",
131
+ ahead: 0,
132
+ dirtyCount: 0,
133
+ hasRemote: false,
134
+ detail: "registered path not found on disk",
135
+ });
136
+ continue;
137
+ }
138
+ const drift = await probeGitDrift(v.path, runGit, noFetch);
139
+ const { status, detail } = classifyVault(drift, v.path);
140
+ vaultReports.push({
141
+ name: v.name,
142
+ path: v.path,
143
+ status,
144
+ ahead: drift.ahead,
145
+ dirtyCount: drift.dirty,
146
+ hasRemote: drift.hasRemote,
147
+ detail,
148
+ });
149
+ }
150
+ // Pod drift.
151
+ let pod;
152
+ if (handle === null) {
153
+ pod = {
154
+ handle: null,
155
+ status: "no-pod",
156
+ ahead: 0,
157
+ dirtyCount: 0,
158
+ detail: "no pod forged yet — run `lyt init`",
159
+ };
160
+ }
161
+ else {
162
+ const podDir = getFederationRepoDir(handle);
163
+ if (!existsSync(podDir)) {
164
+ pod = { handle, status: "no-pod", ahead: 0, dirtyCount: 0, detail: "pod dir missing" };
165
+ }
166
+ else {
167
+ const d = await probeGitDrift(podDir, runGit, noFetch);
168
+ // D34 (OD-LOCALFIRST) — a PROVISIONAL identity means the pod is local-only
169
+ // (never connected). This takes precedence over the remote/drift checks:
170
+ // a local pod has no remote BY DESIGN, so report it honestly as "not
171
+ // connected" rather than the generic "no-remote".
172
+ const podIdentity = readPodIdentity(podDir) ?? readIdentityCache();
173
+ const localOnly = podIdentity !== null && isProvisionalIdentity(podIdentity);
174
+ if (localOnly) {
175
+ pod = {
176
+ handle,
177
+ status: "local-only",
178
+ ahead: d.ahead,
179
+ dirtyCount: d.dirty,
180
+ detail: "local-only (not connected to GitHub) — run `lyt sync` to connect + back up",
181
+ };
182
+ }
183
+ else if (!d.isRepo || !d.hasRemote) {
184
+ pod = {
185
+ handle,
186
+ status: "no-remote",
187
+ ahead: d.ahead,
188
+ dirtyCount: d.dirty,
189
+ detail: "pod has no remote — run `lyt sync`",
190
+ };
191
+ }
192
+ else if (d.ahead > 0 || d.dirty > 0) {
193
+ pod = {
194
+ handle,
195
+ status: "unpushed",
196
+ ahead: d.ahead,
197
+ dirtyCount: d.dirty,
198
+ detail: "pod.yon not yet pushed — run `lyt sync`",
199
+ };
200
+ }
201
+ else {
202
+ pod = {
203
+ handle,
204
+ status: "clean",
205
+ ahead: 0,
206
+ dirtyCount: 0,
207
+ detail: "published + up to date",
208
+ };
209
+ }
210
+ }
211
+ }
212
+ const unregistered = scanUnregistered(registeredPaths);
213
+ const needsPublish = vaultReports.filter((r) => r.status === "unpushed" || r.status === "no-remote" || r.status === "not-git-repo").length;
214
+ const clean = vaultReports.filter((r) => r.status === "clean").length;
215
+ const podClean = pod.status === "clean" || pod.status === "no-pod";
216
+ return {
217
+ pod,
218
+ vaults: vaultReports,
219
+ unregistered,
220
+ summary: { clean, needsPublish, total: vaultReports.length },
221
+ ok: podClean && needsPublish === 0 && vaultReports.every((r) => r.status !== "missing"),
222
+ };
223
+ }
224
+ // Bounded scan (depth 2: <root>/<mesh>/<vault>) for vault dirs carrying
225
+ // `.lyt/vault.yon` that the registry doesn't know about. lyt-pod-map (the
226
+ // generated pod-map vault) is excluded — it isn't a registered home vault.
227
+ function scanUnregistered(registeredPaths) {
228
+ const root = getDefaultVaultsRoot();
229
+ if (!existsSync(root))
230
+ return [];
231
+ const out = [];
232
+ const hasVaultYon = (dir) => existsSync(join(dir, ".lyt", "vault.yon"));
233
+ let level1;
234
+ try {
235
+ level1 = readdirSync(root, { withFileTypes: true })
236
+ .filter((e) => e.isDirectory())
237
+ .map((e) => e.name);
238
+ }
239
+ catch {
240
+ return [];
241
+ }
242
+ for (const name of level1) {
243
+ if (name === "lyt-pod-map")
244
+ continue;
245
+ const dir = join(root, name);
246
+ if (hasVaultYon(dir) && !registeredPaths.has(dir)) {
247
+ out.push(dir);
248
+ continue;
249
+ }
250
+ // Depth 2: <root>/<mesh>/<vault>.
251
+ let children;
252
+ try {
253
+ children = readdirSync(dir, { withFileTypes: true })
254
+ .filter((e) => e.isDirectory())
255
+ .map((e) => e.name);
256
+ }
257
+ catch {
258
+ continue;
259
+ }
260
+ for (const child of children) {
261
+ const childDir = join(dir, child);
262
+ if (hasVaultYon(childDir) && !registeredPaths.has(childDir)) {
263
+ out.push(childDir);
264
+ }
265
+ }
266
+ }
267
+ return out;
268
+ }
269
+ //# sourceMappingURL=pod-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pod-status.js","sourceRoot":"","sources":["../../src/flows/pod-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type VaultRow } from "@younndai/lyt-vault";
2
+ import type { Client } from "@libsql/client";
3
+ export interface StatusCluster {
4
+ rootRid: string;
5
+ members: string[];
6
+ }
7
+ export interface StatusOutcome {
8
+ vaults: VaultRow[];
9
+ roots: string[];
10
+ clusters: StatusCluster[];
11
+ }
12
+ export interface StatusOptions {
13
+ db?: Client;
14
+ }
15
+ export declare function statusFlow(opts?: StatusOptions): Promise<StatusOutcome>;
16
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/flows/status.ts"],"names":[],"mappings":"AAgBA,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAS7C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,UAAU,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CA4BjF"}
@@ -0,0 +1,76 @@
1
+ /*
2
+ * Copyright 2026 MARLINK TRADING SRL (YounndAI)
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { closeRegistry, listVaults, openRegistry, ridsEqual, } from "@younndai/lyt-vault";
17
+ export async function statusFlow(opts = {}) {
18
+ const db = opts.db ?? (await openRegistry());
19
+ const ownDb = opts.db === undefined;
20
+ try {
21
+ const vaults = await listVaults(db);
22
+ // Children lookup: bytes-equal parent_vault → child membership.
23
+ const ridHexes = new Set(vaults.map((v) => v.ridHex));
24
+ const roots = [];
25
+ for (const v of vaults) {
26
+ const parentHex = v.parentVaultHex;
27
+ if (parentHex === null || !ridHexes.has(parentHex)) {
28
+ roots.push(v.ridHex);
29
+ }
30
+ }
31
+ const clusters = [];
32
+ for (const rootHex of roots) {
33
+ const members = collectSubtree(rootHex, vaults);
34
+ clusters.push({ rootRid: rootHex, members });
35
+ }
36
+ return { vaults, roots, clusters };
37
+ }
38
+ finally {
39
+ if (ownDb) {
40
+ await closeRegistry(db);
41
+ }
42
+ }
43
+ }
44
+ function collectSubtree(rootHex, vaults) {
45
+ const byRidHex = new Map(vaults.map((v) => [v.ridHex, v]));
46
+ const childrenOf = new Map();
47
+ for (const v of vaults) {
48
+ if (!v.parentVault)
49
+ continue;
50
+ const parent = vaults.find((p) => ridsEqual(p.rid, v.parentVault));
51
+ if (!parent)
52
+ continue;
53
+ const arr = childrenOf.get(parent.ridHex);
54
+ if (arr)
55
+ arr.push(v.ridHex);
56
+ else
57
+ childrenOf.set(parent.ridHex, [v.ridHex]);
58
+ }
59
+ const visited = new Set();
60
+ const out = [];
61
+ const stack = [rootHex];
62
+ while (stack.length > 0) {
63
+ const r = stack.pop();
64
+ if (visited.has(r))
65
+ continue;
66
+ if (!byRidHex.has(r))
67
+ continue;
68
+ visited.add(r);
69
+ out.push(r);
70
+ const kids = childrenOf.get(r) ?? [];
71
+ for (const k of kids)
72
+ stack.push(k);
73
+ }
74
+ return out;
75
+ }
76
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/flows/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type GitRunOptions, type GitRunResult } from "@younndai/lyt-vault";
2
+ export type GitRunner = (args: readonly string[], opts: GitRunOptions) => Promise<GitRunResult>;
3
+ export interface SyncCheckArgs {
4
+ vaultNames?: readonly string[];
5
+ runGit?: GitRunner;
6
+ now?: Date;
7
+ noFetch?: boolean;
8
+ }
9
+ export interface VaultCheckReport {
10
+ rid: string;
11
+ name: string;
12
+ path: string;
13
+ status: string;
14
+ ahead: number;
15
+ behind: number;
16
+ dirtyCount: number;
17
+ hasUpstream: boolean;
18
+ frozen: boolean;
19
+ frozenUntil: string | null;
20
+ remaining: string | null;
21
+ vaultStatus: string;
22
+ }
23
+ export interface SyncCheckResult {
24
+ reports: VaultCheckReport[];
25
+ summary: {
26
+ clean: number;
27
+ dirty: number;
28
+ ahead: number;
29
+ behind: number;
30
+ diverged: number;
31
+ frozen: number;
32
+ noUpstream: number;
33
+ skippedNonActive: number;
34
+ };
35
+ exitCode: number;
36
+ }
37
+ export declare function syncCheckFlow(args?: SyncCheckArgs): Promise<SyncCheckResult>;
38
+ //# sourceMappingURL=sync-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-check.d.ts","sourceRoot":"","sources":["../../src/flows/sync-check.ts"],"names":[],"mappings":"AAkBA,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,YAAY,EAElB,MAAM,qBAAqB,CAAC;AAI7B,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAEhG,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,GAAG,CAAC,EAAE,IAAI,CAAC;IAEX,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,aAAa,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CA8JtF"}
@@ -0,0 +1,180 @@
1
+ /*
2
+ * Copyright 2026 MARLINK TRADING SRL (YounndAI)
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { existsSync } from "node:fs";
17
+ import { closeRegistry, listVaults, openRegistry, readFrozenLock, runGit as defaultRunGit, } from "@younndai/lyt-vault";
18
+ import { classifyCheckStatus } from "./sync.js";
19
+ export async function syncCheckFlow(args = {}) {
20
+ const runGit = args.runGit ?? defaultRunGit;
21
+ const now = args.now ?? new Date();
22
+ const db = await openRegistry();
23
+ let candidates;
24
+ try {
25
+ const all = await listVaults(db);
26
+ candidates =
27
+ args.vaultNames && args.vaultNames.length > 0
28
+ ? all.filter((v) => args.vaultNames.includes(v.name))
29
+ : all;
30
+ }
31
+ finally {
32
+ await closeRegistry(db);
33
+ }
34
+ const reports = [];
35
+ for (const v of candidates) {
36
+ if (v.status !== "active") {
37
+ reports.push({
38
+ rid: v.ridHex,
39
+ name: v.name,
40
+ path: v.path,
41
+ status: v.status,
42
+ ahead: 0,
43
+ behind: 0,
44
+ dirtyCount: 0,
45
+ hasUpstream: false,
46
+ frozen: false,
47
+ frozenUntil: null,
48
+ remaining: null,
49
+ vaultStatus: v.status,
50
+ });
51
+ continue;
52
+ }
53
+ if (!existsSync(v.path)) {
54
+ reports.push({
55
+ rid: v.ridHex,
56
+ name: v.name,
57
+ path: v.path,
58
+ status: "missing",
59
+ ahead: 0,
60
+ behind: 0,
61
+ dirtyCount: 0,
62
+ hasUpstream: false,
63
+ frozen: false,
64
+ frozenUntil: null,
65
+ remaining: null,
66
+ vaultStatus: v.status,
67
+ });
68
+ continue;
69
+ }
70
+ const frozen = readFrozenLock(v.path, now);
71
+ const isFrozen = frozen.frozen && !frozen.expired;
72
+ const gitDir = await runGit(["rev-parse", "--git-dir"], { cwd: v.path, allowFailure: true });
73
+ if (gitDir.code !== 0) {
74
+ reports.push({
75
+ rid: v.ridHex,
76
+ name: v.name,
77
+ path: v.path,
78
+ status: "not-git-repo",
79
+ ahead: 0,
80
+ behind: 0,
81
+ dirtyCount: 0,
82
+ hasUpstream: false,
83
+ frozen: isFrozen,
84
+ frozenUntil: frozen.frozenUntil,
85
+ remaining: frozen.remaining,
86
+ vaultStatus: v.status,
87
+ });
88
+ continue;
89
+ }
90
+ const upstream = await runGit(["rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"], {
91
+ cwd: v.path,
92
+ allowFailure: true,
93
+ });
94
+ const hasUpstream = upstream.code === 0;
95
+ if (hasUpstream && args.noFetch !== true) {
96
+ await runGit(["fetch", "--quiet"], { cwd: v.path, allowFailure: true });
97
+ }
98
+ let ahead = 0;
99
+ let behind = 0;
100
+ if (hasUpstream) {
101
+ const ab = await runGit(["rev-list", "--left-right", "--count", "HEAD...@{u}"], {
102
+ cwd: v.path,
103
+ allowFailure: true,
104
+ });
105
+ if (ab.code === 0) {
106
+ const parts = ab.stdout.trim().split(/\s+/);
107
+ ahead = Number(parts[0]) || 0;
108
+ behind = Number(parts[1]) || 0;
109
+ }
110
+ }
111
+ const statusRes = await runGit(["status", "--porcelain"], {
112
+ cwd: v.path,
113
+ allowFailure: true,
114
+ });
115
+ const dirtyCount = statusRes.code === 0
116
+ ? statusRes.stdout
117
+ .split(/\r?\n/)
118
+ .map((l) => l.trim())
119
+ .filter((l) => l.length > 0).length
120
+ : 0;
121
+ reports.push({
122
+ rid: v.ridHex,
123
+ name: v.name,
124
+ path: v.path,
125
+ status: classifyCheckStatus({
126
+ ahead,
127
+ behind,
128
+ dirtyCount,
129
+ hasUpstream,
130
+ frozen: isFrozen,
131
+ }),
132
+ ahead,
133
+ behind,
134
+ dirtyCount,
135
+ hasUpstream,
136
+ frozen: isFrozen,
137
+ frozenUntil: frozen.frozenUntil,
138
+ remaining: frozen.remaining,
139
+ vaultStatus: v.status,
140
+ });
141
+ }
142
+ const summary = {
143
+ clean: 0,
144
+ dirty: 0,
145
+ ahead: 0,
146
+ behind: 0,
147
+ diverged: 0,
148
+ frozen: 0,
149
+ noUpstream: 0,
150
+ skippedNonActive: 0,
151
+ };
152
+ for (const r of reports) {
153
+ if (r.vaultStatus !== "active") {
154
+ summary.skippedNonActive += 1;
155
+ continue;
156
+ }
157
+ if (r.status === "clean")
158
+ summary.clean += 1;
159
+ else if (r.status === "dirty")
160
+ summary.dirty += 1;
161
+ else if (r.status.startsWith("ahead-"))
162
+ summary.ahead += 1;
163
+ else if (r.status.startsWith("behind-"))
164
+ summary.behind += 1;
165
+ else if (r.status === "diverged")
166
+ summary.diverged += 1;
167
+ else if (r.status === "frozen")
168
+ summary.frozen += 1;
169
+ else if (r.status === "no-upstream")
170
+ summary.noUpstream += 1;
171
+ }
172
+ const anyDirtyOrAheadOrBehind = summary.dirty > 0 || summary.ahead > 0 || summary.behind > 0 || summary.diverged > 0;
173
+ // Exit codes mirror `lyt doctor`: 0 all clean, 1 needs sync, 2 frozen-near-expiry (advisory).
174
+ let exitCode = 0;
175
+ if (anyDirtyOrAheadOrBehind)
176
+ exitCode = 1;
177
+ // Near-expiry detection happens in caller (we don't recompute it here to keep flow pure).
178
+ return { reports, summary, exitCode };
179
+ }
180
+ //# sourceMappingURL=sync-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-check.js","sourceRoot":"","sources":["../../src/flows/sync-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type FSWatcher } from "chokidar";
2
+ import { type ReconcileFigmentOp } from "@younndai/lyt-vault";
3
+ import { type VaultSyncReport } from "./sync.js";
4
+ export interface SyncWatchOptions {
5
+ commitDebounceMs?: number;
6
+ pushDebounceMs?: number;
7
+ resolveMeshContext?: boolean;
8
+ watcherFactory?: (paths: readonly string[], ignored: IgnoredMatcher) => FSWatcher;
9
+ onTick?: (report: VaultSyncReport) => void;
10
+ skipStartupBackfill?: boolean;
11
+ onReconcile?: (vaultName: string, op: ReconcileFigmentOp, relPath: string) => void;
12
+ signal?: AbortSignal;
13
+ }
14
+ export interface SyncWatchHandle {
15
+ stop: () => Promise<void>;
16
+ triggerChange: (vaultName: string) => void;
17
+ whenIdle: () => Promise<void>;
18
+ }
19
+ export declare const DEFAULT_COMMIT_DEBOUNCE_MS = 30000;
20
+ type IgnoredMatcher = (path: string) => boolean;
21
+ export declare const isIgnoredWatchPath: IgnoredMatcher;
22
+ export declare function syncWatchFlow(opts?: SyncWatchOptions): Promise<SyncWatchHandle>;
23
+ export {};
24
+ //# sourceMappingURL=sync-watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-watch.d.ts","sourceRoot":"","sources":["../../src/flows/sync-watch.ts"],"names":[],"mappings":"AAkBA,OAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAEpD,OAAO,EAOL,KAAK,kBAAkB,EAExB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAG7B,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,KAAK,SAAS,CAAC;IAClF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IAG3C,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAG9B,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAEnF,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAE9B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAI3C,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAYjD,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;AAIhD,eAAO,MAAM,kBAAkB,EAAE,cAAsD,CAAC;AAExF,wBAAsB,aAAa,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CA8LzF"}