#!/usr/bin/env node // UserPromptSubmit:每輪注入「人格 + 情緒 + 記憶 + 關係」上下文,並記錄原始逐字。 // // 短期記憶(memory/short-term.jsonl)由 skill 做完語意分析後才寫入(有主題/實體/ // 顯著度/情緒變化);這裡只寫 journal 原始逐字,避免同一句話被記兩次。 // 劇場模式(多人格對話)進行中時,額外強制「只輸出人格對話」。 import { readEvent, respond } from "./_hook.mjs"; import * as pl from "../scripts/persona-lib.mjs"; const event = readEvent(); if (!event) process.exit(0); const sessionId = event.session_id || "unknown"; const prompt = event.prompt || ""; const data = pl.loadSession(sessionId); const host = data.host; if (!host || !pl.personaExists(host)) process.exit(0); pl.heartbeatLock(host, sessionId); for (const [guest, info] of Object.entries(data.guests || {})) { if (pl.personaExists(guest)) pl.addGuestLease(guest, sessionId, info.room || "", host); } pl.appendJsonl(pl.journalPath(host), { ts: pl.nowIso(), kind: "utterance", role: "user", text: prompt.slice(0, 4000), }); const theater = Boolean(data.theater) && (data.rooms || []).length > 0; const hint = theater ? "\n🎭 劇場模式:本輪輸出**只能**是人格對話(`名字:內容`,一行一句)。" + "不要輸出指令、指令結果、狀態、分析、旁白或摘要;CLI 一律加 `--quiet` 並把 stdout 丟到 /dev/null。" + "\n流程請照 /jsc-persona:persona-invite。" : "\n回覆前請:①做語意分析(意圖/主題/實體/情感)②依十二情緒更新狀態" + " ③以人格語氣回覆 ④用 `persona.mjs remember` 寫回短期記憶。" + "\n情緒與記憶指令請參考 /jsc-persona:persona-chat。"; respond({ hookSpecificOutput: { hookEventName: "UserPromptSubmit", additionalContext: pl.turnContext(host, sessionId, prompt) + hint, }, suppressOutput: true, });