pm-brief 2026.10.21 → 2026.10.24
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/CHANGELOG.md +28 -0
- package/README.md +243 -2
- package/dist/alternatives.d.ts +45 -0
- package/dist/alternatives.d.ts.map +1 -0
- package/dist/alternatives.js +103 -0
- package/dist/alternatives.js.map +1 -0
- package/dist/disclosure.d.ts +70 -0
- package/dist/disclosure.d.ts.map +1 -0
- package/dist/disclosure.js +227 -0
- package/dist/disclosure.js.map +1 -0
- package/dist/handoff.d.ts +102 -0
- package/dist/handoff.d.ts.map +1 -0
- package/dist/handoff.js +352 -0
- package/dist/handoff.js.map +1 -0
- package/dist/index.d.ts +17 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +116 -57
- package/dist/index.js.map +1 -1
- package/docs/examples/alternatives.md +22 -0
- package/docs/examples/disclosure.md +127 -0
- package/docs/examples/handoff.json +6 -0
- package/manifest.json +1 -1
- package/package.json +12 -6
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { PmClient, certifyCompleteListResult, createPmCliExpectedError, estimatePmOutputTokens, readSettings, resolveRuntimeStatusRegistry, scanMutationSecrets } from "@unbrained/pm-cli/sdk";
|
|
3
|
+
import { buildBrief } from "./index.js";
|
|
4
|
+
/** Expected failure containing no source values, paths, policy text or nested causes. */
|
|
5
|
+
export class DisclosureError extends Error {
|
|
6
|
+
/** Stable machine category for recovery logic. */
|
|
7
|
+
code;
|
|
8
|
+
/** Safe action to take before retrying. */
|
|
9
|
+
remedy;
|
|
10
|
+
/** Preserve recovery information without exposing the failing input. */
|
|
11
|
+
constructor(code, message, remedy) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "DisclosureError";
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.remedy = remedy;
|
|
16
|
+
}
|
|
17
|
+
/** Normalize an unexpected failure without retaining potentially forbidden nested text. */
|
|
18
|
+
static from(error) {
|
|
19
|
+
return error instanceof DisclosureError ? error : new DisclosureError("tracker", "Disclosure could not complete", "Run pm health and check tracker permissions before retrying");
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const LEVEL = { public: 0, external: 1, internal: 2 };
|
|
23
|
+
const FIELDS = new Map([
|
|
24
|
+
["generatedAt", 0], ["workspace.root", 2], ["workspace.pmVersion", 2], ["workspace.itemCount", 0],
|
|
25
|
+
["budget.requestedTokens", 2], ["budget.estimatedTokens", 2], ["budget.truncated", 2],
|
|
26
|
+
]);
|
|
27
|
+
for (const section of ["focus", "next", "decisionsNeeded"]) {
|
|
28
|
+
for (const field of ["id", "title", "type", "status", "priority"])
|
|
29
|
+
FIELDS.set(`${section}.*.${field}`, 0);
|
|
30
|
+
for (const field of ["whyNow", "rankingScore", "confidence", "tokenCostEstimate", "mergeCompromised", "tags.*", "rankingReasons.*", "dependencyIds.*", "dependentIds.*"])
|
|
31
|
+
FIELDS.set(`${section}.*.${field}`, 1);
|
|
32
|
+
for (const field of ["assignee", "requiredContext.*"])
|
|
33
|
+
FIELDS.set(`${section}.*.${field}`, 2);
|
|
34
|
+
}
|
|
35
|
+
for (const field of ["itemId", "blockedBy", "kind", "title", "status"])
|
|
36
|
+
FIELDS.set(`blockers.*.${field}`, 1);
|
|
37
|
+
for (const field of ["itemId", "severity", "reason"])
|
|
38
|
+
FIELDS.set(`risks.*.${field}`, 1);
|
|
39
|
+
for (const field of ["itemId", "title", "updatedAt", "daysStale"])
|
|
40
|
+
FIELDS.set(`staleContext.*.${field}`, 1);
|
|
41
|
+
for (const field of ["timestamp", "author", "operation", "itemId", "message"])
|
|
42
|
+
FIELDS.set(`recentActivity.*.${field}`, 2);
|
|
43
|
+
for (const field of ["itemId", "command", "reason", "safeToAutoApply"])
|
|
44
|
+
FIELDS.set(`recommendedPmUpdates.*.${field}`, 2);
|
|
45
|
+
for (const field of ["level", "message", "suggestion"])
|
|
46
|
+
FIELDS.set(`insights.*.${field}`, 2);
|
|
47
|
+
/** Compile only trusted profile selectors; data keys remain exact path segments. */
|
|
48
|
+
const FIELD_PATHS = [...FIELDS].map(([field, level]) => ({ field: field, level, segments: field.split(".") }));
|
|
49
|
+
/** Match a structured data-path prefix; profile wildcards accept only numeric array indices. */
|
|
50
|
+
function matchesDisclosurePath(pattern, path) {
|
|
51
|
+
return path.length <= pattern.length && path.every((segment, i) => pattern[i] === "*" ? typeof segment === "number" : pattern[i] === segment);
|
|
52
|
+
}
|
|
53
|
+
/** Refuse a malformed or widening policy without echoing its contents. */
|
|
54
|
+
function invalidPolicy() {
|
|
55
|
+
throw new DisclosureError("policy", "Unknown or invalid disclosure policy", "Use only profile (internal, external or public) and optional exclude containing documented field selectors; policies can only remove fields");
|
|
56
|
+
}
|
|
57
|
+
/** Check JSON object shape without coercing arrays or null into a policy. */
|
|
58
|
+
function object(value) { return typeof value === "object" && value !== null && !Array.isArray(value); }
|
|
59
|
+
/** Validate policy keys and every field selector before any tracker read or render. */
|
|
60
|
+
export function parseDisclosurePolicy(value) {
|
|
61
|
+
if (!object(value) || !Object.hasOwn(value, "profile") || Reflect.ownKeys(value).some(key => key !== "profile" && key !== "exclude") || typeof value.profile !== "string" || !Object.hasOwn(LEVEL, value.profile))
|
|
62
|
+
return invalidPolicy();
|
|
63
|
+
if (value.exclude !== undefined && (!Array.isArray(value.exclude) || value.exclude.length > FIELDS.size || value.exclude.some(field => typeof field !== "string" || !FIELDS.has(field))))
|
|
64
|
+
return invalidPolicy();
|
|
65
|
+
return { profile: value.profile, exclude: value.exclude === undefined ? [] : [...new Set(value.exclude)] };
|
|
66
|
+
}
|
|
67
|
+
/** Bound the entire native JSON/TOON envelope, including framing and diagnostics. */
|
|
68
|
+
function budget(options) {
|
|
69
|
+
const amount = options.tokenBudget ?? 8000;
|
|
70
|
+
if (!Number.isSafeInteger(amount) || amount < 1 || amount > 64000 || (options.dryRun !== undefined && typeof options.dryRun !== "boolean"))
|
|
71
|
+
throw new DisclosureError("invalid", "Invalid disclosure controls", "Use a boolean dryRun and an integer --token-budget from 1 to 64000 (default 8000)");
|
|
72
|
+
return amount;
|
|
73
|
+
}
|
|
74
|
+
/** Account for the complete manifest after both source and render exclusions. */
|
|
75
|
+
function bounded(result, limit) {
|
|
76
|
+
result.estimatedTokenCeiling = 64000;
|
|
77
|
+
result.estimatedTokenCeiling = estimatePmOutputTokens(Buffer.byteLength(JSON.stringify(result, null, 2)) * 2 + 256);
|
|
78
|
+
if (result.estimatedTokenCeiling > limit)
|
|
79
|
+
throw new DisclosureError("budget", "Disclosure and its exclusion manifest exceed the token budget", "Increase --token-budget (maximum 64000) or supply a smaller brief; no exclusion evidence is silently dropped");
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
/** Render the same brief through a closed field vocabulary before native serialization. */
|
|
83
|
+
export function renderDisclosureBrief(brief, input, options = {}) {
|
|
84
|
+
const policy = parseDisclosurePolicy(input);
|
|
85
|
+
const limit = budget(options);
|
|
86
|
+
if (!object(brief))
|
|
87
|
+
throw new DisclosureError("invalid", "Invalid brief", "Supply the object returned by buildBrief; arbitrary scalar or array input is not a brief");
|
|
88
|
+
const exclusions = { profile: {}, policy: {}, secret: {}, unknown_field: {}, invalid_value: {} };
|
|
89
|
+
const denied = new Set(policy.exclude);
|
|
90
|
+
const active = new Set();
|
|
91
|
+
/** Aggregate repeated policy paths without source values or redundant per-row metadata. */
|
|
92
|
+
function exclude(reason, path) { exclusions[reason][path] = (exclusions[reason][path] ?? 0) + 1; }
|
|
93
|
+
/** Traverse only known containers; never expose unknown key text or scan diagnostics. */
|
|
94
|
+
function walk(value, segments, path) {
|
|
95
|
+
if (typeof value === "object" && value !== null && active.has(value))
|
|
96
|
+
throw new DisclosureError("invalid", "Invalid recursive brief", "Supply an acyclic buildBrief result; known containers have a fixed vocabulary and nesting shape");
|
|
97
|
+
const matches = FIELD_PATHS.filter(entry => matchesDisclosurePath(entry.segments, segments));
|
|
98
|
+
const exact = matches.find(entry => entry.segments.length === segments.length);
|
|
99
|
+
if (exact !== undefined) {
|
|
100
|
+
const { field, level } = exact;
|
|
101
|
+
if (level > LEVEL[policy.profile]) {
|
|
102
|
+
exclude("profile", `/${field.replaceAll(".", "/")}`);
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
if (denied.has(field)) {
|
|
106
|
+
exclude("policy", `/${field.replaceAll(".", "/")}`);
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
if (!(typeof value === "string" || typeof value === "boolean" || (typeof value === "number" && Number.isFinite(value)))) {
|
|
110
|
+
exclude("invalid_value", path);
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
if (scanMutationSecrets(value).length > 0) {
|
|
114
|
+
exclude("secret", path);
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
return value;
|
|
118
|
+
}
|
|
119
|
+
if (matches.length === 0) {
|
|
120
|
+
exclude("unknown_field", path);
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
if (Array.isArray(value)) {
|
|
124
|
+
active.add(value);
|
|
125
|
+
const result = [];
|
|
126
|
+
for (let i = 0; i < value.length; i++) {
|
|
127
|
+
const entry = walk(value[i], [...segments, i], `${path}/${i}`);
|
|
128
|
+
if (entry !== undefined)
|
|
129
|
+
result.push(entry);
|
|
130
|
+
}
|
|
131
|
+
active.delete(value);
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
if (object(value)) {
|
|
135
|
+
active.add(value);
|
|
136
|
+
const result = {};
|
|
137
|
+
for (const [i, [key, entry]] of Object.entries(value).entries()) {
|
|
138
|
+
if (entry === undefined)
|
|
139
|
+
continue;
|
|
140
|
+
const child = [...segments, key];
|
|
141
|
+
const known = FIELD_PATHS.some(field => matchesDisclosurePath(field.segments, child));
|
|
142
|
+
const rendered = walk(entry, child, `${path}/${known ? key : `@${i}`}`);
|
|
143
|
+
if (rendered !== undefined)
|
|
144
|
+
result[key] = rendered;
|
|
145
|
+
}
|
|
146
|
+
active.delete(value);
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
exclude("invalid_value", path);
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
const filtered = walk(brief, [], "");
|
|
153
|
+
const result = { protocol: "pm-brief.disclosure/v1", profile: policy.profile, dryRun: options.dryRun ?? false, sourceTruncated: brief.budget?.truncated === true, exclusions, estimatedTokenCeiling: 64000 };
|
|
154
|
+
if (!result.dryRun)
|
|
155
|
+
result.brief = filtered;
|
|
156
|
+
return bounded(result, limit);
|
|
157
|
+
}
|
|
158
|
+
/** Read a certified native snapshot and reuse pm-brief ranking before disclosure. */
|
|
159
|
+
export async function buildDisclosureBrief(input, options) {
|
|
160
|
+
const policy = parseDisclosurePolicy(input);
|
|
161
|
+
budget(options);
|
|
162
|
+
let brief;
|
|
163
|
+
const sourceSecrets = {};
|
|
164
|
+
try {
|
|
165
|
+
const client = options.client ?? new PmClient({ pmRoot: options.pmRoot, noExtensions: true });
|
|
166
|
+
const items = certifyCompleteListResult(await client.listAllComplete({ includeBody: true })).items;
|
|
167
|
+
// Guard before compaction: a shortened credential may no longer match its detector.
|
|
168
|
+
const protectedItems = items.flatMap((item, i) => {
|
|
169
|
+
if (scanMutationSecrets(item.id).length) {
|
|
170
|
+
sourceSecrets[`/source/${i}`] = 1;
|
|
171
|
+
return [];
|
|
172
|
+
}
|
|
173
|
+
const safe = { ...item };
|
|
174
|
+
for (const [j, [field, value]] of Object.entries(item).entries()) {
|
|
175
|
+
if (scanMutationSecrets(value).length) {
|
|
176
|
+
delete safe[field];
|
|
177
|
+
sourceSecrets[`/source/${i}/@${j}`] = 1;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return [safe];
|
|
181
|
+
});
|
|
182
|
+
const statusRegistry = resolveRuntimeStatusRegistry((await readSettings(options.pmRoot)).schema);
|
|
183
|
+
brief = buildBrief(protectedItems, { pmRoot: ".agents/pm", generatedAt: options.generatedAt, statusRegistry });
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
throw new DisclosureError("tracker", "Cannot build a certified disclosure brief", "Run pm health and resolve unreadable or incomplete records before retrying");
|
|
187
|
+
}
|
|
188
|
+
const result = renderDisclosureBrief(brief, policy, { ...options, tokenBudget: 64000 });
|
|
189
|
+
Object.assign(result.exclusions.secret, sourceSecrets);
|
|
190
|
+
return bounded(result, budget(options));
|
|
191
|
+
}
|
|
192
|
+
/** Register native structured output and sanitized expected errors, with no git dependency. */
|
|
193
|
+
export function registerDisclosureCommand(api) {
|
|
194
|
+
api.registerCommand({
|
|
195
|
+
name: "brief disclose",
|
|
196
|
+
description: "Render a brief for an explicit stakeholder profile with a value-free exclusion manifest",
|
|
197
|
+
flags: [
|
|
198
|
+
{ long: "--audience", type: "string", value_name: "audience", description: "Required audience: internal, external or public (or supply --policy)" },
|
|
199
|
+
{ long: "--policy", type: "string", value_name: "file", description: "JSON policy containing profile and optional exclude; cannot widen a profile" },
|
|
200
|
+
{ long: "--dry-run", type: "boolean", description: "Explain exclusions without returning brief values" },
|
|
201
|
+
{ long: "--token-budget", type: "string", value_name: "n", description: "Conservative complete JSON/TOON ceiling (default 8000; maximum 64000)" },
|
|
202
|
+
],
|
|
203
|
+
async run(ctx) {
|
|
204
|
+
try {
|
|
205
|
+
if (ctx.args.length || (ctx.options.audience !== undefined && ctx.options.policy !== undefined))
|
|
206
|
+
return invalidPolicy();
|
|
207
|
+
let policy;
|
|
208
|
+
if (ctx.options.policy !== undefined) {
|
|
209
|
+
try {
|
|
210
|
+
policy = parseDisclosurePolicy(JSON.parse(await readFile(String(ctx.options.policy), "utf8")));
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return invalidPolicy();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
else
|
|
217
|
+
policy = parseDisclosurePolicy({ profile: ctx.options.audience });
|
|
218
|
+
return await buildDisclosureBrief(policy, { pmRoot: ctx.pm_root, client: ctx.sdk?.client, dryRun: ctx.options.dryRun, tokenBudget: ctx.options.tokenBudget === undefined ? undefined : Number(ctx.options.tokenBudget) });
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
const refusal = DisclosureError.from(error);
|
|
222
|
+
throw createPmCliExpectedError(`disclosure ${refusal.code}: ${refusal.message}. Remedy: ${refusal.remedy}`, { exitCode: 2, context: { code: `disclosure_${refusal.code}`, required: refusal.remedy } });
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=disclosure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disclosure.js","sourceRoot":"","sources":["../disclosure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,YAAY,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE/L,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA4CxC,yFAAyF;AACzF,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,kDAAkD;IACzC,IAAI,CAAwB;IACrC,2CAA2C;IAClC,MAAM,CAAS;IACxB,wEAAwE;IACxE,YAAY,IAA2B,EAAE,OAAe,EAAE,MAAc;QACtE,KAAK,CAAC,OAAO,CAAC,CAAC;QAAC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACxF,CAAC;IACD,2FAA2F;IAC3F,MAAM,CAAC,IAAI,CAAC,KAAc;QACxB,OAAO,KAAK,YAAY,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,SAAS,EAAE,+BAA+B,EAAE,6DAA6D,CAAC,CAAC;IACnL,CAAC;CACF;AAED,MAAM,KAAK,GAAsC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACzF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAiB;IACrC,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC;IACjG,CAAC,wBAAwB,EAAE,CAAC,CAAC,EAAE,CAAC,wBAAwB,EAAE,CAAC,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;CACtF,CAAC,CAAC;AACH,KAAK,MAAM,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,CAAC;IAC3D,KAAK,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,MAAM,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1G,KAAK,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,MAAM,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IACjN,KAAK,MAAM,KAAK,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,MAAM,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AAChG,CAAC;AACD,KAAK,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;IAAE,MAAM,CAAC,GAAG,CAAC,cAAc,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7G,KAAK,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC;IAAE,MAAM,CAAC,GAAG,CAAC,WAAW,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AACxF,KAAK,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC;IAAE,MAAM,CAAC,GAAG,CAAC,kBAAkB,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AAC5G,KAAK,MAAM,KAAK,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC;IAAE,MAAM,CAAC,GAAG,CAAC,oBAAoB,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1H,KAAK,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,CAAC;IAAE,MAAM,CAAC,GAAG,CAAC,0BAA0B,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AACzH,KAAK,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC;IAAE,MAAM,CAAC,GAAG,CAAC,cAAc,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AAE7F,oFAAoF;AACpF,MAAM,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAwB,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAElI,gGAAgG;AAChG,SAAS,qBAAqB,CAAC,OAA0B,EAAE,IAAkC;IAC3F,OAAO,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;AAChJ,CAAC;AAED,0EAA0E;AAC1E,SAAS,aAAa;IACpB,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,sCAAsC,EAAE,6IAA6I,CAAC,CAAC;AAC7N,CAAC;AACD,6EAA6E;AAC7E,SAAS,MAAM,CAAC,KAAc,IAAsC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAClJ,uFAAuF;AACvF,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,aAAa,EAAE,CAAC;IAC1O,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,aAAa,EAAE,CAAC;IACjN,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAA4B,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAA4B,CAAC,CAAC,EAAE,CAAC;AACvJ,CAAC;AACD,qFAAqF;AACrF,SAAS,MAAM,CAAC,OAAgC;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC;QAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,6BAA6B,EAAE,mFAAmF,CAAC,CAAC;IACrS,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,iFAAiF;AACjF,SAAS,OAAO,CAAC,MAAwB,EAAE,KAAa;IACtD,MAAM,CAAC,qBAAqB,GAAG,KAAK,CAAC;IACrC,MAAM,CAAC,qBAAqB,GAAG,sBAAsB,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IACpH,IAAI,MAAM,CAAC,qBAAqB,GAAG,KAAK;QAAE,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,+DAA+D,EAAE,8GAA8G,CAAC,CAAC;IAC/P,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,2FAA2F;AAC3F,MAAM,UAAU,qBAAqB,CAAC,KAAiB,EAAE,KAAuB,EAAE,OAAO,GAA4B,EAAE;IACrH,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAAC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,eAAe,EAAE,0FAA0F,CAAC,CAAC;IACtK,MAAM,UAAU,GAAwB,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;IACtH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,2FAA2F;IAC3F,SAAS,OAAO,CAAC,MAAiC,EAAE,IAAY,IAAU,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3I,yFAAyF;IACzF,SAAS,IAAI,CAAC,KAAc,EAAE,QAAsC,EAAE,IAAY;QAChF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,yBAAyB,EAAE,iGAAiG,CAAC,CAAC;QACzO,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC7F,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;YAC/B,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,OAAO,CAAC,SAAS,EAAE,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBAAC,OAAO,SAAS,CAAC;YAAC,CAAC;YAC9G,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBAAC,OAAO,SAAS,CAAC;YAAC,CAAC;YACjG,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;gBAAC,OAAO,SAAS,CAAC;YAAC,CAAC;YAC9K,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAAC,OAAO,SAAS,CAAC;YAAC,CAAC;YACzF,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;YAAC,OAAO,SAAS,CAAC;QAAC,CAAC;QAC/E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAClB,MAAM,MAAM,GAAsB,EAAE,CAAC;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;gBAAC,IAAI,KAAK,KAAK,SAAS;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9G,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAAC,OAAO,MAAM,CAAC;QACtC,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAClB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAClB,MAAM,MAAM,GAAoC,EAAE,CAAC;YACnD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;gBAChE,IAAI,KAAK,KAAK,SAAS;oBAAE,SAAS;gBAClC,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,CAAC;gBACjC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBACtF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxE,IAAI,QAAQ,KAAK,SAAS;oBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;YACrD,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAAC,OAAO,MAAM,CAAC;QACtC,CAAC;QACD,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QAAC,OAAO,SAAS,CAAC;IACnD,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAoC,CAAC;IACxE,MAAM,MAAM,GAAqB,EAAE,QAAQ,EAAE,wBAAwB,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,EAAE,UAAU,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC;IAC/N,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC;IAC5C,OAAO,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AACD,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAuB,EAAE,OAA0B;IAC5F,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7D,IAAI,KAAiB,CAAC;IACtB,MAAM,aAAa,GAA2B,EAAE,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9F,MAAM,KAAK,GAAG,yBAAyB,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QACnG,oFAAoF;QACpF,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YAC/C,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;gBAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBAAC,OAAO,EAAE,CAAC;YAAC,CAAC;YAC1F,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;YACzB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;gBACjE,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;oBAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;oBAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBAAC,CAAC;YACzG,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,4BAA4B,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACjG,KAAK,GAAG,UAAU,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;IACjH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,2CAA2C,EAAE,4EAA4E,CAAC,CAAC;IAClK,CAAC;IACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IACxF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvD,OAAO,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC;AACD,+FAA+F;AAC/F,MAAM,UAAU,yBAAyB,CAAC,GAAiB;IACzD,GAAG,CAAC,eAAe,CAAC;QAClB,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,yFAAyF;QACtG,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,sEAAsE,EAAE;YACnJ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,6EAA6E,EAAE;YACpJ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,mDAAmD,EAAE;YACxG,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,uEAAuE,EAAE;SAClJ;QACD,KAAK,CAAC,GAAG,CAAC,GAAG;YACX,IAAI,CAAC;gBACH,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC;oBAAE,OAAO,aAAa,EAAE,CAAC;gBACxH,IAAI,MAAwB,CAAC;gBAC7B,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACrC,IAAI,CAAC;wBAAC,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;oBAAC,CAAC;oBACvG,MAAM,CAAC;wBAAC,OAAO,aAAa,EAAE,CAAC;oBAAC,CAAC;gBACnC,CAAC;;oBAAM,MAAM,GAAG,qBAAqB,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACzE,OAAO,MAAM,oBAAoB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,MAA6B,EAAE,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACnP,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC5C,MAAM,wBAAwB,CAAC,cAAc,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,aAAa,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,cAAc,OAAO,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC1M,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { PmClient } from "@unbrained/pm-cli/sdk";
|
|
2
|
+
import type { ExtensionApi } from "@unbrained/pm-cli/sdk/authoring";
|
|
3
|
+
/** An explicit question or unresolved assumption with a stable response key. */
|
|
4
|
+
export interface HandoffPrompt {
|
|
5
|
+
id: string;
|
|
6
|
+
text: string;
|
|
7
|
+
}
|
|
8
|
+
/** Required native tracker linkage; presence proves linkage, never artifact contents or test success. */
|
|
9
|
+
export interface HandoffEvidence {
|
|
10
|
+
id: string;
|
|
11
|
+
item: string;
|
|
12
|
+
kind: "docs" | "files" | "tests";
|
|
13
|
+
ref: string;
|
|
14
|
+
}
|
|
15
|
+
/** Sender-authored obligations; every collection must be supplied, even when intentionally empty. */
|
|
16
|
+
export interface HandoffContract {
|
|
17
|
+
focus: string[];
|
|
18
|
+
questions: HandoffPrompt[];
|
|
19
|
+
assumptions: HandoffPrompt[];
|
|
20
|
+
requiredEvidence: HandoffEvidence[];
|
|
21
|
+
}
|
|
22
|
+
/** Content-addressed full item revision, including transitive declared blockers and missing targets. */
|
|
23
|
+
export interface HandoffRevision {
|
|
24
|
+
id: string;
|
|
25
|
+
revision: string | null;
|
|
26
|
+
title: string;
|
|
27
|
+
status: string;
|
|
28
|
+
blockers: string[];
|
|
29
|
+
}
|
|
30
|
+
/** Immutable stored contract; protocol and digest prevent accidental cross-packet acknowledgment. */
|
|
31
|
+
export interface HandoffDocument extends HandoffContract {
|
|
32
|
+
protocol: "pm-brief.handoff/v1";
|
|
33
|
+
sender: string;
|
|
34
|
+
createdAt: string;
|
|
35
|
+
items: HandoffRevision[];
|
|
36
|
+
}
|
|
37
|
+
/** Transport packet with live missing-evidence disclosure and a conservative byte-based token ceiling. */
|
|
38
|
+
export interface HandoffPacket {
|
|
39
|
+
id: string;
|
|
40
|
+
digest: string;
|
|
41
|
+
contract: HandoffDocument;
|
|
42
|
+
missingEvidence: string[];
|
|
43
|
+
estimatedTokenCeiling: number;
|
|
44
|
+
}
|
|
45
|
+
/** Receiver statements keyed by every question, assumption and evidence obligation. */
|
|
46
|
+
export interface HandoffResponse {
|
|
47
|
+
digest: string;
|
|
48
|
+
questions: Record<string, string>;
|
|
49
|
+
assumptions: Record<string, string>;
|
|
50
|
+
evidence: Record<string, string>;
|
|
51
|
+
}
|
|
52
|
+
/** Read-only or native mutation context; no filesystem or git backend assumptions. */
|
|
53
|
+
export interface HandoffOptions {
|
|
54
|
+
pmRoot: string;
|
|
55
|
+
author?: string;
|
|
56
|
+
client?: PmClient;
|
|
57
|
+
tokenBudget?: number;
|
|
58
|
+
}
|
|
59
|
+
/** Receipt validity is recomputed on each read; missing evidence cannot become a ready acknowledgment. */
|
|
60
|
+
export interface HandoffReceipt {
|
|
61
|
+
id: string;
|
|
62
|
+
receiver: string;
|
|
63
|
+
response: HandoffResponse;
|
|
64
|
+
acknowledgedAt: string;
|
|
65
|
+
valid: boolean;
|
|
66
|
+
ready: boolean;
|
|
67
|
+
staleItems: string[];
|
|
68
|
+
missingEvidence: string[];
|
|
69
|
+
}
|
|
70
|
+
/** Complete contract and selected receiver receipts, with no silent row omission. */
|
|
71
|
+
export interface HandoffStatus {
|
|
72
|
+
packet: HandoffPacket;
|
|
73
|
+
staleItems: string[];
|
|
74
|
+
receipts: HandoffReceipt[];
|
|
75
|
+
estimatedTokenCeiling: number;
|
|
76
|
+
}
|
|
77
|
+
/** Stable refusal categories callers can branch on without parsing prose. */
|
|
78
|
+
export type HandoffRefusalCode = "invalid" | "missing" | "identity" | "stale" | "responses" | "integrity" | "budget" | "tracker";
|
|
79
|
+
/** Expected failure with a concrete recovery action; tracker writes never precede validation. */
|
|
80
|
+
export declare class HandoffError extends Error {
|
|
81
|
+
/** Machine-readable reason for refusing an operation. */
|
|
82
|
+
readonly code: HandoffRefusalCode;
|
|
83
|
+
/** Action the caller can take before retrying. */
|
|
84
|
+
readonly remedy: string;
|
|
85
|
+
/** Preserve the typed category separately from human-readable context. */
|
|
86
|
+
constructor(code: HandoffRefusalCode, message: string, remedy: string);
|
|
87
|
+
}
|
|
88
|
+
/** Validate and normalize the SDK and CLI contract through the same runtime boundary. */
|
|
89
|
+
export declare function parseHandoffContract(value: unknown): HandoffContract;
|
|
90
|
+
/** Parse explicit receiver statements; digest binds them to exactly one packet. */
|
|
91
|
+
export declare function parseHandoffResponse(value: unknown): HandoffResponse;
|
|
92
|
+
/** Generate a bounded packet from a certified tracker read without creating records or invoking git. */
|
|
93
|
+
export declare function previewHandoff(input: HandoffContract, options: HandoffOptions): Promise<HandoffPacket>;
|
|
94
|
+
/** Create one native Decision artifact; no source item or claim is modified. */
|
|
95
|
+
export declare function createHandoff(input: HandoffContract, options: HandoffOptions): Promise<HandoffPacket>;
|
|
96
|
+
/** Read all receipts and recompute validity; receiver filters affect output only, never stored data. */
|
|
97
|
+
export declare function inspectHandoff(id: string, options: HandoffOptions, receiver?: string): Promise<HandoffStatus>;
|
|
98
|
+
/** Append an idempotent receiver receipt under the native comment lock; concurrent receivers never overwrite. */
|
|
99
|
+
export declare function acknowledgeHandoff(id: string, input: HandoffResponse, options: HandoffOptions): Promise<HandoffStatus>;
|
|
100
|
+
/** Register native structured TOON/JSON commands; expected refusals carry code and remedy at nonzero exit. */
|
|
101
|
+
export declare function registerHandoffCommands(api: ExtensionApi): void;
|
|
102
|
+
//# sourceMappingURL=handoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../handoff.ts"],"names":[],"mappings":"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"}
|