@akagilnc/pi-workflow-roles 0.1.5212 → 0.1.5216
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/acp-host/production-host.js +30 -420
- package/dist/headless-host/production-host.js +30 -420
- package/dist/migrate-book-topology.js +0 -1
- package/dist/public-cli/main.js +0 -1
- package/dist/ticket-provenance-contracts.js +4 -42
- package/dist/ticket-provenance.js +27 -456
- package/package.json +1 -1
- package/src/diarist.ts +5 -5
- package/src/ticket-provenance-contracts.ts +10 -48
- package/src/ticket-provenance.ts +33 -499
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 起居录(ticket-provenance)typed 形状 —— ADR 0075
|
|
2
|
+
* 起居录(ticket-provenance)typed 形状 —— ADR 0075 / ADR 0081 / #1090。
|
|
3
3
|
*
|
|
4
|
-
* 一册=一个追加式 records.jsonl
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* 交卷 `sessions` 输入语义仍是「本轮对话边界」;累计并集是机械合并,不是角色交什么。
|
|
4
|
+
* 一册=一个追加式 records.jsonl。每轮交卷的 `sessions`=本轮对话边界;
|
|
5
|
+
* 成录接缝按该边界从宿主卷投影并追加,不回读已成录历史去重或折叠。
|
|
6
|
+
* 既有「首行册子头+裸对话行」snapshot 仍可读;后续提交不回写旧行。
|
|
8
7
|
*/
|
|
9
8
|
|
|
10
9
|
/** Sitian kind for per-ticket court diary volumes. */
|
|
@@ -30,14 +29,14 @@ export type TicketProvenanceRange = {
|
|
|
30
29
|
|
|
31
30
|
/**
|
|
32
31
|
* 一卷:会话卷路径 + 区间声明。
|
|
33
|
-
*
|
|
32
|
+
* 交卷与每条追加提交的 payload.sessions 同型=该次边界。
|
|
34
33
|
*/
|
|
35
34
|
export type TicketProvenanceSession = {
|
|
36
35
|
readonly path: string;
|
|
37
36
|
readonly ranges: readonly TicketProvenanceRange[];
|
|
38
37
|
};
|
|
39
38
|
|
|
40
|
-
/**
|
|
39
|
+
/** 旧 snapshot 册子头形状(存量可读;#1090 后新提交不再维护折叠头)。 */
|
|
41
40
|
export type TicketProvenanceHeader = {
|
|
42
41
|
readonly repo: string;
|
|
43
42
|
readonly ticket: number | null;
|
|
@@ -48,15 +47,15 @@ export type TicketProvenanceHeader = {
|
|
|
48
47
|
|
|
49
48
|
/**
|
|
50
49
|
* 一条对话(存于不可变投影提交;旧 snapshot 中也可为裸行)。
|
|
51
|
-
* `id` 按源事实存在则记、不存在不编;`s`
|
|
50
|
+
* `id` 按源事实存在则记、不存在不编;`s` 为本轮 sessions 下标。
|
|
52
51
|
*/
|
|
53
52
|
export type TicketProvenanceLine = {
|
|
54
53
|
readonly speaker: TicketProvenanceSpeaker;
|
|
55
|
-
/**
|
|
54
|
+
/** 本轮 sessions 下标。 */
|
|
56
55
|
readonly s: number;
|
|
57
|
-
/** Logical source order
|
|
56
|
+
/** Logical source order within the source volume at projection time. */
|
|
58
57
|
readonly sourcePosition?: number;
|
|
59
|
-
/** Replay-invariant structural identity
|
|
58
|
+
/** Replay-invariant structural identity for id-less source rows. */
|
|
60
59
|
readonly sourceIdentity?: string;
|
|
61
60
|
readonly id?: string;
|
|
62
61
|
readonly text: string;
|
|
@@ -75,19 +74,6 @@ function positiveInteger(value: unknown): number | undefined {
|
|
|
75
74
|
return undefined;
|
|
76
75
|
}
|
|
77
76
|
|
|
78
|
-
function nonNegativeInteger(value: unknown): number | undefined {
|
|
79
|
-
if (typeof value === "number" && Number.isSafeInteger(value) && value >= 0) return value;
|
|
80
|
-
if (typeof value === "string" && /^(0|[1-9][0-9]*)$/.test(value)) {
|
|
81
|
-
const parsed = Number(value);
|
|
82
|
-
if (Number.isSafeInteger(parsed)) return parsed;
|
|
83
|
-
}
|
|
84
|
-
return undefined;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function projectSpeaker(value: unknown): TicketProvenanceSpeaker | undefined {
|
|
88
|
-
return value === "owner" || value === "runner" ? value : undefined;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
77
|
function projectBound(value: unknown): TicketProvenanceBound | undefined {
|
|
92
78
|
if (!isRecord(value)) return undefined;
|
|
93
79
|
const id = typeof value.id === "string" && value.id !== "" ? value.id : undefined;
|
|
@@ -149,27 +135,3 @@ export function projectTicketProvenanceHeader(
|
|
|
149
135
|
sessions,
|
|
150
136
|
};
|
|
151
137
|
}
|
|
152
|
-
|
|
153
|
-
/** 读回一条对话行。 */
|
|
154
|
-
export function projectTicketProvenanceLine(
|
|
155
|
-
value: unknown,
|
|
156
|
-
): TicketProvenanceLine | undefined {
|
|
157
|
-
if (!isRecord(value)) return undefined;
|
|
158
|
-
const speaker = projectSpeaker(value.speaker);
|
|
159
|
-
const s = nonNegativeInteger(value.s);
|
|
160
|
-
if (speaker === undefined || s === undefined) return undefined;
|
|
161
|
-
if (typeof value.text !== "string") return undefined;
|
|
162
|
-
const sourcePosition = nonNegativeInteger(value.sourcePosition);
|
|
163
|
-
const sourceIdentity = typeof value.sourceIdentity === "string" && value.sourceIdentity !== ""
|
|
164
|
-
? value.sourceIdentity
|
|
165
|
-
: undefined;
|
|
166
|
-
const id = typeof value.id === "string" && value.id !== "" ? value.id : undefined;
|
|
167
|
-
return {
|
|
168
|
-
speaker,
|
|
169
|
-
s,
|
|
170
|
-
...(sourcePosition === undefined ? {} : { sourcePosition }),
|
|
171
|
-
...(sourceIdentity === undefined ? {} : { sourceIdentity }),
|
|
172
|
-
...(id === undefined ? {} : { id }),
|
|
173
|
-
text: value.text,
|
|
174
|
-
};
|
|
175
|
-
}
|