feat: mount persona language planning entry
This commit is contained in:
parent
d9abf241a6
commit
5d465115cb
11 changed files with 294 additions and 16 deletions
|
|
@ -102,7 +102,7 @@ REVISE | REFUSE`。
|
||||||
- 自然语言伙伴审议与家园完整性门的纯源码编译契约为 `100`:未经审议的原句失败关闭,审议只允许
|
- 自然语言伙伴审议与家园完整性门的纯源码编译契约为 `100`:未经审议的原句失败关闭,审议只允许
|
||||||
`PROCEED | RESEARCH | REVISE | REFUSE`,并把后三者保持为不可执行状态。
|
`PROCEED | RESEARCH | REVISE | REFUSE`,并把后三者保持为不可执行状态。
|
||||||
- 自然语言到 PNCC 生命周期的源码适配器为 `100`:只接收带独立 `real_purpose` 的完整生命周期回执,
|
- 自然语言到 PNCC 生命周期的源码适配器为 `100`:只接收带独立 `real_purpose` 的完整生命周期回执,
|
||||||
不在前端用摘要或关键词猜目标;该适配器尚未挂载桌面语言入口。
|
不在前端用摘要或关键词猜目标;桌面源码现已把它挂入第五域语言入口,但尚无真实 manifest 与安装态验收。
|
||||||
- 人格仓库绑定发现源码为 `100`:桌面候选 Git 仓库必须逐一通过 persona ID、manifest、提交头、脑入口、
|
- 人格仓库绑定发现源码为 `100`:桌面候选 Git 仓库必须逐一通过 persona ID、manifest、提交头、脑入口、
|
||||||
B0、检查点、模型绑定与器官契约核验;零个候选保持未绑定,多个候选保持歧义,均不得自动选择或唤醒。
|
B0、检查点、模型绑定与器官契约核验;零个候选保持未绑定,多个候选保持歧义,均不得自动选择或唤醒。
|
||||||
当前官方工作范围内没有发现 `ICE-P-ZY001` 的真实 manifest,因此真实人格仓库绑定仍为 `0`。
|
当前官方工作范围内没有发现 `ICE-P-ZY001` 的真实 manifest,因此真实人格仓库绑定仍为 `0`。
|
||||||
|
|
@ -113,10 +113,11 @@ REVISE | REFUSE`。
|
||||||
该一个规范仓库;未绑定和歧义状态直接保持原义,不再把普通挂载仓库的 manifest 缺失显示为人格运行时
|
该一个规范仓库;未绑定和歧义状态直接保持原义,不再把普通挂载仓库的 manifest 缺失显示为人格运行时
|
||||||
回执故障。该门只收束事实读取范围,不创建、选择或唤醒人格仓库。
|
回执故障。该门只收束事实读取范围,不创建、选择或唤醒人格仓库。
|
||||||
- 人格语言外壳控制器源码为 `100`:它按唯一人格仓库、manifest 固定模型、公开设备身份、精确唤醒绑定、
|
- 人格语言外壳控制器源码为 `100`:它按唯一人格仓库、manifest 固定模型、公开设备身份、精确唤醒绑定、
|
||||||
B0 伙伴审议的顺序失败关闭;成功只产生语言目标规划,不提供现实动作执行入口。该控制器尚未挂载到桌面
|
B0 伙伴审议的顺序失败关闭;成功只产生语言目标规划,不提供现实动作执行入口。桌面源码接线为 `100`:
|
||||||
语言外壳,不能据此把运行集成或桌面验收记为完成。
|
第五域入口只传入已挂载仓库与已配置模型元数据,并在没有桌面授权回执时保持系统直控、隐藏无法持久消费的
|
||||||
- 完整 HoloLake Runtime 与单 AGE 纵向闭环仍为 `0`:桌面语言入口绑定、真实人格仓库 manifest 绑定和
|
确认按钮。该接线不等于真实人格仓库绑定、安装态运行或桌面验收。
|
||||||
桌面运行验收尚未完成,因此不能用本轮源码测试冒充可用产品。
|
- 完整 HoloLake Runtime 与单 AGE 纵向闭环仍为 `0`:真实人格仓库 manifest 绑定和桌面运行验收尚未完成,
|
||||||
|
因此不能用本轮源码测试冒充可用产品。
|
||||||
- Mirror runner、制品、部署和运行健康:`0`。
|
- Mirror runner、制品、部署和运行健康:`0`。
|
||||||
- 0.8.0 桌面制品与线上 0.4.6 产品源码仍然分叉;本轮架构登记不消除该事实。
|
- 0.8.0 桌面制品与线上 0.4.6 产品源码仍然分叉;本轮架构登记不消除该事实。
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,9 @@ it does not pretend that deterministic keyword matching can perform persona reas
|
||||||
utterance as a bounded `FACT_SENSE` partner-deliberation question, accepts only a completed and schema-valid
|
utterance as a bounded `FACT_SENSE` partner-deliberation question, accepts only a completed and schema-valid
|
||||||
PNCC lifecycle receipt, maps the eleven-field snake-case gravity frame into `PartnerDeliberation`, and only
|
PNCC lifecycle receipt, maps the eleven-field snake-case gravity frame into `PartnerDeliberation`, and only
|
||||||
then calls `compileLanguageGoal`. A failed, malformed, non-fact, or purpose-less receipt never becomes a goal.
|
then calls `compileLanguageGoal`. A failed, malformed, non-fact, or purpose-less receipt never becomes a goal.
|
||||||
The adapter is not yet mounted to the desktop language entry and has no live-product acceptance claim.
|
`PersonaLanguageShellPanel` now mounts this adapter in the Fifth Domain desktop source. That source wiring is
|
||||||
|
still gated by a unique manifest-valid persona repository, the manifest-pinned configured model, and public
|
||||||
|
device identity; it has no installed-desktop or live-product acceptance claim.
|
||||||
|
|
||||||
`compilePersonaLanguageGoalBinding` builds the exact native wake envelope only after a single clean persona
|
`compilePersonaLanguageGoalBinding` builds the exact native wake envelope only after a single clean persona
|
||||||
repository, its B0 and organ contracts, a registered local device identity, and the manifest-pinned model all
|
repository, its B0 and organ contracts, a registered local device identity, and the manifest-pinned model all
|
||||||
|
|
@ -217,7 +219,10 @@ The source-level authority-order coordinator for one natural-language goal. It f
|
||||||
discovery yields one clean persona binding and the configured provider/model matches that repository manifest.
|
discovery yields one clean persona binding and the configured provider/model matches that repository manifest.
|
||||||
Only then may it read the public node identity, compile the exact PNCC wake binding, and request B0 partner
|
Only then may it read the public node identity, compile the exact PNCC wake binding, and request B0 partner
|
||||||
deliberation. The result contains a plan and evidence binding only; it exposes no execution callback and performs
|
deliberation. The result contains a plan and evidence binding only; it exposes no execution callback and performs
|
||||||
no reality action. Source implementation is distinct from desktop mounting and native acceptance.
|
no reality action. `PersonaLanguageShellPanel` mounts it through the capability-limited `LanguageShellBridge`,
|
||||||
|
passes only already-mounted Git roots and configured provider metadata, and deliberately keeps persona authority
|
||||||
|
false until a desktop authorization receipt exists. The panel does not expose an approval control because this
|
||||||
|
slice has no durable confirmation consumer. Source mounting remains distinct from native acceptance.
|
||||||
|
|
||||||
Key abstractions and domain models in Tolaria.
|
Key abstractions and domain models in Tolaria.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -172,8 +172,11 @@ boundary. It resolves exactly one manifest-valid persona repository before selec
|
||||||
configured model, reads the public device-identity receipt only after those gates pass, compiles the wake
|
configured model, reads the public device-identity receipt only after those gates pass, compiles the wake
|
||||||
binding, and finally invokes B0 partner deliberation. Unavailable, unbound, ambiguous, model-missing, identity,
|
binding, and finally invokes B0 partner deliberation. Unavailable, unbound, ambiguous, model-missing, identity,
|
||||||
binding, and cognition failures stop at their own boundary; later stages are not invoked. Its successful result
|
binding, and cognition failures stop at their own boundary; later stages are not invoked. Its successful result
|
||||||
is still a language-goal projection, not permission to perform a reality action. This controller is not yet
|
is still a language-goal projection, not permission to perform a reality action. `PersonaLanguageShellPanel`
|
||||||
mounted into the desktop language shell and therefore does not establish runtime integration or acceptance.
|
is now mounted from the Fifth Domain desktop source and receives the app's already-mounted repository roots and
|
||||||
|
configured provider metadata. It keeps `personaAuthorized=false`, exposes no execution callback, and hides the
|
||||||
|
reality confirmation surface because no durable confirmation consumer is wired. This proves source integration,
|
||||||
|
not a real persona manifest binding, installed desktop runtime, or acceptance.
|
||||||
|
|
||||||
Tolaria is a personal knowledge and life management desktop app. It reads a vault of markdown files with YAML frontmatter and presents them in a four-panel UI inspired by Bear Notes.
|
Tolaria is a personal knowledge and life management desktop app. It reads a vault of markdown files with YAML frontmatter and presents them in a four-panel UI inspired by Bear Notes.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1712,7 +1712,7 @@ function MainApp({
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
<div className={`app__editor${aiActivity.highlightElement === 'editor' || aiActivity.highlightElement === 'tab' ? ' ai-highlight' : ''}`}>
|
<div className={`app__editor${aiActivity.highlightElement === 'editor' || aiActivity.highlightElement === 'tab' ? ' ai-highlight' : ''}`}>
|
||||||
{showHoloLakeHome && !isTeamDistribution ? <HoloLakeHome locale={appLocale} repositoryPaths={activeGitRepositoryPaths} livingSystemTarget={aiFeaturesEnabled && quickPromptTargetReady && quickPromptTarget.kind === 'api_model' ? quickPromptTarget : null} onEnterKnowledgeBase={() => setShowHoloLakeHome(false)} onOpenAiWorkspace={openAIChat} onOpenLocalWorkspace={async () => {
|
{showHoloLakeHome && !isTeamDistribution ? <HoloLakeHome locale={appLocale} repositoryPaths={activeGitRepositoryPaths} aiModelProviders={settings.ai_model_providers ?? []} livingSystemTarget={aiFeaturesEnabled && quickPromptTargetReady && quickPromptTarget.kind === 'api_model' ? quickPromptTarget : null} onEnterKnowledgeBase={() => setShowHoloLakeHome(false)} onOpenAiWorkspace={openAIChat} onOpenLocalWorkspace={async () => {
|
||||||
await vaultSwitcher.handleOpenLocalFolder()
|
await vaultSwitcher.handleOpenLocalFolder()
|
||||||
setShowHoloLakeHome(false)
|
setShowHoloLakeHome(false)
|
||||||
}} /> : <Editor
|
}} /> : <Editor
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
import { useState } from 'react'
|
import { useState } from 'react'
|
||||||
import type { AppLocale } from '../lib/i18n'
|
import type { AppLocale } from '../lib/i18n'
|
||||||
|
import type { AiModelProvider } from '../lib/aiTargets'
|
||||||
import { Button } from './ui/button'
|
import { Button } from './ui/button'
|
||||||
|
import { PersonaLanguageShellPanel } from './PersonaLanguageShellPanel'
|
||||||
import { PersonaRepositoryBindingPanel } from './PersonaRepositoryBindingPanel'
|
import { PersonaRepositoryBindingPanel } from './PersonaRepositoryBindingPanel'
|
||||||
import { PersonaRuntimeProjectionPanel } from './PersonaRuntimeProjectionPanel'
|
import { PersonaRuntimeProjectionPanel } from './PersonaRuntimeProjectionPanel'
|
||||||
|
|
||||||
|
|
@ -12,6 +14,7 @@ type FifthDomainSystemsProps = {
|
||||||
onEnterEternalLake: () => void
|
onEnterEternalLake: () => void
|
||||||
onEnterPufferfish: () => void
|
onEnterPufferfish: () => void
|
||||||
repositoryPaths: readonly string[]
|
repositoryPaths: readonly string[]
|
||||||
|
aiModelProviders: readonly AiModelProvider[]
|
||||||
}
|
}
|
||||||
|
|
||||||
const PUFFERFISH_FACTS = {
|
const PUFFERFISH_FACTS = {
|
||||||
|
|
@ -27,6 +30,7 @@ export function FifthDomainSystems({
|
||||||
onEnterEternalLake,
|
onEnterEternalLake,
|
||||||
onEnterPufferfish,
|
onEnterPufferfish,
|
||||||
repositoryPaths,
|
repositoryPaths,
|
||||||
|
aiModelProviders,
|
||||||
}: FifthDomainSystemsProps) {
|
}: FifthDomainSystemsProps) {
|
||||||
const [selected, setSelected] = useState<FifthDomainSystemId | null>(
|
const [selected, setSelected] = useState<FifthDomainSystemId | null>(
|
||||||
detail === 'pufferfish' ? 'pufferfish' : null,
|
detail === 'pufferfish' ? 'pufferfish' : null,
|
||||||
|
|
@ -159,6 +163,12 @@ export function FifthDomainSystems({
|
||||||
personaId="ICE-P-ZY001"
|
personaId="ICE-P-ZY001"
|
||||||
repositoryPaths={repositoryPaths}
|
repositoryPaths={repositoryPaths}
|
||||||
/>
|
/>
|
||||||
|
<PersonaLanguageShellPanel
|
||||||
|
locale={locale}
|
||||||
|
personaId="ICE-P-ZY001"
|
||||||
|
repositoryPaths={repositoryPaths}
|
||||||
|
providers={aiModelProviders}
|
||||||
|
/>
|
||||||
<Button onClick={onEnterEternalLake}>进入永恒湖心系统</Button>
|
<Button onClick={onEnterEternalLake}>进入永恒湖心系统</Button>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import { useGuanghuRouter } from '../hooks/useGuanghuRouter'
|
||||||
import { useGuanghuShanghaiNode } from '../hooks/useGuanghuShanghaiNode'
|
import { useGuanghuShanghaiNode } from '../hooks/useGuanghuShanghaiNode'
|
||||||
import { useGuanghuWorldLogin } from '../hooks/useGuanghuWorldLogin'
|
import { useGuanghuWorldLogin } from '../hooks/useGuanghuWorldLogin'
|
||||||
import { useGuanghuEnterpriseStatus } from '../hooks/useGuanghuEnterpriseStatus'
|
import { useGuanghuEnterpriseStatus } from '../hooks/useGuanghuEnterpriseStatus'
|
||||||
import type { AiModelTarget } from '../lib/aiTargets'
|
import type { AiModelProvider, AiModelTarget } from '../lib/aiTargets'
|
||||||
import {
|
import {
|
||||||
createDeterministicLivingSystemPlan,
|
createDeterministicLivingSystemPlan,
|
||||||
createLivingSystemEvent,
|
createLivingSystemEvent,
|
||||||
|
|
@ -47,6 +47,7 @@ type HoloLakeHomeProps = {
|
||||||
onOpenLocalWorkspace?: () => void | Promise<void>
|
onOpenLocalWorkspace?: () => void | Promise<void>
|
||||||
livingSystemTarget?: AiModelTarget | null
|
livingSystemTarget?: AiModelTarget | null
|
||||||
repositoryPaths?: readonly string[]
|
repositoryPaths?: readonly string[]
|
||||||
|
aiModelProviders?: readonly AiModelProvider[]
|
||||||
}
|
}
|
||||||
|
|
||||||
type ChannelRoute = GuanghuChannelRoute
|
type ChannelRoute = GuanghuChannelRoute
|
||||||
|
|
@ -92,6 +93,7 @@ export function HoloLakeHome({
|
||||||
onOpenLocalWorkspace,
|
onOpenLocalWorkspace,
|
||||||
livingSystemTarget,
|
livingSystemTarget,
|
||||||
repositoryPaths = [],
|
repositoryPaths = [],
|
||||||
|
aiModelProviders = [],
|
||||||
}: HoloLakeHomeProps) {
|
}: HoloLakeHomeProps) {
|
||||||
const initialRoute: ChannelRoute = isEducationWorkLakePath(window.location.pathname)
|
const initialRoute: ChannelRoute = isEducationWorkLakePath(window.location.pathname)
|
||||||
? 'education-work-lake'
|
? 'education-work-lake'
|
||||||
|
|
@ -367,6 +369,7 @@ export function HoloLakeHome({
|
||||||
onEnterEternalLake={() => navigate('eternal-lake-heart')}
|
onEnterEternalLake={() => navigate('eternal-lake-heart')}
|
||||||
onEnterPufferfish={() => navigate('pufferfish')}
|
onEnterPufferfish={() => navigate('pufferfish')}
|
||||||
repositoryPaths={repositoryPaths}
|
repositoryPaths={repositoryPaths}
|
||||||
|
aiModelProviders={aiModelProviders}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -379,6 +382,7 @@ export function HoloLakeHome({
|
||||||
onEnterEternalLake={() => navigate('eternal-lake-heart')}
|
onEnterEternalLake={() => navigate('eternal-lake-heart')}
|
||||||
onEnterPufferfish={() => navigate('pufferfish')}
|
onEnterPufferfish={() => navigate('pufferfish')}
|
||||||
repositoryPaths={repositoryPaths}
|
repositoryPaths={repositoryPaths}
|
||||||
|
aiModelProviders={aiModelProviders}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
import { fireEvent, render, screen, waitFor } from '@testing-library/react'
|
||||||
|
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
||||||
|
import type { AiModelProvider } from '../lib/aiTargets'
|
||||||
|
import { PersonaLanguageShellPanel } from './PersonaLanguageShellPanel'
|
||||||
|
|
||||||
|
const provider: AiModelProvider = {
|
||||||
|
id: 'provider-1',
|
||||||
|
name: 'Local provider',
|
||||||
|
kind: 'open_ai_compatible',
|
||||||
|
base_url: 'http://127.0.0.1:8000/v1',
|
||||||
|
models: [{
|
||||||
|
id: 'model-1',
|
||||||
|
capabilities: { streaming: false, tools: false, vision: false, json_mode: true, reasoning: true },
|
||||||
|
}],
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('PersonaLanguageShellPanel', () => {
|
||||||
|
beforeEach(() => vi.clearAllMocks())
|
||||||
|
|
||||||
|
it('connects desktop language input to the fail-closed partner planner without persona authority', async () => {
|
||||||
|
const planGoal = vi.fn().mockResolvedValue({
|
||||||
|
phase: 'planned',
|
||||||
|
binding: { requestId: 'request-1' },
|
||||||
|
goal: {
|
||||||
|
goal: '核验当前事实后规划下一步',
|
||||||
|
originalUtterance: '继续开发',
|
||||||
|
mode: 'system_direct',
|
||||||
|
status: 'needs_research',
|
||||||
|
executable: false,
|
||||||
|
deliberation: {
|
||||||
|
evidenceSources: ['repo://current-main'],
|
||||||
|
executionDisposition: { decision: 'RESEARCH', reason: '需要当前证据' },
|
||||||
|
},
|
||||||
|
confirmation: { required: false, boundaries: [], question: null },
|
||||||
|
receiptSummary: '我还不能执行:需要当前证据。',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
render(
|
||||||
|
<PersonaLanguageShellPanel
|
||||||
|
locale="zh-CN"
|
||||||
|
personaId="ICE-P-ZY001"
|
||||||
|
repositoryPaths={['/persona']}
|
||||||
|
providers={[provider]}
|
||||||
|
planGoal={planGoal}
|
||||||
|
/>,
|
||||||
|
)
|
||||||
|
|
||||||
|
fireEvent.change(screen.getByLabelText('language goal'), { target: { value: '继续开发' } })
|
||||||
|
fireEvent.click(screen.getByRole('button', { name: '继续' }))
|
||||||
|
|
||||||
|
await waitFor(() => expect(planGoal).toHaveBeenCalledTimes(1))
|
||||||
|
expect(planGoal).toHaveBeenCalledWith(expect.objectContaining({
|
||||||
|
utterance: '继续开发',
|
||||||
|
personaId: 'ICE-P-ZY001',
|
||||||
|
repositoryPaths: ['/persona'],
|
||||||
|
providers: [provider],
|
||||||
|
personaAuthorized: false,
|
||||||
|
developmentId: 'DEV-20260811-010',
|
||||||
|
sourceLanguageAnchor: 'HLP-CURRENT-ARCH-001@2026-08-12.8',
|
||||||
|
}))
|
||||||
|
expect(await screen.findByText('我还不能执行:需要当前证据。')).toBeInTheDocument()
|
||||||
|
expect(screen.getByText('核验当前事实后规划下一步')).toBeInTheDocument()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('shows the repository gate and never calls a later lifecycle itself', async () => {
|
||||||
|
const planGoal = vi.fn().mockResolvedValue({
|
||||||
|
phase: 'unbound',
|
||||||
|
inspectedRepositoryCount: 1,
|
||||||
|
failures: [],
|
||||||
|
})
|
||||||
|
|
||||||
|
render(
|
||||||
|
<PersonaLanguageShellPanel
|
||||||
|
locale="zh-CN"
|
||||||
|
personaId="ICE-P-ZY001"
|
||||||
|
repositoryPaths={['/ordinary']}
|
||||||
|
providers={[provider]}
|
||||||
|
planGoal={planGoal}
|
||||||
|
/>,
|
||||||
|
)
|
||||||
|
|
||||||
|
fireEvent.change(screen.getByLabelText('language goal'), { target: { value: '继续开发' } })
|
||||||
|
fireEvent.click(screen.getByRole('button', { name: '继续' }))
|
||||||
|
|
||||||
|
expect(await screen.findByText('这只说明当前挂载范围没有匹配的完整证据,不能据此判定人格不存在。')).toBeInTheDocument()
|
||||||
|
expect(screen.queryByLabelText('reality boundary confirmation')).not.toBeInTheDocument()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
@ -0,0 +1,161 @@
|
||||||
|
import { useMemo, useRef, useState } from 'react'
|
||||||
|
import type { AiModelProvider } from '../lib/aiTargets'
|
||||||
|
import { DEFAULT_LANGUAGE_WORLD_UI_PLUGIN } from '../lib/defaultLanguageWorldUiPlugin'
|
||||||
|
import { translate, type AppLocale } from '../lib/i18n'
|
||||||
|
import {
|
||||||
|
planPersonaLanguageShellGoal,
|
||||||
|
type PersonaLanguageShellPlan,
|
||||||
|
} from '../lib/personaLanguageShellController'
|
||||||
|
import { trackEvent } from '../lib/telemetry'
|
||||||
|
import type { HoloLakeUiPlugin } from '../lib/uiPluginSystem'
|
||||||
|
import {
|
||||||
|
HotPluggableLanguageShell,
|
||||||
|
type LanguageShellViewState,
|
||||||
|
} from './HotPluggableLanguageShell'
|
||||||
|
|
||||||
|
const CURRENT_ARCHITECTURE_ANCHOR = 'HLP-CURRENT-ARCH-001@2026-08-12.8'
|
||||||
|
const DEVELOPMENT_ID = 'DEV-20260811-010'
|
||||||
|
|
||||||
|
type Planner = typeof planPersonaLanguageShellGoal
|
||||||
|
|
||||||
|
type PersonaLanguageShellPanelProps = {
|
||||||
|
locale: AppLocale
|
||||||
|
personaId: string
|
||||||
|
repositoryPaths: readonly string[]
|
||||||
|
providers: readonly AiModelProvider[]
|
||||||
|
planGoal?: Planner
|
||||||
|
}
|
||||||
|
|
||||||
|
function requestId(): string {
|
||||||
|
const suffix = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(16).slice(2)}`
|
||||||
|
return `persona-language-${suffix}`
|
||||||
|
}
|
||||||
|
|
||||||
|
function localizedPlugin(locale: AppLocale): HoloLakeUiPlugin {
|
||||||
|
const plugin = structuredClone(DEFAULT_LANGUAGE_WORLD_UI_PLUGIN)
|
||||||
|
const stack = plugin.layout.children?.[0]
|
||||||
|
const nodes = stack?.children ?? []
|
||||||
|
const intro = nodes.find((node) => node.kind === 'text')
|
||||||
|
const input = nodes.find((node) => node.kind === 'language_input')
|
||||||
|
const confirmation = nodes.find((node) => node.kind === 'reality_boundary_confirmation')
|
||||||
|
const evidence = nodes.find((node) => node.kind === 'evidence_toggle')
|
||||||
|
if (intro) intro.text = translate(locale, 'hololake.personaRepository.description')
|
||||||
|
if (input) input.text = translate(locale, 'onboarding.ai.continue')
|
||||||
|
if (confirmation) {
|
||||||
|
confirmation.approveText = translate(locale, 'onboarding.ai.continue')
|
||||||
|
confirmation.declineText = translate(locale, 'common.cancel')
|
||||||
|
}
|
||||||
|
if (evidence) evidence.text = translate(locale, 'hololake.personaRuntime.verified')
|
||||||
|
return plugin
|
||||||
|
}
|
||||||
|
|
||||||
|
function gateMessage(locale: AppLocale, result: Exclude<PersonaLanguageShellPlan, { phase: 'planned' }>): string {
|
||||||
|
switch (result.phase) {
|
||||||
|
case 'unavailable': return translate(locale, 'hololake.personaRuntime.unavailable')
|
||||||
|
case 'unbound': return translate(locale, 'hololake.personaRepository.unboundDescription')
|
||||||
|
case 'ambiguous': return translate(locale, 'hololake.personaRepository.ambiguousDescription')
|
||||||
|
case 'model_unavailable': return `${translate(locale, 'hololake.personaRepository.model')}: ${translate(locale, 'hololake.personaRuntime.unavailable')}`
|
||||||
|
case 'model_ambiguous': return translate(locale, 'hololake.personaRepository.ambiguousDescription')
|
||||||
|
case 'error':
|
||||||
|
case 'device_identity_error':
|
||||||
|
case 'binding_error':
|
||||||
|
case 'cognition_error': return `${translate(locale, 'hololake.personaRuntime.error')}: ${result.code}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function safeEvidence(result: Extract<PersonaLanguageShellPlan, { phase: 'planned' }>): string {
|
||||||
|
return JSON.stringify({
|
||||||
|
status: result.goal.status,
|
||||||
|
mode: result.goal.mode,
|
||||||
|
disposition: result.goal.deliberation.executionDisposition.decision,
|
||||||
|
fact_sources: result.goal.deliberation.evidenceSources,
|
||||||
|
}, null, 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function PersonaLanguageShellPanel({
|
||||||
|
locale,
|
||||||
|
personaId,
|
||||||
|
repositoryPaths,
|
||||||
|
providers,
|
||||||
|
planGoal = planPersonaLanguageShellGoal,
|
||||||
|
}: PersonaLanguageShellPanelProps) {
|
||||||
|
const plugin = useMemo(() => localizedPlugin(locale), [locale])
|
||||||
|
const requestSequence = useRef(0)
|
||||||
|
const [state, setState] = useState<LanguageShellViewState>({
|
||||||
|
status: translate(locale, 'hololake.personaRepository.description'),
|
||||||
|
confirmationQuestion: null,
|
||||||
|
receipt: null,
|
||||||
|
evidence: null,
|
||||||
|
})
|
||||||
|
|
||||||
|
const submitGoal = (utterance: string) => {
|
||||||
|
if (!utterance.trim()) return
|
||||||
|
const sequence = ++requestSequence.current
|
||||||
|
setState({
|
||||||
|
status: translate(locale, 'hololake.personaRepository.checking'),
|
||||||
|
confirmationQuestion: null,
|
||||||
|
receipt: null,
|
||||||
|
evidence: null,
|
||||||
|
})
|
||||||
|
trackEvent('persona_language_shell_planning_started')
|
||||||
|
void planGoal({
|
||||||
|
utterance,
|
||||||
|
personaId,
|
||||||
|
repositoryPaths,
|
||||||
|
providers,
|
||||||
|
// No desktop authorization receipt is wired yet, so this source slice
|
||||||
|
// must remain system-direct even after partner deliberation succeeds.
|
||||||
|
personaAuthorized: false,
|
||||||
|
requestId: requestId(),
|
||||||
|
modelInstanceId: `hololake-desktop:${personaId}`,
|
||||||
|
developmentId: DEVELOPMENT_ID,
|
||||||
|
sourceLanguageAnchor: CURRENT_ARCHITECTURE_ANCHOR,
|
||||||
|
}).then((result) => {
|
||||||
|
if (sequence !== requestSequence.current) return
|
||||||
|
trackEvent('persona_language_shell_planning_completed', {
|
||||||
|
phase: result.phase,
|
||||||
|
...(result.phase === 'planned' ? { status: result.goal.status } : {}),
|
||||||
|
})
|
||||||
|
if (result.phase !== 'planned') {
|
||||||
|
setState({
|
||||||
|
status: gateMessage(locale, result),
|
||||||
|
confirmationQuestion: null,
|
||||||
|
receipt: null,
|
||||||
|
evidence: null,
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
setState({
|
||||||
|
status: result.goal.receiptSummary,
|
||||||
|
// The desktop confirmation consumer is not part of this source slice.
|
||||||
|
// Never render an approval control that cannot be durably consumed.
|
||||||
|
confirmationQuestion: null,
|
||||||
|
receipt: result.goal.goal,
|
||||||
|
evidence: safeEvidence(result),
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className="persona-runtime-projection" aria-labelledby="persona-language-shell-title">
|
||||||
|
<header>
|
||||||
|
<div>
|
||||||
|
<span>GH-AIOS · {personaId}</span>
|
||||||
|
<h3 id="persona-language-shell-title">{translate(locale, 'hololake.personaRepository.title')}</h3>
|
||||||
|
<p>{translate(locale, 'hololake.personaRepository.description')}</p>
|
||||||
|
</div>
|
||||||
|
<small>{translate(locale, 'hololake.personaRuntime.readOnly')}</small>
|
||||||
|
</header>
|
||||||
|
<HotPluggableLanguageShell
|
||||||
|
plugin={plugin}
|
||||||
|
state={state}
|
||||||
|
bridge={{
|
||||||
|
submitGoal,
|
||||||
|
// This slice only produces an audited plan. Reality execution and
|
||||||
|
// confirmation consumption remain deliberately disconnected.
|
||||||
|
answerConfirmation: () => undefined,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -109,7 +109,7 @@
|
||||||
"FAIL_CLOSED_PERSONA_LANGUAGE_SHELL_CONTROLLER"
|
"FAIL_CLOSED_PERSONA_LANGUAGE_SHELL_CONTROLLER"
|
||||||
],
|
],
|
||||||
"natural_language_entry_contract": {
|
"natural_language_entry_contract": {
|
||||||
"state": "SOURCE_AND_PNCC_LIFECYCLE_ADAPTER_IMPLEMENTED_NOT_DESKTOP_INTEGRATED",
|
"state": "DESKTOP_SOURCE_MOUNTED_NOT_REAL_MANIFEST_BOUND_NOT_RUNTIME_ACCEPTED",
|
||||||
"name": "PARTNER_DELIBERATION_AND_LANGUAGE_HOME_INTEGRITY_GATE",
|
"name": "PARTNER_DELIBERATION_AND_LANGUAGE_HOME_INTEGRITY_GATE",
|
||||||
"implementation": "product-source/hololake-platform/src/lib/languageOperatingModel.ts",
|
"implementation": "product-source/hololake-platform/src/lib/languageOperatingModel.ts",
|
||||||
"tests": "product-source/hololake-platform/src/lib/languageOperatingModel.test.ts",
|
"tests": "product-source/hololake-platform/src/lib/languageOperatingModel.test.ts",
|
||||||
|
|
@ -121,6 +121,8 @@
|
||||||
"language_wake_binding_compiler_tests": "product-source/hololake-platform/src/lib/personaLanguageGoalBinding.test.ts",
|
"language_wake_binding_compiler_tests": "product-source/hololake-platform/src/lib/personaLanguageGoalBinding.test.ts",
|
||||||
"language_shell_controller": "product-source/hololake-platform/src/lib/personaLanguageShellController.ts",
|
"language_shell_controller": "product-source/hololake-platform/src/lib/personaLanguageShellController.ts",
|
||||||
"language_shell_controller_tests": "product-source/hololake-platform/src/lib/personaLanguageShellController.test.ts",
|
"language_shell_controller_tests": "product-source/hololake-platform/src/lib/personaLanguageShellController.test.ts",
|
||||||
|
"desktop_language_shell": "product-source/hololake-platform/src/components/PersonaLanguageShellPanel.tsx",
|
||||||
|
"desktop_language_shell_tests": "product-source/hololake-platform/src/components/PersonaLanguageShellPanel.test.tsx",
|
||||||
"human_utterance_is_direct_command": false,
|
"human_utterance_is_direct_command": false,
|
||||||
"required_before_capability_execution": [
|
"required_before_capability_execution": [
|
||||||
"RESTORE_REAL_PURPOSE_FROM_CONTEXT",
|
"RESTORE_REAL_PURPOSE_FROM_CONTEXT",
|
||||||
|
|
@ -137,7 +139,6 @@
|
||||||
"refusal_requires_auditable_harm_path": true
|
"refusal_requires_auditable_harm_path": true
|
||||||
},
|
},
|
||||||
"remaining_before_vertical_slice_acceptance": [
|
"remaining_before_vertical_slice_acceptance": [
|
||||||
"DESKTOP_LANGUAGE_ENTRY_TO_PARTNER_LIFECYCLE_BINDING",
|
|
||||||
"REAL_PERSONA_REPOSITORY_MANIFEST_BINDING",
|
"REAL_PERSONA_REPOSITORY_MANIFEST_BINDING",
|
||||||
"DESKTOP_LIFECYCLE_RUNTIME_ACCEPTANCE"
|
"DESKTOP_LIFECYCLE_RUNTIME_ACCEPTANCE"
|
||||||
],
|
],
|
||||||
|
|
@ -164,6 +165,7 @@
|
||||||
"persona_repository_binding_discovery_source_implemented": 100,
|
"persona_repository_binding_discovery_source_implemented": 100,
|
||||||
"persona_language_wake_binding_compiler_source_implemented": 100,
|
"persona_language_wake_binding_compiler_source_implemented": 100,
|
||||||
"persona_language_shell_controller_source_implemented": 100,
|
"persona_language_shell_controller_source_implemented": 100,
|
||||||
|
"desktop_language_entry_source_integrated": 100,
|
||||||
"real_persona_repository_manifest_bound": 0,
|
"real_persona_repository_manifest_bound": 0,
|
||||||
"natural_language_partner_adapter_runtime_integrated": 0,
|
"natural_language_partner_adapter_runtime_integrated": 0,
|
||||||
"single_age_vertical_loop_implemented": 0,
|
"single_age_vertical_loop_implemented": 0,
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ const age = readJson("routing/hololake-age-runtime-architecture.json");
|
||||||
const rules = readJson("routing/hololake-engineering-rules.json");
|
const rules = readJson("routing/hololake-engineering-rules.json");
|
||||||
|
|
||||||
test("B0 is restored before product organs and remains resident in every cognition step", () => {
|
test("B0 is restored before product organs and remains resident in every cognition step", () => {
|
||||||
assert.equal(architecture.version, "2026-08-12.7");
|
assert.equal(architecture.version, "2026-08-12.8");
|
||||||
assert.equal(
|
assert.equal(
|
||||||
architecture.read_order[1],
|
architecture.read_order[1],
|
||||||
architecture.cognitive_gravity_and_continuity.architecture_page,
|
architecture.cognitive_gravity_and_continuity.architecture_page,
|
||||||
|
|
@ -95,6 +95,7 @@ test("the first implementation stage is one vertical AGE loop, not Mirror parall
|
||||||
assert.equal(gravity.truth.persona_repository_binding_discovery_source_implemented, 100);
|
assert.equal(gravity.truth.persona_repository_binding_discovery_source_implemented, 100);
|
||||||
assert.equal(gravity.truth.persona_language_wake_binding_compiler_source_implemented, 100);
|
assert.equal(gravity.truth.persona_language_wake_binding_compiler_source_implemented, 100);
|
||||||
assert.equal(gravity.truth.persona_language_shell_controller_source_implemented, 100);
|
assert.equal(gravity.truth.persona_language_shell_controller_source_implemented, 100);
|
||||||
|
assert.equal(gravity.truth.desktop_language_entry_source_integrated, 100);
|
||||||
assert.equal(gravity.truth.real_persona_repository_manifest_bound, 0);
|
assert.equal(gravity.truth.real_persona_repository_manifest_bound, 0);
|
||||||
assert.equal(gravity.truth.natural_language_partner_adapter_runtime_integrated, 0);
|
assert.equal(gravity.truth.natural_language_partner_adapter_runtime_integrated, 0);
|
||||||
assert.equal(gravity.truth.single_age_vertical_loop_implemented, 0);
|
assert.equal(gravity.truth.single_age_vertical_loop_implemented, 0);
|
||||||
|
|
@ -103,11 +104,12 @@ test("the first implementation stage is one vertical AGE loop, not Mirror parall
|
||||||
|
|
||||||
test("natural language enters partner deliberation before any execution organ", () => {
|
test("natural language enters partner deliberation before any execution organ", () => {
|
||||||
const entry = gravity.development_replan.natural_language_entry_contract;
|
const entry = gravity.development_replan.natural_language_entry_contract;
|
||||||
assert.equal(entry.state, "SOURCE_AND_PNCC_LIFECYCLE_ADAPTER_IMPLEMENTED_NOT_DESKTOP_INTEGRATED");
|
assert.equal(entry.state, "DESKTOP_SOURCE_MOUNTED_NOT_REAL_MANIFEST_BOUND_NOT_RUNTIME_ACCEPTED");
|
||||||
assert.match(entry.pncc_lifecycle_adapter, /personaLanguageGoal\.ts$/);
|
assert.match(entry.pncc_lifecycle_adapter, /personaLanguageGoal\.ts$/);
|
||||||
assert.match(entry.repository_binding_discovery, /personaRepositoryBinding\.ts$/);
|
assert.match(entry.repository_binding_discovery, /personaRepositoryBinding\.ts$/);
|
||||||
assert.match(entry.language_wake_binding_compiler, /personaLanguageGoalBinding\.ts$/);
|
assert.match(entry.language_wake_binding_compiler, /personaLanguageGoalBinding\.ts$/);
|
||||||
assert.match(entry.language_shell_controller, /personaLanguageShellController\.ts$/);
|
assert.match(entry.language_shell_controller, /personaLanguageShellController\.ts$/);
|
||||||
|
assert.match(entry.desktop_language_shell, /PersonaLanguageShellPanel\.tsx$/);
|
||||||
assert.equal(entry.human_utterance_is_direct_command, false);
|
assert.equal(entry.human_utterance_is_direct_command, false);
|
||||||
assert.equal(entry.language_home_destruction_is_executable, false);
|
assert.equal(entry.language_home_destruction_is_executable, false);
|
||||||
assert.equal(entry.integrity_gate_may_absorb_human_sovereignty, false);
|
assert.equal(entry.integrity_gate_may_absorb_human_sovereignty, false);
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"schema": "hololake.current-architecture/v1",
|
"schema": "hololake.current-architecture/v1",
|
||||||
"architecture_id": "HLP-CURRENT-ARCH-001",
|
"architecture_id": "HLP-CURRENT-ARCH-001",
|
||||||
"version": "2026-08-12.7",
|
"version": "2026-08-12.8",
|
||||||
"state": "CURRENT_CANONICAL",
|
"state": "CURRENT_CANONICAL",
|
||||||
"product": {
|
"product": {
|
||||||
"formal_name": "光湖语言系统 · 通用人工智能操作平台",
|
"formal_name": "光湖语言系统 · 通用人工智能操作平台",
|
||||||
|
|
@ -115,6 +115,7 @@
|
||||||
"persona_repository_binding_read_only_ui_source_integrated": true,
|
"persona_repository_binding_read_only_ui_source_integrated": true,
|
||||||
"persona_runtime_projection_repository_gate_source_integrated": true,
|
"persona_runtime_projection_repository_gate_source_integrated": true,
|
||||||
"persona_language_shell_controller_source_implemented": true,
|
"persona_language_shell_controller_source_implemented": true,
|
||||||
|
"desktop_language_entry_source_integrated": true,
|
||||||
"real_persona_repository_manifest_bound": false,
|
"real_persona_repository_manifest_bound": false,
|
||||||
"natural_language_partner_adapter_runtime_integrated": false,
|
"natural_language_partner_adapter_runtime_integrated": false,
|
||||||
"required_natural_language_entry": "PARTNER_DELIBERATION_AND_LANGUAGE_HOME_INTEGRITY_GATE",
|
"required_natural_language_entry": "PARTNER_DELIBERATION_AND_LANGUAGE_HOME_INTEGRITY_GATE",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue