@zhushanwen/pi-system-prompt-trace 0.1.6 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,12 +2,12 @@
2
2
 
3
3
  Session Trace 单元 1(留痕 extension)。system prompt 在 pi 中每次运行时动态重建、默认不落盘——本包在
4
4
  system prompt 确立或变化时向 session JSONL 追加留痕 entry,让「resume/reload/换配置前后 prompt 到底是什么」
5
- 可追溯(设计:`docs/page-design/session-trace/design.md` D2)。
5
+ 可追溯。
6
6
 
7
7
  ## 落盘格式
8
8
 
9
9
  ```ts
10
- appendEntry("xyz:system-prompt", {
10
+ appendEntry("taiji:system-prompt", {
11
11
  version: number; // session 内单调递增,首条 1
12
12
  hash: string; // sha256(fullText) 十六进制
13
13
  reason: "initial" | "resume" | "change";
@@ -31,7 +31,7 @@ appendEntry("xyz:system-prompt", {
31
31
  |---|---|---|
32
32
  | startup / new | initial | 定案 |
33
33
  | resume | resume | 定案 |
34
- | fork / reload | resume | 定案(M0 探针 P2 实测:fork 档读源文件最后留痕,落盘 reason 维持 resume;执行记录见设计 §6.5) |
34
+ | fork / reload | resume | 定案(fork 档读源文件最后留痕,落盘 reason 维持 resume) |
35
35
 
36
36
  存在 hash 基线(见下)且 prompt 未变时,首个 turn 不写(去重);需写时(hash 已变)恒写 `resume`(无论 session_start reason)。
37
37
 
@@ -39,13 +39,12 @@ appendEntry("xyz:system-prompt", {
39
39
 
40
40
  1. **进程内 resume(stash)**:`session_before_switch.targetSessionFile` 直读目标 session 文件,取最后一条留痕
41
41
  entry 的 hash/version/fullText。switch 会 teardown 并重建 extension runtime,该基线经模块级 stash 跨 runtime 传递。
42
- 2. **fork**:`session_start.previousSessionFile` 直读源 session 文件,取源文件最后一条留痕(D2 v5 定案——
43
- 常态 /fork 时点 fork 新文件未落盘,不可直读新文件;源文件缺失/未落盘/读取失败 → 视为无基线)。
42
+ 2. **fork**:`session_start.previousSessionFile` 直读源 session 文件,取源文件最后一条留痕(常态
43
+ /fork 时点 fork 新文件未落盘,不可直读新文件;源文件缺失/未落盘/读取失败 → 视为无基线)。
44
44
  3. **直读当前 session 文件**:`ctx.sessionManager.getSessionFile()` 直读 JSONL 最后一条留痕,覆盖 reload /
45
45
  重启直 spawn resume / new 兜底等没有 switch 事件的链路(文件不存在或无留痕 → 视为无基线)。
46
46
 
47
- 原第三档「自持久化小文件 system-prompt-trace-baseline.json」已随 ext-simplify-02 删除——终态唯一持久化源 =
48
- session JSONL 自身;存量文件成为无读写方孤儿,可安全手动删除(含 `*.tmp_*` 残留)。
47
+ 唯一持久化源 = session JSONL 自身。
49
48
 
50
49
  三档都 miss(无任何基线)时兜底必写:首个 turn 无论 session_start reason 必写一条——
51
50
  startup/new → `initial`,resume/fork/reload → `resume`(宁可多写不可漏记)。
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zhushanwen/pi-system-prompt-trace",
3
- "version": "0.1.6",
4
- "description": "System prompt trace extension: appends xyz:system-prompt entries to the session JSONL whenever the effective system prompt is established or changes",
3
+ "version": "0.1.8",
4
+ "description": "System prompt trace extension: appends taiji:system-prompt entries to the session JSONL whenever the effective system prompt is established or changes",
5
5
  "type": "module",
6
6
  "main": "index.ts",
7
7
  "keywords": [
@@ -17,7 +17,7 @@
17
17
  "src/**/*.ts",
18
18
  "README.md"
19
19
  ],
20
- "xyz-agent": {
20
+ "taiji": {
21
21
  "role": "taiji"
22
22
  },
23
23
  "pi": {
@@ -33,7 +33,8 @@
33
33
  "vitest": "^4.1.8"
34
34
  },
35
35
  "dependencies": {
36
- "@zhushanwen/pi-extension-logger": "0.6.0"
36
+ "@zhushanwen/pi-ext-guards": "0.4.1",
37
+ "@zhushanwen/pi-extension-logger": "0.6.1"
37
38
  },
38
39
  "scripts": {
39
40
  "typecheck": "npx tsc --noEmit",
package/src/baseline.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * readLastPromptFromSessionFile 是三档统一的读取入口:直读 session JSONL
6
6
  * (进程内 resume 的 targetSessionFile、fork 的 previousSessionFile、reload / 直启 resume
7
- * 的 getSessionFile() 目标文件),倒序找最后一条 xyz:system-prompt 留痕 entry。
7
+ * 的 getSessionFile() 目标文件),倒序找最后一条 taiji:system-prompt 留痕 entry。
8
8
  *
9
9
  * 所有函数不抛错:读失败返回 null——基线丢失的代价只是
10
10
  * 下次 resume 多写一条留痕(设计 D2 已接受),不允许影响 agent 主流程。
@@ -12,12 +12,14 @@
12
12
 
13
13
  import { readFileSync } from "node:fs";
14
14
 
15
- import { isRecord, isSystemPromptTraceEntryData, SYSTEM_PROMPT_CUSTOM_TYPE } from "./types.js";
15
+ import { isRecord } from "@zhushanwen/pi-ext-guards";
16
+
17
+ import { isSystemPromptTraceEntryData, SYSTEM_PROMPT_CUSTOM_TYPE } from "./types.js";
16
18
  import type { PromptBaseline } from "./types.js";
17
19
 
18
20
  /**
19
21
  * 解析单行 session JSONL 为留痕 entry data(运行时 guard;任何形状不符 / JSON 损坏返回 null)。
20
- * pi 落盘形状:{"type":"custom","customType":"xyz:system-prompt","data":{...},...}
22
+ * pi 落盘形状:{"type":"custom","customType":"taiji:system-prompt","data":{...},...}
21
23
  * (session-manager.ts:1122 appendCustomEntry)。
22
24
  */
23
25
  function parseTraceEntryData(line: string): { hash: string; version: number; fullText: string } | null {
package/src/types.ts CHANGED
@@ -5,15 +5,16 @@
5
5
  * 数据形状见 SystemPromptTraceEntryData。
6
6
  */
7
7
 
8
+ import { isRecord } from "@zhushanwen/pi-ext-guards";
8
9
  import type { SessionStartEvent } from "@earendil-works/pi-coding-agent";
9
10
 
10
- /** 留痕 entry 的 customType(xyz: 前缀 = xyz-agent 自定义命名空间)。 */
11
- export const SYSTEM_PROMPT_CUSTOM_TYPE = "xyz:system-prompt";
11
+ /** 留痕 entry 的 customType(taiji: 前缀 = taiji 自定义命名空间)。 */
12
+ export const SYSTEM_PROMPT_CUSTOM_TYPE = "taiji:system-prompt";
12
13
 
13
14
  /** 落盘 reason 枚举(initial/resume/change,对齐 DSH request/header 语义,设计 D2)。 */
14
15
  export type TraceReason = "initial" | "resume" | "change";
15
16
 
16
- /** appendEntry("xyz:system-prompt", data) 的 data 形状(设计 §5 单元 1)。 */
17
+ /** appendEntry("taiji:system-prompt", data) 的 data 形状(设计 §5 单元 1)。 */
17
18
  export interface SystemPromptTraceEntryData {
18
19
  /** session 内单调递增(首条 1;有基线时续接基线版本 +1)。 */
19
20
  version: number;
@@ -46,11 +47,6 @@ export interface SwitchStash {
46
47
  pending: PromptBaseline | null;
47
48
  }
48
49
 
49
- /** 运行时类型 guard(taste/no-unsafe-cast:断言必须有运行时 guard,这里干脆不用断言)。 */
50
- export function isRecord(value: unknown): value is Record<string, unknown> {
51
- return typeof value === "object" && value !== null;
52
- }
53
-
54
50
  /** 留痕 entry data 的运行时 guard(读 JSONL / 测试断言复用)。 */
55
51
  export function isSystemPromptTraceEntryData(value: unknown): value is SystemPromptTraceEntryData {
56
52
  if (!isRecord(value)) return false;