@pleri/olam-cli 0.1.153 → 0.1.158

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 (121) hide show
  1. package/dist/commands/bootstrap.d.ts +2 -1
  2. package/dist/commands/bootstrap.d.ts.map +1 -1
  3. package/dist/commands/bootstrap.js +8 -10
  4. package/dist/commands/bootstrap.js.map +1 -1
  5. package/dist/commands/doctor.d.ts +22 -0
  6. package/dist/commands/doctor.d.ts.map +1 -1
  7. package/dist/commands/doctor.js +110 -7
  8. package/dist/commands/doctor.js.map +1 -1
  9. package/dist/commands/flywheel/check-persona-skeleton.d.ts +7 -0
  10. package/dist/commands/flywheel/check-persona-skeleton.d.ts.map +1 -0
  11. package/dist/commands/flywheel/check-persona-skeleton.js +14 -0
  12. package/dist/commands/flywheel/check-persona-skeleton.js.map +1 -0
  13. package/dist/commands/flywheel/diversity-check.d.ts +7 -0
  14. package/dist/commands/flywheel/diversity-check.d.ts.map +1 -0
  15. package/dist/commands/flywheel/diversity-check.js +14 -0
  16. package/dist/commands/flywheel/diversity-check.js.map +1 -0
  17. package/dist/commands/flywheel/emit-breadcrumb.d.ts +20 -0
  18. package/dist/commands/flywheel/emit-breadcrumb.d.ts.map +1 -0
  19. package/dist/commands/flywheel/emit-breadcrumb.js +137 -0
  20. package/dist/commands/flywheel/emit-breadcrumb.js.map +1 -0
  21. package/dist/commands/flywheel/index.d.ts +27 -0
  22. package/dist/commands/flywheel/index.d.ts.map +1 -0
  23. package/dist/commands/flywheel/index.js +48 -0
  24. package/dist/commands/flywheel/index.js.map +1 -0
  25. package/dist/commands/flywheel/install-shims.d.ts +8 -0
  26. package/dist/commands/flywheel/install-shims.d.ts.map +1 -0
  27. package/dist/commands/flywheel/install-shims.js +15 -0
  28. package/dist/commands/flywheel/install-shims.js.map +1 -0
  29. package/dist/commands/flywheel/k10-measure.d.ts +7 -0
  30. package/dist/commands/flywheel/k10-measure.d.ts.map +1 -0
  31. package/dist/commands/flywheel/k10-measure.js +14 -0
  32. package/dist/commands/flywheel/k10-measure.js.map +1 -0
  33. package/dist/commands/flywheel/k5-score.d.ts +14 -0
  34. package/dist/commands/flywheel/k5-score.d.ts.map +1 -0
  35. package/dist/commands/flywheel/k5-score.js +59 -0
  36. package/dist/commands/flywheel/k5-score.js.map +1 -0
  37. package/dist/commands/flywheel/k5-validate.d.ts +15 -0
  38. package/dist/commands/flywheel/k5-validate.d.ts.map +1 -0
  39. package/dist/commands/flywheel/k5-validate.js +185 -0
  40. package/dist/commands/flywheel/k5-validate.js.map +1 -0
  41. package/dist/commands/flywheel/ping.d.ts +21 -0
  42. package/dist/commands/flywheel/ping.d.ts.map +1 -0
  43. package/dist/commands/flywheel/ping.js +79 -0
  44. package/dist/commands/flywheel/ping.js.map +1 -0
  45. package/dist/commands/flywheel/sanitize-persona-output.d.ts +7 -0
  46. package/dist/commands/flywheel/sanitize-persona-output.d.ts.map +1 -0
  47. package/dist/commands/flywheel/sanitize-persona-output.js +14 -0
  48. package/dist/commands/flywheel/sanitize-persona-output.js.map +1 -0
  49. package/dist/commands/hermes-kg-hook.d.ts +36 -0
  50. package/dist/commands/hermes-kg-hook.d.ts.map +1 -0
  51. package/dist/commands/hermes-kg-hook.js +80 -0
  52. package/dist/commands/hermes-kg-hook.js.map +1 -0
  53. package/dist/commands/hermes.d.ts +46 -0
  54. package/dist/commands/hermes.d.ts.map +1 -0
  55. package/dist/commands/hermes.js +320 -0
  56. package/dist/commands/hermes.js.map +1 -0
  57. package/dist/commands/kg-install-hook.d.ts +7 -1
  58. package/dist/commands/kg-install-hook.d.ts.map +1 -1
  59. package/dist/commands/kg-install-hook.js +122 -6
  60. package/dist/commands/kg-install-hook.js.map +1 -1
  61. package/dist/commands/memory/_paths.d.ts +13 -3
  62. package/dist/commands/memory/_paths.d.ts.map +1 -1
  63. package/dist/commands/memory/_paths.js +25 -22
  64. package/dist/commands/memory/_paths.js.map +1 -1
  65. package/dist/commands/memory/logs.d.ts +8 -4
  66. package/dist/commands/memory/logs.d.ts.map +1 -1
  67. package/dist/commands/memory/logs.js +18 -13
  68. package/dist/commands/memory/logs.js.map +1 -1
  69. package/dist/commands/memory/mode.d.ts.map +1 -1
  70. package/dist/commands/memory/mode.js +7 -3
  71. package/dist/commands/memory/mode.js.map +1 -1
  72. package/dist/commands/memory/start.d.ts +16 -14
  73. package/dist/commands/memory/start.d.ts.map +1 -1
  74. package/dist/commands/memory/start.js +55 -189
  75. package/dist/commands/memory/start.js.map +1 -1
  76. package/dist/commands/memory/status.d.ts +10 -8
  77. package/dist/commands/memory/status.d.ts.map +1 -1
  78. package/dist/commands/memory/status.js +35 -38
  79. package/dist/commands/memory/status.js.map +1 -1
  80. package/dist/commands/memory/stop.d.ts +5 -4
  81. package/dist/commands/memory/stop.d.ts.map +1 -1
  82. package/dist/commands/memory/stop.js +26 -55
  83. package/dist/commands/memory/stop.js.map +1 -1
  84. package/dist/commands/memory-service-container.d.ts +78 -0
  85. package/dist/commands/memory-service-container.d.ts.map +1 -0
  86. package/dist/commands/memory-service-container.js +187 -0
  87. package/dist/commands/memory-service-container.js.map +1 -0
  88. package/dist/commands/services.d.ts +16 -1
  89. package/dist/commands/services.d.ts.map +1 -1
  90. package/dist/commands/services.js +88 -12
  91. package/dist/commands/services.js.map +1 -1
  92. package/dist/image-digests.json +7 -7
  93. package/dist/index.js +2570 -1384
  94. package/dist/index.js.map +1 -1
  95. package/dist/lib/k8s-secret-render.d.ts.map +1 -1
  96. package/dist/lib/k8s-secret-render.js +7 -4
  97. package/dist/lib/k8s-secret-render.js.map +1 -1
  98. package/dist/lib/memory-host-process-migration.d.ts +56 -0
  99. package/dist/lib/memory-host-process-migration.d.ts.map +1 -0
  100. package/dist/lib/memory-host-process-migration.js +156 -0
  101. package/dist/lib/memory-host-process-migration.js.map +1 -0
  102. package/dist/lib/upgrade-kubernetes.d.ts +22 -0
  103. package/dist/lib/upgrade-kubernetes.d.ts.map +1 -1
  104. package/dist/lib/upgrade-kubernetes.js +195 -2
  105. package/dist/lib/upgrade-kubernetes.js.map +1 -1
  106. package/dist/mcp-server.js +56 -22
  107. package/hermes-bundle/kg-first.sh +100 -0
  108. package/hermes-bundle/version.json +4 -0
  109. package/host-cp/k8s/manifests/50-deployment.yaml +54 -27
  110. package/host-cp/k8s/manifests/auth-service/30-configmap.yaml +5 -0
  111. package/host-cp/k8s/manifests/auth-service/50-deployment.yaml +5 -1
  112. package/host-cp/k8s/manifests/kg-service/30-configmap.yaml +5 -0
  113. package/host-cp/k8s/manifests/kg-service/50-deployment.yaml +5 -1
  114. package/host-cp/k8s/manifests/mcp-auth-service/30-configmap.yaml +4 -0
  115. package/host-cp/k8s/manifests/mcp-auth-service/50-deployment.yaml +5 -1
  116. package/host-cp/k8s/manifests/memory-service/30-configmap.yaml +4 -0
  117. package/host-cp/k8s/manifests/memory-service/50-deployment.yaml +5 -1
  118. package/host-cp/src/metrics.mjs +281 -0
  119. package/host-cp/src/server.mjs +22 -2
  120. package/package.json +3 -4
  121. package/memory-service-bundle/scripts/ensure-iii-engine.mjs +0 -179
@@ -1,217 +1,83 @@
1
1
  /**
2
- * olam memory start — spawn agentmemory as a managed host child process.
2
+ * olam memory start — bring up the agent-memory service.
3
3
  *
4
- * Flow:
5
- * 1. Ensure iii v0.11.2 binary at ~/.olam/bin/iii (calls A1's ensure-iii-engine.mjs equivalent)
6
- * 2. Ensure ~/.olam/memory-secret (0600) exists
7
- * 3. Locate packages/memory-service/ (the npm-installed agentmemory)
8
- * 4. Spawn `agentmemory` (the bin from @agentmemory/agentmemory@0.9.6) with:
9
- * env: { AGENTMEMORY_SECRET, PATH: ~/.olam/bin:$PATH, ...inherit }
10
- * cwd: ~/.olam (so agentmemory writes state under ~/.olam/data/)
11
- * stdio: append to ~/.olam/memory-service.log
12
- * detached: true so the child outlives this CLI invocation
13
- * 5. Write child pid to ~/.olam/memory.pid
14
- * 6. Poll http://localhost:3111/agentmemory/livez until 200 (timeout 30s)
4
+ * Phase B substrate: delegates to `MemoryServiceContainerController` so the
5
+ * service runs as a Docker container managed by the same lifecycle as
6
+ * kg-service / auth-service / mcp-auth-service. The legacy Phase A host-process
7
+ * model (spawning the `agentmemory` npm bin + writing `~/.olam/memory.pid`)
8
+ * is retired; legacy on-disk state is migrated away on first new-substrate
9
+ * invocation via `migrateFromHostProcess()`.
15
10
  *
16
- * Idempotent: re-running while the service is healthy prints status and exits 0.
11
+ * Operator-facing surface unchanged:
12
+ * - `olam memory start` still produces a running service on :3111.
13
+ * - `bootstrap.ts:429` `runOlam(['memory', 'start'])` call site untouched.
14
+ * - `--skip-memory` / `OLAM_BOOTSTRAP_SKIP_MEMORY=1` still skip.
17
15
  *
18
- * Plan reference: docs/plans/olam-agent-memory-distributed/phase-a-tasks.md A2
19
- */
20
- import { spawn } from 'node:child_process';
21
- import { existsSync, mkdirSync, openSync, readFileSync, writeFileSync } from 'node:fs';
22
- import { join } from 'node:path';
23
- import { pathToFileURL } from 'node:url';
24
- import { printError, printSuccess, printInfo, printHeader } from '../../output.js';
25
- import { ensureMemorySecret } from '../../lib/memory-secret.js';
26
- import { III_BINARY_PATH, MEMORY_DATA_DIR, MEMORY_LIVEZ_URL, MEMORY_LOG_PATH, MEMORY_PID_PATH, MEMORY_SERVICE_CANDIDATES, OLAM_BIN_DIR, OLAM_HOME, } from './_paths.js';
27
- const READINESS_TIMEOUT_MS = 30_000;
28
- const READINESS_POLL_MS = 500;
29
- function resolveMemoryServiceDir() {
30
- for (const c of MEMORY_SERVICE_CANDIDATES) {
31
- if (existsSync(c))
32
- return c;
33
- }
34
- throw new Error(`Could not find packages/memory-service/. Searched: ${MEMORY_SERVICE_CANDIDATES.join(', ')}. ` +
35
- `If running from a published @pleri/olam-cli tarball, this is a packaging bug — please file an issue.`);
36
- }
37
- function resolveAgentMemoryBin(serviceDir) {
38
- // npm hoists @agentmemory/agentmemory to the workspace root in monorepo mode.
39
- // Search likely locations in order.
40
- const candidates = [
41
- join(serviceDir, 'node_modules', '.bin', 'agentmemory'),
42
- join(serviceDir, '..', '..', 'node_modules', '.bin', 'agentmemory'),
43
- join(serviceDir, '..', '..', '..', 'node_modules', '.bin', 'agentmemory'),
44
- ];
45
- for (const c of candidates) {
46
- if (existsSync(c))
47
- return c;
48
- }
49
- throw new Error(`Could not find agentmemory bin. Searched: ${candidates.join(', ')}. ` +
50
- `Run 'npm install' from the repo root.`);
51
- }
52
- function isProcessAlive(pid) {
53
- try {
54
- // signal 0 doesn't deliver; just tests existence + permission
55
- process.kill(pid, 0);
56
- return true;
57
- }
58
- catch {
59
- return false;
60
- }
61
- }
62
- function readPidFromFile() {
63
- if (!existsSync(MEMORY_PID_PATH))
64
- return null;
65
- const raw = readFileSync(MEMORY_PID_PATH, 'utf8').trim();
66
- const pid = parseInt(raw, 10);
67
- if (!Number.isFinite(pid) || pid <= 0)
68
- return null;
69
- return pid;
70
- }
71
- async function probeLivez(secret, signal) {
72
- try {
73
- const resp = await fetch(MEMORY_LIVEZ_URL, {
74
- headers: { authorization: `Bearer ${secret}` },
75
- signal,
76
- });
77
- if (!resp.ok)
78
- return false;
79
- const body = (await resp.json());
80
- return body.status === 'ok';
81
- }
82
- catch {
83
- return false;
84
- }
85
- }
86
- async function waitForReady(secret) {
87
- const deadline = Date.now() + READINESS_TIMEOUT_MS;
88
- while (Date.now() < deadline) {
89
- if (await probeLivez(secret))
90
- return true;
91
- await new Promise((r) => setTimeout(r, READINESS_POLL_MS));
92
- }
93
- return false;
94
- }
95
- /**
96
- * Auto-fetch the iii binary via A1's `ensure-iii-engine.mjs` helper.
16
+ * Phase C deletes the host-process helpers from `_paths.ts` + drops the
17
+ * `@agentmemory/agentmemory` PUBLISH_DEPS entry. Until then, the host-process
18
+ * code paths are unreachable but present (clean-revert insurance).
97
19
  *
98
- * Called from `runMemoryStart` when `~/.olam/bin/iii` is missing. Closes
99
- * the bootstrap-time UX gap surfaced by `olam bootstrap` in CI: A5
100
- * wires `olam memory start` into the bootstrap flow, but A2's start
101
- * command previously failed with a "Run: node ... ensure-iii-engine.mjs"
102
- * remedy that operators on fresh hosts couldn't auto-resolve. Now
103
- * `olam memory start` (and therefore `olam bootstrap`) auto-fetches the
104
- * SHA256-pinned binary on first use.
105
- *
106
- * Dynamic-imported because the helper is in `packages/memory-service/`,
107
- * a sibling workspace — resolving statically would invert the package
108
- * graph. Path resolution reuses `resolveMemoryServiceDir` so the bundle-
109
- * vs-source layout fallbacks stay consistent.
20
+ * Plan reference: docs/plans/memory-service-as-docker-peripheral/phase-b-tasks.md B1
110
21
  */
111
- async function autoEnsureIiiBinary(serviceDir) {
112
- const helperPath = join(serviceDir, 'scripts', 'ensure-iii-engine.mjs');
113
- const mod = (await import(pathToFileURL(helperPath).href));
114
- const result = await mod.ensureIiiEngine();
115
- if (!result.ok) {
116
- throw new Error(`ensureIiiEngine returned ok=false (path=${result.path})`);
117
- }
118
- }
22
+ import { printError, printSuccess, printInfo, printHeader, printWarning } from '../../output.js';
23
+ import { MEMORY_SERVICE_PORT, MemoryServiceContainerController, } from '../memory-service-container.js';
24
+ import { migrateFromHostProcess } from '../../lib/memory-host-process-migration.js';
119
25
  export async function runMemoryStart() {
120
26
  printHeader('olam memory start');
121
- // 3. Locate the service first (needed for both auto-fetch and bin
122
- // resolution below). Throws with a clear remedy if the packaging
123
- // is broken (e.g. running outside a checkout).
124
- let serviceDir;
125
- try {
126
- serviceDir = resolveMemoryServiceDir();
127
- }
128
- catch (err) {
129
- printError(err instanceof Error ? err.message : String(err));
130
- return 1;
131
- }
132
- // 1. iii binary (A1's deliverable). Auto-fetch when missing so
133
- // `olam bootstrap` succeeds on fresh hosts (CI runners, new
134
- // operator machines) without a manual ensure-iii-engine step.
135
- if (!existsSync(III_BINARY_PATH)) {
136
- printInfo('iii binary', `missing at ${III_BINARY_PATH} — auto-fetching v0.11.2`);
137
- try {
138
- await autoEnsureIiiBinary(serviceDir);
139
- }
140
- catch (err) {
141
- printError(`iii binary auto-fetch failed: ${err instanceof Error ? err.message : String(err)}. ` +
142
- `Run manually: node packages/memory-service/scripts/ensure-iii-engine.mjs`);
143
- return 1;
144
- }
27
+ // 1. Migrate away from any Phase A host-process state on disk. Idempotent
28
+ // no-op on hosts that never ran the legacy substrate. PID-reuse defence
29
+ // is in the helper we never SIGTERM a process whose comm name isn't
30
+ // `node`.
31
+ const migration = migrateFromHostProcess();
32
+ if (migration.cleaned) {
33
+ printInfo('migration', migration.summary);
145
34
  }
146
- printInfo('iii binary', III_BINARY_PATH);
147
- // 2. Secret (A3 lib)
148
- const secret = ensureMemorySecret();
149
- printInfo('secret', '~/.olam/memory-secret (0600)');
150
- // 3b. Locate the agentmemory bin (serviceDir was resolved above for
151
- // the auto-fetch path).
152
- const agentmemoryBin = resolveAgentMemoryBin(serviceDir);
153
- printInfo('agentmemory', agentmemoryBin);
154
- // 4. Idempotency: already running?
155
- const existingPid = readPidFromFile();
156
- if (existingPid !== null && isProcessAlive(existingPid)) {
157
- const ready = await probeLivez(secret);
35
+ // 2. Substrate handoff to MemoryServiceContainerController (Phase A A1).
36
+ const controller = new MemoryServiceContainerController();
37
+ const current = controller.status();
38
+ if (current.state === 'running') {
39
+ const ready = await controller.waitForReady(5_000);
158
40
  if (ready) {
159
- printSuccess(`already running (pid ${existingPid}); /agentmemory/livez ok`);
41
+ printSuccess(`olam-memory-service already running on :${current.port}; /agentmemory/livez ok`);
160
42
  return 0;
161
43
  }
162
- // Pidfile points at a live process that isn't responding — leave it alone, error out.
163
- printError(`pid ${existingPid} is alive but /agentmemory/livez isn't responding. ` +
164
- `Run 'olam memory stop' to clear, then retry.`);
44
+ printWarning(`olam-memory-service container is running but /agentmemory/livez did not respond. ` +
45
+ `Run 'olam memory stop' then retry, or 'olam memory logs' to diagnose.`);
165
46
  return 1;
166
47
  }
167
- // 5. Ensure dirs exist
168
- mkdirSync(OLAM_HOME, { recursive: true });
169
- mkdirSync(MEMORY_DATA_DIR, { recursive: true });
170
- // 6. Spawn detached, redirect output to log file (append).
171
- const logFd = openSync(MEMORY_LOG_PATH, 'a');
172
- const child = spawn(agentmemoryBin, [], {
173
- cwd: OLAM_HOME,
174
- env: {
175
- ...process.env,
176
- AGENTMEMORY_SECRET: secret,
177
- // Bind 0.0.0.0 so worlds inside Docker can reach the host service
178
- // via `host.docker.internal:3111`. Defaults to 127.0.0.1 in the
179
- // upstream iii-config, which would make the service host-only.
180
- // The bearer-secret gate above prevents non-authed access from
181
- // any other LAN host that can route to this machine.
182
- AGENTMEMORY_HOST: '0.0.0.0',
183
- PATH: `${OLAM_BIN_DIR}:${process.env.PATH ?? ''}`,
184
- },
185
- stdio: ['ignore', logFd, logFd],
186
- detached: true,
187
- });
188
- child.unref();
189
- if (child.pid === undefined) {
190
- printError('spawn returned no pid (process failed to start)');
48
+ if (controller.imageMissingEverywhere()) {
49
+ printError('olam-memory-service image not found locally. ' +
50
+ 'Run `olam bootstrap` to pull the published image, or ' +
51
+ '`node packages/cli/scripts/build-memory-service-image.mjs` to build from source.');
52
+ return 1;
53
+ }
54
+ try {
55
+ controller.start();
56
+ }
57
+ catch (err) {
58
+ const errMsg = err instanceof Error ? err.message : String(err);
59
+ const stderr = err instanceof Error && 'stderr' in err
60
+ ? String(err.stderr ?? '').trim()
61
+ : '';
62
+ printError(`olam-memory-service failed to start: ${errMsg}${stderr ? `\n stderr: ${stderr}` : ''}`);
191
63
  return 1;
192
64
  }
193
- // 7. Persist pid
194
- writeFileSync(MEMORY_PID_PATH, `${child.pid}\n`, { mode: 0o644 });
195
- printInfo('pid', `${child.pid}`);
196
- // 8. Wait for readiness
197
- printInfo('readiness', `polling ${MEMORY_LIVEZ_URL}`);
198
- const ready = await waitForReady(secret);
65
+ const ready = await controller.waitForReady();
199
66
  if (!ready) {
200
- printError(`agentmemory failed to come up within ${READINESS_TIMEOUT_MS / 1000}s. ` +
201
- `Inspect ${MEMORY_LOG_PATH} for engine errors.`);
67
+ printError(`olam-memory-service started but /agentmemory/livez did not respond within 60s. ` +
68
+ `Inspect logs with 'olam memory logs'.`);
202
69
  return 1;
203
70
  }
204
- printSuccess(`memory service ready (pid ${child.pid}; logs at ${MEMORY_LOG_PATH})`);
71
+ printSuccess(`olam-memory-service started on :${MEMORY_SERVICE_PORT}; /agentmemory/livez ok`);
205
72
  return 0;
206
73
  }
207
74
  export function registerMemoryStart(cmd) {
208
75
  cmd
209
76
  .command('start')
210
- .description('Start the host agent-memory process (idempotent; polls livez until ready)')
77
+ .description('Start the agent-memory Docker container (Phase B substrate).')
211
78
  .action(async () => {
212
- const rc = await runMemoryStart();
213
- if (rc !== 0)
214
- process.exitCode = rc;
79
+ const exitCode = await runMemoryStart();
80
+ process.exit(exitCode);
215
81
  });
216
82
  }
217
83
  //# sourceMappingURL=start.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/commands/memory/start.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/commands/memory/start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACjG,OAAO,EACL,mBAAmB,EACnB,gCAAgC,GACjC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAEpF,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,WAAW,CAAC,mBAAmB,CAAC,CAAC;IAEjC,0EAA0E;IAC1E,2EAA2E;IAC3E,yEAAyE;IACzE,aAAa;IACb,MAAM,SAAS,GAAG,sBAAsB,EAAE,CAAC;IAC3C,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QACtB,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,yEAAyE;IACzE,MAAM,UAAU,GAAG,IAAI,gCAAgC,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;IAEpC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,KAAK,EAAE,CAAC;YACV,YAAY,CAAC,2CAA2C,OAAO,CAAC,IAAI,yBAAyB,CAAC,CAAC;YAC/F,OAAO,CAAC,CAAC;QACX,CAAC;QACD,YAAY,CACV,mFAAmF;YACjF,uEAAuE,CAC1E,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,UAAU,CAAC,sBAAsB,EAAE,EAAE,CAAC;QACxC,UAAU,CACR,+CAA+C;YAC7C,uDAAuD;YACvD,kFAAkF,CACrF,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC;QACH,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,IAAI,QAAQ,IAAI,GAAG;YACpD,CAAC,CAAC,MAAM,CAAE,GAAmC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAClE,CAAC,CAAC,EAAE,CAAC;QACP,UAAU,CAAC,wCAAwC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrG,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,CAAC;IAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,UAAU,CACR,iFAAiF;YAC/E,uCAAuC,CAC1C,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,YAAY,CAAC,mCAAmC,mBAAmB,yBAAyB,CAAC,CAAC;IAC9F,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,GAAG;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,8DAA8D,CAAC;SAC3E,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAE,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,20 +1,22 @@
1
1
  /**
2
- * olam memory status — diagnostic dump for the host memory service.
2
+ * olam memory status — diagnostic dump for the agent-memory Docker container.
3
3
  *
4
- * Reports: pidfile state, process liveness, /agentmemory/livez response,
5
- * secret-set Y/N, iii binary location, REST port. Intended for both
6
- * humans (default output) and machines (--json).
4
+ * Phase B substrate: queries `MemoryServiceContainerController.status()` +
5
+ * bearer-authenticated livez probe. Output schema preserves the Phase A
6
+ * shape `state | livez | secret | port` — but the `state` field now
7
+ * reports container lifecycle (`running | stopped | missing`) instead of
8
+ * pid/alive.
7
9
  *
8
- * Plan reference: docs/plans/olam-agent-memory-distributed/phase-a-tasks.md A2
10
+ * Plan reference: docs/plans/memory-service-as-docker-peripheral/phase-b-tasks.md B3
9
11
  */
10
12
  import type { Command } from 'commander';
11
13
  interface MemoryStatus {
12
- pid: number | null;
13
- alive: boolean | null;
14
+ state: 'running' | 'stopped' | 'missing';
15
+ containerId: string | null;
14
16
  livez: 'ok' | 'unreachable' | 'unauthorized' | 'unknown';
15
17
  secretSet: boolean;
16
- iiiBinary: string | null;
17
18
  port: number;
19
+ legacyPidfilePresent: boolean;
18
20
  }
19
21
  export declare function collectMemoryStatus(): Promise<MemoryStatus>;
20
22
  export declare function runMemoryStatus(opts?: {
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/memory/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,UAAU,YAAY;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,IAAI,GAAG,aAAa,GAAG,cAAc,GAAG,SAAS,CAAC;IACzD,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAyBD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,YAAY,CAAC,CAkBjE;AAED,wBAAsB,eAAe,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAgCpF;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CASvD"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/memory/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,UAAU,YAAY;IACpB,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACzC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,IAAI,GAAG,aAAa,GAAG,cAAc,GAAG,SAAS,CAAC;IACzD,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAgBD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,YAAY,CAAC,CAajE;AAED,wBAAsB,eAAe,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA+CpF;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CASvD"}
@@ -1,25 +1,19 @@
1
1
  /**
2
- * olam memory status — diagnostic dump for the host memory service.
2
+ * olam memory status — diagnostic dump for the agent-memory Docker container.
3
3
  *
4
- * Reports: pidfile state, process liveness, /agentmemory/livez response,
5
- * secret-set Y/N, iii binary location, REST port. Intended for both
6
- * humans (default output) and machines (--json).
4
+ * Phase B substrate: queries `MemoryServiceContainerController.status()` +
5
+ * bearer-authenticated livez probe. Output schema preserves the Phase A
6
+ * shape `state | livez | secret | port` — but the `state` field now
7
+ * reports container lifecycle (`running | stopped | missing`) instead of
8
+ * pid/alive.
7
9
  *
8
- * Plan reference: docs/plans/olam-agent-memory-distributed/phase-a-tasks.md A2
10
+ * Plan reference: docs/plans/memory-service-as-docker-peripheral/phase-b-tasks.md B3
9
11
  */
10
- import { existsSync, readFileSync } from 'node:fs';
11
- import { printError, printInfo, printHeader, printWarning } from '../../output.js';
12
+ import { existsSync } from 'node:fs';
13
+ import { printInfo, printHeader, printWarning } from '../../output.js';
12
14
  import { hasMemorySecret, readMemorySecretOrNull } from '../../lib/memory-secret.js';
13
- import { III_BINARY_PATH, MEMORY_LIVEZ_URL, MEMORY_PID_PATH, MEMORY_REST_PORT, } from './_paths.js';
14
- function isAlive(pid) {
15
- try {
16
- process.kill(pid, 0);
17
- return true;
18
- }
19
- catch {
20
- return false;
21
- }
22
- }
15
+ import { MEMORY_LIVEZ_URL, MEMORY_REST_PORT, MEMORY_PID_PATH, } from './_paths.js';
16
+ import { MemoryServiceContainerController } from '../memory-service-container.js';
23
17
  async function probe(secret) {
24
18
  try {
25
19
  const headers = {};
@@ -38,22 +32,17 @@ async function probe(secret) {
38
32
  }
39
33
  }
40
34
  export async function collectMemoryStatus() {
41
- let pid = null;
42
- if (existsSync(MEMORY_PID_PATH)) {
43
- const raw = readFileSync(MEMORY_PID_PATH, 'utf8').trim();
44
- const parsed = parseInt(raw, 10);
45
- pid = Number.isFinite(parsed) && parsed > 0 ? parsed : null;
46
- }
47
- const alive = pid === null ? null : isAlive(pid);
35
+ const controller = new MemoryServiceContainerController();
36
+ const containerStatus = controller.status();
48
37
  const secret = readMemorySecretOrNull();
49
38
  const livez = await probe(secret);
50
39
  return {
51
- pid,
52
- alive,
40
+ state: containerStatus.state,
41
+ containerId: containerStatus.containerId ?? null,
53
42
  livez,
54
43
  secretSet: hasMemorySecret(),
55
- iiiBinary: existsSync(III_BINARY_PATH) ? III_BINARY_PATH : null,
56
44
  port: MEMORY_REST_PORT,
45
+ legacyPidfilePresent: existsSync(MEMORY_PID_PATH),
57
46
  };
58
47
  }
59
48
  export async function runMemoryStatus(opts = {}) {
@@ -63,24 +52,32 @@ export async function runMemoryStatus(opts = {}) {
63
52
  return s.livez === 'ok' ? 0 : 1;
64
53
  }
65
54
  printHeader('olam memory status');
66
- printInfo('pid', s.pid === null ? '(no pidfile)' : `${s.pid}`);
67
- printInfo('alive', s.alive === null ? 'n/a' : s.alive ? 'yes' : 'no (stale pidfile)');
55
+ printInfo('state', s.state);
56
+ if (s.containerId)
57
+ printInfo('container', s.containerId.slice(0, 12));
68
58
  printInfo('livez', s.livez);
69
59
  printInfo('secret', s.secretSet ? '~/.olam/memory-secret (set)' : '(missing)');
70
- printInfo('iii', s.iiiBinary ?? '(not installed)');
71
60
  printInfo('port', `${s.port}`);
72
- if (s.livez === 'ok' && s.alive)
61
+ if (s.legacyPidfilePresent) {
62
+ printWarning('~/.olam/memory.pid is present (Phase A legacy artefact). ' +
63
+ 'Will be cleaned up on next `olam memory start` or `olam memory stop`.');
64
+ }
65
+ if (s.state === 'running' && s.livez === 'ok')
73
66
  return 0;
74
- if (s.livez === 'unauthorized') {
75
- printWarning('livez returned 401 — the memory service is up but the local secret does not match. Try `olam memory secret rotate`.');
67
+ if (s.state === 'missing') {
68
+ printWarning('no olam-memory-service container exists; run `olam memory start`');
76
69
  return 1;
77
70
  }
78
- if (s.alive === false && s.pid !== null) {
79
- printWarning('pidfile points at a dead process; run `olam memory stop` to clean up');
71
+ if (s.livez === 'unauthorized') {
72
+ printWarning('livez returned 401 the container is up but the local secret does not match. ' +
73
+ 'The container was likely started with a different secret. ' +
74
+ '`olam memory stop && olam memory start` will reconcile.');
80
75
  return 1;
81
76
  }
82
- if (!s.iiiBinary) {
83
- printWarning('iii binary missing; run `node packages/memory-service/scripts/ensure-iii-engine.mjs`');
77
+ if (s.livez === 'unreachable' && s.state === 'running') {
78
+ printWarning('container is running but /agentmemory/livez did not respond. ' +
79
+ 'Check `olam memory logs` for startup errors.');
80
+ return 1;
84
81
  }
85
82
  if (!s.secretSet) {
86
83
  printWarning('secret missing; `olam memory start` will generate it');
@@ -90,7 +87,7 @@ export async function runMemoryStatus(opts = {}) {
90
87
  export function registerMemoryStatus(cmd) {
91
88
  cmd
92
89
  .command('status')
93
- .description('Diagnostic dump for the host memory service (pid + livez + secret-set check)')
90
+ .description('Diagnostic dump for the agent-memory Docker container (Phase B substrate).')
94
91
  .option('--json', 'Machine-readable JSON output', false)
95
92
  .action(async (opts) => {
96
93
  const rc = await runMemoryStatus(opts);
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/memory/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/memory/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAWlF,KAAK,UAAU,KAAK,CAAC,MAAqB;IACxC,IAAI,CAAC;QACH,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,MAAM;YAAE,OAAO,CAAC,aAAa,GAAG,UAAU,MAAM,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,cAAc,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,SAAS,CAAC;QAC/B,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAwB,CAAC;QACxD,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,UAAU,GAAG,IAAI,gCAAgC,EAAE,CAAC;IAC1D,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,sBAAsB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO;QACL,KAAK,EAAE,eAAe,CAAC,KAAK;QAC5B,WAAW,EAAE,eAAe,CAAC,WAAW,IAAI,IAAI;QAChD,KAAK;QACL,SAAS,EAAE,eAAe,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,oBAAoB,EAAE,UAAU,CAAC,eAAe,CAAC;KAClD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA2B,EAAE;IACjE,MAAM,CAAC,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAEtC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAClC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,CAAC,WAAW;QAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACtE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5B,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC/E,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAE/B,IAAI,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAC3B,YAAY,CACV,2DAA2D;YACzD,uEAAuE,CAC1E,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IAExD,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1B,YAAY,CAAC,kEAAkE,CAAC,CAAC;QACjF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;QAC/B,YAAY,CACV,gFAAgF;YAC9E,4DAA4D;YAC5D,yDAAyD,CAC5D,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,CAAC,KAAK,KAAK,aAAa,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACvD,YAAY,CACV,+DAA+D;YAC7D,8CAA8C,CACjD,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QACjB,YAAY,CAAC,sDAAsD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4EAA4E,CAAC;SACzF,MAAM,CAAC,QAAQ,EAAE,8BAA8B,EAAE,KAAK,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,EAAE,KAAK,CAAC;YAAE,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,10 +1,11 @@
1
1
  /**
2
- * olam memory stop — terminate the host agent-memory process gracefully.
2
+ * olam memory stop — stop the agent-memory Docker container.
3
3
  *
4
- * SIGTERM wait 10s SIGKILL. Removes the pidfile on clean exit.
5
- * Idempotent: no pidfile or stale pidfile exit 0 with informational message.
4
+ * Phase B substrate: delegates to `MemoryServiceContainerController.stop()`.
5
+ * Also cleans up any residual Phase A legacy state (`~/.olam/memory.pid` +
6
+ * the log file) via `migrateFromHostProcess({ removeLog: true })`.
6
7
  *
7
- * Plan reference: docs/plans/olam-agent-memory-distributed/phase-a-tasks.md A2
8
+ * Plan reference: docs/plans/memory-service-as-docker-peripheral/phase-b-tasks.md B2
8
9
  */
9
10
  import type { Command } from 'commander';
10
11
  export declare function runMemoryStop(): Promise<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/commands/memory/stop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBzC,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAmDrD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAQrD"}
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/commands/memory/stop.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CA8BrD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAQrD"}
@@ -1,77 +1,48 @@
1
1
  /**
2
- * olam memory stop — terminate the host agent-memory process gracefully.
2
+ * olam memory stop — stop the agent-memory Docker container.
3
3
  *
4
- * SIGTERM wait 10s SIGKILL. Removes the pidfile on clean exit.
5
- * Idempotent: no pidfile or stale pidfile exit 0 with informational message.
4
+ * Phase B substrate: delegates to `MemoryServiceContainerController.stop()`.
5
+ * Also cleans up any residual Phase A legacy state (`~/.olam/memory.pid` +
6
+ * the log file) via `migrateFromHostProcess({ removeLog: true })`.
6
7
  *
7
- * Plan reference: docs/plans/olam-agent-memory-distributed/phase-a-tasks.md A2
8
+ * Plan reference: docs/plans/memory-service-as-docker-peripheral/phase-b-tasks.md B2
8
9
  */
9
- import { existsSync, readFileSync, unlinkSync } from 'node:fs';
10
- import { printSuccess, printWarning, printInfo, printHeader } from '../../output.js';
11
- import { MEMORY_PID_PATH } from './_paths.js';
12
- const SIGTERM_GRACE_MS = 10_000;
13
- const POLL_MS = 250;
14
- function isAlive(pid) {
15
- try {
16
- process.kill(pid, 0);
17
- return true;
18
- }
19
- catch {
20
- return false;
21
- }
22
- }
10
+ import { printSuccess, printInfo, printHeader, printWarning } from '../../output.js';
11
+ import { MemoryServiceContainerController } from '../memory-service-container.js';
12
+ import { migrateFromHostProcess } from '../../lib/memory-host-process-migration.js';
23
13
  export async function runMemoryStop() {
24
14
  printHeader('olam memory stop');
25
- if (!existsSync(MEMORY_PID_PATH)) {
26
- printSuccess('no pidfile present (nothing to stop)');
15
+ // Always sweep up legacy state. Stop is the canonical "remove all running
16
+ // agent-memory" verb; we additionally remove the log file here (vs start.ts
17
+ // which leaves it in place — see B5's removeLog flag).
18
+ const migration = migrateFromHostProcess({ removeLog: true });
19
+ if (migration.cleaned) {
20
+ printInfo('migration', migration.summary);
21
+ }
22
+ const controller = new MemoryServiceContainerController();
23
+ const current = controller.status();
24
+ if (current.state === 'missing') {
25
+ printSuccess('no olam-memory-service container present (nothing to stop)');
27
26
  return 0;
28
27
  }
29
- const pid = parseInt(readFileSync(MEMORY_PID_PATH, 'utf8').trim(), 10);
30
- if (!Number.isFinite(pid) || pid <= 0) {
31
- printWarning(`pidfile contained invalid value; removing`);
32
- unlinkSync(MEMORY_PID_PATH);
28
+ if (current.state === 'stopped') {
29
+ printSuccess('olam-memory-service container already stopped');
33
30
  return 0;
34
31
  }
35
- if (!isAlive(pid)) {
36
- printSuccess(`pid ${pid} is not running (stale pidfile); cleaned up`);
37
- unlinkSync(MEMORY_PID_PATH);
38
- return 0;
39
- }
40
- printInfo('pid', `${pid}`);
41
32
  try {
42
- process.kill(pid, 'SIGTERM');
33
+ controller.stop();
43
34
  }
44
35
  catch (err) {
45
- printWarning(`SIGTERM to pid ${pid} failed: ${err.message}`);
46
- }
47
- // Wait for graceful exit
48
- const deadline = Date.now() + SIGTERM_GRACE_MS;
49
- while (Date.now() < deadline) {
50
- if (!isAlive(pid))
51
- break;
52
- await new Promise((r) => setTimeout(r, POLL_MS));
53
- }
54
- if (isAlive(pid)) {
55
- printWarning(`pid ${pid} did not exit within ${SIGTERM_GRACE_MS / 1000}s; sending SIGKILL`);
56
- try {
57
- process.kill(pid, 'SIGKILL');
58
- }
59
- catch (err) {
60
- printWarning(`SIGKILL to pid ${pid} failed: ${err.message}`);
61
- }
62
- // Brief wait for SIGKILL to take effect
63
- await new Promise((r) => setTimeout(r, 500));
64
- }
65
- if (existsSync(MEMORY_PID_PATH)) {
66
- unlinkSync(MEMORY_PID_PATH);
36
+ printWarning(`docker stop failed: ${err instanceof Error ? err.message : String(err)}`);
37
+ return 1;
67
38
  }
68
- printSuccess(`stopped (pid ${pid})`);
39
+ printSuccess('olam-memory-service stopped');
69
40
  return 0;
70
41
  }
71
42
  export function registerMemoryStop(cmd) {
72
43
  cmd
73
44
  .command('stop')
74
- .description('Stop the host agent-memory process (SIGTERM SIGKILL after 10s; idempotent)')
45
+ .description('Stop the agent-memory Docker container (Phase B substrate; idempotent).')
75
46
  .action(async () => {
76
47
  const rc = await runMemoryStop();
77
48
  if (rc !== 0)