@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.
Files changed (103) hide show
  1. package/dist/chatfile/store.d.ts +1 -1
  2. package/dist/chatfile/store.d.ts.map +1 -1
  3. package/dist/chatfile/store.js +2 -2
  4. package/dist/chatfile/store.js.map +1 -1
  5. package/dist/chatroom/calls.d.ts +1 -1
  6. package/dist/chatroom/calls.d.ts.map +1 -1
  7. package/dist/chatroom/calls.js +1 -1
  8. package/dist/chatroom/calls.js.map +1 -1
  9. package/dist/chatroom/calls.test.js +1 -1
  10. package/dist/chatroom/calls.test.js.map +1 -1
  11. package/dist/chatroom/room.d.ts +1 -1
  12. package/dist/chatroom/room.d.ts.map +1 -1
  13. package/dist/chatroom/room.js +2 -2
  14. package/dist/chatroom/room.js.map +1 -1
  15. package/dist/chatroom/room.test.js +1 -1
  16. package/dist/chatroom/room.test.js.map +1 -1
  17. package/dist/chatroom/types.d.ts +2 -2
  18. package/dist/comms/envelope.d.ts +11 -11
  19. package/dist/contracts/balance.d.ts +1 -1
  20. package/dist/contracts/balance.d.ts.map +1 -1
  21. package/dist/contracts/supervise.d.ts +3 -3
  22. package/dist/contracts/supervise.d.ts.map +1 -1
  23. package/dist/contracts/supervise.js +1 -1
  24. package/dist/contracts/supervise.js.map +1 -1
  25. package/dist/index.d.ts +9 -9
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +9 -9
  28. package/dist/index.js.map +1 -1
  29. package/dist/paths/engine-paths.d.ts +4 -0
  30. package/dist/paths/engine-paths.d.ts.map +1 -0
  31. package/dist/paths/engine-paths.js +45 -0
  32. package/dist/paths/engine-paths.js.map +1 -0
  33. package/dist/paths/paths-manifest.d.ts +34 -0
  34. package/dist/paths/paths-manifest.d.ts.map +1 -0
  35. package/dist/paths/paths-manifest.js +79 -0
  36. package/dist/paths/paths-manifest.js.map +1 -0
  37. package/dist/paths/paths-manifest.test.d.ts +2 -0
  38. package/dist/paths/paths-manifest.test.d.ts.map +1 -0
  39. package/dist/paths/paths-manifest.test.js +58 -0
  40. package/dist/paths/paths-manifest.test.js.map +1 -0
  41. package/dist/paths/paths.d.ts +5 -0
  42. package/dist/paths/paths.d.ts.map +1 -0
  43. package/dist/paths/paths.js +17 -0
  44. package/dist/paths/paths.js.map +1 -0
  45. package/dist/paths/runtime-paths.d.ts +43 -0
  46. package/dist/paths/runtime-paths.d.ts.map +1 -0
  47. package/dist/paths/runtime-paths.js +94 -0
  48. package/dist/paths/runtime-paths.js.map +1 -0
  49. package/dist/paths/runtime-paths.test.d.ts +2 -0
  50. package/dist/paths/runtime-paths.test.d.ts.map +1 -0
  51. package/dist/paths/runtime-paths.test.js +86 -0
  52. package/dist/paths/runtime-paths.test.js.map +1 -0
  53. package/dist/profile/profile-edit.d.ts +26 -0
  54. package/dist/profile/profile-edit.d.ts.map +1 -0
  55. package/dist/profile/profile-edit.js +87 -0
  56. package/dist/profile/profile-edit.js.map +1 -0
  57. package/dist/profile/profile-edit.test.d.ts +2 -0
  58. package/dist/profile/profile-edit.test.d.ts.map +1 -0
  59. package/dist/profile/profile-edit.test.js +111 -0
  60. package/dist/profile/profile-edit.test.js.map +1 -0
  61. package/dist/profile/profile.d.ts +52 -0
  62. package/dist/profile/profile.d.ts.map +1 -0
  63. package/dist/profile/profile.js +93 -0
  64. package/dist/profile/profile.js.map +1 -0
  65. package/dist/profile/profile.test.d.ts +2 -0
  66. package/dist/profile/profile.test.d.ts.map +1 -0
  67. package/dist/profile/profile.test.js +25 -0
  68. package/dist/profile/profile.test.js.map +1 -0
  69. package/dist/runtime/dotdir.d.ts +11 -0
  70. package/dist/runtime/dotdir.d.ts.map +1 -0
  71. package/dist/runtime/dotdir.js +30 -0
  72. package/dist/runtime/dotdir.js.map +1 -0
  73. package/dist/runtime/dotdir.test.d.ts +2 -0
  74. package/dist/runtime/dotdir.test.d.ts.map +1 -0
  75. package/dist/runtime/dotdir.test.js +26 -0
  76. package/dist/runtime/dotdir.test.js.map +1 -0
  77. package/dist/runtime/global-registry.d.ts +28 -0
  78. package/dist/runtime/global-registry.d.ts.map +1 -0
  79. package/dist/runtime/global-registry.js +124 -0
  80. package/dist/runtime/global-registry.js.map +1 -0
  81. package/dist/runtime/mesh-state-merge.d.ts +7 -0
  82. package/dist/runtime/mesh-state-merge.d.ts.map +1 -0
  83. package/dist/runtime/mesh-state-merge.js +48 -0
  84. package/dist/runtime/mesh-state-merge.js.map +1 -0
  85. package/dist/runtime/mesh-state-merge.test.d.ts +2 -0
  86. package/dist/runtime/mesh-state-merge.test.d.ts.map +1 -0
  87. package/dist/runtime/mesh-state-merge.test.js +36 -0
  88. package/dist/runtime/mesh-state-merge.test.js.map +1 -0
  89. package/dist/runtime/role-index.d.ts +53 -0
  90. package/dist/runtime/role-index.d.ts.map +1 -0
  91. package/dist/runtime/role-index.js +179 -0
  92. package/dist/runtime/role-index.js.map +1 -0
  93. package/dist/runtime/role-index.test.d.ts +2 -0
  94. package/dist/runtime/role-index.test.d.ts.map +1 -0
  95. package/dist/runtime/role-index.test.js +85 -0
  96. package/dist/runtime/role-index.test.js.map +1 -0
  97. package/dist/schema/agents.d.ts +75 -75
  98. package/dist/schema/profile.d.ts +2 -2
  99. package/dist/stack/exec.d.ts +1 -1
  100. package/dist/stack/exec.d.ts.map +1 -1
  101. package/dist/stack/stack.test.js +2 -2
  102. package/dist/stack/stack.test.js.map +1 -1
  103. package/package.json +1 -1
@@ -0,0 +1,34 @@
1
+ import type { LoadedProfile } from "../profile/profile.js";
2
+ export declare const PATHS_MANIFEST = "paths.json";
3
+ export type PathsScope = "profile" | "workspace";
4
+ export type StorageBackend = "sqlite" | "jsonl";
5
+ export interface ResolvedPaths {
6
+ dataRoot: string;
7
+ daemonDir: string;
8
+ seatsRoot: string;
9
+ meshAgentsJson: string;
10
+ agentsJson: string;
11
+ chatRoomsRoot: string;
12
+ chatFilesRoot: string;
13
+ rolesDir: string;
14
+ contractsDir: string;
15
+ sqlitePath: string;
16
+ storageBackend: StorageBackend;
17
+ }
18
+ export interface PathsManifestDoc {
19
+ version: number;
20
+ profileDir: string;
21
+ workspace: string;
22
+ pathsScope: PathsScope;
23
+ paths: Record<string, string>;
24
+ }
25
+ /** Resolve a harness path from mesh.config (profileDir-relative by default). */
26
+ export declare function resolveHarnessPath(loaded: LoadedProfile, rel: string): string;
27
+ export declare function pathsScope(loaded: LoadedProfile): PathsScope;
28
+ export declare function storageBackend(loaded: LoadedProfile): StorageBackend;
29
+ export declare function buildResolvedPaths(loaded: LoadedProfile): ResolvedPaths;
30
+ /** Write `.sm/paths.json` (workspace-relative path hints for agents). */
31
+ export declare function writePathsManifest(loaded: LoadedProfile): string;
32
+ /** Refuse harness paths outside profileDir when scope=profile (safety guard). */
33
+ export declare function assertHarnessUnderDotdir(loaded: LoadedProfile, absPath: string, label: string): void;
34
+ //# sourceMappingURL=paths-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths-manifest.d.ts","sourceRoot":"","sources":["../../src/paths/paths-manifest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,eAAO,MAAM,cAAc,eAAe,CAAC;AAE3C,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;AACjD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ7E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAE5D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAEpE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAiBvE;AAOD,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAyBhE;AAED,iFAAiF;AACjF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQpG"}
@@ -0,0 +1,79 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export const PATHS_MANIFEST = "paths.json";
4
+ /** Resolve a harness path from mesh.config (profileDir-relative by default). */
5
+ export function resolveHarnessPath(loaded, rel) {
6
+ const scope = loaded.profile.paths?.scope ?? "profile";
7
+ const raw = rel.trim();
8
+ if (path.isAbsolute(raw))
9
+ return path.normalize(raw);
10
+ if (scope === "workspace") {
11
+ return path.normalize(path.resolve(loaded.workspace, raw));
12
+ }
13
+ return path.normalize(path.resolve(loaded.profileDir, raw));
14
+ }
15
+ export function pathsScope(loaded) {
16
+ return loaded.profile.paths?.scope ?? "profile";
17
+ }
18
+ export function storageBackend(loaded) {
19
+ return loaded.profile.storage?.backend ?? "sqlite";
20
+ }
21
+ export function buildResolvedPaths(loaded) {
22
+ const { profile } = loaded;
23
+ const dataRoot = resolveHarnessPath(loaded, profile.data?.root ?? "runtime");
24
+ const sqliteRel = profile.storage?.sqlite?.path ?? "runtime/mesh.sqlite";
25
+ return {
26
+ dataRoot,
27
+ daemonDir: path.join(dataRoot, "daemon"),
28
+ seatsRoot: resolveHarnessPath(loaded, profile.seats.root),
29
+ meshAgentsJson: resolveHarnessPath(loaded, profile.state.meshAgentsJson),
30
+ agentsJson: resolveHarnessPath(loaded, profile.state.agentsJson),
31
+ chatRoomsRoot: resolveHarnessPath(loaded, profile.chatRooms?.root ?? "chat-rooms"),
32
+ chatFilesRoot: resolveHarnessPath(loaded, profile.chatFiles?.root ?? "chat-files"),
33
+ rolesDir: path.resolve(loaded.profileDir, profile.roles.dir),
34
+ contractsDir: path.resolve(loaded.profileDir, "contracts"),
35
+ sqlitePath: resolveHarnessPath(loaded, sqliteRel),
36
+ storageBackend: storageBackend(loaded),
37
+ };
38
+ }
39
+ function workspaceRelativeHint(workspace, abs) {
40
+ const rel = path.relative(workspace, abs);
41
+ return rel && !rel.startsWith("..") ? rel : abs;
42
+ }
43
+ /** Write `.sm/paths.json` (workspace-relative path hints for agents). */
44
+ export function writePathsManifest(loaded) {
45
+ const resolved = buildResolvedPaths(loaded);
46
+ const outPath = path.join(loaded.profileDir, PATHS_MANIFEST);
47
+ const doc = {
48
+ version: 1,
49
+ profileDir: loaded.profileDir,
50
+ workspace: loaded.workspace,
51
+ pathsScope: pathsScope(loaded),
52
+ paths: {
53
+ dataRoot: workspaceRelativeHint(loaded.workspace, resolved.dataRoot),
54
+ daemonDir: workspaceRelativeHint(loaded.workspace, resolved.daemonDir),
55
+ seatsRoot: workspaceRelativeHint(loaded.workspace, resolved.seatsRoot),
56
+ meshAgentsJson: workspaceRelativeHint(loaded.workspace, resolved.meshAgentsJson),
57
+ agentsJson: workspaceRelativeHint(loaded.workspace, resolved.agentsJson),
58
+ chatRoomsRoot: workspaceRelativeHint(loaded.workspace, resolved.chatRoomsRoot),
59
+ chatFilesRoot: workspaceRelativeHint(loaded.workspace, resolved.chatFilesRoot),
60
+ rolesDir: workspaceRelativeHint(loaded.workspace, resolved.rolesDir),
61
+ contractsDir: workspaceRelativeHint(loaded.workspace, resolved.contractsDir),
62
+ sqlitePath: workspaceRelativeHint(loaded.workspace, resolved.sqlitePath),
63
+ storageBackend: resolved.storageBackend,
64
+ },
65
+ };
66
+ fs.mkdirSync(loaded.profileDir, { recursive: true });
67
+ fs.writeFileSync(outPath, JSON.stringify(doc, null, 2) + "\n");
68
+ return outPath;
69
+ }
70
+ /** Refuse harness paths outside profileDir when scope=profile (safety guard). */
71
+ export function assertHarnessUnderDotdir(loaded, absPath, label) {
72
+ if (pathsScope(loaded) !== "profile")
73
+ return;
74
+ const rel = path.relative(loaded.profileDir, absPath);
75
+ if (rel.startsWith("..") || path.isAbsolute(rel)) {
76
+ throw new Error(`harness path ${label} must live under profile dir ${loaded.profileDir} (got ${absPath})`);
77
+ }
78
+ }
79
+ //# sourceMappingURL=paths-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths-manifest.js","sourceRoot":"","sources":["../../src/paths/paths-manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=paths-manifest.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths-manifest.test.d.ts","sourceRoot":"","sources":["../../src/paths/paths-manifest.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { describe, expect, it } from "vitest";
5
+ import { buildResolvedPaths, PATHS_MANIFEST, resolveHarnessPath, writePathsManifest, } from "./paths-manifest.js";
6
+ function stubLoaded(profileDir, workspace) {
7
+ const profile = {
8
+ name: "ci",
9
+ workspace: "..",
10
+ paths: { scope: "profile" },
11
+ storage: { backend: "sqlite", sqlite: { path: "runtime/mesh.sqlite" } },
12
+ session: {
13
+ name: "mesh",
14
+ scope: "workspace",
15
+ idLength: 6,
16
+ workerCount: 4,
17
+ miniMax: 4,
18
+ },
19
+ seats: { root: "seats", templates: ["FOCUS"], dirs: {} },
20
+ state: { agentsJson: "tmux-main-agents.json", meshAgentsJson: "mesh-agents.json" },
21
+ roles: { dir: "roles" },
22
+ data: { root: "runtime" },
23
+ providers: ["empty"],
24
+ };
25
+ return {
26
+ profile,
27
+ profileDir,
28
+ profilePath: path.join(profileDir, "mesh.config.yaml"),
29
+ workspace,
30
+ workspaceId: "abc123",
31
+ sessionName: "mesh-abc123",
32
+ };
33
+ }
34
+ describe("paths-manifest", () => {
35
+ it("resolves harness paths under profileDir", () => {
36
+ const ws = fs.mkdtempSync(path.join(os.tmpdir(), "sm-paths-"));
37
+ const sm = path.join(ws, ".sm");
38
+ fs.mkdirSync(sm, { recursive: true });
39
+ const loaded = stubLoaded(sm, ws);
40
+ const p = buildResolvedPaths(loaded);
41
+ expect(p.daemonDir).toBe(path.join(sm, "runtime", "daemon"));
42
+ expect(p.sqlitePath).toBe(path.join(sm, "runtime", "mesh.sqlite"));
43
+ expect(p.chatRoomsRoot).toBe(path.join(sm, "chat-rooms"));
44
+ expect(p.meshAgentsJson).toBe(path.join(sm, "mesh-agents.json"));
45
+ expect(resolveHarnessPath(loaded, "seats")).toBe(path.join(sm, "seats"));
46
+ });
47
+ it("writes paths.json", () => {
48
+ const ws = fs.mkdtempSync(path.join(os.tmpdir(), "sm-paths-"));
49
+ const sm = path.join(ws, ".sm");
50
+ fs.mkdirSync(sm, { recursive: true });
51
+ const loaded = stubLoaded(sm, ws);
52
+ const out = writePathsManifest(loaded);
53
+ expect(out).toBe(path.join(sm, PATHS_MANIFEST));
54
+ const doc = JSON.parse(fs.readFileSync(out, "utf8"));
55
+ expect(doc.pathsScope).toBe("profile");
56
+ });
57
+ });
58
+ //# sourceMappingURL=paths-manifest.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths-manifest.test.js","sourceRoot":"","sources":["../../src/paths/paths-manifest.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function resolveWorkspace(profileWorkspace: string, profileDir: string): string;
2
+ export declare function resolveFromWorkspace(workspace: string, rel: string): string;
3
+ export declare function resolveFromProfile(profileDir: string, rel: string): string;
4
+ export declare function portsForSlot(formula: string, slot: number): string;
5
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/paths/paths.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAIrF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAElE"}
@@ -0,0 +1,17 @@
1
+ import path from "node:path";
2
+ export function resolveWorkspace(profileWorkspace, profileDir) {
3
+ const raw = profileWorkspace.trim();
4
+ if (path.isAbsolute(raw))
5
+ return path.normalize(raw);
6
+ return path.normalize(path.resolve(profileDir, raw));
7
+ }
8
+ export function resolveFromWorkspace(workspace, rel) {
9
+ return path.normalize(path.resolve(workspace, rel));
10
+ }
11
+ export function resolveFromProfile(profileDir, rel) {
12
+ return path.normalize(path.resolve(profileDir, rel));
13
+ }
14
+ export function portsForSlot(formula, slot) {
15
+ return formula.replace(/\{n\}/g, String(slot));
16
+ }
17
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/paths/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,gBAAgB,CAAC,gBAAwB,EAAE,UAAkB;IAC3E,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,GAAW;IACjE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,GAAW;IAChE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,IAAY;IACxD,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { MeshProfile } from "../schema/profile.js";
2
+ import type { LoadedProfile } from "../profile/profile.js";
3
+ import type { StorageBackend } from "./paths-manifest.js";
4
+ /** Stable short id for a workspace root (tmux session suffix, port offset). */
5
+ export declare function workspaceScopeId(workspace: string, length?: number): string;
6
+ /** Tmux session name: `mesh-a3f91c` when scope=workspace, else yaml `session.name`. */
7
+ export declare function resolveSessionName(profile: MeshProfile, workspace: string): string;
8
+ /** Inbox HTTP port — unique per workspace when portScope=workspace. */
9
+ export declare function resolveDaemonPort(profile: MeshProfile, workspace: string): number;
10
+ export declare function resolveDataRoot(profile: MeshProfile, workspace: string): string;
11
+ export interface MeshRuntimePaths {
12
+ dataRoot: string;
13
+ daemonDir: string;
14
+ sqlitePath: string;
15
+ storageBackend: StorageBackend;
16
+ inboxJsonl: string;
17
+ peerJsonl: string;
18
+ checkbackJsonl: string;
19
+ paneOpsJsonl: string;
20
+ callsJsonl: string;
21
+ meshInboxMeta: string;
22
+ meshInboxStop: string;
23
+ meshInboxLog: string;
24
+ coldStartState: string;
25
+ ppaState: string;
26
+ wifiProbeLock: string;
27
+ minisJson: string;
28
+ miniDone: string;
29
+ miniManifest: string;
30
+ gateQueue: string;
31
+ }
32
+ export declare function meshRuntimePaths(loaded: LoadedProfile): MeshRuntimePaths;
33
+ /** Workspace-relative path for agent-visible hints (whoami, checkback). */
34
+ export declare function runtimePathHint(workspace: string, absPath: string): string;
35
+ export interface ResolvedConnectivityHooks {
36
+ status?: string;
37
+ up?: string;
38
+ rotate?: string;
39
+ smartRestart?: string;
40
+ }
41
+ /** Resolve hook scripts to absolute paths (profile hooks only — no driver branches). */
42
+ export declare function resolveConnectivityHooks(profile: MeshProfile, workspace: string): ResolvedConnectivityHooks | null;
43
+ //# sourceMappingURL=runtime-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-paths.d.ts","sourceRoot":"","sources":["../../src/paths/runtime-paths.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAM1D,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,MAAM,CAGtE;AAED,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAMlF;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAUjF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAK/E;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,gBAAgB,CAwBxE;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAG1E;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wFAAwF;AACxF,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,GAChB,yBAAyB,GAAG,IAAI,CAkBlC"}
@@ -0,0 +1,94 @@
1
+ import { createHash } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { resolveFromWorkspace } from "./paths.js";
5
+ import { buildResolvedPaths } from "./paths-manifest.js";
6
+ /** Outside common dev 3000-3099 (product FE/BE slots, legacy harness). */
7
+ const DEFAULT_DAEMON_PORT_BASE = 31670;
8
+ const DEFAULT_DAEMON_PORT_RANGE = 90;
9
+ /** Stable short id for a workspace root (tmux session suffix, port offset). */
10
+ export function workspaceScopeId(workspace, length = 6) {
11
+ const resolved = path.resolve(workspace);
12
+ return createHash("sha256").update(resolved).digest("hex").slice(0, length);
13
+ }
14
+ /** Tmux session name: `mesh-a3f91c` when scope=workspace, else yaml `session.name`. */
15
+ export function resolveSessionName(profile, workspace) {
16
+ const base = profile.session.name;
17
+ const scope = profile.session.scope ?? "workspace";
18
+ if (scope === "global")
19
+ return base;
20
+ const len = profile.session.idLength ?? 6;
21
+ return `${base}-${workspaceScopeId(workspace, len)}`;
22
+ }
23
+ /** Inbox HTTP port — unique per workspace when portScope=workspace. */
24
+ export function resolveDaemonPort(profile, workspace) {
25
+ const daemon = profile.daemon;
26
+ const scope = daemon?.portScope ?? "workspace";
27
+ if (scope === "profile") {
28
+ return daemon?.port ?? DEFAULT_DAEMON_PORT_BASE;
29
+ }
30
+ const base = daemon?.portBase ?? DEFAULT_DAEMON_PORT_BASE;
31
+ const range = daemon?.portRange ?? DEFAULT_DAEMON_PORT_RANGE;
32
+ const offset = parseInt(workspaceScopeId(workspace, 8), 16) % range;
33
+ return base + offset;
34
+ }
35
+ export function resolveDataRoot(profile, workspace) {
36
+ const rel = profile.data?.root ?? "runtime";
37
+ const scope = profile.paths?.scope ?? "profile";
38
+ if (scope === "workspace")
39
+ return resolveFromWorkspace(workspace, rel);
40
+ return rel;
41
+ }
42
+ export function meshRuntimePaths(loaded) {
43
+ const resolved = buildResolvedPaths(loaded);
44
+ const { dataRoot, daemonDir, sqlitePath, storageBackend } = resolved;
45
+ return {
46
+ dataRoot,
47
+ daemonDir,
48
+ sqlitePath,
49
+ storageBackend,
50
+ inboxJsonl: path.join(daemonDir, "INBOX.jsonl"),
51
+ peerJsonl: path.join(daemonDir, "PEER.jsonl"),
52
+ checkbackJsonl: path.join(daemonDir, "CHECKBACK.jsonl"),
53
+ paneOpsJsonl: path.join(daemonDir, "PANE_OPS.jsonl"),
54
+ callsJsonl: path.join(daemonDir, "CALLS.jsonl"),
55
+ meshInboxMeta: path.join(daemonDir, "mesh-inbox.json"),
56
+ meshInboxStop: path.join(daemonDir, "mesh-inbox.stop"),
57
+ meshInboxLog: path.join(daemonDir, "mesh-inbox.log"),
58
+ coldStartState: path.join(daemonDir, "cold-start.json"),
59
+ ppaState: path.join(daemonDir, "ppa-state.json"),
60
+ wifiProbeLock: path.join(daemonDir, "cpe-wifi-probe.lock"),
61
+ minisJson: path.join(dataRoot, "minis.json"),
62
+ miniDone: path.join(dataRoot, "MINI-DONE.md"),
63
+ miniManifest: path.join(dataRoot, "mini-manifest.json"),
64
+ gateQueue: path.join(dataRoot, "GATE-QUEUE.md"),
65
+ };
66
+ }
67
+ /** Workspace-relative path for agent-visible hints (whoami, checkback). */
68
+ export function runtimePathHint(workspace, absPath) {
69
+ const rel = path.relative(workspace, absPath);
70
+ return rel && !rel.startsWith("..") ? rel : absPath;
71
+ }
72
+ /** Resolve hook scripts to absolute paths (profile hooks only — no driver branches). */
73
+ export function resolveConnectivityHooks(profile, workspace) {
74
+ const conn = profile.connectivity;
75
+ if (!conn?.enabled)
76
+ return null;
77
+ const rel = (p) => {
78
+ if (!p)
79
+ return undefined;
80
+ const abs = resolveFromWorkspace(workspace, p);
81
+ return fs.existsSync(abs) ? abs : abs;
82
+ };
83
+ const hooks = conn.hooks;
84
+ if (!hooks?.up && !hooks?.rotate && !hooks?.smartRestart && !hooks?.status) {
85
+ return null;
86
+ }
87
+ return {
88
+ status: rel(hooks.status),
89
+ up: rel(hooks.up),
90
+ rotate: rel(hooks.rotate),
91
+ smartRestart: rel(hooks.smartRestart),
92
+ };
93
+ }
94
+ //# sourceMappingURL=runtime-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-paths.js","sourceRoot":"","sources":["../../src/paths/runtime-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAsB,MAAM,qBAAqB,CAAC;AAI7E,0EAA0E;AAC1E,MAAM,wBAAwB,GAAG,KAAK,CAAC;AACvC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAErC,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,MAAM,GAAG,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,kBAAkB,CAAC,OAAoB,EAAE,SAAiB;IACxE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC;IACnD,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC1C,OAAO,GAAG,IAAI,IAAI,gBAAgB,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,iBAAiB,CAAC,OAAoB,EAAE,SAAiB;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAM,EAAE,SAAS,IAAI,WAAW,CAAC;IAC/C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,MAAM,EAAE,IAAI,IAAI,wBAAwB,CAAC;IAClD,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,EAAE,QAAQ,IAAI,wBAAwB,CAAC;IAC1D,MAAM,KAAK,GAAG,MAAM,EAAE,SAAS,IAAI,yBAAyB,CAAC;IAC7D,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;IACpE,OAAO,IAAI,GAAG,MAAM,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAoB,EAAE,SAAiB;IACrE,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,IAAI,SAAS,CAAC;IAChD,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,oBAAoB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACvE,OAAO,GAAG,CAAC;AACb,CAAC;AAwBD,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,QAAQ,CAAC;IACrE,OAAO;QACL,QAAQ;QACR,SAAS;QACT,UAAU;QACV,cAAc;QACd,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;QAC/C,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;QAC7C,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC;QACvD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC;QACpD,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;QAC/C,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC;QACtD,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC;QACtD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC;QACpD,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC;QACvD,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC;QAChD,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC;QAC1D,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;QAC5C,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC;QAC7C,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC;QACvD,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,OAAe;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AACtD,CAAC;AASD,wFAAwF;AACxF,MAAM,UAAU,wBAAwB,CACtC,OAAoB,EACpB,SAAiB;IAEjB,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;IAClC,IAAI,CAAC,IAAI,EAAE,OAAO;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,GAAG,GAAG,CAAC,CAAU,EAAE,EAAE;QACzB,IAAI,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QACzB,MAAM,GAAG,GAAG,oBAAoB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC/C,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACxC,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;QACzB,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;QACzB,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC;KACtC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=runtime-paths.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-paths.test.d.ts","sourceRoot":"","sources":["../../src/paths/runtime-paths.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import path from "node:path";
3
+ import { meshRuntimePaths, resolveDaemonPort, resolveSessionName, workspaceScopeId, } from "./runtime-paths.js";
4
+ function stubProfile(overrides = {}) {
5
+ return {
6
+ name: "test",
7
+ workspace: ".",
8
+ session: {
9
+ name: "mesh",
10
+ scope: "workspace",
11
+ idLength: 6,
12
+ workerCount: 4,
13
+ miniMax: 4,
14
+ },
15
+ seats: { root: "seats", templates: ["FOCUS"], dirs: {} },
16
+ state: { agentsJson: "a.json", meshAgentsJson: "m.json" },
17
+ roles: { dir: "roles" },
18
+ providers: ["empty"],
19
+ ...overrides,
20
+ };
21
+ }
22
+ function stubLoaded(workspace, profile = stubProfile()) {
23
+ const workspaceId = workspaceScopeId(workspace);
24
+ return {
25
+ profile,
26
+ profileDir: "/tmp/profile",
27
+ profilePath: "/tmp/profile/mesh.config.yaml",
28
+ workspace,
29
+ workspaceId,
30
+ sessionName: resolveSessionName(profile, workspace),
31
+ };
32
+ }
33
+ describe("workspaceScopeId", () => {
34
+ it("is stable for the same path", () => {
35
+ const ws = "/tmp/my-project";
36
+ expect(workspaceScopeId(ws)).toBe(workspaceScopeId(ws));
37
+ });
38
+ it("differs across projects", () => {
39
+ expect(workspaceScopeId("/tmp/a")).not.toBe(workspaceScopeId("/tmp/b"));
40
+ });
41
+ });
42
+ describe("resolveSessionName", () => {
43
+ it("suffixes workspace hash by default", () => {
44
+ const ws = "/tmp/my-project";
45
+ const name = resolveSessionName(stubProfile(), ws);
46
+ expect(name).toMatch(/^mesh-[a-f0-9]{6}$/);
47
+ expect(name).toBe(`mesh-${workspaceScopeId(ws)}`);
48
+ });
49
+ it("returns base name when scope global", () => {
50
+ const p = stubProfile({ session: { ...stubProfile().session, scope: "global" } });
51
+ expect(resolveSessionName(p, "/tmp/x")).toBe("mesh");
52
+ });
53
+ });
54
+ describe("resolveDaemonPort", () => {
55
+ it("offsets port per workspace by default", () => {
56
+ const p = stubProfile();
57
+ const portA = resolveDaemonPort(p, "/tmp/project-a");
58
+ const portB = resolveDaemonPort(p, "/tmp/project-b");
59
+ expect(portA).toBeGreaterThanOrEqual(31670);
60
+ expect(portA).toBeLessThan(31670 + 90);
61
+ expect(portA).not.toBe(portB);
62
+ });
63
+ it("uses fixed port when portScope profile", () => {
64
+ const p = stubProfile({
65
+ daemon: { port: 3200, portScope: "profile" },
66
+ });
67
+ expect(resolveDaemonPort(p, "/tmp/a")).toBe(3200);
68
+ expect(resolveDaemonPort(p, "/tmp/b")).toBe(3200);
69
+ });
70
+ });
71
+ describe("meshRuntimePaths", () => {
72
+ it("places daemon under profileDir data.root when scope=profile", () => {
73
+ const profile = stubProfile({
74
+ paths: { scope: "profile" },
75
+ data: { root: "runtime" },
76
+ });
77
+ const loaded = stubLoaded("/tmp/ws", profile);
78
+ loaded.profileDir = "/tmp/profile";
79
+ const rt = meshRuntimePaths(loaded);
80
+ expect(rt.daemonDir).toBe(path.join("/tmp/profile", "runtime", "daemon"));
81
+ expect(rt.sqlitePath).toBe(path.join("/tmp/profile", "runtime", "mesh.sqlite"));
82
+ expect(rt.storageBackend).toBe("sqlite");
83
+ expect(rt.minisJson).toBe(path.join("/tmp/profile", "runtime", "minis.json"));
84
+ });
85
+ });
86
+ //# sourceMappingURL=runtime-paths.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-paths.test.js","sourceRoot":"","sources":["../../src/paths/runtime-paths.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAI5B,SAAS,WAAW,CAAC,YAAkC,EAAE;IACvD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,GAAG;QACd,OAAO,EAAE;YACP,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,CAAC;YACX,WAAW,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;SACX;QACD,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAkC,EAAE;QACxF,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE;QACzD,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;QACvB,SAAS,EAAE,CAAC,OAAO,CAAC;QACpB,GAAG,SAAS;KACE,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,SAAiB,EAAE,OAAO,GAAG,WAAW,EAAE;IAC5D,MAAM,WAAW,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAChD,OAAO;QACL,OAAO;QACP,UAAU,EAAE,cAAc;QAC1B,WAAW,EAAE,+BAA+B;QAC5C,SAAS;QACT,WAAW;QACX,WAAW,EAAE,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC;KACpD,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,EAAE,GAAG,iBAAiB,CAAC;QAC7B,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,EAAE,GAAG,iBAAiB,CAAC;QAC7B,MAAM,IAAI,GAAG,kBAAkB,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,WAAW,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClF,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,GAAG,WAAW,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,GAAG,WAAW,CAAC;YACpB,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE;SACrB,CAAC,CAAC;QAC3B,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,OAAO,GAAG,WAAW,CAAC;YAC1B,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;YAC3B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SAC1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,UAAU,GAAG,cAAc,CAAC;QACnC,MAAM,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1E,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;QAChF,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { LoadedProfile } from "./profile.js";
2
+ /**
3
+ * Programmatic edits to `mesh.config.yaml`'s `layout.base.columns` (+ the optional
4
+ * per-column `cli` / `humanCoTyped` maps). N managers/secretaries are config, not
5
+ * an enum (see docs/ARCHITECTURE.md "Coordinator columns") -- these helpers are the
6
+ * one supported way to add/remove a column so nobody hand-edits the yaml array or
7
+ * cargo-cults a per-instance `seats.dirs` entry that `seatDirSegment` already
8
+ * defaults to identity for.
9
+ */
10
+ export interface AddColumnOptions {
11
+ /** CLI provider override for this column (default: agent, or opencode for secretary-kind). */
12
+ cli?: string;
13
+ /** Insert immediately after this existing column id (default: append at end). */
14
+ after?: string;
15
+ /** Add to `layout.base.humanCoTyped` (daemon queues injects while the human types). */
16
+ coTyped?: boolean;
17
+ }
18
+ export interface ColumnEditResult {
19
+ id: string;
20
+ columns: string[];
21
+ profilePath: string;
22
+ }
23
+ export declare function addBaseColumn(loaded: LoadedProfile, rawId: string, opts?: AddColumnOptions): ColumnEditResult;
24
+ export declare function removeBaseColumn(loaded: LoadedProfile, rawId: string): ColumnEditResult;
25
+ export declare function listBaseColumns(loaded: LoadedProfile): string[];
26
+ //# sourceMappingURL=profile-edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-edit.d.ts","sourceRoot":"","sources":["../../src/profile/profile-edit.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD;;;;;;;GAOG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,8FAA8F;IAC9F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uFAAuF;IACvF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAwBD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,gBAAqB,GAC1B,gBAAgB,CAmClB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAyBvF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAG/D"}
@@ -0,0 +1,87 @@
1
+ import fs from "node:fs";
2
+ import YAML from "yaml";
3
+ import { COLUMN_ID_RE } from "../schema/seat-kind.js";
4
+ function normalizeId(id) {
5
+ const trimmed = id.trim().toLowerCase();
6
+ if (!COLUMN_ID_RE.test(trimmed)) {
7
+ throw new Error(`bad column id: ${id} (want ${COLUMN_ID_RE})`);
8
+ }
9
+ return trimmed;
10
+ }
11
+ function readColumnsSeq(doc) {
12
+ const columns = doc.getIn(["layout", "base", "columns"]);
13
+ if (!YAML.isSeq(columns)) {
14
+ throw new Error("layout.base.columns missing or not a sequence in profile yaml");
15
+ }
16
+ return columns;
17
+ }
18
+ function seqStrings(seq) {
19
+ return seq.items.map((n) => String(YAML.isScalar(n) ? n.value : n));
20
+ }
21
+ const MAX_BASE_COLUMNS = 128;
22
+ export function addBaseColumn(loaded, rawId, opts = {}) {
23
+ const id = normalizeId(rawId);
24
+ const doc = YAML.parseDocument(fs.readFileSync(loaded.profilePath, "utf8"));
25
+ const columns = readColumnsSeq(doc);
26
+ const existing = seqStrings(columns);
27
+ if (existing.includes(id))
28
+ throw new Error(`column already exists: ${id}`);
29
+ if (existing.length >= MAX_BASE_COLUMNS) {
30
+ throw new Error(`base columns at max (${MAX_BASE_COLUMNS})`);
31
+ }
32
+ let insertAt = columns.items.length;
33
+ if (opts.after) {
34
+ const afterId = normalizeId(opts.after);
35
+ const idx = existing.indexOf(afterId);
36
+ if (idx === -1)
37
+ throw new Error(`--after column not found: ${afterId}`);
38
+ insertAt = idx + 1;
39
+ }
40
+ columns.items.splice(insertAt, 0, doc.createNode(id));
41
+ if (opts.cli) {
42
+ doc.setIn(["layout", "base", "cli", id], opts.cli);
43
+ }
44
+ if (opts.coTyped) {
45
+ const coTyped = doc.getIn(["layout", "base", "humanCoTyped"]);
46
+ if (YAML.isSeq(coTyped)) {
47
+ if (!seqStrings(coTyped).includes(id))
48
+ coTyped.items.push(doc.createNode(id));
49
+ }
50
+ else {
51
+ doc.setIn(["layout", "base", "humanCoTyped"], [id]);
52
+ }
53
+ }
54
+ fs.writeFileSync(loaded.profilePath, doc.toString());
55
+ return { id, columns: seqStrings(readColumnsSeq(doc)), profilePath: loaded.profilePath };
56
+ }
57
+ export function removeBaseColumn(loaded, rawId) {
58
+ const id = normalizeId(rawId);
59
+ const doc = YAML.parseDocument(fs.readFileSync(loaded.profilePath, "utf8"));
60
+ const columns = readColumnsSeq(doc);
61
+ const existing = seqStrings(columns);
62
+ const idx = existing.indexOf(id);
63
+ if (idx === -1)
64
+ throw new Error(`column not found: ${id}`);
65
+ if (columns.items.length <= 1)
66
+ throw new Error("cannot remove the last base column");
67
+ columns.items.splice(idx, 1);
68
+ const cli = doc.getIn(["layout", "base", "cli"]);
69
+ if (YAML.isMap(cli))
70
+ cli.delete(id);
71
+ const coTyped = doc.getIn(["layout", "base", "humanCoTyped"]);
72
+ if (YAML.isSeq(coTyped)) {
73
+ const hIdx = seqStrings(coTyped).indexOf(id);
74
+ if (hIdx !== -1)
75
+ coTyped.items.splice(hIdx, 1);
76
+ }
77
+ const dirs = doc.getIn(["seats", "dirs"]);
78
+ if (YAML.isMap(dirs))
79
+ dirs.delete(id);
80
+ fs.writeFileSync(loaded.profilePath, doc.toString());
81
+ return { id, columns: existing.filter((c) => c !== id), profilePath: loaded.profilePath };
82
+ }
83
+ export function listBaseColumns(loaded) {
84
+ const doc = YAML.parseDocument(fs.readFileSync(loaded.profilePath, "utf8"));
85
+ return seqStrings(readColumnsSeq(doc));
86
+ }
87
+ //# sourceMappingURL=profile-edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-edit.js","sourceRoot":"","sources":["../../src/profile/profile-edit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=profile-edit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-edit.test.d.ts","sourceRoot":"","sources":["../../src/profile/profile-edit.test.ts"],"names":[],"mappings":""}