diff --git a/.depcheckrc.yml b/.depcheckrc.yml index 8e0cd2291..77a985754 100644 --- a/.depcheckrc.yml +++ b/.depcheckrc.yml @@ -38,6 +38,9 @@ ignores: - 'typedoc' - 'typescript' - 'typescript-plugin-css-modules' + - '@agoric/internal' + - 'setimmediate' + - '@types/setimmediate' # Used by @ocap/nodejs to build the sqlite3 bindings - 'node-gyp' diff --git a/eslint.config.mjs b/eslint.config.mjs index 558bfc146..21a89f057 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -47,7 +47,7 @@ const config = createConfig([ }, { - files: ['**/*.ts', '**/*.tsx', '**/*.mts', '**/*.cts'], + files: ['**/*.ts', '**/*.tsx', '**/*.mts', '**/*.cts', '**/*.d.ts'], extends: [metamaskTypescriptConfig], rules: { '@typescript-eslint/explicit-function-return-type': [ @@ -65,6 +65,10 @@ const config = createConfig([ // option and "import-x/consistent-type-specifiers" rule. '@typescript-eslint/consistent-type-imports': 'off', 'import-x/consistent-type-specifier-style': ['error', 'prefer-top-level'], + + // This should only be enable for JavaScript files. + // Ref: https://github.com/import-js/eslint-plugin-import/issues/2215#issuecomment-911245486 + 'import-x/unambiguous': 'off', }, }, diff --git a/package.json b/package.json index 31153b036..390a399b1 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "@ts-bridge/shims": "^0.1.1", "@types/lodash": "^4.17.7", "@types/node": "^22.10.1", + "@types/setimmediate": "^1.0.4", "@types/webextension-polyfill": "^0", "@typescript-eslint/eslint-plugin": "^8.8.1", "@typescript-eslint/parser": "^8.8.1", @@ -123,8 +124,10 @@ "cookie": "^0.7.0" }, "dependencies": { + "@agoric/internal": "0.4.0-u18.0", "@metamask/approval-controller": "^7.1.1", "ava": "^6.2.0", + "setimmediate": "^1.0.5", "webextension-polyfill": "^0.12.0" } } diff --git a/packages/errors/src/constants.ts b/packages/errors/src/constants.ts index 943177d82..8072317ee 100644 --- a/packages/errors/src/constants.ts +++ b/packages/errors/src/constants.ts @@ -26,8 +26,6 @@ export const ErrorStruct = define( export enum ErrorCode { StreamReadError = 'STREAM_READ_ERROR', VatAlreadyExists = 'VAT_ALREADY_EXISTS', - VatCapTpConnectionExists = 'VAT_CAPTP_CONNECTION_EXISTS', - VatCapTpConnectionNotFound = 'VAT_CAPTP_CONNECTION_NOT_FOUND', VatDeleted = 'VAT_DELETED', VatNotFound = 'VAT_NOT_FOUND', } diff --git a/packages/errors/src/errors/StreamReadError.test.ts b/packages/errors/src/errors/StreamReadError.test.ts index ff5828a5f..1ec444399 100644 --- a/packages/errors/src/errors/StreamReadError.test.ts +++ b/packages/errors/src/errors/StreamReadError.test.ts @@ -7,22 +7,21 @@ import type { MarshaledOcapError } from '../types.js'; describe('StreamReadError', () => { const mockVatId = 'mockVatId'; - const mockSupervisorId = 'mockSupervisorId'; const mockOriginalError = new Error('Original error'); it('creates a StreamReadError for VatSupervisor with the correct properties', () => { const error = new StreamReadError( - { supervisorId: mockSupervisorId }, + { vatId: mockVatId }, { cause: mockOriginalError }, ); expect(error).toBeInstanceOf(StreamReadError); expect(error.code).toBe(ErrorCode.StreamReadError); expect(error.message).toBe('Unexpected stream read error.'); - expect(error.data).toStrictEqual({ supervisorId: mockSupervisorId }); + expect(error.data).toStrictEqual({ vatId: mockVatId }); expect(error.cause).toBe(mockOriginalError); }); - it('creates a StreamReadError for Vat with the correct properties', () => { + it('creates a StreamReadError for VatHandle with the correct properties', () => { const error = new StreamReadError( { vatId: mockVatId }, { cause: mockOriginalError }, @@ -46,7 +45,7 @@ describe('StreamReadError', () => { expect(error.cause).toBe(mockOriginalError); }); - it('unmarshals a valid marshaled StreamReadError for Vat', () => { + it('unmarshals a valid marshaled StreamReadError for VatHandle', () => { const data = { vatId: mockVatId }; const marshaledError: MarshaledOcapError = { [ErrorSentinel]: true, @@ -77,7 +76,7 @@ describe('StreamReadError', () => { }); it('unmarshals a valid marshaled StreamReadError for VatSupervisor', () => { - const data = { supervisorId: mockSupervisorId }; + const data = { vatId: mockVatId }; const marshaledError: MarshaledOcapError = { [ErrorSentinel]: true, message: 'Unexpected stream read error.', @@ -100,7 +99,7 @@ describe('StreamReadError', () => { expect(unmarshaledError.message).toBe('Unexpected stream read error.'); expect(unmarshaledError.stack).toBe('customStack'); expect(unmarshaledError.data).toStrictEqual({ - supervisorId: mockSupervisorId, + vatId: mockVatId, }); expect(unmarshaledError.cause).toBeInstanceOf(Error); expect((unmarshaledError.cause as Error).message).toBe('Original error'); @@ -121,25 +120,4 @@ describe('StreamReadError', () => { 'At path: data -- Expected the value to satisfy a union of `object | object | object`, but received: "invalid data"', ); }); - - it('throws when both vatId and supervisorId are present in data', () => { - const marshaledError: MarshaledOcapError = { - [ErrorSentinel]: true, - message: 'Unexpected stream read error.', - stack: 'customStack', - code: ErrorCode.StreamReadError, - data: { supervisorId: mockSupervisorId, vatId: mockVatId }, - cause: { - [ErrorSentinel]: true, - message: 'Original error', - stack: 'bar', - }, - }; - - expect(() => - StreamReadError.unmarshal(marshaledError, unmarshalErrorOptions), - ).toThrow( - 'At path: data -- Expected the value to satisfy a union of `object | object | object`, but received: [object Object]', - ); - }); }); diff --git a/packages/errors/src/errors/StreamReadError.ts b/packages/errors/src/errors/StreamReadError.ts index b43c3202a..684a1e425 100644 --- a/packages/errors/src/errors/StreamReadError.ts +++ b/packages/errors/src/errors/StreamReadError.ts @@ -16,10 +16,7 @@ import { } from '../constants.js'; import type { ErrorOptionsWithStack, MarshaledOcapError } from '../types.js'; -type StreamReadErrorData = - | { vatId: string } - | { supervisorId: string } - | { kernelId: string }; +type StreamReadErrorData = { vatId: string } | { kernelId: string }; type StreamReadErrorOptions = Required & Pick; @@ -41,18 +38,15 @@ export class StreamReadError extends BaseError { data: union([ object({ vatId: string(), - supervisorId: optional(never()), kernelId: optional(never()), }), object({ - supervisorId: string(), vatId: optional(never()), kernelId: optional(never()), }), object({ kernelId: string(), vatId: optional(never()), - supervisorId: optional(never()), }), ]), cause: MarshaledErrorStruct, diff --git a/packages/errors/src/errors/VatCapTpConnectionExistsError.test.ts b/packages/errors/src/errors/VatCapTpConnectionExistsError.test.ts deleted file mode 100644 index 85d4a1aeb..000000000 --- a/packages/errors/src/errors/VatCapTpConnectionExistsError.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { describe, it, expect } from 'vitest'; - -import { VatCapTpConnectionExistsError } from './VatCapTpConnectionExistsError.js'; -import { ErrorCode, ErrorSentinel } from '../constants.js'; -import { unmarshalErrorOptions } from '../marshal/unmarshalError.js'; -import type { MarshaledOcapError } from '../types.js'; - -describe('VatCapTpConnectionExistsError', () => { - const mockVatId = 'mockVatId'; - - it('creates a VatCapTpConnectionExistsError with the correct properties', () => { - const error = new VatCapTpConnectionExistsError(mockVatId); - expect(error).toBeInstanceOf(VatCapTpConnectionExistsError); - expect(error.code).toBe(ErrorCode.VatCapTpConnectionExists); - expect(error.message).toBe('Vat already has a CapTP connection.'); - expect(error.data).toStrictEqual({ vatId: mockVatId }); - expect(error.cause).toBeUndefined(); - }); - - it('unmarshals a valid marshaled error', () => { - const marshaledError: MarshaledOcapError = { - [ErrorSentinel]: true, - message: 'Vat already has a CapTP connection.', - code: ErrorCode.VatCapTpConnectionExists, - data: { vatId: mockVatId }, - stack: 'stack trace', - }; - - const unmarshaledError = VatCapTpConnectionExistsError.unmarshal( - marshaledError, - unmarshalErrorOptions, - ); - expect(unmarshaledError).toBeInstanceOf(VatCapTpConnectionExistsError); - expect(unmarshaledError.code).toBe(ErrorCode.VatCapTpConnectionExists); - expect(unmarshaledError.stack).toBe('stack trace'); - expect(unmarshaledError.message).toBe( - 'Vat already has a CapTP connection.', - ); - expect(unmarshaledError.data).toStrictEqual({ - vatId: mockVatId, - }); - }); - - it('throws an error when an invalid message is unmarshaled', () => { - const marshaledError: MarshaledOcapError = { - [ErrorSentinel]: true, - message: 'Vat already has a CapTP connection.', - code: ErrorCode.VatCapTpConnectionExists, - data: '{ vatId: mockVatId }', - stack: 'stack trace', - }; - - expect(() => - VatCapTpConnectionExistsError.unmarshal( - marshaledError, - unmarshalErrorOptions, - ), - ).toThrow( - 'At path: data -- Expected an object, but received: "{ vatId: mockVatId }"', - ); - }); -}); diff --git a/packages/errors/src/errors/VatCapTpConnectionExistsError.ts b/packages/errors/src/errors/VatCapTpConnectionExistsError.ts deleted file mode 100644 index 36c183bdc..000000000 --- a/packages/errors/src/errors/VatCapTpConnectionExistsError.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { assert, literal, object, string } from '@metamask/superstruct'; - -import { BaseError } from '../BaseError.js'; -import { marshaledErrorSchema, ErrorCode } from '../constants.js'; -import type { ErrorOptionsWithStack, MarshaledOcapError } from '../types.js'; - -export class VatCapTpConnectionExistsError extends BaseError { - constructor(vatId: string, options?: ErrorOptionsWithStack) { - super( - ErrorCode.VatCapTpConnectionExists, - 'Vat already has a CapTP connection.', - { - ...options, - data: { vatId }, - }, - ); - harden(this); - } - - /** - * A superstruct struct for validating marshaled {@link VatCapTpConnectionExistsError} instances. - */ - public static struct = object({ - ...marshaledErrorSchema, - code: literal(ErrorCode.VatCapTpConnectionExists), - data: object({ - vatId: string(), - }), - }); - - /** - * Unmarshals a {@link MarshaledError} into a {@link VatCapTpConnectionExistsError}. - * - * @param marshaledError - The marshaled error to unmarshal. - * @param unmarshalErrorOptions - The function to unmarshal the error options. - * @returns The unmarshaled error. - */ - public static unmarshal( - marshaledError: MarshaledOcapError, - - unmarshalErrorOptions: ( - marshaledError: MarshaledOcapError, - ) => ErrorOptionsWithStack, - ): VatCapTpConnectionExistsError { - assert(marshaledError, this.struct); - return new VatCapTpConnectionExistsError( - marshaledError.data.vatId, - unmarshalErrorOptions(marshaledError), - ); - } -} -harden(VatCapTpConnectionExistsError); diff --git a/packages/errors/src/errors/VatCapTpConnectionNotFoundError.test.ts b/packages/errors/src/errors/VatCapTpConnectionNotFoundError.test.ts deleted file mode 100644 index a2fb77a6d..000000000 --- a/packages/errors/src/errors/VatCapTpConnectionNotFoundError.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { describe, it, expect } from 'vitest'; - -import { VatCapTpConnectionNotFoundError } from './VatCapTpConnectionNotFoundError.js'; -import { ErrorCode, ErrorSentinel } from '../constants.js'; -import { unmarshalErrorOptions } from '../marshal/unmarshalError.js'; -import type { MarshaledOcapError } from '../types.js'; - -describe('VatCapTpConnectionNotFoundError', () => { - const mockVatId = 'mockVatId'; - - it('creates a VatCapTpConnectionNotFoundError with the correct properties', () => { - const error = new VatCapTpConnectionNotFoundError(mockVatId); - expect(error).toBeInstanceOf(VatCapTpConnectionNotFoundError); - expect(error.code).toBe(ErrorCode.VatCapTpConnectionNotFound); - expect(error.message).toBe('Vat does not have a CapTP connection.'); - expect(error.data).toStrictEqual({ vatId: mockVatId }); - expect(error.cause).toBeUndefined(); - }); - - it('unmarshals a valid marshaled error', () => { - const marshaledError: MarshaledOcapError = { - [ErrorSentinel]: true, - message: 'Vat does not have a CapTP connection.', - code: ErrorCode.VatCapTpConnectionNotFound, - data: { vatId: mockVatId }, - stack: 'stack trace', - }; - - const unmarshaledError = VatCapTpConnectionNotFoundError.unmarshal( - marshaledError, - unmarshalErrorOptions, - ); - expect(unmarshaledError).toBeInstanceOf(VatCapTpConnectionNotFoundError); - expect(unmarshaledError.code).toBe(ErrorCode.VatCapTpConnectionNotFound); - expect(unmarshaledError.stack).toBe('stack trace'); - expect(unmarshaledError.message).toBe( - 'Vat does not have a CapTP connection.', - ); - expect(unmarshaledError.data).toStrictEqual({ - vatId: mockVatId, - }); - }); - - it('throws an error when an invalid message is unmarshaled', () => { - const marshaledError: MarshaledOcapError = { - [ErrorSentinel]: true, - message: 'Vat does not have a CapTP connection.', - code: ErrorCode.VatCapTpConnectionNotFound, - data: '{ vatId: mockVatId }', - stack: 'stack trace', - }; - - expect(() => - VatCapTpConnectionNotFoundError.unmarshal( - marshaledError, - unmarshalErrorOptions, - ), - ).toThrow( - 'At path: data -- Expected an object, but received: "{ vatId: mockVatId }"', - ); - }); -}); diff --git a/packages/errors/src/errors/VatCapTpConnectionNotFoundError.ts b/packages/errors/src/errors/VatCapTpConnectionNotFoundError.ts deleted file mode 100644 index a328c24fb..000000000 --- a/packages/errors/src/errors/VatCapTpConnectionNotFoundError.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { assert, literal, object, string } from '@metamask/superstruct'; - -import { BaseError } from '../BaseError.js'; -import { marshaledErrorSchema, ErrorCode } from '../constants.js'; -import type { ErrorOptionsWithStack, MarshaledOcapError } from '../types.js'; - -export class VatCapTpConnectionNotFoundError extends BaseError { - constructor(vatId: string, options?: ErrorOptionsWithStack) { - super( - ErrorCode.VatCapTpConnectionNotFound, - 'Vat does not have a CapTP connection.', - { - ...options, - data: { vatId }, - }, - ); - harden(this); - } - - /** - * A superstruct struct for validating marshaled {@link VatCapTpConnectionNotFoundError} instances. - */ - public static struct = object({ - ...marshaledErrorSchema, - code: literal(ErrorCode.VatCapTpConnectionNotFound), - data: object({ - vatId: string(), - }), - }); - - /** - * Unmarshals a {@link MarshaledError} into a {@link VatCapTpConnectionNotFoundError}. - * - * @param marshaledError - The marshaled error to unmarshal. - * @param unmarshalErrorOptions - The function to unmarshal the error options. - * @returns The unmarshaled error. - */ - public static unmarshal( - marshaledError: MarshaledOcapError, - unmarshalErrorOptions: ( - marshaledError: MarshaledOcapError, - ) => ErrorOptionsWithStack, - ): VatCapTpConnectionNotFoundError { - assert(marshaledError, this.struct); - return new VatCapTpConnectionNotFoundError( - marshaledError.data.vatId, - unmarshalErrorOptions(marshaledError), - ); - } -} -harden(VatCapTpConnectionNotFoundError); diff --git a/packages/errors/src/errors/index.ts b/packages/errors/src/errors/index.ts index c70b39a9f..58a217974 100644 --- a/packages/errors/src/errors/index.ts +++ b/packages/errors/src/errors/index.ts @@ -1,7 +1,5 @@ import { StreamReadError } from './StreamReadError.js'; import { VatAlreadyExistsError } from './VatAlreadyExistsError.js'; -import { VatCapTpConnectionExistsError } from './VatCapTpConnectionExistsError.js'; -import { VatCapTpConnectionNotFoundError } from './VatCapTpConnectionNotFoundError.js'; import { VatDeletedError } from './VatDeletedError.js'; import { VatNotFoundError } from './VatNotFoundError.js'; import { ErrorCode } from '../constants.js'; @@ -9,8 +7,6 @@ import { ErrorCode } from '../constants.js'; export const errorClasses = { [ErrorCode.StreamReadError]: StreamReadError, [ErrorCode.VatAlreadyExists]: VatAlreadyExistsError, - [ErrorCode.VatCapTpConnectionExists]: VatCapTpConnectionExistsError, - [ErrorCode.VatCapTpConnectionNotFound]: VatCapTpConnectionNotFoundError, [ErrorCode.VatDeleted]: VatDeletedError, [ErrorCode.VatNotFound]: VatNotFoundError, } as const; diff --git a/packages/errors/src/index.test.ts b/packages/errors/src/index.test.ts index 70aa6dde2..4a2b90e86 100644 --- a/packages/errors/src/index.test.ts +++ b/packages/errors/src/index.test.ts @@ -12,8 +12,6 @@ describe('index', () => { 'MarshaledOcapErrorStruct', 'StreamReadError', 'VatAlreadyExistsError', - 'VatCapTpConnectionExistsError', - 'VatCapTpConnectionNotFoundError', 'VatDeletedError', 'VatNotFoundError', 'isMarshaledError', diff --git a/packages/errors/src/index.ts b/packages/errors/src/index.ts index 3308827ab..10cda3843 100644 --- a/packages/errors/src/index.ts +++ b/packages/errors/src/index.ts @@ -1,6 +1,4 @@ export type { OcapError, MarshaledError } from './types.js'; -export { VatCapTpConnectionExistsError } from './errors/VatCapTpConnectionExistsError.js'; -export { VatCapTpConnectionNotFoundError } from './errors/VatCapTpConnectionNotFoundError.js'; export { VatAlreadyExistsError } from './errors/VatAlreadyExistsError.js'; export { VatDeletedError } from './errors/VatDeletedError.js'; export { VatNotFoundError } from './errors/VatNotFoundError.js'; diff --git a/packages/extension/package.json b/packages/extension/package.json index 33bab0f4c..f3879c653 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -43,8 +43,7 @@ }, "dependencies": { "@endo/eventual-send": "^1.2.6", - "@endo/exo": "^1.5.4", - "@endo/patterns": "^1.4.4", + "@endo/marshal": "^1.6.2", "@endo/promise-kit": "^1.1.6", "@metamask/snaps-utils": "^8.3.0", "@metamask/superstruct": "^3.1.0", @@ -54,7 +53,6 @@ "@ocap/shims": "workspace:^", "@ocap/streams": "workspace:^", "@ocap/utils": "workspace:^", - "@sqlite.org/sqlite-wasm": "3.46.1-build5", "react": "^18.3.1", "react-dom": "^18.3.1", "ses": "^1.9.0" diff --git a/packages/extension/src/background.ts b/packages/extension/src/background.ts index fc646649c..f59f89f99 100644 --- a/packages/extension/src/background.ts +++ b/packages/extension/src/background.ts @@ -38,13 +38,6 @@ async function main(): Promise { // globalThis.kernel will exist due to dev-console.js in background-trusted-prelude.js Object.defineProperties(globalThis.kernel, { - capTpCall: { - value: async (method: string, params: Json[]) => - sendClusterCommand({ - method: KernelCommandMethod.capTpCall, - params: { method, params }, - }), - }, evaluate: { value: async (source: string) => sendClusterCommand({ @@ -96,7 +89,6 @@ async function main(): Promise { switch (message.method) { case KernelCommandMethod.evaluate: - case KernelCommandMethod.capTpCall: case KernelCommandMethod.ping: case KernelCommandMethod.kvGet: case KernelCommandMethod.kvSet: diff --git a/packages/extension/src/iframe.ts b/packages/extension/src/iframe.ts index 5e5964719..fd8a563cd 100644 --- a/packages/extension/src/iframe.ts +++ b/packages/extension/src/iframe.ts @@ -1,6 +1,3 @@ -import { makeExo } from '@endo/exo'; -import { M } from '@endo/patterns'; -import type { Json } from '@metamask/utils'; import { isVatCommand, VatSupervisor } from '@ocap/kernel'; import type { VatCommand, VatCommandReply } from '@ocap/kernel'; import { MessagePortMultiplexer, receiveMessagePort } from '@ocap/streams'; @@ -16,24 +13,15 @@ async function main(): Promise { (listener) => removeEventListener('message', listener), ).then(async (port) => new MessagePortMultiplexer(port)); - const bootstrap = makeExo( - 'TheGreatFrangooly', - M.interface('TheGreatFrangooly', {}, { defaultGuards: 'passable' }), - { whatIsTheGreatFrangooly: () => 'Crowned with Chaos' }, - ); - const commandStream = multiplexer.createChannel( 'command', isVatCommand, ); - const capTpStream = multiplexer.createChannel('capTp'); - const supervisor = new VatSupervisor({ + // eslint-disable-next-line no-new + new VatSupervisor({ id: 'iframe', commandStream, - capTpStream, - bootstrap, }); - console.log(supervisor.evaluate('["Hello", "world!"].join(" ");')); await multiplexer.start(); } diff --git a/packages/extension/src/kernel-integration/handle-panel-message.test.ts b/packages/extension/src/kernel-integration/handle-panel-message.test.ts index d01d5ae3d..59e38f82d 100644 --- a/packages/extension/src/kernel-integration/handle-panel-message.test.ts +++ b/packages/extension/src/kernel-integration/handle-panel-message.test.ts @@ -51,9 +51,10 @@ describe('handlePanelMessage', () => { mockKVStore = { get: vi.fn(), getRequired: vi.fn(), + getNextKey: vi.fn(), set: vi.fn(), delete: vi.fn(), - truncate: vi.fn(), + clear: vi.fn(), executeQuery: vi.fn(), }; @@ -63,6 +64,7 @@ describe('handlePanelMessage', () => { restartVat: vi.fn().mockResolvedValue(undefined), terminateVat: vi.fn().mockResolvedValue(undefined), terminateAllVats: vi.fn().mockResolvedValue(undefined), + clearStorage: vi.fn().mockResolvedValue(undefined), getVatIds: vi.fn().mockReturnValue(['v0', 'v1']), getVats: vi.fn().mockReturnValue([ { diff --git a/packages/extension/src/kernel-integration/handlers/index.ts b/packages/extension/src/kernel-integration/handlers/index.ts index c84b96019..9507963bb 100644 --- a/packages/extension/src/kernel-integration/handlers/index.ts +++ b/packages/extension/src/kernel-integration/handlers/index.ts @@ -2,6 +2,7 @@ import { clearStateHandler } from './clear-state.js'; import { executeDBQueryHandler } from './execute-db-query.js'; import { getStatusHandler } from './get-status.js'; import { launchVatHandler } from './launch-vat.js'; +import { reloadConfigHandler } from './reload-config.js'; import { restartVatHandler } from './restart-vat.js'; import { sendMessageHandler } from './send-message.js'; import { terminateAllVatsHandler } from './terminate-all-vats.js'; @@ -13,6 +14,7 @@ export const handlers = [ sendMessageHandler, executeDBQueryHandler, launchVatHandler, + reloadConfigHandler, restartVatHandler, terminateVatHandler, terminateAllVatsHandler, diff --git a/packages/extension/src/kernel-integration/handlers/reload-config.ts b/packages/extension/src/kernel-integration/handlers/reload-config.ts new file mode 100644 index 000000000..eaa1a8d2d --- /dev/null +++ b/packages/extension/src/kernel-integration/handlers/reload-config.ts @@ -0,0 +1,19 @@ +import type { Json } from '@metamask/utils'; +import type { Kernel } from '@ocap/kernel'; + +import type { CommandHandler } from '../command-registry.js'; +import { + KernelCommandPayloadStructs, + KernelControlMethod, +} from '../messages.js'; + +type ReloadMethod = typeof KernelControlMethod.reload; + +export const reloadConfigHandler: CommandHandler = { + method: KernelControlMethod.reload, + schema: KernelCommandPayloadStructs.clearState.schema.params, + implementation: async (kernel: Kernel): Promise => { + await kernel.reset(); + return null; + }, +}; diff --git a/packages/extension/src/kernel-integration/kernel-worker.ts b/packages/extension/src/kernel-integration/kernel-worker.ts index 5d1f2e495..784734a94 100644 --- a/packages/extension/src/kernel-integration/kernel-worker.ts +++ b/packages/extension/src/kernel-integration/kernel-worker.ts @@ -3,7 +3,7 @@ import type { KernelCommandReply, ClusterConfig, } from '@ocap/kernel'; -import { isKernelCommand, Kernel } from '@ocap/kernel'; +import { isKernelCommand, Kernel, makeSQLKVStore } from '@ocap/kernel'; import { MessagePortDuplexStream, receiveMessagePort, @@ -15,7 +15,6 @@ import { makeLogger } from '@ocap/utils'; import { handlePanelMessage } from './handle-panel-message.js'; import { isKernelControlCommand } from './messages.js'; import type { KernelControlCommand, KernelControlReply } from './messages.js'; -import { makeSQLKVStore } from './sqlite-kv-store.js'; import { ExtensionVatWorkerClient } from './VatWorkerClient.js'; const bundleHost = 'http://localhost:3000'; // XXX placeholder @@ -92,12 +91,24 @@ async function main(): Promise { await Promise.all([ vatWorkerClient.start(), - // Run default kernel lifecycle - kernel.launchSubcluster(defaultSubcluster), multiplexer.start(), panelStream.drain(async (message) => { const reply = await handlePanelMessage(kernel, kvStore, message); await panelStream.write(reply); }), + // XXX We are mildly concerned that there's a small chance that a race here + // could cause startup to flake non-deterministically. If the invocation + // here of `launchSubcluster` turns out to depend on aspects of the IPC + // setup completing successfully but those pieces aren't ready in time, then + // it could get stuck. Current experience suggests this is not a problem, + // but as yet have only an intuitive sense (i.e., promises, yay) why this + // might be true rather than a principled explanation that it is necessarily + // true. Hence this comment to serve as a marker if some problem crops up + // with startup wedging and some poor soul is reading through the code + // trying to diagnose it. + (async () => { + const roots = await kernel.launchSubcluster(defaultSubcluster); + console.log(`Subcluster launched: ${JSON.stringify(roots)}`); + })(), ]); } diff --git a/packages/extension/src/kernel-integration/messages.test.ts b/packages/extension/src/kernel-integration/messages.test.ts index 0872dbc21..2d6c18bd6 100644 --- a/packages/extension/src/kernel-integration/messages.test.ts +++ b/packages/extension/src/kernel-integration/messages.test.ts @@ -16,6 +16,7 @@ describe('KernelControlMethod', () => { 'terminateVat', 'terminateAllVats', 'getStatus', + 'reload', 'sendMessage', 'clearState', 'executeDBQuery', diff --git a/packages/extension/src/kernel-integration/messages.ts b/packages/extension/src/kernel-integration/messages.ts index 11ddfae19..927a8551a 100644 --- a/packages/extension/src/kernel-integration/messages.ts +++ b/packages/extension/src/kernel-integration/messages.ts @@ -21,6 +21,7 @@ export const KernelControlMethod = { terminateVat: 'terminateVat', terminateAllVats: 'terminateAllVats', getStatus: 'getStatus', + reload: 'reload', sendMessage: 'sendMessage', clearState: 'clearState', executeDBQuery: 'executeDBQuery', @@ -66,6 +67,10 @@ export const KernelCommandPayloadStructs = { method: literal(KernelControlMethod.getStatus), params: literal(null), }), + [KernelControlMethod.reload]: object({ + method: literal(KernelControlMethod.reload), + params: literal(null), + }), [KernelControlMethod.sendMessage]: object({ method: literal(KernelControlMethod.sendMessage), params: object({ @@ -106,6 +111,10 @@ export const KernelReplyPayloadStructs = { method: literal(KernelControlMethod.getStatus), params: union([KernelStatusStruct, object({ error: string() })]), }), + [KernelControlMethod.reload]: object({ + method: literal(KernelControlMethod.reload), + params: union([literal(null), object({ error: string() })]), + }), [KernelControlMethod.sendMessage]: object({ method: literal(KernelControlMethod.sendMessage), params: UnsafeJsonStruct, @@ -131,6 +140,7 @@ const KernelControlCommandStruct = object({ KernelCommandPayloadStructs.terminateVat, KernelCommandPayloadStructs.terminateAllVats, KernelCommandPayloadStructs.getStatus, + KernelCommandPayloadStructs.reload, KernelCommandPayloadStructs.sendMessage, KernelCommandPayloadStructs.clearState, KernelCommandPayloadStructs.executeDBQuery, @@ -145,6 +155,7 @@ const KernelControlReplyStruct = object({ KernelReplyPayloadStructs.terminateVat, KernelReplyPayloadStructs.terminateAllVats, KernelReplyPayloadStructs.getStatus, + KernelReplyPayloadStructs.reload, KernelReplyPayloadStructs.sendMessage, KernelReplyPayloadStructs.clearState, KernelReplyPayloadStructs.executeDBQuery, diff --git a/packages/extension/src/ui/App.module.css b/packages/extension/src/ui/App.module.css index 4a3543f64..c168cc121 100644 --- a/packages/extension/src/ui/App.module.css +++ b/packages/extension/src/ui/App.module.css @@ -289,7 +289,8 @@ div + .sent { } .rightPanel { - position: relative; + position: sticky; + top: var(--spacing-lg); display: flex; flex-direction: column; max-height: calc(100vh - var(--spacing-xl) * 2); diff --git a/packages/extension/src/ui/components/KernelControls.test.tsx b/packages/extension/src/ui/components/KernelControls.test.tsx index 1c881c915..a5a3f2265 100644 --- a/packages/extension/src/ui/components/KernelControls.test.tsx +++ b/packages/extension/src/ui/components/KernelControls.test.tsx @@ -27,6 +27,7 @@ const mockUseKernelActions = (overrides = {}): void => { vi.mocked(useKernelActions).mockReturnValue({ terminateAllVats: vi.fn(), clearState: vi.fn(), + reload: vi.fn(), sendKernelCommand: vi.fn(), launchVat: vi.fn(), ...overrides, @@ -104,4 +105,16 @@ describe('KernelControls', () => { await userEvent.click(clearButton); expect(clearState).toHaveBeenCalledTimes(1); }); + + it('calls reload when "Reload Default Sub-Cluster" button is clicked', async () => { + const reload = vi.fn(); + mockUseKernelActions({ reload }); + mockUseVats(); + render(); + const reloadButton = screen.getByRole('button', { + name: 'Reload Default Sub-Cluster', + }); + await userEvent.click(reloadButton); + expect(reload).toHaveBeenCalledTimes(1); + }); }); diff --git a/packages/extension/src/ui/components/KernelControls.tsx b/packages/extension/src/ui/components/KernelControls.tsx index 3cf5379bb..bfeadf1d3 100644 --- a/packages/extension/src/ui/components/KernelControls.tsx +++ b/packages/extension/src/ui/components/KernelControls.tsx @@ -6,7 +6,7 @@ import { useVats } from '../hooks/useVats.js'; * @returns A panel for controlling the kernel. */ export const KernelControls: React.FC = () => { - const { terminateAllVats, clearState } = useKernelActions(); + const { terminateAllVats, clearState, reload } = useKernelActions(); const { vats } = useVats(); return ( @@ -19,6 +19,9 @@ export const KernelControls: React.FC = () => { + ); }; diff --git a/packages/extension/src/ui/components/LaunchVat.test.tsx b/packages/extension/src/ui/components/LaunchVat.test.tsx index 0554af011..eb03a1bd6 100644 --- a/packages/extension/src/ui/components/LaunchVat.test.tsx +++ b/packages/extension/src/ui/components/LaunchVat.test.tsx @@ -24,6 +24,7 @@ describe('LaunchVat Component', () => { sendKernelCommand: vi.fn(), terminateAllVats: vi.fn(), clearState: vi.fn(), + reload: vi.fn(), }); }); diff --git a/packages/extension/src/ui/components/MessagePanel.test.tsx b/packages/extension/src/ui/components/MessagePanel.test.tsx index 0b62695da..c3fcc100e 100644 --- a/packages/extension/src/ui/components/MessagePanel.test.tsx +++ b/packages/extension/src/ui/components/MessagePanel.test.tsx @@ -55,6 +55,7 @@ describe('MessagePanel Component', () => { sendKernelCommand, terminateAllVats: vi.fn(), clearState: vi.fn(), + reload: vi.fn(), launchVat: vi.fn(), }); vi.mocked(usePanelContext).mockReturnValue({ diff --git a/packages/extension/src/ui/components/MessagePanel.tsx b/packages/extension/src/ui/components/MessagePanel.tsx index a2370ef25..e91095a89 100644 --- a/packages/extension/src/ui/components/MessagePanel.tsx +++ b/packages/extension/src/ui/components/MessagePanel.tsx @@ -24,6 +24,7 @@ const getLogTypeIcon = (type: OutputType): string => { return '⚠'; case 'success': return '✓'; + case 'sent': default: return '→'; } diff --git a/packages/extension/src/ui/css.d.ts b/packages/extension/src/ui/css.d.ts index 0b4610936..3d673e2eb 100644 --- a/packages/extension/src/ui/css.d.ts +++ b/packages/extension/src/ui/css.d.ts @@ -1,4 +1,3 @@ -/* eslint-disable import-x/unambiguous */ declare module '*.module.css' { const classes: { [key: string]: string }; export default classes; diff --git a/packages/extension/src/ui/hooks/useKernelActions.test.ts b/packages/extension/src/ui/hooks/useKernelActions.test.ts index 2dd4d8e5a..8e8440b35 100644 --- a/packages/extension/src/ui/hooks/useKernelActions.test.ts +++ b/packages/extension/src/ui/hooks/useKernelActions.test.ts @@ -10,6 +10,7 @@ vi.mock('../../kernel-integration/messages.js', () => ({ sendMessage: 'sendMessage', terminateAllVats: 'terminateAllVats', clearState: 'clearState', + reload: 'reload', launchVat: 'launchVat', }, })); @@ -190,6 +191,42 @@ describe('useKernelActions', () => { }); }); + describe('reload', () => { + it('sends reload command', async () => { + const { useKernelActions } = await import('./useKernelActions.js'); + const { result } = renderHook(() => useKernelActions()); + + mockSendMessage.mockResolvedValueOnce({ success: true }); + + result.current.reload(); + await waitFor(() => { + expect(mockSendMessage).toHaveBeenCalledWith({ + method: 'reload', + params: null, + }); + }); + expect(mockLogMessage).toHaveBeenCalledWith( + 'Default sub-cluster reloaded', + 'success', + ); + }); + + it('logs error on failure', async () => { + const { useKernelActions } = await import('./useKernelActions.js'); + const { result } = renderHook(() => useKernelActions()); + + mockSendMessage.mockRejectedValueOnce(new Error()); + + result.current.reload(); + await waitFor(() => { + expect(mockLogMessage).toHaveBeenCalledWith( + 'Failed to reload', + 'error', + ); + }); + }); + }); + describe('launchVat', () => { it('sends launch vat command with correct parameters', async () => { const { useKernelActions } = await import('./useKernelActions.js'); diff --git a/packages/extension/src/ui/hooks/useKernelActions.ts b/packages/extension/src/ui/hooks/useKernelActions.ts index b2d99dd90..b7e1188f7 100644 --- a/packages/extension/src/ui/hooks/useKernelActions.ts +++ b/packages/extension/src/ui/hooks/useKernelActions.ts @@ -13,6 +13,7 @@ export function useKernelActions(): { sendKernelCommand: () => void; terminateAllVats: () => void; clearState: () => void; + reload: () => void; launchVat: (bundleUrl: string, vatName: string) => void; } { const { sendMessage, logMessage, messageContent, selectedVatId } = @@ -57,6 +58,18 @@ export function useKernelActions(): { .catch(() => logMessage('Failed to clear state', 'error')); }, [sendMessage, logMessage]); + /** + * Reloads the kernel default sub-cluster. + */ + const reload = useCallback(() => { + sendMessage({ + method: KernelControlMethod.reload, + params: null, + }) + .then(() => logMessage('Default sub-cluster reloaded', 'success')) + .catch(() => logMessage('Failed to reload', 'error')); + }, [sendMessage, logMessage]); + /** * Launches a vat. */ @@ -81,6 +94,7 @@ export function useKernelActions(): { sendKernelCommand, terminateAllVats, clearState, + reload, launchVat, }; } diff --git a/packages/extension/src/vats/sample-vat.js b/packages/extension/src/vats/sample-vat.js index 118704e89..7653ae74a 100644 --- a/packages/extension/src/vats/sample-vat.js +++ b/packages/extension/src/vats/sample-vat.js @@ -1,14 +1,30 @@ +import { E } from '@endo/eventual-send'; +import { Far } from '@endo/marshal'; + /** - * Start function for generic test vat. + * Build function for generic test vat. * + * @param {unknown} _vatPowers - Special powers granted to this vat (not used here). * @param {unknown} parameters - Initialization parameters from the vat's config object. + * @param {unknown} _baggage - Root of vat's persistent state (not used here). * @returns {unknown} The root object for the new vat. */ -export function start(parameters) { +export function buildRootObject(_vatPowers, parameters, _baggage) { const name = parameters?.name ?? 'anonymous'; - console.log(`start vat root object "${name}"`); - return { - name, - stuff: `initialized with ${JSON.stringify(parameters)}`, - }; + console.log(`buildRootObject "${name}"`); + + return Far('root', { + async bootstrap(vats) { + console.log(`vat ${name} is bootstrap`); + const pb = E(vats.bob).hello(name); + const pc = E(vats.carol).hello(name); + console.log(`vat ${name} got "hello" answer from Bob: '${await pb}'`); + console.log(`vat ${name} got "hello" answer from Carol: '${await pc}'`); + }, + hello(from) { + const message = `vat ${name} got "hello" from ${from}`; + console.log(message); + return message; + }, + }); } diff --git a/packages/extension/tsconfig.build.json b/packages/extension/tsconfig.build.json index fde593e1b..d8a815537 100644 --- a/packages/extension/tsconfig.build.json +++ b/packages/extension/tsconfig.build.json @@ -23,6 +23,7 @@ "./src/**/*.tsx", "./src/**/*.module.css", "./src/**/*-trusted-prelude.js", - "./src/env/dev-console.js" + "./src/env/dev-console.js", + "../../types" ] } diff --git a/packages/extension/tsconfig.json b/packages/extension/tsconfig.json index c277d19f6..758d498f1 100644 --- a/packages/extension/tsconfig.json +++ b/packages/extension/tsconfig.json @@ -40,6 +40,7 @@ "./test/**/*.ts", "./vite-plugins/*.ts", "./vite.config.ts", - "./vitest.config.ts" + "./vitest.config.ts", + "../../types" ] } diff --git a/packages/kernel/package.json b/packages/kernel/package.json index f4ba58781..4fa0de43a 100644 --- a/packages/kernel/package.json +++ b/packages/kernel/package.json @@ -43,9 +43,15 @@ "test:watch": "vitest --config vitest.config.ts" }, "dependencies": { - "@endo/captp": "^4.4.0", + "@agoric/swingset-liveslots": "0.10.3-u18.0", + "@endo/errors": "^1.2.8", "@endo/eventual-send": "^1.2.6", + "@endo/exo": "^1.5.4", + "@endo/far": "^1.1.9", "@endo/import-bundle": "^1.3.1", + "@endo/marshal": "^1.6.2", + "@endo/pass-style": "^1.4.7", + "@endo/patterns": "^1.4.4", "@endo/promise-kit": "^1.1.6", "@metamask/superstruct": "^3.1.0", "@metamask/utils": "^11.0.1", @@ -53,7 +59,9 @@ "@ocap/shims": "workspace:^", "@ocap/streams": "workspace:^", "@ocap/utils": "workspace:^", - "ses": "^1.9.0" + "@sqlite.org/sqlite-wasm": "3.46.1-build3", + "ses": "^1.9.0", + "setimmediate": "^1.0.5" }, "devDependencies": { "@metamask/auto-changelog": "^4.0.0", @@ -64,6 +72,7 @@ "@ocap/test-utils": "workspace:^", "@ts-bridge/cli": "^0.6.2", "@ts-bridge/shims": "^0.1.1", + "@types/setimmediate": "^1.0.4", "@typescript-eslint/utils": "^8.8.1", "@vitest/eslint-plugin": "^1.1.24", "depcheck": "^1.4.7", diff --git a/packages/kernel/src/Kernel.test.ts b/packages/kernel/src/Kernel.test.ts index 4f093de63..cee9b10ad 100644 --- a/packages/kernel/src/Kernel.test.ts +++ b/packages/kernel/src/Kernel.test.ts @@ -13,7 +13,7 @@ import type { KernelCommandReply, VatCommand, } from './messages/index.js'; -import type { KVStore } from './store/kernel-store.js'; +import type { KVStore } from './store/sqlite-kv-store.js'; import type { VatId, VatConfig, VatWorkerService } from './types.js'; import { VatHandle } from './VatHandle.js'; import { makeMapKVStore } from '../test/storage.js'; diff --git a/packages/kernel/src/Kernel.ts b/packages/kernel/src/Kernel.ts index 411cff57b..2d257d52f 100644 --- a/packages/kernel/src/Kernel.ts +++ b/packages/kernel/src/Kernel.ts @@ -1,5 +1,7 @@ import '@ocap/shims/endoify'; -import type { Json } from '@metamask/utils'; +import { passStyleOf } from '@endo/far'; +import type { CapData } from '@endo/marshal'; +import { makePromiseKit } from '@endo/promise-kit'; import { StreamReadError, VatAlreadyExistsError, @@ -8,8 +10,12 @@ import { } from '@ocap/errors'; import type { DuplexStream } from '@ocap/streams'; import type { Logger } from '@ocap/utils'; -import { makeLogger, stringify } from '@ocap/utils'; +import { makeLogger } from '@ocap/utils'; +// XXX Once the packaging of liveslots is fixed, these should be imported from there +import type { Message, VatOneResolution } from './ag-types.js'; +import { kser, kunser, krefOf, kslot } from './kernel-marshal.js'; +import type { SlotValue } from './kernel-marshal.js'; import { isKernelCommand, isVatCommandReply, @@ -21,19 +27,50 @@ import type { KernelCommandReply, VatCommand, VatCommandReply, + VatCommandReturnType, } from './messages/index.js'; -import type { VatCommandReturnType } from './messages/vat.js'; -import { makeKernelStore } from './store/kernel-store.js'; -import type { KVStore, KernelStore } from './store/kernel-store.js'; -import { VatStateService } from './store/vat-state-service.js'; +import type { KernelStore } from './store/kernel-store.js'; +import { + parseRef, + isPromiseRef, + makeKernelStore, +} from './store/kernel-store.js'; +import type { KVStore } from './store/sqlite-kv-store.js'; import type { VatId, + VRef, + ERef, + KRef, VatWorkerService, ClusterConfig, VatConfig, + RunQueueItem, + RunQueueItemSend, + RunQueueItemNotify, } from './types.js'; +import { ROOT_OBJECT_VREF } from './types.js'; import { VatHandle } from './VatHandle.js'; +/** + * Obtain the KRef from a simple value represented as a CapData object. + * + * @param data - The data object to be examined. + * @returns the single KRef that is `data`, or null if it isn't one. + */ +function extractSingleRef(data: CapData): KRef | null { + const value = kunser(data) as SlotValue; + const style: string = passStyleOf(value); + if (style === 'remotable' || style === 'promise') { + return krefOf(value) as KRef; + } + return null; +} + +type MessageRoute = { + vatId?: VatId; + target: KRef; +} | null; + export class Kernel { readonly #stream: DuplexStream; @@ -45,7 +82,11 @@ export class Kernel { readonly #logger: Logger; - readonly #vatStateService: VatStateService; + #runQueueLength: number; + + #wakeUpQueue: (() => void) | null; + + #mostRecentSubcluster: ClusterConfig | null; constructor( stream: DuplexStream, @@ -53,12 +94,15 @@ export class Kernel { rawStorage: KVStore, logger?: Logger, ) { + this.#mostRecentSubcluster = null; this.#stream = stream; this.#vats = new Map(); this.#vatWorkerService = vatWorkerService; + rawStorage.clear(); // XXX debug only! this.#storage = makeKernelStore(rawStorage); this.#logger = logger ?? makeLogger('[ocap kernel]'); - this.#vatStateService = new VatStateService(); + this.#runQueueLength = this.#storage.runQueueLength(); + this.#wakeUpQueue = null; } async init(): Promise { @@ -71,6 +115,99 @@ export class Kernel { // since they occur after the constructor has returned. throw new StreamReadError({ kernelId: 'kernel' }, error); }); + // eslint-disable-next-line no-void + void this.#run(); + } + + async #run(): Promise { + for await (const item of this.#runQueueItems()) { + await this.#deliver(item); + } + } + + async *#runQueueItems(): AsyncGenerator { + for (;;) { + while (this.#runQueueLength > 0) { + const item = this.#dequeueRun(); + if (item) { + yield item; + } else { + break; + } + } + if (this.#runQueueLength === 0) { + const { promise, resolve } = makePromiseKit(); + if (this.#wakeUpQueue !== null) { + throw Error(`wakeUpQueue function already set`); + } + this.#wakeUpQueue = resolve; + await promise; + } + } + } + + async #receiveMessages(): Promise { + for await (const message of this.#stream) { + if (!isKernelCommand(message)) { + this.#logger.error('Received unexpected message', message); + continue; + } + + const { method, params } = message; + + let vat: VatHandle; + + switch (method) { + case KernelCommandMethod.ping: + await this.#reply({ method, params: 'pong' }); + break; + case KernelCommandMethod.evaluate: + if (!this.#vats.size) { + throw new Error('No vats available to call'); + } + vat = this.#vats.values().next().value as VatHandle; + await this.#reply({ + method, + params: await this.evaluate(vat.vatId, params), + }); + break; + case KernelCommandMethod.kvSet: + this.kvSet(params.key, params.value); + await this.#reply({ + method, + params: `~~~ set "${params.key}" to "${params.value}" ~~~`, + }); + break; + case KernelCommandMethod.kvGet: { + try { + const value = this.kvGet(params); + const result = + typeof value === 'string' ? `"${value}"` : `${value}`; + await this.#reply({ + method, + params: `~~~ got ${result} ~~~`, + }); + } catch (problem) { + // TODO: marshal + await this.#reply({ + method, + params: String(toError(problem)), + }); + } + break; + } + default: + console.error( + 'kernel worker received unexpected command', + // @ts-expect-error Runtime does not respect "never". + { method: method.valueOf(), params }, + ); + } + } + } + + async #reply(message: KernelCommandReply): Promise { + await this.#stream.write(message); } /** @@ -112,6 +249,15 @@ export class Kernel { return Array.from(this.#vats.keys()); } + exportFromVat(vatId: VatId, vref: VRef): KRef { + const { isPromise } = parseRef(vref); + const kref = isPromise + ? this.#storage.initKernelPromise()[0] + : this.#storage.initKernelObject(vatId); + this.#storage.addClistEntry(vatId, kref, vref); + return kref; + } + /** * Gets the list of all vats. * @@ -121,69 +267,378 @@ export class Kernel { id: VatId; config: VatConfig; }[] { - return Array.from(this.#vats.values()).reduce( - ( - acc: { - id: VatId; - config: VatConfig; - }[], - vat, - ) => { - const state = this.#vatStateService.get(vat.vatId); - if (state?.config) { - acc.push({ id: vat.vatId, config: state.config }); - } - return acc; - }, - [], - ); + return Array.from(this.#vats.values()).map((vat) => ({ + id: vat.vatId, + config: vat.config, + })); + } + + async #startVat(vatId: VatId, vatConfig: VatConfig): Promise { + if (this.#vats.has(vatId)) { + throw new VatAlreadyExistsError(vatId); + } + const multiplexer = await this.#vatWorkerService.launch(vatId, vatConfig); + multiplexer.start().catch((error) => this.#logger.error(error)); + const commandStream = multiplexer.createChannel< + VatCommandReply, + VatCommand + >('command', isVatCommandReply); + const vat = new VatHandle({ + kernel: this, + vatId, + vatConfig, + commandStream, + storage: this.#storage, + }); + this.#vats.set(vatId, vat); + this.#storage.initEndpoint(vatId); + await vat.init(); + const rootRef = this.exportFromVat(vatId, ROOT_OBJECT_VREF); + return rootRef; } /** * Launches a vat. * * @param vatConfig - Configuration for the new vat. - * @returns A promise that resolves the vat. + * @returns A promise for a reference to the new vat's root object */ - async launchVat(vatConfig: VatConfig): Promise { - const vatId = this.#storage.getNextVatId(); - if (this.#vats.has(vatId)) { - throw new VatAlreadyExistsError(vatId); + async launchVat(vatConfig: VatConfig): Promise { + return this.#startVat(this.#storage.getNextVatId(), vatConfig); + } + + #translateRefKtoE(vatId: VatId, kref: KRef, importIfNeeded: boolean): ERef { + let eref = this.#storage.krefToEref(vatId, kref); + if (!eref) { + if (importIfNeeded) { + eref = this.#storage.allocateErefForKref(vatId, kref); + } else { + throw Error(`unmapped kref ${kref} vat=${vatId}`); + } + } + return eref; + } + + #translateCapDataKtoE(vatId: VatId, capdata: CapData): CapData { + const slots: ERef[] = []; + for (const slot of capdata.slots) { + slots.push(this.#translateRefKtoE(vatId, slot, true)); + } + return { body: capdata.body, slots }; + } + + enqueueRun(item: RunQueueItem): void { + this.#storage.enqueueRun(item); + this.#runQueueLength += 1; + if (this.#runQueueLength === 1 && this.#wakeUpQueue) { + const wakeUpQueue = this.#wakeUpQueue; + this.#wakeUpQueue = null; + wakeUpQueue(); + } + } + + #dequeueRun(): RunQueueItem | undefined { + this.#runQueueLength -= 1; + const result = this.#storage.dequeueRun(); + return result; + } + + /** + * Routes a message to its destination based on the target type and state. In + * the most general case, this route consists of a vatId and a destination + * object reference. + * + * There are three possible outcomes: + * - splat: message is dropped (with optional error resolution), indicated by + * a null return value + * - send: message is delivered to a specific object in a specific vat + * - requeue: message is put back on the run queue for later delivery (for + * unresolved promises), indicated by absence of a target vat in the return value + * + * @param item - The message to route. + * @returns The route for the message. + */ + #routeMessage(item: RunQueueItemSend): MessageRoute { + const { target, message } = item; + + const routeAsSplat = (error?: CapData): MessageRoute => { + if (message.result && error) { + this.doResolve(undefined, [[message.result, true, error]]); + } + return null; + }; + const routeAsSend = (targetObject: KRef): MessageRoute => { + const vatId = this.#storage.getOwner(targetObject) as VatId; + if (!vatId) { + return routeAsSplat(kser('no vat')); + } + return { vatId, target: targetObject }; + }; + const routeAsRequeue = (targetObject: KRef): MessageRoute => { + return { target: targetObject }; + }; + + if (isPromiseRef(target)) { + const promise = this.#storage.getKernelPromise(target); + switch (promise.state) { + case 'fulfilled': { + if (promise.value) { + const targetObject = extractSingleRef(promise.value); + if (targetObject) { + if (isPromiseRef(targetObject)) { + return routeAsRequeue(targetObject); + } + return routeAsSend(targetObject); + } + } + return routeAsSplat(kser('no object')); + } + case 'rejected': + return routeAsSplat(promise.value); + case 'unresolved': + return routeAsRequeue(target); + default: + // Runtime does not respect "never". + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + throw Error(`unknown promise state ${promise.state}`); + } + } else { + return routeAsSend(target); + } + } + + #translateMessageKtoE(vatId: VatId, message: Message): Message { + const methargs = this.#translateCapDataKtoE( + vatId, + message.methargs as CapData, + ); + const result = message.result + ? this.#translateRefKtoE(vatId, message.result as KRef, true) + : message.result; + const vatMessage = { ...message, methargs, result }; + return vatMessage; + } + + /** + * Delivers run queue items to their targets. + * + * If the item being delivered is message whose target is a promise, it is + * delivered based on the kernel's model of the promise's state: + * - unresolved: it is put onto the queue that the kernel maintains for that promise + * - fulfilled: it is forwarded to the promise resolution target + * - rejected: the result promise of the message is in turn rejected according + * to the kernel's model of the promise's rejection value + * + * If the item being delivered is a notification, the kernel's model of the + * state of the promise being notified is updated, and any queue items + * enqueued for that promise are placed onto the run queue. The notification + * is also forwarded to all of the promise's registered subscribers. + * + * @param item - The message/notification to deliver. + */ + async #deliver(item: RunQueueItem): Promise { + const { log } = console; + switch (item.type) { + case 'send': { + const route = this.#routeMessage(item); + if (route) { + const { vatId, target } = route; + const { message } = item; + log( + `@@@@ deliver ${vatId} send ${target}<-${JSON.stringify(message)}`, + ); + if (vatId) { + const vat = this.#getVat(vatId); + if (vat) { + this.#storage.setPromiseDecider(message.result as KRef, vatId); + const vatTarget = this.#translateRefKtoE(vatId, target, false); + const vatMessage = this.#translateMessageKtoE(vatId, message); + await vat.deliverMessage(vatTarget as VRef, vatMessage); + } else { + throw Error(`no owner for kernel object ${target}`); + } + } else { + this.#storage.enqueuePromiseMessage(target, message); + } + log(`@@@@ done ${vatId} send ${target}<-${JSON.stringify(message)}`); + } + break; + } + case 'notify': { + const { vatId, kpid } = item; + log(`@@@@ deliver ${vatId} notify ${kpid}`); + const promise = this.#storage.getKernelPromise(kpid); + const { state, value } = promise; + if (!value) { + throw Error(`no value for promise ${kpid}`); + } + if (state === 'unresolved') { + throw Error(`notifcation on unresolved promise ${kpid}`); + } + if (!this.#storage.krefToEref(vatId, kpid)) { + // no c-list entry, already done + return; + } + const targets = this.#getKpidsToRetire(kpid, value); + if (targets.length === 0) { + // no kpids to retire, already done + return; + } + const resolutions: VatOneResolution[] = []; + for (const toResolve of targets) { + const tPromise = this.#storage.getKernelPromise(toResolve); + if (tPromise.state === 'unresolved') { + throw Error(`target promise ${toResolve} is unresolved`); + } + if (!tPromise.value) { + throw Error(`target promise ${toResolve} has no value`); + } + resolutions.push([ + this.#translateRefKtoE(vatId, toResolve, true), + false, + this.#translateCapDataKtoE(vatId, tPromise.value), + ]); + } + const vat = this.#getVat(vatId); + await vat.deliverNotify(resolutions); + log(`@@@@ done ${vatId} notify ${kpid}`); + break; + } + default: + // @ts-expect-error Runtime does not respect "never". + throw Error(`unsupported or unknown run queue item type ${item.type}`); + } + } + + /** + * Given a promise that has just been resolved and the value it resolved to, + * find all promises reachable (recursively) from the new resolution value + * which are themselves resolved. This will determine the set of resolutions + * that subscribers to the original promise will need to be notified of. + * + * This is needed because subscription to a promise carries with it an implied + * subscription to any promises that appear in its resolution value -- these + * subscriptions must be implied rather than explicit because they are + * necessarily unknown at the time of the original promise was subscribed to. + * + * @param origKpid - The original promise to start from. + * @param origValue - The value the original promise is resolved to. + * @returns An array of the kpids of the promises whose values become visible + * as a consequence of the resolution of origKpid. + */ + #getKpidsToRetire(origKpid: KRef, origValue: CapData): KRef[] { + const seen = new Set(); + const scanPromise = (kpid: KRef, value: CapData): void => { + seen.add(kpid); + if (value) { + for (const slot of value.slots) { + if (isPromiseRef(slot)) { + if (!seen.has(slot)) { + const promise = this.#storage.getKernelPromise(slot); + if (promise.state !== 'unresolved') { + if (promise.value) { + scanPromise(slot, promise.value); + } + } + } + } + } + } + }; + scanPromise(origKpid, origValue); + return Array.from(seen); + } + + /** + * Enqueue for delivery a notification to a vat about the resolution of a + * promise. + * + * @param vatId - The vat that will be notified. + * @param kpid - The promise of interest. + */ + #notify(vatId: VatId, kpid: KRef): void { + const notifyItem: RunQueueItemNotify = { type: 'notify', vatId, kpid }; + this.enqueueRun(notifyItem); + } + + /** + * Process a set of promise resolutions coming from a vat. + * + * @param vatId - The vat doing the resolving, if there is one. + * @param resolutions - One or more resolutions, to be processed as a group. + */ + doResolve(vatId: VatId | undefined, resolutions: VatOneResolution[]): void { + for (const resolution of resolutions) { + const [kpidRaw, rejected, dataRaw] = resolution; + const kpid = kpidRaw as KRef; + const data = dataRaw as CapData; + const promise = this.#storage.getKernelPromise(kpid); + const { state, decider, subscribers } = promise; + if (state !== 'unresolved') { + throw Error(`${kpid} was already resolved`); + } + if (decider !== vatId) { + throw Error(`${kpid} is decided by ${decider}, not ${vatId}`); + } + if (!subscribers) { + throw Error(`${kpid} subscribers not set`); + } + for (const subscriber of subscribers) { + this.#notify(subscriber as VatId, kpid); + } + this.#storage.resolveKernelPromise(kpid, rejected, data); } - return this.#initVat(vatId, vatConfig); } /** * Launches a sub-cluster of vats. * * @param config - Configuration object for sub-cluster. - * @returns A record of the vats launched. + * @returns A record of the root objects of the vats launched. */ - async launchSubcluster( - config: ClusterConfig, - ): Promise> { - const vats: Record = {}; + async launchSubcluster(config: ClusterConfig): Promise> { + if (config.bootstrap && !config.vats[config.bootstrap]) { + throw Error(`invalid bootstrap vat name ${config.bootstrap}`); + } + this.#mostRecentSubcluster = config; + const rootIds: Record = {}; + const roots: Record = {}; for (const [vatName, vatConfig] of Object.entries(config.vats)) { - const vat = await this.launchVat(vatConfig); - vats[vatName] = vat; + const rootRef = await this.launchVat(vatConfig); + rootIds[vatName] = rootRef; + roots[vatName] = kslot(rootRef, 'vatRoot'); + } + if (config.bootstrap) { + const bootstrapRoot = rootIds[config.bootstrap]; + if (bootstrapRoot) { + const bootstrapMessage: Message = { + methargs: kser(['bootstrap', [roots]]), + }; + const bootstrapItem: RunQueueItemSend = { + type: 'send', + target: bootstrapRoot, + message: bootstrapMessage, + }; + this.enqueueRun(bootstrapItem); + } } - return vats; + return rootIds; } /** * Restarts a vat. * * @param vatId - The ID of the vat. - * @returns A promise that resolves the restarted vat. + * @returns A promise for the restarted vat. */ async restartVat(vatId: VatId): Promise { - const state = this.#vatStateService.get(vatId); - if (!state) { + const vat = this.#getVat(vatId); + if (!vat) { throw new VatNotFoundError(vatId); } - + const { config } = vat; await this.terminateVat(vatId); - const vat = await this.#initVat(vatId, state.config); + await this.#startVat(vatId, config); return vat; } @@ -213,6 +668,19 @@ export class Kernel { await this.#vatWorkerService.terminateAll(); } + async reload(): Promise { + if (this.#mostRecentSubcluster) { + await this.launchSubcluster(this.#mostRecentSubcluster); + } + } + + /** + * Clear the database. + */ + async clearStorage(): Promise { + this.#storage.reset(); + } + /** * Send a message to a vat. * @@ -236,121 +704,6 @@ export class Kernel { this.#storage.reset(); } - // -------------------------------------------------------------------------- - // Private methods - // -------------------------------------------------------------------------- - - /** - * Receives messages from the stream. - */ - async #receiveMessages(): Promise { - for await (const message of this.#stream) { - if (!isKernelCommand(message)) { - this.#logger.error('Received unexpected message', message); - continue; - } - - const { method, params } = message; - - let vat: VatHandle; - - switch (method) { - case KernelCommandMethod.ping: - await this.#reply({ method, params: 'pong' }); - break; - case KernelCommandMethod.evaluate: - if (!this.#vats.size) { - throw new Error('No vats available to call'); - } - vat = this.#vats.values().next().value as VatHandle; - await this.#reply({ - method, - params: await this.evaluate(vat.vatId, params), - }); - break; - case KernelCommandMethod.capTpCall: - if (!this.#vats.size) { - throw new Error('No vats available to call'); - } - vat = this.#vats.values().next().value as VatHandle; - await this.#reply({ - method, - params: stringify(await vat.callCapTp(params)), - }); - break; - case KernelCommandMethod.kvSet: - this.kvSet(params.key, params.value); - await this.#reply({ - method, - params: `~~~ set "${params.key}" to "${params.value}" ~~~`, - }); - break; - case KernelCommandMethod.kvGet: { - try { - const value = this.kvGet(params); - const result = - typeof value === 'string' ? `"${value}"` : `${value}`; - await this.#reply({ - method, - params: `~~~ got ${result} ~~~`, - }); - } catch (problem) { - // TODO: marshal - await this.#reply({ - method, - params: String(toError(problem)), - }); - } - break; - } - default: - console.error( - 'kernel worker received unexpected command', - // @ts-expect-error Runtime does not respect "never". - { method: method.valueOf(), params }, - ); - } - } - } - - /** - * Replies to a message. - * - * @param message - The message to reply to. - */ - async #reply(message: KernelCommandReply): Promise { - await this.#stream.write(message); - } - - /** - * Initializes a vat. - * - * @param vatId - The ID of the vat. - * @param vatConfig - The configuration of the vat. - * @returns A promise that resolves the vat. - */ - async #initVat(vatId: VatId, vatConfig: VatConfig): Promise { - const multiplexer = await this.#vatWorkerService.launch(vatId, vatConfig); - multiplexer.start().catch((error) => this.#logger.error(error)); - const commandStream = multiplexer.createChannel< - VatCommandReply, - VatCommand - >('command', isVatCommandReply); - const capTpStream = multiplexer.createChannel('capTp'); - const vat = new VatHandle({ - vatId, - vatConfig, - commandStream, - capTpStream, - }); - this.#vats.set(vat.vatId, vat); - this.#vatStateService.set(vatId, { - config: vatConfig, - }); - await vat.init(); - return vat; - } - /** * Gets a vat. * diff --git a/packages/kernel/src/VatHandle.test.ts b/packages/kernel/src/VatHandle.test.ts index fa72da23c..2069300e0 100644 --- a/packages/kernel/src/VatHandle.test.ts +++ b/packages/kernel/src/VatHandle.test.ts @@ -1,16 +1,13 @@ -import type { Json } from '@metamask/utils'; -import { - VatCapTpConnectionExistsError, - VatCapTpConnectionNotFoundError, -} from '@ocap/errors'; import type { MultiplexEnvelope } from '@ocap/streams'; +import { delay } from '@ocap/test-utils'; import { TestDuplexStream, TestMultiplexer } from '@ocap/test-utils/streams'; -import { delay, makeLogger, stringify } from '@ocap/utils'; import type { Logger } from '@ocap/utils'; import { describe, it, expect, vi } from 'vitest'; +import { Kernel } from './Kernel.js'; import { isVatCommandReply, VatCommandMethod } from './messages/index.js'; import type { VatCommand, VatCommandReply } from './messages/index.js'; +import type { KernelStore } from './store/kernel-store.js'; import { VatHandle } from './VatHandle.js'; vi.mock('@endo/eventual-send', () => ({ @@ -36,34 +33,31 @@ const makeVat = async ( 'command', isVatCommandReply, ); - const capTpStream = multiplexer.createChannel('capTp'); multiplexer.start().catch((error) => { throw error; }); - await multiplexer.synchronizeChannels('command', 'capTp'); + await multiplexer.synchronizeChannels('command'); return { vat: new VatHandle({ + kernel: null as unknown as Kernel, + storage: null as unknown as KernelStore, vatId: 'v0', vatConfig: { sourceSpec: 'not-really-there.js' }, commandStream, - capTpStream, logger, }), stream, }; }; -describe('Vat', () => { +describe('VatHandle', () => { describe('init', () => { - it('initializes the vat and sends ping & loadUserCode messages', async () => { + it('initializes the vat and sends ping & initVat messages', async () => { const { vat } = await makeVat(); const sendMessageMock = vi .spyOn(vat, 'sendMessage') - .mockResolvedValueOnce('') - .mockResolvedValueOnce(''); - const capTpMock = vi - .spyOn(vat, 'makeCapTp') - .mockResolvedValueOnce(undefined); + .mockResolvedValueOnce(null) + .mockResolvedValueOnce(null); await vat.init(); @@ -72,20 +66,18 @@ describe('Vat', () => { params: null, }); expect(sendMessageMock).toHaveBeenCalledWith({ - method: VatCommandMethod.loadUserCode, + method: VatCommandMethod.initVat, params: { sourceSpec: 'not-really-there.js', }, }); - expect(capTpMock).toHaveBeenCalled(); }); it('throws if the stream throws', async () => { const { vat, stream } = await makeVat(); vi.spyOn(vat, 'sendMessage') - .mockResolvedValueOnce('') - .mockResolvedValueOnce(''); - vi.spyOn(vat, 'makeCapTp').mockResolvedValueOnce(undefined); + .mockResolvedValueOnce(null) + .mockResolvedValueOnce(null); await vat.init(); const logErrorSpy = vi.spyOn(vat.logger, 'error'); await stream.receiveInput(NaN); @@ -163,93 +155,4 @@ describe('Vat', () => { }); }); }); - - describe('makeCapTp', () => { - it('throws an error if CapTP connection already exists', async () => { - const { vat } = await makeVat(); - // @ts-expect-error - Simulating an existing CapTP - vat.capTp = {}; - await expect(vat.makeCapTp()).rejects.toThrow( - VatCapTpConnectionExistsError, - ); - }); - - it('creates a CapTP connection and sends CapTpInit message', async () => { - const { vat } = await makeVat(); - const sendMessageMock = vi - .spyOn(vat, 'sendMessage') - .mockResolvedValueOnce(''); - await vat.makeCapTp(); - expect(sendMessageMock).toHaveBeenCalledWith({ - method: VatCommandMethod.capTpInit, - params: null, - }); - }); - - it('handles CapTP messages', async () => { - const logger = makeLogger('[test]'); - const logSpy = vi.spyOn(logger, 'log'); - const { vat, stream } = await makeVat(logger); - vi.spyOn(vat, 'sendMessage') - .mockResolvedValueOnce('') - .mockResolvedValueOnce('') - .mockResolvedValueOnce(''); - - await vat.init(); - - const capTpPayload = { - type: 'CTP_BOOTSTRAP', - epoch: 0, - questionID: 'q-1', - }; - await stream.receiveInput({ channel: 'capTp', payload: capTpPayload }); - await delay(10); - - expect(logSpy).toHaveBeenCalledWith( - 'CapTP from vat', - stringify(capTpPayload), - ); - - const capTpAnswer = { - type: 'CTP_RETURN', - epoch: 0, - answerID: 'q-1', - result: { - body: '{"@qclass":"undefined"}', - slots: [], - }, - }; - - expect(logSpy).toHaveBeenLastCalledWith( - 'CapTP to vat', - stringify(capTpAnswer), - ); - }); - }); - - describe('callCapTp', () => { - it('throws an error if CapTP connection is not established', async () => { - const { vat } = await makeVat(); - await expect( - vat.callCapTp({ method: 'testMethod', params: [] }), - ).rejects.toThrow(VatCapTpConnectionNotFoundError); - }); - - it('calls CapTP method with parameters using eventual send', async () => { - const { vat } = await makeVat(); - vi.spyOn(vat, 'sendMessage').mockResolvedValueOnce(''); - await vat.makeCapTp(); - - const eventualSend = await import('@endo/eventual-send'); - const eSpy = vi.spyOn(eventualSend, 'E'); - - const result = await vat.callCapTp({ - method: 'testMethod', - params: ['test-param'], - }); - - expect(eSpy).toHaveBeenCalledOnce(); - expect(result).toBe('param is: test-param'); - }); - }); }); diff --git a/packages/kernel/src/VatHandle.ts b/packages/kernel/src/VatHandle.ts index 275131d1f..e28fedb12 100644 --- a/packages/kernel/src/VatHandle.ts +++ b/packages/kernel/src/VatHandle.ts @@ -1,59 +1,258 @@ -import { makeCapTP } from '@endo/captp'; -import { E } from '@endo/eventual-send'; -import type { Json } from '@metamask/utils'; -import { - VatCapTpConnectionExistsError, - VatCapTpConnectionNotFoundError, - VatDeletedError, - StreamReadError, -} from '@ocap/errors'; +import type { CapData } from '@endo/marshal'; +import { makePromiseKit } from '@endo/promise-kit'; +import { VatDeletedError, StreamReadError } from '@ocap/errors'; import type { DuplexStream } from '@ocap/streams'; import type { Logger } from '@ocap/utils'; -import { makeLogger, stringify } from '@ocap/utils'; +import { makeLogger, makeCounter } from '@ocap/utils'; +// XXX Reenable the following once the packaging of liveslots is fixed (and at +// the same time remove the below import of ./ag-types.js) +// import type { VatSyscallObject } from '@agoric/swingset-liveslots'; -import { MessageResolver, VatCommandMethod } from './messages/index.js'; import type { - CapTpPayload, + Message, + VatSyscallObject, + VatOneResolution, +} from './ag-types.js'; +import type { Kernel } from './Kernel.js'; +import { VatCommandMethod } from './messages/index.js'; +import type { VatCommandReply, VatCommand, + VatCommandReturnType, } from './messages/index.js'; -import type { VatCommandReturnType } from './messages/vat.js'; -import type { VatId, VatConfig } from './types.js'; +import type { KernelStore } from './store/kernel-store.js'; +import type { + PromiseCallbacks, + VatId, + VatConfig, + VRef, + KRef, + RunQueueItemSend, +} from './types.js'; + +type VatConstructorProps = { + kernel: Kernel; + vatId: VatId; + vatConfig: VatConfig; + commandStream: DuplexStream; + storage: KernelStore; + logger?: Logger | undefined; +}; export class VatHandle { - readonly vatId: VatId; + readonly vatId: VatConstructorProps['vatId']; readonly #commandStream: DuplexStream; - readonly #capTpStream: DuplexStream; - - readonly #config: VatConfig; + readonly config: VatConstructorProps['vatConfig']; readonly logger: Logger; - readonly #resolver: MessageResolver; + readonly #messageCounter: () => number; + + readonly #storage: KernelStore; + + readonly #kernel: Kernel; - capTp?: ReturnType; + readonly unresolvedMessages: Map = + new Map(); constructor({ + kernel, vatId, vatConfig, commandStream, - capTpStream, logger, - }: { - vatId: VatId; - vatConfig: VatConfig; - commandStream: DuplexStream; - capTpStream: DuplexStream; - logger?: Logger | undefined; - }) { + storage, + }: VatConstructorProps) { + this.#kernel = kernel; this.vatId = vatId; - this.#config = vatConfig; + this.config = vatConfig; this.logger = logger ?? makeLogger(`[vat ${vatId}]`); + this.#messageCounter = makeCounter(); this.#commandStream = commandStream; - this.#capTpStream = capTpStream; - this.#resolver = new MessageResolver(vatId); + this.#storage = storage; + } + + #translateRefVtoK(vref: VRef): KRef { + let kref = this.#storage.erefToKref(this.vatId, vref) as KRef; + if (!kref) { + kref = this.#kernel.exportFromVat(this.vatId, vref); + } + return kref; + } + + #translateCapDataVtoK(capdata: CapData): CapData { + const slots: KRef[] = []; + for (const slot of capdata.slots) { + slots.push(this.#translateRefVtoK(slot)); + } + return { body: capdata.body, slots }; + } + + #handleSyscallSend(target: KRef, message: Message): void { + const messageItem: RunQueueItemSend = { + type: 'send', + target, + message, + }; + this.#kernel.enqueueRun(messageItem); + } + + #handleSyscallResolve(resolutions: VatOneResolution[]): void { + this.#kernel.doResolve(this.vatId, resolutions); + } + + #handleSyscallSubscribe(kpid: KRef): void { + this.#storage.addPromiseSubscriber(this.vatId, kpid); + } + + translateSyscallVtoK(vso: VatSyscallObject): VatSyscallObject { + let kso: VatSyscallObject; + switch (vso[0]) { + case 'send': { + // [VRef, Message]; + const [op, target, message] = vso; + const kMethargs = this.#translateCapDataVtoK( + message.methargs as CapData, + ); + const kResult = this.#translateRefVtoK(message.result as VRef); + const kMessage = { methargs: kMethargs, result: kResult }; + kso = [op, this.#translateRefVtoK(target as VRef), kMessage]; + break; + } + case 'subscribe': { + // [VRef]; + const [op, promise] = vso; + kso = [op, this.#translateRefVtoK(promise as VRef)]; + break; + } + case 'resolve': { + // [VatOneResolution[]]; + const [op, resolutions] = vso; + const kResolutions: VatOneResolution[] = resolutions.map( + (resolution) => { + const [vpid, rejected, data] = resolution; + return [ + this.#translateRefVtoK(vpid as VRef), + rejected, + this.#translateCapDataVtoK(data as CapData), + ]; + }, + ); + kso = [op, kResolutions]; + break; + } + case 'exit': { + // [boolean, SwingSetCapData]; + const [op, isFailure, info] = vso; + kso = [ + op, + isFailure, + this.#translateCapDataVtoK(info as CapData), + ]; + break; + } + case 'dropImports': + case 'retireImports': + case 'retireExports': + case 'abandonExports': { + // [VRef[]]; + const [op, vrefs] = vso; + const krefs = vrefs.map((ref) => this.#translateRefVtoK(ref as VRef)); + kso = [op, krefs]; + break; + } + case 'callNow': + case 'vatstoreGet': + case 'vatstoreGetNextKey': + case 'vatstoreSet': + case 'vatstoreDelete': { + const [op] = vso; + throw Error(`vat ${this.vatId} issued invalid syscall ${op}`); + } + default: { + // Runtime does not respect "never". + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + throw Error(`vat ${this.vatId} issued unknown syscall ${vso[0]}`); + } + } + return kso; + } + + async #handleSyscall(vso: VatSyscallObject): Promise { + const kso: VatSyscallObject = this.translateSyscallVtoK(vso); + const [op] = kso; + const { vatId } = this; + const { log } = console; + switch (op) { + case 'send': { + // [KRef, Message]; + const [, rawTarget, message] = kso; + const target = rawTarget as KRef; + log(`@@@@ ${vatId} syscall send ${target}<-${JSON.stringify(message)}`); + this.#handleSyscallSend(target, message); + break; + } + case 'subscribe': { + // [KRef]; + const [, rawPromise] = kso; + const promise = rawPromise as KRef; + log(`@@@@ ${vatId} syscall subscribe ${promise}`); + this.#handleSyscallSubscribe(promise); + break; + } + case 'resolve': { + // [VatOneResolution[]]; + const [, resolutions] = kso; + log(`@@@@ ${vatId} syscall resolve ${JSON.stringify(resolutions)}`); + this.#handleSyscallResolve(resolutions as VatOneResolution[]); + break; + } + case 'exit': { + // [boolean, SwingSetCapData]; + const [, fail, info] = kso; + log(`@@@@ ${vatId} syscall exit fail=${fail} ${JSON.stringify(info)}`); + break; + } + case 'dropImports': { + // [KRef[]]; + const [, refs] = kso; + log(`@@@@ ${vatId} syscall dropImports ${JSON.stringify(refs)}`); + break; + } + case 'retireImports': { + // [KRef[]]; + const [, refs] = kso; + log(`@@@@ ${vatId} syscall retireImports ${JSON.stringify(refs)}`); + break; + } + case 'retireExports': { + // [KRef[]]; + const [, refs] = kso; + log(`@@@@ ${vatId} syscall retireExports ${JSON.stringify(refs)}`); + break; + } + case 'abandonExports': { + // [KRef[]]; + const [, refs] = kso; + log(`@@@@ ${vatId} syscall abandonExports ${JSON.stringify(refs)}`); + break; + } + case 'callNow': + case 'vatstoreGet': + case 'vatstoreGetNextKey': + case 'vatstoreSet': + case 'vatstoreDelete': { + console.warn(`vat ${vatId} issued invalid syscall ${op} `, vso); + break; + } + default: + // Runtime does not respect "never". + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + console.warn(`vat ${vatId} issued unknown syscall ${op} `, vso); + break; + } } /** @@ -64,7 +263,17 @@ export class VatHandle { * @param vatMessage.payload - The payload to handle. */ async handleMessage({ id, payload }: VatCommandReply): Promise { - this.#resolver.handleResponse(id, payload.params); + if (payload.method === VatCommandMethod.syscall) { + await this.#handleSyscall(payload.params); + } else { + const promiseCallbacks = this.unresolvedMessages.get(id); + if (promiseCallbacks === undefined) { + this.logger.error(`No unresolved message with id "${id}".`); + } else { + this.unresolvedMessages.delete(id); + promiseCallbacks.resolve(payload.params); + } + } } /** @@ -72,63 +281,34 @@ export class VatHandle { * * @returns A promise that resolves when the vat is initialized. */ - async init(): Promise { + async init(): Promise { Promise.all([ this.#commandStream.drain(this.handleMessage.bind(this)), - this.#capTpStream.drain(async (content): Promise => { - this.logger.log('CapTP from vat', stringify(content)); - this.capTp?.dispatch(content); - }), ]).catch(async (error) => { this.logger.error(`Unexpected read error`, error); await this.terminate(new StreamReadError({ vatId: this.vatId }, error)); }); await this.sendMessage({ method: VatCommandMethod.ping, params: null }); - const loadResult = await this.sendMessage({ - method: VatCommandMethod.loadUserCode, - params: this.#config, + await this.sendMessage({ + method: VatCommandMethod.initVat, + params: this.config, }); - console.log(`vat LoadUserCode result: `, loadResult); this.logger.debug('Created'); - - return await this.makeCapTp(); } - /** - * Make a CapTP connection. - * - * @returns A promise that resolves when the CapTP connection is made. - */ - async makeCapTp(): Promise { - if (this.capTp !== undefined) { - throw new VatCapTpConnectionExistsError(this.vatId); - } - - const ctp = makeCapTP(this.vatId, async (content: Json) => { - this.logger.log('CapTP to vat', stringify(content)); - await this.#capTpStream.write(content); - }); - - this.capTp = ctp; - - return this.sendMessage({ - method: VatCommandMethod.capTpInit, - params: null, + async deliverMessage(target: VRef, message: Message): Promise { + await this.sendMessage({ + method: VatCommandMethod.deliver, + params: ['message', target, message], }); } - /** - * Call a CapTP method. - * - * @param payload - The CapTP payload. - * @returns A promise that resolves the result of the CapTP call. - */ - async callCapTp(payload: CapTpPayload): Promise { - if (!this.capTp) { - throw new VatCapTpConnectionNotFoundError(this.vatId); - } - return E(this.capTp.getBootstrap())[payload.method](...payload.params); + async deliverNotify(resolutions: VatOneResolution[]): Promise { + await this.sendMessage({ + method: VatCommandMethod.deliver, + params: ['notify', resolutions], + }); } /** @@ -137,14 +317,13 @@ export class VatHandle { * @param error - The error to terminate the vat with. */ async terminate(error?: Error): Promise { - // eslint-disable-next-line promise/no-promise-in-callback - await Promise.all([ - this.#commandStream.end(error), - this.#capTpStream.end(error), - ]); - - const terminationError = error ?? new VatDeletedError(this.vatId); - this.#resolver.terminateAll(terminationError); + await this.#commandStream.end(error); + + // Handle orphaned messages + for (const [messageId, promiseCallback] of this.unresolvedMessages) { + promiseCallback?.reject(error ?? new VatDeletedError(this.vatId)); + this.unresolvedMessages.delete(messageId); + } } /** @@ -157,8 +336,19 @@ export class VatHandle { payload: Extract, ): Promise { this.logger.debug('Sending message to vat', payload); - return this.#resolver.createMessage(async (messageId) => { - await this.#commandStream.write({ id: messageId, payload }); - }); + const { promise, reject, resolve } = makePromiseKit(); + const messageId = this.#nextMessageId(); + this.unresolvedMessages.set(messageId, { reject, resolve }); + await this.#commandStream.write({ id: messageId, payload }); + return promise as Promise; } + + /** + * Gets the next message ID. + * + * @returns The message ID. + */ + readonly #nextMessageId = (): VatCommand['id'] => { + return `${this.vatId}:${this.#messageCounter()}`; + }; } diff --git a/packages/kernel/src/VatSupervisor.test.ts b/packages/kernel/src/VatSupervisor.test.ts index ae3c6d6c2..f4c8740bd 100644 --- a/packages/kernel/src/VatSupervisor.test.ts +++ b/packages/kernel/src/VatSupervisor.test.ts @@ -1,5 +1,5 @@ -import type { Json } from '@metamask/utils'; import type { MultiplexEnvelope } from '@ocap/streams'; +import '@ocap/test-utils'; import { TestDuplexStream, TestMultiplexer } from '@ocap/test-utils/streams'; import { delay, stringify } from '@ocap/utils'; import { describe, it, expect, vi } from 'vitest'; @@ -23,16 +23,14 @@ const makeVatSupervisor = async ( 'command', isVatCommand, ); - const capTpStream = multiplexer.createChannel('capTp'); multiplexer.start().catch((error) => { throw error; }); - await multiplexer.synchronizeChannels('command', 'capTp'); + await multiplexer.synchronizeChannels('command'); return { supervisor: new VatSupervisor({ id: 'test-id', commandStream, - capTpStream, }), stream, }; @@ -96,54 +94,6 @@ describe('VatSupervisor', () => { }); }); - it('handles CapTpInit messages', async () => { - const { supervisor } = await makeVatSupervisor(); - const replySpy = vi.spyOn(supervisor, 'replyToMessage'); - - await supervisor.handleMessage({ - id: 'v0:0', - payload: { method: VatCommandMethod.capTpInit, params: null }, - }); - - expect(replySpy).toHaveBeenCalledWith('v0:0', { - method: VatCommandMethod.capTpInit, - params: '~~~ CapTP Initialized ~~~', - }); - }); - - it('handles CapTP messages', async () => { - const handleWrite = vi.fn(); - const { supervisor } = await makeVatSupervisor(handleWrite); - - await supervisor.handleMessage({ - id: 'v0:0', - payload: { method: VatCommandMethod.capTpInit, params: null }, - }); - - const capTpQuestion = { - type: 'CTP_BOOTSTRAP', - epoch: 0, - questionID: 'q-1', - }; - expect(supervisor.capTp?.dispatch(capTpQuestion)).toBe(true); - - await delay(10); - - const capTpPayload = { - type: 'CTP_RETURN', - epoch: 0, - answerID: 'q-1', - result: { - body: '{"@qclass":"undefined"}', - slots: [], - }, - }; - expect(handleWrite).toHaveBeenCalledWith({ - channel: 'capTp', - payload: capTpPayload, - }); - }); - it('handles Evaluate messages', async () => { const { supervisor } = await makeVatSupervisor(); const replySpy = vi.spyOn(supervisor, 'replyToMessage'); diff --git a/packages/kernel/src/VatSupervisor.ts b/packages/kernel/src/VatSupervisor.ts index e8b0d9b2d..b190edde2 100644 --- a/packages/kernel/src/VatSupervisor.ts +++ b/packages/kernel/src/VatSupervisor.ts @@ -1,61 +1,72 @@ -import { makeCapTP } from '@endo/captp'; +import { makeLiveSlots as localMakeLiveSlots } from '@agoric/swingset-liveslots'; +// XXX Reenable the following once the packaging of liveslots is fixed (and at +// the same time remove the below import of ./ag-types-index.js) +// import type { VatSyscallObject, VatSyscallResult, VatDeliveryObject } from '@agoric/swingset-liveslots'; import { importBundle } from '@endo/import-bundle'; -import type { Json } from '@metamask/utils'; +import { makeMarshal } from '@endo/marshal'; +import type { CapData } from '@endo/marshal'; import { StreamReadError } from '@ocap/errors'; import type { DuplexStream } from '@ocap/streams'; import { stringify } from '@ocap/utils'; +import type { + VatSyscallObject, + VatSyscallResult, + VatDeliveryObject, +} from './ag-types-index.js'; +import { makeDummyMeterControl } from './dummyMeterControl.js'; import type { VatCommand, VatCommandReply } from './messages/index.js'; import { VatCommandMethod } from './messages/index.js'; -import type { UserCodeStartFn, VatConfig } from './types.js'; -import { isVatConfig } from './types.js'; +import { makeSQLKVStore } from './store/sqlite-kv-store.js'; +import { makeSupervisorSyscall } from './syscall.js'; +import type { VatConfig } from './types.js'; +import { ROOT_OBJECT_VREF, isVatConfig } from './types.js'; +import { waitUntilQuiescent } from './waitUntilQuiescent.js'; + +type DispatchFn = (vdo: VatDeliveryObject) => Promise; +type LiveSlots = { + dispatch: DispatchFn; +}; +const makeLiveSlots: (...args: unknown[]) => LiveSlots = localMakeLiveSlots; // XXX make this better type SupervisorConstructorProps = { id: string; commandStream: DuplexStream; - capTpStream: DuplexStream; - bootstrap?: unknown; }; +const marshal = makeMarshal(undefined, undefined, { + serializeBodyFormat: 'smallcaps', +}); + export class VatSupervisor { + // XXX As VatSupervisor is currently used, the id is bogus and useless; + // VatSupervisor gets created in iframe.ts, which will always specify the id + // to be 'iframe'. This not helpful. readonly id: string; readonly #commandStream: DuplexStream; - readonly #capTpStream: DuplexStream; - readonly #defaultCompartment = new Compartment({ URL }); - readonly #bootstrap: unknown; + #loaded: boolean = false; - capTp?: ReturnType; + #dispatch: DispatchFn | null; - #loaded: boolean = false; + readonly #syscallsInFlight: Promise[] = []; - constructor({ - id, - commandStream, - capTpStream, - bootstrap, - }: SupervisorConstructorProps) { + constructor({ id, commandStream }: SupervisorConstructorProps) { this.id = id; - this.#bootstrap = bootstrap; this.#commandStream = commandStream; - this.#capTpStream = capTpStream; + this.#dispatch = null; Promise.all([ this.#commandStream.drain(this.handleMessage.bind(this)), - this.#capTpStream.drain((content): void => { - this.capTp?.dispatch(content); - }), ]).catch(async (error) => { console.error( `Unexpected read error from VatSupervisor "${this.id}"`, error, ); - await this.terminate( - new StreamReadError({ supervisorId: this.id }, error), - ); + await this.terminate(new StreamReadError({ vatId: this.id }, error)); }); } @@ -65,11 +76,7 @@ export class VatSupervisor { * @param error - The error to terminate the VatSupervisor with. */ async terminate(error?: Error): Promise { - // eslint-disable-next-line promise/no-promise-in-callback - await Promise.all([ - this.#commandStream.end(error), - this.#capTpStream.end(error), - ]); + await this.#commandStream.end(error); } /** @@ -97,60 +104,27 @@ export class VatSupervisor { }); break; } - case VatCommandMethod.capTpInit: { - this.capTp = makeCapTP( - 'iframe', - async (content: Json) => this.#capTpStream.write(content), - this.#bootstrap, - ); + + case VatCommandMethod.deliver: { + if (!this.#dispatch) { + console.error(`cannot deliver before vat is loaded`); + return; + } + await this.#dispatch(harden(payload.params)); + await Promise.all(this.#syscallsInFlight); + this.#syscallsInFlight.length = 0; await this.replyToMessage(id, { - method: VatCommandMethod.capTpInit, - params: '~~~ CapTP Initialized ~~~', + method: VatCommandMethod.deliver, + params: null, // XXX eventually this should be the actual result? }); break; } - case VatCommandMethod.loadUserCode: { - if (this.#loaded) { - throw Error( - 'VatSupervisor received LoadUserCode after user code already loaded', - ); - } - this.#loaded = true; - const vatConfig: VatConfig = payload.params as VatConfig; - if (!isVatConfig(vatConfig)) { - throw Error( - 'VatSupervisor received LoadUserCode with bad config parameter', - ); - } - // XXX TODO: this check can and should go away once we can handle `bundleName` and `sourceSpec` too - if (!vatConfig.bundleSpec) { - throw Error( - 'for now, only bundleSpec is support in vatConfig specifications', - ); - } - console.log('VatSupervisor requested user code load:', vatConfig); - const { bundleSpec, parameters } = vatConfig; - const fetched = await fetch(bundleSpec); - if (!fetched.ok) { - throw Error( - `fetch of user code ${bundleSpec} failed: ${fetched.status}`, - ); - } - const bundle = await fetched.json(); - const vatNS = await importBundle(bundle, { - endowments: { - console, - }, - }); - const { start }: { start: UserCodeStartFn } = vatNS; - if (start === undefined) { - throw Error(`vat module ${bundleSpec} has no start function`); - } - const rootObject = start(parameters); + case VatCommandMethod.initVat: { + const rootObjectVref = await this.#initVat(payload.params); await this.replyToMessage(id, { - method: VatCommandMethod.loadUserCode, - params: stringify(rootObject), + method: VatCommandMethod.initVat, + params: rootObjectVref, }); break; } @@ -162,6 +136,19 @@ export class VatSupervisor { }); break; + case VatCommandMethod.syscall: { + const [result, failure] = payload.params; + if (result !== 'ok') { + // A syscall can't fail as the result of user code misbehavior, but + // only from some kind of internal system problem, so if it happens we + // die. + const errMsg = `syscall failure ${failure}`; + console.error(errMsg); + await this.terminate(Error(errMsg)); + } + break; + } + default: throw Error( 'VatSupervisor received unexpected command method:', @@ -171,6 +158,93 @@ export class VatSupervisor { } } + executeSyscall(vso: VatSyscallObject): VatSyscallResult { + const payload: VatCommandReply['payload'] = { + method: VatCommandMethod.syscall, + params: vso, + }; + this.#syscallsInFlight.push( + this.#commandStream.write({ + id: 'none', + payload, + }), + ); + return ['ok', null]; + } + + async #initVat(vatConfig: VatConfig): Promise { + if (this.#loaded) { + throw Error( + 'VatSupervisor received initVat after user code already loaded', + ); + } + if (!isVatConfig(vatConfig)) { + throw Error('VatSupervisor received initVat with bad config parameter'); + } + // XXX TODO: this check can and should go away once we can handle `bundleName` and `sourceSpec` too + if (!vatConfig.bundleSpec) { + throw Error( + 'for now, only bundleSpec is support in vatConfig specifications', + ); + } + this.#loaded = true; + + const kvStore = await makeSQLKVStore(`[vat-${this.id}]`, true); + const syscall = makeSupervisorSyscall(this, kvStore); + const vatPowers = {}; // XXX should be something more real + const liveSlotsOptions = {}; // XXX should be something more real + + const gcTools = harden({ + WeakRef, + FinalizationRegistry, + waitUntilQuiescent, + gcAndFinalize: null, + meterControl: makeDummyMeterControl(), + }); + + const workerEndowments = { + console, + assert: globalThis.assert, + }; + + console.log('VatSupervisor requested user code load:', vatConfig); + const { bundleSpec, parameters } = vatConfig; + + const fetched = await fetch(bundleSpec); + if (!fetched.ok) { + throw Error(`fetch of user code ${bundleSpec} failed: ${fetched.status}`); + } + const bundle = await fetched.json(); + + const buildVatNamespace = async ( + lsEndowments: object, + inescapableGlobalProperties: object, + ): Promise> => { + const vatNS = await importBundle(bundle, { + filePrefix: `vat-${this.id}/...`, + endowments: { ...workerEndowments, ...lsEndowments }, + inescapableGlobalProperties, + }); + return vatNS; + }; + + const liveslots = makeLiveSlots( + syscall, + this.id, + vatPowers, + liveSlotsOptions, + gcTools, + console, + buildVatNamespace, + ); + + this.#dispatch = liveslots.dispatch; + const serParam = marshal.toCapData(harden(parameters)) as CapData; + await this.#dispatch(harden(['startVat', serParam])); + + return ROOT_OBJECT_VREF; + } + /** * Reply to a message from the parent window. * diff --git a/packages/kernel/src/ag-store-types.ts b/packages/kernel/src/ag-store-types.ts new file mode 100644 index 000000000..938f73b21 --- /dev/null +++ b/packages/kernel/src/ag-store-types.ts @@ -0,0 +1,243 @@ +// XXX placeholder to get around @agoric/store package configuration issues +// + +// This is Agoric code that breaks some of our local eslint rules. Disabling +// those because the code's not for us to redefine. +/* eslint-disable @typescript-eslint/naming-convention, + @typescript-eslint/no-explicit-any, + @typescript-eslint/no-unnecessary-type-arguments */ + +import type { Passable, RemotableObject } from '@endo/pass-style'; +import type { CopySet, CopyMap, Pattern } from '@endo/patterns'; + +// Ensure this is a module. +export {}; + +/** + * Of the dimensions on which KeyedStores can differ, we only represent a few of them + * as standard options. A given store maker should document which options it supports, + * as well as its positions on dimensions for which it does not support options. + */ +export type StoreOptions = { + /** + * Which way to optimize a weak store. True means that we expect this weak store + * to outlive most of its keys, in which case we internally may use a JavaScript + * `WeakMap`. Otherwise we internally may use a JavaScript `Map`. Defaults to true, + * so please mark short lived stores explicitly. + */ + longLived?: boolean; + + /** + * The contents of this store survive termination of its containing process, + * allowing for restart or upgrade but at the cost of forbidding storage of + * references to ephemeral data. Defaults to false. + */ + durable?: boolean; + + /** + * This store pretends to be a durable store but does not enforce that the things + * stored in it actually be themselves durable (whereas an actual durable store + * would forbid storage of such items). This is in service of allowing incremental + * transition to use of durable stores, to enable normal operation and testing when + * some stuff intended to eventually be durable has not yet been made durable. A + * store marked as fakeDurable will appear to operate normally but any attempt to + * upgrade its containing vat will fail with an error. Defaults to false. + */ + fakeDurable?: boolean; + + keyShape?: Pattern; + valueShape?: Pattern; +}; + +/** + * Most store methods are in one of three categories + * + * - lookup methods (`has`,`get`) + * - update methods (`add`,`init`,`set`,`delete`,`addAll`) + * - query methods (`snapshot`,`keys`,`values`,`entries`,`getSize`) + * - query-update methods (`clear`) + * + * WeakStores have the lookup and update methods but not the query or + * query-update methods. Non-weak Stores are like their corresponding + * WeakStores, but with the additional query and query-update methods. + */ + +// TODO use Key for K +export type WeakSetStoreMethods = { + /** + * Check if a key exists. The key can be any JavaScript value, though the answer + * will always be false for keys that cannot be found in this store. + */ + has(key: K): boolean; + + /** + * Add the key to the set if it is not already there. Do nothing silently if + * already there. The key must be one allowed by this store. For example a scalar + * store only allows primitives and remotables. + */ + add(key: K): void; + + /** + * Remove the key. Throws if not found. + */ + delete(key: K): void; + + addAll(keys: CopySet | Iterable): void; +}; + +export type WeakSetStore = RemotableObject & WeakSetStoreMethods; + +// TODO use Key for K +export type SetStoreMethods = { + /** + * Check if a key exists. The key can be any JavaScript value, though the answer + * will always be false for keys that cannot be found in this store. + */ + has(key: K): boolean; + + /** + * Add the key to the set if it is not already there. Do nothing silently if + * already there. The key must be one allowed by this store. For example a scalar + * store only allows primitives and remotables. + */ + add(key: K): void; + + /** + * Remove the key. Throws if not found. + */ + delete(key: K): void; + + addAll(keys: CopySet | Iterable): void; + keys(keyPatt?: Pattern): Iterable; + values(keyPatt?: Pattern): Iterable; + snapshot(keyPatt?: Pattern): CopySet; + getSize(keyPatt?: Pattern): number; + clear(keyPatt?: Pattern): void; +}; + +export type SetStore = RemotableObject & SetStoreMethods; + +// TODO use Key for K +// TODO use Passable for V +export type WeakMapStore = { + /** + * Check if a key exists. The key can be any JavaScript value, though the answer + * will always be false for keys that cannot be found in this store. + */ + has(key: K): boolean; + + /** + * Return a value for the key. Throws if not found. + */ + get(key: K): V; + + /** + * Initialize the key only if it doesn't already exist. The key must be one + * allowed by this store. For example a scalar store only allows primitives + * and remotables. + */ + init(key: K, value: V): void; + + /** + * Set the key. Throws if not found. + */ + set(key: K, value: V): void; + + /** + * Remove the key. Throws if not found. + */ + delete(key: K): void; + + addAll(entries: CopyMap | Iterable<[K, V]>): void; +}; + +// TODO use Key for K +// TODO use Passable for V +export type MapStoreMethods = { + /** + * Check if a key exists. The key can be any JavaScript value, though the answer + * will always be false for keys that cannot be found in this map + */ + has(key: K): boolean; + + /** + * Return a value for the key. Throws if not found. + */ + get(key: K): V; + + /** + * Initialize the key only if it doesn't already exist. The key must be one + * allowed by this store. For example a scalar store only allows primitives + * and remotables. + */ + init(key: K, value: V): void; + + /** + * Set the key. Throws if not found. + */ + set(key: K, value: V): void; + + /** + * Remove the key. Throws if not found. + */ + delete(key: K): void; + + addAll(entries: CopyMap | Iterable<[K, V]>): void; + keys(keyPatt?: Pattern, valuePatt?: Pattern): Iterable; + values(keyPatt?: Pattern, valuePatt?: Pattern): Iterable; + entries(keyPatt?: Pattern, valuePatt?: Pattern): Iterable<[K, V]>; + snapshot(keyPatt?: Pattern, valuePatt?: Pattern): CopyMap; + getSize(keyPatt?: Pattern, valuePatt?: Pattern): number; + clear(keyPatt?: Pattern, valuePatt?: Pattern): void; +}; + +export type MapStore = RemotableObject & + MapStoreMethods; + +// ///////////////////////// Deprecated Legacy ///////////////////////////////// + +/** + * LegacyWeakMap is deprecated. Use WeakMapStore instead if possible. + */ +export type LegacyWeakMap = { + /** Check if a key exists */ + has(key: K): boolean; + + /** Return a value for the key. Throws if not found. */ + get(key: K): V; + + /** Initialize the key only if it doesn't already exist */ + init(key: K, value: V): void; + + /** Set the key. Throws if not found. */ + set(key: K, value: V): void; + + /** Remove the key. Throws if not found. */ + delete(key: K): void; +}; + +/** + * LegacyMap is deprecated. Use MapStore instead if possible. + */ +export type LegacyMap = { + /** Check if a key exists */ + has(key: K): boolean; + + /** Return a value for the key. Throws if not found. */ + get(key: K): V; + + /** Initialize the key only if it doesn't already exist */ + init(key: K, value: V): void; + + /** Set the key. Throws if not found. */ + set(key: K, value: V): void; + + /** Remove the key. Throws if not found. */ + delete(key: K): void; + + keys(): Iterable; + values(): Iterable; + entries(): Iterable<[K, V]>; + getSize(): number; + clear(): void; +}; diff --git a/packages/kernel/src/ag-types-index.ts b/packages/kernel/src/ag-types-index.ts new file mode 100644 index 000000000..063193d77 --- /dev/null +++ b/packages/kernel/src/ag-types-index.ts @@ -0,0 +1,4 @@ +// XXX placeholder to get around @agoric/swingset-liveslots package configuration issues + +export type * from './ag-types.js'; +export type * from './ag-vatDataTypes.js'; diff --git a/packages/kernel/src/ag-types.ts b/packages/kernel/src/ag-types.ts new file mode 100644 index 000000000..7cb6e2d91 --- /dev/null +++ b/packages/kernel/src/ag-types.ts @@ -0,0 +1,115 @@ +// XXX placeholder to get around @agoric/swingset-liveslots package configuration issues + +// This is Agoric code that breaks some of our local eslint rules. Disabling +// those because the code's not for us to redefine. +/* eslint-disable @typescript-eslint/naming-convention, @typescript-eslint/no-explicit-any */ + +import type { CapData } from '@endo/marshal'; + +// Type for makeLiveSlots callback +export type makeLiveSlots = () => void; + +/** + * The MeterControl object gives liveslots a mechanism to disable metering for certain GC-sensitive + * regions of code. Only the XS worker can actually do metering, but we track the enabled/disabled + * status on all workers, so that the assertions can be exercised more thoroughly (via non-XS unit + * tests). MeterControl.isMeteringDisabled()===false does not mean metering is happening, it just + * means that MeterControl isn't disabling it. + */ +export type MeterControl = { + isMeteringDisabled: () => boolean; // Ask whether metering is currently disabled. + assertIsMetered: unknown; + assertNotMetered: unknown; + runWithoutMetering: unknown; // Run a callback outside metering + runWithoutMeteringAsync: unknown; // Run an async callback outside metering + unmetered: unknown; // Wrap a callback with runWithoutMetering +}; + +export type LiveSlotsOptions = { + enableDisavow?: boolean; + relaxDurabilityRules?: boolean; + allowStateShapeChanges?: boolean; +}; + +export type SwingSetCapData = CapData; + +export type Message = { + methargs: SwingSetCapData; // of [method, args] + result?: string | undefined | null; +}; + +export type VatDeliveryMessage = ['message', string, Message]; +export type VatOneResolution = [string, boolean, SwingSetCapData]; +export type VatDeliveryNotify = ['notify', VatOneResolution[]]; +export type VatDeliveryDropExports = ['dropExports', string[]]; +export type VatDeliveryRetireExports = ['retireExports', string[]]; +export type VatDeliveryRetireImports = ['retireImports', string[]]; +export type VatDeliveryChangeVatOptions = [ + 'changeVatOptions', + Record, +]; +export type VatDeliveryStartVat = ['startVat', SwingSetCapData]; +export type VatDeliveryStopVat = ['stopVat', SwingSetCapData]; +export type VatDeliveryBringOutYourDead = ['bringOutYourDead']; + +export type VatDeliveryObject = + | VatDeliveryMessage + | VatDeliveryNotify + | VatDeliveryDropExports + | VatDeliveryRetireExports + | VatDeliveryRetireImports + | VatDeliveryChangeVatOptions + | VatDeliveryStartVat + | VatDeliveryStopVat + | VatDeliveryBringOutYourDead; + +export type MeterConsumption = { + compute: number; +}; + +export type VatDeliveryResult = + | ['ok', any, MeterConsumption | null] + | ['error', string, MeterConsumption | null]; + +export type VatSyscallSend = ['send', string, Message]; +export type VatSyscallCallNow = ['callNow', string, string, SwingSetCapData]; +export type VatSyscallSubscribe = ['subscribe', string]; +export type VatSyscallResolve = ['resolve', VatOneResolution[]]; +export type VatSyscallExit = ['exit', boolean, SwingSetCapData]; +export type VatSyscallVatstoreGet = ['vatstoreGet', string]; +export type VatSyscallVatstoreGetNextKey = ['vatstoreGetNextKey', string]; +export type VatSyscallVatstoreSet = ['vatstoreSet', string, string]; +export type VatSyscallVatstoreDelete = ['vatstoreDelete', string]; +export type VatSyscallDropImports = ['dropImports', string[]]; +export type VatSyscallRetireImports = ['retireImports', string[]]; +export type VatSyscallRetireExports = ['retireExports', string[]]; +export type VatSyscallAbandonExports = ['abandonExports', string[]]; + +export type VatSyscallObject = + | VatSyscallSend + | VatSyscallCallNow + | VatSyscallSubscribe + | VatSyscallResolve + | VatSyscallExit + | VatSyscallVatstoreGet + | VatSyscallVatstoreGetNextKey + | VatSyscallVatstoreSet + | VatSyscallVatstoreDelete + | VatSyscallDropImports + | VatSyscallRetireImports + | VatSyscallRetireExports + | VatSyscallAbandonExports; + +export type VatSyscallResultOk = [ + 'ok', + SwingSetCapData | string | string[] | null, +]; +export type VatSyscallResultError = ['error', string]; +export type VatSyscallResult = VatSyscallResultOk | VatSyscallResultError; + +export type VatSyscallHandler = (vso: VatSyscallObject) => VatSyscallResult; + +export type PromiseWatcher = { + onFulfilled?: (value: V, ...args: A) => void; + onRejected?: (reason: unknown, ...args: A) => void; +}; diff --git a/packages/kernel/src/ag-vatDataTypes.ts b/packages/kernel/src/ag-vatDataTypes.ts new file mode 100644 index 000000000..c3678b757 --- /dev/null +++ b/packages/kernel/src/ag-vatDataTypes.ts @@ -0,0 +1,286 @@ +// XXX placeholder to get around @agoric/swingset-liveslots package configuration issues + +// This is Agoric code that breaks some of our local eslint rules. Disabling +// those because the code's not for us to redefine. +/* eslint-disable @typescript-eslint/naming-convention, + @typescript-eslint/no-explicit-any, + @typescript-eslint/array-type, + import-x/order, + @typescript-eslint/prefer-function-type, + @typescript-eslint/no-empty-object-type, + no-restricted-syntax */ + +/** + * @file Types for vat-data + * + * Facet is a single object with methods. + * Behavior is a description when defining a kind of what facets it will have. + * For the non-multi defineKind, there is just one facet so it doesn't have a key. + */ +import type { + MapStore, + SetStore, + StoreOptions, + WeakMapStore, + WeakSetStore, +} from './ag-store-types.js'; +// } from '@agoric/store'; + +import type { Amplify, IsInstance, ReceivePower, StateShape } from '@endo/exo'; +import type { RemotableObject } from '@endo/pass-style'; +import type { RemotableBrand } from '@endo/eventual-send'; +import type { InterfaceGuard, Pattern } from '@endo/patterns'; +// import type { makeWatchedPromiseManager } from './watchedPromises.js'; + +// TODO should be moved into @endo/patterns and eventually imported here +// instead of this local definition. +export type InterfaceGuardKit = Record; +export type { MapStore, Pattern }; + +// This needs `any` values. If they were `unknown`, code that uses Baggage +// would need explicit runtime checks or casts for every fetch, which is +// onerous. +export type Baggage = MapStore; + +// type WatchedPromisesManager = ReturnType; + +// used to omit the 'context' parameter +type OmitFirstArg = F extends (x: any, ...args: infer P) => infer R + ? (...args: P) => R + : never; + +// The type of a passable local object with methods. +// An internal helper to avoid having to repeat `O`. +type PrimaryRemotable = O & RemotableObject & RemotableBrand<{}, O>; + +export type KindFacet = PrimaryRemotable<{ + [K in keyof O]: OmitFirstArg; // omit the 'context' parameter +}>; + +export type KindFacets = { + [FacetKey in keyof B]: KindFacet; +}; + +export type KindContext = { state: S; self: KindFacet }; +export type MultiKindContext = { state: S; facets: KindFacets }; + +export type PlusContext any> = ( + c: C, + ...args: Parameters +) => ReturnType; + +export type FunctionsPlusContext< + C, + O extends Record any>, +> = { + [K in keyof O]: PlusContext; +}; + +declare class DurableKindHandleClass { + private readonly descriptionTag: string; +} +export type DurableKindHandle = DurableKindHandleClass; + +/** + * Grab bag of options that can be provided to `defineDurableKind` and its + * siblings. Not all options are meaningful in all contexts. See the + * doc-comments on each option. + */ +export type DefineKindOptions = { + /** + * If provided, the `finish` function will be called after the instance is + * made and internally registered, but before it is returned. The finish + * function is to do any post-intantiation initialization that should be + * done before exposing the object to its clients. + */ + finish?: (context: C) => void; + + /** + * If provided, it describes the shape of all state records of instances + * of this kind. + */ + stateShape?: StateShape; + + /** + * If a `receiveAmplifier` function is provided to an exo class kit definition, + * it will be called with an `Amplify` function. If provided to the definition + * of a normal exo or exo class, the definition will throw, since only + * exo kits can be amplified. + * An `Amplify` function is a function that takes a facet instance of + * this class kit as an argument, in which case it will return the facets + * record, giving access to all the facet instances of the same cohort. + */ + receiveAmplifier?: ReceivePower; + + /** + * If a `receiveInstanceTester` function is provided, it will be called + * during the definition of the exo class or exo class kit with an + * `IsInstance` function. The first argument of `IsInstance` + * is the value to be tested. When it may be a facet instance of an + * exo class kit, the optional second argument, if provided, is + * a `facetName`. In that case, the function tests only if the first + * argument is an instance of that facet of the associated exo class kit. + */ + receiveInstanceTester?: ReceivePower; + + // TODO properties above are identical to those in FarClassOptions. + // These are the only options that should be exposed by + // vat-data's public virtual/durable exo APIs. This DefineKindOptions + // should explicitly be a subtype, where the methods below are only for + // internal use, i.e., below the exo level. + + /** + * As a kind option, intended for internal use only. + * Meaningful to `makeScalarBigMapStore` and its siblings. These maker + * fuctions will make either virtual or durable stores, depending on + * this flag. Defaults to off, making virtual but not durable collections. + * + * Generally, durable collections are provided with `provideDurableMapStore` + * and its sibling, which use this flag internally. If you do not make + * durable collections by other means, you can consider this as + * intended for internal use only. + */ + durable?: boolean; + + /** + * Intended for internal use only. + * Should the raw methods receive their `context` argument as their first + * argument or as their `this` binding? For `defineDurableKind` and its + * siblings (including `prepareSingleton`), this defaults to off, meaning that + * their behavior methods receive `context` as their first argument. + * `prepareExoClass` and its siblings (including `prepareExo`) use + * this flag internally to indicate that their methods receive `context` + * as their `this` binding. + */ + thisfulMethods?: boolean; + + /** + * Intended for internal use only. + * Only applicable if this is a class kind. A class kit kind should use + * `interfaceGuardKit` instead. + * + * If an `interfaceGuard` is provided, then the raw methods passed alongside + * it are wrapped by a function that first checks that this method's guard + * pattern is satisfied before calling the raw method. + * + * In `defineDurableKind` and its siblings, this defaults to `undefined`. + * Exo classes use this internally to protect their raw class methods + * using the provided interface. + * In absence, an exo is protected anyway, while a bare kind is + * not (detected by `!thisfulMethods`), + */ + interfaceGuard?: InterfaceGuard; + + /** + * Intended for internal use only. + * Only applicable if this is a class kit kind. A class kind should use + * `interfaceGuard` instead. + * + * If an `interfaceGuardKit` is provided, then each member of the + * interfaceGuardKit is used to guard the corresponding facet of the + * class kit. + * + * In `defineDurableKindMulti` and its siblings, this defaults to `undefined`. + * Exo class kits use this internally to protect their facets. + * In absence, an exo is protected anyway, while a bare kind is + * not (detected by `!thisfulMethods`), + */ + interfaceGuardKit?: InterfaceGuardKit; +}; + +export type VatData = { + // virtual kinds + /** @deprecated Use defineVirtualExoClass instead */ + defineKind:

, S, F>( + tag: string, + init: (...args: P) => S, + facet: F, + options?: DefineKindOptions>, + ) => (...args: P) => KindFacet; + + /** @deprecated Use defineVirtualExoClassKit instead */ + defineKindMulti:

, S, B>( + tag: string, + init: (...args: P) => S, + behavior: B, + options?: DefineKindOptions>, + ) => (...args: P) => KindFacets; + + // durable kinds + makeKindHandle: (descriptionTag: string) => DurableKindHandle; + + /** @deprecated Use defineDurableExoClass instead */ + defineDurableKind:

, S, F>( + kindHandle: DurableKindHandle, + init: (...args: P) => S, + facet: F, + options?: DefineKindOptions>, + ) => (...args: P) => KindFacet; + + /** @deprecated Use defineDurableExoClassKit instead */ + defineDurableKindMulti:

, S, B>( + kindHandle: DurableKindHandle, + init: (...args: P) => S, + behavior: B, + options?: DefineKindOptions>, + ) => (...args: P) => KindFacets; + + // providePromiseWatcher: WatchedPromisesManager['providePromiseWatcher']; + // watchPromise: WatchedPromisesManager['watchPromise']; + + makeScalarBigMapStore: ( + label: string, + options?: StoreOptions, + ) => MapStore; + makeScalarBigWeakMapStore: ( + label: string, + options?: StoreOptions, + ) => WeakMapStore; + + makeScalarBigSetStore: ( + label: string, + options?: StoreOptions, + ) => SetStore; + makeScalarBigWeakSetStore: ( + label: string, + options?: StoreOptions, + ) => WeakSetStore; + canBeDurable: (specimen: unknown) => boolean; +}; + +// The JSDoc is repeated here and at the function definition so it appears +// in IDEs where it's used, regardless of type resolution. +export type PickFacet = { + /** + * When making a multi-facet kind, it's common to pick one facet to + * expose. E.g., + * + * const makeFoo = (a, b, c, d) => makeFooBase(a, b, c, d).self; + * + * This helper reduces the duplication: + * + * const makeFoo = pickFacet(makeFooBase, 'self'); + */ + any, F extends keyof ReturnType>( + maker: M, + facetName: F, + ): (...args: Parameters) => ReturnType[F]; +}; + +/** @deprecated Use prepareExoClass instead */ +export type PrepareKind =

, S, F>( + baggage: Baggage, + tag: string, + init: (...args: P) => S, + facet: F, + options?: DefineKindOptions>, +) => (...args: P) => KindFacet; + +/** @deprecated Use prepareExoClassKit instead */ +export type PrepareKindMulti =

, S, B>( + baggage: Baggage, + tag: string, + init: (...args: P) => S, + behavior: B, + options?: DefineKindOptions>, +) => (...args: P) => KindFacets; diff --git a/packages/kernel/src/dummyMeterControl.ts b/packages/kernel/src/dummyMeterControl.ts new file mode 100644 index 000000000..95cfa07ab --- /dev/null +++ b/packages/kernel/src/dummyMeterControl.ts @@ -0,0 +1,57 @@ +import { assert } from '@endo/errors'; + +/* eslint-disable jsdoc/require-jsdoc */ + +export function makeDummyMeterControl(): unknown { + let meteringDisabled = 0; + + function isMeteringDisabled(): boolean { + return Boolean(meteringDisabled); + } + + function assertIsMetered(message: string): void { + assert(!meteringDisabled, message); + } + + function assertNotMetered(message: string): void { + assert(Boolean(meteringDisabled), message); + } + + function runWithoutMetering(thunk: () => unknown): unknown { + meteringDisabled += 1; + try { + return thunk(); + } finally { + meteringDisabled -= 1; + } + } + + async function runWithoutMeteringAsync( + thunk: () => unknown, + ): Promise { + meteringDisabled += 1; + return Promise.resolve() + .then(() => thunk()) + .finally(() => { + meteringDisabled -= 1; + }); + } + + // return a version of func that runs outside metering + function unmetered(func: (...args: unknown[]) => unknown): unknown { + function wrapped(...args: unknown[]): unknown { + return runWithoutMetering(() => func(...args)); + } + return harden(wrapped); + } + + const meterControl = { + isMeteringDisabled, + assertIsMetered, + assertNotMetered, + runWithoutMetering, + runWithoutMeteringAsync, + unmetered, + }; + return harden(meterControl); +} diff --git a/packages/kernel/src/index.test.ts b/packages/kernel/src/index.test.ts index 8c6924c67..d238a2a74 100644 --- a/packages/kernel/src/index.test.ts +++ b/packages/kernel/src/index.test.ts @@ -1,4 +1,5 @@ import { describe, it, expect } from 'vitest'; +import '@ocap/test-utils'; import * as indexModule from './index.js'; @@ -23,6 +24,7 @@ describe('index', () => { 'isVatId', 'isVatWorkerServiceCommand', 'isVatWorkerServiceReply', + 'makeSQLKVStore', ]); }); }); diff --git a/packages/kernel/src/index.ts b/packages/kernel/src/index.ts index 8b7a9dd67..ba8aacd6a 100644 --- a/packages/kernel/src/index.ts +++ b/packages/kernel/src/index.ts @@ -1,8 +1,11 @@ export * from './messages/index.js'; export { Kernel } from './Kernel.js'; -export type { KVStore } from './store/kernel-store.js'; +export type { KVStore } from './store/sqlite-kv-store.js'; +export { makeSQLKVStore } from './store/sqlite-kv-store.js'; export { VatHandle } from './VatHandle.js'; export { VatSupervisor } from './VatSupervisor.js'; +// XXX Once the packaging of liveslots is fixed, this should be imported from there +export type { Message } from './ag-types.js'; export type { VatId, VatWorkerService, diff --git a/packages/kernel/src/kernel-marshal.ts b/packages/kernel/src/kernel-marshal.ts new file mode 100644 index 000000000..19564e14b --- /dev/null +++ b/packages/kernel/src/kernel-marshal.ts @@ -0,0 +1,148 @@ +import { assert, Fail } from '@endo/errors'; +import { Far, passStyleOf } from '@endo/far'; +import { makeMarshal } from '@endo/marshal'; +import type { CapData } from '@endo/marshal'; +import type { Passable } from '@endo/pass-style'; + +import type { KRef } from './types.js'; + +// Simple wrapper for serializing and unserializing marshalled values inside the +// kernel, where we don't actually want to use clists nor actually allocate real +// objects, but instead to stay entirely within the domain of krefs. This is +// used to enable syntactic manipulation of serialized values while remaining +// agnostic about the internal details of the serialization encoding. + +type ObjectStandin = { + getKref: () => string; + iface: () => string; +}; +export type SlotValue = ObjectStandin | Promise; + +const { toStringTag } = Symbol; + +/** + * Create a promise as a standin object for a kpid. This is never actually used + * as a promise; its job is just to carry the kref as a tag while at the same + * time looking to passStyleOf as if it's a Promise. + * + * @param kref - A KRef string to tag the result with. + * + * @returns A nominal Promise object tagged with `kref`. + */ +// eslint-disable-next-line @typescript-eslint/promise-function-async +function makeStandinPromise(kref: string): Promise { + const standinP = Promise.resolve(`${kref} stand in`); + // eslint-disable-next-line @typescript-eslint/no-floating-promises + Object.defineProperty(standinP, toStringTag, { + value: kref, + enumerable: false, + }); + return harden(standinP); +} + +/** + * Extract the tagged `kref` from a standin promise. + * + * @param promise - A promise that has previously been labelled via `makeStandinPromise`. + * + * @returns The KRef tag that `promise` carries. + */ +function getStandinPromiseTag(promise: Promise): string { + const desc = Object.getOwnPropertyDescriptor(promise, toStringTag); + assert(desc !== undefined, 'promise lacks own @@toStringTag property'); + const kref = desc.value; + assert.typeof(kref, 'string'); + return kref; +} + +/** + * Obtain a value serializable via `kser` for a given KRef. + * + * @param kref - The KRef string to get a value for. + * @param iface - Option interface type descriptor string. + * + * @returns A `kser` serializable value for `kref`. + */ +export function kslot(kref: string, iface: string = 'undefined'): SlotValue { + assert.typeof(kref, 'string'); + if (iface?.startsWith('Alleged: ')) { + // Encoder prepends "Alleged: " to iface string, but the decoder doesn't strip it + // Unclear whether it's the decoder or me who is wrong + // eslint-disable-next-line no-param-reassign + iface = iface.slice(9); + } + if (kref.startsWith('p') || kref.startsWith('kp') || kref.startsWith('rp')) { + return makeStandinPromise(kref); + } + const standinObject = Far(iface, { + iface: () => iface, + getKref: () => `${kref}`, + }); + return standinObject; +} + +/** + * Obtain the KRef associated with a value that was serialized with `kser`. + * + * @param obj - The value of interest. + * + * @returns a KRef string for `obj`. + */ +export function krefOf(obj: SlotValue): string { + switch (passStyleOf(obj) as string) { + case 'promise': { + return getStandinPromiseTag(obj as Promise); + } + case 'remotable': { + const { getKref } = obj as ObjectStandin; + assert.typeof(getKref, 'function', 'object lacks getKref function'); + return getKref(); + } + default: + // When krefOf() is called as part of kmarshal.serialize, marshal + // will only give it things that are 'remotable' (Promises and the + // Far objects created by kslot()). When krefOf() is called by + // kernel code, it ought to throw if 'obj' is not one of the + // objects created by our kslot(). + return Fail`krefOf requires a promise or remotable`; + } +} + +const kmarshal = makeMarshal(krefOf, kslot, { + serializeBodyFormat: 'smallcaps', + errorTagging: 'off', +}); + +/** + * Serialize a value in kernel space. + * + * @param value - The value to be serialized. + * + * @returns a capdata object that can be deserialized with `kunser`. + */ +export function kser(value: unknown): CapData { + return kmarshal.toCapData(harden(value as Passable)) as CapData; +} + +/** + * Deserialize a value that was serialized with `kser`. + * + * @param serializedValue -- The value to deserialize. + * + * @returns the deserialization of `serializedValue`. + */ +export function kunser(serializedValue: CapData): unknown { + return kmarshal.fromCapData(serializedValue); +} + +/** + * Produce a serialized form of an Error. + * + * @param message - The error message to construct the Error with. + * + * @returns The resulting error after serialization. + */ +export function makeError(message: string): CapData { + assert.typeof(message, 'string'); + return kser(Error(message)); +} diff --git a/packages/kernel/src/messages/index.ts b/packages/kernel/src/messages/index.ts index f82e18989..7f7b3fee3 100644 --- a/packages/kernel/src/messages/index.ts +++ b/packages/kernel/src/messages/index.ts @@ -6,16 +6,16 @@ export { isKernelCommandReply, KernelSendMessageStruct, } from './kernel.js'; -export type { - CapTpPayload, - KernelCommand, - KernelCommandReply, -} from './kernel.js'; +export type { KernelCommand, KernelCommandReply } from './kernel.js'; // Vat commands. export { VatCommandMethod, isVatCommand, isVatCommandReply } from './vat.js'; -export type { VatCommand, VatCommandReply } from './vat.js'; +export type { + VatCommand, + VatCommandReply, + VatCommandReturnType, +} from './vat.js'; // Vat worker service commands. @@ -31,5 +31,3 @@ export type { // Message resolver. export { MessageResolver } from './message-resolver.js'; - -// Syscalls. diff --git a/packages/kernel/src/messages/kernel.ts b/packages/kernel/src/messages/kernel.ts index 221e7117a..58f67edd6 100644 --- a/packages/kernel/src/messages/kernel.ts +++ b/packages/kernel/src/messages/kernel.ts @@ -1,13 +1,5 @@ -import { - object, - union, - literal, - string, - is, - array, -} from '@metamask/superstruct'; +import { object, union, literal, string, is } from '@metamask/superstruct'; import type { Infer } from '@metamask/superstruct'; -import { UnsafeJsonStruct } from '@metamask/utils'; import type { TypeGuard } from '@ocap/utils'; import { @@ -20,24 +12,12 @@ import { VatIdStruct } from '../types.js'; export const KernelCommandMethod = { evaluate: VatTestCommandMethod.evaluate, - capTpCall: 'capTpCall', kvSet: 'kvSet', kvGet: 'kvGet', ping: VatTestCommandMethod.ping, } as const; -const CapTpPayloadStruct = object({ - method: string(), - params: array(UnsafeJsonStruct), -}); - -export type CapTpPayload = Infer; - const KernelCommandStruct = union([ - object({ - method: literal(KernelCommandMethod.capTpCall), - params: CapTpPayloadStruct, - }), object({ method: literal(KernelCommandMethod.kvSet), params: object({ key: string(), value: string() }), @@ -51,10 +31,6 @@ const KernelCommandStruct = union([ ]); const KernelCommandReplyStruct = union([ - object({ - method: literal(KernelCommandMethod.capTpCall), - params: string(), - }), object({ method: literal(KernelCommandMethod.kvSet), params: string(), @@ -80,9 +56,5 @@ export const isKernelCommandReply: TypeGuard = ( export const KernelSendMessageStruct = object({ id: VatIdStruct, - payload: union([ - VatMethodStructs.evaluate, - VatMethodStructs.ping, - VatMethodStructs.capTpInit, - ]), + payload: union([VatMethodStructs.evaluate, VatMethodStructs.ping]), }); diff --git a/packages/kernel/src/messages/vat.test.ts b/packages/kernel/src/messages/vat.test.ts index 3e98e83b1..e7c57f4ca 100644 --- a/packages/kernel/src/messages/vat.test.ts +++ b/packages/kernel/src/messages/vat.test.ts @@ -40,28 +40,6 @@ describe('isVatCommandReply', () => { }, expected: true, }, - { - name: 'capTpInit reply', - value: { - id: 'v0:789', - payload: { - method: VatCommandMethod.capTpInit, - params: 'initialized', - }, - }, - expected: true, - }, - { - name: 'loadUserCode reply', - value: { - id: 'v0:101', - payload: { - method: VatCommandMethod.loadUserCode, - params: 'loaded', - }, - }, - expected: true, - }, { name: 'invalid id format', value: { diff --git a/packages/kernel/src/messages/vat.ts b/packages/kernel/src/messages/vat.ts index 725979a41..95f878002 100644 --- a/packages/kernel/src/messages/vat.ts +++ b/packages/kernel/src/messages/vat.ts @@ -1,24 +1,33 @@ import { object, + array, + record, + unknown, + tuple, union, literal, - record, refine, string, + boolean, is, } from '@metamask/superstruct'; import type { Infer } from '@metamask/superstruct'; -import { UnsafeJsonStruct } from '@metamask/utils'; -import { isVatId } from '../types.js'; +import { + isVatId, + MessageStruct, + VatConfigStruct, + CapDataStruct, +} from '../types.js'; import type { VatId } from '../types.js'; type VatMessageId = `${VatId}:${number}`; const isVatMessageId = (value: unknown): value is VatMessageId => - typeof value === 'string' && - /^\w+:\d+$/u.test(value) && - isVatId(value.split(':')[0]); + value === 'none' || + (typeof value === 'string' && + /^\w+:\d+$/u.test(value) && + isVatId(value.split(':')[0])); export const VatTestCommandMethod = { evaluate: 'evaluate', @@ -27,8 +36,10 @@ export const VatTestCommandMethod = { export const VatCommandMethod = { ...VatTestCommandMethod, - capTpInit: 'capTpInit', - loadUserCode: 'loadUserCode', + initVat: 'initVat', + deliver: 'deliver', + // XXX due to the goofy way we define messages, the method and reply roles for `syscall` are swapped + syscall: 'syscall', } as const; const VatMessageIdStruct = refine(string(), 'VatMessageId', isVatMessageId); @@ -44,28 +55,166 @@ export const VatTestMethodStructs = { }), } as const; +const VatOneResolutionStruct = tuple([string(), boolean(), CapDataStruct]); + +const VatDelivery = { + message: 'message', + notify: 'notify', + dropExports: 'dropExports', + retireExports: 'retireExports', + retireImports: 'retireImports', + changeVatOptions: 'changeVatOptions', + startVat: 'startVat', + stopVat: 'stopVat', + bringOutYourDead: 'bringOutYourDead', +} as const; + +const VatDeliveryStructs = { + [VatDelivery.message]: tuple([ + literal(VatDelivery.message), + string(), + MessageStruct, + ]), + [VatDelivery.notify]: tuple([ + literal(VatDelivery.notify), + array(VatOneResolutionStruct), + ]), + [VatDelivery.dropExports]: tuple([ + literal(VatDelivery.dropExports), + array(string()), + ]), + [VatDelivery.retireExports]: tuple([ + literal(VatDelivery.retireExports), + array(string()), + ]), + [VatDelivery.retireImports]: tuple([ + literal(VatDelivery.retireImports), + array(string()), + ]), + [VatDelivery.changeVatOptions]: tuple([ + literal(VatDelivery.changeVatOptions), + record(string(), unknown()), + ]), + [VatDelivery.startVat]: tuple([literal(VatDelivery.startVat), CapDataStruct]), + [VatDelivery.stopVat]: tuple([literal(VatDelivery.stopVat), CapDataStruct]), + [VatDelivery.bringOutYourDead]: tuple([ + literal(VatDelivery.bringOutYourDead), + ]), +}; + +const VatDeliveryStruct = union([ + VatDeliveryStructs.message, + VatDeliveryStructs.notify, + VatDeliveryStructs.dropExports, + VatDeliveryStructs.retireExports, + VatDeliveryStructs.retireImports, + VatDeliveryStructs.changeVatOptions, + VatDeliveryStructs.startVat, + VatDeliveryStructs.stopVat, + VatDeliveryStructs.bringOutYourDead, +]); + +const VatSyscall = { + send: 'send', + subscribe: 'subscribe', + resolve: 'resolve', + exit: 'exit', + dropImports: 'dropImports', + retireImports: 'retireImports', + retireExports: 'retireExports', + abandonExports: 'abandonExports', + // These are bogus, but are needed to keep TypeScript happy + callNow: 'callNow', + vatstoreGet: 'vatstoreGet', + vatstoreGetNextKey: 'vatstoreGetNextKey', + vatstoreSet: 'vatstoreSet', + vatstoreDelete: 'vatstoreDelete', +} as const; + +const VatSyscallStructs = { + [VatSyscall.send]: tuple([literal(VatSyscall.send), string(), MessageStruct]), + [VatSyscall.subscribe]: tuple([literal(VatSyscall.subscribe), string()]), + [VatSyscall.resolve]: tuple([ + literal(VatSyscall.resolve), + array(VatOneResolutionStruct), + ]), + [VatSyscall.exit]: tuple([ + literal(VatSyscall.exit), + boolean(), + CapDataStruct, + ]), + [VatSyscall.dropImports]: tuple([ + literal(VatSyscall.dropImports), + array(string()), + ]), + [VatSyscall.retireImports]: tuple([ + literal(VatSyscall.retireImports), + array(string()), + ]), + [VatSyscall.retireExports]: tuple([ + literal(VatSyscall.retireExports), + array(string()), + ]), + [VatSyscall.abandonExports]: tuple([ + literal(VatSyscall.abandonExports), + array(string()), + ]), + // These are bogus, but are needed to keep TypeScript happy + [VatSyscall.callNow]: tuple([ + literal(VatSyscall.callNow), + string(), + string(), + CapDataStruct, + ]), + [VatSyscall.vatstoreGet]: tuple([literal(VatSyscall.vatstoreGet), string()]), + [VatSyscall.vatstoreGetNextKey]: tuple([ + literal(VatSyscall.vatstoreGetNextKey), + string(), + ]), + [VatSyscall.vatstoreSet]: tuple([ + literal(VatSyscall.vatstoreSet), + string(), + string(), + ]), + [VatSyscall.vatstoreDelete]: tuple([ + literal(VatSyscall.vatstoreDelete), + string(), + ]), +} as const; + +const VatSyscallStruct = union([ + VatSyscallStructs.send, + VatSyscallStructs.subscribe, + VatSyscallStructs.resolve, + VatSyscallStructs.exit, + VatSyscallStructs.dropImports, + VatSyscallStructs.retireImports, + VatSyscallStructs.retireExports, + VatSyscallStructs.abandonExports, + // These are bogus, but are needed to keep TypeScript happy + VatSyscallStructs.callNow, + VatSyscallStructs.vatstoreGet, + VatSyscallStructs.vatstoreGetNextKey, + VatSyscallStructs.vatstoreSet, + VatSyscallStructs.vatstoreDelete, +]); + export const VatMethodStructs = { ...VatTestMethodStructs, - [VatCommandMethod.capTpInit]: object({ - method: literal(VatCommandMethod.capTpInit), - params: literal(null), + [VatCommandMethod.initVat]: object({ + method: literal(VatCommandMethod.initVat), + params: VatConfigStruct, + }), + [VatCommandMethod.deliver]: object({ + method: literal(VatCommandMethod.deliver), + params: VatDeliveryStruct, }), - [VatCommandMethod.loadUserCode]: object({ - method: literal(VatCommandMethod.loadUserCode), - params: record(string(), UnsafeJsonStruct), + [VatCommandMethod.syscall]: object({ + method: literal(VatCommandMethod.syscall), + params: VatSyscallStruct, }), } as const; -const VatCommandStruct = object({ - id: VatMessageIdStruct, - payload: union([ - VatMethodStructs.evaluate, - VatMethodStructs.ping, - VatMethodStructs.capTpInit, - VatMethodStructs.loadUserCode, - ]), -}); - export type VatCommand = Infer; export const VatTestReplyStructs = { @@ -81,23 +230,39 @@ export const VatTestReplyStructs = { const VatReplyStructs = { ...VatTestReplyStructs, - [VatCommandMethod.capTpInit]: object({ - method: literal(VatCommandMethod.capTpInit), + [VatCommandMethod.initVat]: object({ + method: literal(VatCommandMethod.initVat), params: string(), }), - [VatCommandMethod.loadUserCode]: object({ - method: literal(VatCommandMethod.loadUserCode), - params: string(), + [VatCommandMethod.deliver]: object({ + method: literal(VatCommandMethod.deliver), + params: literal(null), + }), + [VatCommandMethod.syscall]: object({ + method: literal(VatCommandMethod.syscall), + params: array(string()), }), } as const; +const VatCommandStruct = object({ + id: VatMessageIdStruct, + payload: union([ + VatMethodStructs.evaluate, + VatMethodStructs.ping, + VatMethodStructs.initVat, + VatMethodStructs.deliver, + VatReplyStructs.syscall, // Note swapped call/reply role + ]), +}); + const VatCommandReplyStruct = object({ id: VatMessageIdStruct, payload: union([ VatReplyStructs.evaluate, VatReplyStructs.ping, - VatReplyStructs.capTpInit, - VatReplyStructs.loadUserCode, + VatReplyStructs.initVat, + VatReplyStructs.deliver, + VatMethodStructs.syscall, // Note swapped call/reply role ]), }); diff --git a/packages/kernel/src/store/kernel-store.test.ts b/packages/kernel/src/store/kernel-store.test.ts index 5c9ff150b..c16196db2 100644 --- a/packages/kernel/src/store/kernel-store.test.ts +++ b/packages/kernel/src/store/kernel-store.test.ts @@ -1,9 +1,11 @@ import { describe, it, expect, beforeEach } from 'vitest'; import { makeKernelStore } from './kernel-store.js'; -import type { KVStore } from './kernel-store.js'; +import type { KVStore } from './sqlite-kv-store.js'; import { makeMapKVStore } from '../../test/storage.js'; -import type { Message } from '../types.js'; +// XXX Once the packaging of liveslots is fixed this should be imported from there +import type { Message } from '../ag-types.js'; +import type { RunQueueItem } from '../types.js'; /** * Mock Message: A stupid TS hack to allow trivial use of plain strings as if they @@ -17,6 +19,18 @@ function mm(str: string): Message { return str as unknown as Message; } +/** + * Mock RunQueueItem: A stupid TS hack to allow trivial use of plain strings + * as if they were RunQueueItems, since, for testing purposes here, all + * that's necessary to be a "message" is to be stringifiable. + * + * @param str - A string. + * @returns The same string coerced to type RunQueueItem. + */ +function tm(str: string): RunQueueItem { + return str as unknown as RunQueueItem; +} + describe('kernel store', () => { let mockKVStore: KVStore; @@ -41,6 +55,8 @@ describe('kernel store', () => { const ks = makeKernelStore(mockKVStore); expect(Object.keys(ks).sort()).toStrictEqual([ 'addClistEntry', + 'addPromiseSubscriber', + 'allocateErefForKref', 'decRefCount', 'deleteKernelObject', 'deleteKernelPromise', @@ -57,11 +73,15 @@ describe('kernel store', () => { 'getOwner', 'getRefCount', 'incRefCount', + 'initEndpoint', 'initKernelObject', 'initKernelPromise', 'krefToEref', 'kv', 'reset', + 'resolveKernelPromise', + 'runQueueLength', + 'setPromiseDecider', ]); }); }); @@ -99,16 +119,14 @@ describe('kernel store', () => { it('manages kernel promises', () => { const ks = makeKernelStore(mockKVStore); const kp1 = { - decider: 'v23', state: 'unresolved', subscribers: [], }; const kp2 = { - decider: 'r47', state: 'unresolved', subscribers: [], }; - expect(ks.initKernelPromise('v23')).toStrictEqual(['kp1', kp1]); + expect(ks.initKernelPromise()).toStrictEqual(['kp1', kp1]); expect(ks.getRefCount('kp1')).toBe(1); expect(ks.incRefCount('kp1')).toBe(2); ks.incRefCount('kp1'); @@ -117,7 +135,7 @@ describe('kernel store', () => { ks.decRefCount('kp1'); ks.decRefCount('kp1'); expect(ks.getRefCount('kp1')).toBe(0); - expect(ks.initKernelPromise('r47')).toStrictEqual(['kp2', kp2]); + expect(ks.initKernelPromise()).toStrictEqual(['kp2', kp2]); expect(ks.getKernelPromise('kp1')).toStrictEqual(kp1); expect(ks.getKernelPromise('kp2')).toStrictEqual(kp2); ks.enqueuePromiseMessage('kp1', mm('first message to kp1')); @@ -144,37 +162,37 @@ describe('kernel store', () => { }); it('manages the run queue', () => { const ks = makeKernelStore(mockKVStore); - ks.enqueueRun(mm('first message')); - ks.enqueueRun(mm('second message')); + ks.enqueueRun(tm('first message')); + ks.enqueueRun(tm('second message')); expect(ks.dequeueRun()).toBe('first message'); - ks.enqueueRun(mm('third message')); + ks.enqueueRun(tm('third message')); expect(ks.dequeueRun()).toBe('second message'); expect(ks.dequeueRun()).toBe('third message'); expect(ks.dequeueRun()).toBeUndefined(); - ks.enqueueRun(mm('fourth message')); + ks.enqueueRun(tm('fourth message')); expect(ks.dequeueRun()).toBe('fourth message'); expect(ks.dequeueRun()).toBeUndefined(); }); it('manages clists', () => { const ks = makeKernelStore(mockKVStore); - ks.addClistEntry('v2', 'ko42', 'vo-63'); - ks.addClistEntry('v2', 'ko51', 'vo-74'); - ks.addClistEntry('v2', 'kp60', 'vp+85'); + ks.addClistEntry('v2', 'ko42', 'o-63'); + ks.addClistEntry('v2', 'ko51', 'o-74'); + ks.addClistEntry('v2', 'kp60', 'p+85'); ks.addClistEntry('r7', 'ko42', 'ro+11'); ks.addClistEntry('r7', 'kp61', 'rp-99'); - expect(ks.krefToEref('v2', 'ko42')).toBe('vo-63'); - expect(ks.erefToKref('v2', 'vo-63')).toBe('ko42'); - expect(ks.krefToEref('v2', 'ko51')).toBe('vo-74'); - expect(ks.erefToKref('v2', 'vo-74')).toBe('ko51'); - expect(ks.krefToEref('v2', 'kp60')).toBe('vp+85'); - expect(ks.erefToKref('v2', 'vp+85')).toBe('kp60'); + expect(ks.krefToEref('v2', 'ko42')).toBe('o-63'); + expect(ks.erefToKref('v2', 'o-63')).toBe('ko42'); + expect(ks.krefToEref('v2', 'ko51')).toBe('o-74'); + expect(ks.erefToKref('v2', 'o-74')).toBe('ko51'); + expect(ks.krefToEref('v2', 'kp60')).toBe('p+85'); + expect(ks.erefToKref('v2', 'p+85')).toBe('kp60'); expect(ks.krefToEref('r7', 'ko42')).toBe('ro+11'); expect(ks.erefToKref('r7', 'ro+11')).toBe('ko42'); expect(ks.krefToEref('r7', 'kp61')).toBe('rp-99'); expect(ks.erefToKref('r7', 'rp-99')).toBe('kp61'); ks.forgetKref('v2', 'ko42'); expect(ks.krefToEref('v2', 'ko42')).toBeUndefined(); - expect(ks.erefToKref('v2', 'vo-63')).toBeUndefined(); + expect(ks.erefToKref('v2', 'o-63')).toBeUndefined(); ks.forgetEref('r7', 'rp-99'); expect(ks.krefToEref('r7', 'kp61')).toBeUndefined(); expect(ks.erefToKref('r7', 'rp-99')).toBeUndefined(); @@ -182,15 +200,15 @@ describe('kernel store', () => { }); describe('reset', () => { - it('truncates store and resets counters', () => { + it('clears store and resets counters', () => { const ks = makeKernelStore(mockKVStore); ks.getNextVatId(); ks.getNextVatId(); ks.getNextRemoteId(); const koId = ks.initKernelObject('v1'); - const [kpId] = ks.initKernelPromise('v1'); - ks.addClistEntry('v1', koId, 'vo-1'); - ks.enqueueRun(mm('test message')); + const [kpId] = ks.initKernelPromise(); + ks.addClistEntry('v1', koId, 'o-1'); + ks.enqueueRun(tm('test message')); ks.reset(); expect(ks.getNextVatId()).toBe('v1'); expect(ks.getNextRemoteId()).toBe('r1'); diff --git a/packages/kernel/src/store/kernel-store.ts b/packages/kernel/src/store/kernel-store.ts index 4dcdd0522..aee9cd0ed 100644 --- a/packages/kernel/src/store/kernel-store.ts +++ b/packages/kernel/src/store/kernel-store.ts @@ -13,8 +13,8 @@ * ${roid} ::= ro${dir}${NN} // remote object ID * ${rpid} ::= rp${dir}${NN} // remote promise ID * ${rref} ::= ${roid} | ${rpid} // remote reference - * ${void} ::= vo${dir}${NN} // vat object ID - * ${vpid} ::= vp${dir}${NN} // vat promise ID + * ${void} ::= o${dir}${NN} // vat object ID + * ${vpid} ::= p${dir}${NN} // vat promise ID * ${vref} ::= ${void} | ${vpid} // vat reference * ${eref} ::= ${vref} | ${rref} // external reference * ${vatid} ::= v${NN} // vat ID @@ -42,20 +42,29 @@ * cle.${endpointId}.${eref} = ${kref} // ERef->KRef mapping * clk.${endpointId}.${kref} = ${eref} // KRef->ERef mapping * + * Vat bookkeeping + * e.nextObjectId.${endid} = NN // allocation counter for imported object ERefs + * e.nextPromiseId.${endid} = NN // allocation counter for imported promise ERefs + * * Kernel bookkeeping - * nextVatId = NN - * nextRemoteId = NN - * nextObjectId = NN - * nextPromiseId = NN + * nextVatId = NN // allocation counter for vat IDs + * nextRemoteId = NN // allocation counter for remote IDs + * k.nextObjectId = NN // allocation counter for object KRefs + * k.nextPromiseId = NN // allocation counter for promise KRefs */ +import type { CapData } from '@endo/marshal'; + +import type { KVStore } from './sqlite-kv-store.js'; +// XXX Once the packaging of liveslots is fixed this should be imported from there +import type { Message } from '../ag-types.js'; import type { VatId, RemoteId, EndpointId, KRef, ERef, - Message, + RunQueueItem, PromiseState, KernelPromise, } from '../types.js'; @@ -66,21 +75,81 @@ type StoredValue = { delete(): void; }; -type StoredMessageQueue = { - enqueue(message: Message): void; - dequeue(): Message | undefined; +type StoredQueue = { + enqueue(item: object): void; + dequeue(): object | undefined; delete(): void; }; -export type KVStore = { - get(key: string): string | undefined; - getRequired(key: string): string; - set(key: string, value: string): void; - delete(key: string): void; - truncate(): void; - executeQuery(sql: string): Record[]; +type RefParts = { + context: 'kernel' | 'vat' | 'remote'; + direction?: 'export' | 'import'; + isPromise: boolean; + index: string; }; +/** + * Test if a KRef designates a promise. + * + * @param kref - The KRef to test. + * + * @returns true iff the given KRef references a promise. + */ +export function isPromiseRef(kref: KRef): boolean { + return kref[1] === 'p'; +} + +/** + * Parse an alleged ref string into its components. + * + * @param ref - The string to be parsed. + * + * @returns an object with all of the ref string components as individual properties. + */ +export function parseRef(ref: string): RefParts { + let context; + let typeIdx = 1; + + switch (ref[0]) { + case 'k': + context = 'kernel'; + break; + case 'o': + case 'p': + typeIdx = 0; + context = 'vat'; + break; + case 'r': + context = 'remote'; + break; + case undefined: + default: + throw Error(`invalid reference context ${ref[0]}`); + } + if (ref[typeIdx] !== 'p' && ref[typeIdx] !== 'o') { + throw Error(`invalid reference type ${ref[typeIdx]}`); + } + const isPromise = ref[typeIdx] === 'p'; + let direction; + let index; + if (context === 'remote') { + index = ref.slice(2); + } else { + const dirIdx = typeIdx + 1; + if (ref[dirIdx] !== '+' && ref[dirIdx] !== '-') { + throw Error(`invalide reference direction ${ref[dirIdx]}`); + } + direction = ref[dirIdx] === '+' ? 'export' : 'import'; + index = ref.slice(dirIdx + 1); + } + return { + context, + direction, + isPromise, + index, + } as RefParts; +} + /** * Create a new KernelStore object wrapped around a simple string-to-string * key/value store. The resulting object provides a variety of operations for @@ -100,7 +169,7 @@ export function makeKernelStore(kv: KVStore) { // Initialize core state /** The kernel's run queue. */ - let runQueue = createStoredMessageQueue('run', true); + let runQueue = createStoredQueue('run', true); /** Counter for allocating VatIDs */ let nextVatId = provideCachedStoredValue('nextVatId', '1'); /** Counter for allocating RemoteIDs */ @@ -182,24 +251,41 @@ export function makeKernelStore(kv: KVStore) { } /** - * Create a new (empty) persistently stored message queue. + * Create a new (empty) persistently stored queue. * * @param queueName - The name for the queue (must be unique among queues). * @param cached - Optional flag: set to true if the queue should cache its * @returns An object for interacting with the new queue. */ - function createStoredMessageQueue( + function createStoredQueue( queueName: string, cached: boolean = false, - ): StoredMessageQueue { + ): StoredQueue { const qk = `queue.${queueName}`; kv.set(`${qk}.head`, '1'); kv.set(`${qk}.tail`, '1'); - return provideStoredMessageQueue(queueName, cached); + return provideStoredQueue(queueName, cached); } /** - * Produce an object to access a persistently stored message queue. + * Find out how long some queue is. + * + * @param queueName - The name of the queue of interest. + * + * @returns the number of items in the given queue. + */ + function getQueueLength(queueName: string): number { + const qk = `queue.${queueName}`; + const head = kv.get(`${qk}.head`); + const tail = kv.get(`${qk}.tail`); + if (head === undefined || tail === undefined) { + throw Error(`unknown queue ${queueName}`); + } + return Number(head) - Number(tail); + } + + /** + * Produce an object to access a persistently stored queue. * * @param queueName - The name for the queue (must be unique among queues). * @param cached - Optional flag: set to true if the queue should cache its @@ -207,12 +293,12 @@ export function makeKernelStore(kv: KVStore) { * checked frequently). * @returns An object for interacting with the queue. */ - function provideStoredMessageQueue( + function provideStoredQueue( queueName: string, cached: boolean = false, - ): StoredMessageQueue { + ): StoredQueue { const qk = `queue.${queueName}`; - // Note: cached=true ==> caches only the head & tail indices, NOT the messages themselves + // Note: cached=true ==> caches only the head & tail indices, NOT the queue entries themselves const provideValue = cached ? provideCachedStoredValue : provideRawStoredValue; @@ -222,14 +308,14 @@ export function makeKernelStore(kv: KVStore) { throw Error(`queue ${queueName} not initialized`); } return { - enqueue(message: Message): void { + enqueue(item: object): void { if (head.get() === undefined) { throw Error(`enqueue into deleted queue ${queueName}`); } const entryPos = incCounter(head); - kv.set(`${qk}.${entryPos}`, JSON.stringify(message)); + kv.set(`${qk}.${entryPos}`, JSON.stringify(item)); }, - dequeue(): Message | undefined { + dequeue(): object | undefined { const headPos = head.get(); if (headPos === undefined) { return undefined; @@ -239,7 +325,7 @@ export function makeKernelStore(kv: KVStore) { const entry = kv.getRequired(`${qk}.${tailPos}`); kv.delete(`${qk}.${tailPos}`); incCounter(tail); - return JSON.parse(entry) as Message; + return JSON.parse(entry) as object; } return undefined; }, @@ -263,7 +349,7 @@ export function makeKernelStore(kv: KVStore) { * * @param message - The message to enqueue. */ - function enqueueRun(message: Message): void { + function enqueueRun(message: RunQueueItem): void { runQueue.enqueue(message); } @@ -273,8 +359,17 @@ export function makeKernelStore(kv: KVStore) { * @returns The next message on the run queue, or undefined if the queue is * empty. */ - function dequeueRun(): Message | undefined { - return runQueue.dequeue(); + function dequeueRun(): RunQueueItem | undefined { + return runQueue.dequeue() as RunQueueItem | undefined; + } + + /** + * Obtain the number of entries in the run queue. + * + * @returns the number of items in the run queue. + */ + function runQueueLength(): number { + return getQueueLength('run'); } /** @@ -295,6 +390,43 @@ export function makeKernelStore(kv: KVStore) { return `r${incCounter(nextRemoteId)}`; } + /** + * Initialize persistent state for a new endpoint. + * + * @param endpointId - The ID of the endpoint being added. + */ + function initEndpoint(endpointId: EndpointId): void { + kv.set(`e.nextPromiseId.${endpointId}`, '1'); + kv.set(`e.nextObjectId.${endpointId}`, '1'); + } + + /** + * Generate a new eref for a kernel object or promise being imported into an + * endpoint. + * + * @param endpointId - The endpoint the kref is being imported into. + * @param kref - The kref for the kernel object or promise in question. + * + * @returns A new eref in the scope of the given endpoint for the given kernel entity. + */ + function allocateErefForKref(endpointId: EndpointId, kref: KRef): ERef { + let id; + const refTag = endpointId.startsWith('v') ? '' : endpointId[0]; + let refType; + if (isPromiseRef(kref)) { + id = kv.get(`e.nextPromiseId.${endpointId}`); + kv.set(`e.nextPromiseId.${endpointId}`, `${Number(id) + 1}`); + refType = 'p'; + } else { + id = kv.get(`e.nextObjectId.${endpointId}`); + kv.set(`e.nextObjectId.${endpointId}`, `${Number(id) + 1}`); + refType = 'o'; + } + const eref = `${refTag}${refType}-${id}` as ERef; + addClistEntry(endpointId, kref, eref); + return eref; + } + /** * Obtain a KRef for the next unallocated kernel object. * @@ -392,7 +524,7 @@ export function makeKernelStore(kv: KVStore) { /** * Obtain a KRef for the next unallocated kernel promise. * - * @returns The next kpId use. + * @returns The next kpid use. */ function getNextPromiseId(): KRef { return `kp${incCounter(nextPromiseId)}`; @@ -403,63 +535,89 @@ export function makeKernelStore(kv: KVStore) { * a reference count of 1 on the assumption that the promise has just been * imported from somewhere. * - * @param decider - The endpoint that is the decider for the new promise. * @returns A tuple of the new promise's KRef and an object describing the * new promise itself. */ - function initKernelPromise(decider: EndpointId): [KRef, KernelPromise] { + function initKernelPromise(): [KRef, KernelPromise] { const kpr: KernelPromise = { - decider, state: 'unresolved', subscribers: [], }; - const kpId = getNextPromiseId(); - createStoredMessageQueue(kpId, false); - kv.set(`${kpId}.decider`, decider); - kv.set(`${kpId}.state`, 'unresolved'); - kv.set(`${kpId}.subscribers`, '[]'); - kv.set(refCountKey(kpId), '1'); - return [kpId, kpr]; + const kpid = getNextPromiseId(); + createStoredQueue(kpid, false); + kv.set(`${kpid}.state`, 'unresolved'); + kv.set(`${kpid}.subscribers`, '[]'); + kv.set(refCountKey(kpid), '1'); + return [kpid, kpr]; } /** * Append a message to a promise's message queue. * - * @param kpId - The KRef of the promise to enqueue on. + * @param kpid - The KRef of the promise to enqueue on. * @param message - The message to enqueue. */ - function enqueuePromiseMessage(kpId: KRef, message: Message): void { - provideStoredMessageQueue(kpId, false).enqueue(message); + function enqueuePromiseMessage(kpid: KRef, message: Message): void { + provideStoredQueue(kpid, false).enqueue(message); + } + + /** + * Add a new subscriber to a kernel promise's collection of subscribers. + * + * @param vatId - The vat that is subscribing. + * @param kpid - The KRef of the promise being subscribed to. + */ + function addPromiseSubscriber(vatId: VatId, kpid: KRef): void { + const key = `${kpid}.subscribers`; + const subscribersRaw = kv.getRequired(key); + const subscribers = JSON.parse(subscribersRaw); + const tempSet = new Set(subscribers); + tempSet.add(vatId); + const newSubscribers = Array.from(tempSet).sort(); + kv.set(key, JSON.stringify(newSubscribers)); + } + + /** + * Assign a kernel promise's decider. + * + * @param kpid - The KRef of promise whose decider is being set. + * @param vatId - The vat which will become the decider. + */ + function setPromiseDecider(kpid: KRef, vatId: VatId): void { + if (kpid) { + kv.set(`${kpid}.decider`, vatId); + } } /** * Fetch the descriptive record for a kernel promise. * - * @param kpId - The KRef of the kernel promise of interest. + * @param kpid - The KRef of the kernel promise of interest. * @returns An object describing the requested kernel promise. */ - function getKernelPromise(kpId: KRef): KernelPromise { - const state = kv.get(`${kpId}.state`) as PromiseState; + function getKernelPromise(kpid: KRef): KernelPromise { + const state = kv.get(`${kpid}.state`) as PromiseState; if (state === undefined) { - throw Error(`unknown kernel promise ${kpId}`); + throw Error(`unknown kernel promise ${kpid}`); } const result: KernelPromise = { state }; switch (state as string) { case 'unresolved': { - const decider = kv.get(`${kpId}.decider`); + const decider = kv.get(`${kpid}.decider`); if (decider !== '' && decider !== undefined) { result.decider = decider as EndpointId; } - result.subscribers = JSON.parse(kv.getRequired(`${kpId}.subscribers`)); + const subscribers = kv.getRequired(`${kpid}.subscribers`); + result.subscribers = JSON.parse(subscribers); break; } case 'fulfilled': case 'rejected': { - result.value = JSON.parse(kv.getRequired(`${kpId}.value`)); + result.value = JSON.parse(kv.getRequired(`${kpid}.value`)); break; } default: - throw Error(`unknown state for ${kpId}: ${state}`); + throw Error(`unknown state for ${kpid}: ${state}`); } return result; } @@ -467,14 +625,14 @@ export function makeKernelStore(kv: KVStore) { /** * Fetch the messages in a kernel promise's message queue. * - * @param kpId - The KRef of the kernel promise of interest. + * @param kpid - The KRef of the kernel promise of interest. * @returns An array of all the messages in the given promise's message queue. */ - function getKernelPromiseMessageQueue(kpId: KRef): Message[] { + function getKernelPromiseMessageQueue(kpid: KRef): Message[] { const result: Message[] = []; - const queue = provideStoredMessageQueue(kpId, false); + const queue = provideStoredQueue(kpid, false); for (;;) { - const message = queue.dequeue(); + const message = queue.dequeue() as Message; if (message) { result.push(message); } else { @@ -483,18 +641,40 @@ export function makeKernelStore(kv: KVStore) { } } + /** + * Record the resolution of a kernel promise. + * + * @param kpid - The ref of the promise being resolved. + * @param rejected - True if the promise is being rejected, false if fulfilled. + * @param value - The value the promise is being fulfilled to or rejected with. + */ + function resolveKernelPromise( + kpid: KRef, + rejected: boolean, + value: CapData, + ): void { + const queue = provideStoredQueue(kpid, false); + for (const message of getKernelPromiseMessageQueue(kpid)) { + queue.enqueue(message); + } + kv.set(`${kpid}.state`, rejected ? 'rejected' : 'fulfilled'); + kv.set(`${kpid}.value`, JSON.stringify(value)); + kv.delete(`${kpid}.decider`); + kv.delete(`${kpid}.subscribers`); + } + /** * Expunge a kernel promise from the kernel's persistent state. * - * @param kpId - The KRef of the kernel promise to delete. + * @param kpid - The KRef of the kernel promise to delete. */ - function deleteKernelPromise(kpId: KRef): void { - kv.delete(`${kpId}.state`); - kv.delete(`${kpId}.decider`); - kv.delete(`${kpId}.subscribers`); - kv.delete(`${kpId}.value`); - kv.delete(refCountKey(kpId)); - provideStoredMessageQueue(kpId).delete(); + function deleteKernelPromise(kpid: KRef): void { + kv.delete(`${kpid}.state`); + kv.delete(`${kpid}.decider`); + kv.delete(`${kpid}.subscribers`); + kv.delete(`${kpid}.value`); + kv.delete(refCountKey(kpid)); + provideStoredQueue(kpid).delete(); } /** @@ -578,11 +758,11 @@ export function makeKernelStore(kv: KVStore) { } /** - * Truncate the kernel's persistent state and reset all counters. + * Clear the kernel's persistent state and reset all counters. */ function reset(): void { - kv.truncate(); - runQueue = createStoredMessageQueue('run', true); + kv.clear(); + runQueue = createStoredQueue('run', true); nextVatId = provideCachedStoredValue('nextVatId', '1'); nextRemoteId = provideCachedStoredValue('nextRemoteId', '1'); nextObjectId = provideCachedStoredValue('nextObjectId', '1'); @@ -592,8 +772,10 @@ export function makeKernelStore(kv: KVStore) { return harden({ enqueueRun, dequeueRun, + runQueueLength, getNextVatId, getNextRemoteId, + initEndpoint, getRefCount, incRefCount, decRefCount, @@ -603,9 +785,13 @@ export function makeKernelStore(kv: KVStore) { initKernelPromise, getKernelPromise, enqueuePromiseMessage, + setPromiseDecider, getKernelPromiseMessageQueue, + resolveKernelPromise, deleteKernelPromise, + addPromiseSubscriber, erefToKref, + allocateErefForKref, krefToEref, addClistEntry, forgetEref, diff --git a/packages/extension/src/kernel-integration/sqlite-kv-store.ts b/packages/kernel/src/store/sqlite-kv-store.ts similarity index 59% rename from packages/extension/src/kernel-integration/sqlite-kv-store.ts rename to packages/kernel/src/store/sqlite-kv-store.ts index f68762976..a055c24a7 100644 --- a/packages/extension/src/kernel-integration/sqlite-kv-store.ts +++ b/packages/kernel/src/store/sqlite-kv-store.ts @@ -1,33 +1,47 @@ -import type { KVStore } from '@ocap/kernel'; import { makeLogger } from '@ocap/utils'; import type { Database } from '@sqlite.org/sqlite-wasm'; import sqlite3InitModule from '@sqlite.org/sqlite-wasm'; +export type KVStore = { + get(key: string): string | undefined; + getRequired(key: string): string; + getNextKey(previousKey: string): string | undefined; + set(key: string, value: string): void; + delete(key: string): void; + clear(): void; + executeQuery(sql: string): Record[]; +}; + /** * Ensure that SQLite is initialized. * + * @param beEphemeral - If true, create an ephemeral (in memory) database. * @returns The SQLite database object. */ -async function initDB(): Promise { +async function initDB(beEphemeral: boolean): Promise { const sqlite3 = await sqlite3InitModule(); - if (sqlite3.oo1.OpfsDb) { - return new sqlite3.oo1.OpfsDb('/testdb.sqlite', 'cw'); + if (!beEphemeral) { + if (sqlite3.oo1.OpfsDb) { + return new sqlite3.oo1.OpfsDb('/testdb.sqlite', 'cw'); + } + console.warn(`OPFS not enabled, database will be ephemeral`); } - console.warn(`OPFS not enabled, database will be ephemeral`); - return new sqlite3.oo1.DB('/testdb.sqlite', 'cw'); + return new sqlite3.oo1.DB(':memory:', 'cw'); } /** * Makes a {@link KVStore} for low-level persistent storage. * * @param label - A logger prefix label. Defaults to '[sqlite]'. - * @returns The key/value store to base the kernel store on. + * @param beEphemeral - If true, create an ephemeral (in memory) database. + * @returns A key/value store to base higher level stores on. */ export async function makeSQLKVStore( label: string = '[sqlite]', + beEphemeral: boolean = false, ): Promise { const logger = makeLogger(label); - const db = await initDB(); + const db = await initDB(beEphemeral); db.exec(` CREATE TABLE IF NOT EXISTS kv ( @@ -56,19 +70,48 @@ export async function makeSQLKVStore( const result = sqlKVGet.getString(0); if (result) { sqlKVGet.reset(); - logger.debug(`kernel get '${key}' as '${result}'`); + logger.debug(`kv get '${key}' as '${result}'`); return result; } } sqlKVGet.reset(); if (required) { - throw Error(`no record matching key '${key}'`); + throw Error(`[${label}] no record matching key '${key}'`); } else { // Sometimes, we really lean on TypeScript's unsoundness return undefined as unknown as string; } } + const sqlKVGetNextKey = db.prepare(` + SELECT key + FROM kv + WHERE key > ? + LIMIT 1 + `); + + /** + * Get the lexicographically next key in the KV store after a given key. + * + * @param previousKey - The key you want to know the key after. + * + * @returns The key after `previousKey`, or undefined if `previousKey` is the + * last key in the store. + */ + function kvGetNextKey(previousKey: string): string | undefined { + sqlKVGetNextKey.bind([previousKey]); + if (sqlKVGetNextKey.step()) { + const result = sqlKVGetNextKey.getString(0); + if (result) { + sqlKVGetNextKey.reset(); + logger.debug(`kv getNextKey '${previousKey}' as '${result}'`); + return result; + } + } + sqlKVGetNextKey.reset(); + return undefined; + } + const sqlKVSet = db.prepare(` INSERT INTO kv (key, value) VALUES (?, ?) @@ -82,7 +125,7 @@ export async function makeSQLKVStore( * @param value - The value to assign to it. */ function kvSet(key: string, value: string): void { - logger.debug(`kernel set '${key}' to '${value}'`); + logger.debug(`kv set '${key}' to '${value}'`); sqlKVSet.bind([key, value]); sqlKVSet.step(); sqlKVSet.reset(); @@ -99,23 +142,23 @@ export async function makeSQLKVStore( * @param key - The key to remove. */ function kvDelete(key: string): void { - logger.debug(`kernel delete '${key}'`); + logger.debug(`kv delete '${key}'`); sqlKVDelete.bind([key]); sqlKVDelete.step(); sqlKVDelete.reset(); } - const sqlKVTruncate = db.prepare(` + const sqlKVClear = db.prepare(` DELETE FROM kv `); /** * Delete all entries from the database. */ - function kvTruncate(): void { + function kvClear(): void { logger.log('clearing all kernel state'); - sqlKVTruncate.step(); - sqlKVTruncate.reset(); + sqlKVClear.step(); + sqlKVClear.reset(); } /** @@ -134,7 +177,7 @@ export async function makeSQLKVStore( for (let i = 0; i < columnCount; i++) { const columnName = stmt.getColumnName(i); if (columnName) { - row[columnName] = String(stmt.get(i)); + row[columnName] = String(stmt.get(i) as string); } } results.push(row); @@ -147,10 +190,11 @@ export async function makeSQLKVStore( return { get: (key) => kvGet(key, false), + getNextKey: kvGetNextKey, getRequired: (key) => kvGet(key, true), set: kvSet, delete: kvDelete, - truncate: kvTruncate, + clear: kvClear, executeQuery, }; } diff --git a/packages/kernel/src/store/vat-state-service.test.ts b/packages/kernel/src/store/vat-state-service.test.ts deleted file mode 100644 index 74fe39de3..000000000 --- a/packages/kernel/src/store/vat-state-service.test.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { describe, it, expect, beforeEach } from 'vitest'; - -import { VatStateService } from './vat-state-service.js'; -import type { VatId, VatConfig } from '../types.js'; - -describe('VatStateService', () => { - let vatStateService: VatStateService; - const mockVatId: VatId = 'v1'; - const mockVatConfig: VatConfig = { sourceSpec: 'test-vat.js' }; - const mockVatState = { config: mockVatConfig }; - - beforeEach(() => { - vatStateService = new VatStateService(); - }); - - describe('set', () => { - it('should store valid vat state', () => { - vatStateService.set(mockVatId, mockVatState); - expect(vatStateService.get(mockVatId)).toStrictEqual(mockVatState); - }); - - it('should overwrite existing state', () => { - const newState = { config: { sourceSpec: 'new.js' } }; - vatStateService.set(mockVatId, mockVatState); - vatStateService.set(mockVatId, newState); - expect(vatStateService.get(mockVatId)).toStrictEqual(newState); - }); - }); - - describe('get', () => { - it('should return undefined for non-existent vat', () => { - expect(vatStateService.get('v999')).toBeUndefined(); - }); - - it('should return correct state for existing vat', () => { - vatStateService.set(mockVatId, mockVatState); - expect(vatStateService.get(mockVatId)).toStrictEqual(mockVatState); - }); - }); - - describe('delete', () => { - it('should return true when deleting existing state', () => { - vatStateService.set(mockVatId, mockVatState); - expect(vatStateService.delete(mockVatId)).toBe(true); - expect(vatStateService.get(mockVatId)).toBeUndefined(); - }); - - it('should return false when deleting non-existent state', () => { - expect(vatStateService.delete('v999')).toBe(false); - }); - }); - - describe('has', () => { - it('should return true for existing vat', () => { - vatStateService.set(mockVatId, mockVatState); - expect(vatStateService.has(mockVatId)).toBe(true); - }); - - it('should return false for non-existent vat', () => { - expect(vatStateService.has('v999')).toBe(false); - }); - }); - - describe('vatIds', () => { - it('should return all vat IDs', () => { - vatStateService.set('v1', mockVatState); - vatStateService.set('v2', mockVatState); - expect(vatStateService.vatIds).toStrictEqual(['v1', 'v2']); - }); - - it('should return empty array when no states exist', () => { - expect(vatStateService.vatIds).toStrictEqual([]); - }); - }); - - describe('size', () => { - it('should return correct number of stored states', () => { - expect(vatStateService.size).toBe(0); - vatStateService.set('v1', mockVatState); - expect(vatStateService.size).toBe(1); - vatStateService.set('v2', mockVatState); - expect(vatStateService.size).toBe(2); - vatStateService.delete('v1'); - expect(vatStateService.size).toBe(1); - }); - }); -}); diff --git a/packages/kernel/src/store/vat-state-service.ts b/packages/kernel/src/store/vat-state-service.ts deleted file mode 100644 index d9b908d7d..000000000 --- a/packages/kernel/src/store/vat-state-service.ts +++ /dev/null @@ -1,72 +0,0 @@ -import type { VatId, VatConfig } from '../types.js'; - -export type VatState = { - config: VatConfig; -}; - -export class VatStateService { - readonly #states: Map; - - constructor() { - this.#states = new Map(); - } - - /** - * Set the state for a vat. - * - * @param vatId - The ID of the vat. - * @param state - The state to set. - * @throws {Error} If state is invalid. - */ - set(vatId: VatId, state: VatState): void { - this.#states.set(vatId, state); - } - - /** - * Get the state of a vat. - * - * @param vatId - The ID of the vat. - * @returns The vat state, or undefined if not found. - */ - get(vatId: VatId): VatState | undefined { - return this.#states.get(vatId); - } - - /** - * Delete the state of a vat. - * - * @param vatId - The ID of the vat. - * @returns true if state was deleted, false if it didn't exist. - */ - delete(vatId: VatId): boolean { - return this.#states.delete(vatId); - } - - /** - * Check if a vat has state stored. - * - * @param vatId - The ID of the vat. - * @returns true if state exists for the vat. - */ - has(vatId: VatId): boolean { - return this.#states.has(vatId); - } - - /** - * Get all vat IDs with stored state. - * - * @returns Array of vat IDs. - */ - get vatIds(): VatId[] { - return Array.from(this.#states.keys()); - } - - /** - * Get number of vats with stored state. - * - * @returns Number of vats. - */ - get size(): number { - return this.#states.size; - } -} diff --git a/packages/kernel/src/syscall.ts b/packages/kernel/src/syscall.ts new file mode 100644 index 000000000..427d0fe31 --- /dev/null +++ b/packages/kernel/src/syscall.ts @@ -0,0 +1,99 @@ +import { + insistVatSyscallObject, + insistVatSyscallResult, +} from '@agoric/swingset-liveslots'; +import type { CapData } from '@endo/marshal'; +// XXX Reenable the following once the packaging of liveslots is fixed (and at +// the same time remove the below import of ./ag-types-index.js) +// import type { VatSyscallObject, VatOneResolution } from '@agoric/swingset-liveslots'; + +import type { + VatSyscallObject, + VatOneResolution, + SwingSetCapData, +} from './ag-types-index.js'; +import type { KVStore } from './store/sqlite-kv-store.js'; +import type { VatSupervisor } from './VatSupervisor.ts'; + +export type SyscallResult = SwingSetCapData | string | string[] | null; + +/** + * This returns a function that is provided to liveslots as the 'syscall' + * argument: an object with one method per syscall type. These methods return + * data, or nothing. If the kernel experiences a problem executing the syscall, + * the method will throw, or the kernel will kill the vat, or both. + * + * I should be given a `syscallToManager` function that accepts a + * VatSyscallObject and (synchronously) returns a VatSyscallResult. + * + * @param supervisor - The VatSupervisor for which we're providing syscall services. + * @param kv - A key/value store for holding the vat's persistent state. + * + * @returns a syscall function suitable for use by liveslots. + */ +// eslint-disable-next-line @typescript-eslint/explicit-function-return-type +function makeSupervisorSyscall(supervisor: VatSupervisor, kv: KVStore) { + /** + * Actually perform the syscall operation. + * + * @param vso - A descriptor for the syscall to be performed. + * @returns the result from performing the syscall. + */ + function doSyscall(vso: VatSyscallObject): SyscallResult { + insistVatSyscallObject(vso); + let syscallResult; + try { + syscallResult = supervisor.executeSyscall(vso); + } catch (problem) { + console.warn(`supervisor got error during syscall:`, problem); + throw problem; + } + const vsr = syscallResult; + insistVatSyscallResult(vsr); + const [type, ...rest] = vsr; + switch (type) { + case 'ok': { + const [data] = rest; + return data; + } + case 'error': { + const [problem] = rest; + throw Error(`syscall.${vso[0]} failed: ${problem as string}`); + } + default: + throw Error(`unknown result type ${type as string}`); + } + } + + // this will be given to liveslots, it should have distinct methods that + // return immediate results or throw errors + const syscallForVat = { + send: (target: string, methargs: CapData, result?: string) => + doSyscall(['send', target, { methargs, result }]), + subscribe: (vpid: string) => doSyscall(['subscribe', vpid]), + resolve: (resolutions: VatOneResolution[]) => + doSyscall(['resolve', resolutions]), + exit: (isFailure: boolean, info: CapData) => + doSyscall(['exit', isFailure, info]), + dropImports: (vrefs: string[]) => doSyscall(['dropImports', vrefs]), + retireImports: (vrefs: string[]) => doSyscall(['retireImports', vrefs]), + retireExports: (vrefs: string[]) => doSyscall(['retireExports', vrefs]), + abandonExports: (vrefs: string[]) => doSyscall(['abandonExports', vrefs]), + + callNow: (_target: string, _method: string, _args: unknown[]) => { + throw Error(`callNow not supported (we have no devices)`); + }, + + vatstoreGet: (key: string) => kv.get(key), + vatstoreGetNextKey: (priorKey: string) => kv.getNextKey(priorKey), + vatstoreSet: (key: string, value: string) => kv.set(key, value), + vatstoreDelete: (key: string) => kv.delete(key), + }; + + return harden(syscallForVat); +} + +harden(makeSupervisorSyscall); +export { makeSupervisorSyscall }; + +export type Syscall = ReturnType; diff --git a/packages/kernel/src/types.ts b/packages/kernel/src/types.ts index dadb0826f..1824368bd 100644 --- a/packages/kernel/src/types.ts +++ b/packages/kernel/src/types.ts @@ -1,3 +1,4 @@ +import type { CapData } from '@endo/marshal'; import type { PromiseKit } from '@endo/promise-kit'; import { define, @@ -6,12 +7,17 @@ import { object, optional, string, + array, union, + literal, } from '@metamask/superstruct'; import type { Json } from '@metamask/utils'; import { UnsafeJsonStruct } from '@metamask/utils'; import type { StreamMultiplexer } from '@ocap/streams'; +// XXX Once the packaging of liveslots is fixed, this should be imported from there +import type { Message } from './ag-types.js'; + export type VatId = `v${string}`; export type RemoteId = `r${string}`; export type EndpointId = VatId | RemoteId; @@ -22,21 +28,80 @@ type InnerKRef = `${RefTypeTag}${string}`; type InnerERef = `${RefTypeTag}${RefDirectionTag}${string}`; export type KRef = `k${InnerKRef}`; -export type VRef = `v${InnerERef}`; +export type VRef = `${InnerERef}`; export type RRef = `r${InnerERef}`; export type ERef = VRef | RRef; +export type Ref = KRef | ERef; + +export const ROOT_OBJECT_VREF: VRef = 'o+0'; -type CapData = { - body: string; - slots: string[]; +export const CapDataStruct = object({ + body: string(), + slots: array(string()), +}); + +export type RunQueueItemSend = { + type: 'send'; + target: KRef; + message: Message; }; -export type Message = { - target: ERef | KRef; - method: string; - params: CapData; +export type RunQueueItemNotify = { + type: 'notify'; + vatId: VatId; + kpid: KRef; +}; + +export type RunQueueItem = RunQueueItemSend | RunQueueItemNotify; + +export const MessageStruct = object({ + methargs: CapDataStruct, + result: union([string(), literal(undefined), literal(null)]), +}); + +const RunQueueItemType = { + send: 'send', + notify: 'notify', + dropExports: 'dropExports', + retireExports: 'retireExports', + retireImports: 'retireImports', + bringOutYourDead: 'bringOutYourDead', +} as const; + +const RunQueueItemStructs = { + [RunQueueItemType.send]: object({ + type: literal(RunQueueItemType.send), + target: string(), + message: MessageStruct, + }), + [RunQueueItemType.notify]: object({ + type: literal(RunQueueItemType.notify), + vatId: string(), + kpid: string(), + }), + [RunQueueItemType.dropExports]: object({ + type: literal(RunQueueItemType.dropExports), + }), + [RunQueueItemType.retireExports]: object({ + type: literal(RunQueueItemType.retireExports), + }), + [RunQueueItemType.retireImports]: object({ + type: literal(RunQueueItemType.retireImports), + }), + [RunQueueItemType.bringOutYourDead]: object({ + type: literal(RunQueueItemType.bringOutYourDead), + }), }; +export const RunQueueItemStruct = union([ + RunQueueItemStructs.send, + RunQueueItemStructs.notify, + RunQueueItemStructs.dropExports, + RunQueueItemStructs.retireExports, + RunQueueItemStructs.retireImports, + RunQueueItemStructs.bringOutYourDead, +]); + // Per-endpoint persistent state type EndpointState = { name: string; @@ -68,7 +133,7 @@ export type KernelPromise = { state: PromiseState; decider?: EndpointId; subscribers?: EndpointId[]; - value?: CapData; + value?: CapData; }; export type KernelState = { diff --git a/packages/kernel/src/waitUntilQuiescent.ts b/packages/kernel/src/waitUntilQuiescent.ts new file mode 100644 index 000000000..a8553229c --- /dev/null +++ b/packages/kernel/src/waitUntilQuiescent.ts @@ -0,0 +1,22 @@ +import 'setimmediate'; +import { makePromiseKit } from '@endo/promise-kit'; + +// Note: This can only be imported from the Start Compartment, where the tricks +// used by the 'setimmediate' package are available. + +/** + * Return a promise that waits until the microtask queue is empty. When this + * promise resolves, the holder can be assured that the environment no longer + * has agency. + * + * @returns a Promise that can await the compartment becoming quiescent. + */ +export async function waitUntilQuiescent(): Promise { + // the delivery might cause some number of (native) Promises to be + // created and resolved, so we use the IO queue to detect when the + // Promise queue is empty. The IO queue (setImmediate and setTimeout) is + // lower-priority than the Promise queue on browsers. + const { promise: queueEmptyP, resolve } = makePromiseKit(); + setImmediate(() => resolve()); + return queueEmptyP; +} diff --git a/packages/kernel/test/storage.ts b/packages/kernel/test/storage.ts index 1c8fd6a9a..246f56138 100644 --- a/packages/kernel/test/storage.ts +++ b/packages/kernel/test/storage.ts @@ -1,4 +1,4 @@ -import type { KVStore } from '../src/store/kernel-store.js'; +import type { KVStore } from '../src/store/sqlite-kv-store.js'; /** * A mock key/value store realized as a Map. @@ -24,10 +24,13 @@ export function makeMapKVStore(): KVStore { return { get: map.get.bind(map), + getNextKey: (_key: string): string | undefined => { + throw Error(`mock store does not (yet) support getNextKey`); + }, getRequired, set: map.set.bind(map), delete: map.delete.bind(map), - truncate: map.clear.bind(map), + clear: map.clear.bind(map), executeQuery: () => [], }; } diff --git a/packages/kernel/tsconfig.build.json b/packages/kernel/tsconfig.build.json index 5992345a3..7ee75495a 100644 --- a/packages/kernel/tsconfig.build.json +++ b/packages/kernel/tsconfig.build.json @@ -12,5 +12,5 @@ { "path": "../utils/tsconfig.build.json" }, { "path": "../errors/tsconfig.build.json" } ], - "include": ["./src"] + "include": ["./src", "../../types"] } diff --git a/packages/kernel/tsconfig.json b/packages/kernel/tsconfig.json index 3b0ea663d..e8bf5807e 100644 --- a/packages/kernel/tsconfig.json +++ b/packages/kernel/tsconfig.json @@ -8,5 +8,11 @@ { "path": "../streams" }, { "path": "../utils" } ], - "include": ["./src", "./test", "./vite.config.ts", "./vitest.config.ts"] + "include": [ + "./src", + "./test", + "./vite.config.ts", + "./vitest.config.ts", + "../../types" + ] } diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json index 80dd95739..b1ea165ff 100644 --- a/packages/nodejs/package.json +++ b/packages/nodejs/package.json @@ -34,7 +34,7 @@ "publish:preview": "yarn npm publish --tag preview", "test": "vitest run --config vitest.config.ts", "test:e2e": "vitest run --config vitest.config.e2e.ts", - "test:e2e:ci": "./scripts/test-e2e-ci.sh", + "test:e2e:ci": "echo 'skipped tests' || ./scripts/test-e2e-ci.sh", "test:clean": "yarn test --no-cache --coverage.clean", "test:dev": "yarn test --coverage false", "test:verbose": "yarn test --reporter verbose", @@ -76,8 +76,6 @@ "node": "^20 || >=22" }, "dependencies": { - "@endo/exo": "^1.5.4", - "@endo/patterns": "^1.4.4", "@endo/promise-kit": "^1.1.6", "@metamask/utils": "^11.0.1", "@ocap/kernel": "workspace:^", diff --git a/packages/nodejs/src/kernel/sqlite-kv-store.ts b/packages/nodejs/src/kernel/sqlite-kv-store.ts index 010a2245f..d8f2db7b0 100644 --- a/packages/nodejs/src/kernel/sqlite-kv-store.ts +++ b/packages/nodejs/src/kernel/sqlite-kv-store.ts @@ -75,6 +75,29 @@ export async function makeSQLKVStore( return undefined as unknown as string; } + const sqlKVGetNextKey = db.prepare(` + SELECT key + FROM kv + WHERE key > ? + LIMIT 1 + `); + + /** + * Get the lexicographically next key in the KV store after a given key. + * + * @param previousKey - The key you want to know the key after. + * + * @returns The key after `previousKey`, or undefined if `previousKey` is the + * last key in the store. + */ + function kvGetNextKey(previousKey: string): string | undefined { + if (typeof previousKey !== 'string') { + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + throw new Error(`previousKey ${previousKey} must be a string`); + } + return sqlKVGetNextKey.get(previousKey) as string | undefined; + } + const sqlKVSet = db.prepare(` INSERT INTO kv (key, value) VALUES (?, ?) @@ -114,8 +137,8 @@ export async function makeSQLKVStore( /** * Delete all keys and values from the database. */ - function kvTruncate(): void { - logger.debug(`kernel truncate`); + function kvClear(): void { + logger.debug(`kernel clear`); sqlKVDrop.run(); sqlKVInit.run(); } @@ -133,10 +156,11 @@ export async function makeSQLKVStore( return { get: (key) => kvGet(key, false), + getNextKey: kvGetNextKey, getRequired: (key) => kvGet(key, true), set: kvSet, delete: kvDelete, executeQuery: kvExecuteQuery, - truncate: db.transaction(kvTruncate), + clear: db.transaction(kvClear), }; } diff --git a/packages/nodejs/src/vat/vat-worker.ts b/packages/nodejs/src/vat/vat-worker.ts index 6d3a4f47d..efde1bad6 100644 --- a/packages/nodejs/src/vat/vat-worker.ts +++ b/packages/nodejs/src/vat/vat-worker.ts @@ -1,8 +1,5 @@ import '@ocap/shims/endoify'; -import { makeExo } from '@endo/exo'; -import { M } from '@endo/patterns'; -import type { Json } from '@metamask/utils'; import { VatSupervisor } from '@ocap/kernel'; import type { VatCommand, VatCommandReply } from '@ocap/kernel'; import { NodeWorkerMultiplexer } from '@ocap/streams'; @@ -18,8 +15,6 @@ main().catch(logger.error); * The main function for the iframe. */ async function main(): Promise { - logger.debug('started main'); - if (!parentPort) { const errMsg = 'Expected to run in Node Worker with parentPort.'; logger.error(errMsg); @@ -30,19 +25,9 @@ async function main(): Promise { const commandStream = multiplexer.createChannel( 'command', ); - const capTpStream = multiplexer.createChannel('capTp'); - const bootstrap = makeExo( - 'TheGreatFrangooly', - M.interface('TheGreatFrangooly', {}, { defaultGuards: 'passable' }), - { whatIsTheGreatFrangooly: () => 'Crowned with Chaos' }, - ); - - const supervisor = new VatSupervisor({ + // eslint-disable-next-line no-void + void new VatSupervisor({ id: 'iframe', commandStream, - capTpStream, - bootstrap, }); - - logger.log(supervisor.evaluate('["Hello", "world!"].join(" ");')); } diff --git a/packages/nodejs/tsconfig.json b/packages/nodejs/tsconfig.json index 32e19aef6..0490ddc26 100644 --- a/packages/nodejs/tsconfig.json +++ b/packages/nodejs/tsconfig.json @@ -22,6 +22,7 @@ "./src/**/*-trusted-prelude.js", "./test/**/*.ts", "./vitest.config.ts", - "./vitest.config.e2e.ts" + "./vitest.config.e2e.ts", + "../../types" ] } diff --git a/packages/test-utils/src/index.ts b/packages/test-utils/src/index.ts index b1e973951..cddc2ccad 100644 --- a/packages/test-utils/src/index.ts +++ b/packages/test-utils/src/index.ts @@ -1,3 +1,8 @@ export { delay } from './delay.js'; export { makeErrorMatcherFactory } from './errors.js'; export { makePromiseKitMock } from './promise-kit.js'; + +if (typeof self === 'undefined') { + // @ts-expect-error error concerns the browser but this will only run in Node + globalThis.self = globalThis; +} diff --git a/tsconfig.build.json b/tsconfig.build.json index 7b6bd7682..7a0cd69a4 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -1,6 +1,5 @@ { "files": [], - "include": [], "references": [ { "path": "./packages/cli/tsconfig.build.json" }, { "path": "./packages/errors/tsconfig.build.json" }, diff --git a/tsconfig.json b/tsconfig.json index 241c90b13..078ae1f90 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,6 +8,7 @@ "verbatimModuleSyntax": true }, "files": [], + "include": ["./types"], "references": [ { "path": "./packages/cli" }, { "path": "./packages/errors" }, diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 000000000..4e27963d1 --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1 @@ +declare module '@agoric/swingset-liveslots'; diff --git a/vitest.config.ts b/vitest.config.ts index 638897443..97dabb886 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -61,22 +61,22 @@ export default defineConfig({ lines: 100, }, 'packages/extension/**': { - statements: 67.41, - functions: 70.45, - branches: 71.83, - lines: 67.41, + statements: 74.89, + functions: 74.7, + branches: 78.62, + lines: 74.79, }, 'packages/kernel/**': { - statements: 78.23, - functions: 87.87, - branches: 63.71, - lines: 78.44, + statements: 39.05, + functions: 50.31, + branches: 28.17, + lines: 39.33, }, 'packages/nodejs/**': { - statements: 4.08, + statements: 4.12, functions: 4.76, - branches: 15.38, - lines: 4.08, + branches: 13.33, + lines: 4.12, }, 'packages/shims/**': { statements: 0, diff --git a/yarn.lock b/yarn.lock index 7e33ea643..5173b3e73 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30,6 +30,123 @@ __metadata: languageName: node linkType: hard +"@agoric/base-zone@npm:0.1.1-upgrade-18-dev-cc4b6b8.0+cc4b6b8": + version: 0.1.1-upgrade-18-dev-cc4b6b8.0 + resolution: "@agoric/base-zone@npm:0.1.1-upgrade-18-dev-cc4b6b8.0" + dependencies: + "@agoric/store": "npm:0.9.3-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + checksum: 10/f3d51f468620f68de58ffe81ecc0c62a6da3fb913b447559044b7a33ccbba19e7f9706304372246261f0fee7b65358402f1b24e719bd6bb3e286aee95dc861c0 + languageName: node + linkType: hard + +"@agoric/base-zone@npm:^0.1.1-u18.0": + version: 0.1.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/base-zone@npm:0.1.1-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10/64b5e8288a371c4942ab3be67b34b2f45c7914aa5e15cd198ce46e0888cbd11c930dd023cd1fcb1358a55641e2cdd1bb1e195ddf9fb9df2462ac07fa1e8789f1 + languageName: node + linkType: hard + +"@agoric/internal@npm:0.4.0-u18.0": + version: 0.4.0-u18.0 + resolution: "@agoric/internal@npm:0.4.0-u18.0" + dependencies: + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/stream": "npm:^1.2.7" + anylogger: "npm:^0.21.0" + jessie.js: "npm:^0.3.4" + checksum: 10/5c321dba66395f4b1289379d4a4169191246600f9abf0d02ed7a693a9196e8bfd29237984d77185b76225c6f4a0864e7483f90663dee8c93dd55bd218dc2a9db + languageName: node + linkType: hard + +"@agoric/internal@npm:^0.4.0-u18.0": + version: 0.4.0-upgrade-18-dev-cc4b6b8.0 + resolution: "@agoric/internal@npm:0.4.0-upgrade-18-dev-cc4b6b8.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/init": "npm:^1.1.7" + "@endo/marshal": "npm:^1.6.2" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/stream": "npm:^1.2.8" + anylogger: "npm:^0.21.0" + jessie.js: "npm:^0.3.4" + checksum: 10/21caa8940724b84a4c7fb976a43a98eeaed99e92b4c5403bacb78a91bc25facd7721f5ef5ef4cf9ce7411bf24a1f42ee9c19af5a6d65aab17b70163322ea9632 + languageName: node + linkType: hard + +"@agoric/store@npm:0.9.3-upgrade-18-dev-cc4b6b8.0+cc4b6b8": + version: 0.9.3-upgrade-18-dev-cc4b6b8.0 + resolution: "@agoric/store@npm:0.9.3-upgrade-18-dev-cc4b6b8.0" + dependencies: + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/marshal": "npm:^1.6.2" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + checksum: 10/3ac4766569960308be89f96d02641fecce3b88c99dbda588b412f981fa3542bd605d655af88a44cfd65c59f2de043ecc6529c516c531930d59cf1f27fe88d41f + languageName: node + linkType: hard + +"@agoric/store@npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/store@npm:^0.9.3-u18.0": + version: 0.9.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/store@npm:0.9.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10/ea3045ddce5c76a5fed2ed77ee756c38093e60d762c980a6955209b7bda298604dc7b4c0faea86a6d43e04bad4af5239ed734cb8724d68e64197885904a70d31 + languageName: node + linkType: hard + +"@agoric/swingset-liveslots@npm:0.10.3-u18.0": + version: 0.10.3-u18.0 + resolution: "@agoric/swingset-liveslots@npm:0.10.3-u18.0" + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@endo/env-options": "npm:^1.1.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10/d473cb854415bf0a486fbf40ee8cf36b5aa4d171a887186e8f93b1a20bdd078648d743e76ef5542e90009d64f9cf2cb752288a28ed2c75c4716a0d141ccaf0a1 + languageName: node + linkType: hard + "@ampproject/remapping@npm:^2.2.0": version: 2.3.0 resolution: "@ampproject/remapping@npm:2.3.0" @@ -79,7 +196,20 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0": +"@asamuzakjp/css-color@npm:^2.8.2": + version: 2.8.3 + resolution: "@asamuzakjp/css-color@npm:2.8.3" + dependencies: + "@csstools/css-calc": "npm:^2.1.1" + "@csstools/css-color-parser": "npm:^3.0.7" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + lru-cache: "npm:^10.4.3" + checksum: 10/3fbd6b975cfca220a0620843776e7d266b880293a9e3364a48de11ca3eb54af8209343d01842a7c98d2737e457294a7621a5f6671aaf5f12e1634d10808f2508 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0, @babel/code-frame@npm:^7.26.2": version: 7.26.2 resolution: "@babel/code-frame@npm:7.26.2" dependencies: @@ -90,10 +220,10 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.25.9": - version: 7.26.0 - resolution: "@babel/compat-data@npm:7.26.0" - checksum: 10/e847d58222eb567da4bcc2c8e4e44b508d1a34626922858fe12edeb73b5f3c486e7e77a351725b4347525d623dc5046b8a6355df76f368560ca6cbac10fef2c5 +"@babel/compat-data@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/compat-data@npm:7.26.5" + checksum: 10/afe35751f27bda80390fa221d5e37be55b7fc42cec80de9896086e20394f2306936c4296fcb4d62b683e3b49ba2934661ea7e06196ca2dacdc2e779fbea4a1a9 languageName: node linkType: hard @@ -120,29 +250,29 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/generator@npm:7.26.0" +"@babel/generator@npm:^7.26.0, @babel/generator@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/generator@npm:7.26.5" dependencies: - "@babel/parser": "npm:^7.26.0" - "@babel/types": "npm:^7.26.0" + "@babel/parser": "npm:^7.26.5" + "@babel/types": "npm:^7.26.5" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^3.0.2" - checksum: 10/3528b0b5da7003617771ddfc564bcb4037dde59e8142e3808ae8eb5d45c5dfda74df5eb9e6162ab2c2bc66329c609a44d9fd0ce6d4bc14b89b3deb92c3343c56 + checksum: 10/aa5f176155431d1fb541ca11a7deddec0fc021f20992ced17dc2f688a0a9584e4ff4280f92e8a39302627345cd325762f70f032764806c579c6fd69432542bcb languageName: node linkType: hard "@babel/helper-compilation-targets@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-compilation-targets@npm:7.25.9" + version: 7.26.5 + resolution: "@babel/helper-compilation-targets@npm:7.26.5" dependencies: - "@babel/compat-data": "npm:^7.25.9" + "@babel/compat-data": "npm:^7.26.5" "@babel/helper-validator-option": "npm:^7.25.9" browserslist: "npm:^4.24.0" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10/8053fbfc21e8297ab55c8e7f9f119e4809fa7e505268691e1bedc2cf5e7a5a7de8c60ad13da2515378621b7601c42e101d2d679904da395fa3806a1edef6b92e + checksum: 10/f3b5f0bfcd7b6adf03be1a494b269782531c6e415afab2b958c077d570371cf1bfe001c442508092c50ed3711475f244c05b8f04457d8dea9c34df2b741522bf languageName: node linkType: hard @@ -170,9 +300,9 @@ __metadata: linkType: hard "@babel/helper-plugin-utils@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-plugin-utils@npm:7.25.9" - checksum: 10/e347d87728b1ab10b6976d46403941c8f9008c045ea6d99997a7ffca7b852dc34b6171380f7b17edf94410e0857ff26f3a53d8618f11d73744db86e8ca9b8c64 + version: 7.26.5 + resolution: "@babel/helper-plugin-utils@npm:7.26.5" + checksum: 10/1cc0fd8514da3bb249bed6c27227696ab5e84289749d7258098701cffc0c599b7f61ec40dd332f8613030564b79899d9826813c96f966330bcfc7145a8377857 languageName: node linkType: hard @@ -207,14 +337,14 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.6, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0": - version: 7.26.3 - resolution: "@babel/parser@npm:7.26.3" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.6, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/parser@npm:7.26.5" dependencies: - "@babel/types": "npm:^7.26.3" + "@babel/types": "npm:^7.26.5" bin: parser: ./bin/babel-parser.js - checksum: 10/e7e3814b2dc9ee3ed605d38223471fa7d3a84cbe9474d2b5fa7ac57dc1ddf75577b1fd3a93bf7db8f41f28869bda795cddd80223f980be23623b6434bf4c88a8 + checksum: 10/d92097066e3e26625a485149f54c27899e4d94d7ef2f76d8fc9de2019212e7951940a31c0003f26ccad22e664f89ff51e5d5fe80a11eafaaec2420655010533c languageName: node linkType: hard @@ -261,27 +391,27 @@ __metadata: linkType: hard "@babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.23.6, @babel/traverse@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/traverse@npm:7.25.9" + version: 7.26.5 + resolution: "@babel/traverse@npm:7.26.5" dependencies: - "@babel/code-frame": "npm:^7.25.9" - "@babel/generator": "npm:^7.25.9" - "@babel/parser": "npm:^7.25.9" + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.5" + "@babel/parser": "npm:^7.26.5" "@babel/template": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" + "@babel/types": "npm:^7.26.5" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10/7431614d76d4a053e429208db82f2846a415833f3d9eb2e11ef72eeb3c64dfd71f4a4d983de1a4a047b36165a1f5a64de8ca2a417534cc472005c740ffcb9c6a + checksum: 10/b0131159450e3cd4208354cdea57e832e1a344fcc284b6ac84d1e13567a10501c4747bfd0ce637d2bd02277526b49372cfca71edd5c825cea74dcc9f52bb9225 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.0, @babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.26.3": - version: 7.26.3 - resolution: "@babel/types@npm:7.26.3" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.0, @babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/types@npm:7.26.5" dependencies: "@babel/helper-string-parser": "npm:^7.25.9" "@babel/helper-validator-identifier": "npm:^7.25.9" - checksum: 10/c31d0549630a89abfa11410bf82a318b0c87aa846fbf5f9905e47ba5e2aa44f41cc746442f105d622c519e4dc532d35a8d8080460ff4692f9fc7485fbf3a00eb + checksum: 10/148f6bead7bc39371176ba681873c930087503a8bfd2b0dab5090de32752241806c95f4e87cee8b2976bb0277c6cbc150f16c333fc90269634b711d3711c0f18 languageName: node linkType: hard @@ -320,7 +450,53 @@ __metadata: languageName: node linkType: hard -"@endo/base64@npm:^1.0.8, @endo/base64@npm:^1.0.9": +"@csstools/color-helpers@npm:^5.0.1": + version: 5.0.1 + resolution: "@csstools/color-helpers@npm:5.0.1" + checksum: 10/4cb25b34997c9b0e9f401833e27942636494bc3c7fda5c6633026bc3fdfdda1c67be68ea048058bfba449a86ec22332e23b4ec5982452c50b67880c4cb13a660 + languageName: node + linkType: hard + +"@csstools/css-calc@npm:^2.1.1": + version: 2.1.1 + resolution: "@csstools/css-calc@npm:2.1.1" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.4 + "@csstools/css-tokenizer": ^3.0.3 + checksum: 10/60e8808c261eeebb15517c0f368672494095bb10e90177dfc492f956fc432760d84b17dc19db739a2e23cac0013f4bcf37bb93947f9741b95b7227eeaced250b + languageName: node + linkType: hard + +"@csstools/css-color-parser@npm:^3.0.7": + version: 3.0.7 + resolution: "@csstools/css-color-parser@npm:3.0.7" + dependencies: + "@csstools/color-helpers": "npm:^5.0.1" + "@csstools/css-calc": "npm:^2.1.1" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.4 + "@csstools/css-tokenizer": ^3.0.3 + checksum: 10/efceb60608f3fc2b6da44d5be7720a8b302e784f05c1c12f17a1da4b4b9893b2e20d0ea74ac2c2d6d5ca9b64ee046d05f803c7b78581fd5a3f85e78acfc5d98e + languageName: node + linkType: hard + +"@csstools/css-parser-algorithms@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/css-parser-algorithms@npm:3.0.4" + peerDependencies: + "@csstools/css-tokenizer": ^3.0.3 + checksum: 10/dfb6926218d9f8ba25d8b43ea46c03863c819481f8c55e4de4925780eaab9e6bcd6bead1d56b4ef82d09fcd9d69a7db2750fa9db08eece9470fd499dc76d0edb + languageName: node + linkType: hard + +"@csstools/css-tokenizer@npm:^3.0.3": + version: 3.0.3 + resolution: "@csstools/css-tokenizer@npm:3.0.3" + checksum: 10/6baa3160e426e1f177b8f10d54ec7a4a596090f65a05f16d7e9e4da049962a404eabc5f885f4867093702c259cd4080ac92a438326e22dea015201b3e71f5bbb + languageName: node + linkType: hard + +"@endo/base64@npm:^1.0.9": version: 1.0.9 resolution: "@endo/base64@npm:1.0.9" checksum: 10/6fe798db364dfb63fbc231d8c48409e6e7d850457633e73f0524873d74189cc532123ef496229f6f43644f341cfb857027ccf09668a33bf6227f851520a86324 @@ -369,7 +545,7 @@ __metadata: languageName: node linkType: hard -"@endo/common@npm:^1.2.6, @endo/common@npm:^1.2.8": +"@endo/common@npm:^1.2.7, @endo/common@npm:^1.2.8": version: 1.2.8 resolution: "@endo/common@npm:1.2.8" dependencies: @@ -380,7 +556,7 @@ __metadata: languageName: node linkType: hard -"@endo/compartment-mapper@npm:^1.3.1, @endo/compartment-mapper@npm:^1.4.0": +"@endo/compartment-mapper@npm:^1.4.0": version: 1.4.0 resolution: "@endo/compartment-mapper@npm:1.4.0" dependencies: @@ -400,7 +576,7 @@ __metadata: languageName: node linkType: hard -"@endo/errors@npm:^1.2.6, @endo/errors@npm:^1.2.7, @endo/errors@npm:^1.2.8": +"@endo/errors@npm:^1.2.7, @endo/errors@npm:^1.2.8": version: 1.2.8 resolution: "@endo/errors@npm:1.2.8" dependencies: @@ -421,7 +597,7 @@ __metadata: languageName: node linkType: hard -"@endo/eventual-send@npm:^1.2.6, @endo/eventual-send@npm:^1.2.8": +"@endo/eventual-send@npm:^1.2.6, @endo/eventual-send@npm:^1.2.7, @endo/eventual-send@npm:^1.2.8": version: 1.2.8 resolution: "@endo/eventual-send@npm:1.2.8" dependencies: @@ -430,42 +606,42 @@ __metadata: languageName: node linkType: hard -"@endo/exo@npm:^1.5.4": - version: 1.5.4 - resolution: "@endo/exo@npm:1.5.4" +"@endo/exo@npm:^1.5.4, @endo/exo@npm:^1.5.6, @endo/exo@npm:^1.5.7": + version: 1.5.7 + resolution: "@endo/exo@npm:1.5.7" dependencies: - "@endo/common": "npm:^1.2.6" - "@endo/env-options": "npm:^1.1.7" - "@endo/errors": "npm:^1.2.6" - "@endo/eventual-send": "npm:^1.2.6" - "@endo/far": "npm:^1.1.6" - "@endo/pass-style": "npm:^1.4.4" - "@endo/patterns": "npm:^1.4.4" - checksum: 10/02d95060c635a7dbc316fc648387620de8daf15f20d224361f6ddbd69341570bb207e673abd21147830f7456f90e0e54108c0c7613fa52228cda209226adaddb + "@endo/common": "npm:^1.2.8" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + checksum: 10/f69f564e3a3a02fee5e3cd5c659258c6be5587a9b3878505a7d048b061ff1f303f911525340b5ae7cbec647620c7cda50a774b0bfadd1fe31fa26f80f02e145b languageName: node linkType: hard -"@endo/far@npm:^1.1.6": - version: 1.1.6 - resolution: "@endo/far@npm:1.1.6" +"@endo/far@npm:^1.0.0, @endo/far@npm:^1.1.8, @endo/far@npm:^1.1.9": + version: 1.1.9 + resolution: "@endo/far@npm:1.1.9" dependencies: - "@endo/errors": "npm:^1.2.6" - "@endo/eventual-send": "npm:^1.2.6" - "@endo/pass-style": "npm:^1.4.4" - checksum: 10/5d83e4d8d5e1b5718337288f079bac3ae759d586b87124e2cf5922b8ee55372fc984e21f7ff1d21fef4e19e33b8a0f5a935cc01ea0246783be4b41603ad237ce + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/pass-style": "npm:^1.4.7" + checksum: 10/bb91616094a0a5dcf189d2caf02956abf54e3eb5e6d001baf38109d2b16ac086275f63a5cff90f976328f90888169a06a340ae3112bdb6bfaa11b5fb67128d9d languageName: node linkType: hard "@endo/import-bundle@npm:^1.3.1": - version: 1.3.1 - resolution: "@endo/import-bundle@npm:1.3.1" + version: 1.3.2 + resolution: "@endo/import-bundle@npm:1.3.2" dependencies: - "@endo/base64": "npm:^1.0.8" - "@endo/compartment-mapper": "npm:^1.3.1" - "@endo/errors": "npm:^1.2.7" - "@endo/where": "npm:^1.0.8" - ses: "npm:^1.9.1" - checksum: 10/c24d61af3634515ce2c4b492f7050aa8a95347c9fd9adddcda7cce60b9779c7ed43fdf4d214bb8040a909dd10119e3f6142553138b204b48549b1c7f2901b2cd + "@endo/base64": "npm:^1.0.9" + "@endo/compartment-mapper": "npm:^1.4.0" + "@endo/errors": "npm:^1.2.8" + "@endo/where": "npm:^1.0.9" + ses: "npm:^1.10.0" + checksum: 10/8cf6d92da97c78549870ad351811b4dffe40b50c3e2f9fc08b567e0bfdc45fa50768882b060e187158c6da50e518fab22962273bf7447e5431aa319ee8d1939c languageName: node linkType: hard @@ -490,7 +666,7 @@ __metadata: languageName: node linkType: hard -"@endo/marshal@npm:^1.5.4, @endo/marshal@npm:^1.6.2": +"@endo/marshal@npm:^1.6.1, @endo/marshal@npm:^1.6.2": version: 1.6.2 resolution: "@endo/marshal@npm:1.6.2" dependencies: @@ -517,14 +693,14 @@ __metadata: languageName: node linkType: hard -"@endo/nat@npm:^5.0.13": +"@endo/nat@npm:^5.0.12, @endo/nat@npm:^5.0.13": version: 5.0.13 resolution: "@endo/nat@npm:5.0.13" checksum: 10/df17b5e471a706a3e9732c0abafa15fef3b7ecbdf4b55aead012e1e1f73d64a4febbd25056de2f87306448ddf844357d69414a053afa6042a319d277fc16ab6b languageName: node linkType: hard -"@endo/pass-style@npm:^1.4.4, @endo/pass-style@npm:^1.4.7": +"@endo/pass-style@npm:^1.4.6, @endo/pass-style@npm:^1.4.7": version: 1.4.7 resolution: "@endo/pass-style@npm:1.4.7" dependencies: @@ -537,20 +713,20 @@ __metadata: languageName: node linkType: hard -"@endo/patterns@npm:^1.4.4": - version: 1.4.4 - resolution: "@endo/patterns@npm:1.4.4" +"@endo/patterns@npm:^1.4.4, @endo/patterns@npm:^1.4.6, @endo/patterns@npm:^1.4.7": + version: 1.4.7 + resolution: "@endo/patterns@npm:1.4.7" dependencies: - "@endo/common": "npm:^1.2.6" - "@endo/errors": "npm:^1.2.6" - "@endo/eventual-send": "npm:^1.2.6" - "@endo/marshal": "npm:^1.5.4" - "@endo/promise-kit": "npm:^1.1.6" - checksum: 10/977b303de33b653005ab92f559dae997a2cf6933feffa3ec80d27d8fbf5cd236e625c2f57a718a5295b31f7244ef70f4fcab2f7012382da9973d366727a7ecd3 + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/marshal": "npm:^1.6.2" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10/9c29e415fb42fb3da3f92993b07aae183aca79949d9ba4896e5c00964d43b67638b59a504f5b92b198757cedd36c9cd3c585d94b26e31b70fd88cf088ac520cf languageName: node linkType: hard -"@endo/promise-kit@npm:^1.1.6, @endo/promise-kit@npm:^1.1.8": +"@endo/promise-kit@npm:^1.1.6, @endo/promise-kit@npm:^1.1.7, @endo/promise-kit@npm:^1.1.8": version: 1.1.8 resolution: "@endo/promise-kit@npm:1.1.8" dependencies: @@ -559,14 +735,14 @@ __metadata: languageName: node linkType: hard -"@endo/stream@npm:^1.2.6": - version: 1.2.6 - resolution: "@endo/stream@npm:1.2.6" +"@endo/stream@npm:^1.2.6, @endo/stream@npm:^1.2.7, @endo/stream@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/stream@npm:1.2.8" dependencies: - "@endo/eventual-send": "npm:^1.2.6" - "@endo/promise-kit": "npm:^1.1.6" - ses: "npm:^1.9.0" - checksum: 10/54e96d0827ec9e53b8af9f2f5e72f69be015fa996217fe67191c3d447ba3aa7bf4469ff157f06fd6173af8507ecc24789a9c98c49695afae68bba8287ded9e09 + "@endo/eventual-send": "npm:^1.2.8" + "@endo/promise-kit": "npm:^1.1.8" + ses: "npm:^1.10.0" + checksum: 10/f715c54eefa5795a0064aeb675395c0dbd372063a9d3922aac7037cd8e2b74dd8e70402305b2d79870807bba1c2adc258c57c0acaee0c378744c4f165507f34d languageName: node linkType: hard @@ -577,7 +753,7 @@ __metadata: languageName: node linkType: hard -"@endo/where@npm:^1.0.8, @endo/where@npm:^1.0.9": +"@endo/where@npm:^1.0.9": version: 1.0.9 resolution: "@endo/where@npm:1.0.9" checksum: 10/8190b5f4d5729d5121d711d8e209a9cde126a96e174b079ca376f46c75fc56989cd37a4d14905c89fb75c2f42bf1d25a74e909a1ca1da06d1940368db910051e @@ -960,12 +1136,12 @@ __metadata: languageName: node linkType: hard -"@eslint/core@npm:^0.9.0": - version: 0.9.1 - resolution: "@eslint/core@npm:0.9.1" +"@eslint/core@npm:^0.10.0": + version: 0.10.0 + resolution: "@eslint/core@npm:0.10.0" dependencies: "@types/json-schema": "npm:^7.0.15" - checksum: 10/f2263f8f94fdf84fc34573e027de98f1fce6287120513ae672ddf0652c75b9fa77c314d565628fc58e0a6f959766acc34c8191f9b94f1757b910408ffa04adde + checksum: 10/de41d7fa5dc468b70fb15c72829096939fc0217c41b8519af4620bc1089cb42539a15325c4c3ee3832facac1836c8c944c4a0c4d0cc8b33ffd8e95962278ae14 languageName: node linkType: hard @@ -986,10 +1162,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.17.0, @eslint/js@npm:^9.11.0": - version: 9.17.0 - resolution: "@eslint/js@npm:9.17.0" - checksum: 10/1a89e62f5c50e75d44565b7f3b91701455a999132c991e10bac59c118fbb54bdd54be22b9bda1ac730f78a2e64604403d65ce5dd7726d80b2632982cfc3d84ac +"@eslint/js@npm:9.18.0, @eslint/js@npm:^9.11.0": + version: 9.18.0 + resolution: "@eslint/js@npm:9.18.0" + checksum: 10/364a7d030dad9dbda1458d8dbcea0199fe7d48bcfefe4b49389df6c45cdc5a2449f70e5d8a794e46ed9fb34af3fe5a3f53e30020d306b6ee791e2a1b2b9fa25f languageName: node linkType: hard @@ -1000,12 +1176,13 @@ __metadata: languageName: node linkType: hard -"@eslint/plugin-kit@npm:^0.2.3": - version: 0.2.4 - resolution: "@eslint/plugin-kit@npm:0.2.4" +"@eslint/plugin-kit@npm:^0.2.5": + version: 0.2.5 + resolution: "@eslint/plugin-kit@npm:0.2.5" dependencies: + "@eslint/core": "npm:^0.10.0" levn: "npm:^0.4.1" - checksum: 10/e34d02ea1dccd716e51369620263a4b2167aff3c0510ed776e21336cc3ad7158087449a76931baf07cdc33810cb6919db375f2e9f409435d2c6e0dd5f4786b25 + checksum: 10/82d0142bc7054587bde4f75c2c517f477df7c320e4bdb47a4d5f766899a313ce65e9ce5d59428178d0be473a95292065053f69637042546b811ad89079781cbc languageName: node linkType: hard @@ -1101,23 +1278,23 @@ __metadata: linkType: hard "@inquirer/confirm@npm:^5.0.0": - version: 5.0.1 - resolution: "@inquirer/confirm@npm:5.0.1" + version: 5.1.3 + resolution: "@inquirer/confirm@npm:5.1.3" dependencies: - "@inquirer/core": "npm:^10.0.1" - "@inquirer/type": "npm:^3.0.0" + "@inquirer/core": "npm:^10.1.4" + "@inquirer/type": "npm:^3.0.2" peerDependencies: "@types/node": ">=18" - checksum: 10/da640d36ce32350e9982bbaa5a19efac4a879bc1192f93e0ec284031e6dd82e9cf26c6e0caf777c051e200581aa4bcf0a6ece4118fd05352c5d5e2f1d7160c72 + checksum: 10/608dbcf24a4c43a5bdffa5eea134360841bf34f2175d87aa9214c356b1e205fafcc559edc4c7783ba907d2da82122c0507d64d380ef20d33ded79e780034ab8b languageName: node linkType: hard -"@inquirer/core@npm:^10.0.1": - version: 10.0.1 - resolution: "@inquirer/core@npm:10.0.1" +"@inquirer/core@npm:^10.1.4": + version: 10.1.4 + resolution: "@inquirer/core@npm:10.1.4" dependencies: - "@inquirer/figures": "npm:^1.0.7" - "@inquirer/type": "npm:^3.0.0" + "@inquirer/figures": "npm:^1.0.9" + "@inquirer/type": "npm:^3.0.2" ansi-escapes: "npm:^4.3.2" cli-width: "npm:^4.1.0" mute-stream: "npm:^2.0.0" @@ -1125,23 +1302,23 @@ __metadata: strip-ansi: "npm:^6.0.1" wrap-ansi: "npm:^6.2.0" yoctocolors-cjs: "npm:^2.1.2" - checksum: 10/368f78110e3b9f1370a45047a24b5cc4ef41fe2b7f2d82080de15d9bfb7ee3ff90494e0c138d1cca1b480c2cfb21914da8e9706b09620ea2e314860f98938393 + checksum: 10/a3e6a47443586ca313fa852e76670a267e01059524dd7cd9fbc1fa7cebe7d9249cd53f7483aa53aabea6458c9893b6acd8a51dfd37561ec6612a3a0ef2fc94ea languageName: node linkType: hard -"@inquirer/figures@npm:^1.0.7": - version: 1.0.7 - resolution: "@inquirer/figures@npm:1.0.7" - checksum: 10/ce896860de9d822a7c2a212667bcfd0f04cf2ce86d9a2411cc9c077bb59cd61732cb5f72ac66e88d52912466eec433f005bf8a25efa658f41e1a32f3977080bd +"@inquirer/figures@npm:^1.0.9": + version: 1.0.9 + resolution: "@inquirer/figures@npm:1.0.9" + checksum: 10/7ced1275a5826cdeb61797d6c068417e7d52aa87894de18cedd259f783f42d731226c3f8b92cab27b8e7b0e31ab1dd3cd77f16935b67ebe1cbb271e5972d7758 languageName: node linkType: hard -"@inquirer/type@npm:^3.0.0": - version: 3.0.0 - resolution: "@inquirer/type@npm:3.0.0" +"@inquirer/type@npm:^3.0.2": + version: 3.0.2 + resolution: "@inquirer/type@npm:3.0.2" peerDependencies: "@types/node": ">=18" - checksum: 10/fd4c265f0ed03e8da7ae2972c4e6b81932f535d9dd1e039e9e52b027cb8b72ae3c3309a3383ba513a8d3ae626de7dd3634387775cbdcbd100155ecbcaa65a657 + checksum: 10/d1a2879b1baa357421cef441fc7b43181e110243933763ae922c55c2fc9af2d459ceaca8b71ed57e3dabd5077542fa0dd1d0ff0cf362ce054e61202386b545ed languageName: node linkType: hard @@ -1176,13 +1353,13 @@ __metadata: linkType: hard "@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" + version: 0.3.8 + resolution: "@jridgewell/gen-mapping@npm:0.3.8" dependencies: "@jridgewell/set-array": "npm:^1.2.1" "@jridgewell/sourcemap-codec": "npm:^1.4.10" "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10/81587b3c4dd8e6c60252122937cea0c637486311f4ed208b52b62aae2e7a87598f63ec330e6cd0984af494bfb16d3f0d60d3b21d7e5b4aedd2602ff3fe9d32e2 + checksum: 10/9d3a56ab3612ab9b85d38b2a93b87f3324f11c5130859957f6500e4ac8ce35f299d5ccc3ecd1ae87597601ecf83cee29e9afd04c18777c24011073992ff946df languageName: node linkType: hard @@ -1217,31 +1394,32 @@ __metadata: languageName: node linkType: hard -"@lavamoat/aa@npm:^4.3.0": - version: 4.3.0 - resolution: "@lavamoat/aa@npm:4.3.0" +"@lavamoat/aa@npm:^4.3.1": + version: 4.3.1 + resolution: "@lavamoat/aa@npm:4.3.1" dependencies: resolve: "npm:1.22.8" bin: lavamoat-ls: src/cli.js - checksum: 10/c6c24ea88194ad06a83cc2a9e0b6918ee41ab40abcc5c889e1a33f214e48eb160dd0c4cea7b0e299f86d472810ef80e7caf0b2600499222b108690516d9f8123 + checksum: 10/664692b22c6fcf44a47259ec3b48873c0064872a5a285c7ee4ddc0f99217d5a6653236304cc393f03970f0810694ab44d1f02ce4c980ce86cc24b0e27e9c622f languageName: node linkType: hard "@lavamoat/allow-scripts@npm:^3.0.4": - version: 3.3.0 - resolution: "@lavamoat/allow-scripts@npm:3.3.0" + version: 3.3.1 + resolution: "@lavamoat/allow-scripts@npm:3.3.1" dependencies: - "@lavamoat/aa": "npm:^4.3.0" + "@lavamoat/aa": "npm:^4.3.1" "@npmcli/run-script": "npm:8.1.0" bin-links: "npm:4.0.4" npm-normalize-package-bin: "npm:3.0.1" + type-fest: "npm:4.30.0" yargs: "npm:17.7.2" peerDependencies: "@lavamoat/preinstall-always-fail": "*" bin: allow-scripts: src/cli.js - checksum: 10/476043c56425c3077d051a4a6ee4d045fab8b80bf16d50a9201c68224a2ddd77af03490388b7380004d348b11abf4ab7854ba52ba514d10d17c05d40dc8b870d + checksum: 10/78bb7502136cee509592e66a1824a3e049a392e79740d99f528774743934d28e2099d3e80beded9a6623ce8842250d6207ebeea694d08c87e4fd8e2899eb0d7a languageName: node linkType: hard @@ -1252,34 +1430,32 @@ __metadata: languageName: node linkType: hard -"@mapbox/node-pre-gyp@npm:^1.0.11": - version: 1.0.11 - resolution: "@mapbox/node-pre-gyp@npm:1.0.11" +"@mapbox/node-pre-gyp@npm:^2.0.0-rc.0": + version: 2.0.0-rc.0 + resolution: "@mapbox/node-pre-gyp@npm:2.0.0-rc.0" dependencies: + consola: "npm:^3.2.3" detect-libc: "npm:^2.0.0" - https-proxy-agent: "npm:^5.0.0" - make-dir: "npm:^3.1.0" + https-proxy-agent: "npm:^7.0.5" node-fetch: "npm:^2.6.7" - nopt: "npm:^5.0.0" - npmlog: "npm:^5.0.1" - rimraf: "npm:^3.0.2" - semver: "npm:^7.3.5" - tar: "npm:^6.1.11" + nopt: "npm:^8.0.0" + semver: "npm:^7.5.3" + tar: "npm:^7.4.0" bin: node-pre-gyp: bin/node-pre-gyp - checksum: 10/59529a2444e44fddb63057152452b00705aa58059079191126c79ac1388ae4565625afa84ed4dd1bf017d1111ab6e47907f7c5192e06d83c9496f2f3e708680a + checksum: 10/527802a6fb208599c816e4c9ca2421175dbcf54f252fe60965d31b7cab748f31ae48467eac910378fd374b6b93b33ca742ade4949a8f17a82a49e95f33b54247 languageName: node linkType: hard "@metamask/approval-controller@npm:^7.1.1": - version: 7.1.1 - resolution: "@metamask/approval-controller@npm:7.1.1" + version: 7.1.2 + resolution: "@metamask/approval-controller@npm:7.1.2" dependencies: - "@metamask/base-controller": "npm:^7.0.2" - "@metamask/rpc-errors": "npm:^7.0.1" - "@metamask/utils": "npm:^10.0.0" - nanoid: "npm:^3.1.31" - checksum: 10/10155e8c10be80a65bd99cc1aa83baf93900955aac35eb1cfc88c4ab8beff91de9db1168dd831b82378f26756e6f961296834d1703f9a727dd47402c735ee815 + "@metamask/base-controller": "npm:^7.1.1" + "@metamask/rpc-errors": "npm:^7.0.2" + "@metamask/utils": "npm:^11.0.1" + nanoid: "npm:^3.3.8" + checksum: 10/e5903e8c3799484a3f42b2683ed733e68aca5204070c84f6012ee3830b04ebffdc7fc21fe80d2ea46f2a9ee3557a38e4031186f47e84d9079c2c902361543b0d languageName: node linkType: hard @@ -1299,40 +1475,33 @@ __metadata: languageName: node linkType: hard -"@metamask/base-controller@npm:^6.0.2": - version: 6.0.3 - resolution: "@metamask/base-controller@npm:6.0.3" - dependencies: - "@metamask/utils": "npm:^9.1.0" - immer: "npm:^9.0.6" - checksum: 10/43e208627c673094e3b4a7766ef4df34cd5a9ec7f09721cc3e60123b69a22b82c68752b963d17f4ad925a01c6e5dc89f125cac33aeee4e90e0a8346a1d153aae - languageName: node - linkType: hard - -"@metamask/base-controller@npm:^7.0.1, @metamask/base-controller@npm:^7.0.2": - version: 7.0.2 - resolution: "@metamask/base-controller@npm:7.0.2" +"@metamask/base-controller@npm:^7.0.3, @metamask/base-controller@npm:^7.1.1": + version: 7.1.1 + resolution: "@metamask/base-controller@npm:7.1.1" dependencies: - "@metamask/utils": "npm:^10.0.0" + "@metamask/utils": "npm:^11.0.1" immer: "npm:^9.0.6" - checksum: 10/6f78ec5af840c9947aa8eac6e402df6469600260d613a92196daefd5b072097a176fe5da1c386f2d36853513254b74140d667d817a12880c46f088e18ff3606a + checksum: 10/d45abc9e0f3f42a0ea7f0a52734f3749fafc5fefc73608230ab0815578e83a9fc28fe57dc7000f6f8df2cdcee5b53f68bb971091075bec9de6b7f747de627c60 languageName: node linkType: hard -"@metamask/controller-utils@npm:^11.3.0": - version: 11.3.0 - resolution: "@metamask/controller-utils@npm:11.3.0" +"@metamask/controller-utils@npm:^11.4.5": + version: 11.4.5 + resolution: "@metamask/controller-utils@npm:11.4.5" dependencies: "@ethereumjs/util": "npm:^8.1.0" "@metamask/eth-query": "npm:^4.0.0" "@metamask/ethjs-unit": "npm:^0.3.0" - "@metamask/utils": "npm:^9.1.0" + "@metamask/utils": "npm:^11.0.1" "@spruceid/siwe-parser": "npm:2.1.0" "@types/bn.js": "npm:^5.1.5" + bignumber.js: "npm:^9.1.2" bn.js: "npm:^5.2.1" eth-ens-namehash: "npm:^2.0.8" fast-deep-equal: "npm:^3.1.3" - checksum: 10/3200228d1f4ea5fa095228db4e5050529caf0470e072382eb8f7571bb9b07515516ca9e846b7751388399d9ae967e4985dafd6120902ef6c998e98f4eb36d964 + peerDependencies: + "@babel/runtime": ^7.0.0 + checksum: 10/28c637197b569c437be116961a94f59f1476439484042f59b24573d70cdc575ba5ccc614d7062388945461c9c5af319a6004a0d98a07cadd3fa3fa623adb688d languageName: node linkType: hard @@ -1421,39 +1590,39 @@ __metadata: languageName: node linkType: hard -"@metamask/json-rpc-engine@npm:^9.0.1, @metamask/json-rpc-engine@npm:^9.0.3": - version: 9.0.3 - resolution: "@metamask/json-rpc-engine@npm:9.0.3" +"@metamask/json-rpc-engine@npm:^10.0.2": + version: 10.0.2 + resolution: "@metamask/json-rpc-engine@npm:10.0.2" dependencies: - "@metamask/rpc-errors": "npm:^6.3.1" + "@metamask/rpc-errors": "npm:^7.0.2" "@metamask/safe-event-emitter": "npm:^3.0.0" - "@metamask/utils": "npm:^9.1.0" - checksum: 10/23a3cafb5869f6d5867105e3570ac4e214a72dda0b4b428cde6bae8856ec838c822b174f8cea054108122531d662cf93a65e92e1ee07da0485d5d0c0e5a1fca6 + "@metamask/utils": "npm:^11.0.1" + checksum: 10/479e4c36ee10ecaa9b26bf8aaea375f7dbe68b5379fabc0f78ac087e310d0040b0e7a2d55eccebd820089404a2170f498c4e2b82eb7f0d34c5becbd811340d49 languageName: node linkType: hard -"@metamask/json-rpc-middleware-stream@npm:^8.0.1": - version: 8.0.3 - resolution: "@metamask/json-rpc-middleware-stream@npm:8.0.3" +"@metamask/json-rpc-middleware-stream@npm:^8.0.6": + version: 8.0.6 + resolution: "@metamask/json-rpc-middleware-stream@npm:8.0.6" dependencies: - "@metamask/json-rpc-engine": "npm:^9.0.3" + "@metamask/json-rpc-engine": "npm:^10.0.2" "@metamask/safe-event-emitter": "npm:^3.0.0" - "@metamask/utils": "npm:^9.1.0" + "@metamask/utils": "npm:^11.0.1" readable-stream: "npm:^3.6.2" - checksum: 10/21299e30f735b56d50737739cdc711667e7862b27bf4ce6b73bfa5b9cd7763d5a3022caf1bb2786600169674ac87e7a141321752b92ddd46c12f41dd10b666ae + checksum: 10/4df2ddf068ee935b5ea29b833df243ee43e0a17ea0151bc312d4eaeec541612f7416761be2b66f316c0b12f577f0257831b83844f6b9addbaf5fe9d9c5638262 languageName: node linkType: hard -"@metamask/key-tree@npm:^9.1.2": - version: 9.1.2 - resolution: "@metamask/key-tree@npm:9.1.2" +"@metamask/key-tree@npm:^10.0.2": + version: 10.0.2 + resolution: "@metamask/key-tree@npm:10.0.2" dependencies: "@metamask/scure-bip39": "npm:^2.1.1" - "@metamask/utils": "npm:^9.0.0" + "@metamask/utils": "npm:^11.0.1" "@noble/curves": "npm:^1.2.0" "@noble/hashes": "npm:^1.3.2" "@scure/base": "npm:^1.0.0" - checksum: 10/9b178a4156b2f36bf630564dd0530c41c6356492971d2bcc8f979c79c81144945823a5b770e4097e12b89b42133b81f00c95a7b8fe9931ea1dd928989ee3c406 + checksum: 10/fd2e445c75dc3cd3976fdc38a5029ee71a6f4afcbbf5c9a17152bba70cf35df8095caa853ae62eef90a51b43f23eeb9546fc6eb7d93a099d82effe8dc7592259 languageName: node linkType: hard @@ -1477,35 +1646,35 @@ __metadata: languageName: node linkType: hard -"@metamask/permission-controller@npm:^11.0.0": - version: 11.0.2 - resolution: "@metamask/permission-controller@npm:11.0.2" +"@metamask/permission-controller@npm:^11.0.5": + version: 11.0.5 + resolution: "@metamask/permission-controller@npm:11.0.5" dependencies: - "@metamask/base-controller": "npm:^7.0.1" - "@metamask/controller-utils": "npm:^11.3.0" - "@metamask/json-rpc-engine": "npm:^9.0.3" - "@metamask/rpc-errors": "npm:^6.3.1" - "@metamask/utils": "npm:^9.1.0" + "@metamask/base-controller": "npm:^7.1.1" + "@metamask/controller-utils": "npm:^11.4.5" + "@metamask/json-rpc-engine": "npm:^10.0.2" + "@metamask/rpc-errors": "npm:^7.0.2" + "@metamask/utils": "npm:^11.0.1" "@types/deep-freeze-strict": "npm:^1.1.0" deep-freeze-strict: "npm:^1.1.1" immer: "npm:^9.0.6" - nanoid: "npm:^3.1.31" + nanoid: "npm:^3.3.8" peerDependencies: "@metamask/approval-controller": ^7.0.0 - checksum: 10/019efdfec8a919235bc5be0d93ddc35dc31c5198137836f6307ab774143fbcdb5a1d1f5292f91e1b0cce0e4787b401834b4c36e806ee68c0f630733e1c495a33 + checksum: 10/e592f5da0a2efdf17f7d7a15e0acea5000f7c40ca6b97ab295d15e59c3d7950a0ec388f927ded8ec15f04d75393ba28f8b4858ed2c1da963a92dc360451d5d9a languageName: node linkType: hard -"@metamask/providers@npm:^17.1.2": - version: 17.2.1 - resolution: "@metamask/providers@npm:17.2.1" +"@metamask/providers@npm:^18.3.1": + version: 18.3.1 + resolution: "@metamask/providers@npm:18.3.1" dependencies: - "@metamask/json-rpc-engine": "npm:^9.0.1" - "@metamask/json-rpc-middleware-stream": "npm:^8.0.1" + "@metamask/json-rpc-engine": "npm:^10.0.2" + "@metamask/json-rpc-middleware-stream": "npm:^8.0.6" "@metamask/object-multiplex": "npm:^2.0.0" - "@metamask/rpc-errors": "npm:^6.3.1" + "@metamask/rpc-errors": "npm:^7.0.2" "@metamask/safe-event-emitter": "npm:^3.1.1" - "@metamask/utils": "npm:^9.0.0" + "@metamask/utils": "npm:^11.0.1" detect-browser: "npm:^5.2.0" extension-port-stream: "npm:^4.1.0" fast-deep-equal: "npm:^3.1.3" @@ -1513,34 +1682,24 @@ __metadata: readable-stream: "npm:^3.6.2" peerDependencies: webextension-polyfill: ^0.10.0 || ^0.11.0 || ^0.12.0 - checksum: 10/ff9cbcdd4cfa410c52ae0d9d39ad9285fb21f583bcb36a8a39d1862681fe17483008c15ab0ce87797ea94cad82a2f2e58b29b1db1f02df151f9cf3b05013e8a4 - languageName: node - linkType: hard - -"@metamask/rpc-errors@npm:^6.3.1": - version: 6.4.0 - resolution: "@metamask/rpc-errors@npm:6.4.0" - dependencies: - "@metamask/utils": "npm:^9.0.0" - fast-safe-stringify: "npm:^2.0.6" - checksum: 10/9a17525aa8ce9ac142a94c04000dba7f0635e8e155c6c045f57eca36cc78c255318cca2fad4571719a427dfd2df64b70bc6442989523a8de555480668d666ad5 + checksum: 10/0e21ba9cce926a49dedbfe30fc964cd2349ee6bf9156f525fb894dcbc147a3ae480384884131a6b1a0a508989b547d8c8d2aeb3d10e11f67a8ee5230c45631a8 languageName: node linkType: hard -"@metamask/rpc-errors@npm:^7.0.1": - version: 7.0.1 - resolution: "@metamask/rpc-errors@npm:7.0.1" +"@metamask/rpc-errors@npm:^7.0.2": + version: 7.0.2 + resolution: "@metamask/rpc-errors@npm:7.0.2" dependencies: - "@metamask/utils": "npm:^10.0.0" + "@metamask/utils": "npm:^11.0.1" fast-safe-stringify: "npm:^2.0.6" - checksum: 10/819708b4a7d9695ee67fd867d8f94bb5a273b479a242b17bd53c83d1fceec421fc42928f0bb340f4f138ec803dd82ec9659ce7b09a86aedad6a81d5a39ec5c35 + checksum: 10/daf77a48b3f970585ef1f2efe3383d620fd4bffb550e8c6378b04a052f6948724a0b7e8a3e45b8b73298c70c4b9594b71fe0272664ea99620fe36e23443f8545 languageName: node linkType: hard "@metamask/safe-event-emitter@npm:^3.0.0, @metamask/safe-event-emitter@npm:^3.1.1": - version: 3.1.1 - resolution: "@metamask/safe-event-emitter@npm:3.1.1" - checksum: 10/e24db4d7c20764bfc5b025065f92518c805f0ffb1da4820078b8cff7dcae964c0f354cf053fcb7ac659de015d5ffdf21aae5e8d44e191ee8faa9066855f22653 + version: 3.1.2 + resolution: "@metamask/safe-event-emitter@npm:3.1.2" + checksum: 10/8ef7579f9317eb5c94ecf3e6abb8d13b119af274b678805eac76abe4c0667bfdf539f385e552bb973e96333b71b77aa7c787cb3fce9cd5fb4b00f1dbbabf880d languageName: node linkType: hard @@ -1554,53 +1713,53 @@ __metadata: languageName: node linkType: hard -"@metamask/slip44@npm:^4.0.0": - version: 4.0.0 - resolution: "@metamask/slip44@npm:4.0.0" - checksum: 10/3e47e8834b0fbdabe1f126fd78665767847ddc1f9ccc8defb23007dd71fcd2e4899c8ca04857491be3630668a3765bad1e40fdfca9a61ef33236d8d08e51535e +"@metamask/slip44@npm:^4.1.0": + version: 4.1.0 + resolution: "@metamask/slip44@npm:4.1.0" + checksum: 10/4265254a1800a24915bd1de15f86f196737132f9af2a084c2efc885decfc5dd87ad8f0687269d90b35e2ec64d3ea4fbff0caa793bcea6e585b1f3a290952b750 languageName: node linkType: hard -"@metamask/snaps-registry@npm:^3.2.1": - version: 3.2.1 - resolution: "@metamask/snaps-registry@npm:3.2.1" +"@metamask/snaps-registry@npm:^3.2.3": + version: 3.2.3 + resolution: "@metamask/snaps-registry@npm:3.2.3" dependencies: "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "npm:^9.0.0" + "@metamask/utils": "npm:^11.0.1" "@noble/curves": "npm:^1.2.0" "@noble/hashes": "npm:^1.3.2" - checksum: 10/b2a413f27db9b5701d3773017035ee1e153734a25363e3877f44be4a70f51c48d77ad0ac8f1e96a7d732d2079a4b259896f361b3cba1ae0bf0bbc1075406f178 + checksum: 10/37760f29b7aaa337d815cf0c11fa34af5093d87fdc60a3750c494cf8bae6293cd52da03e7694b467b79733052d75ec6e3781ab3590d7259a050784e5be347d12 languageName: node linkType: hard -"@metamask/snaps-sdk@npm:^6.9.0": - version: 6.9.0 - resolution: "@metamask/snaps-sdk@npm:6.9.0" +"@metamask/snaps-sdk@npm:^6.15.0": + version: 6.15.0 + resolution: "@metamask/snaps-sdk@npm:6.15.0" dependencies: - "@metamask/key-tree": "npm:^9.1.2" - "@metamask/providers": "npm:^17.1.2" - "@metamask/rpc-errors": "npm:^6.3.1" + "@metamask/key-tree": "npm:^10.0.2" + "@metamask/providers": "npm:^18.3.1" + "@metamask/rpc-errors": "npm:^7.0.2" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "npm:^9.2.1" - checksum: 10/ea2c34c4451f671acc6c3c0ad0d46e770e8b7d0741c1d78a30bc36b883f09a10e9a428b8b564ecd0171da95fdf78bb8ac0de261423a1b35de5d22852300a24ee + "@metamask/utils": "npm:^11.0.1" + checksum: 10/0e561a0b3ae96521efbdb7223a46e42a634f84a61f271288b5c549ccc2a974247100925d551b359bd84d76aec75529dff726176e5379f446721c48f702cf2598 languageName: node linkType: hard "@metamask/snaps-utils@npm:^8.3.0": - version: 8.4.1 - resolution: "@metamask/snaps-utils@npm:8.4.1" + version: 8.8.0 + resolution: "@metamask/snaps-utils@npm:8.8.0" dependencies: "@babel/core": "npm:^7.23.2" "@babel/types": "npm:^7.23.0" - "@metamask/base-controller": "npm:^6.0.2" - "@metamask/key-tree": "npm:^9.1.2" - "@metamask/permission-controller": "npm:^11.0.0" - "@metamask/rpc-errors": "npm:^6.3.1" - "@metamask/slip44": "npm:^4.0.0" - "@metamask/snaps-registry": "npm:^3.2.1" - "@metamask/snaps-sdk": "npm:^6.9.0" + "@metamask/base-controller": "npm:^7.0.3" + "@metamask/key-tree": "npm:^10.0.2" + "@metamask/permission-controller": "npm:^11.0.5" + "@metamask/rpc-errors": "npm:^7.0.2" + "@metamask/slip44": "npm:^4.1.0" + "@metamask/snaps-registry": "npm:^3.2.3" + "@metamask/snaps-sdk": "npm:^6.15.0" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "npm:^9.2.1" + "@metamask/utils": "npm:^11.0.1" "@noble/hashes": "npm:^1.3.1" "@scure/base": "npm:^1.1.1" chalk: "npm:^4.1.2" @@ -1613,7 +1772,7 @@ __metadata: semver: "npm:^7.5.4" ses: "npm:^1.1.0" validate-npm-package-name: "npm:^5.0.0" - checksum: 10/c68a2fe69dc835c2b996d621fd4698435475d419a85aa557aa000aae0ab7ebb68d2a52f0b28bbab94fff895ece9a94077e3910a21b16d904cff3b9419ca575b6 + checksum: 10/567354cf09dc74fe392e281e836325bfec570428dd77101935fa443bcc987bfdee6a568a572b92269639fda30a7f02ff1047ad887aed52b73709ab7a6bf1cddd languageName: node linkType: hard @@ -1624,23 +1783,6 @@ __metadata: languageName: node linkType: hard -"@metamask/utils@npm:^10.0.0": - version: 10.0.1 - resolution: "@metamask/utils@npm:10.0.1" - dependencies: - "@ethereumjs/tx": "npm:^4.2.0" - "@metamask/superstruct": "npm:^3.1.0" - "@noble/hashes": "npm:^1.3.1" - "@scure/base": "npm:^1.1.3" - "@types/debug": "npm:^4.1.7" - debug: "npm:^4.3.4" - pony-cause: "npm:^2.1.10" - semver: "npm:^7.5.4" - uuid: "npm:^9.0.1" - checksum: 10/c8e3d7578d05a1da4abb6c6712ec78ef6990801269f6529f4bb237b7d6e228d10a40738ccab81ad554f2fd51670267d086dc5be1a31c6d1f7040d4c0469d9d13 - languageName: node - linkType: hard - "@metamask/utils@npm:^11.0.1": version: 11.0.1 resolution: "@metamask/utils@npm:11.0.1" @@ -1658,23 +1800,6 @@ __metadata: languageName: node linkType: hard -"@metamask/utils@npm:^9.0.0, @metamask/utils@npm:^9.1.0, @metamask/utils@npm:^9.2.1": - version: 9.3.0 - resolution: "@metamask/utils@npm:9.3.0" - dependencies: - "@ethereumjs/tx": "npm:^4.2.0" - "@metamask/superstruct": "npm:^3.1.0" - "@noble/hashes": "npm:^1.3.1" - "@scure/base": "npm:^1.1.3" - "@types/debug": "npm:^4.1.7" - debug: "npm:^4.3.4" - pony-cause: "npm:^2.1.10" - semver: "npm:^7.5.4" - uuid: "npm:^9.0.1" - checksum: 10/ed6648cd973bbf3b4eb0e862903b795a99d27784c820e19f62f0bc0ddf353e98c2858d7e9aaebc0249a586391b344e35b9249d13c08e3ea0c74b23dc1c6b1558 - languageName: node - linkType: hard - "@mswjs/interceptors@npm:^0.37.0": version: 0.37.5 resolution: "@mswjs/interceptors@npm:0.37.5" @@ -1699,11 +1824,11 @@ __metadata: linkType: hard "@noble/curves@npm:^1.2.0": - version: 1.6.0 - resolution: "@noble/curves@npm:1.6.0" + version: 1.8.0 + resolution: "@noble/curves@npm:1.8.0" dependencies: - "@noble/hashes": "npm:1.5.0" - checksum: 10/9090b5a020b7e38c7b6d21506afaacd0c7557129d716a174334c1efc36385bf3ca6de16a543c216db58055e019c6a6c3bea8d9c0b79386e6bacff5c4c6b438a9 + "@noble/hashes": "npm:1.7.0" + checksum: 10/c54ce84cf54b8bda1a37a10dfae2e49e5b6cdf5dd98b399efa8b8a80a286b3f8f27bde53202cb308353bfd98719938991a78bed6e43f81f13b17f8181b7b82eb languageName: node linkType: hard @@ -1714,10 +1839,10 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:1.5.0, @noble/hashes@npm:^1.1.2, @noble/hashes@npm:^1.3.1, @noble/hashes@npm:^1.3.2": - version: 1.5.0 - resolution: "@noble/hashes@npm:1.5.0" - checksum: 10/da7fc7af52af7afcf59810a7eea6155075464ff462ffda2572dc6d57d53e2669b1ea2ec774e814f6273f1697e567f28d36823776c9bf7068cba2a2855140f26e +"@noble/hashes@npm:1.7.0, @noble/hashes@npm:^1.1.2, @noble/hashes@npm:^1.3.1, @noble/hashes@npm:^1.3.2": + version: 1.7.0 + resolution: "@noble/hashes@npm:1.7.0" + checksum: 10/ab038a816c8c9bb986e92797e3d9c5a5b37c020e0c3edc55bcae5061dbdd457f1f0a22787f83f4787c17415ba0282a20a1e455d36ed0cdcace4ce21ef1869f60 languageName: node linkType: hard @@ -1966,8 +2091,7 @@ __metadata: dependencies: "@arethetypeswrong/cli": "npm:^0.16.4" "@endo/eventual-send": "npm:^1.2.6" - "@endo/exo": "npm:^1.5.4" - "@endo/patterns": "npm:^1.4.4" + "@endo/marshal": "npm:^1.6.2" "@endo/promise-kit": "npm:^1.1.6" "@metamask/auto-changelog": "npm:^4.0.0" "@metamask/eslint-config": "npm:^14.0.0" @@ -1984,7 +2108,6 @@ __metadata: "@ocap/test-utils": "workspace:^" "@ocap/utils": "workspace:^" "@playwright/test": "npm:^1.49.1" - "@sqlite.org/sqlite-wasm": "npm:3.46.1-build5" "@testing-library/jest-dom": "npm:^6.6.3" "@testing-library/react": "npm:^16.1.0" "@testing-library/user-event": "npm:^14.5.2" @@ -2028,9 +2151,15 @@ __metadata: version: 0.0.0-use.local resolution: "@ocap/kernel@workspace:packages/kernel" dependencies: - "@endo/captp": "npm:^4.4.0" + "@agoric/swingset-liveslots": "npm:0.10.3-u18.0" + "@endo/errors": "npm:^1.2.8" "@endo/eventual-send": "npm:^1.2.6" + "@endo/exo": "npm:^1.5.4" + "@endo/far": "npm:^1.1.9" "@endo/import-bundle": "npm:^1.3.1" + "@endo/marshal": "npm:^1.6.2" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.4" "@endo/promise-kit": "npm:^1.1.6" "@metamask/auto-changelog": "npm:^4.0.0" "@metamask/eslint-config": "npm:^14.0.0" @@ -2044,8 +2173,10 @@ __metadata: "@ocap/streams": "workspace:^" "@ocap/test-utils": "workspace:^" "@ocap/utils": "workspace:^" + "@sqlite.org/sqlite-wasm": "npm:3.46.1-build3" "@ts-bridge/cli": "npm:^0.6.2" "@ts-bridge/shims": "npm:^0.1.1" + "@types/setimmediate": "npm:^1.0.4" "@typescript-eslint/utils": "npm:^8.8.1" "@vitest/eslint-plugin": "npm:^1.1.24" depcheck: "npm:^1.4.7" @@ -2060,6 +2191,7 @@ __metadata: prettier: "npm:^3.3.3" rimraf: "npm:^6.0.1" ses: "npm:^1.9.0" + setimmediate: "npm:^1.0.5" typescript: "npm:~5.5.4" typescript-eslint: "npm:^8.8.1" vite: "npm:^5.3.5" @@ -2071,6 +2203,7 @@ __metadata: version: 0.0.0-use.local resolution: "@ocap/monorepo@workspace:." dependencies: + "@agoric/internal": "npm:0.4.0-u18.0" "@arethetypeswrong/cli": "npm:^0.16.4" "@lavamoat/allow-scripts": "npm:^3.0.4" "@lavamoat/preinstall-always-fail": "npm:^2.0.0" @@ -2086,6 +2219,7 @@ __metadata: "@ts-bridge/shims": "npm:^0.1.1" "@types/lodash": "npm:^4.17.7" "@types/node": "npm:^22.10.1" + "@types/setimmediate": "npm:^1.0.4" "@types/webextension-polyfill": "npm:^0" "@typescript-eslint/eslint-plugin": "npm:^8.8.1" "@typescript-eslint/parser": "npm:^8.8.1" @@ -2113,6 +2247,7 @@ __metadata: prettier-plugin-packagejson: "npm:^2.5.3" rimraf: "npm:^6.0.1" semver: "npm:^7.6.3" + setimmediate: "npm:^1.0.5" simple-git-hooks: "npm:^2.11.1" tsx: "npm:^4.19.2" typedoc: "npm:^0.26.8" @@ -2132,8 +2267,6 @@ __metadata: resolution: "@ocap/nodejs@workspace:packages/nodejs" dependencies: "@arethetypeswrong/cli": "npm:^0.16.4" - "@endo/exo": "npm:^1.5.4" - "@endo/patterns": "npm:^1.4.4" "@endo/promise-kit": "npm:^1.1.6" "@metamask/auto-changelog": "npm:^4.0.0" "@metamask/eslint-config": "npm:^14.0.0" @@ -2586,145 +2719,163 @@ __metadata: languageName: node linkType: hard -"@rollup/pluginutils@npm:^4.0.0": - version: 4.2.1 - resolution: "@rollup/pluginutils@npm:4.2.1" - dependencies: - estree-walker: "npm:^2.0.1" - picomatch: "npm:^2.2.2" - checksum: 10/503a6f0a449e11a2873ac66cfdfb9a3a0b77ffa84c5cad631f5e4bc1063c850710e8d5cd5dab52477c0d66cda2ec719865726dbe753318cd640bab3fff7ca476 - languageName: node - linkType: hard - -"@rollup/pluginutils@npm:^5.1.0": - version: 5.1.2 - resolution: "@rollup/pluginutils@npm:5.1.2" +"@rollup/pluginutils@npm:^5.1.0, @rollup/pluginutils@npm:^5.1.3": + version: 5.1.4 + resolution: "@rollup/pluginutils@npm:5.1.4" dependencies: "@types/estree": "npm:^1.0.0" estree-walker: "npm:^2.0.2" - picomatch: "npm:^2.3.1" + picomatch: "npm:^4.0.2" peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - checksum: 10/cc1fe3285ab48915a6535ab2f0c90dc511bd3e63143f8e9994bb036c6c5071fd14d641cff6c89a7fde6a4faa85227d4e2cf46ee36b7d962099e0b9e4c9b8a4b0 + checksum: 10/598f628988af25541a9a6c6ef154aaf350f8be3238884e500cc0e47138684071abe490563c953f9bda9e8b113ecb1f99c11abfb9dbaf4f72cdd62e257a673fa3 languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.24.0" +"@rollup/rollup-android-arm-eabi@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.30.1" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-android-arm64@npm:4.24.0" +"@rollup/rollup-android-arm64@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-android-arm64@npm:4.30.1" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.24.0" +"@rollup/rollup-darwin-arm64@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-darwin-arm64@npm:4.30.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.24.0" +"@rollup/rollup-darwin-x64@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-darwin-x64@npm:4.30.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.24.0" +"@rollup/rollup-freebsd-arm64@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.30.1" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-freebsd-x64@npm:4.30.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.30.1" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.24.0" +"@rollup/rollup-linux-arm-musleabihf@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.30.1" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.24.0" +"@rollup/rollup-linux-arm64-gnu@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.30.1" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.24.0" +"@rollup/rollup-linux-arm64-musl@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.30.1" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.24.0" +"@rollup/rollup-linux-loongarch64-gnu@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.30.1" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.30.1" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.24.0" +"@rollup/rollup-linux-riscv64-gnu@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.30.1" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.24.0" +"@rollup/rollup-linux-s390x-gnu@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.30.1" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.24.0" +"@rollup/rollup-linux-x64-gnu@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.30.1" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.24.0" +"@rollup/rollup-linux-x64-musl@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.30.1" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.24.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.30.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.24.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.30.1" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.24.0" +"@rollup/rollup-win32-x64-msvc@npm:4.30.1": + version: 4.30.1 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.30.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@scure/base@npm:^1.0.0, @scure/base@npm:^1.1.1, @scure/base@npm:^1.1.3, @scure/base@npm:~1.1.3, @scure/base@npm:~1.1.6": +"@scure/base@npm:^1.0.0, @scure/base@npm:^1.1.1, @scure/base@npm:^1.1.3": + version: 1.2.1 + resolution: "@scure/base@npm:1.2.1" + checksum: 10/f7bdd17618ccae7a74c8cbe410a235e4adbe54aa8afe4e2fb1294338aa92f6fd04b1f1f5dea60552f638b5f5e3e74902b7baf59d3954e5e42c0a36c6baa2ebe0 + languageName: node + linkType: hard + +"@scure/base@npm:~1.1.3, @scure/base@npm:~1.1.6": version: 1.1.9 resolution: "@scure/base@npm:1.1.9" checksum: 10/f0ab7f687bbcdee2a01377fe3cd808bf63977999672751295b6a92625d5322f4754a96d40f6bd579bc367aad48ecf8a4e6d0390e70296e6ded1076f52adb16bb @@ -2759,55 +2910,73 @@ __metadata: languageName: node linkType: hard -"@shikijs/core@npm:1.22.0": - version: 1.22.0 - resolution: "@shikijs/core@npm:1.22.0" +"@shikijs/core@npm:1.27.2": + version: 1.27.2 + resolution: "@shikijs/core@npm:1.27.2" dependencies: - "@shikijs/engine-javascript": "npm:1.22.0" - "@shikijs/engine-oniguruma": "npm:1.22.0" - "@shikijs/types": "npm:1.22.0" - "@shikijs/vscode-textmate": "npm:^9.3.0" + "@shikijs/engine-javascript": "npm:1.27.2" + "@shikijs/engine-oniguruma": "npm:1.27.2" + "@shikijs/types": "npm:1.27.2" + "@shikijs/vscode-textmate": "npm:^10.0.1" "@types/hast": "npm:^3.0.4" - hast-util-to-html: "npm:^9.0.3" - checksum: 10/a9e6699e319eaaa82c6b0c166a0e22c039d716df4be7a5179c232bd25dbfc2b30b538b95ebe449ecf1fa6107675f408324f04772b99e7156041dfda69ae0dbd9 + hast-util-to-html: "npm:^9.0.4" + checksum: 10/392b4de3815fa2c2c4c0d6d8e2368473d8d603be8e55c3b68349e1ec1e7720effecffd2c6b552e70e8692ecf8af73a3dea286dbe4a4ec0ca12b7866789904930 + languageName: node + linkType: hard + +"@shikijs/engine-javascript@npm:1.27.2": + version: 1.27.2 + resolution: "@shikijs/engine-javascript@npm:1.27.2" + dependencies: + "@shikijs/types": "npm:1.27.2" + "@shikijs/vscode-textmate": "npm:^10.0.1" + oniguruma-to-es: "npm:^2.0.0" + checksum: 10/341f32daf1c4b8a980b86becf3379364e87cf93e05713539b07fe12e410a8a261d61143bac9d33af2312bc3d22abe5b8602566aa1ea98dbc034aa9c4740340ef + languageName: node + linkType: hard + +"@shikijs/engine-oniguruma@npm:1.27.2": + version: 1.27.2 + resolution: "@shikijs/engine-oniguruma@npm:1.27.2" + dependencies: + "@shikijs/types": "npm:1.27.2" + "@shikijs/vscode-textmate": "npm:^10.0.1" + checksum: 10/8c2471ae9e2a6613e4285a27059a66c36c0ae257fea273c1d6b94e9f579926a8333b5f0c84afb07a2ccf2b571c91330026717f2db078f74e98d16a190f5b8d3f languageName: node linkType: hard -"@shikijs/engine-javascript@npm:1.22.0": - version: 1.22.0 - resolution: "@shikijs/engine-javascript@npm:1.22.0" +"@shikijs/langs@npm:1.27.2": + version: 1.27.2 + resolution: "@shikijs/langs@npm:1.27.2" dependencies: - "@shikijs/types": "npm:1.22.0" - "@shikijs/vscode-textmate": "npm:^9.3.0" - oniguruma-to-js: "npm:0.4.3" - checksum: 10/bd0b75112a5fd085b50d49e84f1b3f0a599e669be10b947901cc3f0dd2d3baa0d7238b4fa356ccc570cfb9c9c0856a870e17cfdb364bfac77c498a39b96b2bbd + "@shikijs/types": "npm:1.27.2" + checksum: 10/9e671723769dfc1568be2027ae0243c26ee8e17cc57fabce09a6f645dfb7c3565f8fb82a9918a617ef00b7e8f07600a3fe9516edc7d0b6419e9186adbc741973 languageName: node linkType: hard -"@shikijs/engine-oniguruma@npm:1.22.0": - version: 1.22.0 - resolution: "@shikijs/engine-oniguruma@npm:1.22.0" +"@shikijs/themes@npm:1.27.2": + version: 1.27.2 + resolution: "@shikijs/themes@npm:1.27.2" dependencies: - "@shikijs/types": "npm:1.22.0" - "@shikijs/vscode-textmate": "npm:^9.3.0" - checksum: 10/5dca4f84f77536b0f1cfc0c0280e9fa4d316d93bf089ad337c6953e38fbafcd5c98a2eea6429c8a59920c5bb3fa696ed2ba682ed550c97e74d57a3aa1b3b0cce + "@shikijs/types": "npm:1.27.2" + checksum: 10/d8ebd2cb3083bc8609d7019f3105e874312e7f8b63cd83b60ab5ea596bfcaea6ddda73d43007d52a417acc5e3cac910ec32005a8bdcae9af5204db15ebf54bd0 languageName: node linkType: hard -"@shikijs/types@npm:1.22.0": - version: 1.22.0 - resolution: "@shikijs/types@npm:1.22.0" +"@shikijs/types@npm:1.27.2": + version: 1.27.2 + resolution: "@shikijs/types@npm:1.27.2" dependencies: - "@shikijs/vscode-textmate": "npm:^9.3.0" + "@shikijs/vscode-textmate": "npm:^10.0.1" "@types/hast": "npm:^3.0.4" - checksum: 10/5313d7bad18820e3887460d0cf506ca265b752fdc826ee962a653385040df7ea12e785a0bb4233335ca2ccc9a0d51d57e97fe8e90543ab704ce507437dbeb225 + checksum: 10/fd225a88ba21c76c6638507f03f314a2a8c441e139febc3d7ef1262a00f4b5751598d61f2bdb5f509275ad2d389346d190edc0f89e21045c79f8312c6620cef2 languageName: node linkType: hard -"@shikijs/vscode-textmate@npm:^9.3.0": - version: 9.3.0 - resolution: "@shikijs/vscode-textmate@npm:9.3.0" - checksum: 10/4cd3400976559de75a8c96d49b373b8113ec986dd69baaf12d49efde6d9cc88861189b05ee016ce9016803a9cc3bbac4917193088088834d9c6155f43d452d13 +"@shikijs/vscode-textmate@npm:^10.0.1": + version: 10.0.1 + resolution: "@shikijs/vscode-textmate@npm:10.0.1" + checksum: 10/8bb005efbf472a9cac19bb5fb0bb1a2b612e128122e5a9d7b2bb2af674c29912db0e59c547ec458e5333f8f7ac7a8f054a24cb653f11dc20951e299933b416e4 languageName: node linkType: hard @@ -2844,12 +3013,12 @@ __metadata: languageName: node linkType: hard -"@sqlite.org/sqlite-wasm@npm:3.46.1-build5": - version: 3.46.1-build5 - resolution: "@sqlite.org/sqlite-wasm@npm:3.46.1-build5" +"@sqlite.org/sqlite-wasm@npm:3.46.1-build3": + version: 3.46.1-build3 + resolution: "@sqlite.org/sqlite-wasm@npm:3.46.1-build3" bin: sqlite-wasm: bin/index.js - checksum: 10/ff11cb0e84307dcad8538163da0e5e97f712c9889202c280692d8d44e7f11286df4d464f100a154ca09a4520ed826ea6e66349ed8cc3a336651cc65eb3daabca + checksum: 10/a64225fd784ed2ee8c8bf82f042d05b567b4707fba22a9508fbe3ac42cf1cf7e722d2ede0e1d91556bfec66b140aeb3cf3967546249693f39cc81475d7be90ff languageName: node linkType: hard @@ -2885,8 +3054,8 @@ __metadata: linkType: hard "@testing-library/react@npm:^16.1.0": - version: 16.1.0 - resolution: "@testing-library/react@npm:16.1.0" + version: 16.2.0 + resolution: "@testing-library/react@npm:16.2.0" dependencies: "@babel/runtime": "npm:^7.12.5" peerDependencies: @@ -2900,16 +3069,16 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/2a20e0dbfadbc93d45a84e82281ed47deed54a6a5fc1461a523172d7fbc0481e8502cf98a2080f38aba94290b3d745671a1c9e320e6f76ad6afcca67c580b963 + checksum: 10/cf10bfa9a363384e6861417696fff4a464a64f98ec6f0bb7f1fa7cbb550d075d23a2f6a943b7df85dded7bde3234f6ea6b6e36f95211f4544b846ea72c288289 languageName: node linkType: hard "@testing-library/user-event@npm:^14.5.2": - version: 14.5.2 - resolution: "@testing-library/user-event@npm:14.5.2" + version: 14.6.0 + resolution: "@testing-library/user-event@npm:14.6.0" peerDependencies: "@testing-library/dom": ">=7.21.4" - checksum: 10/49821459d81c6bc435d97128d6386ca24f1e4b3ba8e46cb5a96fe3643efa6e002d88c1b02b7f2ec58da593e805c59b78d7fdf0db565c1f02ba782f63ee984040 + checksum: 10/01a7481642ceda10324ff5356e3cfd9c6131b0cecbcbdd5938096d4d3f8ce9e548e9b460ef35bad8f3649dc392c808044a5abd78de8218a4bc21c91125be85df languageName: node linkType: hard @@ -3043,6 +3212,13 @@ __metadata: languageName: node linkType: hard +"@types/doctrine@npm:^0.0.9": + version: 0.0.9 + resolution: "@types/doctrine@npm:0.0.9" + checksum: 10/64ef06e6eea2f4f9684d259fedbcb8bf21c954630b96ea2e04875ca42763552b0ba3b01b3dd27ec0f9ea6f8b3b0dba4965d31d5a925cd4c6225fd13a93ae9354 + languageName: node + linkType: hard + "@types/estree@npm:*, @types/estree@npm:1.0.6, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": version: 1.0.6 resolution: "@types/estree@npm:1.0.6" @@ -3097,9 +3273,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.17.7": - version: 4.17.10 - resolution: "@types/lodash@npm:4.17.10" - checksum: 10/10fe24a93adc6048cb23e4135c1ed1d52cc39033682e6513f4f51b74a9af6d7a24fbea92203c22dc4e01e35f1ab3aa0fd0a2b487e8a4a2bbdf1fc05970094066 + version: 4.17.14 + resolution: "@types/lodash@npm:4.17.14" + checksum: 10/6ee40725f3e192f5ef1f493caca19210aa7acd7adc3136b8dba84d418a35be0abea0668105aed9f696ad62a54310a9c0d328971ad4b157f5bcda700424ed5aae languageName: node linkType: hard @@ -3127,11 +3303,11 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:^22.10.1": - version: 22.10.1 - resolution: "@types/node@npm:22.10.1" + version: 22.10.7 + resolution: "@types/node@npm:22.10.7" dependencies: undici-types: "npm:~6.20.0" - checksum: 10/c802a526da2f3fa3ccefd00a71244e7cb825329951719e79e8fec62b1dbc2855388c830489770611584665ce10be23c05ed585982038b24924e1ba2c2cce03fd + checksum: 10/64cde1c2f5e5f7d597d3bd462f52c3c2d688a66623eb75d25e1d1d63d384ef553a27100635ad0dbb7d74da517048aa636947863eb624cf85f25d2f22370ce474 languageName: node linkType: hard @@ -3177,12 +3353,12 @@ __metadata: linkType: hard "@types/react@npm:^18.3.1": - version: 18.3.16 - resolution: "@types/react@npm:18.3.16" + version: 18.3.18 + resolution: "@types/react@npm:18.3.18" dependencies: "@types/prop-types": "npm:*" csstype: "npm:^3.0.2" - checksum: 10/971b4f46af9aeda85326000ba4a78973db6a1f11e10665c014e1274a68ae801469f057b56d850512694cf04a69cc264c07e6a507b4613874e8bf6ab4df7904f1 + checksum: 10/7fdd8b853e0d291d4138133f93f8d5c333da918e5804afcea61a923aab4bdfc9bb15eb21a5640959b452972b8715ddf10ffb12b3bd071898b9e37738636463f2 languageName: node linkType: hard @@ -3204,6 +3380,13 @@ __metadata: languageName: node linkType: hard +"@types/setimmediate@npm:^1.0.4": + version: 1.0.4 + resolution: "@types/setimmediate@npm:1.0.4" + checksum: 10/7edf9938b3587fe4797264070db2e19b30547612726f018083c80bc5498fe0b92e7b8b65add5073638de67c8172befa4a8ca38f0d9e0b35e20beb667327917d0 + languageName: node + linkType: hard + "@types/statuses@npm:^2.0.4": version: 2.0.5 resolution: "@types/statuses@npm:2.0.5" @@ -3248,102 +3431,81 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.9.0, @typescript-eslint/eslint-plugin@npm:^8.8.1": - version: 8.9.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.9.0" +"@typescript-eslint/eslint-plugin@npm:8.20.0, @typescript-eslint/eslint-plugin@npm:^8.8.1": + version: 8.20.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.20.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.9.0" - "@typescript-eslint/type-utils": "npm:8.9.0" - "@typescript-eslint/utils": "npm:8.9.0" - "@typescript-eslint/visitor-keys": "npm:8.9.0" + "@typescript-eslint/scope-manager": "npm:8.20.0" + "@typescript-eslint/type-utils": "npm:8.20.0" + "@typescript-eslint/utils": "npm:8.20.0" + "@typescript-eslint/visitor-keys": "npm:8.20.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" - ts-api-utils: "npm:^1.3.0" + ts-api-utils: "npm:^2.0.0" peerDependencies: "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/c1858656d7ab3d37674759c838422d8a1b7540e54a25c67c7508c38ee76594a98e8f1f269749f08700f93a7a425e0dca6eb6d031b36539c537e10a32edb4975c + typescript: ">=4.8.4 <5.8.0" + checksum: 10/9f027dc0eb7b4b0afed41a6f16a731321fb45b621722ddc68d6c87c708021f10cb84efbb6bacc75c91e60a7619c9957bc9ed557bfb5925900b866ef7d6d6b8a2 languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.9.0, @typescript-eslint/parser@npm:^8.8.1": - version: 8.9.0 - resolution: "@typescript-eslint/parser@npm:8.9.0" +"@typescript-eslint/parser@npm:8.20.0, @typescript-eslint/parser@npm:^8.8.1": + version: 8.20.0 + resolution: "@typescript-eslint/parser@npm:8.20.0" dependencies: - "@typescript-eslint/scope-manager": "npm:8.9.0" - "@typescript-eslint/types": "npm:8.9.0" - "@typescript-eslint/typescript-estree": "npm:8.9.0" - "@typescript-eslint/visitor-keys": "npm:8.9.0" + "@typescript-eslint/scope-manager": "npm:8.20.0" + "@typescript-eslint/types": "npm:8.20.0" + "@typescript-eslint/typescript-estree": "npm:8.20.0" + "@typescript-eslint/visitor-keys": "npm:8.20.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/6f73af7782856b292b37e43dde83c5babbbdae28da1a4fed764474a9ccbbfcce25903cedde82d6847ad53e0c1a7c2ed53f087b281e6f1408a064498169c0e2d1 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:8.19.1": - version: 8.19.1 - resolution: "@typescript-eslint/scope-manager@npm:8.19.1" - dependencies: - "@typescript-eslint/types": "npm:8.19.1" - "@typescript-eslint/visitor-keys": "npm:8.19.1" - checksum: 10/6ffc78b15367f211eb6650459ca2bb6bfe4c1fa95a3474adc08ee9a20c250b2e0e02fd99be36bd3dad74967ecd9349e792b5d818d85735cba40f1b5c236074d1 + typescript: ">=4.8.4 <5.8.0" + checksum: 10/52960498961d0927e9dc60f724e9df6445357db06133a7c00cc840823d92c8dd9f0b47cebc026aef12c316748732e5c04ca61861db05d2264cf53ab88fdb34e9 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.9.0": - version: 8.9.0 - resolution: "@typescript-eslint/scope-manager@npm:8.9.0" +"@typescript-eslint/scope-manager@npm:8.20.0, @typescript-eslint/scope-manager@npm:^8.1.0": + version: 8.20.0 + resolution: "@typescript-eslint/scope-manager@npm:8.20.0" dependencies: - "@typescript-eslint/types": "npm:8.9.0" - "@typescript-eslint/visitor-keys": "npm:8.9.0" - checksum: 10/44dfb640113e8be2f5d25034f5657a9609ee06082b817dc24116c5e1d7a708ca31e8eedcc47f7d309def2ce63be662d1d0a37a1c7bdc7345968a31d04c0a2377 + "@typescript-eslint/types": "npm:8.20.0" + "@typescript-eslint/visitor-keys": "npm:8.20.0" + checksum: 10/0ea30ba12007d77659b43bbbec463c142d3d4d36f7de381d1f59a97f95240203e79dd9a24040be7113eb4c8bd231339f9322d9a40e1a1fb178e9ac52d9c559ab languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.9.0": - version: 8.9.0 - resolution: "@typescript-eslint/type-utils@npm:8.9.0" +"@typescript-eslint/type-utils@npm:8.20.0": + version: 8.20.0 + resolution: "@typescript-eslint/type-utils@npm:8.20.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.9.0" - "@typescript-eslint/utils": "npm:8.9.0" + "@typescript-eslint/typescript-estree": "npm:8.20.0" + "@typescript-eslint/utils": "npm:8.20.0" debug: "npm:^4.3.4" - ts-api-utils: "npm:^1.3.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/aaeb465ed57d140bc0d9a8b81a474eff5d1c63d99479828b4eb83a1a626dcb2b1377052a971be5b4d094d6adcf1cf8e33c41ee13369bd71aed0f9cd9f3528c8a - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:8.19.1": - version: 8.19.1 - resolution: "@typescript-eslint/types@npm:8.19.1" - checksum: 10/5833a5f8fdac4a490dd3906a0243a0713fbf138fabb451870c70b0b089c539a9624b467b0913ddc0a225a8284342e7fd31cd506dec53c1a6d8f3c8c8902b9cae + ts-api-utils: "npm:^2.0.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10/cdde9d30e684c0c44434ed97e11c962d8f80f53b8a0050e8fe10b7f20c26f7684a340acd21c83bdcbc1feb3eef334eb5b0fef31d2d330648e52d4afe57942a95 languageName: node linkType: hard -"@typescript-eslint/types@npm:8.9.0": - version: 8.9.0 - resolution: "@typescript-eslint/types@npm:8.9.0" - checksum: 10/4d087153605ec23c980f9bc807b122edefff828e0c3b52ef531f4b8e1d30078c39f95e84019370a395bf97eed0d7886cc50b8cd545c287f8a2a21b301272377a +"@typescript-eslint/types@npm:8.20.0": + version: 8.20.0 + resolution: "@typescript-eslint/types@npm:8.20.0" + checksum: 10/434859226136ea9e439e8abf5dcf813ea3b55b7e4af6ecc8d290a2f925e3baad0579765ac32d21005b0caedaac38b8624131f87b572c84ca92ac3e742a52e149 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.19.1": - version: 8.19.1 - resolution: "@typescript-eslint/typescript-estree@npm:8.19.1" +"@typescript-eslint/typescript-estree@npm:8.20.0": + version: 8.20.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.20.0" dependencies: - "@typescript-eslint/types": "npm:8.19.1" - "@typescript-eslint/visitor-keys": "npm:8.19.1" + "@typescript-eslint/types": "npm:8.20.0" + "@typescript-eslint/visitor-keys": "npm:8.20.0" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -3352,91 +3514,48 @@ __metadata: ts-api-utils: "npm:^2.0.0" peerDependencies: typescript: ">=4.8.4 <5.8.0" - checksum: 10/5de467452d5ef1a380d441b06cd0134652a0c98cdb4ce31b93eb589f7dc75ef60364d03fd80ca0a48d0c8b268f7258d4f6528b16fe1b89442d60a4bc960fe5f5 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:8.9.0": - version: 8.9.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.9.0" - dependencies: - "@typescript-eslint/types": "npm:8.9.0" - "@typescript-eslint/visitor-keys": "npm:8.9.0" - debug: "npm:^4.3.4" - fast-glob: "npm:^3.3.2" - is-glob: "npm:^4.0.3" - minimatch: "npm:^9.0.4" - semver: "npm:^7.6.0" - ts-api-utils: "npm:^1.3.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/855b433f24fad5d6791c16510d035ded31ccfd17235b45f4dcb7fa89ed57268e4bf4bf79311c5323037e6243da506b2edcb113aa51339291efb344b6d8035b1a + checksum: 10/8dbb1b835492574b4c8765c64964179e258f811d3f4cd7f6a90e1cb297520090728f77366cfb05233c26f4c07b1f2be990fa3f54eae9e7abc218005d51ee6804 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.9.0": - version: 8.9.0 - resolution: "@typescript-eslint/utils@npm:8.9.0" +"@typescript-eslint/utils@npm:8.20.0, @typescript-eslint/utils@npm:^8.1.0, @typescript-eslint/utils@npm:^8.8.1": + version: 8.20.0 + resolution: "@typescript-eslint/utils@npm:8.20.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.9.0" - "@typescript-eslint/types": "npm:8.9.0" - "@typescript-eslint/typescript-estree": "npm:8.9.0" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - checksum: 10/84efd10d6aa212103615cf52211a79f1ca02dc4fbf2dbb3a8d2aa49cd19f582b04c219ee98ed1ab77a503f967d82ce56521b1663359ff3e7faaa1f8798c19697 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:^8.1.0, @typescript-eslint/utils@npm:^8.8.1": - version: 8.19.1 - resolution: "@typescript-eslint/utils@npm:8.19.1" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.19.1" - "@typescript-eslint/types": "npm:8.19.1" - "@typescript-eslint/typescript-estree": "npm:8.19.1" + "@typescript-eslint/scope-manager": "npm:8.20.0" + "@typescript-eslint/types": "npm:8.20.0" + "@typescript-eslint/typescript-estree": "npm:8.20.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10/bb92116a53fe143ee87e830941afb21d4222a64ca3f2b6dac5c2d9984f981408e60e52b04c32d95208896075ac222fb4ee631c5b0c4826b87d4bd8091c421ab1 + checksum: 10/d4369f3e535d5c75eedce2b8f4ea1e857b75ac2ea73f2c707ba3fa3533053f63d8c22f085e58573a2d035d61ed69f6fef4ba0bc7c7df173d26b3adce73bf6aed languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.19.1": - version: 8.19.1 - resolution: "@typescript-eslint/visitor-keys@npm:8.19.1" +"@typescript-eslint/visitor-keys@npm:8.20.0": + version: 8.20.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.20.0" dependencies: - "@typescript-eslint/types": "npm:8.19.1" + "@typescript-eslint/types": "npm:8.20.0" eslint-visitor-keys: "npm:^4.2.0" - checksum: 10/510eb196e7b7d59d3981d672a75454615159e931fe78e2a64b09607c3cfa45110709b0eb5ac3dd271d757a0d98cf4868ad2f45bf9193f96e9efec3efa92a19c1 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:8.9.0": - version: 8.9.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.9.0" - dependencies: - "@typescript-eslint/types": "npm:8.9.0" - eslint-visitor-keys: "npm:^3.4.3" - checksum: 10/809097884b8c706f549d99bafa3e0958bd893b3deb190297110f2f1f9360e12064335c8f2df68f39be7d744d2032b5eb57b710c9671eb38f793877ab9364c731 + checksum: 10/31f32efb975a10cb1b0028a6d0f47b65acb322ed446f93862e39a3a0d5b55a2354ab0f062794fb148f45c8ce09fb93878d8a101a72d09d4a06ffa2f0d163d65f languageName: node linkType: hard "@ungap/structured-clone@npm:^1.0.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 10/c6fe89a505e513a7592e1438280db1c075764793a2397877ff1351721fe8792a966a5359769e30242b3cd023f2efb9e63ca2ca88019d73b564488cc20e3eab12 + version: 1.2.1 + resolution: "@ungap/structured-clone@npm:1.2.1" + checksum: 10/6770f71e8183311b2871601ddb02d62a26373be7cf2950cb546a345a2305c75b502e36ce80166120aa2f5f1ea1562141684651ebbfcc711c58acd32035d3e545 languageName: node linkType: hard "@vercel/nft@npm:^0.27.5": - version: 0.27.6 - resolution: "@vercel/nft@npm:0.27.6" + version: 0.27.10 + resolution: "@vercel/nft@npm:0.27.10" dependencies: - "@mapbox/node-pre-gyp": "npm:^1.0.11" - "@rollup/pluginutils": "npm:^4.0.0" + "@mapbox/node-pre-gyp": "npm:^2.0.0-rc.0" + "@rollup/pluginutils": "npm:^5.1.3" acorn: "npm:^8.6.0" acorn-import-attributes: "npm:^1.9.5" async-sema: "npm:^3.1.1" @@ -3444,12 +3563,12 @@ __metadata: estree-walker: "npm:2.0.2" glob: "npm:^7.1.3" graceful-fs: "npm:^4.2.9" - micromatch: "npm:^4.0.8" node-gyp-build: "npm:^4.2.2" + picomatch: "npm:^4.0.2" resolve-from: "npm:^5.0.0" bin: nft: out/cli.js - checksum: 10/f95c2c60cbf6001417db302f8cc8cf8c15beba22db2551c13a53b835bd31c5591f2d25643bbd014a69c39d0bad2ef191249e0f56d2dc15c194009f7de4f58f1e + checksum: 10/237f769bb888f528fbbe767e0dddd9aa5f2251540dd92c7c3d00bd6cf44cb992745fa8f75cdcad67d89f8a54335e5a6c8dc5973aac18312703dba62cccb97895 languageName: node linkType: hard @@ -3517,8 +3636,8 @@ __metadata: linkType: hard "@vitest/eslint-plugin@npm:^1.1.24": - version: 1.1.24 - resolution: "@vitest/eslint-plugin@npm:1.1.24" + version: 1.1.25 + resolution: "@vitest/eslint-plugin@npm:1.1.25" peerDependencies: "@typescript-eslint/utils": ">= 8.0" eslint: ">= 8.57.0" @@ -3529,7 +3648,7 @@ __metadata: optional: true vitest: optional: true - checksum: 10/2406cdfef6967495f57941c22806ad5aa768ea48734913dbe1a48c567fcaa334e00a9996e6a84bd37d29c684e56d774b34af79bc006235b522a546cb6470c5ba + checksum: 10/4ffad605c900996756448b3ff2b4de02698fef8566d8adb9a620bd9e93fafa53c1a8772680c070b4e9296cdd35486a3bdc7ceeb12981ea73deca2b6303f27a27 languageName: node linkType: hard @@ -3614,60 +3733,60 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-core@npm:3.5.12": - version: 3.5.12 - resolution: "@vue/compiler-core@npm:3.5.12" +"@vue/compiler-core@npm:3.5.13": + version: 3.5.13 + resolution: "@vue/compiler-core@npm:3.5.13" dependencies: "@babel/parser": "npm:^7.25.3" - "@vue/shared": "npm:3.5.12" + "@vue/shared": "npm:3.5.13" entities: "npm:^4.5.0" estree-walker: "npm:^2.0.2" source-map-js: "npm:^1.2.0" - checksum: 10/287ca30a8e018f438775cdb93fca191e841e359c646a89a0788237e2af2840b04e6fcea8aea00f09b81ca96c16bcab00a53124916d07fb5c1c598dba4a6c560b + checksum: 10/22f042bb47c8a1edb9d602e24da8092ab542d5640f0459a9b99ecf35f90e96678f870209dd30f774f5340c6d817d3c5a46ca49cefb9659ee5b228bd42d1f076a languageName: node linkType: hard -"@vue/compiler-dom@npm:3.5.12": - version: 3.5.12 - resolution: "@vue/compiler-dom@npm:3.5.12" +"@vue/compiler-dom@npm:3.5.13": + version: 3.5.13 + resolution: "@vue/compiler-dom@npm:3.5.13" dependencies: - "@vue/compiler-core": "npm:3.5.12" - "@vue/shared": "npm:3.5.12" - checksum: 10/7578e7e729f44fd0903cd468255d1d50fe9774073a7f5cb0a5bf4352495712454e3b698abe5b29829cf1b56267162f7e73397979e4dcc472e855192cb2c96008 + "@vue/compiler-core": "npm:3.5.13" + "@vue/shared": "npm:3.5.13" + checksum: 10/5dc628c52091264a443c2d7326b759d7d3999c7e9c00078c2eb370b778e60b9f2ef258a8decf2fd97c8fa0923f895d449eabc1e5bc3d8a45d3ef99c9eb0599d7 languageName: node linkType: hard "@vue/compiler-sfc@npm:^3.3.4": - version: 3.5.12 - resolution: "@vue/compiler-sfc@npm:3.5.12" + version: 3.5.13 + resolution: "@vue/compiler-sfc@npm:3.5.13" dependencies: "@babel/parser": "npm:^7.25.3" - "@vue/compiler-core": "npm:3.5.12" - "@vue/compiler-dom": "npm:3.5.12" - "@vue/compiler-ssr": "npm:3.5.12" - "@vue/shared": "npm:3.5.12" + "@vue/compiler-core": "npm:3.5.13" + "@vue/compiler-dom": "npm:3.5.13" + "@vue/compiler-ssr": "npm:3.5.13" + "@vue/shared": "npm:3.5.13" estree-walker: "npm:^2.0.2" magic-string: "npm:^0.30.11" - postcss: "npm:^8.4.47" + postcss: "npm:^8.4.48" source-map-js: "npm:^1.2.0" - checksum: 10/5b2fdbbf381dc684054bcfb7b0945154de658b56b618b2e1637abecd47e070976848a0bfcb2fa0698bab077f0d79ba638f2ec1d180652ca160352c72cf7e6fb3 + checksum: 10/08d55bbdbe86ad0a1fc0501dbf5f535161d35ecb378adb478dd4a75b97e8d21852516966c0ad8aed1d6da11b0d8280b7848ff142b4181cb8f24eaaecd7827f73 languageName: node linkType: hard -"@vue/compiler-ssr@npm:3.5.12": - version: 3.5.12 - resolution: "@vue/compiler-ssr@npm:3.5.12" +"@vue/compiler-ssr@npm:3.5.13": + version: 3.5.13 + resolution: "@vue/compiler-ssr@npm:3.5.13" dependencies: - "@vue/compiler-dom": "npm:3.5.12" - "@vue/shared": "npm:3.5.12" - checksum: 10/25b11070503f5380341d37889aa8729987f3884cdda3a01c95323ee41a00f233c6dd7439618b2389dcaa339341776e7bd21780e3416c1ec1fddee45f13f254a7 + "@vue/compiler-dom": "npm:3.5.13" + "@vue/shared": "npm:3.5.13" + checksum: 10/09f2706455a7d8a5acc67c98120d28d0105d006184402b045636be7791939f5a77fd1c37657047b0129fa431f03437dcab9befc6baa172367ecdef7618407149 languageName: node linkType: hard -"@vue/shared@npm:3.5.12": - version: 3.5.12 - resolution: "@vue/shared@npm:3.5.12" - checksum: 10/abe229a09a9513f484a03a8c0e63b90949d9fccf64203c1ad510628305e1fdc0e9d064174df88299409a9fbf0c142e4fbcc0a5449f10728fb12d7e10d825abc5 +"@vue/shared@npm:3.5.13": + version: 3.5.13 + resolution: "@vue/shared@npm:3.5.13" + checksum: 10/5c0c24f443533392dde08c3e4272ff2e19af9762f90baeaa808850e05106537bbd9e2d2ad2081d979b8c4bc89902395b46036b67f74c60b76025924de37833b1 languageName: node linkType: hard @@ -3680,13 +3799,6 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:1": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: 10/2d882941183c66aa665118bafdab82b7a177e9add5eb2776c33e960a4f3c89cff88a1b38aba13a456de01d0dd9d66a8bea7c903268b21ea91dd1097e1e2e8243 - languageName: node - linkType: hard - "abbrev@npm:^2.0.0": version: 2.0.0 resolution: "abbrev@npm:2.0.0" @@ -3739,21 +3851,10 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:6": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" - dependencies: - debug: "npm:4" - checksum: 10/21fb903e0917e5cb16591b4d0ef6a028a54b83ac30cd1fca58dece3d4e0990512a8723f9f83130d88a41e2af8b1f7be1386fda3ea2d181bb1a62155e75e95e23 - languageName: node - linkType: hard - -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: "npm:^4.3.4" - checksum: 10/c478fec8f79953f118704d007a38f2a185458853f5c45579b9669372bd0e12602e88dc2ad0233077831504f7cd6fcc8251c383375bba5eaaf563b102938bda26 +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.3 + resolution: "agent-base@npm:7.1.3" + checksum: 10/3db6d8d4651f2aa1a9e4af35b96ab11a7607af57a24f3bc721a387eaa3b5f674e901f0a648b0caefd48f3fd117c7761b79a3b55854e2aebaa96c3f32cf76af84 languageName: node linkType: hard @@ -3804,7 +3905,7 @@ __metadata: languageName: node linkType: hard -"ansi-regex@npm:^6.0.1": +"ansi-regex@npm:^6.0.1, ansi-regex@npm:^6.1.0": version: 6.1.0 resolution: "ansi-regex@npm:6.1.0" checksum: 10/495834a53b0856c02acd40446f7130cb0f8284f4a39afdab20d5dc42b2e198b1196119fe887beed8f9055c4ff2055e3b2f6d4641d0be018cdfb64fedf6fc1aac @@ -3841,6 +3942,13 @@ __metadata: languageName: node linkType: hard +"anylogger@npm:^0.21.0": + version: 0.21.0 + resolution: "anylogger@npm:0.21.0" + checksum: 10/6797fbc0014723688d2786df27efbbf554d0fd6a4dbb77ecd445fbb282e57f5a10478dac7218b928b3b2e7c68b668fcdb24496c98cd66b374c40564b82dfd55e + languageName: node + linkType: hard + "anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" @@ -3858,13 +3966,6 @@ __metadata: languageName: node linkType: hard -"aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 10/c2b9a631298e8d6f3797547e866db642f68493808f5b37cd61da778d5f6ada890d16f668285f7d60bd4fc3b03889bd590ffe62cf81b700e9bb353431238a0a7b - languageName: node - linkType: hard - "are-docs-informative@npm:^0.0.2": version: 0.0.2 resolution: "are-docs-informative@npm:0.0.2" @@ -3872,16 +3973,6 @@ __metadata: languageName: node linkType: hard -"are-we-there-yet@npm:^2.0.0": - version: 2.0.0 - resolution: "are-we-there-yet@npm:2.0.0" - dependencies: - delegates: "npm:^1.0.0" - readable-stream: "npm:^3.6.0" - checksum: 10/ea6f47d14fc33ae9cbea3e686eeca021d9d7b9db83a306010dd04ad5f2c8b7675291b127d3fcbfcbd8fec26e47b3324ad5b469a6cc3733a582f2fe4e12fc6756 - languageName: node - linkType: hard - "argparse@npm:^1.0.7": version: 1.0.10 resolution: "argparse@npm:1.0.10" @@ -3974,14 +4065,14 @@ __metadata: linkType: hard "array.prototype.flat@npm:^1.3.1": - version: 1.3.2 - resolution: "array.prototype.flat@npm:1.3.2" + version: 1.3.3 + resolution: "array.prototype.flat@npm:1.3.3" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - checksum: 10/d9d2f6f27584de92ec7995bc931103e6de722cd2498bdbfc4cba814fc3e52f056050a93be883018811f7c0a35875f5056584a0e940603a5e5934f0279896aebe + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10/f9b992fa0775d8f7c97abc91eb7f7b2f0ed8430dd9aeb9fdc2967ac4760cdd7fc2ef7ead6528fef40c7261e4d790e117808ce0d3e7e89e91514d4963a531cd01 languageName: node linkType: hard @@ -4146,13 +4237,20 @@ __metadata: linkType: hard "better-sqlite3@npm:^11.7.2": - version: 11.7.2 - resolution: "better-sqlite3@npm:11.7.2" + version: 11.8.0 + resolution: "better-sqlite3@npm:11.8.0" dependencies: bindings: "npm:^1.5.0" node-gyp: "npm:latest" prebuild-install: "npm:^7.1.1" - checksum: 10/49e1d8847560058d00c87177dfa6ef6bf713cb0122795c8f43143ac3154608f2ff83d4180ab00c7c24f5c23f0bcfe96bb47ac08b3ef5081ed41f46869df594f6 + checksum: 10/701665395ae89d1230cedda89fed8cd653a667bf0ecd6117399b568625c411fb925848e9cbe22b64c56d7b5282c2aed7c2dac0e1a845b71a2d8dd6aad8497440 + languageName: node + linkType: hard + +"bignumber.js@npm:^9.1.2": + version: 9.1.2 + resolution: "bignumber.js@npm:9.1.2" + checksum: 10/d89b8800a987225d2c00dcbf8a69dc08e92aa0880157c851c287b307d31ceb2fc2acb0c62c3e3a3d42b6c5fcae9b004035f13eb4386e56d529d7edac18d5c9d8 languageName: node linkType: hard @@ -4245,16 +4343,16 @@ __metadata: linkType: hard "browserslist@npm:^4.24.0": - version: 4.24.0 - resolution: "browserslist@npm:4.24.0" + version: 4.24.4 + resolution: "browserslist@npm:4.24.4" dependencies: - caniuse-lite: "npm:^1.0.30001663" - electron-to-chromium: "npm:^1.5.28" - node-releases: "npm:^2.0.18" - update-browserslist-db: "npm:^1.1.0" + caniuse-lite: "npm:^1.0.30001688" + electron-to-chromium: "npm:^1.5.73" + node-releases: "npm:^2.0.19" + update-browserslist-db: "npm:^1.1.1" bin: browserslist: cli.js - checksum: 10/26c1b8ba257a0b51b102080ba9d42945af2abaa8c4cf6da21cd47b3f123fc1e81640203b293214356c2c17d9d265bb3a5ed428b6d302f383576dd6ce8fd5036c + checksum: 10/11fda105e803d891311a21a1f962d83599319165faf471c2d70e045dff82a12128f5b50b1fcba665a2352ad66147aaa248a9d2355a80aadc3f53375eb3de2e48 languageName: node linkType: hard @@ -4349,7 +4447,7 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.2, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": +"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": version: 1.0.8 resolution: "call-bind@npm:1.0.8" dependencies: @@ -4399,10 +4497,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001663": - version: 1.0.30001668 - resolution: "caniuse-lite@npm:1.0.30001668" - checksum: 10/4a14acbc999a855e6a91a3ae4ca670f202ceabb4b0e75f8eaef153fafe33ae5ea0de7ac99c078d6b724c8f60b14b1ea24d7c544398e5fd077c418e3f029559ff +"caniuse-lite@npm:^1.0.30001688": + version: 1.0.30001692 + resolution: "caniuse-lite@npm:1.0.30001692" + checksum: 10/92449ec9e9ac6cd8ce7ecc18a8759ae34e4b3ef412acd998714ee9d70dc286bc8d0d6e4917fa454798da9b37667eb5b3b41386bc9d25e4274d0b9c7af8339b0e languageName: node linkType: hard @@ -4455,10 +4553,10 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^5.3.0, chalk@npm:~5.3.0": - version: 5.3.0 - resolution: "chalk@npm:5.3.0" - checksum: 10/6373caaab21bd64c405bfc4bd9672b145647fc9482657b5ea1d549b3b2765054e9d3d928870cdf764fb4aad67555f5061538ff247b8310f110c5c888d92397ea +"chalk@npm:^5.3.0, chalk@npm:~5.4.1": + version: 5.4.1 + resolution: "chalk@npm:5.4.1" + checksum: 10/29df3ffcdf25656fed6e95962e2ef86d14dfe03cd50e7074b06bad9ffbbf6089adbb40f75c00744d843685c8d008adaf3aed31476780312553caf07fa86e5bc7 languageName: node linkType: hard @@ -4716,15 +4814,6 @@ __metadata: languageName: node linkType: hard -"color-support@npm:^1.1.2": - version: 1.1.3 - resolution: "color-support@npm:1.1.3" - bin: - color-support: bin.js - checksum: 10/4bcfe30eea1498fe1cabc852bbda6c9770f230ea0e4faf4611c5858b1b9e4dde3730ac485e65f54ca182f4c50b626c1bea7c8441ceda47367a54a818c248aa7a - languageName: node - linkType: hard - "colorette@npm:^2.0.20": version: 2.0.20 resolution: "colorette@npm:2.0.20" @@ -4813,10 +4902,10 @@ __metadata: languageName: node linkType: hard -"console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0": - version: 1.1.0 - resolution: "console-control-strings@npm:1.1.0" - checksum: 10/27b5fa302bc8e9ae9e98c03c66d76ca289ad0c61ce2fe20ab288d288bee875d217512d2edb2363fc83165e88f1c405180cf3f5413a46e51b4fe1a004840c6cdb +"consola@npm:^3.2.3": + version: 3.4.0 + resolution: "consola@npm:3.4.0" + checksum: 10/99d4a8131f4cc42ff6bb8e4fd8c9dbd428d6b949f3ec25d9d24892a7b0603b0aabeee8213e13ad74439b5078fdb204f9377bcdd401949c33fff672d91f05c4ec languageName: node linkType: hard @@ -4936,11 +5025,12 @@ __metadata: linkType: hard "cssstyle@npm:^4.0.1": - version: 4.1.0 - resolution: "cssstyle@npm:4.1.0" + version: 4.2.1 + resolution: "cssstyle@npm:4.2.1" dependencies: - rrweb-cssom: "npm:^0.7.1" - checksum: 10/8ca9e2d1f1b24f93bb5f3f20a7a1e271e58060957880e985ee55614e196a798ffab309ec6bac105af8a439a6764546761813835ebb7f929d60823637ee838a8f + "@asamuzakjp/css-color": "npm:^2.8.2" + rrweb-cssom: "npm:^0.8.0" + checksum: 10/e287234f2fd4feb1d79217480f48356f398cc11b9d17d39e6624f7dc1bf4b51d1e2c49f12b1a324834b445c17cbbf83ae5d3ba22c89a6b229f86bcebeda746a8 languageName: node linkType: hard @@ -5012,15 +5102,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6, debug@npm:^4.3.7, debug@npm:~4.3.6": - version: 4.3.7 - resolution: "debug@npm:4.3.7" +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.3.7, debug@npm:~4.4.0": + version: 4.4.0 + resolution: "debug@npm:4.4.0" dependencies: ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10/71168908b9a78227ab29d5d25fe03c5867750e31ce24bf2c44a86efc5af041758bb56569b0a3d48a9b5344c00a24a777e6f4100ed6dfd9534a42c1dde285125a + checksum: 10/1847944c2e3c2c732514b93d11886575625686056cd765336212dc15de2d2b29612b6cd80e1afba767bb8e1803b778caf9973e98169ef1a24a7a7009e1820367 languageName: node linkType: hard @@ -5095,7 +5185,7 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -5113,13 +5203,6 @@ __metadata: languageName: node linkType: hard -"delegates@npm:^1.0.0": - version: 1.0.0 - resolution: "delegates@npm:1.0.0" - checksum: 10/a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd - languageName: node - linkType: hard - "depcheck@npm:^1.4.7": version: 1.4.7 resolution: "depcheck@npm:1.4.7" @@ -5287,13 +5370,13 @@ __metadata: linkType: hard "domutils@npm:^3.0.1, domutils@npm:^3.1.0": - version: 3.1.0 - resolution: "domutils@npm:3.1.0" + version: 3.2.2 + resolution: "domutils@npm:3.2.2" dependencies: dom-serializer: "npm:^2.0.0" domelementtype: "npm:^2.3.0" domhandler: "npm:^5.0.3" - checksum: 10/9a169a6e57ac4c738269a73ab4caf785114ed70e46254139c1bbc8144ac3102aacb28a6149508395ae34aa5d6a40081f4fa5313855dc8319c6d8359866b6dfea + checksum: 10/2e08842151aa406f50fe5e6d494f4ec73c2373199fa00d1f77b56ec604e566b7f226312ae35ab8160bb7f27a27c7285d574c8044779053e499282ca9198be210 languageName: node linkType: hard @@ -5322,10 +5405,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.28": - version: 1.5.38 - resolution: "electron-to-chromium@npm:1.5.38" - checksum: 10/862f57480d42e4218a7be7ce71847fb5cf00423bc0b8b9168a978edadfd77fdcef2eb09e9c37821a4dd73b034a72d7cd1dbf2f096297abcd7e8664cc571602d4 +"electron-to-chromium@npm:^1.5.73": + version: 1.5.83 + resolution: "electron-to-chromium@npm:1.5.83" + checksum: 10/54326419778f80bfc3a76fec2e5a9122d81e7b04758da0b9c4d8bac612e6740f67f8a072b30ba62729f8ff5946fab3e2e1060936d1424eb5594c41baa9d82023 languageName: node linkType: hard @@ -5336,6 +5419,13 @@ __metadata: languageName: node linkType: hard +"emoji-regex-xs@npm:^1.0.0": + version: 1.0.0 + resolution: "emoji-regex-xs@npm:1.0.0" + checksum: 10/e216ec4270f765e1097cefc1b9518a7166b872b4424c60a85d79765f318d989cd458e036c76c13e9ce2ed1fe1bb5935a7fd5c1fab7600668bc8e92a789045b3c + languageName: node + linkType: hard + "emoji-regex@npm:^10.3.0": version: 10.4.0 resolution: "emoji-regex@npm:10.4.0" @@ -5450,7 +5540,7 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.17.5, es-abstract@npm:^1.22.1, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9": +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9": version: 1.23.9 resolution: "es-abstract@npm:1.23.9" dependencies: @@ -5555,11 +5645,11 @@ __metadata: linkType: hard "es-object-atoms@npm:^1.0.0": - version: 1.0.0 - resolution: "es-object-atoms@npm:1.0.0" + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" dependencies: es-errors: "npm:^1.3.0" - checksum: 10/f8910cf477e53c0615f685c5c96210591841850871b81924fcf256bfbaa68c254457d994a4308c60d15b20805e7f61ce6abc669375e01a5349391a8c1767584f + checksum: 10/54fe77de288451dae51c37bfbfe3ec86732dc3778f98f3eb3bdb4bf48063b2c0b8f9c93542656986149d08aa5be3204286e2276053d19582b76753f1a2728867 languageName: node linkType: hard @@ -5575,7 +5665,7 @@ __metadata: languageName: node linkType: hard -"es-shim-unscopables@npm:^1.0.0, es-shim-unscopables@npm:^1.0.2": +"es-shim-unscopables@npm:^1.0.2": version: 1.0.2 resolution: "es-shim-unscopables@npm:1.0.2" dependencies: @@ -5820,17 +5910,17 @@ __metadata: linkType: hard "eslint-import-resolver-typescript@npm:^3.6.3": - version: 3.6.3 - resolution: "eslint-import-resolver-typescript@npm:3.6.3" + version: 3.7.0 + resolution: "eslint-import-resolver-typescript@npm:3.7.0" dependencies: "@nolyfill/is-core-module": "npm:1.0.39" - debug: "npm:^4.3.5" + debug: "npm:^4.3.7" enhanced-resolve: "npm:^5.15.0" - eslint-module-utils: "npm:^2.8.1" fast-glob: "npm:^3.3.2" get-tsconfig: "npm:^4.7.5" is-bun-module: "npm:^1.0.2" is-glob: "npm:^4.0.3" + stable-hash: "npm:^0.0.4" peerDependencies: eslint: "*" eslint-plugin-import: "*" @@ -5840,19 +5930,7 @@ __metadata: optional: true eslint-plugin-import-x: optional: true - checksum: 10/5f9956dbbd0becc3d6c6cb945dad0e5e6f529cfd0f488d5688f3c59840cd7f4a44ab6aee0f54b5c4188134dab9a01cb63c1201767bde7fc330b7c1a14747f8ac - languageName: node - linkType: hard - -"eslint-module-utils@npm:^2.8.1": - version: 2.12.0 - resolution: "eslint-module-utils@npm:2.12.0" - dependencies: - debug: "npm:^3.2.7" - peerDependenciesMeta: - eslint: - optional: true - checksum: 10/dd27791147eca17366afcb83f47d6825b6ce164abb256681e5de4ec1d7e87d8605641eb869298a0dbc70665e2446dbcc2f40d3e1631a9475dd64dd23d4ca5dee + checksum: 10/8158730c11e562c56ed9bf7236dc75bce35b6992dc32c39ac2f4177ab77fca97b95999850204a6458054243607b54aee88c028a61fed4184f24f425fa1afff01 languageName: node linkType: hard @@ -5870,12 +5948,15 @@ __metadata: linkType: hard "eslint-plugin-import-x@npm:^4.3.1": - version: 4.3.1 - resolution: "eslint-plugin-import-x@npm:4.3.1" + version: 4.6.1 + resolution: "eslint-plugin-import-x@npm:4.6.1" dependencies: + "@types/doctrine": "npm:^0.0.9" + "@typescript-eslint/scope-manager": "npm:^8.1.0" "@typescript-eslint/utils": "npm:^8.1.0" debug: "npm:^4.3.4" doctrine: "npm:^3.0.0" + enhanced-resolve: "npm:^5.17.1" eslint-import-resolver-node: "npm:^0.3.9" get-tsconfig: "npm:^4.7.3" is-glob: "npm:^4.0.3" @@ -5885,13 +5966,13 @@ __metadata: tslib: "npm:^2.6.3" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - checksum: 10/df2de2de29ea62c78568ca684261b0f44699f65f42fedb8f71ffa4195bb326362bd020104f556521f12acbbf4112f13057a3cdbfcd106853e696dddfd03664ed + checksum: 10/514d8147f7bdff4accbeb06c294b68670287ecdaada9b2fbd3a2ba89d35860095cadd5a4175894fc8e75ba3b2be83dc172eba5cc71b823fd0dd846b7d49877ff languageName: node linkType: hard "eslint-plugin-jsdoc@npm:^50.3.1": - version: 50.4.1 - resolution: "eslint-plugin-jsdoc@npm:50.4.1" + version: 50.6.1 + resolution: "eslint-plugin-jsdoc@npm:50.6.1" dependencies: "@es-joy/jsdoccomment": "npm:~0.49.0" are-docs-informative: "npm:^0.0.2" @@ -5906,7 +5987,7 @@ __metadata: synckit: "npm:^0.9.1" peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 10/0368c68b30bfa15525b3934e6223e593e24dd1903ae9f1cc898207fca039052dbce3955da365ab2b8cdeb7ca25fef2b1cf26f5669244bd28290ac79c70af5188 + checksum: 10/53fceff38a5317bb7c42c15a622100515aec89aea0d2bbf07e7d2d07eacdaa10ce625232a1bc7c1497f7bbe044675123d30cd3e123fa52fe5c7a9c336a59709c languageName: node linkType: hard @@ -5929,8 +6010,8 @@ __metadata: linkType: hard "eslint-plugin-prettier@npm:^5.2.1": - version: 5.2.1 - resolution: "eslint-plugin-prettier@npm:5.2.1" + version: 5.2.2 + resolution: "eslint-plugin-prettier@npm:5.2.2" dependencies: prettier-linter-helpers: "npm:^1.0.0" synckit: "npm:^0.9.1" @@ -5944,7 +6025,7 @@ __metadata: optional: true eslint-config-prettier: optional: true - checksum: 10/10ddf68215237e327af09a47adab4c63f3885fda4fb28c4c42d1fc5f47d8a0cc45df6484799360ff1417a0aa3c77c3aaac49d7e9dfd145557b17e2d7ecc2a27c + checksum: 10/292569865fde6a91646037f58105c18225f5cd57e255966f8388b13c196ce023f84e22100408dcd30472c02d0846a897b8afe460ece57dfc23e80e6cac70a644 languageName: node linkType: hard @@ -6021,16 +6102,16 @@ __metadata: linkType: hard "eslint@npm:^9.12.0": - version: 9.17.0 - resolution: "eslint@npm:9.17.0" + version: 9.18.0 + resolution: "eslint@npm:9.18.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.12.1" "@eslint/config-array": "npm:^0.19.0" - "@eslint/core": "npm:^0.9.0" + "@eslint/core": "npm:^0.10.0" "@eslint/eslintrc": "npm:^3.2.0" - "@eslint/js": "npm:9.17.0" - "@eslint/plugin-kit": "npm:^0.2.3" + "@eslint/js": "npm:9.18.0" + "@eslint/plugin-kit": "npm:^0.2.5" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" "@humanwhocodes/retry": "npm:^0.4.1" @@ -6065,7 +6146,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10/a48ee67dd4e737974bbb49ca5d12d0ce35bcd874507807599e3655bb398320ab27c9deed1aad508a963967815e626c21208f52158c2fc0796d0cc8186528efeb + checksum: 10/85f22991aab4b0809fdfc557ec2bd309062e7211b631674e71827a73c45e44febaa80dedda35150154e331a2d372c3a25e8e5dd4a99dc8a982fe8f7d645d859f languageName: node linkType: hard @@ -6284,11 +6365,11 @@ __metadata: linkType: hard "fast-check@npm:^3.0.0": - version: 3.22.0 - resolution: "fast-check@npm:3.22.0" + version: 3.23.2 + resolution: "fast-check@npm:3.23.2" dependencies: pure-rand: "npm:^6.1.0" - checksum: 10/26ae7cc228fcd9759124db10cbbc01efff730bcdc848544ec7c3a533b9d88dec88d2a4a79da0ea4eb1ec78611dc6576f06f3fa5f8ff7126ad2eecf5ce3da57c6 + checksum: 10/dab344146b778e8bc2973366ea55528d1b58d3e3037270262b877c54241e800c4d744957722c24705c787020d702aece11e57c9e3dbd5ea19c3e10926bf1f3fe languageName: node linkType: hard @@ -6307,15 +6388,15 @@ __metadata: linkType: hard "fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.7, fast-glob@npm:^3.3.2": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" dependencies: "@nodelib/fs.stat": "npm:^2.0.2" "@nodelib/fs.walk": "npm:^1.2.3" glob-parent: "npm:^5.1.2" merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 10/222512e9315a0efca1276af9adb2127f02105d7288fa746145bf45e2716383fb79eb983c89601a72a399a56b7c18d38ce70457c5466218c5f13fad957cee16df + micromatch: "npm:^4.0.8" + checksum: 10/dcc6432b269762dd47381d8b8358bf964d8f4f60286ac6aa41c01ade70bda459ff2001b516690b96d5365f68a49242966112b5d5cc9cd82395fa8f9d017c90ad languageName: node linkType: hard @@ -6341,22 +6422,22 @@ __metadata: linkType: hard "fast-xml-parser@npm:^4.4.1": - version: 4.5.0 - resolution: "fast-xml-parser@npm:4.5.0" + version: 4.5.1 + resolution: "fast-xml-parser@npm:4.5.1" dependencies: strnum: "npm:^1.0.5" bin: fxparser: src/cli/cli.js - checksum: 10/dc9571c10e7b57b5be54bcd2d92f50c446eb42ea5df347d253e94dd14eb99b5300a6d172e840f151e0721933ca2406165a8d9b316a6d777bf0596dc4fe1df756 + checksum: 10/17ce5908e798de1b6d12a39d26f04ac3b582ea9ce28f3a6e3b9c401edcb74790f28df84d75377608af53308ff8caad2b244ba1283cc4b5b4cf4cc7bd532a9983 languageName: node linkType: hard "fastq@npm:^1.6.0": - version: 1.17.1 - resolution: "fastq@npm:1.17.1" + version: 1.18.0 + resolution: "fastq@npm:1.18.0" dependencies: reusify: "npm:^1.0.4" - checksum: 10/a443180068b527dd7b3a63dc7f2a47ceca2f3e97b9c00a1efe5538757e6cc4056a3526df94308075d7727561baf09ebaa5b67da8dcbddb913a021c5ae69d1f69 + checksum: 10/c5b501333dc8f5d188d828ea162aad03ff5a81aed185b6d4a5078aaeae0a42babc34296d7af13ebce86401cccd93c9b7b3cbf61280821c5f20af233378b42fbb languageName: node linkType: hard @@ -6453,9 +6534,9 @@ __metadata: linkType: hard "flatted@npm:^3.2.9": - version: 3.3.1 - resolution: "flatted@npm:3.3.1" - checksum: 10/7b8376061d5be6e0d3658bbab8bde587647f68797cf6bfeae9dea0e5137d9f27547ab92aaff3512dd9d1299086a6d61be98e9d48a56d17531b634f77faadbc49 + version: 3.3.2 + resolution: "flatted@npm:3.3.2" + checksum: 10/ac3c159742e01d0e860a861164bcfd35bb567ccbebb8a0dd041e61cf3c64a435b917dd1e7ed1c380c2ebca85735fb16644485ec33665bc6aafc3b316aa1eed44 languageName: node linkType: hard @@ -6497,13 +6578,13 @@ __metadata: linkType: hard "fs-extra@npm:^11.1.0": - version: 11.2.0 - resolution: "fs-extra@npm:11.2.0" + version: 11.3.0 + resolution: "fs-extra@npm:11.3.0" dependencies: graceful-fs: "npm:^4.2.0" jsonfile: "npm:^6.0.1" universalify: "npm:^2.0.0" - checksum: 10/0579bf6726a4cd054d4aa308f10b483f52478bb16284f32cf60b4ce0542063d551fca1a08a2af365e35db21a3fa5a06cf2a6ed614004b4368982bc754cb816b3 + checksum: 10/c9fe7b23dded1efe7bbae528d685c3206477e20cc60e9aaceb3f024f9b9ff2ee1f62413c161cb88546cc564009ab516dec99e9781ba782d869bb37e4fe04a97f languageName: node linkType: hard @@ -6598,23 +6679,6 @@ __metadata: languageName: node linkType: hard -"gauge@npm:^3.0.0": - version: 3.0.2 - resolution: "gauge@npm:3.0.2" - dependencies: - aproba: "npm:^1.0.3 || ^2.0.0" - color-support: "npm:^1.1.2" - console-control-strings: "npm:^1.0.0" - has-unicode: "npm:^2.0.1" - object-assign: "npm:^4.1.1" - signal-exit: "npm:^3.0.0" - string-width: "npm:^4.2.3" - strip-ansi: "npm:^6.0.1" - wide-align: "npm:^1.1.2" - checksum: 10/46df086451672a5fecd58f7ec86da74542c795f8e00153fbef2884286ce0e86653c3eb23be2d0abb0c4a82b9b2a9dec3b09b6a1cf31c28085fa0376599a26589 - languageName: node - linkType: hard - "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -6764,8 +6828,8 @@ __metadata: linkType: hard "glob@npm:^11.0.0": - version: 11.0.0 - resolution: "glob@npm:11.0.0" + version: 11.0.1 + resolution: "glob@npm:11.0.1" dependencies: foreground-child: "npm:^3.1.0" jackspeak: "npm:^4.0.1" @@ -6775,7 +6839,7 @@ __metadata: path-scurry: "npm:^2.0.0" bin: glob: dist/esm/bin.mjs - checksum: 10/e66939201d11ae30fe97e3364ac2be5c59d6c9bfce18ac633edfad473eb6b46a7553f6f73658f67caaf6cccc1df1ae336298a45e9021fa5695fd78754cc1603e + checksum: 10/57b12a05cc25f1c38f3b24cf6ea7a8bacef11e782c4b9a8c5b0bef3e6c5bcb8c4548cb31eb4115592e0490a024c1bde7359c470565608dd061d3b21179740457 languageName: node linkType: hard @@ -6832,9 +6896,9 @@ __metadata: linkType: hard "globals@npm:^15.11.0, globals@npm:^15.9.0": - version: 15.11.0 - resolution: "globals@npm:15.11.0" - checksum: 10/14009ef1906ac929d930ed1c896a47159e7d11b4d201901ca5f3827766519191a3f5fb45124de43c4511fee04018704e7ed5a097fb37d23abf39523d1d41c85f + version: 15.14.0 + resolution: "globals@npm:15.14.0" + checksum: 10/e35ffbdbc024d6381efca906f67211a7bbf935db2af8c14a65155785479e28b3e475950e5933bb6b296eed54b6dcd924e25b26dbc8579b1bde9d5d25916e1c5f languageName: node linkType: hard @@ -6891,16 +6955,16 @@ __metadata: linkType: hard "graphql@npm:^16.8.1": - version: 16.9.0 - resolution: "graphql@npm:16.9.0" - checksum: 10/5833f82bb6c31bec120bbf9cd400eda873e1bb7ef5c17974fa262cd82dc68728fda5d4cb859dc8aaa4c4fe4f6fe1103a9c47efc01a12c02ae5cb581d8e4029e2 + version: 16.10.0 + resolution: "graphql@npm:16.10.0" + checksum: 10/d42cf81ddcf3a61dfb213217576bf33c326f15b02c4cee369b373dc74100cbdcdc4479b3b797e79b654dabd8fddf50ef65ff75420e9ce5596c02e21f24c9126a languageName: node linkType: hard "has-bigints@npm:^1.0.2": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 10/4e0426c900af034d12db14abfece02ce7dbf53f2022d28af1a97913ff4c07adb8799476d57dc44fbca0e07d1dbda2a042c2928b1f33d3f09c15de0640a7fb81b + version: 1.1.0 + resolution: "has-bigints@npm:1.1.0" + checksum: 10/90fb1b24d40d2472bcd1c8bd9dd479037ec240215869bdbff97b2be83acef57d28f7e96bdd003a21bed218d058b49097f4acc8821c05b1629cc5d48dd7bfcccd languageName: node linkType: hard @@ -6936,7 +7000,7 @@ __metadata: languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": +"has-tostringtag@npm:^1.0.2": version: 1.0.2 resolution: "has-tostringtag@npm:1.0.2" dependencies: @@ -6945,13 +7009,6 @@ __metadata: languageName: node linkType: hard -"has-unicode@npm:^2.0.1": - version: 2.0.1 - resolution: "has-unicode@npm:2.0.1" - checksum: 10/041b4293ad6bf391e21c5d85ed03f412506d6623786b801c4ab39e4e6ca54993f13201bceb544d92963f9e0024e6e7fbf0cb1d84c9d6b31cb9c79c8c990d13d8 - languageName: node - linkType: hard - "hasown@npm:^2.0.0, hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" @@ -6961,9 +7018,9 @@ __metadata: languageName: node linkType: hard -"hast-util-to-html@npm:^9.0.3": - version: 9.0.3 - resolution: "hast-util-to-html@npm:9.0.3" +"hast-util-to-html@npm:^9.0.4": + version: 9.0.4 + resolution: "hast-util-to-html@npm:9.0.4" dependencies: "@types/hast": "npm:^3.0.0" "@types/unist": "npm:^3.0.0" @@ -6976,7 +7033,7 @@ __metadata: space-separated-tokens: "npm:^2.0.0" stringify-entities: "npm:^4.0.0" zwitch: "npm:^2.0.4" - checksum: 10/cdf860be567137d045490b0f27590bcafc7032f0725a84667e8950d7bf2ce175d0dfc635b7ce05f3a8d1963ac4c74cae4d93513047429aad909222decdb2f7d1 + checksum: 10/a0b4ed9058e57fa2ca010d10c077fda78d2ab2af99f5bd09fe4b9948970025ac4a2a1a03ec7e2e0f3b0444066b1b35d602fa3e9fbd9b7fc9cdd35d0cafa909ca languageName: node linkType: hard @@ -7073,23 +7130,13 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^5.0.0": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" - dependencies: - agent-base: "npm:6" - debug: "npm:4" - checksum: 10/f0dce7bdcac5e8eaa0be3c7368bb8836ed010fb5b6349ffb412b172a203efe8f807d9a6681319105ea1b6901e1972c7b5ea899672a7b9aad58309f766dcbe0df - languageName: node - linkType: hard - "https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.5": - version: 7.0.5 - resolution: "https-proxy-agent@npm:7.0.5" + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" dependencies: - agent-base: "npm:^7.0.2" + agent-base: "npm:^7.1.2" debug: "npm:4" - checksum: 10/6679d46159ab3f9a5509ee80c3a3fc83fba3a920a5e18d32176c3327852c3c00ad640c0c4210a8fd70ea3c4a6d3a1b375bf01942516e7df80e2646bdc77658ab + checksum: 10/784b628cbd55b25542a9d85033bdfd03d4eda630fb8b3c9477959367f3be95dc476ed2ecbb9836c359c7c698027fc7b45723a302324433590f45d6c1706e8c13 languageName: node linkType: hard @@ -7294,11 +7341,14 @@ __metadata: linkType: hard "is-async-function@npm:^2.0.0": - version: 2.0.0 - resolution: "is-async-function@npm:2.0.0" + version: 2.1.0 + resolution: "is-async-function@npm:2.1.0" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10/2cf336fbf8cba3badcf526aa3d10384c30bab32615ac4831b74492eb4e843ccb7d8439a119c27f84bcf217d72024e611b1373f870f433b48f3fa57d3d1b863f1 + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10/865f0e915b7d9aa5577327e7550bf77a4bb2b7bca497d32564e1d32dbe0ccb7eca1c9c56dd679b6dd2bd7feddb91574e773922276871a5958e53ae8473db4742 languageName: node linkType: hard @@ -7340,11 +7390,11 @@ __metadata: linkType: hard "is-bun-module@npm:^1.0.2": - version: 1.2.1 - resolution: "is-bun-module@npm:1.2.1" + version: 1.3.0 + resolution: "is-bun-module@npm:1.3.0" dependencies: semver: "npm:^7.6.3" - checksum: 10/1c2cbcf1a76991add1b640d2d7fe09848e8697a76f96e1289dff44133a48c97f5dc601d4a66d3f3a86217a77178d72d33d10d0c9e14194e58e70ec8df3eae41a + checksum: 10/b23d9ec7b4d4bfd89e4e72b5cd52e1bc153facad59fdd7394c656f8859a78740ef35996a2066240a32f39cc9a9da4b4eb69e68df3c71755a61ebbaf56d3daef0 languageName: node linkType: hard @@ -7355,12 +7405,12 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.12.0, is-core-module@npm:^2.13.0": - version: 2.15.1 - resolution: "is-core-module@npm:2.15.1" +"is-core-module@npm:^2.12.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.16.0": + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" dependencies: hasown: "npm:^2.0.2" - checksum: 10/77316d5891d5743854bcef2cd2f24c5458fb69fbc9705c12ca17d54a2017a67d0693bbf1ba8c77af376c0eef6bf6d1b27a4ab08e4db4e69914c3789bdf2ceec5 + checksum: 10/452b2c2fb7f889cbbf7e54609ef92cf6c24637c568acc7e63d166812a0fb365ae8a504c333a29add8bdb1686704068caa7f4e4b639b650dde4f00a038b8941fb languageName: node linkType: hard @@ -7393,11 +7443,11 @@ __metadata: linkType: hard "is-finalizationregistry@npm:^1.1.0": - version: 1.1.0 - resolution: "is-finalizationregistry@npm:1.1.0" + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" dependencies: - call-bind: "npm:^1.0.7" - checksum: 10/0a812f3ef86fa3e3caf6bb8c6d61b7fc65df88f9751f73617331a5a7e35bb0a192d0c320dbf2f8b97a6819491e52126615313ba9900529697f226235627c58b5 + call-bound: "npm:^1.0.3" + checksum: 10/0bfb145e9a1ba852ddde423b0926d2169ae5fe9e37882cde9e8f69031281a986308df4d982283e152396e88b86562ed2256cbaa5e6390fb840a4c25ab54b8a80 languageName: node linkType: hard @@ -7425,11 +7475,14 @@ __metadata: linkType: hard "is-generator-function@npm:^1.0.10": - version: 1.0.10 - resolution: "is-generator-function@npm:1.0.10" + version: 1.1.0 + resolution: "is-generator-function@npm:1.1.0" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10/499a3ce6361064c3bd27fbff5c8000212d48506ebe1977842bbd7b3e708832d0deb1f4cc69186ece3640770e8c4f1287b24d99588a0b8058b2dbdd344bc1f47f + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.0" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10/5906ff51a856a5fbc6b90a90fce32040b0a6870da905f98818f1350f9acadfc9884f7c3dec833fce04b83dd883937b86a190b6593ede82e8b1af8b6c4ecf7cbd languageName: node linkType: hard @@ -7634,12 +7687,12 @@ __metadata: linkType: hard "is-weakset@npm:^2.0.3": - version: 2.0.3 - resolution: "is-weakset@npm:2.0.3" + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" dependencies: - call-bind: "npm:^1.0.7" - get-intrinsic: "npm:^1.2.4" - checksum: 10/40159582ff1b44fc40085f631baf19f56479b05af2faede65b4e6a0b6acab745c13fd070e35b475aafd8a1ee50879ba5a3f1265125b46bebdb446b6be1f62165 + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10/1d5e1d0179beeed3661125a6faa2e59bfb48afda06fc70db807f178aa0ebebc3758fb6358d76b3d528090d5ef85148c345dcfbf90839592fe293e3e5e82f2134 languageName: node linkType: hard @@ -7766,6 +7819,15 @@ __metadata: languageName: node linkType: hard +"jessie.js@npm:^0.3.4": + version: 0.3.4 + resolution: "jessie.js@npm:0.3.4" + dependencies: + "@endo/far": "npm:^1.0.0" + checksum: 10/894d6b18251744d63ed497df213a77c38034882500681eddff0cf9e43afa9443f5e1b7320e6ed13559f8ccbb49000564a4945f148ed12712fd0f8694c67656e0 + languageName: node + linkType: hard + "js-sha3@npm:^0.5.7": version: 0.5.7 resolution: "js-sha3@npm:0.5.7" @@ -7868,11 +7930,11 @@ __metadata: linkType: hard "jsesc@npm:^3.0.2": - version: 3.0.2 - resolution: "jsesc@npm:3.0.2" + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" bin: jsesc: bin/jsesc - checksum: 10/8e5a7de6b70a8bd71f9cb0b5a7ade6a73ae6ab55e697c74cc997cede97417a3a65ed86c36f7dd6125fe49766e8386c845023d9e213916ca92c9dfdd56e2babf3 + checksum: 10/20bd37a142eca5d1794f354db8f1c9aeb54d85e1f5c247b371de05d23a9751ecd7bd3a9c4fc5298ea6fa09a100dafb4190fa5c98c6610b75952c3487f3ce7967 languageName: node linkType: hard @@ -8013,10 +8075,10 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:~3.1.2": - version: 3.1.2 - resolution: "lilconfig@npm:3.1.2" - checksum: 10/8058403850cfad76d6041b23db23f730e52b6c17a8c28d87b90766639ca0ee40c748a3e85c2d7bd133d572efabff166c4b015e5d25e01fd666cb4b13cfada7f0 +"lilconfig@npm:~3.1.3": + version: 3.1.3 + resolution: "lilconfig@npm:3.1.3" + checksum: 10/b932ce1af94985f0efbe8896e57b1f814a48c8dbd7fc0ef8469785c6303ed29d0090af3ccad7e36b626bfca3a4dc56cc262697e9a8dd867623cf09a39d54e4c3 languageName: node linkType: hard @@ -8037,26 +8099,26 @@ __metadata: linkType: hard "lint-staged@npm:^15.2.10": - version: 15.2.10 - resolution: "lint-staged@npm:15.2.10" + version: 15.4.1 + resolution: "lint-staged@npm:15.4.1" dependencies: - chalk: "npm:~5.3.0" + chalk: "npm:~5.4.1" commander: "npm:~12.1.0" - debug: "npm:~4.3.6" + debug: "npm:~4.4.0" execa: "npm:~8.0.1" - lilconfig: "npm:~3.1.2" - listr2: "npm:~8.2.4" + lilconfig: "npm:~3.1.3" + listr2: "npm:~8.2.5" micromatch: "npm:~4.0.8" pidtree: "npm:~0.6.0" string-argv: "npm:~0.3.2" - yaml: "npm:~2.5.0" + yaml: "npm:~2.6.1" bin: lint-staged: bin/lint-staged.js - checksum: 10/ab6930cd633dbb5b6ec7c81fc06c65df41e9f80d93dd22e0d79c6e272cdfd8110a0fbdec60303d46a06b30bcd92261153630e2c937531b77ec5ae41e7e9d90d3 + checksum: 10/615a1f0a66c6cb35fda928745fec9864498853d5aab49785840b12643e40c6518daf01218b5255a727d32ef9a3738e3766103679cfdcd6f1b320e272920f3b68 languageName: node linkType: hard -"listr2@npm:~8.2.4": +"listr2@npm:~8.2.5": version: 8.2.5 resolution: "listr2@npm:8.2.5" dependencies: @@ -8146,9 +8208,9 @@ __metadata: linkType: hard "lru-cache@npm:^11.0.0": - version: 11.0.1 - resolution: "lru-cache@npm:11.0.1" - checksum: 10/26688a1b2a4d7fb97e9ea1ffb15348f1ab21b7110496814f5ce9190d50258fbba8c1444ae7232876deae1fc54adb230aa63dd1efc5bd47f240620ba8bf218041 + version: 11.0.2 + resolution: "lru-cache@npm:11.0.2" + checksum: 10/25fcb66e9d91eaf17227c6abfe526a7bed5903de74f93bfde380eb8a13410c5e8d3f14fe447293f3f322a7493adf6f9f015c6f1df7a235ff24ec30f366e1c058 languageName: node linkType: hard @@ -8223,15 +8285,6 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^3.1.0": - version: 3.1.0 - resolution: "make-dir@npm:3.1.0" - dependencies: - semver: "npm:^6.0.0" - checksum: 10/484200020ab5a1fdf12f393fe5f385fc8e4378824c940fba1729dcd198ae4ff24867bc7a5646331e50cead8abff5d9270c456314386e629acec6dff4b8016b78 - languageName: node - linkType: hard - "make-dir@npm:^4.0.0": version: 4.0.0 resolution: "make-dir@npm:4.0.0" @@ -8297,18 +8350,19 @@ __metadata: linkType: hard "marked-terminal@npm:^7.1.0": - version: 7.1.0 - resolution: "marked-terminal@npm:7.1.0" + version: 7.2.1 + resolution: "marked-terminal@npm:7.2.1" dependencies: ansi-escapes: "npm:^7.0.0" + ansi-regex: "npm:^6.1.0" chalk: "npm:^5.3.0" cli-highlight: "npm:^2.1.11" cli-table3: "npm:^0.6.5" node-emoji: "npm:^2.1.3" - supports-hyperlinks: "npm:^3.0.0" + supports-hyperlinks: "npm:^3.1.0" peerDependencies: - marked: ">=1 <14" - checksum: 10/6afe0781c4935b2985152f55a0fe04a3a3eb5475da4a40a98e50ab3f2c011f554d089cf43736ce0b9e44142f7f3463b7de50af70b8e2169c4c3ac65fff69fd46 + marked: ">=1 <15" + checksum: 10/126a29614a5bbe93aa3eb45c9c337ae4fb701cd6ce7bba41cb4b8339d57966829d0f22d08c990e46c9b176c7cc3ae4956921d645e5792c011bd352043560024e languageName: node linkType: hard @@ -8410,44 +8464,44 @@ __metadata: linkType: hard "micromark-util-character@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-util-character@npm:2.1.0" + version: 2.1.1 + resolution: "micromark-util-character@npm:2.1.1" dependencies: micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/089fe853c2bede2a48fd73d977910fa657c3cf6649eddcd300557a975c6c7f1c73030d01724a483ff1dc69a0d3ac28b43b2ba4210f5ea6414807cdcd0c2fa63c + checksum: 10/85da8f8e5f7ed16046575bef5b0964ca3fca3162b87b74ae279f1e48eb7160891313eb64f04606baed81c58b514dbdb64f1a9d110a51baaaa79225d72a7b1852 languageName: node linkType: hard "micromark-util-encode@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-encode@npm:2.0.0" - checksum: 10/853a3f33fce72aaf4ffa60b7f2b6fcfca40b270b3466e1b96561b02185d2bd8c01dd7948bc31a24ac014f4cc854e545ca9a8e9cf7ea46262f9d24c9e88551c66 + version: 2.0.1 + resolution: "micromark-util-encode@npm:2.0.1" + checksum: 10/be890b98e78dd0cdd953a313f4148c4692cc2fb05533e56fef5f421287d3c08feee38ca679f318e740530791fc251bfe8c80efa926fcceb4419b269c9343d226 languageName: node linkType: hard "micromark-util-sanitize-uri@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-sanitize-uri@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-sanitize-uri@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-encode: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" - checksum: 10/7d10622f5a2bb058dda6d2e95b2735c43fdf8daa4f88a0863bc90eef6598f8e10e3df98e034341fcbc090d8021c53501308c463c49d3fe91f41eb64b5bf2766e + checksum: 10/064c72abfc9777864ca0521a016dde62ab3e7af5215d10fd27e820798500d5d305da638459c589275c1a093cf588f493cc2f65273deac5a5331ecefc6c9ea78a languageName: node linkType: hard "micromark-util-symbol@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-symbol@npm:2.0.0" - checksum: 10/8c662644c326b384f02a5269974d843d400930cf6f5d6a8e6db1743fc8933f5ecc125b4203ad4ebca25447f5d23eb7e5bf1f75af34570c3fdd925cb618752fcd + version: 2.0.1 + resolution: "micromark-util-symbol@npm:2.0.1" + checksum: 10/497e6d95fc21c2bb5265b78a6a60db518c376dc438739b2e7d4aee6f9f165222711724b456c63163314f32b8eea68a064687711d41e986262926eab23ddb9229 languageName: node linkType: hard "micromark-util-types@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-types@npm:2.0.0" - checksum: 10/b88e0eefd4b7c8d86b54dbf4ed0094ef56a3b0c7774d040bd5c8146b8e4e05b1026bbf1cd9308c8fcd05ecdc0784507680c8cee9888a4d3c550e6e574f7aef62 + version: 2.0.1 + resolution: "micromark-util-types@npm:2.0.1" + checksum: 10/69c5e18e6ba4e12473d6fe5f1a7cc113ac1d4bfc23c7ad57b16a5e4bfd09ef48b7c17a40c39d43996f2078ad898efd3f1945007c14f395abd55f2af03d413acd languageName: node linkType: hard @@ -8792,7 +8846,7 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.1.31, nanoid@npm:^3.3.7": +"nanoid@npm:^3.3.8": version: 3.3.8 resolution: "nanoid@npm:3.3.8" bin: @@ -8828,9 +8882,9 @@ __metadata: linkType: hard "negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: 10/2723fb822a17ad55c93a588a4bc44d53b22855bf4be5499916ca0cab1e7165409d0b288ba2577d7b029f10ce18cf2ed8e703e5af31c984e1e2304277ef979837 + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 10/d98c04a136583afd055746168f1067d58ce4bfe6e4c73ca1d339567f81ea1f7e665b5bd1e81f4771c67b6c2ea89b21cb2adaea2b16058c7dc31317778f931dab languageName: node linkType: hard @@ -8842,11 +8896,11 @@ __metadata: linkType: hard "node-abi@npm:^3.3.0": - version: 3.71.0 - resolution: "node-abi@npm:3.71.0" + version: 3.73.0 + resolution: "node-abi@npm:3.73.0" dependencies: semver: "npm:^7.3.5" - checksum: 10/0a1cef5106c43d67f9f8a911b0c9d5ee08971eda002ba466606c8e6164964456f5211f37966717efc3d5d49bae32f0cf9290254b1286bf71f0ba158a4f8a9846 + checksum: 10/06c999329d8b3d13c794fca7510fb9e5ccc6cb79bfc642423531f479addbe2a25b07812ec0ad77ba66461f70f9abb257d756349e2040a8e97fdd513292297f5b languageName: node linkType: hard @@ -8860,14 +8914,14 @@ __metadata: linkType: hard "node-emoji@npm:^2.1.3": - version: 2.1.3 - resolution: "node-emoji@npm:2.1.3" + version: 2.2.0 + resolution: "node-emoji@npm:2.2.0" dependencies: "@sindresorhus/is": "npm:^4.6.0" char-regex: "npm:^1.0.2" emojilib: "npm:^2.4.0" skin-tone: "npm:^2.0.0" - checksum: 10/e9cff16f557972bc45040c26cb686961935c582af612bd41446f0094834088c1cdf7d4370a39ce5d42b71c1352a35b8d8a7a2fec53922b51abf54f36e56cc614 + checksum: 10/2548668f5cc9f781c94dc39971a630b2887111e0970c29fc523e924819d1b39b53a2694a4d1046861adf538c4462d06ee0269c48717ccad30336a918d9a911d5 languageName: node linkType: hard @@ -8886,19 +8940,19 @@ __metadata: linkType: hard "node-gyp-build@npm:^4.2.2": - version: 4.8.3 - resolution: "node-gyp-build@npm:4.8.3" + version: 4.8.4 + resolution: "node-gyp-build@npm:4.8.4" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: 10/4cdc07c940bc1ae484d4d62b0627c80bfb5018e597f2c68c0a7a80b17e9b9cef9d566ec52150ff6f867dd42788eff97a3bcf5cb5b4679ef74954b2df2ac57c02 + checksum: 10/6a7d62289d1afc419fc8fc9bd00aa4e554369e50ca0acbc215cb91446148b75ff7e2a3b53c2c5b2c09a39d416d69f3d3237937860373104b5fe429bf30ad9ac5 languageName: node linkType: hard -"node-gyp@npm:^10.0.0, node-gyp@npm:latest": - version: 10.2.0 - resolution: "node-gyp@npm:10.2.0" +"node-gyp@npm:^10.0.0": + version: 10.3.1 + resolution: "node-gyp@npm:10.3.1" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" @@ -8912,11 +8966,11 @@ __metadata: which: "npm:^4.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10/41773093b1275751dec942b985982fd4e7a69b88cae719b868babcef3880ee6168aaec8dcaa8cd0b9fa7c84873e36cc549c6cac6a124ee65ba4ce1f1cc108cfe + checksum: 10/d3004f648559e42d7ec8791ea75747fe8a163a6061c202e311e5d7a5f6266baa9a5f5c6fde7be563974c88b030c5d0855fd945364f52fcd230d2a2ceee7be80d languageName: node linkType: hard -"node-gyp@npm:^11.0.0": +"node-gyp@npm:^11.0.0, node-gyp@npm:latest": version: 11.0.0 resolution: "node-gyp@npm:11.0.0" dependencies: @@ -8936,10 +8990,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.18": - version: 2.0.18 - resolution: "node-releases@npm:2.0.18" - checksum: 10/241e5fa9556f1c12bafb83c6c3e94f8cf3d8f2f8f904906ecef6e10bcaa1d59aa61212d4651bec70052015fc54bd3fdcdbe7fc0f638a17e6685aa586c076ec4e +"node-releases@npm:^2.0.19": + version: 2.0.19 + resolution: "node-releases@npm:2.0.19" + checksum: 10/c2b33b4f0c40445aee56141f13ca692fa6805db88510e5bbb3baadb2da13e1293b738e638e15e4a8eb668bb9e97debb08e7a35409b477b5cc18f171d35a83045 languageName: node linkType: hard @@ -8950,17 +9004,6 @@ __metadata: languageName: node linkType: hard -"nopt@npm:^5.0.0": - version: 5.0.0 - resolution: "nopt@npm:5.0.0" - dependencies: - abbrev: "npm:1" - bin: - nopt: bin/nopt.js - checksum: 10/00f9bb2d16449469ba8ffcf9b8f0eae6bae285ec74b135fec533e5883563d2400c0cd70902d0a7759e47ac031ccf206ace4e86556da08ed3f1c66dda206e9ccd - languageName: node - linkType: hard - "nopt@npm:^7.0.0": version: 7.2.1 resolution: "nopt@npm:7.2.1" @@ -9069,18 +9112,6 @@ __metadata: languageName: node linkType: hard -"npmlog@npm:^5.0.1": - version: 5.0.1 - resolution: "npmlog@npm:5.0.1" - dependencies: - are-we-there-yet: "npm:^2.0.0" - console-control-strings: "npm:^1.1.0" - gauge: "npm:^3.0.0" - set-blocking: "npm:^2.0.0" - checksum: 10/f42c7b9584cdd26a13c41a21930b6f5912896b6419ab15be88cc5721fc792f1c3dd30eb602b26ae08575694628ba70afdcf3675d86e4f450fc544757e52726ec - languageName: node - linkType: hard - "nth-check@npm:^2.0.1": version: 2.1.1 resolution: "nth-check@npm:2.1.1" @@ -9091,9 +9122,9 @@ __metadata: linkType: hard "nwsapi@npm:^2.2.12": - version: 2.2.13 - resolution: "nwsapi@npm:2.2.13" - checksum: 10/f7f30a236f2ee513ea8042f1a987481dc2b900167c47f7163882f0fcfe7ccb57b5c8daaf2c91008dc20a204fcd79e050aee25001433ad99990bbed5a8c74121c + version: 2.2.16 + resolution: "nwsapi@npm:2.2.16" + checksum: 10/1e5e086cdd4ca4a45f414d37f49bf0ca81d84ed31c6871ac68f531917d2910845db61f77c6d844430dc90fda202d43fce9603024e74038675de95229eb834dba languageName: node linkType: hard @@ -9203,12 +9234,14 @@ __metadata: languageName: node linkType: hard -"oniguruma-to-js@npm:0.4.3": - version: 0.4.3 - resolution: "oniguruma-to-js@npm:0.4.3" +"oniguruma-to-es@npm:^2.0.0": + version: 2.0.0 + resolution: "oniguruma-to-es@npm:2.0.0" dependencies: - regex: "npm:^4.3.2" - checksum: 10/af64a77f4e428c2652387014596138c51bd61d67b0bbe957cd10ff73b4ec14567701ff9286342ab804cfa00486a9a0ff189da8391721c21c898ea8e26b62e74f + emoji-regex-xs: "npm:^1.0.0" + regex: "npm:^5.1.1" + regex-recursion: "npm:^5.1.1" + checksum: 10/b22ef1342c7bf8d7049e21cb6d2ecf7840d446b4f05b9cdbef6706a1f4215cbbca6a7a0d969c2e82a4db0f0ddfb2a4b2c3db24e808a5a360246645164e022396 languageName: node linkType: hard @@ -9272,9 +9305,9 @@ __metadata: linkType: hard "p-map@npm:^7.0.2": - version: 7.0.2 - resolution: "p-map@npm:7.0.2" - checksum: 10/b4a590038b991c17b9c1484aa8c24cb9d3aa8a6167d02b9f9459c9200c7d392202a860c95b6dcd190d51f5f083ed256b32f9cb5976785022b0111bab853ec58b + version: 7.0.3 + resolution: "p-map@npm:7.0.3" + checksum: 10/2ef48ccfc6dd387253d71bf502604f7893ed62090b2c9d73387f10006c342606b05233da0e4f29388227b61eb5aeface6197e166520c465c234552eeab2fe633 languageName: node linkType: hard @@ -9390,11 +9423,11 @@ __metadata: linkType: hard "parse5@npm:^7.0.0, parse5@npm:^7.1.2": - version: 7.2.0 - resolution: "parse5@npm:7.2.0" + version: 7.2.1 + resolution: "parse5@npm:7.2.1" dependencies: entities: "npm:^4.5.0" - checksum: 10/49dabfe848f00e8cad8d9198a094d667fbdecbfa5143ddf8fb708e499b5ba76426c16135c8993b1d8e01827b92e8cfab0a9a248afa6ad7cc6f38aecf5bd017e6 + checksum: 10/fd1a8ad1540d871e1ad6ca9bf5b67e30280886f1ce4a28052c0cb885723aa984d8cb1ec3da998349a6146960c8a84aa87b1a42600eb3b94495c7303476f2f88e languageName: node linkType: hard @@ -9502,7 +9535,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: 10/e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 @@ -9663,14 +9696,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.0.0, postcss@npm:^8.4.35, postcss@npm:^8.4.43, postcss@npm:^8.4.47": - version: 8.4.49 - resolution: "postcss@npm:8.4.49" +"postcss@npm:^8.0.0, postcss@npm:^8.4.35, postcss@npm:^8.4.43, postcss@npm:^8.4.48": + version: 8.5.1 + resolution: "postcss@npm:8.5.1" dependencies: - nanoid: "npm:^3.3.7" + nanoid: "npm:^3.3.8" picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10/28fe1005b1339870e0a5006375ba5ac1213fd69800f79e7db09c398e074421ba6e162898e94f64942fed554037fd292db3811d87835d25ab5ef7f3c9daacb6ca + checksum: 10/1fbd28753143f7f03e4604813639918182b15343c7ad0f4e72f3875fc2cc0b8494c887f55dc05008fad5fbf1e1e908ce2edbbce364a91f84dcefb71edf7cd31d languageName: node linkType: hard @@ -9713,17 +9746,17 @@ __metadata: linkType: hard "prettier-plugin-packagejson@npm:^2.5.3": - version: 2.5.6 - resolution: "prettier-plugin-packagejson@npm:2.5.6" + version: 2.5.7 + resolution: "prettier-plugin-packagejson@npm:2.5.7" dependencies: - sort-package-json: "npm:2.12.0" + sort-package-json: "npm:2.13.0" synckit: "npm:0.9.2" peerDependencies: prettier: ">= 1.16.0" peerDependenciesMeta: prettier: optional: true - checksum: 10/f30cee986c8d03f6609ba783174d1def15e964232246e6f4e79f05fc37fb348dec2ccce6c1b4c71ff9f0118deaea3fb5b3e745018d888553ac7c9a14bbe1e1f8 + checksum: 10/eca337657660e706134a1509053c39a88249965ff8ec692074c24ad7c2234b878d48c0ccb803e0827a47e676cbeb5ce7845e21f9fbe2c9bdf12e2565b91d0515 languageName: node linkType: hard @@ -9820,9 +9853,11 @@ __metadata: linkType: hard "psl@npm:^1.1.33": - version: 1.9.0 - resolution: "psl@npm:1.9.0" - checksum: 10/d07879d4bfd0ac74796306a8e5a36a93cfb9c4f4e8ee8e63fbb909066c192fe1008cd8f12abd8ba2f62ca28247949a20c8fb32e1d18831d9e71285a1569720f9 + version: 1.15.0 + resolution: "psl@npm:1.15.0" + dependencies: + punycode: "npm:^2.3.1" + checksum: 10/5e7467eb5196eb7900d156783d12907d445c0122f76c73203ce96b148a6ccf8c5450cc805887ffada38ff92d634afcf33720c24053cb01d5b6598d1c913c5caf languageName: node linkType: hard @@ -9948,7 +9983,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.2": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -9960,15 +9995,15 @@ __metadata: linkType: hard "readable-stream@npm:^3.6.2 || ^4.4.2": - version: 4.5.2 - resolution: "readable-stream@npm:4.5.2" + version: 4.7.0 + resolution: "readable-stream@npm:4.7.0" dependencies: abort-controller: "npm:^3.0.0" buffer: "npm:^6.0.3" events: "npm:^3.3.0" process: "npm:^0.11.10" string_decoder: "npm:^1.3.0" - checksum: 10/01b128a559c5fd76a898495f858cf0a8839f135e6a69e3409f986e88460134791657eb46a2ff16826f331682a3c4d0c5a75cef5e52ef259711021ba52b1c2e82 + checksum: 10/bdf096c8ff59452ce5d08f13da9597f9fcfe400b4facfaa88e74ec057e5ad1fdfa140ffe28e5ed806cf4d2055f0b812806e962bca91dce31bc4cef08e53be3a4 languageName: node linkType: hard @@ -9982,9 +10017,9 @@ __metadata: linkType: hard "readdirp@npm:^4.0.1": - version: 4.0.2 - resolution: "readdirp@npm:4.0.2" - checksum: 10/4ef93103307c7d5e42e78ecf201db58c984c4d66882a27c956250478b49c2444b1ff6aea8ce0f5e4157b2c07ce2fe870ad16c92ebd7c6ff30391ded6e42b9873 + version: 4.1.1 + resolution: "readdirp@npm:4.1.1" + checksum: 10/e9a4a07b108b148e3646518c9e6fe097895b910148223361e8fd3983bc52435924f9b549aaa9ce7a471768312892cdd1cefcf467ef0fa58c6618c17266914bf8 languageName: node linkType: hard @@ -10021,22 +10056,43 @@ __metadata: languageName: node linkType: hard -"regex@npm:^4.3.2": - version: 4.3.3 - resolution: "regex@npm:4.3.3" - checksum: 10/e18a7069b77173d0f36981386b70eabbd7a9ebd988ac99f5e41fe5a8b2786871c9e50b99135590f6d5ab6b459079e7a1b6c917583f78eb0cc5b909bd5e45ff22 +"regex-recursion@npm:^5.1.1": + version: 5.1.1 + resolution: "regex-recursion@npm:5.1.1" + dependencies: + regex: "npm:^5.1.1" + regex-utilities: "npm:^2.3.0" + checksum: 10/9ec7e677743e00c14c3d5c63de1d15e5126a69c58da43e60b2c49abf940981f0269442c919e03f66d6837d0ac55ccf7981581e9d1be2a332a968c016edee226e + languageName: node + linkType: hard + +"regex-utilities@npm:^2.3.0": + version: 2.3.0 + resolution: "regex-utilities@npm:2.3.0" + checksum: 10/d11519c31f379488cbc6278b8645d72f16339ee325c79a4b8b3a6477738016a52983158dc69ae1b5867f8b06978ff5d83933520257a57f7e5c3e4ac6a1ea3cc7 + languageName: node + linkType: hard + +"regex@npm:^5.1.1": + version: 5.1.1 + resolution: "regex@npm:5.1.1" + dependencies: + regex-utilities: "npm:^2.3.0" + checksum: 10/956d0f34afa8086551dc9a0e2c575cb6d7ed5122d6d440a72cfbcd1f9adb5a3dcce4dcb61ec69eaecfcbc508cfd25075ac60d011bab5f28f1b2a36220e09a245 languageName: node linkType: hard "regexp.prototype.flags@npm:^1.5.3": - version: 1.5.3 - resolution: "regexp.prototype.flags@npm:1.5.3" + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" define-properties: "npm:^1.2.1" es-errors: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" set-function-name: "npm:^2.0.2" - checksum: 10/fe17bc4eebbc72945aaf9dd059eb7784a5ca453a67cc4b5b3e399ab08452c9a05befd92063e2c52e7b24d9238c60031656af32dd57c555d1ba6330dbf8c23b43 + checksum: 10/8ab897ca445968e0b96f6237641510f3243e59c180ee2ee8d83889c52ff735dd1bf3657fcd36db053e35e1d823dd53f2565d0b8021ea282c9fe62401c6c3bd6d languageName: node linkType: hard @@ -10108,7 +10164,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:1.22.8, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.22.3, resolve@npm:^1.22.4": +"resolve@npm:1.22.8": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -10121,6 +10177,19 @@ __metadata: languageName: node linkType: hard +"resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.22.3, resolve@npm:^1.22.4": + version: 1.22.10 + resolution: "resolve@npm:1.22.10" + dependencies: + is-core-module: "npm:^2.16.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/0a398b44da5c05e6e421d70108822c327675febb880eebe905587628de401854c61d5df02866ff34fc4cb1173a51c9f0e84a94702738df3611a62e2acdc68181 + languageName: node + linkType: hard + "resolve@npm:^2.0.0-next.5": version: 2.0.0-next.5 resolution: "resolve@npm:2.0.0-next.5" @@ -10134,7 +10203,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A1.22.8#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.3#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": +"resolve@patch:resolve@npm%3A1.22.8#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -10147,6 +10216,19 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.3#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": + version: 1.22.10 + resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.16.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/d4d878bfe3702d215ea23e75e0e9caf99468e3db76f5ca100d27ebdc527366fee3877e54bce7d47cc72ca8952fc2782a070d238bfa79a550eeb0082384c3b81a + languageName: node + linkType: hard + "resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin": version: 2.0.0-next.5 resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d" @@ -10191,17 +10273,6 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: "npm:^7.1.3" - bin: - rimraf: bin.js - checksum: 10/063ffaccaaaca2cfd0ef3beafb12d6a03dd7ff1260d752d62a6077b5dfff6ae81bea571f655bb6b589d366930ec1bdd285d40d560c0dae9b12f125e54eb743d5 - languageName: node - linkType: hard - "rimraf@npm:^5.0.5": version: 5.0.10 resolution: "rimraf@npm:5.0.10" @@ -10240,25 +10311,28 @@ __metadata: linkType: hard "rollup@npm:^4.20.0": - version: 4.24.0 - resolution: "rollup@npm:4.24.0" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.24.0" - "@rollup/rollup-android-arm64": "npm:4.24.0" - "@rollup/rollup-darwin-arm64": "npm:4.24.0" - "@rollup/rollup-darwin-x64": "npm:4.24.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.24.0" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.24.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.24.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.24.0" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.24.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.24.0" - "@rollup/rollup-linux-s390x-gnu": "npm:4.24.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.24.0" - "@rollup/rollup-linux-x64-musl": "npm:4.24.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.24.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.24.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.24.0" + version: 4.30.1 + resolution: "rollup@npm:4.30.1" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.30.1" + "@rollup/rollup-android-arm64": "npm:4.30.1" + "@rollup/rollup-darwin-arm64": "npm:4.30.1" + "@rollup/rollup-darwin-x64": "npm:4.30.1" + "@rollup/rollup-freebsd-arm64": "npm:4.30.1" + "@rollup/rollup-freebsd-x64": "npm:4.30.1" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.30.1" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.30.1" + "@rollup/rollup-linux-arm64-gnu": "npm:4.30.1" + "@rollup/rollup-linux-arm64-musl": "npm:4.30.1" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.30.1" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.30.1" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.30.1" + "@rollup/rollup-linux-s390x-gnu": "npm:4.30.1" + "@rollup/rollup-linux-x64-gnu": "npm:4.30.1" + "@rollup/rollup-linux-x64-musl": "npm:4.30.1" + "@rollup/rollup-win32-arm64-msvc": "npm:4.30.1" + "@rollup/rollup-win32-ia32-msvc": "npm:4.30.1" + "@rollup/rollup-win32-x64-msvc": "npm:4.30.1" "@types/estree": "npm:1.0.6" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -10270,6 +10344,10 @@ __metadata: optional: true "@rollup/rollup-darwin-x64": optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true "@rollup/rollup-linux-arm-gnueabihf": optional: true "@rollup/rollup-linux-arm-musleabihf": @@ -10278,6 +10356,8 @@ __metadata: optional: true "@rollup/rollup-linux-arm64-musl": optional: true + "@rollup/rollup-linux-loongarch64-gnu": + optional: true "@rollup/rollup-linux-powerpc64le-gnu": optional: true "@rollup/rollup-linux-riscv64-gnu": @@ -10298,7 +10378,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10/291dce8f180628a73d6749119a3e50aa917c416075302bc6f6ac655affc7f0ce9d7f025bef7318d424d0c5623dcb83e360f9ea0125273b6a2285c232172800cc + checksum: 10/f5d240a76a8c3cd7918f7dc97b7eaec5d97d27b3901e3843f74e18b4e9195c77abe8aa61575cd64ad7897f6a6dea6c68a7ad1a8073e3cf3139529e9fa7d06c2b languageName: node linkType: hard @@ -10309,6 +10389,13 @@ __metadata: languageName: node linkType: hard +"rrweb-cssom@npm:^0.8.0": + version: 0.8.0 + resolution: "rrweb-cssom@npm:0.8.0" + checksum: 10/07521ee36fb6569c17906afad1ac7ff8f099d49ade9249e190693ac36cdf27f88d9acf0cc66978935d5d0a23fca105643d7e9125b9a9d91ed9db9e02d31d7d80 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -10367,8 +10454,8 @@ __metadata: linkType: hard "sass@npm:^1.70.0": - version: 1.83.0 - resolution: "sass@npm:1.83.0" + version: 1.83.4 + resolution: "sass@npm:1.83.4" dependencies: "@parcel/watcher": "npm:^2.4.1" chokidar: "npm:^4.0.0" @@ -10379,7 +10466,7 @@ __metadata: optional: true bin: sass: sass.js - checksum: 10/cae7c489ffeb1324ac7e766dda60206a6d7a318d0689b490290a32a6414ef1fd0f376f92d45fb1610e507baa6f6594f1a61d4d706df2f105122ff9a83d2a28e1 + checksum: 10/9a7d1c6be1a9e711a1c561d189b9816aa7715f6d0ec0b2ec181f64163788d0caaf4741924eeadce558720b58b1de0e9b21b9dae6a0d14489c4d2a142d3f3b12e languageName: node linkType: hard @@ -10431,7 +10518,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.3.1": +"semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -10473,7 +10560,7 @@ __metadata: languageName: node linkType: hard -"ses@npm:^1.1.0, ses@npm:^1.10.0, ses@npm:^1.9.0, ses@npm:^1.9.1": +"ses@npm:^1.1.0, ses@npm:^1.10.0, ses@npm:^1.9.0": version: 1.10.0 resolution: "ses@npm:1.10.0" dependencies: @@ -10482,13 +10569,6 @@ __metadata: languageName: node linkType: hard -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 10/8980ebf7ae9eb945bb036b6e283c547ee783a1ad557a82babf758a065e2fb6ea337fd82cac30dd565c1e606e423f30024a19fff7afbf4977d784720c4026a8ef - languageName: node - linkType: hard - "set-function-length@npm:^1.2.2": version: 1.2.2 resolution: "set-function-length@npm:1.2.2" @@ -10526,6 +10606,13 @@ __metadata: languageName: node linkType: hard +"setimmediate@npm:^1.0.5": + version: 1.0.5 + resolution: "setimmediate@npm:1.0.5" + checksum: 10/76e3f5d7f4b581b6100ff819761f04a984fa3f3990e72a6554b57188ded53efce2d3d6c0932c10f810b7c59414f85e2ab3c11521877d1dea1ce0b56dc906f485 + languageName: node + linkType: hard + "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -10543,16 +10630,18 @@ __metadata: linkType: hard "shiki@npm:^1.16.2": - version: 1.22.0 - resolution: "shiki@npm:1.22.0" - dependencies: - "@shikijs/core": "npm:1.22.0" - "@shikijs/engine-javascript": "npm:1.22.0" - "@shikijs/engine-oniguruma": "npm:1.22.0" - "@shikijs/types": "npm:1.22.0" - "@shikijs/vscode-textmate": "npm:^9.3.0" + version: 1.27.2 + resolution: "shiki@npm:1.27.2" + dependencies: + "@shikijs/core": "npm:1.27.2" + "@shikijs/engine-javascript": "npm:1.27.2" + "@shikijs/engine-oniguruma": "npm:1.27.2" + "@shikijs/langs": "npm:1.27.2" + "@shikijs/themes": "npm:1.27.2" + "@shikijs/types": "npm:1.27.2" + "@shikijs/vscode-textmate": "npm:^10.0.1" "@types/hast": "npm:^3.0.4" - checksum: 10/025b19f78133764410822d1abe89b8f902f63698acb5e3ba2126f0395a629ed5527b7dfba84e6b12c1fbaa1fcfe9556345a3519faa1219fdf013fa23eae4aedc + checksum: 10/dd5496d0f3d2727bfcd51f7576805e8e17fd75e4979538ef7942a8e93ec3bdc5c701729ace79e60e9d0f63004889998dd3846208492ea3a308377f28b30c4342 languageName: node linkType: hard @@ -10611,7 +10700,7 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.3": +"signal-exit@npm:^3.0.3": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 10/a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 @@ -10714,13 +10803,13 @@ __metadata: linkType: hard "socks-proxy-agent@npm:^8.0.3": - version: 8.0.4 - resolution: "socks-proxy-agent@npm:8.0.4" + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" dependencies: - agent-base: "npm:^7.1.1" + agent-base: "npm:^7.1.2" debug: "npm:^4.3.4" socks: "npm:^2.8.3" - checksum: 10/c8e7c2b398338b49a0a0f4d2bae5c0602aeeca6b478b99415927b6c5db349ca258448f2c87c6958ebf83eea17d42cbc5d1af0bfecb276cac10b9658b0f07f7d7 + checksum: 10/ee99e1dacab0985b52cbe5a75640be6e604135e9489ebdc3048635d186012fbaecc20fbbe04b177dee434c319ba20f09b3e7dfefb7d932466c0d707744eac05c languageName: node linkType: hard @@ -10741,9 +10830,9 @@ __metadata: languageName: node linkType: hard -"sort-package-json@npm:2.12.0": - version: 2.12.0 - resolution: "sort-package-json@npm:2.12.0" +"sort-package-json@npm:2.13.0": + version: 2.13.0 + resolution: "sort-package-json@npm:2.13.0" dependencies: detect-indent: "npm:^7.0.1" detect-newline: "npm:^4.0.0" @@ -10755,7 +10844,7 @@ __metadata: tinyglobby: "npm:^0.2.9" bin: sort-package-json: cli.js - checksum: 10/3696e396f6f485250b714f8fae542ee7cef25765446abdc4c90511d1bb581e9315ce47e91aebb3b23f97e9338d4e3082b8b5158208ebdf7a3c0fc70673642b7f + checksum: 10/06081222ca6a0affddb613d6ee703012aba460b3b41930a229b1ba222f5829fc5dba996b69e229c198164112600455dc3178bbd7819f80c33503dbea61f67fac languageName: node linkType: hard @@ -10839,9 +10928,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.20 - resolution: "spdx-license-ids@npm:3.0.20" - checksum: 10/30e566ea74b04232c64819d1f5313c00d92e9c73d054541650331fc794499b3bcc4991bcd90fa3c2fc4d040006f58f63104706255266e87a9d452e6574afc60c + version: 3.0.21 + resolution: "spdx-license-ids@npm:3.0.21" + checksum: 10/17a033b4c3485f081fc9faa1729dde8782a85d9131b156f2397c71256c2e1663132857d3cba1457c4965f179a4dcf1b69458a31e9d3d0c766d057ef0e3a0b4f2 languageName: node linkType: hard @@ -10928,7 +11017,7 @@ __metadata: languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -11170,7 +11259,7 @@ __metadata: languageName: node linkType: hard -"supports-hyperlinks@npm:^3.0.0": +"supports-hyperlinks@npm:^3.1.0": version: 3.1.0 resolution: "supports-hyperlinks@npm:3.1.0" dependencies: @@ -11212,14 +11301,14 @@ __metadata: linkType: hard "tar-fs@npm:^2.0.0": - version: 2.1.1 - resolution: "tar-fs@npm:2.1.1" + version: 2.1.2 + resolution: "tar-fs@npm:2.1.2" dependencies: chownr: "npm:^1.1.1" mkdirp-classic: "npm:^0.5.2" pump: "npm:^3.0.0" tar-stream: "npm:^2.1.4" - checksum: 10/526deae025453e825f87650808969662fbb12eb0461d033e9b447de60ec951c6c4607d0afe7ce057defe9d4e45cf80399dd74bc15f9d9e0773d5e990a78ce4ac + checksum: 10/623f7e8e58a43578ba7368002c3cc7e321f6d170053ac0691d95172dbc7daf5dcf4347eb061277627340870ce6cfda89f5a5d633cc274c41ae6d69f54a2374e7 languageName: node linkType: hard @@ -11250,7 +11339,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^7.4.3": +"tar@npm:^7.4.0, tar@npm:^7.4.3": version: 7.4.3 resolution: "tar@npm:7.4.3" dependencies: @@ -11410,15 +11499,6 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^1.3.0": - version: 1.3.0 - resolution: "ts-api-utils@npm:1.3.0" - peerDependencies: - typescript: ">=4.2.0" - checksum: 10/3ee44faa24410cd649b5c864e068d438aa437ef64e9e4a66a41646a6d3024d3097a695eeb3fb26ee364705d3cb9653a65756d009e6a53badb6066a5f447bf7ed - languageName: node - linkType: hard - "ts-api-utils@npm:^2.0.0": version: 2.0.0 resolution: "ts-api-utils@npm:2.0.0" @@ -11429,11 +11509,11 @@ __metadata: linkType: hard "ts-blank-space@npm:^0.4.1": - version: 0.4.3 - resolution: "ts-blank-space@npm:0.4.3" + version: 0.4.4 + resolution: "ts-blank-space@npm:0.4.4" dependencies: - typescript: "npm:5.1.6 - 5.6.x" - checksum: 10/4859f000d1d7b0cc1e2ade068f93f4a710e7d03b07c65df5cbeee4abb8091e2635f9949b16336135d5f17bebd8337d9307a130daf47a897aa7373e5c3b4e4728 + typescript: "npm:5.1.6 - 5.7.x" + checksum: 10/9309d6145e300e3935e3f39c9ddff86fc2bd994b08e9e40f4303b66f9582cd73276acea3185145e13f3ec222dd35d7543eff2d7747f84a80038f2fa720ffbb7d languageName: node linkType: hard @@ -11503,6 +11583,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:4.30.0": + version: 4.30.0 + resolution: "type-fest@npm:4.30.0" + checksum: 10/46c733df4feb87dfd281fba4fa3913dc38b45136be35adffbcef95e13414105a4669476c1f8686680b9c98e59ed5dc85efe42caf67adbaa04f48dfc41f8330fa + languageName: node + linkType: hard + "type-fest@npm:^0.13.1": version: 0.13.1 resolution: "type-fest@npm:0.13.1" @@ -11518,9 +11605,9 @@ __metadata: linkType: hard "type-fest@npm:^4.26.1": - version: 4.26.1 - resolution: "type-fest@npm:4.26.1" - checksum: 10/b82676194f80af228cb852e320d2ea8381c89d667d2e4d9f2bdfc8f254bccc039c7741a90c53617a4de0c9fdca8265ed18eb0888cd628f391c5c381c33a9f94b + version: 4.32.0 + resolution: "type-fest@npm:4.32.0" + checksum: 10/7cee33a2d82c992e97e85eca4016a7dd62239fc6f95a7f86d46671900cad594eda832d97a1d4231d3bb2ed7ff5144c5f3cf4644e1f722faa4e6decef0c5276ca languageName: node linkType: hard @@ -11578,8 +11665,8 @@ __metadata: linkType: hard "typedoc@npm:^0.26.8": - version: 0.26.9 - resolution: "typedoc@npm:0.26.9" + version: 0.26.11 + resolution: "typedoc@npm:0.26.11" dependencies: lunr: "npm:^2.3.9" markdown-it: "npm:^14.1.0" @@ -11590,21 +11677,21 @@ __metadata: typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x bin: typedoc: bin/typedoc - checksum: 10/6cc86b3a889374f0f3e17c568bdc04a845531da7af761f644ba214953284cb9620d012111f360678a687110c730abcb473b936b74893aa0e24277fce6c22de0f + checksum: 10/969833b6ffaf1afc96ade3e2b6e594d2f072cc6e92bbc02e40f73c26e16eae8df01b63ccc4a445e2ef9ea2d3c7901ec7c8af476af526225a4b02ed014cdf88b7 languageName: node linkType: hard "typescript-eslint@npm:^8.8.1": - version: 8.9.0 - resolution: "typescript-eslint@npm:8.9.0" + version: 8.20.0 + resolution: "typescript-eslint@npm:8.20.0" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.9.0" - "@typescript-eslint/parser": "npm:8.9.0" - "@typescript-eslint/utils": "npm:8.9.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/34ec65b9f3b9b2a8a17e02bf85c3eab1b9c8a1ccd51883038a2e69f8064177de68916b92976d3b1fe96e52c95898e0de204f43269b76e2230fbefad41cf9b061 + "@typescript-eslint/eslint-plugin": "npm:8.20.0" + "@typescript-eslint/parser": "npm:8.20.0" + "@typescript-eslint/utils": "npm:8.20.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10/5d72ec36d9a6a519cedb003af28bdad37560999a6f8a126193098ff403d6cc6947f3f27d09171d446bc62e43a1aeb00563ce1adfc85014a011993bfa2c95a20f languageName: node linkType: hard @@ -11634,13 +11721,13 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.1.6 - 5.6.x": - version: 5.6.3 - resolution: "typescript@npm:5.6.3" +"typescript@npm:5.1.6 - 5.7.x": + version: 5.7.3 + resolution: "typescript@npm:5.7.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/c328e418e124b500908781d9f7b9b93cf08b66bf5936d94332b463822eea2f4e62973bfb3b8a745fdc038785cb66cf59d1092bac3ec2ac6a3e5854687f7833f1 + checksum: 10/6a7e556de91db3d34dc51cd2600e8e91f4c312acd8e52792f243c7818dfadb27bae677175fad6947f9c81efb6c57eb6b2d0c736f196a6ee2f1f7d57b74fc92fa languageName: node linkType: hard @@ -11664,13 +11751,13 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.1.6 - 5.6.x#optional!builtin": - version: 5.6.3 - resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=b45daf" +"typescript@patch:typescript@npm%3A5.1.6 - 5.7.x#optional!builtin": + version: 5.7.3 + resolution: "typescript@patch:typescript@npm%3A5.7.3#optional!builtin::version=5.7.3&hash=b45daf" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/dc4bec403cd33a204b655b1152a096a08e7bad2c931cb59ef8ff26b6f2aa541bf98f09fc157958a60c921b1983a8dde9a85b692f9de60fa8f574fd131e3ae4dd + checksum: 10/3ac7b7e3e899273d2fbdce6e24b93d4d53a705ad7a7e4cc83b4c57bcb6d25948abcd2a21994f6b9c73ab03960f395aae95f0458de292a66ce0134233261714c3 languageName: node linkType: hard @@ -11721,9 +11808,9 @@ __metadata: linkType: hard "undici@npm:^6.19.5": - version: 6.20.1 - resolution: "undici@npm:6.20.1" - checksum: 10/68604b53754a95ec89d52efc08fe3e70e333997300c9a5b69f2b6496f1f0f568b2e35adec6442985a7b1d2f7a5648ef5062d1736e4d68082d473cb82177674bc + version: 6.21.1 + resolution: "undici@npm:6.21.1" + checksum: 10/eeccc07e9073ae8e755fdc0dc8cdfaa426c01ec6f815425c3ecedba2e5394cea4993962c040dd168951714a82f0d001a13018c3ae3ad4534f0fa97afe425c08d languageName: node linkType: hard @@ -11846,17 +11933,17 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.0": - version: 1.1.1 - resolution: "update-browserslist-db@npm:1.1.1" +"update-browserslist-db@npm:^1.1.1": + version: 1.1.2 + resolution: "update-browserslist-db@npm:1.1.2" dependencies: escalade: "npm:^3.2.0" - picocolors: "npm:^1.1.0" + picocolors: "npm:^1.1.1" peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10/7678dd8609750588d01aa7460e8eddf2ff9d16c2a52fb1811190e0d056390f1fdffd94db3cf8fb209cf634ab4fa9407886338711c71cc6ccade5eeb22b093734 + checksum: 10/e7bf8221dfb21eba4a770cd803df94625bb04f65a706aa94c567de9600fe4eb6133fda016ec471dad43b9e7959c1bffb6580b5e20a87808d2e8a13e3892699a9 languageName: node linkType: hard @@ -12037,8 +12124,8 @@ __metadata: linkType: hard "vite@npm:^5.0.0, vite@npm:^5.3.5": - version: 5.4.9 - resolution: "vite@npm:5.4.9" + version: 5.4.11 + resolution: "vite@npm:5.4.11" dependencies: esbuild: "npm:^0.21.3" fsevents: "npm:~2.3.3" @@ -12075,7 +12162,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10/60dfb3912ba6367d2d128e798d899caae3f4ec58990657b9f679c4d9de21ddec7eba5f6ad3d4fa0e8ea31771d477521b8e757a622ecc54829d73cb7f7c146bc4 + checksum: 10/719c4dea896e9547958643354003c8c9ea98e5367196d98f5f46cffb3ec963fead3ea5853f5af941c79bbfb73583dec19bbb0d28d2f644b95d7f59c55e22919d languageName: node linkType: hard @@ -12252,12 +12339,12 @@ __metadata: linkType: hard "whatwg-url@npm:^14.0.0": - version: 14.0.0 - resolution: "whatwg-url@npm:14.0.0" + version: 14.1.0 + resolution: "whatwg-url@npm:14.1.0" dependencies: tr46: "npm:^5.0.0" webidl-conversions: "npm:^7.0.0" - checksum: 10/67ea7a359a90663b28c816d76379b4be62d13446e9a4c0ae0b5ae0294b1c22577750fcdceb40827bb35a61777b7093056953c856604a28b37d6a209ba59ad062 + checksum: 10/3afd325de6cf3a367820ce7c3566a1f78eb1409c4f27b1867c74c76dab096d26acedf49a8b9b71db53df7d806ec2e9ae9ed96990b2f7d1abe6ecf1fe753af6eb languageName: node linkType: hard @@ -12387,15 +12474,6 @@ __metadata: languageName: node linkType: hard -"wide-align@npm:^1.1.2": - version: 1.1.5 - resolution: "wide-align@npm:1.1.5" - dependencies: - string-width: "npm:^1.0.2 || 2 || 3 || 4" - checksum: 10/d5f8027b9a8255a493a94e4ec1b74a27bff6679d5ffe29316a3215e4712945c84ef73ca4045c7e20ae7d0c72f5f57f296e04a4928e773d4276a2f1222e4c2e99 - languageName: node - linkType: hard - "word-wrap@npm:^1.2.5": version: 1.2.5 resolution: "word-wrap@npm:1.2.5" @@ -12546,20 +12624,20 @@ __metadata: linkType: hard "yaml@npm:^2.5.1": - version: 2.6.0 - resolution: "yaml@npm:2.6.0" + version: 2.7.0 + resolution: "yaml@npm:2.7.0" bin: yaml: bin.mjs - checksum: 10/f4369f667c7626c216ea81b5840fe9b530cdae4cff2d84d166ec1239e54bf332dbfac4a71bf60d121f8e85e175364a4e280a520292269b6cf9d074368309adf9 + checksum: 10/c8c314c62fbd49244a6a51b06482f6d495b37ab10fa685fcafa1bbaae7841b7233ee7d12cab087bcca5a0b28adc92868b6e437322276430c28d00f1c1732eeec languageName: node linkType: hard -"yaml@npm:~2.5.0": - version: 2.5.1 - resolution: "yaml@npm:2.5.1" +"yaml@npm:~2.6.1": + version: 2.6.1 + resolution: "yaml@npm:2.6.1" bin: yaml: bin.mjs - checksum: 10/0eecb679db75ea6a989ad97715a9fa5d946972945aa6aa7d2175bca66c213b5564502ccb1cdd04b1bf816ee38b5c43e4e2fda3ff6f5e09da24dabb51ae92c57d + checksum: 10/cf412f03a33886db0a3aac70bb4165588f4c5b3c6f8fc91520b71491e5537800b6c2c73ed52015617f6e191eb4644c73c92973960a1999779c62a200ee4c231d languageName: node linkType: hard