@pleri/olam-cli 0.1.120 → 0.1.126
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/commands/bootstrap.d.ts +4 -0
- package/dist/commands/bootstrap.d.ts.map +1 -1
- package/dist/commands/bootstrap.js +64 -0
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +43 -0
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/mcp/install-shared.d.ts +2 -0
- package/dist/commands/mcp/install-shared.d.ts.map +1 -1
- package/dist/commands/mcp/install-shared.js +13 -0
- package/dist/commands/mcp/install-shared.js.map +1 -1
- package/dist/commands/mcp/uninstall.d.ts.map +1 -1
- package/dist/commands/mcp/uninstall.js +1 -10
- package/dist/commands/mcp/uninstall.js.map +1 -1
- package/dist/commands/memory/_paths.d.ts +15 -0
- package/dist/commands/memory/_paths.d.ts.map +1 -0
- package/dist/commands/memory/_paths.js +34 -0
- package/dist/commands/memory/_paths.js.map +1 -0
- package/dist/commands/memory/index.d.ts +17 -0
- package/dist/commands/memory/index.d.ts.map +1 -0
- package/dist/commands/memory/index.js +34 -0
- package/dist/commands/memory/index.js.map +1 -0
- package/dist/commands/memory/install.d.ts +57 -0
- package/dist/commands/memory/install.d.ts.map +1 -0
- package/dist/commands/memory/install.js +114 -0
- package/dist/commands/memory/install.js.map +1 -0
- package/dist/commands/memory/logs.d.ts +15 -0
- package/dist/commands/memory/logs.d.ts.map +1 -0
- package/dist/commands/memory/logs.js +45 -0
- package/dist/commands/memory/logs.js.map +1 -0
- package/dist/commands/memory/secret.d.ts +16 -0
- package/dist/commands/memory/secret.d.ts.map +1 -0
- package/dist/commands/memory/secret.js +79 -0
- package/dist/commands/memory/secret.js.map +1 -0
- package/dist/commands/memory/start.d.ts +23 -0
- package/dist/commands/memory/start.d.ts.map +1 -0
- package/dist/commands/memory/start.js +166 -0
- package/dist/commands/memory/start.js.map +1 -0
- package/dist/commands/memory/status.d.ts +25 -0
- package/dist/commands/memory/status.d.ts.map +1 -0
- package/dist/commands/memory/status.js +101 -0
- package/dist/commands/memory/status.js.map +1 -0
- package/dist/commands/memory/stop.d.ts +12 -0
- package/dist/commands/memory/stop.d.ts.map +1 -0
- package/dist/commands/memory/stop.js +81 -0
- package/dist/commands/memory/stop.js.map +1 -0
- package/dist/commands/memory/uninstall.d.ts +19 -0
- package/dist/commands/memory/uninstall.d.ts.map +1 -0
- package/dist/commands/memory/uninstall.js +60 -0
- package/dist/commands/memory/uninstall.js.map +1 -0
- package/dist/commands/seed.d.ts +27 -0
- package/dist/commands/seed.d.ts.map +1 -0
- package/dist/commands/seed.js +303 -0
- package/dist/commands/seed.js.map +1 -0
- package/dist/image-digests.json +3 -3
- package/dist/index.js +1835 -259
- package/dist/index.js.map +1 -1
- package/dist/lib/memory-secret.d.ts +48 -0
- package/dist/lib/memory-secret.d.ts.map +1 -0
- package/dist/lib/memory-secret.js +92 -0
- package/dist/lib/memory-secret.js.map +1 -0
- package/dist/lib/world-mcp-register.d.ts +98 -0
- package/dist/lib/world-mcp-register.d.ts.map +1 -0
- package/dist/lib/world-mcp-register.js +117 -0
- package/dist/lib/world-mcp-register.js.map +1 -0
- package/dist/mcp-server.js +502 -65
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for the agent-memory bearer secret at `~/.olam/memory-secret`.
|
|
3
|
+
*
|
|
4
|
+
* Pattern mirrors `~/.olam/auth-secret`:
|
|
5
|
+
* - 0600 mode enforced on every write
|
|
6
|
+
* - atomic write via tmp + rename
|
|
7
|
+
* - generated on first call to `ensureMemorySecret()`
|
|
8
|
+
*
|
|
9
|
+
* Phase C's `cloud-memory-secret` reuses the path-arg form
|
|
10
|
+
* (`ensureSecretAtPath` / `readSecretAtPath`) so local + cloud share
|
|
11
|
+
* the same code path.
|
|
12
|
+
*
|
|
13
|
+
* Plan reference: docs/plans/olam-agent-memory-distributed/phase-a-tasks.md A3
|
|
14
|
+
*/
|
|
15
|
+
export declare const MEMORY_SECRET_PATH: string;
|
|
16
|
+
export declare const SECRET_LEN_BYTES = 32;
|
|
17
|
+
/** Generate a 64-char hex secret. */
|
|
18
|
+
export declare function generateSecret(): string;
|
|
19
|
+
/**
|
|
20
|
+
* Write `value` to `path` atomically with mode 0600. Parent directory
|
|
21
|
+
* created with default mode if absent.
|
|
22
|
+
*/
|
|
23
|
+
export declare function writeSecretAtPath(path: string, value: string): void;
|
|
24
|
+
/**
|
|
25
|
+
* Read `path` as a string. Returns `null` if missing. Warns to stderr
|
|
26
|
+
* if mode is not 0600 (caller decides whether to proceed).
|
|
27
|
+
*/
|
|
28
|
+
export declare function readSecretAtPathOrNull(path: string): string | null;
|
|
29
|
+
/** Read `path` or throw if missing. */
|
|
30
|
+
export declare function readSecretAtPath(path: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Ensure `~/.olam/memory-secret` exists with mode 0600. Generates a
|
|
33
|
+
* fresh 64-char hex secret on first call. Idempotent.
|
|
34
|
+
*/
|
|
35
|
+
export declare function ensureMemorySecret(path?: string): string;
|
|
36
|
+
/** Read the local-mode memory secret (no-throw shape). */
|
|
37
|
+
export declare function readMemorySecretOrNull(path?: string): string | null;
|
|
38
|
+
/** Read the local-mode memory secret (throw shape). */
|
|
39
|
+
export declare function readMemorySecret(path?: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* Rotate the secret: generate fresh value, atomically replace the file,
|
|
42
|
+
* return the new value. Caller is responsible for restarting any
|
|
43
|
+
* running memory service so it picks up the new value.
|
|
44
|
+
*/
|
|
45
|
+
export declare function rotateMemorySecret(path?: string): string;
|
|
46
|
+
/** Convenience: are we wired for local-mode memory? */
|
|
47
|
+
export declare function hasMemorySecret(path?: string): boolean;
|
|
48
|
+
//# sourceMappingURL=memory-secret.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-secret.d.ts","sourceRoot":"","sources":["../../src/lib/memory-secret.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,eAAO,MAAM,kBAAkB,QAA4C,CAAC;AAC5E,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,qCAAqC;AACrC,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAOnE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASlE;AAED,uCAAuC;AACvC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQrD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,MAA2B,GAAG,MAAM,CAM5E;AAED,0DAA0D;AAC1D,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,MAA2B,GAAG,MAAM,GAAG,IAAI,CAEvF;AAED,uDAAuD;AACvD,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAA2B,GAAG,MAAM,CAE1E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,MAA2B,GAAG,MAAM,CAI5E;AAED,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,IAAI,GAAE,MAA2B,GAAG,OAAO,CAE1E"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for the agent-memory bearer secret at `~/.olam/memory-secret`.
|
|
3
|
+
*
|
|
4
|
+
* Pattern mirrors `~/.olam/auth-secret`:
|
|
5
|
+
* - 0600 mode enforced on every write
|
|
6
|
+
* - atomic write via tmp + rename
|
|
7
|
+
* - generated on first call to `ensureMemorySecret()`
|
|
8
|
+
*
|
|
9
|
+
* Phase C's `cloud-memory-secret` reuses the path-arg form
|
|
10
|
+
* (`ensureSecretAtPath` / `readSecretAtPath`) so local + cloud share
|
|
11
|
+
* the same code path.
|
|
12
|
+
*
|
|
13
|
+
* Plan reference: docs/plans/olam-agent-memory-distributed/phase-a-tasks.md A3
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync, renameSync, unlinkSync, chmodSync } from 'node:fs';
|
|
16
|
+
import { homedir } from 'node:os';
|
|
17
|
+
import { join, dirname } from 'node:path';
|
|
18
|
+
import { randomBytes } from 'node:crypto';
|
|
19
|
+
export const MEMORY_SECRET_PATH = join(homedir(), '.olam', 'memory-secret');
|
|
20
|
+
export const SECRET_LEN_BYTES = 32; // 64 hex chars
|
|
21
|
+
/** Generate a 64-char hex secret. */
|
|
22
|
+
export function generateSecret() {
|
|
23
|
+
return randomBytes(SECRET_LEN_BYTES).toString('hex');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Write `value` to `path` atomically with mode 0600. Parent directory
|
|
27
|
+
* created with default mode if absent.
|
|
28
|
+
*/
|
|
29
|
+
export function writeSecretAtPath(path, value) {
|
|
30
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
31
|
+
const tmp = `${path}.tmp.${process.pid}`;
|
|
32
|
+
writeFileSync(tmp, value, { mode: 0o600 });
|
|
33
|
+
// writeFileSync's mode is umask-respecting; chmod explicitly to be safe.
|
|
34
|
+
chmodSync(tmp, 0o600);
|
|
35
|
+
renameSync(tmp, path);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Read `path` as a string. Returns `null` if missing. Warns to stderr
|
|
39
|
+
* if mode is not 0600 (caller decides whether to proceed).
|
|
40
|
+
*/
|
|
41
|
+
export function readSecretAtPathOrNull(path) {
|
|
42
|
+
if (!existsSync(path))
|
|
43
|
+
return null;
|
|
44
|
+
const mode = statSync(path).mode & 0o777;
|
|
45
|
+
if (mode !== 0o600) {
|
|
46
|
+
process.stderr.write(`warn: ${path} has mode 0${mode.toString(8)}; expected 0600. Run 'olam memory secret rotate' to regenerate.\n`);
|
|
47
|
+
}
|
|
48
|
+
return readFileSync(path, 'utf8').trim();
|
|
49
|
+
}
|
|
50
|
+
/** Read `path` or throw if missing. */
|
|
51
|
+
export function readSecretAtPath(path) {
|
|
52
|
+
const v = readSecretAtPathOrNull(path);
|
|
53
|
+
if (v === null) {
|
|
54
|
+
throw new Error(`Secret not found at ${path}. Run 'olam memory start' to generate it.`);
|
|
55
|
+
}
|
|
56
|
+
return v;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Ensure `~/.olam/memory-secret` exists with mode 0600. Generates a
|
|
60
|
+
* fresh 64-char hex secret on first call. Idempotent.
|
|
61
|
+
*/
|
|
62
|
+
export function ensureMemorySecret(path = MEMORY_SECRET_PATH) {
|
|
63
|
+
const existing = readSecretAtPathOrNull(path);
|
|
64
|
+
if (existing)
|
|
65
|
+
return existing;
|
|
66
|
+
const fresh = generateSecret();
|
|
67
|
+
writeSecretAtPath(path, fresh);
|
|
68
|
+
return fresh;
|
|
69
|
+
}
|
|
70
|
+
/** Read the local-mode memory secret (no-throw shape). */
|
|
71
|
+
export function readMemorySecretOrNull(path = MEMORY_SECRET_PATH) {
|
|
72
|
+
return readSecretAtPathOrNull(path);
|
|
73
|
+
}
|
|
74
|
+
/** Read the local-mode memory secret (throw shape). */
|
|
75
|
+
export function readMemorySecret(path = MEMORY_SECRET_PATH) {
|
|
76
|
+
return readSecretAtPath(path);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Rotate the secret: generate fresh value, atomically replace the file,
|
|
80
|
+
* return the new value. Caller is responsible for restarting any
|
|
81
|
+
* running memory service so it picks up the new value.
|
|
82
|
+
*/
|
|
83
|
+
export function rotateMemorySecret(path = MEMORY_SECRET_PATH) {
|
|
84
|
+
const fresh = generateSecret();
|
|
85
|
+
writeSecretAtPath(path, fresh);
|
|
86
|
+
return fresh;
|
|
87
|
+
}
|
|
88
|
+
/** Convenience: are we wired for local-mode memory? */
|
|
89
|
+
export function hasMemorySecret(path = MEMORY_SECRET_PATH) {
|
|
90
|
+
return existsSync(path);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=memory-secret.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-secret.js","sourceRoot":"","sources":["../../src/lib/memory-secret.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-world MCP registration helper.
|
|
3
|
+
*
|
|
4
|
+
* After `olam create` spawns a fresh world container, we register the
|
|
5
|
+
* agentmemory MCP server inside that world's claude config so the
|
|
6
|
+
* in-world claude session reaches the host-side agent-memory service
|
|
7
|
+
* without manual `claude mcp add` from the operator.
|
|
8
|
+
*
|
|
9
|
+
* Architecture:
|
|
10
|
+
*
|
|
11
|
+
* host docker exec world container
|
|
12
|
+
* ---- ---------- ---------------
|
|
13
|
+
* olam create ─► docker exec ─► claude mcp add agentmemory
|
|
14
|
+
* --scope user
|
|
15
|
+
* --env AGENTMEMORY_URL=...
|
|
16
|
+
* --env AGENTMEMORY_SECRET=...
|
|
17
|
+
* -- agentmemory-mcp
|
|
18
|
+
*
|
|
19
|
+
* The `agentmemory-mcp` bin is pre-baked into the devbox image (B2), so
|
|
20
|
+
* there's no `npx -y` cold-start at first claude invocation (T6).
|
|
21
|
+
*
|
|
22
|
+
* Idempotency: re-running against an already-registered world is a noop.
|
|
23
|
+
* We detect via `claude mcp list` exit code + stderr signature (same
|
|
24
|
+
* "No <scope> MCP server found" pattern reused from the host-side
|
|
25
|
+
* `olam memory uninstall` helper).
|
|
26
|
+
*
|
|
27
|
+
* Graceful skip: when the world wasn't spawned with AGENTMEMORY_* env
|
|
28
|
+
* (because the host memory service was absent at spawn time per B1),
|
|
29
|
+
* we skip registration with an informative log. The world keeps working
|
|
30
|
+
* — the @agentmemory/mcp shim falls back to local InMemoryKV.
|
|
31
|
+
*
|
|
32
|
+
* Plan reference: docs/plans/olam-agent-memory-distributed/phase-b-tasks.md B3
|
|
33
|
+
*/
|
|
34
|
+
import { type SpawnSyncReturns } from 'node:child_process';
|
|
35
|
+
/** Inject points for tests. */
|
|
36
|
+
export interface DockerExecDeps {
|
|
37
|
+
/** Wrap spawnSync so tests can stub claude/docker calls. */
|
|
38
|
+
spawn: (cmd: string, args: string[], opts: {
|
|
39
|
+
encoding: 'utf8';
|
|
40
|
+
stdio: ['ignore', 'pipe', 'pipe'];
|
|
41
|
+
}) => SpawnSyncReturns<string>;
|
|
42
|
+
/** Optional logger; defaults to console.log. */
|
|
43
|
+
log?: (msg: string) => void;
|
|
44
|
+
}
|
|
45
|
+
export declare const DEFAULT_DOCKER_EXEC_DEPS: DockerExecDeps;
|
|
46
|
+
/**
|
|
47
|
+
* Result shape — `outcome` is the load-bearing field. Callers use it to
|
|
48
|
+
* decide whether to print a success line vs. a graceful-skip notice.
|
|
49
|
+
*/
|
|
50
|
+
export type RegisterOutcome = {
|
|
51
|
+
outcome: 'registered';
|
|
52
|
+
scope: 'user';
|
|
53
|
+
} | {
|
|
54
|
+
outcome: 'already-registered';
|
|
55
|
+
scope: 'user';
|
|
56
|
+
} | {
|
|
57
|
+
outcome: 'skipped-no-env';
|
|
58
|
+
reason: string;
|
|
59
|
+
} | {
|
|
60
|
+
outcome: 'failed';
|
|
61
|
+
rc: number;
|
|
62
|
+
detail: string;
|
|
63
|
+
};
|
|
64
|
+
export interface RegisterAgentMemoryMcpOpts {
|
|
65
|
+
/** Full container name, e.g. `olam-<world-id>-devbox`. */
|
|
66
|
+
containerName: string;
|
|
67
|
+
/** The AGENTMEMORY_URL value that was injected at world spawn (B1). */
|
|
68
|
+
agentmemoryUrl: string;
|
|
69
|
+
/** The AGENTMEMORY_SECRET value that was injected at world spawn (B1). */
|
|
70
|
+
agentmemorySecret: string;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Probe whether `agentmemory` is already registered inside the world's
|
|
74
|
+
* claude. Uses `claude mcp list` which prints a structured list; we
|
|
75
|
+
* just look for the name in the output. Returns:
|
|
76
|
+
* - `'present'` — already registered (idempotent skip path)
|
|
77
|
+
* - `'absent'` — not registered yet (proceed to add)
|
|
78
|
+
* - `'unknown'` — `claude mcp list` failed for any reason; we don't
|
|
79
|
+
* pretend to know the state, caller decides.
|
|
80
|
+
*/
|
|
81
|
+
export declare function probeMcpListed(containerName: string, deps: DockerExecDeps): 'present' | 'absent' | 'unknown';
|
|
82
|
+
/**
|
|
83
|
+
* Register the agentmemory MCP server inside a world container.
|
|
84
|
+
*
|
|
85
|
+
* - Skips silently when `agentmemorySecret` is empty (the world was
|
|
86
|
+
* spawned without B1's env injection because the host memory service
|
|
87
|
+
* was absent at spawn time).
|
|
88
|
+
* - Skips idempotently when `claude mcp list` already shows the server.
|
|
89
|
+
* - Otherwise shells to `docker exec <world> claude mcp add agentmemory
|
|
90
|
+
* --scope user --env ... -- agentmemory-mcp`.
|
|
91
|
+
*
|
|
92
|
+
* The bearer secret transits as an argv element of the spawned `claude`
|
|
93
|
+
* process inside the container (same shape as the host-side
|
|
94
|
+
* `olam memory install`). Documented in the operator-facing
|
|
95
|
+
* docs/architecture/agent-memory.md security model.
|
|
96
|
+
*/
|
|
97
|
+
export declare function registerAgentMemoryMcp(opts: RegisterAgentMemoryMcpOpts, deps?: DockerExecDeps): RegisterOutcome;
|
|
98
|
+
//# sourceMappingURL=world-mcp-register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"world-mcp-register.d.ts","sourceRoot":"","sources":["../../src/lib/world-mcp-register.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtE,+BAA+B;AAC/B,MAAM,WAAW,cAAc;IAC7B,4DAA4D;IAC5D,KAAK,EAAE,CACL,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,KAC1D,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC9B,gDAAgD;IAChD,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,eAAO,MAAM,wBAAwB,EAAE,cAGtC,CAAC;AAKF;;;GAGG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,OAAO,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,OAAO,EAAE,oBAAoB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,OAAO,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,OAAO,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD,MAAM,WAAW,0BAA0B;IACzC,0DAA0D;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,cAAc,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,cAAc,GACnB,SAAS,GAAG,QAAQ,GAAG,SAAS,CAYlC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,0BAA0B,EAChC,IAAI,GAAE,cAAyC,GAC9C,eAAe,CAoDjB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-world MCP registration helper.
|
|
3
|
+
*
|
|
4
|
+
* After `olam create` spawns a fresh world container, we register the
|
|
5
|
+
* agentmemory MCP server inside that world's claude config so the
|
|
6
|
+
* in-world claude session reaches the host-side agent-memory service
|
|
7
|
+
* without manual `claude mcp add` from the operator.
|
|
8
|
+
*
|
|
9
|
+
* Architecture:
|
|
10
|
+
*
|
|
11
|
+
* host docker exec world container
|
|
12
|
+
* ---- ---------- ---------------
|
|
13
|
+
* olam create ─► docker exec ─► claude mcp add agentmemory
|
|
14
|
+
* --scope user
|
|
15
|
+
* --env AGENTMEMORY_URL=...
|
|
16
|
+
* --env AGENTMEMORY_SECRET=...
|
|
17
|
+
* -- agentmemory-mcp
|
|
18
|
+
*
|
|
19
|
+
* The `agentmemory-mcp` bin is pre-baked into the devbox image (B2), so
|
|
20
|
+
* there's no `npx -y` cold-start at first claude invocation (T6).
|
|
21
|
+
*
|
|
22
|
+
* Idempotency: re-running against an already-registered world is a noop.
|
|
23
|
+
* We detect via `claude mcp list` exit code + stderr signature (same
|
|
24
|
+
* "No <scope> MCP server found" pattern reused from the host-side
|
|
25
|
+
* `olam memory uninstall` helper).
|
|
26
|
+
*
|
|
27
|
+
* Graceful skip: when the world wasn't spawned with AGENTMEMORY_* env
|
|
28
|
+
* (because the host memory service was absent at spawn time per B1),
|
|
29
|
+
* we skip registration with an informative log. The world keeps working
|
|
30
|
+
* — the @agentmemory/mcp shim falls back to local InMemoryKV.
|
|
31
|
+
*
|
|
32
|
+
* Plan reference: docs/plans/olam-agent-memory-distributed/phase-b-tasks.md B3
|
|
33
|
+
*/
|
|
34
|
+
import { spawnSync } from 'node:child_process';
|
|
35
|
+
export const DEFAULT_DOCKER_EXEC_DEPS = {
|
|
36
|
+
spawn: spawnSync,
|
|
37
|
+
log: (msg) => console.log(msg),
|
|
38
|
+
};
|
|
39
|
+
const MCP_NAME = 'agentmemory';
|
|
40
|
+
const MCP_BIN = 'agentmemory-mcp';
|
|
41
|
+
/**
|
|
42
|
+
* Probe whether `agentmemory` is already registered inside the world's
|
|
43
|
+
* claude. Uses `claude mcp list` which prints a structured list; we
|
|
44
|
+
* just look for the name in the output. Returns:
|
|
45
|
+
* - `'present'` — already registered (idempotent skip path)
|
|
46
|
+
* - `'absent'` — not registered yet (proceed to add)
|
|
47
|
+
* - `'unknown'` — `claude mcp list` failed for any reason; we don't
|
|
48
|
+
* pretend to know the state, caller decides.
|
|
49
|
+
*/
|
|
50
|
+
export function probeMcpListed(containerName, deps) {
|
|
51
|
+
const result = deps.spawn('docker', ['exec', containerName, 'claude', 'mcp', 'list'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
|
|
52
|
+
if (result.status !== 0)
|
|
53
|
+
return 'unknown';
|
|
54
|
+
const combined = `${result.stdout ?? ''}\n${result.stderr ?? ''}`;
|
|
55
|
+
// `claude mcp list` prints one row per registered server. Match on
|
|
56
|
+
// the name at the start of a line to avoid false positives from
|
|
57
|
+
// descriptive prose.
|
|
58
|
+
return new RegExp(`^\\s*${MCP_NAME}\\b`, 'm').test(combined) ? 'present' : 'absent';
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Register the agentmemory MCP server inside a world container.
|
|
62
|
+
*
|
|
63
|
+
* - Skips silently when `agentmemorySecret` is empty (the world was
|
|
64
|
+
* spawned without B1's env injection because the host memory service
|
|
65
|
+
* was absent at spawn time).
|
|
66
|
+
* - Skips idempotently when `claude mcp list` already shows the server.
|
|
67
|
+
* - Otherwise shells to `docker exec <world> claude mcp add agentmemory
|
|
68
|
+
* --scope user --env ... -- agentmemory-mcp`.
|
|
69
|
+
*
|
|
70
|
+
* The bearer secret transits as an argv element of the spawned `claude`
|
|
71
|
+
* process inside the container (same shape as the host-side
|
|
72
|
+
* `olam memory install`). Documented in the operator-facing
|
|
73
|
+
* docs/architecture/agent-memory.md security model.
|
|
74
|
+
*/
|
|
75
|
+
export function registerAgentMemoryMcp(opts, deps = DEFAULT_DOCKER_EXEC_DEPS) {
|
|
76
|
+
if (!opts.agentmemorySecret || opts.agentmemorySecret.length === 0) {
|
|
77
|
+
return {
|
|
78
|
+
outcome: 'skipped-no-env',
|
|
79
|
+
reason: 'world has no AGENTMEMORY_SECRET (memory service was absent or --skip-memory active at spawn time)',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const probe = probeMcpListed(opts.containerName, deps);
|
|
83
|
+
if (probe === 'present') {
|
|
84
|
+
return { outcome: 'already-registered', scope: 'user' };
|
|
85
|
+
}
|
|
86
|
+
const args = [
|
|
87
|
+
'exec',
|
|
88
|
+
opts.containerName,
|
|
89
|
+
'claude',
|
|
90
|
+
'mcp',
|
|
91
|
+
'add',
|
|
92
|
+
MCP_NAME,
|
|
93
|
+
'--scope',
|
|
94
|
+
'user',
|
|
95
|
+
'--env',
|
|
96
|
+
`AGENTMEMORY_URL=${opts.agentmemoryUrl}`,
|
|
97
|
+
'--env',
|
|
98
|
+
`AGENTMEMORY_SECRET=${opts.agentmemorySecret}`,
|
|
99
|
+
'--',
|
|
100
|
+
MCP_BIN,
|
|
101
|
+
];
|
|
102
|
+
// Log without leaking the secret. Same redaction pattern as
|
|
103
|
+
// packages/cli/src/commands/memory/install.ts.
|
|
104
|
+
const redacted = args.map((a) => a.startsWith('AGENTMEMORY_SECRET=') ? 'AGENTMEMORY_SECRET=<redacted>' : a);
|
|
105
|
+
deps.log?.(`Wiring agent-memory MCP in ${opts.containerName}: docker ${redacted.join(' ')}`);
|
|
106
|
+
const result = deps.spawn('docker', args, {
|
|
107
|
+
encoding: 'utf8',
|
|
108
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
109
|
+
});
|
|
110
|
+
if (result.status === 0) {
|
|
111
|
+
return { outcome: 'registered', scope: 'user' };
|
|
112
|
+
}
|
|
113
|
+
// Defensive redaction of any echo-back of the env value.
|
|
114
|
+
const detail = (result.stderr?.trim() || result.stdout?.trim() || '(no output)').replace(/AGENTMEMORY_SECRET=\S+/g, 'AGENTMEMORY_SECRET=<redacted>');
|
|
115
|
+
return { outcome: 'failed', rc: result.status ?? 1, detail };
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=world-mcp-register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"world-mcp-register.js","sourceRoot":"","sources":["../../src/lib/world-mcp-register.ts"],"names":[],"mappings":"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"}
|