Compare commits

...

1 Commits

Author SHA1 Message Date
john 40fe362489 fix(memory): initialize candidate schema on admin bootstrap
memind_adm CI / Test, build, and release script checks (push) Successful in 24s
2026-07-21 22:55:19 +08:00
3 changed files with 63 additions and 2 deletions
+2 -2
View File
@@ -2,6 +2,7 @@ import path from 'node:path';
import { createDbPool, isDatabaseConfigured } from './db.mjs';
import { projectRoot } from './load-env.mjs';
import { importMemind, resolveMemindLib } from './lib-path.mjs';
import { initializePersonalMemoryCandidateStore } from './personal-memory-candidate-store.mjs';
import { createSystemTestAccountService, ensureSystemTestAccountSchema } from './system-test-accounts.mjs';
export async function bootstrapAdminServices() {
@@ -30,7 +31,6 @@ export async function bootstrapAdminServices() {
} = await importMemind('mindspace-config.mjs');
const { createMemoryV2AdminConfigService } = await importMemind('memory-v2-admin-config.mjs');
const { createMindSearchConfigService } = await importMemind('mindsearch-config.mjs');
const { createPersonalMemoryCandidateStore } = await importMemind('memory-v2-personal-store.mjs');
const { createSkillRuntimeAdminConfigService } = await importMemind('skill-runtime-admin-config.mjs');
const { createAssetGatewayConfigService } = await importMemind('asset-gateway.mjs');
const { createImageMakeAdminConfigService } = await importMemind('image-make-admin-config.mjs');
@@ -104,7 +104,7 @@ export async function bootstrapAdminServices() {
});
const mindSearchConfigService = createMindSearchConfigService(pool, { env: process.env });
await mindSearchConfigService.ensureSchema();
const personalMemoryCandidateStore = createPersonalMemoryCandidateStore(pool);
const personalMemoryCandidateStore = await initializePersonalMemoryCandidateStore(pool);
const skillRuntimeConfigService = createSkillRuntimeAdminConfigService(pool, {
env: process.env,
h5Root,
@@ -0,0 +1,14 @@
import { importMemind } from './lib-path.mjs';
export async function initializePersonalMemoryCandidateStore(
pool,
{ importMemindModule = importMemind } = {},
) {
const {
createPersonalMemoryCandidateStore,
ensurePersonalMemoryCandidateSchema,
} = await importMemindModule('memory-v2-personal-store.mjs');
await ensurePersonalMemoryCandidateSchema(pool);
return createPersonalMemoryCandidateStore(pool);
}
@@ -0,0 +1,47 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import { initializePersonalMemoryCandidateStore } from './personal-memory-candidate-store.mjs';
test('admin initializes the candidate schema before creating its store', async () => {
const calls = [];
const pool = { query() {} };
const store = { listCandidates() {} };
const result = await initializePersonalMemoryCandidateStore(pool, {
async importMemindModule(subpath) {
assert.equal(subpath, 'memory-v2-personal-store.mjs');
return {
async ensurePersonalMemoryCandidateSchema(receivedPool) {
assert.equal(receivedPool, pool);
calls.push('ensure');
},
createPersonalMemoryCandidateStore(receivedPool) {
assert.equal(receivedPool, pool);
calls.push('create');
return store;
},
};
},
});
assert.equal(result, store);
assert.deepEqual(calls, ['ensure', 'create']);
});
test('admin fails bootstrap when the candidate schema cannot be initialized', async () => {
await assert.rejects(
initializePersonalMemoryCandidateStore({}, {
async importMemindModule() {
return {
async ensurePersonalMemoryCandidateSchema() {
throw new Error('candidate ddl failed');
},
createPersonalMemoryCandidateStore() {
throw new Error('store must not be created');
},
};
},
}),
/candidate ddl failed/,
);
});