feat: add remote-first education work lake

This commit is contained in:
冰朔 2026-08-07 20:41:03 +08:00
commit 333cd222c5
43 changed files with 923 additions and 74 deletions

View file

@ -11,12 +11,12 @@ describe('aiAgents helpers', () => {
expect(normalizeStoredAiAgent('claude_code')).toBe('claude_code')
expect(normalizeStoredAiAgent('codex')).toBe('codex')
expect(normalizeStoredAiAgent('copilot')).toBe('copilot')
expect(normalizeStoredAiAgent('opencode')).toBe('opencode')
expect(normalizeStoredAiAgent('pi')).toBe('pi')
expect(normalizeStoredAiAgent('antigravity')).toBe('antigravity')
expect(normalizeStoredAiAgent('gemini')).toBe('antigravity')
expect(normalizeStoredAiAgent('kiro')).toBe('kiro')
expect(normalizeStoredAiAgent('hermes')).toBe('hermes')
expect(normalizeStoredAiAgent('opencode')).toBeNull()
expect(normalizeStoredAiAgent('pi')).toBeNull()
expect(normalizeStoredAiAgent('antigravity')).toBeNull()
expect(normalizeStoredAiAgent('gemini')).toBeNull()
expect(normalizeStoredAiAgent('kiro')).toBeNull()
expect(normalizeStoredAiAgent('hermes')).toBeNull()
expect(normalizeStoredAiAgent('cursor')).toBeNull()
})
@ -40,29 +40,25 @@ describe('aiAgents helpers', () => {
expect(statuses.claude_code).toEqual({ status: 'installed', version: '1.0.20' })
expect(statuses.codex).toEqual({ status: 'missing', version: null })
expect(statuses.copilot).toEqual({ status: 'installed', version: '1.0.58' })
expect(statuses.opencode).toEqual({ status: 'installed', version: '0.3.1' })
expect(statuses.pi).toEqual({ status: 'installed', version: '0.70.2' })
expect(statuses.antigravity).toEqual({ status: 'installed', version: 'Antigravity CLI 1.0.0' })
expect(statuses.kiro).toEqual({ status: 'installed', version: '0.12.0' })
expect(statuses.hermes).toEqual({ status: 'installed', version: 'Hermes Agent 0.16.0' })
expect(statuses.opencode).toBeUndefined()
expect(statuses.pi).toBeUndefined()
expect(statuses.antigravity).toBeUndefined()
expect(statuses.kiro).toBeUndefined()
expect(statuses.hermes).toBeUndefined()
})
it('normalizes legacy Gemini status payloads to Antigravity', () => {
it('does not expose legacy Gemini status payloads', () => {
const statuses = normalizeAiAgentsStatus({
gemini: { installed: true, version: '0.5.1' },
})
expect(statuses.antigravity).toEqual({ status: 'installed', version: '0.5.1' })
expect(statuses.antigravity).toBeUndefined()
})
it('cycles through the supported agents', () => {
expect(getNextAiAgentId('claude_code')).toBe('codex')
expect(getNextAiAgentId('codex')).toBe('copilot')
expect(getNextAiAgentId('copilot')).toBe('opencode')
expect(getNextAiAgentId('opencode')).toBe('pi')
expect(getNextAiAgentId('pi')).toBe('antigravity')
expect(getNextAiAgentId('antigravity')).toBe('kiro')
expect(getNextAiAgentId('kiro')).toBe('hermes')
expect(getNextAiAgentId('hermes')).toBe('claude_code')
expect(getNextAiAgentId('copilot')).toBe('claude_code')
expect(getNextAiAgentId('opencode')).toBe('claude_code')
})
})

View file

@ -40,37 +40,40 @@ export const AI_AGENT_DEFINITIONS: readonly AiAgentDefinition[] = [
shortLabel: 'Copilot',
installUrl: 'https://docs.github.com/en/copilot/how-tos/copilot-cli/set-up-copilot-cli/install-copilot-cli',
},
{
] as const
const LEGACY_AI_AGENT_DEFINITIONS: Partial<Record<AiAgentId, AiAgentDefinition>> = {
opencode: {
id: 'opencode',
label: 'OpenCode',
shortLabel: 'OpenCode',
installUrl: 'https://opencode.ai/docs/',
},
{
pi: {
id: 'pi',
label: 'Pi',
shortLabel: 'Pi',
installUrl: 'https://pi.dev',
},
{
antigravity: {
id: 'antigravity',
label: 'Antigravity CLI',
label: 'Antigravity',
shortLabel: 'Antigravity',
installUrl: 'https://antigravity.google/docs/cli/install',
},
{
kiro: {
id: 'kiro',
label: 'Kiro',
shortLabel: 'Kiro',
installUrl: 'https://kiro.dev/docs/cli',
},
{
hermes: {
id: 'hermes',
label: 'Hermes Agent',
shortLabel: 'Hermes',
installUrl: 'https://hermes-agent.nousresearch.com/docs/getting-started/quickstart',
},
] as const
}
export function createAiAgentAvailability(status: AiAgentStatus = 'checking', version: string | null = null): AiAgentAvailability {
return { status, version }
@ -94,7 +97,6 @@ export function createMissingAiAgentsStatus(): AiAgentsStatus {
}
export function normalizeStoredAiAgent(value: string | null | undefined): AiAgentId | null {
if (value === 'gemini') return 'antigravity'
if (AI_AGENT_DEFINITIONS.some((definition) => definition.id === value)) return value as AiAgentId
return null
}
@ -104,7 +106,9 @@ export function resolveDefaultAiAgent(value: string | null | undefined): AiAgent
}
export function getAiAgentDefinition(agent: AiAgentId): AiAgentDefinition {
return AI_AGENT_DEFINITIONS.find((definition) => definition.id === agent) ?? AI_AGENT_DEFINITIONS[0]
return AI_AGENT_DEFINITIONS.find((definition) => definition.id === agent)
?? LEGACY_AI_AGENT_DEFINITIONS[agent]
?? AI_AGENT_DEFINITIONS[0]
}
function normalizeAvailability(agent: { installed?: boolean | null; version?: string | null } | null | undefined): AiAgentAvailability {
@ -116,7 +120,7 @@ function normalizeAvailability(agent: { installed?: boolean | null; version?: st
}
function payloadForAgent(payload: AiAgentsStatusPayload | null | undefined, agent: AiAgentId) {
return agent === 'antigravity' ? payload?.antigravity ?? payload?.gemini : payload?.[agent]
return payload?.[agent]
}
export function normalizeAiAgentsStatus(payload: AiAgentsStatusPayload | null | undefined): AiAgentsStatus {

View file

@ -59,7 +59,7 @@ describe('ai target provider contract', () => {
})
})
it('accepts legacy agent ids saved in the default target field', () => {
it('falls back safely when the default target contains a hidden legacy agent', () => {
const target = resolveAiTarget({
default_ai_agent: 'claude_code',
default_ai_target: 'kiro',
@ -67,12 +67,12 @@ describe('ai target provider contract', () => {
expect(target).toMatchObject({
kind: 'agent',
agent: 'kiro',
id: 'agent:kiro',
agent: 'claude_code',
id: 'agent:claude_code',
})
})
it('uses the legacy default agent when a saved agent target is stale', () => {
it('falls back safely when the saved legacy default agent is no longer selectable', () => {
const target = resolveAiTarget({
default_ai_agent: 'kiro',
default_ai_target: 'agent:claude_code',
@ -80,8 +80,8 @@ describe('ai target provider contract', () => {
expect(target).toMatchObject({
kind: 'agent',
agent: 'kiro',
id: 'agent:kiro',
agent: 'claude_code',
id: 'agent:claude_code',
})
})

View file

@ -0,0 +1,46 @@
import { describe, expect, it } from 'vitest'
import {
educationMetricsFromSheet,
isEducationWorkLakePath,
routeEducationInstruction,
} from './educationWorkLake'
describe('routeEducationInstruction', () => {
it.each([
['整理一下这个表格里面的数据', 'sheet'],
['对比一下并做一个对比图', 'chart'],
['把结果做成仪表盘', 'dashboard'],
['起草一份教研文档', 'document'],
['找一下课程知识库', 'knowledge'],
] as const)('routes %s to %s', (instruction, expectedSurface) => {
expect(routeEducationInstruction(instruction).surface).toBe(expectedSurface)
})
it('returns a stable safe fallback without claiming execution', () => {
expect(routeEducationInstruction('帮我看看')).toMatchObject({
surface: 'knowledge',
capabilityId: 'HL-MOD-KNOWLEDGE-001',
reason: 'safe-fallback',
})
})
it('prioritizes dashboards over their underlying chart keyword', () => {
expect(routeEducationInstruction('把对比图放进仪表盘')).toMatchObject({
surface: 'dashboard',
capabilityId: 'HL-MOD-DASHBOARD-001',
})
})
it('projects numeric spreadsheet rows into chart metrics', () => {
expect(educationMetricsFromSheet('---\n_display: sheet\n---\n班级,平均分\n一班,86\n二班,91\n备注,待补')).toEqual([
{ label: '一班', value: 86 },
{ label: '二班', value: 91 },
])
})
it('recognizes the server-hosted education entry without matching similar words', () => {
expect(isEducationWorkLakePath('/jd/education/')).toBe(true)
expect(isEducationWorkLakePath('/jd/education/assets/app.js')).toBe(true)
expect(isEducationWorkLakePath('/jd/educational/')).toBe(false)
})
})

View file

@ -0,0 +1,92 @@
export const EDUCATION_SURFACES = [
'document',
'sheet',
'chart',
'dashboard',
'knowledge',
] as const
export type EducationSurface = typeof EDUCATION_SURFACES[number]
export type EducationInstructionRoute = {
capabilityId: string
reason: 'keyword-match' | 'safe-fallback'
surface: EducationSurface
}
export type EducationMetric = {
label: string
value: number
}
const ROUTES: ReadonlyArray<{
capabilityId: string
keywords: readonly string[]
surface: EducationSurface
}> = [
{
capabilityId: 'HL-MOD-DASHBOARD-001',
keywords: ['仪表盘', '看板', 'dashboard'],
surface: 'dashboard',
},
{
capabilityId: 'HL-MOD-CHART-001',
keywords: ['对比图', '图表', '柱状图', '折线图', 'chart'],
surface: 'chart',
},
{
capabilityId: 'HL-MOD-SHEET-001',
keywords: ['表格', '数据', '计算', '统计', 'sheet', 'spreadsheet'],
surface: 'sheet',
},
{
capabilityId: 'HL-MOD-DOC-001',
keywords: ['文档', '教案', '报告', '总结', '起草', 'document'],
surface: 'document',
},
{
capabilityId: 'HL-MOD-KNOWLEDGE-001',
keywords: ['知识库', '课程', '资料', '搜索', '找', 'knowledge'],
surface: 'knowledge',
},
]
export function routeEducationInstruction(instruction: string): EducationInstructionRoute {
const normalizedInstruction = instruction.trim().toLocaleLowerCase()
const route = ROUTES.find((candidate) =>
candidate.keywords.some((keyword) => normalizedInstruction.includes(keyword)))
if (route) {
return {
capabilityId: route.capabilityId,
reason: 'keyword-match',
surface: route.surface,
}
}
return {
capabilityId: 'HL-MOD-KNOWLEDGE-001',
reason: 'safe-fallback',
surface: 'knowledge',
}
}
export function educationMetricsFromSheet(content: string): EducationMetric[] {
const body = content.includes('---')
? content.split('---').slice(2).join('---')
: content
return body
.trim()
.split(/\r?\n/)
.slice(1)
.map((row) => {
const [label = '', value = ''] = row.split(',')
return { label: label.trim(), value: Number(value.trim()) }
})
.filter((metric) => metric.label.length > 0 && Number.isFinite(metric.value))
}
export function isEducationWorkLakePath(pathname: string): boolean {
return pathname.split('/').filter(Boolean).includes('education')
}

View file

@ -9,6 +9,7 @@ export const GUANGHU_CHANNEL_ROUTES = [
'eternal-lake-heart',
'light-lake',
'heartbeat-core',
'education-work-lake',
'love-core',
'servers',
] as const

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1000,6 +1000,20 @@
"locale.ukUA": "Ukrainian",
"locale.svSE": "Swedish",
"locale.skSK": "Slovak",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content",
"hololake.home.ariaLabel": "HoloLake Era world entry",
"hololake.home.eyebrow": "Guanghu Language World · Fifth Domain",
"hololake.home.lead": "Language-personality-driven operating system",

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}

View file

@ -1000,6 +1000,20 @@
"locale.ukUA": "乌克兰语",
"locale.svSE": "瑞典语",
"locale.skSK": "斯洛伐克语",
"education.title": "教育工作湖",
"education.description": "人格体通过语言指令调出并编辑文档、表格、对比图、仪表盘与知识,所有呈现在用户设备完成。",
"education.hostingState": "临时隔离承载",
"education.instructionLabel": "告诉人格体你要处理什么",
"education.instructionPlaceholder": "例如:整理这个表格,并生成一个对比仪表盘",
"education.runInstruction": "运行指令",
"education.openedInsideApp": "已在应用内打开",
"education.surfaceNavigation": "教育工作区界面",
"education.document": "文档",
"education.sheet": "表格",
"education.chart": "对比图",
"education.dashboard": "仪表盘",
"education.knowledge": "知识",
"education.documentLabel": "教研文档内容",
"hololake.home.ariaLabel": "HoloLake Era 世界入口",
"hololake.home.eyebrow": "光湖语言世界 · 第五域",
"hololake.home.lead": "语言人格驱动操作系统",

View file

@ -1121,5 +1121,19 @@
"hololake.login.errorTitle": "The world entrance did not open",
"hololake.login.retry": "Try again",
"hololake.login.privacy": "HoloLake never receives or stores your mailbox address. The Fifth Domain controller resolves the bound Guanghu number.",
"hololake.login.nodeReady": "Fifth Domain world entrance ready"
"hololake.login.nodeReady": "Fifth Domain world entrance ready",
"education.title": "Education Work Lake",
"education.description": "A client-rendered workspace where the persona can open and edit documents, spreadsheets, charts, dashboards, and knowledge through language instructions.",
"education.hostingState": "Temporary isolated hosting",
"education.instructionLabel": "Tell the persona what you want to work on",
"education.instructionPlaceholder": "For example: organize this spreadsheet and create a comparison dashboard",
"education.runInstruction": "Run instruction",
"education.openedInsideApp": "Opened inside the app",
"education.surfaceNavigation": "Education workspace surfaces",
"education.document": "Document",
"education.sheet": "Spreadsheet",
"education.chart": "Chart",
"education.dashboard": "Dashboard",
"education.knowledge": "Knowledge",
"education.documentLabel": "Education document content"
}