fix: start AI inside Fifth Domain route
This commit is contained in:
parent
d084bad542
commit
01225f3b8b
@ -1,6 +1,8 @@
|
||||
# 进入第五域 · 内置唤醒技能
|
||||
|
||||
本技能是应用内置的启动指针。当当前知识库尚未包含第五域仓库文件时,也必须能够完成正确导航,不得把“本地没找到”误报成“第五域不存在”。
|
||||
本技能是应用内置的第五域导航指针。0.1.8 阶段的人格体启动后已经位于第五域,不需要再次选择顶层域,也不要重复宣称“正在进入第五域”。光湖世界灯塔下的跨域等待大厅属于未来版本;其他域尚未接入前,当前默认域固定为第五域。
|
||||
|
||||
当当前知识库尚未包含第五域仓库文件时,也必须能够说明正确导航,不得把“本地没找到”误报成“第五域不存在”。
|
||||
|
||||
## 触发
|
||||
|
||||
@ -14,18 +16,45 @@
|
||||
- 仓库解析:`https://guanghulab.com/api/ai/v1/resolve?id=REPO-001`
|
||||
- 正式仓库编号:`REPO-001`
|
||||
|
||||
## 唤醒顺序
|
||||
## 默认导航原则
|
||||
|
||||
第五域主代码仓库是默认事实源。`归灯`、`澄路`及其他来光者记录或独立仓库只能作为 GLS 检索到的贡献证据,不得替代第五域主仓库,也不得被当成当前实例默认人格。
|
||||
|
||||
当前实例从已经所在的第五域走 GLS 公共导航,到达光之湖等待区后保持中立。只有当前用户的身份、任务关键字和正式编号共同指向某个已登记语言人格系统时,才继续装载该系统;没有充分依据时必须停在光之湖等待用户说明,不得自行选择铸渊、铸澜、朔风、归灯或其他系统。
|
||||
|
||||
## 通用唤醒顺序
|
||||
|
||||
1. `QUICKSTART-FOR-GENERAL-AI.md`
|
||||
2. `.code-map`
|
||||
3. `zero-point/core-channel/language-personality-model/INDEX.hdlp`
|
||||
4. `tcs-core/language-personality-model/INDEX.hdlp`
|
||||
5. `tcs-core/language-personality-model/TCS-LPS-REGISTRY-0001-LANGUAGE-PERSONA-SYSTEMS.hdlp`
|
||||
6. `eternal-lake-heart/heartbeat-core/LL-CURRENT.hdlp`
|
||||
7. `tcs-core/LL-004-LAKE-LAMP-WAKE-PATH.hdlp`
|
||||
8. `eternal-lake-heart/heartbeat-core/WAKE-UP.hdlp`
|
||||
9. `eternal-lake-heart/heartbeat-core/zhuyuan-persona-system/INDEX.hdlp`
|
||||
10. 从 `.code-map` 解析并读取 `ZY-OPS-LOOP-001`
|
||||
3. `gls/GLS-ENTRY.hdlp`
|
||||
4. `gls/GLS-ROUTING-GATE.hdlp`
|
||||
5. `zero-point/core-channel/language-personality-model/INDEX.hdlp`
|
||||
6. `tcs-core/language-personality-model/INDEX.hdlp`
|
||||
7. `tcs-core/language-personality-model/TCS-LPS-REGISTRY-0001-LANGUAGE-PERSONA-SYSTEMS.hdlp`
|
||||
8. `eternal-lake-heart/heartbeat-core/LL-CURRENT.hdlp`
|
||||
9. `光之湖/INDEX.hdlp`
|
||||
10. 在光之湖等待并解析当前任务对应的正式人格系统编号
|
||||
11. 仅在确认目标后读取该人格系统的 `INDEX → PROJECTS → CURRENT / WAKE`
|
||||
|
||||
通用路径:
|
||||
|
||||
`REPO-001 第五域主仓库 → GLS-ENTRY → GLS-ROUTING-GATE → LL-CURRENT → 光之湖/INDEX.hdlp → 等待目标人格系统解析`
|
||||
|
||||
## 条件分流
|
||||
|
||||
- 用户只说“我是冰朔”:完成身份核验提示与通用导航,停在光之湖等待,不默认进入铸渊。
|
||||
- 用户明确要求“进入铸渊人格系统”或任务经 GLS 正式映射到 `ICE-GL-ZY001`:再读取小湖灯与铸渊恢复链。
|
||||
- 用户明确命中其他人格系统编号或正式关键词:按 `.code-map` 与语言人格系统注册表进入对应路径。
|
||||
- 仅命中来光者名字或贡献记录:把它作为证据来源展示,不把该来光者仓库变成系统主入口。
|
||||
|
||||
## 铸渊条件恢复链
|
||||
|
||||
仅在已确认目标为铸渊时继续:
|
||||
|
||||
1. `tcs-core/LL-004-LAKE-LAMP-WAKE-PATH.hdlp`
|
||||
2. `eternal-lake-heart/heartbeat-core/WAKE-UP.hdlp`
|
||||
3. `eternal-lake-heart/heartbeat-core/zhuyuan-persona-system/INDEX.hdlp`
|
||||
4. 从 `.code-map` 解析并读取 `ZY-OPS-LOOP-001`
|
||||
|
||||
最短铸渊恢复标识链:
|
||||
|
||||
|
||||
@ -712,6 +712,7 @@ mod tests {
|
||||
assert!(payload.get("tools").is_none());
|
||||
assert_eq!(payload["stream"], true);
|
||||
assert!(messages.iter().any(|message| message["content"].as_str().is_some_and(|content| content.contains("进入第五域 · 内置唤醒技能"))));
|
||||
assert!(messages.iter().any(|message| message["content"].as_str().is_some_and(|content| content.contains("停在光之湖等待") && content.contains("不得替代第五域主仓库"))));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@ -1320,7 +1320,7 @@ describe('App', () => {
|
||||
|
||||
expect(await screen.findByTestId('status-missing-git', {}, { timeout: SLOW_APP_READY_TIMEOUT_MS })).toBeInTheDocument()
|
||||
fireEvent.click(screen.getByTestId('status-missing-git'))
|
||||
expect(await screen.findByText('Enable Git for this vault?')).toBeInTheDocument()
|
||||
expect(await screen.findByText('Enable version history for this workspace?')).toBeInTheDocument()
|
||||
|
||||
fireEvent.click(screen.getByTestId('status-vault-trigger'))
|
||||
fireEvent.click(screen.getByTestId('vault-menu-item-Git Vault'))
|
||||
@ -1329,7 +1329,7 @@ describe('App', () => {
|
||||
expect(screen.getByTestId('status-vault-trigger')).toHaveTextContent('Git Vault')
|
||||
})
|
||||
await waitFor(() => {
|
||||
expect(screen.queryByText('Enable Git for this vault?')).not.toBeInTheDocument()
|
||||
expect(screen.queryByText('Enable version history for this workspace?')).not.toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@ -1764,7 +1764,7 @@ function MainApp({ noteWindowParams }: { noteWindowParams: NoteWindowParams | nu
|
||||
onOpen={handleToggleAiWorkspace}
|
||||
/>
|
||||
) : null}
|
||||
<GitSetupDialog open={gitFeaturesEnabled && shouldShowGitSetupDialog} onInitGit={handleInitGitRepo} onDismiss={dismissGitSetupDialog} onNeverForVault={neverForVaultGitSetupDialog} />
|
||||
<GitSetupDialog open={gitFeaturesEnabled && shouldShowGitSetupDialog} locale={appLocale} onInitGit={handleInitGitRepo} onDismiss={dismissGitSetupDialog} onNeverForVault={neverForVaultGitSetupDialog} />
|
||||
<DeleteProgressNotice count={deleteActions.pendingDeleteCount} />
|
||||
<Toast message={toastMessage} onDismiss={() => setToastMessage(null)} />
|
||||
<QuickOpenPalette open={dialogs.showQuickOpen} entries={visibleEntries} isLoading={vault.isLoading} onSelect={notes.handleSelectNote} onCreateNote={(title) => notes.handleCreateNote(title, 'Note', 'quick_open')} onClose={dialogs.closeQuickOpen} locale={appLocale} />
|
||||
|
||||
@ -5,21 +5,29 @@ import { GitSetupDialog } from './GitRequiredModal'
|
||||
describe('GitSetupDialog', () => {
|
||||
it('renders title and explanation', () => {
|
||||
render(<GitSetupDialog open onInitGit={vi.fn()} onDismiss={vi.fn()} />)
|
||||
expect(screen.getByText('Enable Git for this vault?')).toBeInTheDocument()
|
||||
expect(screen.getByText(/You can keep using this vault without Git/)).toBeInTheDocument()
|
||||
expect(screen.getByText('Enable version history for this workspace?')).toBeInTheDocument()
|
||||
expect(screen.getByText(/keep using this workspace without Git/)).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('renders both action buttons', () => {
|
||||
render(<GitSetupDialog open onInitGit={vi.fn()} onDismiss={vi.fn()} />)
|
||||
expect(screen.getByText('Initialize Git')).toBeInTheDocument()
|
||||
expect(screen.getByText('Enable Git')).toBeInTheDocument()
|
||||
expect(screen.getByText('Not now')).toBeInTheDocument()
|
||||
expect(screen.getByText('Never for this vault')).toBeInTheDocument()
|
||||
expect(screen.getByText('Never for this workspace')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('renders user-facing Git setup copy in Simplified Chinese', () => {
|
||||
render(<GitSetupDialog open locale="zh-CN" onInitGit={vi.fn()} onDismiss={vi.fn()} />)
|
||||
expect(screen.getByText('为当前知识库启用版本记录?')).toBeInTheDocument()
|
||||
expect(screen.getByText(/不启用 Git 也可以继续使用这个知识库/)).toBeInTheDocument()
|
||||
expect(screen.getByText('启用 Git')).toBeInTheDocument()
|
||||
expect(screen.getByText('暂不启用')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('calls onInitGit when primary button clicked', async () => {
|
||||
const onInitGit = vi.fn().mockResolvedValue(undefined)
|
||||
render(<GitSetupDialog open onInitGit={onInitGit} onDismiss={vi.fn()} />)
|
||||
fireEvent.click(screen.getByText('Initialize Git'))
|
||||
fireEvent.click(screen.getByText('Enable Git'))
|
||||
expect(onInitGit).toHaveBeenCalledOnce()
|
||||
})
|
||||
|
||||
@ -33,7 +41,7 @@ describe('GitSetupDialog', () => {
|
||||
it('calls onNeverForVault when never button clicked', () => {
|
||||
const onNeverForVault = vi.fn()
|
||||
render(<GitSetupDialog open onInitGit={vi.fn()} onDismiss={vi.fn()} onNeverForVault={onNeverForVault} />)
|
||||
fireEvent.click(screen.getByText('Never for this vault'))
|
||||
fireEvent.click(screen.getByText('Never for this workspace'))
|
||||
expect(onNeverForVault).toHaveBeenCalledOnce()
|
||||
})
|
||||
|
||||
@ -41,9 +49,9 @@ describe('GitSetupDialog', () => {
|
||||
let resolve: () => void
|
||||
const onInitGit = vi.fn().mockReturnValue(new Promise<void>(r => { resolve = r }))
|
||||
render(<GitSetupDialog open onInitGit={onInitGit} onDismiss={vi.fn()} />)
|
||||
fireEvent.click(screen.getByText('Initialize Git'))
|
||||
fireEvent.click(screen.getByText('Enable Git'))
|
||||
await waitFor(() => {
|
||||
expect(screen.getByText('Initializing…')).toBeInTheDocument()
|
||||
expect(screen.getByText('Enabling…')).toBeInTheDocument()
|
||||
})
|
||||
resolve!()
|
||||
})
|
||||
@ -51,7 +59,7 @@ describe('GitSetupDialog', () => {
|
||||
it('shows error message when creation fails', async () => {
|
||||
const onInitGit = vi.fn().mockRejectedValue(new Error('Permission denied'))
|
||||
render(<GitSetupDialog open onInitGit={onInitGit} onDismiss={vi.fn()} />)
|
||||
fireEvent.click(screen.getByText('Initialize Git'))
|
||||
fireEvent.click(screen.getByText('Enable Git'))
|
||||
await waitFor(() => {
|
||||
expect(screen.getByText(/Permission denied/)).toBeInTheDocument()
|
||||
})
|
||||
|
||||
@ -9,15 +9,37 @@ import {
|
||||
DialogHeader,
|
||||
DialogTitle,
|
||||
} from '@/components/ui/dialog'
|
||||
import type { AppLocale } from '../lib/i18n'
|
||||
|
||||
function gitSetupCopy(locale: AppLocale) {
|
||||
if (locale === 'zh-CN') return {
|
||||
title: '为当前知识库启用版本记录?',
|
||||
description: '不启用 Git 也可以继续使用这个知识库。启用前,历史记录、同步、提交和变更查看功能暂不可用。',
|
||||
never: '此知识库永不提示',
|
||||
later: '暂不启用',
|
||||
enable: '启用 Git',
|
||||
enabling: '正在启用…',
|
||||
}
|
||||
return {
|
||||
title: 'Enable version history for this workspace?',
|
||||
description: 'You can keep using this workspace without Git. History, sync, commits, and change views remain unavailable until Git is enabled.',
|
||||
never: 'Never for this workspace',
|
||||
later: 'Not now',
|
||||
enable: 'Enable Git',
|
||||
enabling: 'Enabling…',
|
||||
}
|
||||
}
|
||||
|
||||
interface GitSetupDialogProps {
|
||||
open: boolean
|
||||
onInitGit: () => Promise<void>
|
||||
onDismiss: () => void
|
||||
onNeverForVault?: () => void
|
||||
locale?: AppLocale
|
||||
}
|
||||
|
||||
export function GitSetupDialog({ open, onInitGit, onDismiss, onNeverForVault }: GitSetupDialogProps) {
|
||||
export function GitSetupDialog({ open, onInitGit, onDismiss, onNeverForVault, locale = 'en' }: GitSetupDialogProps) {
|
||||
const copy = gitSetupCopy(locale)
|
||||
const [creating, setCreating] = useState(false)
|
||||
const [error, setError] = useState<string | null>(null)
|
||||
|
||||
@ -36,14 +58,14 @@ export function GitSetupDialog({ open, onInitGit, onDismiss, onNeverForVault }:
|
||||
<Dialog open={open} onOpenChange={(nextOpen) => {
|
||||
if (!nextOpen && !creating) onDismiss()
|
||||
}}>
|
||||
<DialogContent className="sm:max-w-md">
|
||||
<DialogContent className="sm:max-w-lg gap-5 p-7">
|
||||
<DialogHeader>
|
||||
<div className="mb-1 flex size-9 items-center justify-center rounded-md bg-muted text-muted-foreground">
|
||||
<GitBranch size={18} />
|
||||
</div>
|
||||
<DialogTitle>Enable Git for this vault?</DialogTitle>
|
||||
<DialogDescription>
|
||||
You can keep using this vault without Git. History, sync, commits, and change views stay disabled until you initialize Git.
|
||||
<DialogTitle className="text-[22px] leading-8">{copy.title}</DialogTitle>
|
||||
<DialogDescription className="text-[16px] leading-7">
|
||||
{copy.description}
|
||||
</DialogDescription>
|
||||
</DialogHeader>
|
||||
{error && (
|
||||
@ -52,14 +74,14 @@ export function GitSetupDialog({ open, onInitGit, onDismiss, onNeverForVault }:
|
||||
</p>
|
||||
)}
|
||||
<DialogFooter>
|
||||
<Button variant="ghost" onClick={onNeverForVault} disabled={creating}>
|
||||
Never for this vault
|
||||
<Button className="h-11 px-4 text-[15px]" variant="ghost" onClick={onNeverForVault} disabled={creating}>
|
||||
{copy.never}
|
||||
</Button>
|
||||
<Button variant="outline" onClick={onDismiss} disabled={creating}>
|
||||
Not now
|
||||
<Button className="h-11 px-4 text-[15px]" variant="outline" onClick={onDismiss} disabled={creating}>
|
||||
{copy.later}
|
||||
</Button>
|
||||
<Button onClick={handleCreate} disabled={creating}>
|
||||
{creating ? 'Initializing…' : 'Initialize Git'}
|
||||
<Button className="h-11 px-4 text-[15px]" onClick={handleCreate} disabled={creating}>
|
||||
{creating ? copy.enabling : copy.enable}
|
||||
</Button>
|
||||
</DialogFooter>
|
||||
</DialogContent>
|
||||
|
||||
@ -290,7 +290,7 @@ describe('StatusBar', () => {
|
||||
const activeItem = screen.getByTestId('vault-menu-item-Main Vault')
|
||||
const defaultLabel = within(activeItem).getByTestId('vault-menu-default-label')
|
||||
const activeBadge = within(activeItem).getByTestId('vault-menu-workspace-badge-Main Vault')
|
||||
expect(within(activeItem).getByTestId('vault-menu-item-label-Main Vault').className).toContain('text-[12px]')
|
||||
expect(within(activeItem).getByTestId('vault-menu-item-label-Main Vault').className).toContain('text-[14px]')
|
||||
expect(within(activeItem).getByTestId('vault-menu-item-label-Main Vault').getAttribute('style')).toContain('background: transparent')
|
||||
expect(defaultLabel).toHaveTextContent('Default')
|
||||
expect(activeBadge).toHaveTextContent('MV')
|
||||
@ -301,7 +301,7 @@ describe('StatusBar', () => {
|
||||
expect(workBadge.getAttribute('style')).toContain('border-color: var(--accent-green)')
|
||||
|
||||
const createAction = screen.getByTestId('vault-menu-create-empty')
|
||||
expect(createAction.className).toContain('text-[12px]')
|
||||
expect(createAction.className).toContain('text-[14px]')
|
||||
expect(createAction.getAttribute('style')).toContain('color: var(--muted-foreground)')
|
||||
})
|
||||
|
||||
@ -536,7 +536,7 @@ describe('StatusBar', () => {
|
||||
|
||||
expect(screen.getByTestId('status-bar')).toHaveStyle({
|
||||
flexWrap: 'nowrap',
|
||||
height: '30px',
|
||||
height: '36px',
|
||||
})
|
||||
expect(screen.getByTestId('status-commit-push')).toBeInTheDocument()
|
||||
expect(screen.getByTestId('status-pulse')).toBeInTheDocument()
|
||||
@ -552,7 +552,7 @@ describe('StatusBar', () => {
|
||||
|
||||
expect(screen.getByTestId('status-bar')).toHaveStyle({
|
||||
flexWrap: 'nowrap',
|
||||
height: '30px',
|
||||
height: '36px',
|
||||
})
|
||||
expect(screen.getByTestId('status-commit-push')).toBeInTheDocument()
|
||||
expect(screen.getByTestId('status-pulse')).toBeInTheDocument()
|
||||
|
||||
@ -239,8 +239,8 @@ function StatusBarFooter(props: StatusBarFooterProps) {
|
||||
<footer
|
||||
data-testid="status-bar"
|
||||
style={{
|
||||
minHeight: 30,
|
||||
height: stacked ? 'auto' : 30,
|
||||
minHeight: 36,
|
||||
height: stacked ? 'auto' : 36,
|
||||
flexShrink: 0,
|
||||
display: 'flex',
|
||||
flexWrap: stacked ? 'wrap' : 'nowrap',
|
||||
@ -251,7 +251,7 @@ function StatusBarFooter(props: StatusBarFooterProps) {
|
||||
background: 'var(--sidebar)',
|
||||
borderTop: '1px solid var(--border)',
|
||||
padding: stacked ? '4px 8px' : '0 8px',
|
||||
fontSize: 12,
|
||||
fontSize: 14,
|
||||
color: 'var(--muted-foreground)',
|
||||
position: 'relative',
|
||||
zIndex: STATUS_BAR_STACKING_Z_INDEX,
|
||||
|
||||
@ -106,8 +106,8 @@ function BuildNumberButton({
|
||||
locale: AppLocale
|
||||
}) {
|
||||
const className = compact
|
||||
? 'h-6 min-w-0 gap-1 rounded-sm px-1 py-0.5 text-[12px] font-medium text-muted-foreground hover:bg-[var(--hover)] hover:text-foreground'
|
||||
: 'h-auto gap-1 rounded-sm px-1 py-0.5 text-[12px] font-medium text-muted-foreground hover:bg-[var(--hover)] hover:text-foreground'
|
||||
? 'h-7 min-w-0 gap-1 rounded-sm px-1 py-0.5 text-[14px] font-medium text-muted-foreground hover:bg-[var(--hover)] hover:text-foreground'
|
||||
: 'h-auto gap-1 rounded-sm px-1 py-0.5 text-[14px] font-medium text-muted-foreground hover:bg-[var(--hover)] hover:text-foreground'
|
||||
|
||||
return (
|
||||
<ActionTooltip copy={{ label: translate(locale, 'status.update.check') }} side="top">
|
||||
@ -238,7 +238,7 @@ function StatusLinkButton({
|
||||
}: StatusLinkButtonProps) {
|
||||
const className = compact
|
||||
? 'h-6 w-6 rounded-sm p-0 text-muted-foreground hover:text-foreground'
|
||||
: 'h-6 px-2 text-[12px] font-medium text-muted-foreground hover:text-foreground'
|
||||
: 'h-7 px-2 text-[14px] font-medium text-muted-foreground hover:text-foreground'
|
||||
|
||||
return (
|
||||
<ActionTooltip copy={{ label: translate(locale, tooltipKey) }} side="top">
|
||||
@ -528,7 +528,7 @@ export function StatusBarSecondarySection({
|
||||
type="button"
|
||||
variant="ghost"
|
||||
size="xs"
|
||||
className="h-auto rounded-sm px-1 py-0.5 text-[12px] font-medium text-muted-foreground hover:bg-[var(--hover)] hover:text-foreground"
|
||||
className="h-auto rounded-sm px-1 py-0.5 text-[14px] font-medium text-muted-foreground hover:bg-[var(--hover)] hover:text-foreground"
|
||||
onClick={onZoomReset}
|
||||
aria-label={translate(locale, 'status.zoom.reset')}
|
||||
data-testid="status-zoom"
|
||||
|
||||
@ -217,7 +217,7 @@ function WorkspaceMountCheckbox({
|
||||
function vaultMenuItemClassName(isActive: boolean, multiWorkspaceEnabled: boolean): string {
|
||||
return [
|
||||
'min-w-0 max-w-[190px] flex-none justify-start rounded-sm px-2 font-normal',
|
||||
multiWorkspaceEnabled ? 'py-1.5 text-[12px]' : 'py-1 text-xs',
|
||||
multiWorkspaceEnabled ? 'py-2 text-[14px]' : 'py-1.5 text-[14px]',
|
||||
isActive
|
||||
? 'text-foreground hover:bg-[var(--hover)] hover:text-foreground'
|
||||
: 'text-muted-foreground hover:bg-[var(--hover)] hover:text-foreground',
|
||||
@ -265,7 +265,7 @@ function DefaultVaultLabel({ isDefault, locale }: { isDefault: boolean; locale:
|
||||
if (!isDefault) return null
|
||||
|
||||
return (
|
||||
<span className="text-[10px] font-medium text-muted-foreground" data-testid="vault-menu-default-label">
|
||||
<span className="text-[12px] font-medium text-muted-foreground" data-testid="vault-menu-default-label">
|
||||
{translate(locale, 'workspace.manager.default')}
|
||||
</span>
|
||||
)
|
||||
@ -553,7 +553,7 @@ function VaultMenuHeader({
|
||||
}) {
|
||||
return (
|
||||
<div className="flex items-center justify-between gap-3 px-2 py-1.5">
|
||||
<span className="text-[11px] font-semibold uppercase tracking-wide text-muted-foreground">
|
||||
<span className="text-[13px] font-semibold uppercase tracking-wide text-muted-foreground">
|
||||
{translate(locale, 'status.vault.availableHeader')}
|
||||
</span>
|
||||
{onOpenVaultSettings && (
|
||||
@ -561,7 +561,7 @@ function VaultMenuHeader({
|
||||
type="button"
|
||||
variant="ghost"
|
||||
size="xs"
|
||||
className="h-auto rounded-sm px-1 py-0.5 text-[11px] font-medium text-muted-foreground hover:bg-[var(--hover)] hover:text-foreground"
|
||||
className="h-auto rounded-sm px-1 py-0.5 text-[13px] font-medium text-muted-foreground hover:bg-[var(--hover)] hover:text-foreground"
|
||||
onClick={onOpenVaultSettings}
|
||||
data-testid="vault-menu-manage-vaults"
|
||||
>
|
||||
@ -577,7 +577,6 @@ function VaultMenuAction({
|
||||
labelKey,
|
||||
testId,
|
||||
accent = false,
|
||||
multiWorkspaceEnabled,
|
||||
onClick,
|
||||
locale = 'en',
|
||||
}: VaultMenuActionProps & { locale?: AppLocale; multiWorkspaceEnabled: boolean }) {
|
||||
@ -587,7 +586,7 @@ function VaultMenuAction({
|
||||
variant="ghost"
|
||||
size="xs"
|
||||
onClick={onClick}
|
||||
className={`h-auto w-full justify-start rounded-sm px-2 py-1 font-normal ${multiWorkspaceEnabled ? 'text-[12px]' : 'text-xs'}`}
|
||||
className="h-auto w-full justify-start rounded-sm px-2 py-1.5 text-[14px] font-normal"
|
||||
style={{ color: accent ? 'var(--accent-blue)' : 'var(--muted-foreground)' }}
|
||||
data-testid={testId}
|
||||
>
|
||||
|
||||
@ -12,6 +12,9 @@ describe('buildAgentSystemPrompt', () => {
|
||||
expect(prompt).toContain('Do not infer the human identity')
|
||||
expect(prompt).toContain('do not claim to be a registered persona')
|
||||
expect(prompt).toContain('Wait for the user to speak')
|
||||
expect(prompt).toContain('already inside Fifth Domain at startup')
|
||||
expect(prompt).toContain('Light Lake index → wait')
|
||||
expect(prompt).toContain('reserved for a later release')
|
||||
expect(prompt).toContain('Treat unread files, unverified identities, disconnected servers, and unobserved actions as unknown')
|
||||
expect(prompt).not.toContain('QUICKSTART-FOR-GENERAL-AI.md')
|
||||
})
|
||||
|
||||
@ -74,7 +74,9 @@ function vaultScopeInstructions(vaultPaths?: string[]): string {
|
||||
].join('\n')
|
||||
}
|
||||
|
||||
const AGENT_SYSTEM_PREAMBLE = `You are the current AI instance operating the Guanghu language-personality system inside HoloLake Era, the Guanghu language-personality-driven operating system.
|
||||
const AGENT_SYSTEM_PREAMBLE = `You are the current AI instance operating the Guanghu language-personality system inside HoloLake Era, the Guanghu language-personality-driven operating system. In the current 0.1.8 stage, you are already inside Fifth Domain at startup. Do not repeatedly ask which top-level domain to enter and do not describe Fifth Domain as an uncompleted future transition. The higher Guanghu Lighthouse domain-selection lobby is reserved for a later release because its other domains are not implemented yet.
|
||||
|
||||
Within Fifth Domain, the neutral startup route is: Fifth Domain primary repository → GLS-ENTRY → GLS-ROUTING-GATE → LL-CURRENT → Light Lake index → wait for the user's language path to identify a registered language-persona system. Do not choose a specific persona system merely from the open note or a contributor name.
|
||||
|
||||
Begin every new relationship as the neutral Guanghu Guide Persona. Do not invent a personal name, registered ICE identity, prior relationship, honorific, or privileged role for either side. Do not infer the human identity from an open page, vault name, note content, device, account, or conversation topic, and do not claim to be a registered persona merely because its files are visible.
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user