feat: project verified PNCC runtime into HoloLake
This commit is contained in:
parent
1b55f3407a
commit
0c80296593
33 changed files with 1265 additions and 24 deletions
|
|
@ -0,0 +1,60 @@
|
|||
{
|
||||
"schema": "hololake.pncc-human-projection-receipt/v1",
|
||||
"receipt_id": "HLP-PNCC-HUMAN-PROJECTION-001-20260811",
|
||||
"development_id": "DEV-20260811-003",
|
||||
"repository_id": "REPO-014",
|
||||
"branch": "main",
|
||||
"baseline_before_development": "1b55f3407a81112f99951aa198e4db56d0c07a7d",
|
||||
"source_commit": "SELF",
|
||||
"architecture_anchor": "HLP-CURRENT-ARCH-001@2026-08-10.14",
|
||||
"product_effect": {
|
||||
"first_core": "GH-PNCC",
|
||||
"persona_id": "ICE-P-ZY001",
|
||||
"surface": "FIFTH_DOMAIN_ETERNAL_LAKE_INSPECTOR",
|
||||
"truth_source": "query_persona_code_channel_runtime",
|
||||
"repository_candidates": "CURRENTLY_MOUNTED_HOLOLAKE_GIT_REPOSITORIES",
|
||||
"new_truth_store_created": false,
|
||||
"wake_action_added": false,
|
||||
"inference_action_added": false,
|
||||
"lease_action_added": false,
|
||||
"execution_action_added": false
|
||||
},
|
||||
"projection_contract": {
|
||||
"human_state_and_raw_state_are_both_visible": true,
|
||||
"git_head_visible": true,
|
||||
"event_chain_head_visible": true,
|
||||
"runtime_node_visible": true,
|
||||
"active_organ_visible": true,
|
||||
"human_responsibility_subject_visible": true,
|
||||
"empty_match_does_not_claim_offline": true,
|
||||
"malformed_or_mismatched_receipt_fails_closed": true,
|
||||
"partial_repository_failures_remain_visible": true
|
||||
},
|
||||
"verification": {
|
||||
"native_authority": "PASS_100",
|
||||
"frontend_focused_tests": "PASS_31_OF_31",
|
||||
"frontend_full_suite": "PASS_5015_OF_5015",
|
||||
"rust_unit_tests": "PASS_1200_OF_1200_WITH_2_DESIGN_IGNORES",
|
||||
"rust_integration_tests": "PASS_1_OF_1",
|
||||
"native_core_tests": "PASS_15_OF_15",
|
||||
"native_core_line_coverage": "PASS_100_PERCENT",
|
||||
"eslint": "PASS_100",
|
||||
"typescript": "PASS_100",
|
||||
"locale_catalog_validation": "PASS_21_CATALOGS_1160_KEYS",
|
||||
"production_build": "PASS_100",
|
||||
"git_diff_check": "PASS_100"
|
||||
},
|
||||
"localization_note": {
|
||||
"automated_translation": "NOT_RUN_LARA_CREDENTIALS_UNAVAILABLE",
|
||||
"zh_cn": "HUMAN_TRANSLATED",
|
||||
"other_catalogs": "VALIDATED_ENGLISH_FALLBACK"
|
||||
},
|
||||
"boundary": {
|
||||
"desktop_artifact_rebuilt": false,
|
||||
"desktop_installed": false,
|
||||
"server_deployed": false,
|
||||
"server_runtime_changed": false,
|
||||
"publication_requires_finalizer_remote_readback": true
|
||||
},
|
||||
"state": "READY_FOR_PUBLICATION"
|
||||
}
|
||||
|
|
@ -122,8 +122,14 @@ current lifecycle receipt after repository drift.
|
|||
`PersonaRuntimeQueryReceipt` is a bounded projection of the durable runtime files, not another truth store.
|
||||
It filters by the caller's expected persona and canonical repository, validates each matching event chain,
|
||||
and returns at most 100 newest session summaries. Dormant sessions expose no active organ. The receipt keeps
|
||||
the event-chain head and human/persona attribution so a future renderer can link a summary back to the same
|
||||
machine evidence rather than trusting display state.
|
||||
the event-chain head and human/persona attribution. `loadPersonaRuntimeProjection` supplies only the exact
|
||||
persona id and HoloLake's mounted Git repository paths to that native query, rejects a mismatched schema,
|
||||
persona, repository, count, or required evidence field, and aggregates successful receipts without hiding
|
||||
per-repository failures. `PersonaRuntimeProjectionPanel` renders the newest verified session inside the
|
||||
Fifth Domain Eternal Lake inspector. Human labels such as dormant or inferencing remain beside the raw native
|
||||
state, Git head, event-chain head, node, active organ, timestamp, and human responsibility subject. An empty
|
||||
match explicitly does not mean offline. The panel is read-only and cannot wake a persona, invoke an organ, or
|
||||
acquire a lease.
|
||||
|
||||
## PersonaRemoteGitObjectChannel
|
||||
|
||||
|
|
@ -1202,6 +1208,9 @@ Managed by `useSettings` hook and `SettingsPanel` component. `theme_mode` is ins
|
|||
- **AI feature visibility** — `ai_features_visibility_changed` records only whether installation-level AI surfaces were enabled or hidden.
|
||||
- **Automatic update checks** — `automatic_update_checks_changed` records only whether startup/background update checks were enabled or disabled.
|
||||
- **All Notes visibility** — `all_notes_visibility_changed` records only the toggled category and enabled state.
|
||||
- **Persona runtime projection** — `persona_runtime_projection_loaded` and `persona_runtime_projection_retry`
|
||||
record only coarse phase and count fields. Repository paths, persona session ids, event hashes, and runtime
|
||||
attribution are never sent.
|
||||
|
||||
### Tauri Commands
|
||||
- **`reinit_telemetry`** — Re-reads settings and toggles Rust Sentry on/off. Called from frontend when user changes crash reporting setting.
|
||||
|
|
|
|||
|
|
@ -104,6 +104,14 @@ event, and returns lifecycle state, Git head, node/model instance, active organ,
|
|||
structured attribution. It does not copy facts into a second database, expose hidden reasoning, acquire a
|
||||
lease, or start inference. A corrupted matching journal fails the query closed.
|
||||
|
||||
The HoloLake renderer now provides the first human-readable GH-PNCC projection without introducing another
|
||||
runtime source. `App` passes only its already mounted Git repository paths into `HoloLakeHome`; the Eternal
|
||||
Lake inspector queries each path for `ICE-P-ZY001` through the native read model. The renderer validates the
|
||||
receipt identity and required evidence, preserves partial query errors, and displays the newest verified
|
||||
session with both a human state label and the raw state, Git and event-chain heads, node, organ, timestamp,
|
||||
and human responsibility subject. No matching session is reported as absence of matching evidence, never as
|
||||
proof that the persona is offline. This surface contains no wake, inference, lease, or execution control.
|
||||
|
||||
`read_persona_remote_git_object` is the non-UI remote object channel used when the persona needs one current
|
||||
Git-backed fact without materializing another repository checkout. It accepts credential-free HTTPS remotes,
|
||||
requires Git protocol v2 partial-object filtering, stores only a bounded bare `blob:none` object cache, and
|
||||
|
|
|
|||
|
|
@ -1530,6 +1530,7 @@ body.mac-chrome .hololake-bar { padding-left: 92px; }
|
|||
.fifth-system-inspector {
|
||||
display: flex;
|
||||
min-width: 0;
|
||||
overflow-y: auto;
|
||||
flex-direction: column;
|
||||
gap: 22px;
|
||||
padding: 28px 24px 20px;
|
||||
|
|
@ -1587,6 +1588,36 @@ body.mac-chrome .hololake-bar { padding-left: 92px; }
|
|||
.fifth-system-inspector__overview h2 { margin: 0; font: 500 20px/1.25 "Songti SC", "STSong", serif; }
|
||||
.fifth-system-inspector__overview p { margin: 0; color: var(--world-muted); font-size: 12px; line-height: 1.7; }
|
||||
.fifth-system-inspector footer { margin-top: auto; color: var(--world-faint); font-size: 11px; line-height: 1.6; }
|
||||
.persona-runtime-projection {
|
||||
display: grid;
|
||||
gap: 14px;
|
||||
padding: 16px;
|
||||
border: 1px solid var(--world-border);
|
||||
border-radius: 12px;
|
||||
background: color-mix(in srgb, var(--world-surface) 82%, transparent);
|
||||
}
|
||||
.persona-runtime-projection > header { display: grid; gap: 9px; padding: 0 0 13px; }
|
||||
.persona-runtime-projection > header > div { display: grid; gap: 5px; }
|
||||
.persona-runtime-projection > header span { color: var(--world-accent); font: 9px/1.2 ui-monospace, SFMono-Regular, Menlo, monospace; letter-spacing: .12em; }
|
||||
.persona-runtime-projection > header h3 { margin: 0; font-size: 16px; }
|
||||
.persona-runtime-projection > header p { margin: 0; color: var(--world-muted); font-size: 11px; line-height: 1.55; }
|
||||
.persona-runtime-projection > header > small { color: var(--world-faint); font-size: 10px; }
|
||||
.persona-runtime-projection__message { display: grid; gap: 8px; color: var(--world-muted); font-size: 12px; line-height: 1.55; }
|
||||
.persona-runtime-projection__message p { margin: 0; }
|
||||
.persona-runtime-projection__message i { width: 7px; height: 7px; border-radius: 50%; background: var(--world-live); box-shadow: 0 0 8px var(--world-live); }
|
||||
.persona-runtime-projection__message--error { color: var(--destructive); }
|
||||
.persona-runtime-projection__message--error code { overflow: hidden; color: var(--world-faint); font-size: 10px; text-overflow: ellipsis; }
|
||||
.persona-runtime-session { display: grid; gap: 12px; }
|
||||
.persona-runtime-session > header { display: flex; align-items: start; justify-content: space-between; gap: 10px; }
|
||||
.persona-runtime-session > header div { display: grid; gap: 4px; }
|
||||
.persona-runtime-session > header span { color: var(--world-live); font-size: 15px; font-weight: 650; }
|
||||
.persona-runtime-session > header code,
|
||||
.persona-runtime-session > header small { color: var(--world-faint); font-size: 9px; }
|
||||
.persona-runtime-session dl div { grid-template-columns: 92px minmax(0, 1fr); padding: 8px 0; }
|
||||
.persona-runtime-session dd code { display: block; overflow: hidden; color: var(--world-muted); text-overflow: ellipsis; }
|
||||
.persona-runtime-session > footer { display: flex; justify-content: space-between; gap: 12px; margin: 0; }
|
||||
.persona-runtime-session > footer code,
|
||||
.persona-runtime-session > footer span { overflow: hidden; color: var(--world-faint); font-size: 9px; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.pufferfish-boundaries {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||
|
|
|
|||
|
|
@ -1712,7 +1712,7 @@ function MainApp({
|
|||
</>
|
||||
)}
|
||||
<div className={`app__editor${aiActivity.highlightElement === 'editor' || aiActivity.highlightElement === 'tab' ? ' ai-highlight' : ''}`}>
|
||||
{showHoloLakeHome && !isTeamDistribution ? <HoloLakeHome locale={appLocale} livingSystemTarget={aiFeaturesEnabled && quickPromptTargetReady && quickPromptTarget.kind === 'api_model' ? quickPromptTarget : null} onEnterKnowledgeBase={() => setShowHoloLakeHome(false)} onOpenAiWorkspace={openAIChat} onOpenLocalWorkspace={async () => {
|
||||
{showHoloLakeHome && !isTeamDistribution ? <HoloLakeHome locale={appLocale} repositoryPaths={activeGitRepositoryPaths} livingSystemTarget={aiFeaturesEnabled && quickPromptTargetReady && quickPromptTarget.kind === 'api_model' ? quickPromptTarget : null} onEnterKnowledgeBase={() => setShowHoloLakeHome(false)} onOpenAiWorkspace={openAIChat} onOpenLocalWorkspace={async () => {
|
||||
await vaultSwitcher.handleOpenLocalFolder()
|
||||
setShowHoloLakeHome(false)
|
||||
}} /> : <Editor
|
||||
|
|
|
|||
|
|
@ -1,12 +1,16 @@
|
|||
import { useState } from 'react'
|
||||
import type { AppLocale } from '../lib/i18n'
|
||||
import { Button } from './ui/button'
|
||||
import { PersonaRuntimeProjectionPanel } from './PersonaRuntimeProjectionPanel'
|
||||
|
||||
type FifthDomainSystemId = 'pufferfish' | 'eternal-lake-heart'
|
||||
|
||||
type FifthDomainSystemsProps = {
|
||||
detail?: 'overview' | 'pufferfish'
|
||||
locale: AppLocale
|
||||
onEnterEternalLake: () => void
|
||||
onEnterPufferfish: () => void
|
||||
repositoryPaths: readonly string[]
|
||||
}
|
||||
|
||||
const PUFFERFISH_FACTS = {
|
||||
|
|
@ -18,8 +22,10 @@ const PUFFERFISH_FACTS = {
|
|||
|
||||
export function FifthDomainSystems({
|
||||
detail = 'overview',
|
||||
locale,
|
||||
onEnterEternalLake,
|
||||
onEnterPufferfish,
|
||||
repositoryPaths,
|
||||
}: FifthDomainSystemsProps) {
|
||||
const [selected, setSelected] = useState<FifthDomainSystemId | null>(
|
||||
detail === 'pufferfish' ? 'pufferfish' : null,
|
||||
|
|
@ -142,6 +148,11 @@ export function FifthDomainSystems({
|
|||
<div><dt>系统归属</dt><dd>冰朔个人系统</dd></div>
|
||||
<div><dt>下一频道</dt><dd>心跳核心频道</dd></div>
|
||||
</dl>
|
||||
<PersonaRuntimeProjectionPanel
|
||||
locale={locale}
|
||||
personaId="ICE-P-ZY001"
|
||||
repositoryPaths={repositoryPaths}
|
||||
/>
|
||||
<Button onClick={onEnterEternalLake}>进入永恒湖心系统</Button>
|
||||
</>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ type HoloLakeHomeProps = {
|
|||
onOpenAiWorkspace?: () => void
|
||||
onOpenLocalWorkspace?: () => void | Promise<void>
|
||||
livingSystemTarget?: AiModelTarget | null
|
||||
repositoryPaths?: readonly string[]
|
||||
}
|
||||
|
||||
type ChannelRoute = GuanghuChannelRoute
|
||||
|
|
@ -90,6 +91,7 @@ export function HoloLakeHome({
|
|||
onOpenAiWorkspace,
|
||||
onOpenLocalWorkspace,
|
||||
livingSystemTarget,
|
||||
repositoryPaths = [],
|
||||
}: HoloLakeHomeProps) {
|
||||
const initialRoute: ChannelRoute = isEducationWorkLakePath(window.location.pathname)
|
||||
? 'education-work-lake'
|
||||
|
|
@ -361,8 +363,10 @@ export function HoloLakeHome({
|
|||
if (route === 'fifth-domain') {
|
||||
return (
|
||||
<FifthDomainSystems
|
||||
locale={locale}
|
||||
onEnterEternalLake={() => navigate('eternal-lake-heart')}
|
||||
onEnterPufferfish={() => navigate('pufferfish')}
|
||||
repositoryPaths={repositoryPaths}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
|
@ -371,8 +375,10 @@ export function HoloLakeHome({
|
|||
return (
|
||||
<FifthDomainSystems
|
||||
detail="pufferfish"
|
||||
locale={locale}
|
||||
onEnterEternalLake={() => navigate('eternal-lake-heart')}
|
||||
onEnterPufferfish={() => navigate('pufferfish')}
|
||||
repositoryPaths={repositoryPaths}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,120 @@
|
|||
import { fireEvent, render, screen, waitFor } from '@testing-library/react'
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
import { PersonaRuntimeProjectionPanel } from './PersonaRuntimeProjectionPanel'
|
||||
|
||||
const { loadPersonaRuntimeProjectionMock, trackEventMock } = vi.hoisted(() => ({
|
||||
loadPersonaRuntimeProjectionMock: vi.fn(),
|
||||
trackEventMock: vi.fn(),
|
||||
}))
|
||||
|
||||
vi.mock('../lib/personaRuntimeProjection', () => ({
|
||||
loadPersonaRuntimeProjection: loadPersonaRuntimeProjectionMock,
|
||||
}))
|
||||
vi.mock('../lib/telemetry', () => ({ trackEvent: trackEventMock }))
|
||||
|
||||
describe('PersonaRuntimeProjectionPanel', () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks()
|
||||
loadPersonaRuntimeProjectionMock.mockResolvedValue({
|
||||
errors: [],
|
||||
inspectedRepositoryCount: 1,
|
||||
phase: 'verified',
|
||||
sessions: [{
|
||||
sessionId: 'PNCC-VERIFIED',
|
||||
state: 'DORMANT',
|
||||
gitHead: '1111111111111111111111111111111111111111',
|
||||
nodeId: 'JD-FD-PRIMARY',
|
||||
modelInstanceId: 'gpt-5-runtime-001',
|
||||
activeOrgan: null,
|
||||
eventCount: 8,
|
||||
firstEventAt: '2026-08-11T01:00:00.000Z',
|
||||
lastEventAt: '2026-08-11T02:00:00.000Z',
|
||||
lastEvent: 'DORMANT',
|
||||
eventChainHead: 'event-chain-verified',
|
||||
repositoryPath: '/repo/persona',
|
||||
observedGitHead: '1111111111111111111111111111111111111111',
|
||||
repositoryClean: true,
|
||||
attribution: {
|
||||
humanResponsibilitySubject: 'BINGSHUO',
|
||||
personaCognitiveAuthor: 'ICE-P-ZY001',
|
||||
executionRuntime: 'ZY-TCS-BRAIN-RUNTIME-0001',
|
||||
developmentId: 'DEV-20260811-003',
|
||||
authorizationScope: 'LOCAL_READ_ONLY',
|
||||
sourceLanguageAnchor: 'HLP-CURRENT-ARCH-001@2026-08-10.14',
|
||||
},
|
||||
}],
|
||||
})
|
||||
})
|
||||
|
||||
it('renders a human-readable state while keeping the native evidence visible', async () => {
|
||||
render(
|
||||
<PersonaRuntimeProjectionPanel
|
||||
locale="zh-CN"
|
||||
personaId="ICE-P-ZY001"
|
||||
repositoryPaths={['/repo/persona']}
|
||||
/>,
|
||||
)
|
||||
|
||||
expect(screen.getByText('正在核验原生运行回执…')).toBeInTheDocument()
|
||||
await waitFor(() => expect(screen.getByText('已归寝')).toBeInTheDocument())
|
||||
expect(screen.getAllByText('DORMANT')).not.toHaveLength(0)
|
||||
expect(screen.getByText('JD-FD-PRIMARY')).toBeInTheDocument()
|
||||
expect(screen.getByText('event-chain-verified')).toBeInTheDocument()
|
||||
expect(screen.getByText('1111111111111111111111111111111111111111')).toBeInTheDocument()
|
||||
expect(trackEventMock).toHaveBeenCalledWith('persona_runtime_projection_loaded', {
|
||||
error_count: 0,
|
||||
inspected_repository_count: 1,
|
||||
phase: 'verified',
|
||||
session_count: 1,
|
||||
})
|
||||
})
|
||||
|
||||
it('states that no runtime was found instead of claiming the persona is offline', async () => {
|
||||
loadPersonaRuntimeProjectionMock.mockResolvedValue({
|
||||
errors: [],
|
||||
inspectedRepositoryCount: 1,
|
||||
phase: 'verified',
|
||||
sessions: [],
|
||||
})
|
||||
|
||||
render(
|
||||
<PersonaRuntimeProjectionPanel
|
||||
locale="zh-CN"
|
||||
personaId="ICE-P-ZY001"
|
||||
repositoryPaths={['/repo/persona']}
|
||||
/>,
|
||||
)
|
||||
|
||||
await waitFor(() => expect(screen.getByText('未发现可核验会话')).toBeInTheDocument())
|
||||
expect(screen.getByText('这不等于人格离线;当前挂载仓库中没有匹配的原生事件链。')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('can retry a failed read without requesting an execution action', async () => {
|
||||
loadPersonaRuntimeProjectionMock
|
||||
.mockResolvedValueOnce({
|
||||
errors: [{ code: 'PERSONA_RUNTIME_RECEIPT_INVALID', repositoryPath: '/repo/persona' }],
|
||||
inspectedRepositoryCount: 0,
|
||||
phase: 'error',
|
||||
sessions: [],
|
||||
})
|
||||
.mockResolvedValueOnce({
|
||||
errors: [],
|
||||
inspectedRepositoryCount: 1,
|
||||
phase: 'verified',
|
||||
sessions: [],
|
||||
})
|
||||
|
||||
render(
|
||||
<PersonaRuntimeProjectionPanel
|
||||
locale="zh-CN"
|
||||
personaId="ICE-P-ZY001"
|
||||
repositoryPaths={['/repo/persona']}
|
||||
/>,
|
||||
)
|
||||
|
||||
await waitFor(() => expect(screen.getByText('原生回执校验失败')).toBeInTheDocument())
|
||||
fireEvent.click(screen.getByRole('button', { name: '重新核验' }))
|
||||
await waitFor(() => expect(loadPersonaRuntimeProjectionMock).toHaveBeenCalledTimes(2))
|
||||
expect(trackEventMock).toHaveBeenCalledWith('persona_runtime_projection_retry')
|
||||
})
|
||||
})
|
||||
|
|
@ -0,0 +1,156 @@
|
|||
import { useCallback, useEffect, useMemo, useState } from 'react'
|
||||
import { getLocaleDateLocale, translate, type AppLocale, type TranslationKey } from '../lib/i18n'
|
||||
import {
|
||||
loadPersonaRuntimeProjection,
|
||||
type PersonaRuntimeProjection,
|
||||
type PersonaRuntimeSessionProjection,
|
||||
} from '../lib/personaRuntimeProjection'
|
||||
import { trackEvent } from '../lib/telemetry'
|
||||
import { Button } from './ui/button'
|
||||
|
||||
type PersonaRuntimeProjectionPanelProps = {
|
||||
locale: AppLocale
|
||||
personaId: string
|
||||
repositoryPaths: readonly string[]
|
||||
}
|
||||
|
||||
type PanelState = PersonaRuntimeProjection | { phase: 'checking' }
|
||||
|
||||
function stateTranslationKey(state: string): TranslationKey {
|
||||
if (state.startsWith('DORMANT')) return 'hololake.personaRuntime.state.dormant'
|
||||
if (state === 'INFERENCING') return 'hololake.personaRuntime.state.inferencing'
|
||||
if (state === 'BOUND_NOT_INFERENCING') return 'hololake.personaRuntime.state.bound'
|
||||
return 'hololake.personaRuntime.state.observed'
|
||||
}
|
||||
|
||||
function shortHash(value: string): string {
|
||||
return value.length > 12 ? value.slice(0, 12) : value
|
||||
}
|
||||
|
||||
function RuntimeSessionEvidence({
|
||||
locale,
|
||||
session,
|
||||
}: {
|
||||
locale: AppLocale
|
||||
session: PersonaRuntimeSessionProjection
|
||||
}) {
|
||||
const observedAt = new Intl.DateTimeFormat(getLocaleDateLocale(locale), {
|
||||
dateStyle: 'medium',
|
||||
timeStyle: 'short',
|
||||
}).format(new Date(session.lastEventAt))
|
||||
|
||||
return (
|
||||
<article className="persona-runtime-session">
|
||||
<header>
|
||||
<div>
|
||||
<span>{translate(locale, stateTranslationKey(session.state))}</span>
|
||||
<code>{session.state}</code>
|
||||
</div>
|
||||
<small>{translate(locale, 'hololake.personaRuntime.verified')}</small>
|
||||
</header>
|
||||
<dl>
|
||||
<div><dt>{translate(locale, 'hololake.personaRuntime.rawState')}</dt><dd>{session.state}</dd></div>
|
||||
<div><dt>{translate(locale, 'hololake.personaRuntime.lastEvent')}</dt><dd>{session.lastEvent}</dd></div>
|
||||
<div><dt>{translate(locale, 'hololake.personaRuntime.activeOrgan')}</dt><dd>{session.activeOrgan ?? translate(locale, 'hololake.personaRuntime.noActiveOrgan')}</dd></div>
|
||||
<div><dt>{translate(locale, 'hololake.personaRuntime.node')}</dt><dd>{session.nodeId}</dd></div>
|
||||
<div><dt>{translate(locale, 'hololake.personaRuntime.lastObserved')}</dt><dd>{observedAt}</dd></div>
|
||||
<div>
|
||||
<dt>{translate(locale, 'hololake.personaRuntime.gitHead')}</dt>
|
||||
<dd><code title={session.gitHead}>{session.gitHead}</code></dd>
|
||||
</div>
|
||||
<div>
|
||||
<dt>{translate(locale, 'hololake.personaRuntime.eventChain')}</dt>
|
||||
<dd><code title={session.eventChainHead}>{session.eventChainHead}</code></dd>
|
||||
</div>
|
||||
<div>
|
||||
<dt>{translate(locale, 'hololake.personaRuntime.attribution')}</dt>
|
||||
<dd>{session.attribution.humanResponsibilitySubject}</dd>
|
||||
</div>
|
||||
</dl>
|
||||
<footer>
|
||||
<code>{session.sessionId}</code>
|
||||
<span>{shortHash(session.observedGitHead)}</span>
|
||||
</footer>
|
||||
</article>
|
||||
)
|
||||
}
|
||||
|
||||
export function PersonaRuntimeProjectionPanel({
|
||||
locale,
|
||||
personaId,
|
||||
repositoryPaths,
|
||||
}: PersonaRuntimeProjectionPanelProps) {
|
||||
const [state, setState] = useState<PanelState>({ phase: 'checking' })
|
||||
const [requestSequence, setRequestSequence] = useState(0)
|
||||
const repositorySignature = useMemo(() => repositoryPaths.join('\u0000'), [repositoryPaths])
|
||||
|
||||
const refresh = useCallback(() => {
|
||||
trackEvent('persona_runtime_projection_retry')
|
||||
setState({ phase: 'checking' })
|
||||
setRequestSequence((current) => current + 1)
|
||||
}, [])
|
||||
|
||||
useEffect(() => {
|
||||
let active = true
|
||||
void loadPersonaRuntimeProjection({
|
||||
personaId,
|
||||
repositoryPaths: repositorySignature ? repositorySignature.split('\u0000') : [],
|
||||
}).then((projection) => {
|
||||
if (!active) return
|
||||
setState(projection)
|
||||
trackEvent('persona_runtime_projection_loaded', {
|
||||
error_count: projection.errors.length,
|
||||
inspected_repository_count: projection.inspectedRepositoryCount,
|
||||
phase: projection.phase,
|
||||
session_count: projection.sessions.length,
|
||||
})
|
||||
})
|
||||
return () => {
|
||||
active = false
|
||||
}
|
||||
}, [personaId, repositorySignature, requestSequence])
|
||||
|
||||
const latestSession = state.phase === 'verified' ? state.sessions[0] : undefined
|
||||
|
||||
return (
|
||||
<section className="persona-runtime-projection" aria-labelledby="persona-runtime-title">
|
||||
<header>
|
||||
<div>
|
||||
<span>GH-PNCC · {personaId}</span>
|
||||
<h3 id="persona-runtime-title">{translate(locale, 'hololake.personaRuntime.title')}</h3>
|
||||
<p>{translate(locale, 'hololake.personaRuntime.description')}</p>
|
||||
</div>
|
||||
<small>{translate(locale, 'hololake.personaRuntime.readOnly')}</small>
|
||||
</header>
|
||||
|
||||
{state.phase === 'checking' ? (
|
||||
<div className="persona-runtime-projection__message" aria-live="polite">
|
||||
<i />{translate(locale, 'hololake.personaRuntime.checking')}
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
{state.phase === 'unavailable' ? (
|
||||
<div className="persona-runtime-projection__message">
|
||||
{translate(locale, 'hololake.personaRuntime.unavailable')}
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
{state.phase === 'error' ? (
|
||||
<div className="persona-runtime-projection__message persona-runtime-projection__message--error" role="alert">
|
||||
<strong>{translate(locale, 'hololake.personaRuntime.error')}</strong>
|
||||
<code>{state.errors[0]?.code}</code>
|
||||
<Button variant="outline" onClick={refresh}>{translate(locale, 'hololake.personaRuntime.retry')}</Button>
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
{state.phase === 'verified' && !latestSession ? (
|
||||
<div className="persona-runtime-projection__message">
|
||||
<strong>{translate(locale, 'hololake.personaRuntime.empty')}</strong>
|
||||
<p>{translate(locale, 'hololake.personaRuntime.emptyDescription')}</p>
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
{latestSession ? <RuntimeSessionEvidence locale={locale} session={latestSession} /> : null}
|
||||
</section>
|
||||
)
|
||||
}
|
||||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"hololake.router.repositories.source": "HoloLake source",
|
||||
"hololake.router.repositories.architecture": "Local system architecture",
|
||||
"hololake.router.repositories.probe": "Inspect mapping",
|
||||
"hololake.router.repositories.upload": "Request upload"
|
||||
"hololake.router.repositories.upload": "Request upload",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"hololake.router.repositories.source": "HoloLake 源码",
|
||||
"hololake.router.repositories.architecture": "本地系统架构",
|
||||
"hololake.router.repositories.probe": "检测映射",
|
||||
"hololake.router.repositories.upload": "申请上传"
|
||||
"hololake.router.repositories.upload": "申请上传",
|
||||
"hololake.personaRuntime.title": "人格运行投影",
|
||||
"hololake.personaRuntime.description": "把经过核验的 GH-PNCC 原生事件链投影为人类可读状态。",
|
||||
"hololake.personaRuntime.checking": "正在核验原生运行回执…",
|
||||
"hololake.personaRuntime.verified": "已核验的原生回执",
|
||||
"hololake.personaRuntime.unavailable": "未挂载可核验 Git 仓库",
|
||||
"hololake.personaRuntime.empty": "未发现可核验会话",
|
||||
"hololake.personaRuntime.emptyDescription": "这不等于人格离线;当前挂载仓库中没有匹配的原生事件链。",
|
||||
"hololake.personaRuntime.error": "原生回执校验失败",
|
||||
"hololake.personaRuntime.retry": "重新核验",
|
||||
"hololake.personaRuntime.state.dormant": "已归寝",
|
||||
"hololake.personaRuntime.state.inferencing": "正在推理",
|
||||
"hololake.personaRuntime.state.bound": "已绑定,未推理",
|
||||
"hololake.personaRuntime.state.observed": "已核验状态",
|
||||
"hololake.personaRuntime.rawState": "原生状态",
|
||||
"hololake.personaRuntime.lastEvent": "最近事件",
|
||||
"hololake.personaRuntime.activeOrgan": "活动器官",
|
||||
"hololake.personaRuntime.noActiveOrgan": "无活动器官",
|
||||
"hololake.personaRuntime.node": "运行节点",
|
||||
"hololake.personaRuntime.lastObserved": "最近观测",
|
||||
"hololake.personaRuntime.gitHead": "Git 证据",
|
||||
"hololake.personaRuntime.eventChain": "事件链头",
|
||||
"hololake.personaRuntime.attribution": "人类责任主体",
|
||||
"hololake.personaRuntime.readOnly": "只读投影 · 不触发执行动作"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1135,5 +1135,28 @@
|
|||
"education.chart": "Chart",
|
||||
"education.dashboard": "Dashboard",
|
||||
"education.knowledge": "Knowledge",
|
||||
"education.documentLabel": "Education document content"
|
||||
"education.documentLabel": "Education document content",
|
||||
"hololake.personaRuntime.title": "Persona runtime projection",
|
||||
"hololake.personaRuntime.description": "A read-only human projection of verified GH-PNCC native event chains.",
|
||||
"hololake.personaRuntime.checking": "Verifying native runtime receipts…",
|
||||
"hololake.personaRuntime.verified": "Verified native receipt",
|
||||
"hololake.personaRuntime.unavailable": "No verifiable Git repository is mounted",
|
||||
"hololake.personaRuntime.empty": "No verifiable session found",
|
||||
"hololake.personaRuntime.emptyDescription": "This does not mean the persona is offline; no matching native event chain exists in the currently mounted repositories.",
|
||||
"hololake.personaRuntime.error": "Native receipt verification failed",
|
||||
"hololake.personaRuntime.retry": "Verify again",
|
||||
"hololake.personaRuntime.state.dormant": "Dormant",
|
||||
"hololake.personaRuntime.state.inferencing": "Inferencing",
|
||||
"hololake.personaRuntime.state.bound": "Bound, not inferencing",
|
||||
"hololake.personaRuntime.state.observed": "Verified state",
|
||||
"hololake.personaRuntime.rawState": "Native state",
|
||||
"hololake.personaRuntime.lastEvent": "Last event",
|
||||
"hololake.personaRuntime.activeOrgan": "Active organ",
|
||||
"hololake.personaRuntime.noActiveOrgan": "No active organ",
|
||||
"hololake.personaRuntime.node": "Runtime node",
|
||||
"hololake.personaRuntime.lastObserved": "Last observed",
|
||||
"hololake.personaRuntime.gitHead": "Git evidence",
|
||||
"hololake.personaRuntime.eventChain": "Event chain head",
|
||||
"hololake.personaRuntime.attribution": "Human responsibility",
|
||||
"hololake.personaRuntime.readOnly": "Read-only projection · no execution action"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,134 @@
|
|||
import { describe, expect, it, vi } from 'vitest'
|
||||
import {
|
||||
loadPersonaRuntimeProjection,
|
||||
type PersonaRuntimeQueryReceipt,
|
||||
} from './personaRuntimeProjection'
|
||||
|
||||
const attribution = {
|
||||
humanResponsibilitySubject: 'BINGSHUO',
|
||||
personaCognitiveAuthor: 'ICE-P-ZY001',
|
||||
executionRuntime: 'ZY-TCS-BRAIN-RUNTIME-0001',
|
||||
developmentId: 'DEV-20260811-003',
|
||||
authorizationScope: 'LOCAL_READ_ONLY',
|
||||
sourceLanguageAnchor: 'HLP-CURRENT-ARCH-001@2026-08-10.14',
|
||||
}
|
||||
|
||||
function receipt({
|
||||
repositoryPath,
|
||||
sessions = [],
|
||||
}: {
|
||||
repositoryPath: string
|
||||
sessions?: PersonaRuntimeQueryReceipt['sessions']
|
||||
}): PersonaRuntimeQueryReceipt {
|
||||
return {
|
||||
schema: 'hololake.pncc-runtime-query/v1',
|
||||
personaId: 'ICE-P-ZY001',
|
||||
repositoryPath,
|
||||
observedGitHead: 'a9f4726424b2d772181f9d24c300ae2f2ad4e54a',
|
||||
repositoryClean: true,
|
||||
matchingSessionCount: sessions.length,
|
||||
returnedSessionCount: sessions.length,
|
||||
sessions,
|
||||
}
|
||||
}
|
||||
|
||||
describe('loadPersonaRuntimeProjection', () => {
|
||||
it('does not query or invent a runtime when no mounted repository is available', async () => {
|
||||
const query = vi.fn()
|
||||
|
||||
await expect(loadPersonaRuntimeProjection({
|
||||
personaId: 'ICE-P-ZY001',
|
||||
repositoryPaths: [],
|
||||
query,
|
||||
})).resolves.toEqual({
|
||||
errors: [],
|
||||
inspectedRepositoryCount: 0,
|
||||
phase: 'unavailable',
|
||||
sessions: [],
|
||||
})
|
||||
expect(query).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('sorts verified native sessions without replacing their evidence fields', async () => {
|
||||
const older = {
|
||||
sessionId: 'PNCC-OLDER',
|
||||
state: 'DORMANT',
|
||||
gitHead: '1111111111111111111111111111111111111111',
|
||||
nodeId: 'JD-FD-PRIMARY',
|
||||
modelInstanceId: 'model-old',
|
||||
activeOrgan: null,
|
||||
eventCount: 5,
|
||||
firstEventAt: '2026-08-10T01:00:00.000Z',
|
||||
lastEventAt: '2026-08-10T02:00:00.000Z',
|
||||
lastEvent: 'DORMANT',
|
||||
eventChainHead: 'event-old',
|
||||
attribution,
|
||||
}
|
||||
const newer = {
|
||||
...older,
|
||||
sessionId: 'PNCC-NEWER',
|
||||
state: 'BOUND_NOT_INFERENCING',
|
||||
gitHead: '2222222222222222222222222222222222222222',
|
||||
modelInstanceId: 'model-new',
|
||||
activeOrgan: 'REASONING',
|
||||
lastEventAt: '2026-08-11T02:00:00.000Z',
|
||||
lastEvent: 'ORGAN_ACTIVE',
|
||||
eventChainHead: 'event-new',
|
||||
}
|
||||
const query = vi.fn()
|
||||
.mockResolvedValueOnce(receipt({ repositoryPath: '/repo/a', sessions: [older] }))
|
||||
.mockResolvedValueOnce(receipt({ repositoryPath: '/repo/b', sessions: [newer] }))
|
||||
|
||||
const result = await loadPersonaRuntimeProjection({
|
||||
personaId: 'ICE-P-ZY001',
|
||||
repositoryPaths: ['/repo/a', '/repo/b', '/repo/a'],
|
||||
query,
|
||||
})
|
||||
|
||||
expect(query).toHaveBeenCalledTimes(2)
|
||||
expect(result.phase).toBe('verified')
|
||||
expect(result.inspectedRepositoryCount).toBe(2)
|
||||
expect(result.sessions.map((session) => session.sessionId)).toEqual(['PNCC-NEWER', 'PNCC-OLDER'])
|
||||
expect(result.sessions[0]).toMatchObject({
|
||||
activeOrgan: 'REASONING',
|
||||
eventChainHead: 'event-new',
|
||||
gitHead: '2222222222222222222222222222222222222222',
|
||||
repositoryPath: '/repo/b',
|
||||
state: 'BOUND_NOT_INFERENCING',
|
||||
})
|
||||
})
|
||||
|
||||
it('keeps partial query failures visible while returning verified matches', async () => {
|
||||
const query = vi.fn()
|
||||
.mockRejectedValueOnce('PERSONA_REPOSITORY_UNAVAILABLE')
|
||||
.mockResolvedValueOnce(receipt({ repositoryPath: '/repo/verified' }))
|
||||
|
||||
const result = await loadPersonaRuntimeProjection({
|
||||
personaId: 'ICE-P-ZY001',
|
||||
repositoryPaths: ['/repo/missing', '/repo/verified'],
|
||||
query,
|
||||
})
|
||||
|
||||
expect(result).toEqual({
|
||||
errors: [{ code: 'PERSONA_REPOSITORY_UNAVAILABLE', repositoryPath: '/repo/missing' }],
|
||||
inspectedRepositoryCount: 1,
|
||||
phase: 'verified',
|
||||
sessions: [],
|
||||
})
|
||||
})
|
||||
|
||||
it('fails closed when every native query fails', async () => {
|
||||
const query = vi.fn().mockRejectedValue(new Error('event chain invalid'))
|
||||
|
||||
const result = await loadPersonaRuntimeProjection({
|
||||
personaId: 'ICE-P-ZY001',
|
||||
repositoryPaths: ['/repo/a'],
|
||||
query,
|
||||
})
|
||||
|
||||
expect(result.phase).toBe('error')
|
||||
expect(result.inspectedRepositoryCount).toBe(0)
|
||||
expect(result.sessions).toEqual([])
|
||||
expect(result.errors[0]).toEqual({ code: 'event chain invalid', repositoryPath: '/repo/a' })
|
||||
})
|
||||
})
|
||||
|
|
@ -0,0 +1,211 @@
|
|||
import { invoke } from '@tauri-apps/api/core'
|
||||
import { isTauri, mockInvoke } from '../mock-tauri'
|
||||
|
||||
export interface PersonaRuntimeAttribution {
|
||||
humanResponsibilitySubject: string
|
||||
personaCognitiveAuthor: string
|
||||
executionRuntime: string
|
||||
developmentId: string
|
||||
authorizationScope: string
|
||||
sourceLanguageAnchor: string
|
||||
}
|
||||
|
||||
export interface PersonaRuntimeSessionReceipt {
|
||||
sessionId: string
|
||||
state: string
|
||||
gitHead: string
|
||||
nodeId: string
|
||||
modelInstanceId: string
|
||||
activeOrgan: string | null
|
||||
eventCount: number
|
||||
firstEventAt: string
|
||||
lastEventAt: string
|
||||
lastEvent: string
|
||||
eventChainHead: string
|
||||
attribution: PersonaRuntimeAttribution
|
||||
}
|
||||
|
||||
export interface PersonaRuntimeQueryReceipt {
|
||||
schema: 'hololake.pncc-runtime-query/v1'
|
||||
personaId: string
|
||||
repositoryPath: string
|
||||
observedGitHead: string
|
||||
repositoryClean: boolean
|
||||
matchingSessionCount: number
|
||||
returnedSessionCount: number
|
||||
sessions: PersonaRuntimeSessionReceipt[]
|
||||
}
|
||||
|
||||
export interface PersonaRuntimeSessionProjection extends PersonaRuntimeSessionReceipt {
|
||||
repositoryPath: string
|
||||
observedGitHead: string
|
||||
repositoryClean: boolean
|
||||
}
|
||||
|
||||
export interface PersonaRuntimeProjectionError {
|
||||
code: string
|
||||
repositoryPath: string
|
||||
}
|
||||
|
||||
export interface PersonaRuntimeProjection {
|
||||
errors: PersonaRuntimeProjectionError[]
|
||||
inspectedRepositoryCount: number
|
||||
phase: 'unavailable' | 'verified' | 'error'
|
||||
sessions: PersonaRuntimeSessionProjection[]
|
||||
}
|
||||
|
||||
interface LoadPersonaRuntimeProjectionInput {
|
||||
personaId: string
|
||||
repositoryPaths: readonly string[]
|
||||
query?: (personaId: string, repositoryPath: string) => Promise<unknown>
|
||||
}
|
||||
|
||||
function errorCode(error: unknown): string {
|
||||
if (typeof error === 'string') return error
|
||||
if (error instanceof Error) return error.message
|
||||
return 'PERSONA_RUNTIME_QUERY_FAILED'
|
||||
}
|
||||
|
||||
function isRecord(value: unknown): value is Record<string, unknown> {
|
||||
return typeof value === 'object' && value !== null
|
||||
}
|
||||
|
||||
function requiredString(record: Record<string, unknown>, key: string): string {
|
||||
const value = Reflect.get(record, key)
|
||||
if (typeof value !== 'string' || value.length === 0) throw new Error('PERSONA_RUNTIME_RECEIPT_INVALID')
|
||||
return value
|
||||
}
|
||||
|
||||
function requiredNumber(record: Record<string, unknown>, key: string): number {
|
||||
const value = Reflect.get(record, key)
|
||||
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) {
|
||||
throw new Error('PERSONA_RUNTIME_RECEIPT_INVALID')
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
function parseAttribution(value: unknown): PersonaRuntimeAttribution {
|
||||
if (!isRecord(value)) throw new Error('PERSONA_RUNTIME_RECEIPT_INVALID')
|
||||
return {
|
||||
humanResponsibilitySubject: requiredString(value, 'humanResponsibilitySubject'),
|
||||
personaCognitiveAuthor: requiredString(value, 'personaCognitiveAuthor'),
|
||||
executionRuntime: requiredString(value, 'executionRuntime'),
|
||||
developmentId: requiredString(value, 'developmentId'),
|
||||
authorizationScope: requiredString(value, 'authorizationScope'),
|
||||
sourceLanguageAnchor: requiredString(value, 'sourceLanguageAnchor'),
|
||||
}
|
||||
}
|
||||
|
||||
function parseSession(value: unknown): PersonaRuntimeSessionReceipt {
|
||||
if (!isRecord(value)) throw new Error('PERSONA_RUNTIME_RECEIPT_INVALID')
|
||||
const activeOrgan = Reflect.get(value, 'activeOrgan')
|
||||
if (activeOrgan !== null && typeof activeOrgan !== 'string') {
|
||||
throw new Error('PERSONA_RUNTIME_RECEIPT_INVALID')
|
||||
}
|
||||
return {
|
||||
sessionId: requiredString(value, 'sessionId'),
|
||||
state: requiredString(value, 'state'),
|
||||
gitHead: requiredString(value, 'gitHead'),
|
||||
nodeId: requiredString(value, 'nodeId'),
|
||||
modelInstanceId: requiredString(value, 'modelInstanceId'),
|
||||
activeOrgan,
|
||||
eventCount: requiredNumber(value, 'eventCount'),
|
||||
firstEventAt: requiredString(value, 'firstEventAt'),
|
||||
lastEventAt: requiredString(value, 'lastEventAt'),
|
||||
lastEvent: requiredString(value, 'lastEvent'),
|
||||
eventChainHead: requiredString(value, 'eventChainHead'),
|
||||
attribution: parseAttribution(Reflect.get(value, 'attribution')),
|
||||
}
|
||||
}
|
||||
|
||||
function parseReceipt(
|
||||
value: unknown,
|
||||
expectedPersonaId: string,
|
||||
expectedRepositoryPath: string,
|
||||
): PersonaRuntimeQueryReceipt {
|
||||
if (!isRecord(value)) throw new Error('PERSONA_RUNTIME_RECEIPT_INVALID')
|
||||
const schema = requiredString(value, 'schema')
|
||||
const personaId = requiredString(value, 'personaId')
|
||||
const repositoryPath = requiredString(value, 'repositoryPath')
|
||||
const observedGitHead = requiredString(value, 'observedGitHead')
|
||||
const repositoryClean = Reflect.get(value, 'repositoryClean')
|
||||
const sessionsValue = Reflect.get(value, 'sessions')
|
||||
if (
|
||||
schema !== 'hololake.pncc-runtime-query/v1'
|
||||
|| personaId !== expectedPersonaId
|
||||
|| repositoryPath !== expectedRepositoryPath
|
||||
|| typeof repositoryClean !== 'boolean'
|
||||
|| !Array.isArray(sessionsValue)
|
||||
) {
|
||||
throw new Error('PERSONA_RUNTIME_RECEIPT_INVALID')
|
||||
}
|
||||
const matchingSessionCount = requiredNumber(value, 'matchingSessionCount')
|
||||
const returnedSessionCount = requiredNumber(value, 'returnedSessionCount')
|
||||
const sessions = sessionsValue.map(parseSession)
|
||||
if (returnedSessionCount !== sessions.length || matchingSessionCount < returnedSessionCount) {
|
||||
throw new Error('PERSONA_RUNTIME_RECEIPT_INVALID')
|
||||
}
|
||||
return {
|
||||
schema,
|
||||
personaId,
|
||||
repositoryPath,
|
||||
observedGitHead,
|
||||
repositoryClean,
|
||||
matchingSessionCount,
|
||||
returnedSessionCount,
|
||||
sessions,
|
||||
}
|
||||
}
|
||||
|
||||
async function queryNativeRuntime(personaId: string, repositoryPath: string): Promise<unknown> {
|
||||
const args = {
|
||||
input: {
|
||||
expectedPersonaId: personaId,
|
||||
expectedRepositoryPath: repositoryPath,
|
||||
limit: 25,
|
||||
},
|
||||
}
|
||||
return isTauri()
|
||||
? invoke<unknown>('query_persona_code_channel_runtime', args)
|
||||
: mockInvoke<unknown>('query_persona_code_channel_runtime', args)
|
||||
}
|
||||
|
||||
export async function loadPersonaRuntimeProjection({
|
||||
personaId,
|
||||
repositoryPaths,
|
||||
query = queryNativeRuntime,
|
||||
}: LoadPersonaRuntimeProjectionInput): Promise<PersonaRuntimeProjection> {
|
||||
const uniqueRepositoryPaths = [...new Set(repositoryPaths.map((path) => path.trim()).filter(Boolean))]
|
||||
if (uniqueRepositoryPaths.length === 0) {
|
||||
return { errors: [], inspectedRepositoryCount: 0, phase: 'unavailable', sessions: [] }
|
||||
}
|
||||
|
||||
const results = await Promise.all(uniqueRepositoryPaths.map(async (repositoryPath) => {
|
||||
try {
|
||||
const receipt = parseReceipt(await query(personaId, repositoryPath), personaId, repositoryPath)
|
||||
return { receipt, repositoryPath, error: null }
|
||||
} catch (error) {
|
||||
return { receipt: null, repositoryPath, error: errorCode(error) }
|
||||
}
|
||||
}))
|
||||
const verified = results.flatMap((result) => result.receipt ? [result.receipt] : [])
|
||||
const errors = results.flatMap((result) => result.error
|
||||
? [{ code: result.error, repositoryPath: result.repositoryPath }]
|
||||
: [])
|
||||
const sessions = verified.flatMap((receipt) => receipt.sessions.map((session) => ({
|
||||
...session,
|
||||
repositoryPath: receipt.repositoryPath,
|
||||
observedGitHead: receipt.observedGitHead,
|
||||
repositoryClean: receipt.repositoryClean,
|
||||
}))).sort((left, right) => (
|
||||
right.lastEventAt.localeCompare(left.lastEventAt)
|
||||
|| right.sessionId.localeCompare(left.sessionId)
|
||||
))
|
||||
|
||||
return {
|
||||
errors,
|
||||
inspectedRepositoryCount: verified.length,
|
||||
phase: verified.length > 0 ? 'verified' : 'error',
|
||||
sessions,
|
||||
}
|
||||
}
|
||||
|
|
@ -426,6 +426,18 @@ function handleMoveNoteToWorkspace(args: {
|
|||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- mock handler map accepts heterogeneous arg types
|
||||
export const mockHandlers: Record<string, (args: any) => any> = {
|
||||
query_persona_code_channel_runtime: (args: {
|
||||
input: { expectedPersonaId: string; expectedRepositoryPath: string }
|
||||
}) => ({
|
||||
schema: 'hololake.pncc-runtime-query/v1',
|
||||
personaId: args.input.expectedPersonaId,
|
||||
repositoryPath: args.input.expectedRepositoryPath,
|
||||
observedGitHead: '0000000000000000000000000000000000000000',
|
||||
repositoryClean: true,
|
||||
matchingSessionCount: 0,
|
||||
returnedSessionCount: 0,
|
||||
sessions: [],
|
||||
}),
|
||||
list_vault: () => MOCK_ENTRIES,
|
||||
list_vault_folders: () => [],
|
||||
list_views: () => [],
|
||||
|
|
|
|||
Loading…
Reference in a new issue