@seat-mesh/core 0.1.26 → 0.1.27
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/chatfile/store.d.ts +1 -1
- package/dist/chatfile/store.d.ts.map +1 -1
- package/dist/chatfile/store.js +2 -2
- package/dist/chatfile/store.js.map +1 -1
- package/dist/chatroom/calls.d.ts +1 -1
- package/dist/chatroom/calls.d.ts.map +1 -1
- package/dist/chatroom/calls.js +1 -1
- package/dist/chatroom/calls.js.map +1 -1
- package/dist/chatroom/calls.test.js +1 -1
- package/dist/chatroom/calls.test.js.map +1 -1
- package/dist/chatroom/room.d.ts +1 -1
- package/dist/chatroom/room.d.ts.map +1 -1
- package/dist/chatroom/room.js +2 -2
- package/dist/chatroom/room.js.map +1 -1
- package/dist/chatroom/room.test.js +1 -1
- package/dist/chatroom/room.test.js.map +1 -1
- package/dist/chatroom/types.d.ts +2 -2
- package/dist/comms/envelope.d.ts +11 -11
- package/dist/contracts/balance.d.ts +1 -1
- package/dist/contracts/balance.d.ts.map +1 -1
- package/dist/contracts/supervise.d.ts +3 -3
- package/dist/contracts/supervise.d.ts.map +1 -1
- package/dist/contracts/supervise.js +1 -1
- package/dist/contracts/supervise.js.map +1 -1
- package/dist/index.d.ts +9 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/paths/engine-paths.d.ts +4 -0
- package/dist/paths/engine-paths.d.ts.map +1 -0
- package/dist/paths/engine-paths.js +45 -0
- package/dist/paths/engine-paths.js.map +1 -0
- package/dist/paths/paths-manifest.d.ts +34 -0
- package/dist/paths/paths-manifest.d.ts.map +1 -0
- package/dist/paths/paths-manifest.js +79 -0
- package/dist/paths/paths-manifest.js.map +1 -0
- package/dist/paths/paths-manifest.test.d.ts +2 -0
- package/dist/paths/paths-manifest.test.d.ts.map +1 -0
- package/dist/paths/paths-manifest.test.js +58 -0
- package/dist/paths/paths-manifest.test.js.map +1 -0
- package/dist/paths/paths.d.ts +5 -0
- package/dist/paths/paths.d.ts.map +1 -0
- package/dist/paths/paths.js +17 -0
- package/dist/paths/paths.js.map +1 -0
- package/dist/paths/runtime-paths.d.ts +43 -0
- package/dist/paths/runtime-paths.d.ts.map +1 -0
- package/dist/paths/runtime-paths.js +94 -0
- package/dist/paths/runtime-paths.js.map +1 -0
- package/dist/paths/runtime-paths.test.d.ts +2 -0
- package/dist/paths/runtime-paths.test.d.ts.map +1 -0
- package/dist/paths/runtime-paths.test.js +86 -0
- package/dist/paths/runtime-paths.test.js.map +1 -0
- package/dist/profile/profile-edit.d.ts +26 -0
- package/dist/profile/profile-edit.d.ts.map +1 -0
- package/dist/profile/profile-edit.js +87 -0
- package/dist/profile/profile-edit.js.map +1 -0
- package/dist/profile/profile-edit.test.d.ts +2 -0
- package/dist/profile/profile-edit.test.d.ts.map +1 -0
- package/dist/profile/profile-edit.test.js +111 -0
- package/dist/profile/profile-edit.test.js.map +1 -0
- package/dist/profile/profile.d.ts +52 -0
- package/dist/profile/profile.d.ts.map +1 -0
- package/dist/profile/profile.js +93 -0
- package/dist/profile/profile.js.map +1 -0
- package/dist/profile/profile.test.d.ts +2 -0
- package/dist/profile/profile.test.d.ts.map +1 -0
- package/dist/profile/profile.test.js +25 -0
- package/dist/profile/profile.test.js.map +1 -0
- package/dist/runtime/dotdir.d.ts +11 -0
- package/dist/runtime/dotdir.d.ts.map +1 -0
- package/dist/runtime/dotdir.js +30 -0
- package/dist/runtime/dotdir.js.map +1 -0
- package/dist/runtime/dotdir.test.d.ts +2 -0
- package/dist/runtime/dotdir.test.d.ts.map +1 -0
- package/dist/runtime/dotdir.test.js +26 -0
- package/dist/runtime/dotdir.test.js.map +1 -0
- package/dist/runtime/global-registry.d.ts +28 -0
- package/dist/runtime/global-registry.d.ts.map +1 -0
- package/dist/runtime/global-registry.js +124 -0
- package/dist/runtime/global-registry.js.map +1 -0
- package/dist/runtime/mesh-state-merge.d.ts +7 -0
- package/dist/runtime/mesh-state-merge.d.ts.map +1 -0
- package/dist/runtime/mesh-state-merge.js +48 -0
- package/dist/runtime/mesh-state-merge.js.map +1 -0
- package/dist/runtime/mesh-state-merge.test.d.ts +2 -0
- package/dist/runtime/mesh-state-merge.test.d.ts.map +1 -0
- package/dist/runtime/mesh-state-merge.test.js +36 -0
- package/dist/runtime/mesh-state-merge.test.js.map +1 -0
- package/dist/runtime/role-index.d.ts +53 -0
- package/dist/runtime/role-index.d.ts.map +1 -0
- package/dist/runtime/role-index.js +179 -0
- package/dist/runtime/role-index.js.map +1 -0
- package/dist/runtime/role-index.test.d.ts +2 -0
- package/dist/runtime/role-index.test.d.ts.map +1 -0
- package/dist/runtime/role-index.test.js +85 -0
- package/dist/runtime/role-index.test.js.map +1 -0
- package/dist/schema/agents.d.ts +75 -75
- package/dist/schema/profile.d.ts +2 -2
- package/dist/stack/exec.d.ts +1 -1
- package/dist/stack/exec.d.ts.map +1 -1
- package/dist/stack/stack.test.js +2 -2
- package/dist/stack/stack.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
5
|
+
import { loadProfile } from "./profile.js";
|
|
6
|
+
import { addBaseColumn, listBaseColumns, removeBaseColumn } from "./profile-edit.js";
|
|
7
|
+
const MINIMAL_CONFIG = `# fixture profile
|
|
8
|
+
name: fixture
|
|
9
|
+
workspace: ..
|
|
10
|
+
|
|
11
|
+
session:
|
|
12
|
+
name: dev
|
|
13
|
+
workerCount: 2
|
|
14
|
+
miniMax: 4
|
|
15
|
+
|
|
16
|
+
layout:
|
|
17
|
+
base:
|
|
18
|
+
window: base
|
|
19
|
+
columns: [manager, secretary]
|
|
20
|
+
cli:
|
|
21
|
+
manager: claude
|
|
22
|
+
secretaryWidthPct: 40
|
|
23
|
+
|
|
24
|
+
seats:
|
|
25
|
+
root: seats
|
|
26
|
+
templates: [FOCUS, TASKS, REMINDER]
|
|
27
|
+
|
|
28
|
+
state:
|
|
29
|
+
agentsJson: tmux-main-agents.json
|
|
30
|
+
|
|
31
|
+
daemon:
|
|
32
|
+
port: 31699
|
|
33
|
+
portScope: profile
|
|
34
|
+
managerPromptPrefix: "[agent-manager]"
|
|
35
|
+
|
|
36
|
+
ports:
|
|
37
|
+
worker: "30{n}0/30{n}1"
|
|
38
|
+
|
|
39
|
+
roles:
|
|
40
|
+
dir: roles
|
|
41
|
+
`;
|
|
42
|
+
describe("profile-edit: base columns", () => {
|
|
43
|
+
let tmp = "";
|
|
44
|
+
let profileDir = "";
|
|
45
|
+
beforeEach(() => {
|
|
46
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), "sm-profile-edit-"));
|
|
47
|
+
profileDir = path.join(tmp, ".sm");
|
|
48
|
+
fs.mkdirSync(profileDir, { recursive: true });
|
|
49
|
+
fs.writeFileSync(path.join(profileDir, "mesh.config.yaml"), MINIMAL_CONFIG);
|
|
50
|
+
});
|
|
51
|
+
afterEach(() => {
|
|
52
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
53
|
+
});
|
|
54
|
+
it("adds an Nth manager column with no role yaml or seats.dirs entry required", () => {
|
|
55
|
+
const loaded = loadProfile(profileDir);
|
|
56
|
+
const result = addBaseColumn(loaded, "manager-2", { cli: "claude" });
|
|
57
|
+
expect(result.columns).toEqual(["manager", "secretary", "manager-2"]);
|
|
58
|
+
const reloaded = loadProfile(profileDir);
|
|
59
|
+
expect(reloaded.profile.layout?.base.columns).toEqual(["manager", "secretary", "manager-2"]);
|
|
60
|
+
expect(reloaded.profile.layout?.base.cli?.["manager-2"]).toBe("claude");
|
|
61
|
+
// no seats.dirs entry was written -- seatDirSegment falls back to the id itself
|
|
62
|
+
expect(reloaded.profile.seats.dirs?.["manager-2"]).toBeUndefined();
|
|
63
|
+
});
|
|
64
|
+
it("preserves comments and inserts --after a given column", () => {
|
|
65
|
+
const loaded = loadProfile(profileDir);
|
|
66
|
+
addBaseColumn(loaded, "manager-2", { after: "manager" });
|
|
67
|
+
const raw = fs.readFileSync(path.join(profileDir, "mesh.config.yaml"), "utf8");
|
|
68
|
+
expect(raw).toContain("# fixture profile");
|
|
69
|
+
expect(listBaseColumns(loaded)).toEqual(["manager", "manager-2", "secretary"]);
|
|
70
|
+
});
|
|
71
|
+
it("marks a column human-co-typed", () => {
|
|
72
|
+
const loaded = loadProfile(profileDir);
|
|
73
|
+
addBaseColumn(loaded, "manager-2", { coTyped: true });
|
|
74
|
+
const reloaded = loadProfile(profileDir);
|
|
75
|
+
expect(reloaded.profile.layout?.base.humanCoTyped).toEqual(["manager-2"]);
|
|
76
|
+
});
|
|
77
|
+
it("rejects a duplicate column id", () => {
|
|
78
|
+
const loaded = loadProfile(profileDir);
|
|
79
|
+
expect(() => addBaseColumn(loaded, "manager")).toThrow(/already exists/);
|
|
80
|
+
});
|
|
81
|
+
it("rejects a bad column id", () => {
|
|
82
|
+
const loaded = loadProfile(profileDir);
|
|
83
|
+
expect(() => addBaseColumn(loaded, "Manager_2!")).toThrow(/bad column id/);
|
|
84
|
+
});
|
|
85
|
+
it("removes a column and its cli/humanCoTyped/seats.dirs entries", () => {
|
|
86
|
+
const loaded = loadProfile(profileDir);
|
|
87
|
+
addBaseColumn(loaded, "manager-2", { cli: "claude", coTyped: true });
|
|
88
|
+
const removed = removeBaseColumn(loadProfile(profileDir), "manager-2");
|
|
89
|
+
expect(removed.columns).toEqual(["manager", "secretary"]);
|
|
90
|
+
const reloaded = loadProfile(profileDir);
|
|
91
|
+
expect(reloaded.profile.layout?.base.cli?.["manager-2"]).toBeUndefined();
|
|
92
|
+
expect(reloaded.profile.layout?.base.humanCoTyped ?? []).not.toContain("manager-2");
|
|
93
|
+
});
|
|
94
|
+
it("refuses to remove the last base column", () => {
|
|
95
|
+
const loaded = loadProfile(profileDir);
|
|
96
|
+
removeBaseColumn(loaded, "secretary");
|
|
97
|
+
expect(() => removeBaseColumn(loadProfile(profileDir), "manager")).toThrow(/cannot remove the last/);
|
|
98
|
+
});
|
|
99
|
+
it("supports 100+ manager columns (no per-instance code, just config)", () => {
|
|
100
|
+
let loaded = loadProfile(profileDir);
|
|
101
|
+
for (let n = 2; n <= 101; n++) {
|
|
102
|
+
addBaseColumn(loaded, `manager-${n}`);
|
|
103
|
+
loaded = loadProfile(profileDir);
|
|
104
|
+
}
|
|
105
|
+
const cols = listBaseColumns(loaded);
|
|
106
|
+
expect(cols.length).toBe(102); // manager, secretary, manager-2..manager-101
|
|
107
|
+
expect(cols).toContain("manager-101");
|
|
108
|
+
expect(loaded.profile.layout?.base.columns.length).toBe(102);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=profile-edit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-edit.test.js","sourceRoot":"","sources":["../../src/profile/profile-edit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type MeshProfile } from "../schema/profile.js";
|
|
2
|
+
import { type MeshRuntimePaths } from "../paths/runtime-paths.js";
|
|
3
|
+
export interface LoadedProfile {
|
|
4
|
+
profile: MeshProfile;
|
|
5
|
+
profileDir: string;
|
|
6
|
+
profilePath: string;
|
|
7
|
+
workspace: string;
|
|
8
|
+
/** Short hash of resolved workspace path. */
|
|
9
|
+
workspaceId: string;
|
|
10
|
+
/** Resolved tmux session name (may include workspace suffix). */
|
|
11
|
+
sessionName: string;
|
|
12
|
+
}
|
|
13
|
+
export type { MeshRuntimePaths };
|
|
14
|
+
export { meshRuntimePaths, resolveDaemonPort, resolveSessionName, workspaceScopeId, resolveConnectivityHooks, runtimePathHint, } from "../paths/runtime-paths.js";
|
|
15
|
+
export { seatMeshPackageRoot, resolveDaemonScript } from "../paths/engine-paths.js";
|
|
16
|
+
/** Default profile: workspace `.sm/` when present, else bundled minimal. No flags required. */
|
|
17
|
+
export declare function defaultProfilePath(): string;
|
|
18
|
+
export declare function findProfilePath(explicit?: string, searchFrom?: string): string;
|
|
19
|
+
export declare function loadProfile(explicit?: string): LoadedProfile;
|
|
20
|
+
export declare function profilePaths(loaded: LoadedProfile): {
|
|
21
|
+
dataRoot: string;
|
|
22
|
+
daemonDir: string;
|
|
23
|
+
sqlitePath: string;
|
|
24
|
+
storageBackend: import("../paths/paths-manifest.js").StorageBackend;
|
|
25
|
+
inboxJsonl: string;
|
|
26
|
+
peerJsonl: string;
|
|
27
|
+
checkbackJsonl: string;
|
|
28
|
+
paneOpsJsonl: string;
|
|
29
|
+
callsJsonl: string;
|
|
30
|
+
meshInboxMeta: string;
|
|
31
|
+
meshInboxStop: string;
|
|
32
|
+
meshInboxLog: string;
|
|
33
|
+
coldStartState: string;
|
|
34
|
+
ppaState: string;
|
|
35
|
+
wifiProbeLock: string;
|
|
36
|
+
minisJson: string;
|
|
37
|
+
miniDone: string;
|
|
38
|
+
miniManifest: string;
|
|
39
|
+
gateQueue: string;
|
|
40
|
+
seatsRoot: string;
|
|
41
|
+
agentsJson: string;
|
|
42
|
+
meshAgentsJson: string;
|
|
43
|
+
chatRoomsRoot: string;
|
|
44
|
+
chatFilesRoot: string;
|
|
45
|
+
rolesDir: string;
|
|
46
|
+
contractsDir: string;
|
|
47
|
+
managerDir: string;
|
|
48
|
+
secretaryDir: string;
|
|
49
|
+
daemonPort: number;
|
|
50
|
+
pathsManifest: string;
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/profile/profile.ts"],"names":[],"mappings":"AAKA,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAO3E,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,2BAA2B,CAAC;AAOnC,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,WAAW,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,YAAY,EAAE,gBAAgB,EAAE,CAAC;AACjC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACxB,eAAe,GAChB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpF,+FAA+F;AAC/F,wBAAgB,kBAAkB,IAAI,MAAM,CAO3C;AAED,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,SAAgB,GAAG,MAAM,CAqBrF;AAED,wBAAgB,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,CAgB5D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCjD"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import YAML from "yaml";
|
|
4
|
+
import { seatMeshPackageRoot } from "../paths/engine-paths.js";
|
|
5
|
+
import { findDotSmConfig } from "../runtime/dotdir.js";
|
|
6
|
+
import { MeshProfileSchema } from "../schema/profile.js";
|
|
7
|
+
import { resolveWorkspace } from "../paths/paths.js";
|
|
8
|
+
import { buildResolvedPaths, writePathsManifest, assertHarnessUnderDotdir, } from "../paths/paths-manifest.js";
|
|
9
|
+
import { meshRuntimePaths, resolveDaemonPort, resolveSessionName, workspaceScopeId, } from "../paths/runtime-paths.js";
|
|
10
|
+
import { primaryManagerColumn, primarySecretaryColumn, seatDirSegment, } from "../schema/seat-kind.js";
|
|
11
|
+
export { meshRuntimePaths, resolveDaemonPort, resolveSessionName, workspaceScopeId, resolveConnectivityHooks, runtimePathHint, } from "../paths/runtime-paths.js";
|
|
12
|
+
export { seatMeshPackageRoot, resolveDaemonScript } from "../paths/engine-paths.js";
|
|
13
|
+
/** Default profile: workspace `.sm/` when present, else bundled minimal. No flags required. */
|
|
14
|
+
export function defaultProfilePath() {
|
|
15
|
+
const root = seatMeshPackageRoot();
|
|
16
|
+
const candidates = [path.join(root, "profiles/minimal/mesh.config.yaml")];
|
|
17
|
+
for (const cfg of candidates) {
|
|
18
|
+
if (fs.existsSync(cfg))
|
|
19
|
+
return cfg;
|
|
20
|
+
}
|
|
21
|
+
throw new Error(`no default profile under ${root}/profiles/`);
|
|
22
|
+
}
|
|
23
|
+
export function findProfilePath(explicit, searchFrom = process.cwd()) {
|
|
24
|
+
if (explicit) {
|
|
25
|
+
const p = path.resolve(explicit);
|
|
26
|
+
if (fs.statSync(p).isDirectory()) {
|
|
27
|
+
const dotCfg = path.join(p, ".sm", "mesh.config.yaml");
|
|
28
|
+
const cfg = fs.existsSync(dotCfg) ? dotCfg : path.join(p, "mesh.config.yaml");
|
|
29
|
+
if (!fs.existsSync(cfg)) {
|
|
30
|
+
throw new Error(`profile directory missing mesh.config.yaml (or .sm/mesh.config.yaml): ${p}`);
|
|
31
|
+
}
|
|
32
|
+
return cfg;
|
|
33
|
+
}
|
|
34
|
+
if (!fs.existsSync(p))
|
|
35
|
+
throw new Error(`profile not found: ${p}`);
|
|
36
|
+
return p;
|
|
37
|
+
}
|
|
38
|
+
const dotCfg = findDotSmConfig(searchFrom);
|
|
39
|
+
if (dotCfg)
|
|
40
|
+
return dotCfg;
|
|
41
|
+
return defaultProfilePath();
|
|
42
|
+
}
|
|
43
|
+
export function loadProfile(explicit) {
|
|
44
|
+
const profilePath = findProfilePath(explicit);
|
|
45
|
+
const profileDir = path.dirname(profilePath);
|
|
46
|
+
const raw = YAML.parse(fs.readFileSync(profilePath, "utf8"));
|
|
47
|
+
const profile = MeshProfileSchema.parse(raw);
|
|
48
|
+
const workspace = resolveWorkspace(profile.workspace, profileDir);
|
|
49
|
+
const workspaceId = workspaceScopeId(workspace);
|
|
50
|
+
const sessionName = resolveSessionName(profile, workspace);
|
|
51
|
+
const loaded = { profile, profileDir, profilePath, workspace, workspaceId, sessionName };
|
|
52
|
+
try {
|
|
53
|
+
writePathsManifest(loaded);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
/* non-fatal on read-only profile dir */
|
|
57
|
+
}
|
|
58
|
+
return loaded;
|
|
59
|
+
}
|
|
60
|
+
export function profilePaths(loaded) {
|
|
61
|
+
const { profile } = loaded;
|
|
62
|
+
const resolved = buildResolvedPaths(loaded);
|
|
63
|
+
const rt = meshRuntimePaths(loaded);
|
|
64
|
+
const dirs = profile.seats.dirs;
|
|
65
|
+
const primaryMgr = primaryManagerColumn(profile.layout);
|
|
66
|
+
const primarySec = primarySecretaryColumn(profile.layout);
|
|
67
|
+
for (const [label, abs] of [
|
|
68
|
+
["dataRoot", resolved.dataRoot],
|
|
69
|
+
["daemonDir", resolved.daemonDir],
|
|
70
|
+
["seatsRoot", resolved.seatsRoot],
|
|
71
|
+
["meshAgentsJson", resolved.meshAgentsJson],
|
|
72
|
+
["chatRoomsRoot", resolved.chatRoomsRoot],
|
|
73
|
+
["chatFilesRoot", resolved.chatFilesRoot],
|
|
74
|
+
["sqlitePath", resolved.sqlitePath],
|
|
75
|
+
]) {
|
|
76
|
+
assertHarnessUnderDotdir(loaded, abs, label);
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
seatsRoot: resolved.seatsRoot,
|
|
80
|
+
agentsJson: resolved.agentsJson,
|
|
81
|
+
meshAgentsJson: resolved.meshAgentsJson,
|
|
82
|
+
chatRoomsRoot: resolved.chatRoomsRoot,
|
|
83
|
+
chatFilesRoot: resolved.chatFilesRoot,
|
|
84
|
+
rolesDir: resolved.rolesDir,
|
|
85
|
+
contractsDir: resolved.contractsDir,
|
|
86
|
+
managerDir: path.join(resolved.seatsRoot, seatDirSegment(dirs, primaryMgr)),
|
|
87
|
+
secretaryDir: path.join(resolved.seatsRoot, seatDirSegment(dirs, primarySec)),
|
|
88
|
+
daemonPort: resolveDaemonPort(profile, loaded.workspace),
|
|
89
|
+
pathsManifest: path.join(loaded.profileDir, "paths.json"),
|
|
90
|
+
...rt,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/profile/profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.test.d.ts","sourceRoot":"","sources":["../../src/profile/profile.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { defaultProfilePath, loadProfile, portsForSlot } from "../index.js";
|
|
4
|
+
describe("loadProfile", () => {
|
|
5
|
+
it("loads default profile without --profile", () => {
|
|
6
|
+
const loaded = loadProfile();
|
|
7
|
+
expect(["consumer", "minimal"]).toContain(loaded.profile.name);
|
|
8
|
+
expect(loaded.workspace).toBeTruthy();
|
|
9
|
+
});
|
|
10
|
+
it("default profile resolves bundled minimal mesh.config.yaml", () => {
|
|
11
|
+
const cfg = defaultProfilePath();
|
|
12
|
+
expect(cfg).toContain("profiles");
|
|
13
|
+
expect(cfg.endsWith("mesh.config.yaml")).toBe(true);
|
|
14
|
+
});
|
|
15
|
+
it("loads bundled minimal profile", () => {
|
|
16
|
+
const minimalDir = path.resolve(import.meta.dirname, "../../../../profiles/minimal");
|
|
17
|
+
const loaded = loadProfile(minimalDir);
|
|
18
|
+
expect(loaded.profile.name).toBe("minimal");
|
|
19
|
+
expect(loaded.workspace).toBeTruthy();
|
|
20
|
+
});
|
|
21
|
+
it("formats worker ports from formula", () => {
|
|
22
|
+
expect(portsForSlot("30{n}0/30{n}1", 3)).toBe("3030/3031");
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=profile.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.test.js","sourceRoot":"","sources":["../../src/profile/profile.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5E,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,8BAA8B,CAC/B,CAAC;QACF,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const SM_DIR = ".sm";
|
|
2
|
+
export declare const SM_CONFIG = "mesh.config.yaml";
|
|
3
|
+
/** Absolute path to `.sm/mesh.config.yaml` under `dir`, or null. */
|
|
4
|
+
export declare function dotSmConfigIn(dir: string): string | null;
|
|
5
|
+
/**
|
|
6
|
+
* Walk from `startDir` up to filesystem root for `.sm/mesh.config.yaml`.
|
|
7
|
+
* Default start: process.cwd().
|
|
8
|
+
*/
|
|
9
|
+
export declare function findDotSmConfig(startDir?: string): string | null;
|
|
10
|
+
export declare function dotSmDirFromConfig(configPath: string): string;
|
|
11
|
+
//# sourceMappingURL=dotdir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dotdir.d.ts","sourceRoot":"","sources":["../../src/runtime/dotdir.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,eAAO,MAAM,SAAS,qBAAqB,CAAC;AAE5C,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGxD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,SAAgB,GAAG,MAAM,GAAG,IAAI,CAUvE;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE7D"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export const SM_DIR = ".sm";
|
|
4
|
+
export const SM_CONFIG = "mesh.config.yaml";
|
|
5
|
+
/** Absolute path to `.sm/mesh.config.yaml` under `dir`, or null. */
|
|
6
|
+
export function dotSmConfigIn(dir) {
|
|
7
|
+
const cfg = path.join(dir, SM_DIR, SM_CONFIG);
|
|
8
|
+
return fs.existsSync(cfg) ? cfg : null;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Walk from `startDir` up to filesystem root for `.sm/mesh.config.yaml`.
|
|
12
|
+
* Default start: process.cwd().
|
|
13
|
+
*/
|
|
14
|
+
export function findDotSmConfig(startDir = process.cwd()) {
|
|
15
|
+
let dir = path.resolve(startDir);
|
|
16
|
+
for (;;) {
|
|
17
|
+
const hit = dotSmConfigIn(dir);
|
|
18
|
+
if (hit)
|
|
19
|
+
return hit;
|
|
20
|
+
const parent = path.dirname(dir);
|
|
21
|
+
if (parent === dir)
|
|
22
|
+
break;
|
|
23
|
+
dir = parent;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
export function dotSmDirFromConfig(configPath) {
|
|
28
|
+
return path.dirname(configPath);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=dotdir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dotdir.js","sourceRoot":"","sources":["../../src/runtime/dotdir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC;AAC5B,MAAM,CAAC,MAAM,SAAS,GAAG,kBAAkB,CAAC;AAE5C,oEAAoE;AACpE,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9C,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;IACtD,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,SAAS,CAAC;QACR,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dotdir.test.d.ts","sourceRoot":"","sources":["../../src/runtime/dotdir.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
5
|
+
import { dotSmConfigIn, findDotSmConfig } from "./dotdir.js";
|
|
6
|
+
describe("dotdir", () => {
|
|
7
|
+
let tmp = "";
|
|
8
|
+
afterEach(() => {
|
|
9
|
+
if (tmp)
|
|
10
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
11
|
+
});
|
|
12
|
+
it("finds .sm/mesh.config.yaml walking up from subdir", () => {
|
|
13
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), "sm-dot-"));
|
|
14
|
+
const sm = path.join(tmp, ".sm");
|
|
15
|
+
fs.mkdirSync(sm, { recursive: true });
|
|
16
|
+
fs.writeFileSync(path.join(sm, "mesh.config.yaml"), "name: t\n");
|
|
17
|
+
const nested = path.join(tmp, "apps", "api");
|
|
18
|
+
fs.mkdirSync(nested, { recursive: true });
|
|
19
|
+
expect(findDotSmConfig(nested)).toBe(path.join(sm, "mesh.config.yaml"));
|
|
20
|
+
});
|
|
21
|
+
it("dotSmConfigIn returns null when missing", () => {
|
|
22
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), "sm-dot-"));
|
|
23
|
+
expect(dotSmConfigIn(tmp)).toBeNull();
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=dotdir.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dotdir.test.js","sourceRoot":"","sources":["../../src/runtime/dotdir.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7D,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,IAAI,GAAG,GAAG,EAAE,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,GAAG;YAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;QACxD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjC,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,CAAC,EAAE,WAAW,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7C,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;QACxD,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { LoadedProfile } from "../profile/profile.js";
|
|
2
|
+
export declare const GLOBAL_REGISTRY_VERSION = 1;
|
|
3
|
+
export interface GlobalSessionEntry {
|
|
4
|
+
/** Stable id — workspace scope hash. */
|
|
5
|
+
id: string;
|
|
6
|
+
label: string;
|
|
7
|
+
profilePath: string;
|
|
8
|
+
workspace: string;
|
|
9
|
+
workspaceId: string;
|
|
10
|
+
sessionName: string;
|
|
11
|
+
daemonPort: number;
|
|
12
|
+
lastSeen: string;
|
|
13
|
+
}
|
|
14
|
+
export interface GlobalRegistry {
|
|
15
|
+
version: number;
|
|
16
|
+
sessions: GlobalSessionEntry[];
|
|
17
|
+
}
|
|
18
|
+
export declare function globalConfigDir(): string;
|
|
19
|
+
export declare function globalRegistryPath(): string;
|
|
20
|
+
export declare function readGlobalRegistry(): GlobalRegistry;
|
|
21
|
+
/** Project `.sm/` profiles only — not bundled minimal fallback. */
|
|
22
|
+
export declare function isProjectProfilePath(profilePath: string): boolean;
|
|
23
|
+
export declare function sessionLabel(loaded: LoadedProfile): string;
|
|
24
|
+
export declare function entryFromLoaded(loaded: LoadedProfile): GlobalSessionEntry;
|
|
25
|
+
export declare function upsertGlobalSession(loaded: LoadedProfile): Promise<GlobalSessionEntry | null>;
|
|
26
|
+
export declare function forgetGlobalSession(idOrPath: string): Promise<boolean>;
|
|
27
|
+
export declare function findGlobalSession(reg: GlobalRegistry, idOrPath: string): GlobalSessionEntry | undefined;
|
|
28
|
+
//# sourceMappingURL=global-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-registry.d.ts","sourceRoot":"","sources":["../../src/runtime/global-registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI3D,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAIxC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAMD,wBAAgB,kBAAkB,IAAI,cAAc,CAUnD;AA6BD,mEAAmE;AACnE,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAGjE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAE1D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,kBAAkB,CAYzE;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAgBpC;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkB5E;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,GACf,kBAAkB,GAAG,SAAS,CAWhC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import lockfile from "proper-lockfile";
|
|
5
|
+
import { profilePaths } from "../profile/profile.js";
|
|
6
|
+
import { SM_DIR } from "./dotdir.js";
|
|
7
|
+
export const GLOBAL_REGISTRY_VERSION = 1;
|
|
8
|
+
export function globalConfigDir() {
|
|
9
|
+
const xdg = process.env.XDG_CONFIG_HOME;
|
|
10
|
+
const base = xdg && xdg.length > 0 ? xdg : path.join(os.homedir(), ".config");
|
|
11
|
+
return path.join(base, "seatmesh");
|
|
12
|
+
}
|
|
13
|
+
export function globalRegistryPath() {
|
|
14
|
+
return path.join(globalConfigDir(), "sessions.json");
|
|
15
|
+
}
|
|
16
|
+
function emptyRegistry() {
|
|
17
|
+
return { version: GLOBAL_REGISTRY_VERSION, sessions: [] };
|
|
18
|
+
}
|
|
19
|
+
export function readGlobalRegistry() {
|
|
20
|
+
const file = globalRegistryPath();
|
|
21
|
+
if (!fs.existsSync(file))
|
|
22
|
+
return emptyRegistry();
|
|
23
|
+
try {
|
|
24
|
+
const raw = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
25
|
+
if (!raw || !Array.isArray(raw.sessions))
|
|
26
|
+
return emptyRegistry();
|
|
27
|
+
return { version: GLOBAL_REGISTRY_VERSION, sessions: raw.sessions };
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return emptyRegistry();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function withRegistryLock(fn) {
|
|
34
|
+
const file = globalRegistryPath();
|
|
35
|
+
fs.mkdirSync(globalConfigDir(), { recursive: true });
|
|
36
|
+
if (!fs.existsSync(file)) {
|
|
37
|
+
fs.writeFileSync(file, `${JSON.stringify(emptyRegistry(), null, 2)}\n`);
|
|
38
|
+
}
|
|
39
|
+
let release;
|
|
40
|
+
try {
|
|
41
|
+
release = await lockfile.lock(file, { retries: { retries: 5, minTimeout: 20 } });
|
|
42
|
+
return await fn();
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
if (release)
|
|
46
|
+
await release();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function writeGlobalRegistrySync(reg) {
|
|
50
|
+
const file = globalRegistryPath();
|
|
51
|
+
fs.mkdirSync(globalConfigDir(), { recursive: true });
|
|
52
|
+
const sorted = {
|
|
53
|
+
...reg,
|
|
54
|
+
sessions: [...reg.sessions].sort((a, b) => new Date(b.lastSeen).getTime() - new Date(a.lastSeen).getTime()),
|
|
55
|
+
};
|
|
56
|
+
fs.writeFileSync(file, `${JSON.stringify(sorted, null, 2)}\n`);
|
|
57
|
+
}
|
|
58
|
+
/** Project `.sm/` profiles only — not bundled minimal fallback. */
|
|
59
|
+
export function isProjectProfilePath(profilePath) {
|
|
60
|
+
const norm = profilePath.split(path.sep).join("/");
|
|
61
|
+
return norm.includes(`/${SM_DIR}/`) || norm.endsWith(`/${SM_DIR}/mesh.config.yaml`);
|
|
62
|
+
}
|
|
63
|
+
export function sessionLabel(loaded) {
|
|
64
|
+
return loaded.profile.name || path.basename(loaded.workspace);
|
|
65
|
+
}
|
|
66
|
+
export function entryFromLoaded(loaded) {
|
|
67
|
+
const paths = profilePaths(loaded);
|
|
68
|
+
return {
|
|
69
|
+
id: loaded.workspaceId,
|
|
70
|
+
label: sessionLabel(loaded),
|
|
71
|
+
profilePath: loaded.profilePath,
|
|
72
|
+
workspace: loaded.workspace,
|
|
73
|
+
workspaceId: loaded.workspaceId,
|
|
74
|
+
sessionName: loaded.sessionName,
|
|
75
|
+
daemonPort: paths.daemonPort,
|
|
76
|
+
lastSeen: new Date().toISOString(),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export async function upsertGlobalSession(loaded) {
|
|
80
|
+
if (!isProjectProfilePath(loaded.profilePath))
|
|
81
|
+
return null;
|
|
82
|
+
const entry = entryFromLoaded(loaded);
|
|
83
|
+
await withRegistryLock(() => {
|
|
84
|
+
const reg = readGlobalRegistry();
|
|
85
|
+
const idx = reg.sessions.findIndex((s) => s.id === entry.id || s.profilePath === entry.profilePath);
|
|
86
|
+
if (idx >= 0) {
|
|
87
|
+
reg.sessions[idx] = { ...reg.sessions[idx], ...entry };
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
reg.sessions.push(entry);
|
|
91
|
+
}
|
|
92
|
+
writeGlobalRegistrySync(reg);
|
|
93
|
+
});
|
|
94
|
+
return entry;
|
|
95
|
+
}
|
|
96
|
+
export async function forgetGlobalSession(idOrPath) {
|
|
97
|
+
let removed = false;
|
|
98
|
+
await withRegistryLock(() => {
|
|
99
|
+
const reg = readGlobalRegistry();
|
|
100
|
+
const key = idOrPath.trim();
|
|
101
|
+
const next = reg.sessions.filter((s) => {
|
|
102
|
+
const hit = s.id === key ||
|
|
103
|
+
s.profilePath === key ||
|
|
104
|
+
path.resolve(s.profilePath) === path.resolve(key) ||
|
|
105
|
+
s.workspace === key ||
|
|
106
|
+
path.resolve(s.workspace) === path.resolve(key);
|
|
107
|
+
if (hit)
|
|
108
|
+
removed = true;
|
|
109
|
+
return !hit;
|
|
110
|
+
});
|
|
111
|
+
writeGlobalRegistrySync({ ...reg, sessions: next });
|
|
112
|
+
});
|
|
113
|
+
return removed;
|
|
114
|
+
}
|
|
115
|
+
export function findGlobalSession(reg, idOrPath) {
|
|
116
|
+
const key = idOrPath.trim();
|
|
117
|
+
return reg.sessions.find((s) => s.id === key ||
|
|
118
|
+
s.profilePath === key ||
|
|
119
|
+
path.resolve(s.profilePath) === path.resolve(key) ||
|
|
120
|
+
s.sessionName === key ||
|
|
121
|
+
s.workspace === key ||
|
|
122
|
+
path.resolve(s.workspace) === path.resolve(key));
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=global-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-registry.js","sourceRoot":"","sources":["../../src/runtime/global-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { MeshProfile } from "../schema/profile.js";
|
|
2
|
+
import type { MeshAgents, SavedMinisLayout } from "../schema/agents.js";
|
|
3
|
+
/** Effective minis layout: saved mesh-agents.json wins over profile yaml defaults. */
|
|
4
|
+
export declare function effectiveMinisLayout(profile: MeshProfile, saved?: SavedMinisLayout | null): SavedMinisLayout;
|
|
5
|
+
/** Merge saved mesh-agents layout into a loaded profile (session.miniMax synced). */
|
|
6
|
+
export declare function mergeMeshAgentsIntoProfile(profile: MeshProfile, mesh: Pick<MeshAgents, "layout"> | null): MeshProfile;
|
|
7
|
+
//# sourceMappingURL=mesh-state-merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh-state-merge.d.ts","sourceRoot":"","sources":["../../src/runtime/mesh-state-merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAExE,sFAAsF;AACtF,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,WAAW,EACpB,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAC9B,gBAAgB,CAiBlB;AAED,qFAAqF;AACrF,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,IAAI,GACtC,WAAW,CA8Bb"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** Effective minis layout: saved mesh-agents.json wins over profile yaml defaults. */
|
|
2
|
+
export function effectiveMinisLayout(profile, saved) {
|
|
3
|
+
const base = profile.layout?.minis;
|
|
4
|
+
if (!base) {
|
|
5
|
+
throw new Error("profile missing layout.minis");
|
|
6
|
+
}
|
|
7
|
+
if (!saved) {
|
|
8
|
+
return {
|
|
9
|
+
grid: base.grid,
|
|
10
|
+
max: base.max,
|
|
11
|
+
leads: Array.isArray(base.leads) ? base.leads : [1, 2],
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
grid: saved.grid,
|
|
16
|
+
max: saved.max,
|
|
17
|
+
leads: saved.leads,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** Merge saved mesh-agents layout into a loaded profile (session.miniMax synced). */
|
|
21
|
+
export function mergeMeshAgentsIntoProfile(profile, mesh) {
|
|
22
|
+
const saved = mesh?.layout;
|
|
23
|
+
if (!saved || !profile.layout)
|
|
24
|
+
return profile;
|
|
25
|
+
const minisSaved = saved.minis;
|
|
26
|
+
const minis = minisSaved
|
|
27
|
+
? { ...profile.layout.minis, ...minisSaved }
|
|
28
|
+
: profile.layout.minis;
|
|
29
|
+
const workers = saved.workers
|
|
30
|
+
? { ...profile.layout.workers, ...saved.workers }
|
|
31
|
+
: profile.layout.workers;
|
|
32
|
+
const nvim = saved.nvim ? { ...profile.layout.nvim, ...saved.nvim } : profile.layout.nvim;
|
|
33
|
+
const base = saved.base
|
|
34
|
+
? { ...profile.layout.base, ...saved.base }
|
|
35
|
+
: profile.layout.base;
|
|
36
|
+
return {
|
|
37
|
+
...profile,
|
|
38
|
+
layout: {
|
|
39
|
+
...profile.layout,
|
|
40
|
+
base,
|
|
41
|
+
nvim,
|
|
42
|
+
workers,
|
|
43
|
+
minis,
|
|
44
|
+
},
|
|
45
|
+
session: { ...profile.session, miniMax: minis.max },
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=mesh-state-merge.js.map
|