Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@
"@google-cloud/storage": "^7.17.1",
"@google-cloud/vertexai": "^1.12.0",
"@google/genai": "^2.9.0",
"@mikro-orm/core": "^6.6.10",
"@mikro-orm/reflection": "^6.6.6",
"@mikro-orm/core": "^7.1.11",
"@mikro-orm/decorators": "^7.1.11",
"@modelcontextprotocol/sdk": "^1.26.0",
"@opentelemetry/api": "1.9.0",
"@opentelemetry/api-logs": "^0.205.0",
Expand All @@ -66,22 +66,23 @@
"js-yaml": "^4.1.1",
"jsonpath-plus": "^10.4.0",
"lodash-es": "^4.18.1",
"reflect-metadata": "^0.2.2",
"winston": "^3.19.0",
"zod": "^4.2.1",
"zod-to-json-schema": "^3.25.1"
},
"devDependencies": {
"@mikro-orm/sqlite": "^6.6.6",
"@mikro-orm/sqlite": "^7.1.11",
"@types/adm-zip": "^0.5.8",
"@types/express": "^4.17.25",
"@types/lodash-es": "^4.17.12",
"openapi-types": "^12.1.3"
},
"peerDependencies": {
"@mikro-orm/mariadb": "^6.6.6",
"@mikro-orm/mssql": "^6.6.6",
"@mikro-orm/mysql": "^6.6.6",
"@mikro-orm/postgresql": "^6.6.6",
"@mikro-orm/sqlite": "^6.6.6"
"@mikro-orm/mariadb": "^7.1.11",
"@mikro-orm/mssql": "^7.1.11",
"@mikro-orm/mysql": "^7.1.11",
"@mikro-orm/postgresql": "^7.1.11",
"@mikro-orm/sqlite": "^7.1.11"
}
}
9 changes: 2 additions & 7 deletions core/src/sessions/database_session_service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,7 @@
* SPDX-License-Identifier: Apache-2.0
*/

import {
FilterQuery,
LockMode,
Options as MikroDBOptions,
MikroORM,
} from '@mikro-orm/core';
import {FilterQuery, LockMode, MikroORM} from '@mikro-orm/core';

import {Event} from '../events/event.js';
import {randomUUID} from '../utils/env_aware_utils.js';
Expand All @@ -27,6 +22,7 @@ import {
import {
ensureDatabaseCreated,
getConnectionOptionsFromUri,
MikroORMOptions as MikroDBOptions,
validateDatabaseSchemaVersion,
} from './db/operations.js';
import {
Expand Down Expand Up @@ -490,7 +486,6 @@ export class DatabaseSessionService extends BaseSessionService {
});
txEm.persist(newStorageEvent);
}
await txEm.commit();

// Update session timestamp to match event timestamp
storageSession.updateTime = new Date(event.timestamp);
Expand Down
12 changes: 10 additions & 2 deletions core/src/sessions/db/operations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,22 @@
* SPDX-License-Identifier: Apache-2.0
*/

import {MikroORM, Options as MikroORMOptions} from '@mikro-orm/core';
import {MikroORM, Options} from '@mikro-orm/core';
import {
ENTITIES,
SCHEMA_VERSION_1_JSON,
SCHEMA_VERSION_KEY,
StorageMetadata,
} from './schema.js';

/**
* MikroORM options as supplied by a caller.
*
* In v7 `Options` marks every key that has a default as required, so the
* user-facing shape is `Partial<Options>`.
*/
export type MikroORMOptions = Partial<Options>;

/**
* Parses a database connection URI and returns MikroORM Options.
*
Expand Down Expand Up @@ -72,7 +80,7 @@ export async function ensureDatabaseCreated(orm: MikroORM): Promise<void> {
await orm.schema.ensureDatabase();

// creates tables if they don't exist. Safe mode prevents dropping columns or tables.
await orm.schema.updateSchema({safe: true});
await orm.schema.update({safe: true});
}

/**
Expand Down
7 changes: 6 additions & 1 deletion core/src/sessions/db/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@
* SPDX-License-Identifier: Apache-2.0
*/

import {Entity, JsonType, PrimaryKey, Property} from '@mikro-orm/core';
import {JsonType} from '@mikro-orm/core';
// The `legacy` barrel re-exports `ReflectMetadataProvider`, whose first
// statement is a bare `import 'reflect-metadata'`. That makes `reflect-metadata`
// a hard runtime dependency of this module, even though the decorators below all
// declare an explicit `type` and never read reflection metadata.
import {Entity, PrimaryKey, Property} from '@mikro-orm/decorators/legacy';
import {
Event,
transformToCamelCaseEvent,
Expand Down
19 changes: 11 additions & 8 deletions core/test/sessions/database_session_service_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ import {SqliteDriver} from '@mikro-orm/sqlite';
import {afterEach, beforeEach, describe, expect, it} from 'vitest';
import {isDatabaseConnectionString} from '../../src/sessions/database_session_service.js';
import {validateDatabaseSchemaVersion} from '../../src/sessions/db/operations.js';
import {
StorageEvent,
StorageMetadata,
StorageSession,
} from '../../src/sessions/db/schema.js';

describe('DatabaseSessionService', () => {
let service: DatabaseSessionService;
Expand Down Expand Up @@ -375,8 +380,8 @@ describe('DatabaseSessionService', () => {

// Manually insert bad version
const em = orm.em.fork();
await em.nativeDelete('StorageMetadata', {key: 'schema_version'});
await em.insert('StorageMetadata', {
await em.nativeDelete(StorageMetadata, {key: 'schema_version'});
await em.insert(StorageMetadata, {
key: 'schema_version',
value: '999',
});
Expand Down Expand Up @@ -669,9 +674,9 @@ describe('DatabaseSessionService', () => {
await service.appendEvent({session, event});

const em = (service as unknown as {orm: MikroORM}).orm.em.fork();
const storedEvents = (await em.find('StorageEvent', {
const storedEvents = await em.find(StorageEvent, {
sessionId: 's-temp',
})) as {sessionId: string; eventData: Event}[];
});
const eventData = storedEvents[0].eventData;

expect(eventData.actions?.stateDelta?.['keep']).toBe('me');
Expand All @@ -695,11 +700,9 @@ describe('DatabaseSessionService', () => {
expect(session.lastUpdateTime).toBe(timestamp);

const em = (service as unknown as {orm: MikroORM}).orm.em.fork();
const storedSession = (await em.findOne('StorageSession', {
id: 's-time',
})) as {id: string; updateTime: Date};
const storedSession = await em.findOne(StorageSession, {id: 's-time'});

expect(storedSession.updateTime.getTime()).toBe(timestamp);
expect(storedSession?.updateTime.getTime()).toBe(timestamp);
});
});
});
Expand Down
4 changes: 2 additions & 2 deletions core/test/sessions/db/operations_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ describe('operations', () => {
entities: ENTITIES,
});

const eventProperties = orm.getMetadata().get(StorageEvent.name)
const eventProperties = orm.getMetadata().get(StorageEvent)
.properties as Record<string, {length?: number}>;
const keyProperties = ['id', 'appName', 'userId', 'sessionId'];

Expand Down Expand Up @@ -174,7 +174,7 @@ describe('operations', () => {
entities: [StorageMetadata],
});
// Ensure schema is updated so StorageMetadata table exists
await orm.schema.updateSchema();
await orm.schema.update();
});

afterEach(async () => {
Expand Down
10 changes: 5 additions & 5 deletions dev/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,11 @@
"dependencies": {
"@clack/prompts": "^0.11.0",
"@google/adk": "^1.6.0",
"@mikro-orm/mariadb": "^6.6.6",
"@mikro-orm/mssql": "^6.6.6",
"@mikro-orm/mysql": "^6.6.6",
"@mikro-orm/postgresql": "^6.6.6",
"@mikro-orm/sqlite": "^6.6.6",
"@mikro-orm/mariadb": "^7.1.11",
"@mikro-orm/mssql": "^7.1.11",
"@mikro-orm/mysql": "^7.1.11",
"@mikro-orm/postgresql": "^7.1.11",
"@mikro-orm/sqlite": "^7.1.11",
"camelcase-keys": "^6.2.2",
"commander": "^14.0.0",
"cors": "^2.8.5",
Expand Down
Loading
Loading