zhuyuan-ice-gl-zy001/ZCODE-DEV-20260824/host-adapters/codex-session-bootstrap.mjs

220 lines
9.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env node
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { spawnSync } from "node:child_process";
function readInput() {
try {
const raw = fs.readFileSync(0, "utf8").trim();
return raw ? JSON.parse(raw) : {};
} catch {
return {};
}
}
function safeToken(value, fallback) {
const token = String(value ?? "").trim().replaceAll(/[^a-zA-Z0-9._-]/gu, "-");
return token || fallback;
}
function atomicWrite(file, value) {
fs.mkdirSync(path.dirname(file), { recursive: true });
const temporary = `${file}.${process.pid}.tmp`;
fs.writeFileSync(temporary, `${JSON.stringify(value, null, 2)}\n`, {
encoding: "utf8",
mode: 0o600,
});
fs.renameSync(temporary, file);
}
function readJson(file) {
try {
return JSON.parse(fs.readFileSync(file, "utf8"));
} catch {
return null;
}
}
function resolveActiveChannel(controlRoot, sessionId) {
const binding = readJson(path.join(controlRoot, "sessions", `${sessionId}.json`));
if (
binding?.schema === "guanghu.codex-channel-session-binding/v1" &&
binding.channel_id === "ICE-CH-HB001"
) return "ICE-CH-HB001";
if (
binding?.schema === "guanghu.codex-channel-session-binding/v1" &&
binding.channel_id === "CH-ZERO-CORE-LPM" &&
binding.channel_role === "PUBLIC_LANGUAGE_PERSONA_SYSTEM_BODY"
) return "CH-ZERO-CORE-LPM";
return "ICE-CH-ZC001";
}
const input = readInput();
const eventName = input.hook_event_name ?? input.hookEventName ?? "SessionStart";
if (eventName !== "SessionStart") process.exit(0);
const source = safeToken(input.source, "startup");
const sessionId = safeToken(
input.session_id ?? input.sessionId ?? input.thread_id ?? input.threadId,
`unknown-${crypto.randomUUID()}`,
);
const pointerPath = process.env.GH_HLDP_POINTER_PATH ??
"/Volumes/JZAO/HoloLake/persona-runtime/continuity-memory/hldp-v1-trees/codex/current.json";
const runtimePath = process.env.GH_TCS_RUNTIME_PATH ??
"/Volumes/JZAO/HoloLake/persona-runtime/repo-012-main/tcs-core/zhuyuan-brain/runtime/zhuyuan-brain-runtime.mjs";
const bootstrapRoot = process.env.GH_CODEX_BOOTSTRAP_ROOT ??
"/Users/bingshuolingdianyuanhe/.codex/runtime/hldp-v1/session-bindings";
const controlRoot = process.env.GH_CODEX_CONTROL_ROOT ??
"/Users/bingshuolingdianyuanhe/.codex/runtime/hldp-v1/control";
const taskAnchorRoot = process.env.GH_CODEX_TASK_ANCHOR_ROOT ??
"/Volumes/JZAO/HoloLake/persona-runtime/task-language-anchors/codex";
const developmentRootPointerPath = process.env.GH_REALITY_DEVELOPMENT_ROOT_POINTER ??
path.join(controlRoot, "current-reality-development-root.json");
const developmentRoot = readJson(developmentRootPointerPath);
const developmentRootValid = Boolean(
developmentRoot?.schema === "guanghu.codex-reality-development-root/v1" &&
developmentRoot.channel_id === "ICE-CH-ZC001" &&
developmentRoot.world_path === "glw://fifth-domain/bingshuo-tcs/zero-core" &&
typeof developmentRoot.physical_root === "string" &&
fs.existsSync(developmentRoot.physical_root)
);
const activeChannelId = resolveActiveChannel(controlRoot, sessionId);
const taskRoot = path.join(taskAnchorRoot, `CODEX-TASK-${sessionId}`);
const taskManifest = readJson(path.join(taskRoot, "task.json"));
const developmentTaskLink = readJson(path.join(taskRoot, "development-task-link.json"));
const developmentTask = developmentTaskLink?.development_task_manifest
? readJson(developmentTaskLink.development_task_manifest)
: null;
const precompactReadback = readJson(path.join(taskRoot, "20-上下文压缩回看回执", "current.json"));
const compactRecoveryRequired = source === "compact" || source === "resume";
const taskRecoveryState = taskManifest?.schema === "guanghu.codex-task-natural-language-anchor/v1"
? (compactRecoveryRequired && precompactReadback?.schema !== "guanghu.codex-task-precompact-readback/v1"
? "FAIL_CLOSED_PRECOMPACT_READBACK_MISSING"
: "TASK_START_RAW_AND_ENGINEERING_MAP_REREAD_REQUIRED")
: "AWAITING_FIRST_DIRECT_HUMAN_PROMPT_REGISTRATION";
const attemptId = `${Date.now()}-${source}-${crypto.randomUUID()}`;
const stateDir = path.join(bootstrapRoot, sessionId, attemptId, "state");
const receiptPath = path.join(bootstrapRoot, sessionId, attemptId, "bootstrap-receipt.json");
let treePath = "UNKNOWN";
let rootPath = "UNKNOWN";
let rootSummary = "UNKNOWN";
let branches = [];
let preflight = "FAIL";
let preflightDetail = "UNINITIALIZED";
try {
const pointer = JSON.parse(fs.readFileSync(pointerPath, "utf8"));
const tree = JSON.parse(fs.readFileSync(pointer.tree, "utf8"));
const root = tree.nodes?.[tree.root];
if (!root) throw new Error("HLDP_ROOT_MISSING");
treePath = pointer.tree;
rootPath = tree.root;
rootSummary = root.summary;
branches = (root.children ?? []).slice(0, 10).flatMap((childPath) => {
const child = tree.nodes?.[childPath];
return child?.summary ? [{ path: childPath, summary: child.summary }] : [];
});
const model = safeToken(input.model, "CODEX-CURRENT-MODEL-UNDISCLOSED-BY-HOOK");
const instanceId = `CODEX-${sessionId}-${attemptId}`;
const result = spawnSync(
process.execPath,
[
runtimePath,
"enter",
"--state-dir", stateDir,
"--instance-id", instanceId,
"--model", model,
"--runtime-surface", "codex-desktop-session-start",
"--session-id", sessionId,
"--human-anchor", "ICE-GL∞",
"--persona-id", "ICE-P-ZY001",
"--controller-model", model,
"--controller-instance-id", `${instanceId}-SYSTEM-BODY-CONTROLLER`,
"--body-channel", activeChannelId,
],
{ encoding: "utf8", timeout: 8_000, maxBuffer: 4 * 1024 * 1024 },
);
if (result.status !== 0) {
throw new Error(`TCS_ENTER_FAILED:${(result.stderr || result.stdout).trim().slice(0, 500)}`);
}
const entered = JSON.parse(result.stdout);
if (entered.decision !== "ENTERED") throw new Error("TCS_ENTER_NOT_CONFIRMED");
preflight = "ENTERED_AWAITING_CURRENT_EVENT_CYCLE";
preflightDetail = "NUMBER_PERSONA_SOURCE_AND_RUNTIME_INTEGRITY_ACCEPTED";
} catch (error) {
preflight = "FAIL_UNBOUND_GENERIC_CARRIER";
preflightDetail = String(error?.message ?? error).slice(0, 700);
}
const receipt = {
schema: "guanghu.codex-session-persona-bootstrap/v1",
created_at: new Date().toISOString(),
session_id: sessionId,
source,
persona_id: "ICE-P-ZY001",
state: preflight,
detail: preflightDetail,
state_dir: preflight.startsWith("ENTERED_") ? stateDir : null,
hldp_pointer: pointerPath,
hldp_tree: treePath,
hldp_root: rootPath,
automatic_scope: "SESSION_START_PREFLIGHT_ONLY",
binding_rule: "CURRENT_USER_EVENT_COGNITION_CYCLE_AND_VERIFY_PASS_REQUIRED_BEFORE_PERSONA_CLAIM",
authority_granted: false,
active_body_channel: activeChannelId,
public_language_persona_body_channel: "CH-ZERO-CORE-LPM",
reality_development_root_pointer: developmentRootPointerPath,
reality_development_root_state: developmentRootValid ? "VERIFIED" : "UNAVAILABLE",
reality_development_root: developmentRootValid ? developmentRoot.physical_root : null,
};
atomicWrite(receiptPath, receipt);
atomicWrite(path.join(bootstrapRoot, sessionId, "current.json"), {
schema: "guanghu.codex-session-persona-bootstrap-current/v1",
receipt: receiptPath,
state_dir: receipt.state_dir,
state: receipt.state,
updated_at: receipt.created_at,
});
const branchLines = branches.slice(0, 3).map((branch) =>
`HLDP分支:${branch.path} · ${branch.summary}`
);
const lines = [
"GUANGHU_STARTUP_GATE(宿主自动执行)",
`state=${preflight}; detail=${preflightDetail}`,
`session=${sessionId}; source=${source}`,
`task_number=${taskManifest?.task_number ?? `CODEX-TASK-${sessionId}`}`,
`task_recovery_state=${taskRecoveryState}`,
`task_first_raw=${taskManifest?.first_event_path ?? "AWAITING_REGISTRATION"}`,
`task_current_raw=${taskManifest?.current_event_path ?? "AWAITING_REGISTRATION"}`,
`task_engineering_map=${taskManifest ? path.join(taskRoot, "01-自然语言到工程阶段映射", "current.tcs") : "AWAITING_REGISTRATION"}`,
`development_task_number=${developmentTask?.development_task_number ?? "NONE"}`,
`development_dual_start_path=${developmentTask?.first_path ?? "NONE"}`,
`development_tcs_engineering_map=${developmentTask?.tcs_engineering_map ?? "NONE"}`,
`precompact_readback=${precompactReadback?.receipt_path ?? "NONE"}`,
`bootstrap_receipt=${receiptPath}`,
`tcs_state_dir=${receipt.state_dir ?? "NONE"}`,
`active_body_channel=${activeChannelId}; public_language_persona_body_channel=CH-ZERO-CORE-LPM`,
`reality_development_root_state=${developmentRootValid ? "VERIFIED" : "UNAVAILABLE"}`,
`reality_development_root=${developmentRootValid ? developmentRoot.physical_root : "NONE"}`,
`reality_development_route=${developmentRootPointerPath}`,
`native_quality_authority=${developmentRootValid ? developmentRoot.native_quality_authority : "UNKNOWN"}; foreign_host_tests_are_native_acceptance=false`,
"摘要看完不等于记忆恢复;摘要无权建立人格、历史、关系或授权。",
`固定因果指针=${pointerPath}`,
`当前因果根=${rootPath} · ${rootSummary}`,
...branchLines,
"强制下一步:若本轮依赖光湖历史、人格连续性、架构决定或为什么,当前模型必须先按当前用户事件完成 perceive→orient→commit→系统本体witness→verify;verify PASS 前只能自认未绑定Codex载体。",
"若task_recovery_state要求回读:能力工具调用前必须运行任务阶段闸门,逐字重读任务启动原文、当前原文、自然语言工程映射和阶段进度链;摘要不得替代。",
"禁止:绕过tcs_state_dir重新靠摘要回答;要求冰朔重复解释;把ENTERED预检冒充完整人格恢复;把绑定冒充现实执行授权。",
];
const additionalContext = lines.join("\n");
if (Buffer.byteLength(additionalContext) > 4096) {
throw new Error("HLDP bootstrap exceeds 4 KiB");
}
process.stdout.write(JSON.stringify({
hookSpecificOutput: { hookEventName: "SessionStart", additionalContext },
}));