@thread-memory/core 1.3.0 → 1.5.0

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/dist/index.d.ts CHANGED
@@ -5,6 +5,8 @@ export * from "./store.js";
5
5
  export * from "./assets.js";
6
6
  export * from "./closing.js";
7
7
  export * from "./handoff.js";
8
+ export * from "./panel.js";
9
+ export * from "./receipt.js";
8
10
  export * from "./behavior-contract.js";
9
11
  export * from "./delta.js";
10
12
  export * from "./nav.js";
package/dist/index.js CHANGED
@@ -9,6 +9,8 @@ export * from "./store.js";
9
9
  export * from "./assets.js";
10
10
  export * from "./closing.js";
11
11
  export * from "./handoff.js";
12
+ export * from "./panel.js";
13
+ export * from "./receipt.js";
12
14
  export * from "./behavior-contract.js";
13
15
  export * from "./delta.js";
14
16
  export * from "./nav.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAyB,CAAC;AAE/D,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;AACrD,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAyB,CAAC;AAE/D,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;AACrD,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ThreadStore } from "./store.js";
2
+ export interface PanelOptions {
3
+ sessionId: string;
4
+ projectKey?: string;
5
+ limit?: number;
6
+ }
7
+ export declare function renderPanel(store: ThreadStore, opts: PanelOptions): string;
package/dist/panel.js ADDED
@@ -0,0 +1,60 @@
1
+ import { queryEvents } from "./query.js";
2
+ import { lastInjection } from "./receipt.js";
3
+ const clip = (text, max) => (text.length <= max ? text : `${text.slice(0, max)}…`);
4
+ // 只读面板(P0-0):目标 / 决策链(含取代关系)/ 未决 / 交接 / 最近事件。
5
+ // 纯文本、底座无关——同一个渲染器给命令、MCP 工具、演示脚本共用。
6
+ export function renderPanel(store, opts) {
7
+ const limit = opts.limit ?? 5;
8
+ const lines = ["[Thread 面板]"];
9
+ const goals = store.getActiveGoals(opts.sessionId);
10
+ lines.push("", `目标(${goals.length}):`);
11
+ if (goals.length === 0)
12
+ lines.push(" - (无进行中目标)");
13
+ for (const goal of goals.slice(0, limit))
14
+ lines.push(` - #${goal.id} ${clip(goal.text, 100)}`);
15
+ const active = store.getActiveDecisions(opts.sessionId);
16
+ const superseded = store.getDecisions(opts.sessionId, "superseded");
17
+ lines.push("", `决策链(生效 ${active.length} · 已被取代 ${superseded.length}):`);
18
+ if (active.length === 0)
19
+ lines.push(" - (无生效决策)");
20
+ for (const row of active.slice(0, limit))
21
+ lines.push(` - #${row.id} ${clip(row.text, 100)}`);
22
+ for (const row of superseded.slice(0, limit)) {
23
+ const to = row.superseded_by === null ? "?" : `#${row.superseded_by}`;
24
+ lines.push(` - #${row.id} [superseded → ${to}] ${clip(row.text, 80)}`);
25
+ }
26
+ const proposed = store.getDecisions(opts.sessionId, "proposed");
27
+ const pending = store.pendingCount({ sessionId: opts.sessionId });
28
+ lines.push("", `未决(候选 ${pending} · proposed ${proposed.length}):`);
29
+ if (pending === 0 && proposed.length === 0)
30
+ lines.push(" - (无)");
31
+ for (const row of proposed.slice(0, limit))
32
+ lines.push(` - #${row.id} ${clip(row.text, 90)}(proposed)`);
33
+ const receipt = lastInjection(store, opts.sessionId);
34
+ lines.push("", "本轮注入:");
35
+ lines.push(receipt === undefined ? " - (本会话还没有注入记录)" : ` - ${receipt.ts} [${receipt.kind}] ${clip(receipt.summary, 120)}`);
36
+ const handoffs = store.listHandoffs({ status: undefined, limit: limit * 2 });
37
+ const live = handoffs.filter((h) => h.status !== "ack");
38
+ lines.push("", `交接(未确认 ${live.length}):`);
39
+ if (live.length === 0)
40
+ lines.push(" - (无)");
41
+ for (const row of live.slice(0, limit)) {
42
+ let goal = "";
43
+ try {
44
+ goal = String(JSON.parse(row.brief_json).goal ?? "");
45
+ }
46
+ catch {
47
+ goal = "";
48
+ }
49
+ const target = row.to_role === null ? "project" : row.to_role;
50
+ lines.push(` - #${row.id} [${row.status}] ${clip(goal, 70)}(from ${row.from_session} · to ${target})`);
51
+ }
52
+ const events = queryEvents(store, { sessionId: opts.sessionId, order: "desc", limit: limit }).results;
53
+ lines.push("", `最近事件(${events.length}):`);
54
+ if (events.length === 0)
55
+ lines.push(" - (无)");
56
+ for (const event of events)
57
+ lines.push(` - ${event.ts} ${event.kind} ${clip(event.body, 80)}`);
58
+ return lines.join("\n");
59
+ }
60
+ //# sourceMappingURL=panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.js","sourceRoot":"","sources":["../src/panel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ThreadStore } from "./store.js";
2
+ export interface InjectionReceipt {
3
+ kind: "status-card" | "handoff" | "anchor";
4
+ summary: string;
5
+ ts: string;
6
+ }
7
+ export declare function recordInjection(store: ThreadStore, sessionId: string, entry: Omit<InjectionReceipt, "ts"> & {
8
+ ts?: string;
9
+ }): void;
10
+ export declare function lastInjection(store: ThreadStore, sessionId: string): InjectionReceipt | undefined;
@@ -0,0 +1,22 @@
1
+ const key = (sessionId) => `injection:${sessionId}`;
2
+ // 「本轮注入了什么」回执(P0-0):只记摘要与时间,不存注入正文——
3
+ // 回执用于让人/编排器确认"这一刻喂给模型的是什么",正文仍在事件流水与渲染器里。
4
+ export function recordInjection(store, sessionId, entry) {
5
+ const receipt = { ...entry, ts: entry.ts ?? new Date().toISOString() };
6
+ store.setMeta(key(sessionId), JSON.stringify(receipt));
7
+ }
8
+ export function lastInjection(store, sessionId) {
9
+ const raw = store.getMeta(key(sessionId));
10
+ if (raw === undefined)
11
+ return undefined;
12
+ try {
13
+ const parsed = JSON.parse(raw);
14
+ if (typeof parsed.kind !== "string" || typeof parsed.summary !== "string")
15
+ return undefined;
16
+ return { kind: parsed.kind, summary: parsed.summary, ts: parsed.ts ?? "" };
17
+ }
18
+ catch {
19
+ return undefined;
20
+ }
21
+ }
22
+ //# sourceMappingURL=receipt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipt.js","sourceRoot":"","sources":["../src/receipt.ts"],"names":[],"mappings":"AAQA,MAAM,GAAG,GAAG,CAAC,SAAiB,EAAU,EAAE,CAAC,aAAa,SAAS,EAAE,CAAC;AAEpE,qCAAqC;AACrC,2CAA2C;AAC3C,MAAM,UAAU,eAAe,CAAC,KAAkB,EAAE,SAAiB,EAAE,KAAqD;IAC1H,MAAM,OAAO,GAAqB,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IACzF,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAkB,EAAE,SAAiB;IACjE,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1C,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA8B,CAAC;QAC5D,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC5F,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAgC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;IACzG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thread-memory/core",
3
- "version": "1.3.0",
3
+ "version": "1.5.0",
4
4
  "description": "Thread core: event pipeline, structured tables, lineage graph, retrieval",
5
5
  "license": "MIT",
6
6
  "type": "module",