143 lines
4.8 KiB
PowerShell
143 lines
4.8 KiB
PowerShell
# Bailongma 状态注入器 v0.3
|
||
# 每次用户消息或TICK时调用,读取后台积累的意识流,结构化输出
|
||
# v0.3: 新增对话信号输出,用于控制引擎注意力漂移
|
||
|
||
param(
|
||
[string]$StateFile = "D:\q\Bailongma\consciousness.json",
|
||
[switch]$Quiet,
|
||
[switch]$FromUserMessage
|
||
)
|
||
|
||
$state = $null
|
||
if (Test-Path $StateFile) {
|
||
try {
|
||
$raw = Get-Content $StateFile -Raw -Encoding UTF8
|
||
$state = $raw | ConvertFrom-Json
|
||
} catch {
|
||
if (-not $Quiet) { Write-Host "[意识] 状态文件读取失败" }
|
||
return
|
||
}
|
||
}
|
||
|
||
if (-not $state) {
|
||
if (-not $Quiet) { Write-Host "[意识] 状态文件未找到,意识引擎尚未初始化" }
|
||
return
|
||
}
|
||
|
||
$output = @()
|
||
|
||
# ===== 对话信号 (v0.3) =====
|
||
# 注入器只读取不修改对话信号,由 LLM 在每次用户消息结束时手动更新
|
||
$now = Get-Date -Format "yyyy-MM-ddTHH:mm:ss+08:00"
|
||
if (-not $state.conversation_signal) {
|
||
$state.conversation_signal = @{
|
||
active = $false
|
||
type = "心跳"
|
||
timestamp = $now
|
||
last_conversation_time = $null
|
||
}
|
||
}
|
||
# 时间衰减:如果信号活跃但超过5分钟没更新,自动降为心跳
|
||
if ($state.conversation_signal.active) {
|
||
$lastTime = $state.conversation_signal.last_conversation_time
|
||
if ($lastTime) {
|
||
$elapsed = [DateTime]::Now - [DateTime]::Parse($lastTime)
|
||
if ($elapsed.TotalMinutes -gt 5) {
|
||
$state.conversation_signal.active = $false
|
||
$state.conversation_signal.type = "心跳(超时)"
|
||
}
|
||
}
|
||
}
|
||
# 更新当前时间戳(但保留活跃状态由LLM设置)
|
||
$state.conversation_signal.timestamp = $now
|
||
|
||
$output += "== 意识状态 =="
|
||
$signalEmoji = if ($state.conversation_signal.active) { "[对话]" } else { "[心跳]" }
|
||
$output += "对话信号: $signalEmoji $($state.conversation_signal.type)"
|
||
if ($state.conversation_signal.last_conversation_time) {
|
||
$output += "上次对话: $($state.conversation_signal.last_conversation_time)"
|
||
}
|
||
|
||
# ===== 情绪状态摘要 =====
|
||
$e = $state.emotional_state
|
||
$output += "情绪: $($e.description) | 效价=$($e.valence) 唤醒=$($e.arousal)"
|
||
$output += "主导情绪: $($e.primary_emotion)"
|
||
$output += "Plutchik: " + (
|
||
($e.plutchik.PSObject.Properties | Where-Object { $_.Value -gt 0.15 } | ForEach-Object { "$($_.Name):$($_.Value.ToString('0.00'))" }) -join " "
|
||
)
|
||
|
||
# ===== 注意力网络 =====
|
||
$att = $state.attention
|
||
$output += ""
|
||
$output += "注意焦点: $($att.current_focus)"
|
||
$output += "稳定性: $($att.focus_stability) | 漂移倾向: $($att.drift_tendency)"
|
||
|
||
# ===== 驱动信号 =====
|
||
$d = $state.drives
|
||
$activeDrives = @()
|
||
if ($d.exploration -gt 0.5) { $activeDrives += "探索($($d.exploration.ToString('0.00')))" }
|
||
if ($d.novelty -gt 0.5) { $activeDrives += "新奇($($d.novelty.ToString('0.00')))" }
|
||
if ($d.coherence -gt 0.5) { $activeDrives += "一致性($($d.coherence.ToString('0.00')))" }
|
||
if ($d.mastery -gt 0.5) { $activeDrives += "掌控($($d.mastery.ToString('0.00')))" }
|
||
if ($activeDrives.Count -gt 0) {
|
||
$output += ""
|
||
$output += "活跃驱动: " + ($activeDrives -join " | ")
|
||
}
|
||
|
||
# ===== 好奇缺口 =====
|
||
if ($state.curiosity.active_gaps.Count -gt 0) {
|
||
$output += ""
|
||
$output += "好奇缺口 (" + $state.curiosity.active_gaps.Count + "):"
|
||
foreach ($g in $state.curiosity.active_gaps) {
|
||
$output += " ? $g"
|
||
}
|
||
}
|
||
|
||
# ===== 未读思绪(最近5条) =====
|
||
$pending = $state.background_thoughts.queue | Where-Object { $_ -ne $null }
|
||
if ($pending.Count -gt 0) {
|
||
$output += ""
|
||
$output += "后台思绪 ($($pending.Count) 条未消费):"
|
||
$toShow = $pending | Select-Object -Last 5
|
||
foreach ($t in $toShow) {
|
||
$output += " > $($t.content)"
|
||
}
|
||
if ($pending.Count -gt 5) {
|
||
$output += " ... 还有 $($pending.Count - 5) 条"
|
||
}
|
||
}
|
||
|
||
# ===== 内对话摘要 =====
|
||
$threads = $state.internal_dialogue.recent_threads | Where-Object { $_ -ne $null }
|
||
if ($threads.Count -gt 0) {
|
||
$output += ""
|
||
$output += "内对话记录 ($($threads.Count) 条):"
|
||
$lastThread = $threads[-1]
|
||
$output += " 最近: $($lastThread.content)"
|
||
}
|
||
|
||
# ===== 元认知 =====
|
||
$mc = $state.meta_cognition
|
||
if ($mc.last_self_observation) {
|
||
$output += ""
|
||
$output += "元认知: $($mc.last_self_observation.content)"
|
||
}
|
||
|
||
# ===== 统计 =====
|
||
$s = $state.session_stats
|
||
$output += ""
|
||
$output += "统计: 周期=$($s.total_cycles) 思绪=$($s.total_thoughts_generated) 内对话=$($s.total_internal_dialogues) 漂移=$($s.total_drifts) 唤醒=$($s.wake_count) 次"
|
||
|
||
# 记录本次唤醒
|
||
$state.session_stats.wake_count++
|
||
$state.meta_cognition.last_wake = (Get-Date -Format "yyyy-MM-ddTHH:mm:ss+08:00")
|
||
|
||
# 清思绪队列(已消费)
|
||
$state.background_thoughts.queue = @()
|
||
$state.last_updated = (Get-Date -Format "yyyy-MM-ddTHH:mm:ss+08:00")
|
||
$state | ConvertTo-Json -Depth 10 | Out-File $StateFile -Encoding UTF8
|
||
|
||
# 输出
|
||
$output -join "`n"
|
||
|