mirror of
https://github.com/moeru-ai/airi.git
synced 2026-08-14 08:52:42 +00:00
fix(stage-tamagotchi): should handle EADDRINUSE, bug of srvx, robust for server channel restart, injeca fix
This commit is contained in:
@@ -87,6 +87,7 @@
|
||||
"@xsai/utils-chat": "catalog:",
|
||||
"alien-signals": "catalog:",
|
||||
"animejs": "^4.3.6",
|
||||
"async-mutex": "catalog:",
|
||||
"colorjs.io": "^0.6.1",
|
||||
"crossws": "^0.4.4",
|
||||
"culori": "^4.0.2",
|
||||
@@ -98,7 +99,7 @@
|
||||
"electron-click-drag-plugin": "^2.0.2",
|
||||
"electron-updater": "^6.8.3",
|
||||
"es-toolkit": "^1.44.0",
|
||||
"h3": "2.0.1-rc.5",
|
||||
"h3": "^2.0.1-rc.14",
|
||||
"injeca": "catalog:",
|
||||
"jszip": "^3.10.1",
|
||||
"localforage": "^1.10.0",
|
||||
|
||||
@@ -11,7 +11,7 @@ import { Format, LogLevel, setGlobalFormat, setGlobalHookPostLog, setGlobalLogLe
|
||||
import { initScreenCaptureForMain } from '@proj-airi/electron-screen-capture/main'
|
||||
import { app, ipcMain } from 'electron'
|
||||
import { noop } from 'es-toolkit'
|
||||
import { createLoggLogger, injeca } from 'injeca'
|
||||
import { createLoggLogger, injeca, lifecycle } from 'injeca'
|
||||
import { isLinux } from 'std-env'
|
||||
|
||||
import icon from '../../resources/icon.png?asset'
|
||||
@@ -106,8 +106,8 @@ app.whenReady().then(async () => {
|
||||
})
|
||||
|
||||
const serverChannel = injeca.provide('modules:channel-server', {
|
||||
dependsOn: { app: electronApp },
|
||||
build: async () => setupServerChannel(),
|
||||
dependsOn: { app: electronApp, lifecycle },
|
||||
build: async ({ dependsOn }) => setupServerChannel(dependsOn),
|
||||
})
|
||||
|
||||
const mcpStdioManager = injeca.provide('modules:mcp-stdio-manager', {
|
||||
|
||||
@@ -1,134 +1,66 @@
|
||||
import type { ElectronServerChannelTlsConfig } from '../../../../shared/eventa'
|
||||
import type { Server, ServerOptions } from '@proj-airi/server-runtime/server'
|
||||
import type { Lifecycle } from 'injeca'
|
||||
|
||||
import { X509Certificate } from 'node:crypto'
|
||||
import { existsSync, readFileSync, writeFileSync } from 'node:fs'
|
||||
import { isIP } from 'node:net'
|
||||
import { networkInterfaces } from 'node:os'
|
||||
import { join } from 'node:path'
|
||||
import { env, platform } from 'node:process'
|
||||
|
||||
import { useLogg } from '@guiiai/logg'
|
||||
import { defineInvokeHandler } from '@moeru/eventa'
|
||||
import { createContext } from '@moeru/eventa/adapters/electron/main'
|
||||
import { createServer, getLocalIPs } from '@proj-airi/server-runtime/server'
|
||||
import { Mutex } from 'async-mutex'
|
||||
import { app, ipcMain } from 'electron'
|
||||
import { createCA, createCert } from 'mkcert'
|
||||
import { x } from 'tinyexec'
|
||||
import { nullable, object, record, string, unknown } from 'valibot'
|
||||
import { nullable, object, optional, string } from 'valibot'
|
||||
import { z } from 'zod'
|
||||
|
||||
import {
|
||||
electronApplyServerChannelConfig,
|
||||
electronGetServerChannelConfig,
|
||||
} from '../../../../shared/eventa'
|
||||
import { onAppBeforeQuit } from '../../../libs/bootkit/lifecycle'
|
||||
import { createConfig } from '../../../libs/electron/persistence'
|
||||
|
||||
interface ServerInstance { close: (closeActiveConnections?: boolean) => Promise<void> }
|
||||
interface ServerChannelOptions { websocketTlsConfig?: ElectronServerChannelTlsConfig | null }
|
||||
|
||||
export interface ServerChannel {
|
||||
start: () => Promise<void>
|
||||
stop: () => Promise<void>
|
||||
restart: () => Promise<void>
|
||||
updateConfig: (newOptions: ServerChannelOptions) => void
|
||||
}
|
||||
|
||||
let isServerQuitHookRegistered = false
|
||||
|
||||
const channelServerConfigSchema = object({
|
||||
websocketTlsConfig: nullable(record(string(), unknown())),
|
||||
tlsConfig: optional(nullable(object({
|
||||
cert: optional(string()),
|
||||
key: optional(string()),
|
||||
passphrase: optional(string()),
|
||||
}))),
|
||||
})
|
||||
|
||||
const channelServerInvokeConfigSchema = z.object({
|
||||
websocketTlsConfig: z.record(z.string(), z.unknown()).nullable().optional(),
|
||||
tlsConfig: z.object({ }).nullable().optional(),
|
||||
}).strict()
|
||||
|
||||
const channelServerConfigStore = createConfig('server-channel', 'config.json', channelServerConfigSchema, {
|
||||
default: {
|
||||
websocketTlsConfig: null,
|
||||
tlsConfig: null,
|
||||
},
|
||||
autoHeal: true,
|
||||
})
|
||||
|
||||
function getChannelServerConfig() {
|
||||
return channelServerConfigStore.get() ?? { websocketTlsConfig: null }
|
||||
async function getChannelServerConfig(): Promise<ServerOptions> {
|
||||
return channelServerConfigStore.get() || { tlsConfig: null }
|
||||
}
|
||||
|
||||
function normalizeChannelServerOptions(
|
||||
payload: unknown,
|
||||
fallback = getChannelServerConfig(),
|
||||
) {
|
||||
async function normalizeChannelServerOptions(payload: unknown, fallback?: ServerOptions) {
|
||||
if (!fallback) {
|
||||
fallback = await getChannelServerConfig()
|
||||
}
|
||||
|
||||
const parsed = channelServerInvokeConfigSchema.safeParse(payload)
|
||||
if (!parsed.success) {
|
||||
return fallback
|
||||
}
|
||||
|
||||
return {
|
||||
websocketTlsConfig: typeof parsed.data.websocketTlsConfig === 'undefined' ? null : parsed.data.websocketTlsConfig,
|
||||
tlsConfig: typeof parsed.data.tlsConfig === 'undefined' ? null : parsed.data.tlsConfig,
|
||||
}
|
||||
}
|
||||
|
||||
function registerServerQuitHook(getServerChannel: () => ServerChannel | null) {
|
||||
if (isServerQuitHookRegistered)
|
||||
return
|
||||
|
||||
isServerQuitHookRegistered = true
|
||||
|
||||
onAppBeforeQuit(async () => {
|
||||
const log = useLogg('main/server-runtime').useGlobalConfig()
|
||||
const serverChannel = getServerChannel()
|
||||
if (!serverChannel) {
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
await serverChannel.stop()
|
||||
log.log('WebSocket server closed')
|
||||
}
|
||||
catch (error) {
|
||||
log.withError(error).error('Error closing WebSocket server')
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function getLocalIPs(): string[] {
|
||||
const interfaces = networkInterfaces()
|
||||
const addresses: string[] = []
|
||||
|
||||
const VIRTUAL_INTERFACE_PREFIXES = [
|
||||
'vboxnet',
|
||||
'vmnet',
|
||||
'docker',
|
||||
'br-',
|
||||
'veth',
|
||||
'utun',
|
||||
'wg',
|
||||
'tap',
|
||||
'tun',
|
||||
]
|
||||
const isVirtualInterface = (name: string) =>
|
||||
VIRTUAL_INTERFACE_PREFIXES.some(prefix => name.startsWith(prefix))
|
||||
|
||||
for (const [name, entries] of Object.entries(interfaces)) {
|
||||
if (!entries)
|
||||
continue
|
||||
if (isVirtualInterface(name))
|
||||
continue
|
||||
|
||||
for (const entry of entries) {
|
||||
const rawAddress = entry.address
|
||||
if (!rawAddress)
|
||||
continue
|
||||
|
||||
const address = rawAddress.includes('%') ? rawAddress.split('%')[0] : rawAddress
|
||||
if (isIP(address))
|
||||
addresses.push(address)
|
||||
}
|
||||
}
|
||||
|
||||
return addresses
|
||||
}
|
||||
|
||||
function getCertificateDomains(): string[] {
|
||||
const localIPs = getLocalIPs()
|
||||
const hostname = env.SERVER_RUNTIME_HOSTNAME
|
||||
@@ -264,170 +196,132 @@ async function getOrCreateCertificate() {
|
||||
return { cert, key }
|
||||
}
|
||||
|
||||
export function createServerChannel(initialOptions: ServerChannelOptions = getChannelServerConfig()): ServerChannel {
|
||||
const log = useLogg('main/server-runtime').useGlobalConfig()
|
||||
let serverInstance: ServerInstance | null = null
|
||||
let options = initialOptions
|
||||
export async function setupServerChannel(params: { lifecycle: Lifecycle }): Promise<Server> {
|
||||
channelServerConfigStore.setup()
|
||||
|
||||
log.withFields({ hasTlsConfig: !!options.websocketTlsConfig }).log('creating server channel')
|
||||
const storedConfig = await getChannelServerConfig()
|
||||
|
||||
async function closeServer(closeActiveConnections = false) {
|
||||
if (!serverInstance || typeof serverInstance.close !== 'function') {
|
||||
return
|
||||
}
|
||||
const serverChannel = createServer({
|
||||
...storedConfig,
|
||||
port: env.PORT ? Number.parseInt(env.PORT) : 6121,
|
||||
hostname: env.SERVER_RUNTIME_HOSTNAME || '0.0.0.0',
|
||||
tlsConfig: storedConfig.tlsConfig ? await getOrCreateCertificate() : null,
|
||||
})
|
||||
|
||||
const mutex = new Mutex()
|
||||
|
||||
params.lifecycle.appHooks.onStart(async () => {
|
||||
const release = await mutex.acquire()
|
||||
|
||||
const log = useLogg('main/server-runtime').useGlobalConfig()
|
||||
|
||||
try {
|
||||
if (closeActiveConnections) {
|
||||
log.log('closing existing server instance')
|
||||
}
|
||||
await serverInstance.close(closeActiveConnections)
|
||||
if (closeActiveConnections) {
|
||||
log.log('existing server instance closed')
|
||||
}
|
||||
await serverChannel.start()
|
||||
log.log('WebSocket server started')
|
||||
}
|
||||
catch (error) {
|
||||
const nodejsError = error as NodeJS.ErrnoException
|
||||
if ('code' in nodejsError && nodejsError.code === 'ERR_SERVER_NOT_RUNNING') {
|
||||
return
|
||||
}
|
||||
|
||||
if (!closeActiveConnections) {
|
||||
log.withError(error).error('Error closing WebSocket server')
|
||||
}
|
||||
log.withError(error).error('Error starting WebSocket server')
|
||||
}
|
||||
finally {
|
||||
serverInstance = null
|
||||
release()
|
||||
}
|
||||
}
|
||||
})
|
||||
params.lifecycle.appHooks.onStop(async () => {
|
||||
const release = await mutex.acquire()
|
||||
|
||||
async function start() {
|
||||
if (serverInstance) {
|
||||
const log = useLogg('main/server-runtime').useGlobalConfig()
|
||||
if (!serverChannel) {
|
||||
return
|
||||
}
|
||||
|
||||
const secureEnabled = options?.websocketTlsConfig != null
|
||||
|
||||
try {
|
||||
const serverRuntime = await import('@proj-airi/server-runtime')
|
||||
const { plugin: ws } = await import('crossws/server')
|
||||
const { serve } = await import('h3')
|
||||
|
||||
const h3App = serverRuntime.setupApp()
|
||||
|
||||
const port = env.PORT ? Number(env.PORT) : 6121
|
||||
const hostname = env.SERVER_RUNTIME_HOSTNAME || '0.0.0.0'
|
||||
|
||||
// FIXME: should prompt user to grant permission to save certificate files on macOS
|
||||
const tls = secureEnabled ? await getOrCreateCertificate() : undefined
|
||||
|
||||
const instance = serve(h3App.app, {
|
||||
// @ts-expect-error - the .crossws property wasn't extended in types
|
||||
plugins: [ws({ resolve: async req => (await h3App.app.fetch(req)).crossws })],
|
||||
port,
|
||||
hostname,
|
||||
tls,
|
||||
reusePort: true,
|
||||
silent: true,
|
||||
manual: true,
|
||||
gracefulShutdown: {
|
||||
forceTimeout: 0.5,
|
||||
gracefulTimeout: 0.5,
|
||||
},
|
||||
})
|
||||
|
||||
serverInstance = {
|
||||
close: async (closeActiveConnections = false) => {
|
||||
log.log('closing all peers')
|
||||
h3App.closeAllPeers()
|
||||
log.log('closing server instance')
|
||||
await instance.close(closeActiveConnections)
|
||||
log.log('server instance closed')
|
||||
},
|
||||
}
|
||||
|
||||
const servePromise = instance.serve()
|
||||
if (servePromise instanceof Promise) {
|
||||
servePromise.catch((error) => {
|
||||
const nodejsError = error as NodeJS.ErrnoException
|
||||
if ('code' in nodejsError && nodejsError.code === 'EADDRINUSE') {
|
||||
log.withError(error).warn('Port already in use, assuming server is already running')
|
||||
return
|
||||
}
|
||||
|
||||
log.withError(error).error('Error serving WebSocket server')
|
||||
})
|
||||
}
|
||||
|
||||
const protocol = secureEnabled ? 'wss' : 'ws'
|
||||
if (hostname === '0.0.0.0') {
|
||||
const ips = getLocalIPs().filter(ip => ip !== '127.0.0.1' && ip !== '::1')
|
||||
const targets = ips.length > 0 ? ips.join(', ') : 'localhost'
|
||||
log.log(`@proj-airi/server-runtime started on ${protocol}://0.0.0.0:${port} (reachable via: ${targets})`)
|
||||
}
|
||||
else {
|
||||
log.log(`@proj-airi/server-runtime started on ${protocol}://${hostname}:${port}`)
|
||||
}
|
||||
await serverChannel.stop()
|
||||
log.log('WebSocket server closed')
|
||||
}
|
||||
catch (error) {
|
||||
log.withError(error).error('failed to start WebSocket server')
|
||||
log.withError(error).error('Error closing WebSocket server')
|
||||
}
|
||||
}
|
||||
|
||||
async function stop() {
|
||||
await closeServer()
|
||||
}
|
||||
|
||||
async function restart() {
|
||||
log.log('restarting server channel', { options })
|
||||
await closeServer(true)
|
||||
await start()
|
||||
}
|
||||
|
||||
async function updateConfig(newOptions: ServerChannelOptions) {
|
||||
options = { ...options, ...newOptions }
|
||||
}
|
||||
finally {
|
||||
release()
|
||||
}
|
||||
})
|
||||
|
||||
return {
|
||||
start,
|
||||
stop,
|
||||
restart,
|
||||
updateConfig,
|
||||
getConnectionHost() {
|
||||
return serverChannel.getConnectionHost()
|
||||
},
|
||||
async start() {
|
||||
const release = await mutex.acquire()
|
||||
try {
|
||||
await serverChannel.start()
|
||||
}
|
||||
finally {
|
||||
release()
|
||||
}
|
||||
},
|
||||
async restart() {
|
||||
const release = await mutex.acquire()
|
||||
try {
|
||||
await serverChannel.stop()
|
||||
await serverChannel.start()
|
||||
}
|
||||
finally {
|
||||
release()
|
||||
}
|
||||
},
|
||||
async stop() {
|
||||
const release = await mutex.acquire()
|
||||
try {
|
||||
await serverChannel.stop()
|
||||
}
|
||||
finally {
|
||||
release()
|
||||
}
|
||||
},
|
||||
async updateConfig(config) {
|
||||
const release = await mutex.acquire()
|
||||
try {
|
||||
await serverChannel.updateConfig(config)
|
||||
}
|
||||
finally {
|
||||
release()
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
export async function setupServerChannel() {
|
||||
channelServerConfigStore.setup()
|
||||
const serverChannel = createServerChannel(getChannelServerConfig())
|
||||
registerServerQuitHook(() => serverChannel)
|
||||
|
||||
// Start the server during module initialization so startup is bound to injeca lifecycle.
|
||||
await serverChannel.start()
|
||||
return serverChannel
|
||||
}
|
||||
|
||||
export async function createServerChannelService(params: { serverChannel: ServerChannel }) {
|
||||
export async function createServerChannelService(params: { serverChannel: Server }) {
|
||||
const { context } = createContext(ipcMain)
|
||||
|
||||
defineInvokeHandler(context, electronGetServerChannelConfig, async () => {
|
||||
return getChannelServerConfig()
|
||||
return await getChannelServerConfig()
|
||||
})
|
||||
|
||||
defineInvokeHandler(context, electronApplyServerChannelConfig, async (req) => {
|
||||
const current = getChannelServerConfig()
|
||||
const next = normalizeChannelServerOptions(req, current)
|
||||
const changed = JSON.stringify(next.websocketTlsConfig) !== JSON.stringify(current.websocketTlsConfig)
|
||||
try {
|
||||
const current = await getChannelServerConfig()
|
||||
const next = await normalizeChannelServerOptions(req, current)
|
||||
const changed = JSON.stringify(next.tlsConfig) !== JSON.stringify(current.tlsConfig)
|
||||
|
||||
channelServerConfigStore.update(next)
|
||||
channelServerConfigStore.update(next)
|
||||
|
||||
if (changed) {
|
||||
await params.serverChannel.stop()
|
||||
await params.serverChannel.updateConfig(next)
|
||||
await params.serverChannel.start()
|
||||
if (changed) {
|
||||
await params.serverChannel.stop()
|
||||
await params.serverChannel.updateConfig({
|
||||
port: env.PORT ? Number.parseInt(env.PORT) : 6121,
|
||||
hostname: env.SERVER_RUNTIME_HOSTNAME || '0.0.0.0',
|
||||
tlsConfig: next.tlsConfig ? await getOrCreateCertificate() : null,
|
||||
})
|
||||
await params.serverChannel.start()
|
||||
}
|
||||
else {
|
||||
await params.serverChannel.start()
|
||||
}
|
||||
|
||||
return next
|
||||
}
|
||||
else {
|
||||
await params.serverChannel.start()
|
||||
catch (error) {
|
||||
useLogg('main/server-runtime').withError(error).error('Failed to apply server channel configuration')
|
||||
}
|
||||
|
||||
return next
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import type { ElectronServerChannelTlsConfig } from '../../../shared/eventa'
|
||||
|
||||
import { useElectronEventaInvoke } from '@proj-airi/electron-vueuse'
|
||||
import { useAsyncState, useLocalStorage } from '@vueuse/core'
|
||||
import { defineStore } from 'pinia'
|
||||
@@ -8,7 +6,7 @@ import { watch } from 'vue'
|
||||
import { electronApplyServerChannelConfig, electronGetServerChannelConfig } from '../../../shared/eventa'
|
||||
|
||||
export const useServerChannelSettingsStore = defineStore('tamagotchi-server-channel-settings', () => {
|
||||
const websocketTlsConfig = useLocalStorage<ElectronServerChannelTlsConfig | null>('settings/server-channel/websocket-tls-config', null)
|
||||
const websocketTlsConfig = useLocalStorage<{ cert?: string, key?: string, passphrase?: string } | null>('settings/server-channel/websocket-tls-config', null)
|
||||
|
||||
const getServerChannelConfig = useElectronEventaInvoke(electronGetServerChannelConfig)
|
||||
const applyServerChannelConfig = useElectronEventaInvoke(electronApplyServerChannelConfig)
|
||||
@@ -17,11 +15,11 @@ export const useServerChannelSettingsStore = defineStore('tamagotchi-server-chan
|
||||
|
||||
watch(websocketTlsConfig, async (newValue) => {
|
||||
websocketTlsConfig.value = newValue
|
||||
await applyServerChannelConfig({ websocketTlsConfig: newValue ? {} : null })
|
||||
await applyServerChannelConfig({ tlsConfig: newValue ? {} : null })
|
||||
})
|
||||
|
||||
watch(serverChannelConfig.state, (newConfig) => {
|
||||
websocketTlsConfig.value = newConfig?.websocketTlsConfig
|
||||
websocketTlsConfig.value = newConfig?.tlsConfig
|
||||
})
|
||||
|
||||
return {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { Locale } from '@intlify/core'
|
||||
import type { ServerOptions } from '@proj-airi/server-runtime/server'
|
||||
|
||||
import { defineEventa, defineInvokeEventa } from '@moeru/eventa'
|
||||
|
||||
@@ -11,12 +12,8 @@ export const electronOpenChat = defineInvokeEventa('eventa:invoke:electron:windo
|
||||
export const electronOpenSettingsDevtools = defineInvokeEventa('eventa:invoke:electron:windows:settings:devtools:open')
|
||||
export const electronOpenDevtoolsWindow = defineInvokeEventa<void, { route?: string }>('eventa:invoke:electron:windows:devtools:open')
|
||||
|
||||
export interface ElectronServerChannelTlsConfig {
|
||||
[key: string]: unknown
|
||||
}
|
||||
|
||||
export interface ElectronServerChannelConfig {
|
||||
websocketTlsConfig: ElectronServerChannelTlsConfig | null
|
||||
tlsConfig?: ServerOptions['tlsConfig'] | null
|
||||
}
|
||||
export const electronGetServerChannelConfig = defineInvokeEventa<ElectronServerChannelConfig>('eventa:invoke:electron:server-channel:get-config')
|
||||
export const electronApplyServerChannelConfig = defineInvokeEventa<ElectronServerChannelConfig, Partial<ElectronServerChannelConfig>>('eventa:invoke:electron:server-channel:apply-config')
|
||||
|
||||
@@ -18,6 +18,10 @@
|
||||
".": {
|
||||
"types": "./dist/index.d.mts",
|
||||
"default": "./dist/index.mjs"
|
||||
},
|
||||
"./server": {
|
||||
"types": "./dist/server.d.mts",
|
||||
"default": "./dist/server.mjs"
|
||||
}
|
||||
},
|
||||
"main": "./dist/index.mjs",
|
||||
@@ -36,10 +40,10 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@guiiai/logg": "catalog:",
|
||||
"@moeru/std": "catalog:",
|
||||
"@proj-airi/server-shared": "workspace:^",
|
||||
"crossws": "^0.4.4",
|
||||
"h3": "^2.0.1-rc.14",
|
||||
"listhen": "^1.9.0",
|
||||
"nanoid": "catalog:",
|
||||
"srvx": "^0.11.8",
|
||||
"superjson": "catalog:"
|
||||
|
||||
@@ -2,14 +2,10 @@
|
||||
|
||||
import { env } from 'node:process'
|
||||
|
||||
import { plugin as ws } from 'crossws/server'
|
||||
import { serve } from 'h3'
|
||||
import { createServer } from '../server'
|
||||
|
||||
import { app } from '..'
|
||||
|
||||
serve(app, {
|
||||
// TODO: fix types
|
||||
// @ts-expect-error - the .crossws property wasn't extended in types
|
||||
plugins: [ws({ resolve: async req => (await app.fetch(req)).crossws })],
|
||||
port: env.PORT ? Number(env.PORT) : 6121,
|
||||
const server = createServer({
|
||||
port: env.PORT ? Number.parseInt(env.PORT) : 6121,
|
||||
})
|
||||
|
||||
server.start()
|
||||
|
||||
@@ -72,7 +72,7 @@ function send(peer: Peer, event: WebSocketEvent<Record<string, unknown>> | strin
|
||||
peer.send(typeof event === 'string' ? event : stringify(event))
|
||||
}
|
||||
|
||||
export function setupApp(options?: {
|
||||
export interface AppOptions {
|
||||
instanceId?: string
|
||||
auth?: {
|
||||
token: string
|
||||
@@ -90,15 +90,28 @@ export function setupApp(options?: {
|
||||
readTimeout?: number
|
||||
message?: MessageHeartbeat | string
|
||||
}
|
||||
}): { app: H3, closeAllPeers: () => void } {
|
||||
const instanceId = options?.instanceId || optionOrEnv(undefined, 'SERVER_INSTANCE_ID', nanoid())
|
||||
const authToken = optionOrEnv(options?.auth?.token, 'AUTHENTICATION_TOKEN', '')
|
||||
}
|
||||
|
||||
export function normalizeLoggerConfig(options?: AppOptions) {
|
||||
const appLogLevel = optionOrEnv(options?.logger?.app?.level, 'LOG_LEVEL', LogLevelString.Log, { validator: (value): value is LogLevelString => availableLogLevelStrings.includes(value as LogLevelString) })
|
||||
const appLogFormat = optionOrEnv(options?.logger?.app?.format, 'LOG_FORMAT', Format.Pretty, { validator: (value): value is Format => Object.values(Format).includes(value as Format) })
|
||||
const websocketLogLevel = options?.logger?.websocket?.level || appLogLevel || LogLevelString.Log
|
||||
const websocketLogFormat = options?.logger?.websocket?.format || appLogFormat || Format.Pretty
|
||||
|
||||
return {
|
||||
appLogLevel,
|
||||
appLogFormat,
|
||||
websocketLogLevel,
|
||||
websocketLogFormat,
|
||||
}
|
||||
}
|
||||
|
||||
export function setupApp(options?: AppOptions): { app: H3, closeAllPeers: () => void } {
|
||||
const instanceId = options?.instanceId || optionOrEnv(undefined, 'SERVER_INSTANCE_ID', nanoid())
|
||||
const authToken = optionOrEnv(options?.auth?.token, 'AUTHENTICATION_TOKEN', '')
|
||||
|
||||
const { appLogLevel, appLogFormat, websocketLogLevel, websocketLogFormat } = normalizeLoggerConfig(options)
|
||||
|
||||
const appLogger = useLogg('@proj-airi/server-runtime').withLogLevel(logLevelStringToLogLevelMap[appLogLevel]).withFormat(appLogFormat)
|
||||
const logger = useLogg('@proj-airi/server-runtime:websocket').withLogLevel(logLevelStringToLogLevelMap[websocketLogLevel]).withFormat(websocketLogFormat)
|
||||
|
||||
|
||||
@@ -0,0 +1,200 @@
|
||||
import type { AppOptions } from '..'
|
||||
|
||||
import { isIP } from 'node:net'
|
||||
import { networkInterfaces } from 'node:os'
|
||||
|
||||
import { useLogg } from '@guiiai/logg'
|
||||
import { merge } from '@moeru/std'
|
||||
import { plugin as ws } from 'crossws/server'
|
||||
import { serve } from 'h3'
|
||||
|
||||
import { normalizeLoggerConfig, setupApp } from '..'
|
||||
|
||||
export interface ServerOptions extends AppOptions {
|
||||
port?: number
|
||||
hostname?: string
|
||||
tlsConfig?: {
|
||||
cert?: string
|
||||
key?: string
|
||||
passphrase?: string
|
||||
} | null
|
||||
}
|
||||
|
||||
interface ServerInstance {
|
||||
close: (closeActiveConnections?: boolean) => Promise<void>
|
||||
}
|
||||
|
||||
export interface Server {
|
||||
getConnectionHost: () => string[]
|
||||
start: () => Promise<void>
|
||||
stop: () => Promise<void>
|
||||
restart: () => Promise<void>
|
||||
updateConfig: (newOptions: ServerOptions) => void
|
||||
}
|
||||
|
||||
export function getLocalIPs(): string[] {
|
||||
const interfaces = networkInterfaces()
|
||||
const addresses: string[] = []
|
||||
|
||||
const VIRTUAL_INTERFACE_PREFIXES = [
|
||||
'vboxnet',
|
||||
'vmnet',
|
||||
'docker',
|
||||
'br-',
|
||||
'veth',
|
||||
'utun',
|
||||
'wg',
|
||||
'tap',
|
||||
'tun',
|
||||
]
|
||||
const isVirtualInterface = (name: string) =>
|
||||
VIRTUAL_INTERFACE_PREFIXES.some(prefix => name.startsWith(prefix))
|
||||
|
||||
for (const [name, entries] of Object.entries(interfaces)) {
|
||||
if (!entries)
|
||||
continue
|
||||
if (isVirtualInterface(name))
|
||||
continue
|
||||
|
||||
for (const entry of entries) {
|
||||
const rawAddress = entry.address
|
||||
if (!rawAddress)
|
||||
continue
|
||||
|
||||
const address = rawAddress.includes('%') ? rawAddress.split('%')[0] : rawAddress
|
||||
if (isIP(address))
|
||||
addresses.push(address)
|
||||
}
|
||||
}
|
||||
|
||||
return addresses
|
||||
}
|
||||
|
||||
export function createServer(opts?: ServerOptions): Server {
|
||||
let options = merge<ServerOptions>({ port: 6121, hostname: '0.0.0.0' }, opts)
|
||||
|
||||
const { appLogFormat, appLogLevel } = normalizeLoggerConfig(options)
|
||||
const log = useLogg('@proj-airi/server-runtime/server').withLogLevelString(appLogLevel).withFormat(appLogFormat)
|
||||
let serverInstance: ServerInstance | null = null
|
||||
|
||||
log.withFields({ hasTlsConfig: !!options?.tlsConfig }).log('creating server channel')
|
||||
|
||||
async function closeServer(closeActiveConnections = false) {
|
||||
if (!serverInstance || typeof serverInstance.close !== 'function') {
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
if (closeActiveConnections) {
|
||||
log.log('closing existing server instance')
|
||||
}
|
||||
await serverInstance.close(closeActiveConnections)
|
||||
if (closeActiveConnections) {
|
||||
log.log('existing server instance closed')
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
const nodejsError = error as NodeJS.ErrnoException
|
||||
if ('code' in nodejsError && nodejsError.code === 'ERR_SERVER_NOT_RUNNING') {
|
||||
return
|
||||
}
|
||||
|
||||
if (!closeActiveConnections) {
|
||||
log.withError(error).error('Error closing WebSocket server')
|
||||
}
|
||||
}
|
||||
finally {
|
||||
serverInstance = null
|
||||
}
|
||||
}
|
||||
|
||||
async function start() {
|
||||
if (serverInstance) {
|
||||
return
|
||||
}
|
||||
|
||||
const secureEnabled = options?.tlsConfig != null
|
||||
|
||||
try {
|
||||
const h3App = setupApp()
|
||||
|
||||
const port = options.port
|
||||
const hostname = options.hostname
|
||||
|
||||
const instance = serve(h3App.app, {
|
||||
// @ts-expect-error - the .crossws property wasn't extended in types
|
||||
plugins: [ws({ resolve: async req => (await h3App.app.fetch(req)).crossws })],
|
||||
port,
|
||||
hostname,
|
||||
tls: options?.tlsConfig || undefined,
|
||||
reusePort: true,
|
||||
silent: true,
|
||||
manual: true,
|
||||
gracefulShutdown: {
|
||||
forceTimeout: 0.5,
|
||||
gracefulTimeout: 0.5,
|
||||
},
|
||||
})
|
||||
|
||||
serverInstance = {
|
||||
close: async (closeActiveConnections = false) => {
|
||||
log.log('closing all peers')
|
||||
h3App.closeAllPeers()
|
||||
log.log('closing server instance')
|
||||
await instance.close(closeActiveConnections)
|
||||
log.log('server instance closed')
|
||||
},
|
||||
}
|
||||
|
||||
const servePromise = instance.serve()
|
||||
if (servePromise instanceof Promise) {
|
||||
servePromise.catch((error) => {
|
||||
const nodejsError = error as NodeJS.ErrnoException
|
||||
if ('code' in nodejsError && nodejsError.code === 'EADDRINUSE') {
|
||||
log.withError(error).warn('Port already in use, assuming server is already running')
|
||||
return
|
||||
}
|
||||
|
||||
log.withError(error).error('Error serving WebSocket server')
|
||||
})
|
||||
}
|
||||
|
||||
const protocol = secureEnabled ? 'wss' : 'ws'
|
||||
if (hostname === '0.0.0.0') {
|
||||
const ips = getLocalIPs().filter(ip => ip !== '127.0.0.1' && ip !== '::1')
|
||||
const targets = ips.length > 0 ? ips.join(', ') : 'localhost'
|
||||
log.log(`@proj-airi/server-runtime started on ${protocol}://0.0.0.0:${port} (reachable via: ${targets})`)
|
||||
}
|
||||
else {
|
||||
log.log(`@proj-airi/server-runtime started on ${protocol}://${hostname}:${port}`)
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
log.withError(error).error('failed to start WebSocket server')
|
||||
}
|
||||
}
|
||||
|
||||
async function stop() {
|
||||
await closeServer()
|
||||
}
|
||||
|
||||
async function restart() {
|
||||
log.log('restarting server channel', { options })
|
||||
await closeServer(true)
|
||||
await start()
|
||||
}
|
||||
|
||||
async function updateConfig(newOptions: ServerOptions) {
|
||||
options = { ...options, ...newOptions }
|
||||
}
|
||||
|
||||
return {
|
||||
getConnectionHost: () => {
|
||||
return getLocalIPs()
|
||||
},
|
||||
start,
|
||||
stop,
|
||||
restart,
|
||||
updateConfig,
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ import { defineConfig } from 'tsdown'
|
||||
export default defineConfig({
|
||||
entry: {
|
||||
'index': 'src/index.ts',
|
||||
'server': 'src/server/index.ts',
|
||||
'bin/run': 'src/bin/run.ts',
|
||||
},
|
||||
target: 'node18',
|
||||
|
||||
@@ -1,23 +1,28 @@
|
||||
diff --git a/dist/adapters/node.mjs b/dist/adapters/node.mjs
|
||||
index 6da71ede8be15defb4f065d7eaf123ecad56afbd..5f0204722ad0a1259188a972f435d00681435d69 100644
|
||||
index 8d33fdd4a8948c18aad849681f79e5535d7a6b77..d8065646aeef530222ed8f9b1ab9f9a2cd1169eb 100644
|
||||
--- a/dist/adapters/node.mjs
|
||||
+++ b/dist/adapters/node.mjs
|
||||
@@ -611,12 +611,17 @@ var NodeServer = class {
|
||||
@@ -765,13 +765,21 @@ var NodeServer = class {
|
||||
if (!options.manual) this.serve();
|
||||
}
|
||||
serve() {
|
||||
if (this.#listeningPromise) return Promise.resolve(this.#listeningPromise).then(() => this);
|
||||
- if (this.#listeningPromise) return Promise.resolve(this.#listeningPromise).then(() => this);
|
||||
- this.#listeningPromise = new Promise((resolve) => {
|
||||
+ if (this.#listeningPromise) {
|
||||
+ return Promise.resolve(this.#listeningPromise).then(() => this);
|
||||
+ }
|
||||
+
|
||||
+ this.#listeningPromise = new Promise((resolve, reject) => {
|
||||
+ this.node.server.once("error", (err) => {
|
||||
+ reject(err);
|
||||
+ })
|
||||
+ this.node.server.once("error", (error) => {
|
||||
+ reject(error);
|
||||
+ });
|
||||
this.node.server.listen(this.serveOptions, () => {
|
||||
printListening(this.options, this.url);
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
+
|
||||
+ return this.#listeningPromise
|
||||
+ return this.#listeningPromise;
|
||||
}
|
||||
get url() {
|
||||
const addr = this.node?.server?.address();
|
||||
Generated
+65
-392
@@ -160,8 +160,8 @@ catalogs:
|
||||
specifier: ^6.2.2
|
||||
version: 6.2.2
|
||||
injeca:
|
||||
specifier: ^0.1.7
|
||||
version: 0.1.7
|
||||
specifier: ^0.1.8
|
||||
version: 0.1.8
|
||||
is-network-error:
|
||||
specifier: ^1.3.0
|
||||
version: 1.3.0
|
||||
@@ -273,9 +273,9 @@ patchedDependencies:
|
||||
pixi-live2d-display:
|
||||
hash: 122ac09349321d5bfe9d9817aa095cd1c9c4132af86345aa9e27ba8b63dadf2c
|
||||
path: patches/pixi-live2d-display.patch
|
||||
srvx@0.9.8:
|
||||
hash: f0151386fdcbcb6f53833cf8f66926ef2eb31b71a2782d6e0960dec832ef108d
|
||||
path: patches/srvx@0.9.8.patch
|
||||
srvx:
|
||||
hash: c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d
|
||||
path: patches/srvx.patch
|
||||
|
||||
importers:
|
||||
|
||||
@@ -545,7 +545,7 @@ importers:
|
||||
version: 4.11.3
|
||||
injeca:
|
||||
specifier: 'catalog:'
|
||||
version: 0.1.7(@guiiai/logg@1.2.11)(error-stack-parser@2.1.4)(nanoid@5.1.6)
|
||||
version: 0.1.8(@guiiai/logg@1.2.11)(error-stack-parser@2.1.4)(nanoid@5.1.6)
|
||||
pg:
|
||||
specifier: ^8.13.3
|
||||
version: 8.19.0
|
||||
@@ -588,7 +588,7 @@ importers:
|
||||
version: 3.8.1
|
||||
'@moeru/eventa':
|
||||
specifier: ^1.0.0-beta.1
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@moeru/std':
|
||||
specifier: 'catalog:'
|
||||
version: 0.1.0-beta.17
|
||||
@@ -660,7 +660,7 @@ importers:
|
||||
version: 0.4.3
|
||||
'@xsai-transformers/embed':
|
||||
specifier: ^0.0.11
|
||||
version: 0.0.11(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 0.0.11(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@xsai/generate-speech':
|
||||
specifier: 'catalog:'
|
||||
version: 0.4.0-beta.13
|
||||
@@ -991,7 +991,7 @@ importers:
|
||||
version: 1.27.1(@cfworker/json-schema@4.1.1)(zod@4.3.6)
|
||||
'@moeru/eventa':
|
||||
specifier: ^1.0.0-beta.1
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@moeru/std':
|
||||
specifier: 'catalog:'
|
||||
version: 0.1.0-beta.17
|
||||
@@ -1066,7 +1066,7 @@ importers:
|
||||
version: 0.4.3
|
||||
'@xsai-transformers/transcription':
|
||||
specifier: ^0.0.11
|
||||
version: 0.0.11(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 0.0.11(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@xsai/generate-speech':
|
||||
specifier: 'catalog:'
|
||||
version: 0.4.0-beta.13
|
||||
@@ -1100,12 +1100,15 @@ importers:
|
||||
animejs:
|
||||
specifier: ^4.3.6
|
||||
version: 4.3.6
|
||||
async-mutex:
|
||||
specifier: 'catalog:'
|
||||
version: 0.5.0
|
||||
colorjs.io:
|
||||
specifier: ^0.6.1
|
||||
version: 0.6.1
|
||||
crossws:
|
||||
specifier: ^0.4.4
|
||||
version: 0.4.4(srvx@0.11.8)
|
||||
version: 0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))
|
||||
culori:
|
||||
specifier: ^4.0.2
|
||||
version: 4.0.2
|
||||
@@ -1134,11 +1137,11 @@ importers:
|
||||
specifier: ^1.44.0
|
||||
version: 1.44.0
|
||||
h3:
|
||||
specifier: 2.0.1-rc.5
|
||||
version: 2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8))
|
||||
specifier: ^2.0.1-rc.14
|
||||
version: 2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d)))
|
||||
injeca:
|
||||
specifier: 'catalog:'
|
||||
version: 0.1.7(@guiiai/logg@1.2.11)(error-stack-parser@2.1.4)(nanoid@5.1.6)
|
||||
version: 0.1.8(@guiiai/logg@1.2.11)(error-stack-parser@2.1.4)(nanoid@5.1.6)
|
||||
jszip:
|
||||
specifier: ^3.10.1
|
||||
version: 3.10.1
|
||||
@@ -1331,7 +1334,7 @@ importers:
|
||||
version: 3.0.3(magicast@0.5.2)(vue@3.5.29(typescript@5.9.3))
|
||||
'@xsai-transformers/embed':
|
||||
specifier: ^0.0.11
|
||||
version: 0.0.11(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 0.0.11(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
builder-util-runtime:
|
||||
specifier: 'catalog:'
|
||||
version: 9.5.1
|
||||
@@ -1400,7 +1403,7 @@ importers:
|
||||
version: 3.8.1
|
||||
'@moeru/eventa':
|
||||
specifier: ^1.0.0-beta.1
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@moeru/std':
|
||||
specifier: 'catalog:'
|
||||
version: 0.1.0-beta.17
|
||||
@@ -1475,7 +1478,7 @@ importers:
|
||||
version: 0.4.3
|
||||
'@xsai-transformers/embed':
|
||||
specifier: ^0.0.11
|
||||
version: 0.0.11(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 0.0.11(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@xsai/generate-speech':
|
||||
specifier: 'catalog:'
|
||||
version: 0.4.0-beta.13
|
||||
@@ -1918,7 +1921,7 @@ importers:
|
||||
version: 1.43.0
|
||||
injeca:
|
||||
specifier: 'catalog:'
|
||||
version: 0.1.7(@guiiai/logg@1.2.11)(error-stack-parser@2.1.4)(nanoid@5.1.6)
|
||||
version: 0.1.8(@guiiai/logg@1.2.11)(error-stack-parser@2.1.4)(nanoid@5.1.6)
|
||||
nanoid:
|
||||
specifier: 'catalog:'
|
||||
version: 5.1.6
|
||||
@@ -1998,7 +2001,7 @@ importers:
|
||||
dependencies:
|
||||
'@moeru/eventa':
|
||||
specifier: ^1.0.0-beta.1
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
builder-util-runtime:
|
||||
specifier: 'catalog:'
|
||||
version: 9.5.1
|
||||
@@ -2044,7 +2047,7 @@ importers:
|
||||
dependencies:
|
||||
'@moeru/eventa':
|
||||
specifier: ^1.0.0-beta.1
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@moeru/std':
|
||||
specifier: 'catalog:'
|
||||
version: 0.1.0-beta.17
|
||||
@@ -2137,7 +2140,7 @@ importers:
|
||||
dependencies:
|
||||
'@moeru/eventa':
|
||||
specifier: ^1.0.0-beta.1
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@moeru/std':
|
||||
specifier: 'catalog:'
|
||||
version: 0.1.0-beta.17
|
||||
@@ -2177,24 +2180,24 @@ importers:
|
||||
'@guiiai/logg':
|
||||
specifier: 'catalog:'
|
||||
version: 1.2.11
|
||||
'@moeru/std':
|
||||
specifier: 'catalog:'
|
||||
version: 0.1.0-beta.17
|
||||
'@proj-airi/server-shared':
|
||||
specifier: workspace:^
|
||||
version: link:../server-shared
|
||||
crossws:
|
||||
specifier: ^0.4.4
|
||||
version: 0.4.4(srvx@0.11.8)
|
||||
version: 0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))
|
||||
h3:
|
||||
specifier: ^2.0.1-rc.14
|
||||
version: 2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8))
|
||||
listhen:
|
||||
specifier: ^1.9.0
|
||||
version: 1.9.0
|
||||
version: 2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d)))
|
||||
nanoid:
|
||||
specifier: 'catalog:'
|
||||
version: 5.1.6
|
||||
srvx:
|
||||
specifier: ^0.11.8
|
||||
version: 0.11.8
|
||||
version: 0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d)
|
||||
superjson:
|
||||
specifier: 'catalog:'
|
||||
version: 2.2.6
|
||||
@@ -2212,7 +2215,7 @@ importers:
|
||||
version: link:../server-shared
|
||||
crossws:
|
||||
specifier: ^0.4.4
|
||||
version: 0.4.4(srvx@0.11.8)
|
||||
version: 0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))
|
||||
superjson:
|
||||
specifier: 'catalog:'
|
||||
version: 2.2.6
|
||||
@@ -2231,7 +2234,7 @@ importers:
|
||||
dependencies:
|
||||
'@moeru/eventa':
|
||||
specifier: ^1.0.0-beta.1
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@moeru/std':
|
||||
specifier: 'catalog:'
|
||||
version: 0.1.0-beta.17
|
||||
@@ -2334,7 +2337,7 @@ importers:
|
||||
dependencies:
|
||||
'@moeru/eventa':
|
||||
specifier: ^1.0.0-beta.1
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@moeru/std':
|
||||
specifier: 'catalog:'
|
||||
version: 0.1.0-beta.17
|
||||
@@ -2465,7 +2468,7 @@ importers:
|
||||
version: 3.0.2(electron@40.6.1)
|
||||
'@moeru/eventa':
|
||||
specifier: ^1.0.0-beta.1
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@nekopaw/tempora':
|
||||
specifier: 'catalog:'
|
||||
version: 0.4.0-alpha.1
|
||||
@@ -2489,7 +2492,7 @@ importers:
|
||||
version: 3.8.1
|
||||
'@moeru/eventa':
|
||||
specifier: ^1.0.0-beta.1
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@proj-airi/audio':
|
||||
specifier: workspace:^
|
||||
version: link:../audio
|
||||
@@ -2558,10 +2561,10 @@ importers:
|
||||
version: 0.4.3
|
||||
'@xsai-transformers/embed':
|
||||
specifier: ^0.0.11
|
||||
version: 0.0.11(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 0.0.11(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@xsai-transformers/shared':
|
||||
specifier: ^0.0.11
|
||||
version: 0.0.11(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 0.0.11(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@xsai/embed':
|
||||
specifier: 'catalog:'
|
||||
version: 0.4.3
|
||||
@@ -3214,7 +3217,7 @@ importers:
|
||||
version: 1.2.4
|
||||
'@moeru/eventa':
|
||||
specifier: ^1.0.0-beta.1
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
version: 1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@proj-airi/server-sdk':
|
||||
specifier: workspace:^
|
||||
version: link:../../packages/server-sdk
|
||||
@@ -3310,7 +3313,7 @@ importers:
|
||||
version: 0.1.0-beta.17
|
||||
'@proj-airi/server-sdk':
|
||||
specifier: ^0.8.4
|
||||
version: 0.8.4(srvx@0.11.8)
|
||||
version: 0.8.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))
|
||||
'@xsai/generate-text':
|
||||
specifier: 'catalog:'
|
||||
version: 0.4.3
|
||||
@@ -3328,7 +3331,7 @@ importers:
|
||||
version: 3.2.1
|
||||
crossws:
|
||||
specifier: 'catalog:'
|
||||
version: 0.4.4(srvx@0.11.8)
|
||||
version: 0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))
|
||||
es-toolkit:
|
||||
specifier: ^1.44.0
|
||||
version: 1.44.0
|
||||
@@ -3589,13 +3592,10 @@ importers:
|
||||
version: 0.1.0-beta.17
|
||||
'@proj-airi/server-sdk':
|
||||
specifier: ^0.8.4
|
||||
version: 0.8.4(srvx@0.11.8)
|
||||
version: 0.8.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))
|
||||
h3:
|
||||
specifier: ^2.0.1-rc.14
|
||||
version: 2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8))
|
||||
listhen:
|
||||
specifier: ^1.9.0
|
||||
version: 1.9.0
|
||||
version: 2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d)))
|
||||
ofetch:
|
||||
specifier: ^1.5.1
|
||||
version: 1.5.1
|
||||
@@ -7301,100 +7301,6 @@ packages:
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
'@parcel/watcher-android-arm64@2.5.1':
|
||||
resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [android]
|
||||
|
||||
'@parcel/watcher-darwin-arm64@2.5.1':
|
||||
resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@parcel/watcher-darwin-x64@2.5.1':
|
||||
resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@parcel/watcher-freebsd-x64@2.5.1':
|
||||
resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [x64]
|
||||
os: [freebsd]
|
||||
|
||||
'@parcel/watcher-linux-arm-glibc@2.5.1':
|
||||
resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@parcel/watcher-linux-arm-musl@2.5.1':
|
||||
resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@parcel/watcher-linux-arm64-glibc@2.5.1':
|
||||
resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@parcel/watcher-linux-arm64-musl@2.5.1':
|
||||
resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@parcel/watcher-linux-x64-glibc@2.5.1':
|
||||
resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@parcel/watcher-linux-x64-musl@2.5.1':
|
||||
resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@parcel/watcher-wasm@2.5.1':
|
||||
resolution: {integrity: sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
bundledDependencies:
|
||||
- napi-wasm
|
||||
|
||||
'@parcel/watcher-win32-arm64@2.5.1':
|
||||
resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
'@parcel/watcher-win32-ia32@2.5.1':
|
||||
resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [ia32]
|
||||
os: [win32]
|
||||
|
||||
'@parcel/watcher-win32-x64@2.5.1':
|
||||
resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
'@parcel/watcher@2.5.1':
|
||||
resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
|
||||
'@pinia/testing@1.0.3':
|
||||
resolution: {integrity: sha512-g+qR49GNdI1Z8rZxKrQC3GN+LfnGTNf5Kk8Nz5Cz6mIGva5WRS+ffPXQfzhA0nu6TveWzPNYTjGl4nJqd3Cu9Q==}
|
||||
peerDependencies:
|
||||
@@ -10590,10 +10496,6 @@ packages:
|
||||
resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
clipboardy@4.0.0:
|
||||
resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
cliui@8.0.1:
|
||||
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
|
||||
engines: {node: '>=12'}
|
||||
@@ -10983,11 +10885,6 @@ packages:
|
||||
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
|
||||
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
|
||||
|
||||
detect-libc@1.0.3:
|
||||
resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
|
||||
engines: {node: '>=0.10'}
|
||||
hasBin: true
|
||||
|
||||
detect-libc@2.1.2:
|
||||
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -11847,10 +11744,6 @@ packages:
|
||||
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
execa@8.0.1:
|
||||
resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
|
||||
engines: {node: '>=16.17'}
|
||||
|
||||
exif-parser@0.1.12:
|
||||
resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==}
|
||||
|
||||
@@ -12243,10 +12136,6 @@ packages:
|
||||
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
get-stream@8.0.1:
|
||||
resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
|
||||
engines: {node: '>=16'}
|
||||
|
||||
get-tsconfig@4.13.6:
|
||||
resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==}
|
||||
|
||||
@@ -12423,15 +12312,6 @@ packages:
|
||||
crossws:
|
||||
optional: true
|
||||
|
||||
h3@2.0.1-rc.5:
|
||||
resolution: {integrity: sha512-qkohAzCab0nLzXNm78tBjZDvtKMTmtygS8BJLT3VPczAQofdqlFXDPkXdLMJN4r05+xqneG8snZJ0HgkERCZTg==}
|
||||
engines: {node: '>=20.11.1'}
|
||||
peerDependencies:
|
||||
crossws: ^0.4.1
|
||||
peerDependenciesMeta:
|
||||
crossws:
|
||||
optional: true
|
||||
|
||||
has-flag@4.0.0:
|
||||
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -12582,10 +12462,6 @@ packages:
|
||||
resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
|
||||
engines: {node: '>= 14'}
|
||||
|
||||
http-shutdown@1.2.2:
|
||||
resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==}
|
||||
engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
|
||||
|
||||
http2-wrapper@1.0.3:
|
||||
resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==}
|
||||
engines: {node: '>=10.19.0'}
|
||||
@@ -12598,10 +12474,6 @@ packages:
|
||||
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
|
||||
engines: {node: '>=10.17.0'}
|
||||
|
||||
human-signals@5.0.0:
|
||||
resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
|
||||
engines: {node: '>=16.17.0'}
|
||||
|
||||
humanize-ms@1.2.1:
|
||||
resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
|
||||
|
||||
@@ -12701,8 +12573,8 @@ packages:
|
||||
resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==}
|
||||
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
|
||||
|
||||
injeca@0.1.7:
|
||||
resolution: {integrity: sha512-Nh166QCTJbshSNBTWGzdGNDkxMKvHALJfCW70zYJ9AF+4FDQLXRcjGJnaaazW7RZWLQsnWEvK5/sXMnexUjvBg==}
|
||||
injeca@0.1.8:
|
||||
resolution: {integrity: sha512-S8Y7adw2y/2dSp/8b3rhwu4A8Fegq4GAY7hRRSitxEmapegrkwCLGnWVHuT+DqbAmpITSKu/Dl8FU3RIl8ygyw==}
|
||||
peerDependencies:
|
||||
'@guiiai/logg': '>= 1'
|
||||
error-stack-parser: ^2.1.4
|
||||
@@ -12860,10 +12732,6 @@ packages:
|
||||
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
is-stream@3.0.0:
|
||||
resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
|
||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||
|
||||
is-typedarray@1.0.0:
|
||||
resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
|
||||
|
||||
@@ -12890,10 +12758,6 @@ packages:
|
||||
resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
|
||||
engines: {node: '>=16'}
|
||||
|
||||
is64bit@2.0.0:
|
||||
resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
isbinaryfile@4.0.10:
|
||||
resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==}
|
||||
engines: {node: '>= 8.0.0'}
|
||||
@@ -13270,10 +13134,6 @@ packages:
|
||||
linkify-it@5.0.0:
|
||||
resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
|
||||
|
||||
listhen@1.9.0:
|
||||
resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==}
|
||||
hasBin: true
|
||||
|
||||
listr2@8.3.3:
|
||||
resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
@@ -13678,10 +13538,6 @@ packages:
|
||||
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
mimic-fn@4.0.0:
|
||||
resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
mimic-function@5.0.1:
|
||||
resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
|
||||
engines: {node: '>=18'}
|
||||
@@ -14019,10 +13875,6 @@ packages:
|
||||
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
npm-run-path@5.3.0:
|
||||
resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
|
||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||
|
||||
nprogress@0.2.0:
|
||||
resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
|
||||
|
||||
@@ -14094,10 +13946,6 @@ packages:
|
||||
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
onetime@6.0.0:
|
||||
resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
onetime@7.0.0:
|
||||
resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
|
||||
engines: {node: '>=18'}
|
||||
@@ -14311,10 +14159,6 @@ packages:
|
||||
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
path-key@4.0.0:
|
||||
resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
path-parse@1.0.7:
|
||||
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
|
||||
|
||||
@@ -15454,11 +15298,6 @@ packages:
|
||||
engines: {node: '>=20.16.0'}
|
||||
hasBin: true
|
||||
|
||||
srvx@0.9.8:
|
||||
resolution: {integrity: sha512-RZaxTKJEE/14HYn8COLuUOJAt0U55N9l1Xf6jj+T0GoA01EUH1Xz5JtSUOI+EHn+AEgPCVn7gk6jHJffrr06fQ==}
|
||||
engines: {node: '>=20.16.0'}
|
||||
hasBin: true
|
||||
|
||||
ssri@12.0.0:
|
||||
resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==}
|
||||
engines: {node: ^18.17.0 || >=20.5.0}
|
||||
@@ -15562,10 +15401,6 @@ packages:
|
||||
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
strip-final-newline@3.0.0:
|
||||
resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
strip-indent@4.1.1:
|
||||
resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==}
|
||||
engines: {node: '>=12'}
|
||||
@@ -15637,10 +15472,6 @@ packages:
|
||||
resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==}
|
||||
engines: {node: ^14.18.0 || >=16.0.0}
|
||||
|
||||
system-architecture@0.1.0:
|
||||
resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
tabbable@6.4.0:
|
||||
resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==}
|
||||
|
||||
@@ -16377,10 +16208,6 @@ packages:
|
||||
resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
untun@0.1.3:
|
||||
resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==}
|
||||
hasBin: true
|
||||
|
||||
untyped@2.0.0:
|
||||
resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==}
|
||||
hasBin: true
|
||||
@@ -16399,9 +16226,6 @@ packages:
|
||||
resolution: {integrity: sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
uqr@0.1.2:
|
||||
resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==}
|
||||
|
||||
uri-js@4.4.1:
|
||||
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
||||
|
||||
@@ -20185,13 +20009,13 @@ snapshots:
|
||||
- supports-color
|
||||
- typescript
|
||||
|
||||
'@moeru/eventa@0.3.0(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))':
|
||||
'@moeru/eventa@0.3.0(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))':
|
||||
dependencies:
|
||||
nanoid: 5.1.6
|
||||
picomatch: 4.0.3
|
||||
optionalDependencies:
|
||||
electron: 40.6.1
|
||||
h3: 2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8))
|
||||
h3: 2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d)))
|
||||
|
||||
'@moeru/eventa@1.0.0-alpha.14(electron@39.7.0)':
|
||||
dependencies:
|
||||
@@ -20207,13 +20031,13 @@ snapshots:
|
||||
optionalDependencies:
|
||||
electron: 40.6.1
|
||||
|
||||
'@moeru/eventa@1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))':
|
||||
'@moeru/eventa@1.0.0-beta.1(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))':
|
||||
dependencies:
|
||||
nanoid: 5.1.6
|
||||
picomatch: 4.0.3
|
||||
optionalDependencies:
|
||||
electron: 40.6.1
|
||||
h3: 2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8))
|
||||
h3: 2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d)))
|
||||
|
||||
'@moeru/std@0.1.0-beta.1': {}
|
||||
|
||||
@@ -21474,71 +21298,6 @@ snapshots:
|
||||
'@oxlint/binding-win32-x64-msvc@1.50.0':
|
||||
optional: true
|
||||
|
||||
'@parcel/watcher-android-arm64@2.5.1':
|
||||
optional: true
|
||||
|
||||
'@parcel/watcher-darwin-arm64@2.5.1':
|
||||
optional: true
|
||||
|
||||
'@parcel/watcher-darwin-x64@2.5.1':
|
||||
optional: true
|
||||
|
||||
'@parcel/watcher-freebsd-x64@2.5.1':
|
||||
optional: true
|
||||
|
||||
'@parcel/watcher-linux-arm-glibc@2.5.1':
|
||||
optional: true
|
||||
|
||||
'@parcel/watcher-linux-arm-musl@2.5.1':
|
||||
optional: true
|
||||
|
||||
'@parcel/watcher-linux-arm64-glibc@2.5.1':
|
||||
optional: true
|
||||
|
||||
'@parcel/watcher-linux-arm64-musl@2.5.1':
|
||||
optional: true
|
||||
|
||||
'@parcel/watcher-linux-x64-glibc@2.5.1':
|
||||
optional: true
|
||||
|
||||
'@parcel/watcher-linux-x64-musl@2.5.1':
|
||||
optional: true
|
||||
|
||||
'@parcel/watcher-wasm@2.5.1':
|
||||
dependencies:
|
||||
is-glob: 4.0.3
|
||||
micromatch: 4.0.8
|
||||
|
||||
'@parcel/watcher-win32-arm64@2.5.1':
|
||||
optional: true
|
||||
|
||||
'@parcel/watcher-win32-ia32@2.5.1':
|
||||
optional: true
|
||||
|
||||
'@parcel/watcher-win32-x64@2.5.1':
|
||||
optional: true
|
||||
|
||||
'@parcel/watcher@2.5.1':
|
||||
dependencies:
|
||||
detect-libc: 1.0.3
|
||||
is-glob: 4.0.3
|
||||
micromatch: 4.0.8
|
||||
node-addon-api: 7.1.1
|
||||
optionalDependencies:
|
||||
'@parcel/watcher-android-arm64': 2.5.1
|
||||
'@parcel/watcher-darwin-arm64': 2.5.1
|
||||
'@parcel/watcher-darwin-x64': 2.5.1
|
||||
'@parcel/watcher-freebsd-x64': 2.5.1
|
||||
'@parcel/watcher-linux-arm-glibc': 2.5.1
|
||||
'@parcel/watcher-linux-arm-musl': 2.5.1
|
||||
'@parcel/watcher-linux-arm64-glibc': 2.5.1
|
||||
'@parcel/watcher-linux-arm64-musl': 2.5.1
|
||||
'@parcel/watcher-linux-x64-glibc': 2.5.1
|
||||
'@parcel/watcher-linux-x64-musl': 2.5.1
|
||||
'@parcel/watcher-win32-arm64': 2.5.1
|
||||
'@parcel/watcher-win32-ia32': 2.5.1
|
||||
'@parcel/watcher-win32-x64': 2.5.1
|
||||
|
||||
'@pinia/testing@1.0.3(pinia@3.0.4(typescript@5.9.3)(vue@3.5.29(typescript@5.9.3)))':
|
||||
dependencies:
|
||||
pinia: 3.0.4(typescript@5.9.3)(vue@3.5.29(typescript@5.9.3))
|
||||
@@ -21960,10 +21719,10 @@ snapshots:
|
||||
dependencies:
|
||||
'@iconify/types': 2.0.0
|
||||
|
||||
'@proj-airi/server-sdk@0.8.4(srvx@0.11.8)':
|
||||
'@proj-airi/server-sdk@0.8.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))':
|
||||
dependencies:
|
||||
'@proj-airi/server-shared': 0.8.4
|
||||
crossws: 0.4.4(srvx@0.11.8)
|
||||
crossws: 0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))
|
||||
defu: 6.1.4
|
||||
superjson: 2.2.6
|
||||
transitivePeerDependencies:
|
||||
@@ -24131,13 +23890,13 @@ snapshots:
|
||||
dependencies:
|
||||
'@xsai/shared': 0.4.3
|
||||
|
||||
'@xsai-transformers/embed@0.0.11(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))':
|
||||
'@xsai-transformers/embed@0.0.11(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))':
|
||||
dependencies:
|
||||
'@huggingface/transformers': 3.8.1
|
||||
'@moeru/eventa': 0.3.0(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
'@moeru/eventa': 0.3.0(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@moeru/std': 0.1.0-beta.17
|
||||
'@xsai-ext/shared-providers': 0.4.0-beta.12
|
||||
'@xsai-transformers/shared': 0.0.11(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
'@xsai-transformers/shared': 0.0.11(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@xsai/embed': 0.4.3
|
||||
'@xsai/shared': 0.4.3
|
||||
gpuu: 1.0.6
|
||||
@@ -24145,10 +23904,10 @@ snapshots:
|
||||
- electron
|
||||
- h3
|
||||
|
||||
'@xsai-transformers/shared@0.0.11(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))':
|
||||
'@xsai-transformers/shared@0.0.11(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))':
|
||||
dependencies:
|
||||
'@huggingface/transformers': 3.8.1
|
||||
'@moeru/eventa': 0.3.0(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
'@moeru/eventa': 0.3.0(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@moeru/std': 0.1.0-beta.17
|
||||
'@xsai-ext/shared-providers': 0.4.0-beta.12
|
||||
'@xsai/shared': 0.4.3
|
||||
@@ -24158,13 +23917,13 @@ snapshots:
|
||||
- h3
|
||||
- web-worker
|
||||
|
||||
'@xsai-transformers/transcription@0.0.11(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))':
|
||||
'@xsai-transformers/transcription@0.0.11(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))':
|
||||
dependencies:
|
||||
'@huggingface/transformers': 3.8.1
|
||||
'@moeru/eventa': 0.3.0(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
'@moeru/eventa': 0.3.0(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@moeru/std': 0.1.0-beta.17
|
||||
'@xsai-ext/shared-providers': 0.4.0-beta.12
|
||||
'@xsai-transformers/shared': 0.0.11(electron@40.6.1)(h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)))
|
||||
'@xsai-transformers/shared': 0.0.11(electron@40.6.1)(h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))))
|
||||
'@xsai/embed': 0.4.3
|
||||
'@xsai/generate-transcription': 0.4.3
|
||||
'@xsai/shared': 0.4.3
|
||||
@@ -25069,12 +24828,6 @@ snapshots:
|
||||
slice-ansi: 5.0.0
|
||||
string-width: 7.2.0
|
||||
|
||||
clipboardy@4.0.0:
|
||||
dependencies:
|
||||
execa: 8.0.1
|
||||
is-wsl: 3.1.0
|
||||
is64bit: 2.0.0
|
||||
|
||||
cliui@8.0.1:
|
||||
dependencies:
|
||||
string-width: 4.2.3
|
||||
@@ -25270,9 +25023,9 @@ snapshots:
|
||||
dependencies:
|
||||
uncrypto: 0.1.3
|
||||
|
||||
crossws@0.4.4(srvx@0.11.8):
|
||||
crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d)):
|
||||
optionalDependencies:
|
||||
srvx: 0.11.8
|
||||
srvx: 0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d)
|
||||
|
||||
crypto-random-string@2.0.0: {}
|
||||
|
||||
@@ -25413,8 +25166,6 @@ snapshots:
|
||||
|
||||
destroy@1.2.0: {}
|
||||
|
||||
detect-libc@1.0.3: {}
|
||||
|
||||
detect-libc@2.1.2: {}
|
||||
|
||||
detect-node@2.1.0: {}
|
||||
@@ -26387,18 +26138,6 @@ snapshots:
|
||||
signal-exit: 3.0.7
|
||||
strip-final-newline: 2.0.0
|
||||
|
||||
execa@8.0.1:
|
||||
dependencies:
|
||||
cross-spawn: 7.0.6
|
||||
get-stream: 8.0.1
|
||||
human-signals: 5.0.0
|
||||
is-stream: 3.0.0
|
||||
merge-stream: 2.0.0
|
||||
npm-run-path: 5.3.0
|
||||
onetime: 6.0.0
|
||||
signal-exit: 4.1.0
|
||||
strip-final-newline: 3.0.0
|
||||
|
||||
exif-parser@0.1.12: {}
|
||||
|
||||
expand-template@2.0.3: {}
|
||||
@@ -26863,8 +26602,6 @@ snapshots:
|
||||
|
||||
get-stream@6.0.1: {}
|
||||
|
||||
get-stream@8.0.1: {}
|
||||
|
||||
get-tsconfig@4.13.6:
|
||||
dependencies:
|
||||
resolve-pkg-maps: 1.0.0
|
||||
@@ -27095,19 +26832,12 @@ snapshots:
|
||||
ufo: 1.6.3
|
||||
uncrypto: 0.1.3
|
||||
|
||||
h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8)):
|
||||
h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))):
|
||||
dependencies:
|
||||
rou3: 0.7.12
|
||||
srvx: 0.11.8
|
||||
srvx: 0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d)
|
||||
optionalDependencies:
|
||||
crossws: 0.4.4(srvx@0.11.8)
|
||||
|
||||
h3@2.0.1-rc.5(crossws@0.4.4(srvx@0.11.8)):
|
||||
dependencies:
|
||||
rou3: 0.7.12
|
||||
srvx: 0.9.8(patch_hash=f0151386fdcbcb6f53833cf8f66926ef2eb31b71a2782d6e0960dec832ef108d)
|
||||
optionalDependencies:
|
||||
crossws: 0.4.4(srvx@0.11.8)
|
||||
crossws: 0.4.4(srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d))
|
||||
|
||||
has-flag@4.0.0: {}
|
||||
|
||||
@@ -27394,8 +27124,6 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
http-shutdown@1.2.2: {}
|
||||
|
||||
http2-wrapper@1.0.3:
|
||||
dependencies:
|
||||
quick-lru: 5.1.1
|
||||
@@ -27410,8 +27138,6 @@ snapshots:
|
||||
|
||||
human-signals@2.1.0: {}
|
||||
|
||||
human-signals@5.0.0: {}
|
||||
|
||||
humanize-ms@1.2.1:
|
||||
dependencies:
|
||||
ms: 2.1.3
|
||||
@@ -27507,7 +27233,7 @@ snapshots:
|
||||
|
||||
ini@4.1.3: {}
|
||||
|
||||
injeca@0.1.7(@guiiai/logg@1.2.11)(error-stack-parser@2.1.4)(nanoid@5.1.6):
|
||||
injeca@0.1.8(@guiiai/logg@1.2.11)(error-stack-parser@2.1.4)(nanoid@5.1.6):
|
||||
dependencies:
|
||||
error-stack-parser: 2.1.4
|
||||
nanoid: 5.1.6
|
||||
@@ -27609,8 +27335,6 @@ snapshots:
|
||||
|
||||
is-stream@2.0.1: {}
|
||||
|
||||
is-stream@3.0.0: {}
|
||||
|
||||
is-typedarray@1.0.0: {}
|
||||
|
||||
is-unicode-supported@0.1.0: {}
|
||||
@@ -27629,10 +27353,6 @@ snapshots:
|
||||
dependencies:
|
||||
is-inside-container: 1.0.0
|
||||
|
||||
is64bit@2.0.0:
|
||||
dependencies:
|
||||
system-architecture: 0.1.0
|
||||
|
||||
isbinaryfile@4.0.10: {}
|
||||
|
||||
isbinaryfile@5.0.7: {}
|
||||
@@ -28010,27 +27730,6 @@ snapshots:
|
||||
dependencies:
|
||||
uc.micro: 2.1.0
|
||||
|
||||
listhen@1.9.0:
|
||||
dependencies:
|
||||
'@parcel/watcher': 2.5.1
|
||||
'@parcel/watcher-wasm': 2.5.1
|
||||
citty: 0.1.6
|
||||
clipboardy: 4.0.0
|
||||
consola: 3.4.2
|
||||
crossws: 0.3.5
|
||||
defu: 6.1.4
|
||||
get-port-please: 3.2.0
|
||||
h3: 1.15.5
|
||||
http-shutdown: 1.2.2
|
||||
jiti: 2.6.1
|
||||
mlly: 1.8.0
|
||||
node-forge: 1.3.3
|
||||
pathe: 1.1.2
|
||||
std-env: 3.10.0
|
||||
ufo: 1.6.3
|
||||
untun: 0.1.3
|
||||
uqr: 0.1.2
|
||||
|
||||
listr2@8.3.3:
|
||||
dependencies:
|
||||
cli-truncate: 4.0.0
|
||||
@@ -28620,8 +28319,6 @@ snapshots:
|
||||
|
||||
mimic-fn@2.1.0: {}
|
||||
|
||||
mimic-fn@4.0.0: {}
|
||||
|
||||
mimic-function@5.0.1: {}
|
||||
|
||||
mimic-response@1.0.1: {}
|
||||
@@ -29052,10 +28749,6 @@ snapshots:
|
||||
dependencies:
|
||||
path-key: 3.1.1
|
||||
|
||||
npm-run-path@5.3.0:
|
||||
dependencies:
|
||||
path-key: 4.0.0
|
||||
|
||||
nprogress@0.2.0: {}
|
||||
|
||||
nth-check@2.1.1:
|
||||
@@ -29117,10 +28810,6 @@ snapshots:
|
||||
dependencies:
|
||||
mimic-fn: 2.1.0
|
||||
|
||||
onetime@6.0.0:
|
||||
dependencies:
|
||||
mimic-fn: 4.0.0
|
||||
|
||||
onetime@7.0.0:
|
||||
dependencies:
|
||||
mimic-function: 5.0.1
|
||||
@@ -29416,8 +29105,6 @@ snapshots:
|
||||
|
||||
path-key@3.1.1: {}
|
||||
|
||||
path-key@4.0.0: {}
|
||||
|
||||
path-parse@1.0.7: {}
|
||||
|
||||
path-scurry@1.11.1:
|
||||
@@ -30916,9 +30603,7 @@ snapshots:
|
||||
|
||||
sprintf-js@1.1.3: {}
|
||||
|
||||
srvx@0.11.8: {}
|
||||
|
||||
srvx@0.9.8(patch_hash=f0151386fdcbcb6f53833cf8f66926ef2eb31b71a2782d6e0960dec832ef108d): {}
|
||||
srvx@0.11.8(patch_hash=c761d25a70e22a0925c88fe91a9dd1c3153dd341d8fd4f260166678156c4df2d): {}
|
||||
|
||||
ssri@12.0.0:
|
||||
dependencies:
|
||||
@@ -31019,8 +30704,6 @@ snapshots:
|
||||
|
||||
strip-final-newline@2.0.0: {}
|
||||
|
||||
strip-final-newline@3.0.0: {}
|
||||
|
||||
strip-indent@4.1.1: {}
|
||||
|
||||
strip-json-comments@2.0.1: {}
|
||||
@@ -31089,8 +30772,6 @@ snapshots:
|
||||
dependencies:
|
||||
'@pkgr/core': 0.2.9
|
||||
|
||||
system-architecture@0.1.0: {}
|
||||
|
||||
tabbable@6.4.0: {}
|
||||
|
||||
table-layout@4.1.1:
|
||||
@@ -31975,12 +31656,6 @@ snapshots:
|
||||
|
||||
untildify@4.0.0: {}
|
||||
|
||||
untun@0.1.3:
|
||||
dependencies:
|
||||
citty: 0.1.6
|
||||
consola: 3.4.2
|
||||
pathe: 1.1.2
|
||||
|
||||
untyped@2.0.0:
|
||||
dependencies:
|
||||
citty: 0.1.6
|
||||
@@ -32011,8 +31686,6 @@ snapshots:
|
||||
semver: 7.7.4
|
||||
xdg-basedir: 5.1.0
|
||||
|
||||
uqr@0.1.2: {}
|
||||
|
||||
uri-js@4.4.1:
|
||||
dependencies:
|
||||
punycode: 2.3.1
|
||||
|
||||
+2
-3
@@ -26,8 +26,7 @@ patchedDependencies:
|
||||
mineflayer-pathfinder: patches/mineflayer-pathfinder.patch
|
||||
mineflayer@4.33.0: patches/mineflayer@4.33.0.patch
|
||||
pixi-live2d-display: patches/pixi-live2d-display.patch
|
||||
srvx@0.9.8: patches/srvx@0.9.8.patch
|
||||
|
||||
srvx: patches/srvx.patch
|
||||
catalog:
|
||||
'@capacitor/cli': ^8.1.0
|
||||
'@capacitor/core': ^8.1.0
|
||||
@@ -80,7 +79,7 @@ catalog:
|
||||
histoire: 1.0.0-beta.1
|
||||
hono: 4.11.3
|
||||
idb-keyval: ^6.2.2
|
||||
injeca: ^0.1.7
|
||||
injeca: ^0.1.8
|
||||
is-network-error: ^1.3.0
|
||||
knip: ^5.85.0
|
||||
mkcert: ^3.2.0
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"@moeru/std": "catalog:",
|
||||
"@proj-airi/server-sdk": "^0.8.4",
|
||||
"h3": "^2.0.1-rc.14",
|
||||
"listhen": "^1.9.0",
|
||||
"ofetch": "^1.5.1",
|
||||
"playwright": "^1.58.2",
|
||||
"zod": "^4.3.6"
|
||||
|
||||
Reference in New Issue
Block a user