feat: add device sharing metadata application

This commit is contained in:
mesalogo
2026-10-01 01:31:44 +08:00
parent 0a02a17cb6
commit a3b41bf2b1
28 changed files with 853 additions and 33 deletions
+2 -2
View File
@@ -37,12 +37,12 @@ export const defaultSupervisorModelConcurrency = 1
export const supervisorModelConcurrencySchema = z.number().int().min(1).max(4)
export const supervisionTimeoutSecondsSchema = z.number().int().min(30).max(600)
export const builtInApplicationIds = ['magic-notes', 'knowledge', 'heartbeat', 'local-inference'] as const
export const builtInApplicationIds = ['magic-notes', 'knowledge', 'heartbeat', 'local-inference', 'device-sharing'] as const
export type BuiltInApplicationId = typeof builtInApplicationIds[number]
export const editableApplicationIds = ['magic-notes', 'heartbeat', 'local-inference'] as const
export type EditableApplicationId = typeof editableApplicationIds[number]
export const defaultApplicationNavigation = {
order: ['knowledge', 'heartbeat', 'magic-notes', 'local-inference'] as BuiltInApplicationId[],
order: ['knowledge', 'heartbeat', 'magic-notes', 'local-inference', 'device-sharing'] as BuiltInApplicationId[],
pinned: { 'magic-notes': true, heartbeat: true, 'local-inference': false }
}
export const applicationNavigationSchema = z.object({
+1
View File
@@ -1767,6 +1767,7 @@ export type KnowledgeSearchReference = {
}
export type DesktopApi = {
sharing: import('./device-sharing-contracts').DeviceSharingApi
openRuntimeNativeClient: (input: import('./runtime-native-client-contracts').RuntimeNativeClientInput) => Promise<import('./runtime-native-client-contracts').RuntimeNativeClientResult>
getRuntimeNativeClient: (input: import('./runtime-native-client-contracts').RuntimeNativeClientInput) => Promise<import('./runtime-native-client-contracts').RuntimeNativeClientService | null>
stopRuntimeNativeClient: (input: import('./runtime-native-client-contracts').RuntimeNativeClientService) => Promise<void>
+41
View File
@@ -0,0 +1,41 @@
import { z } from 'zod'
export const sharingIdSchema = z.string().trim().min(1).max(200)
export const sharingSettingsInputSchema = z.object({
serverUrl: z.url().refine(value => {
if (!URL.canParse(value)) return false
const url = new URL(value)
return ['http:', 'https:'].includes(url.protocol) && !url.username && !url.password && !url.search && !url.hash
}, 'Use an HTTP(S) service URL without credentials, query or fragment'),
name: z.string().trim().min(1).max(200)
}).strict()
export const sharingSettingsSchema = sharingSettingsInputSchema.extend({ deviceId: sharingIdSchema })
export const sharingDeviceSchema = z.object({
id: sharingIdSchema, name: z.string(), platform: z.string(), appVersion: z.string(),
registeredAt: z.string(), updatedAt: z.string()
})
export const sharingPublicationDraftSchema = z.object({
name: z.string().trim().min(1).max(200),
kind: z.enum(['capability', 'knowledge']),
description: z.string().trim().max(4000),
sourceMode: z.enum(['device', 'server']),
permissions: z.object({ search: z.boolean(), read: z.boolean(), download: z.boolean() }).strict()
}).strict()
export const sharingPublicationSchema = sharingPublicationDraftSchema.extend({
id: sharingIdSchema, deviceId: sharingIdSchema,
status: z.enum(['published', 'revoked']), createdAt: z.string(), updatedAt: z.string()
})
export type SharingSettings = z.infer<typeof sharingSettingsSchema>
export type SharingSettingsInput = z.infer<typeof sharingSettingsInputSchema>
export type SharingDevice = z.infer<typeof sharingDeviceSchema>
export type SharingPublicationDraft = z.infer<typeof sharingPublicationDraftSchema>
export type SharingPublication = z.infer<typeof sharingPublicationSchema>
export type SharingCatalog = { devices: SharingDevice[]; publications: SharingPublication[] }
export type DeviceSharingApi = {
getSettings: () => Promise<SharingSettings>
saveSettings: (input: SharingSettingsInput) => Promise<SharingSettings>
registerDevice: () => Promise<SharingDevice>
getCatalog: () => Promise<SharingCatalog>
publish: (input: SharingPublicationDraft) => Promise<SharingPublication>
revoke: (id: string) => Promise<SharingPublication>
}
+6
View File
@@ -1,4 +1,10 @@
export const ipcChannels = {
sharingSettingsGet: 'sharing:settings-get',
sharingSettingsSave: 'sharing:settings-save',
sharingRegister: 'sharing:register',
sharingCatalog: 'sharing:catalog',
sharingPublish: 'sharing:publish',
sharingRevoke: 'sharing:revoke',
localInferenceGet: 'local-inference:get',
localInferenceAct: 'local-inference:act',
localInferenceCancel: 'local-inference:cancel',