perttool 0.11.0 → 0.12.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.
Files changed (176) hide show
  1. package/CHANGELOG.md +39 -1
  2. package/README.md +14 -8
  3. package/dist/application/cli-facade.d.ts +2 -1
  4. package/dist/application/cli-facade.d.ts.map +1 -1
  5. package/dist/application/cli-facade.js +2 -1
  6. package/dist/application/cli-facade.js.map +1 -1
  7. package/dist/application/contract11-candidate.d.ts +23 -0
  8. package/dist/application/contract11-candidate.d.ts.map +1 -0
  9. package/dist/application/contract11-candidate.js +48 -0
  10. package/dist/application/contract11-candidate.js.map +1 -0
  11. package/dist/application/contract11-migration.d.ts +35 -0
  12. package/dist/application/contract11-migration.d.ts.map +1 -0
  13. package/dist/application/contract11-migration.js +46 -0
  14. package/dist/application/contract11-migration.js.map +1 -0
  15. package/dist/application/contract11-runtime.d.ts +11 -0
  16. package/dist/application/contract11-runtime.d.ts.map +1 -0
  17. package/dist/application/contract11-runtime.js +65 -0
  18. package/dist/application/contract11-runtime.js.map +1 -0
  19. package/dist/application/contract8-milestone-acceptance.d.ts +6 -0
  20. package/dist/application/contract8-milestone-acceptance.d.ts.map +1 -1
  21. package/dist/application/contract8-milestone-acceptance.js +10 -1
  22. package/dist/application/contract8-milestone-acceptance.js.map +1 -1
  23. package/dist/application/contract9-projection.d.ts +1 -1
  24. package/dist/application/contract9-projection.d.ts.map +1 -1
  25. package/dist/application/contract9-projection.js.map +1 -1
  26. package/dist/application/plan-review-mutation.d.ts +52 -0
  27. package/dist/application/plan-review-mutation.d.ts.map +1 -0
  28. package/dist/application/plan-review-mutation.js +86 -0
  29. package/dist/application/plan-review-mutation.js.map +1 -0
  30. package/dist/assurance/canonical.d.ts +3 -1
  31. package/dist/assurance/canonical.d.ts.map +1 -1
  32. package/dist/assurance/canonical.js +2 -2
  33. package/dist/assurance/canonical.js.map +1 -1
  34. package/dist/cli.js +490 -132
  35. package/dist/cli.js.map +1 -1
  36. package/dist/command/contract11-discovery.d.ts +17 -0
  37. package/dist/command/contract11-discovery.d.ts.map +1 -0
  38. package/dist/command/contract11-discovery.js +129 -0
  39. package/dist/command/contract11-discovery.js.map +1 -0
  40. package/dist/command/contract11-usage.d.ts +24 -0
  41. package/dist/command/contract11-usage.d.ts.map +1 -0
  42. package/dist/command/contract11-usage.js +39 -0
  43. package/dist/command/contract11-usage.js.map +1 -0
  44. package/dist/core/index.d.ts +2 -2
  45. package/dist/core/index.d.ts.map +1 -1
  46. package/dist/core/index.js +2 -1
  47. package/dist/core/index.js.map +1 -1
  48. package/dist/help/contract11-guide.d.ts +10 -0
  49. package/dist/help/contract11-guide.d.ts.map +1 -0
  50. package/dist/help/contract11-guide.js +73 -0
  51. package/dist/help/contract11-guide.js.map +1 -0
  52. package/dist/index.d.ts +19 -5
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +15 -4
  55. package/dist/index.js.map +1 -1
  56. package/dist/model/canonical-json.d.ts +3 -0
  57. package/dist/model/canonical-json.d.ts.map +1 -0
  58. package/dist/model/canonical-json.js +47 -0
  59. package/dist/model/canonical-json.js.map +1 -0
  60. package/dist/model/rfc8785.d.ts +2 -0
  61. package/dist/model/rfc8785.d.ts.map +1 -0
  62. package/dist/model/rfc8785.js +47 -0
  63. package/dist/model/rfc8785.js.map +1 -0
  64. package/dist/plan-review/advance.d.ts +28 -0
  65. package/dist/plan-review/advance.d.ts.map +1 -0
  66. package/dist/plan-review/advance.js +67 -0
  67. package/dist/plan-review/advance.js.map +1 -0
  68. package/dist/plan-review/authority.d.ts +4 -0
  69. package/dist/plan-review/authority.d.ts.map +1 -0
  70. package/dist/plan-review/authority.js +21 -0
  71. package/dist/plan-review/authority.js.map +1 -0
  72. package/dist/plan-review/basis.d.ts +25 -0
  73. package/dist/plan-review/basis.d.ts.map +1 -0
  74. package/dist/plan-review/basis.js +287 -0
  75. package/dist/plan-review/basis.js.map +1 -0
  76. package/dist/plan-review/format.d.ts +5 -0
  77. package/dist/plan-review/format.d.ts.map +1 -0
  78. package/dist/plan-review/format.js +54 -0
  79. package/dist/plan-review/format.js.map +1 -0
  80. package/dist/plan-review/lifecycle.d.ts +11 -0
  81. package/dist/plan-review/lifecycle.d.ts.map +1 -0
  82. package/dist/plan-review/lifecycle.js +80 -0
  83. package/dist/plan-review/lifecycle.js.map +1 -0
  84. package/dist/plan-review/mutation-types.d.ts +112 -0
  85. package/dist/plan-review/mutation-types.d.ts.map +1 -0
  86. package/dist/plan-review/mutation-types.js +4 -0
  87. package/dist/plan-review/mutation-types.js.map +1 -0
  88. package/dist/plan-review/mutation.d.ts +4 -0
  89. package/dist/plan-review/mutation.d.ts.map +1 -0
  90. package/dist/plan-review/mutation.js +421 -0
  91. package/dist/plan-review/mutation.js.map +1 -0
  92. package/dist/plan-review/projection.d.ts +4 -0
  93. package/dist/plan-review/projection.d.ts.map +1 -0
  94. package/dist/plan-review/projection.js +19 -0
  95. package/dist/plan-review/projection.js.map +1 -0
  96. package/dist/plan-review/request-size.d.ts +3 -0
  97. package/dist/plan-review/request-size.d.ts.map +1 -0
  98. package/dist/plan-review/request-size.js +86 -0
  99. package/dist/plan-review/request-size.js.map +1 -0
  100. package/dist/plan-review/request.d.ts +11 -0
  101. package/dist/plan-review/request.d.ts.map +1 -0
  102. package/dist/plan-review/request.js +268 -0
  103. package/dist/plan-review/request.js.map +1 -0
  104. package/dist/plan-review/source-lexical.d.ts +23 -0
  105. package/dist/plan-review/source-lexical.d.ts.map +1 -0
  106. package/dist/plan-review/source-lexical.js +75 -0
  107. package/dist/plan-review/source-lexical.js.map +1 -0
  108. package/dist/plan-review/source-types.d.ts +81 -0
  109. package/dist/plan-review/source-types.d.ts.map +1 -0
  110. package/dist/plan-review/source-types.js +2 -0
  111. package/dist/plan-review/source-types.js.map +1 -0
  112. package/dist/plan-review/source.d.ts +16 -0
  113. package/dist/plan-review/source.d.ts.map +1 -0
  114. package/dist/plan-review/source.js +346 -0
  115. package/dist/plan-review/source.js.map +1 -0
  116. package/dist/plan-review/write.d.ts +4 -0
  117. package/dist/plan-review/write.d.ts.map +1 -0
  118. package/dist/plan-review/write.js +51 -0
  119. package/dist/plan-review/write.js.map +1 -0
  120. package/dist/planning-pool/history-guard.d.ts +7 -1
  121. package/dist/planning-pool/history-guard.d.ts.map +1 -1
  122. package/dist/planning-pool/history-guard.js +13 -12
  123. package/dist/planning-pool/history-guard.js.map +1 -1
  124. package/dist/planning-pool/projection.d.ts +1 -1
  125. package/dist/planning-pool/projection.d.ts.map +1 -1
  126. package/dist/planning-pool/projection.js.map +1 -1
  127. package/dist/planning-pool/source-lexical.d.ts.map +1 -1
  128. package/dist/planning-pool/source-lexical.js +2 -22
  129. package/dist/planning-pool/source-lexical.js.map +1 -1
  130. package/dist/recommendation/override-types.d.ts +2 -2
  131. package/dist/recommendation/override-types.d.ts.map +1 -1
  132. package/dist/recommendation/override.d.ts +1 -1
  133. package/dist/recommendation/override.d.ts.map +1 -1
  134. package/dist/recommendation/override.js +6 -5
  135. package/dist/recommendation/override.js.map +1 -1
  136. package/dist/schema/registry.d.ts +1 -1
  137. package/dist/schema/registry.d.ts.map +1 -1
  138. package/dist/schema/registry.js +5 -2
  139. package/dist/schema/registry.js.map +1 -1
  140. package/dist/temporal-schedule/source-lexical.d.ts +5 -0
  141. package/dist/temporal-schedule/source-lexical.d.ts.map +1 -1
  142. package/dist/temporal-schedule/source-lexical.js +21 -4
  143. package/dist/temporal-schedule/source-lexical.js.map +1 -1
  144. package/dist/version.d.ts +1 -1
  145. package/dist/version.d.ts.map +1 -1
  146. package/dist/version.js +2 -1
  147. package/dist/version.js.map +1 -1
  148. package/package.json +1 -1
  149. package/schemas/Perttool.AdvanceResult.v4.schema.json +4 -1
  150. package/schemas/Perttool.AgentGuidanceResult.v1.schema.json +1 -1
  151. package/schemas/Perttool.AnalysisResult.v7.schema.json +1 -1
  152. package/schemas/Perttool.CheckResult.v6.schema.json +1 -1
  153. package/schemas/Perttool.CliError.v1.schema.json +1 -1
  154. package/schemas/Perttool.CommandHelpResult.v1.schema.json +2 -2
  155. package/schemas/Perttool.ExportResult.v1.schema.json +1 -1
  156. package/schemas/Perttool.FormatResult.v1.schema.json +1 -1
  157. package/schemas/Perttool.GuideResult.v1.schema.json +1 -1
  158. package/schemas/Perttool.HistoricalGraphResult.v1.schema.json +1 -1
  159. package/schemas/Perttool.ImportResult.v1.schema.json +1 -1
  160. package/schemas/Perttool.InitResult.v1.schema.json +1 -1
  161. package/schemas/Perttool.MilestoneAcceptanceMigrationResult.v1.schema.json +1 -1
  162. package/schemas/Perttool.MilestoneAcceptanceResult.v1.schema.json +1 -1
  163. package/schemas/Perttool.MutationResult.v6.schema.json +1 -1
  164. package/schemas/{Perttool.NextResult.v8.schema.json → Perttool.NextResult.v9.schema.json} +40 -7
  165. package/schemas/Perttool.PlanAssuranceResult.v2.schema.json +1 -1
  166. package/schemas/Perttool.PlanReviewMutationResult.v1.schema.json +2203 -0
  167. package/schemas/Perttool.PlanReviewResult.v1.schema.json +245 -0
  168. package/schemas/Perttool.PlanningMutationResult.v1.schema.json +1 -1
  169. package/schemas/Perttool.PlanningPoolResult.v1.schema.json +1 -1
  170. package/schemas/Perttool.PlanningReshapePreflightResult.v1.schema.json +1 -1
  171. package/schemas/Perttool.ProjectHistoryResult.v1.schema.json +1 -1
  172. package/schemas/Perttool.ProjectResult.v5.schema.json +1 -1
  173. package/schemas/Perttool.SchemaResult.v1.schema.json +1 -1
  174. package/schemas/Perttool.UnitMigrationResult.v5.schema.json +1 -1
  175. package/schemas/Perttool.VelocityObservationResult.v1.schema.json +1 -1
  176. package/dist/perttool-vscode-private-0.0.0-d1578b9.vsix +0 -0
@@ -0,0 +1,421 @@
1
+ // R: Plan one validated Plan Review create or resolution candidate.
2
+ import { createUnifiedDiff } from "../editing/unified-diff.js";
3
+ import { governanceMetadataFromDocument } from "../governance/source.js";
4
+ import { compareStableStrings, limitDiagnostics, normalizeMaxDiagnostics, sortDiagnostics, } from "../model/diagnostics.js";
5
+ import { sha256DigestUtf8 } from "../model/sha256.js";
6
+ import { applyTextEdits, normalizeTextEdits, } from "../mutation/text-edits.js";
7
+ import { splitTemporalSourceLines } from "../temporal-schedule/source-lexical.js";
8
+ import { evaluatePlanReviewAuthority } from "./authority.js";
9
+ import { assessPlanReviewTaskLifecycle } from "./lifecycle.js";
10
+ import { digestPlanReviewBasis, projectPlanReviewBasis } from "./basis.js";
11
+ import { normalizePlanReviewCreateRequest, normalizePlanReviewResolveRequest, } from "./request.js";
12
+ import { projectPlanReviewState } from "./projection.js";
13
+ import { planReviewBaseText, scanPlanReviewDeclarationBlocks, } from "./source-lexical.js";
14
+ import { parsePlanReviewSource, PLAN_REVIEW_SOURCE_CAPABILITY, } from "./source.js";
15
+ const emptyBasis = Object.freeze({
16
+ status: "unchanged",
17
+ beforeDigest: null,
18
+ afterDigest: null,
19
+ });
20
+ function diagnostic(code, message, data = {}) {
21
+ return Object.freeze({
22
+ code,
23
+ severity: "error",
24
+ message,
25
+ helpTopic: "editing",
26
+ data: Object.freeze(data),
27
+ });
28
+ }
29
+ function failure(operation, text, documentId, diagnostics, options, details = {}) {
30
+ const limited = limitDiagnostics(sortDiagnostics(diagnostics), normalizeMaxDiagnostics(options.maxDiagnostics));
31
+ return Object.freeze({
32
+ operation,
33
+ ok: false,
34
+ documentId,
35
+ changed: false,
36
+ originalDigest: sha256DigestUtf8(text),
37
+ updatedDigest: null,
38
+ updatedText: null,
39
+ diff: null,
40
+ edits: Object.freeze([]),
41
+ requestBefore: details.requestBefore ?? null,
42
+ requestAfter: null,
43
+ projectionBefore: details.projectionBefore ?? null,
44
+ projectionAfter: null,
45
+ planBasis: emptyBasis,
46
+ planReviewAuthority: details.planReviewAuthority ?? null,
47
+ composedMutation: details.composedMutation ?? null,
48
+ diagnostics: limited.diagnostics,
49
+ diagnosticsTruncated: limited.truncated,
50
+ });
51
+ }
52
+ function successful(input) {
53
+ const { operation, text, candidate, edits, before, after, requestBefore, requestAfter, planBasis, authority, composedMutation, diagnostics, options } = input;
54
+ const limited = limitDiagnostics(sortDiagnostics(diagnostics), normalizeMaxDiagnostics(options.maxDiagnostics));
55
+ return Object.freeze({
56
+ operation,
57
+ ok: !limited.diagnostics.some(({ severity }) => severity === "error"),
58
+ documentId: before.documentId,
59
+ changed: candidate !== text,
60
+ originalDigest: sha256DigestUtf8(text),
61
+ updatedDigest: sha256DigestUtf8(candidate),
62
+ updatedText: candidate,
63
+ diff: candidate === text ? null : createUnifiedDiff(text, candidate, {
64
+ originalLabel: options.originalLabel ?? "original",
65
+ updatedLabel: options.updatedLabel ?? "candidate",
66
+ }),
67
+ edits,
68
+ requestBefore,
69
+ requestAfter,
70
+ projectionBefore: projectPlanReviewState(before),
71
+ projectionAfter: projectPlanReviewState(after),
72
+ planBasis,
73
+ planReviewAuthority: authority,
74
+ composedMutation,
75
+ diagnostics: limited.diagnostics,
76
+ diagnosticsTruncated: limited.truncated,
77
+ });
78
+ }
79
+ function validSource(operation, text, options) {
80
+ const source = parsePlanReviewSource(text, PLAN_REVIEW_SOURCE_CAPABILITY, options);
81
+ if (!source.ok || source.model === null || source.grammarVersion !== 10) {
82
+ const diagnostics = source.grammarVersion !== 10
83
+ ? [diagnostic("PTREV-110", "Plan Review mutations require Grammar 10", {
84
+ grammar_version: source.grammarVersion,
85
+ })]
86
+ : source.diagnostics;
87
+ return failure(operation, text, source.documentId, diagnostics, options);
88
+ }
89
+ if (options.expectedDigest !== undefined &&
90
+ options.expectedDigest !== sha256DigestUtf8(text)) {
91
+ return failure(operation, text, source.documentId, [diagnostic("PTREV-106", "Plan Review source binding is stale", { cause: "expected_digest_mismatch" })], options);
92
+ }
93
+ return Object.freeze({ model: source.model });
94
+ }
95
+ function lineEnding(text) {
96
+ return text.includes("\r\n") ? "\r\n" : "\n";
97
+ }
98
+ function serializedOpen(request, eol) {
99
+ return [
100
+ `plan_review_request ${request.requestId} ${request.taskId}:`,
101
+ " model 1",
102
+ ` reason ${JSON.stringify(request.reason)}`,
103
+ ` created_at ${request.createdAt}`,
104
+ ` created_by ${request.actor}`,
105
+ ...(request.locator === null ? [] : [` locator ${JSON.stringify(request.locator)}`]),
106
+ ].join(eol);
107
+ }
108
+ function createInsertion(text, requestId, declaration) {
109
+ const blocks = scanPlanReviewDeclarationBlocks(text);
110
+ const nextRequest = blocks.find(({ id }) => compareStableStrings(id, requestId) > 0);
111
+ const firstLater = splitTemporalSourceLines(text).find((line) => /^(?:task_relation|plan_seal|task_outcome|assurance_receipt|milestone_criterion_set|milestone_acceptance_receipt|work_event)\b/u.test(line.text));
112
+ const offset = nextRequest?.header.start ?? firstLater?.start ?? text.length;
113
+ const eol = lineEnding(text);
114
+ const prefix = offset > 0 && !text.slice(0, offset).endsWith(`${eol}${eol}`) ? eol : "";
115
+ const suffix = offset === text.length
116
+ ? (text.endsWith(eol) ? eol : `${eol}${eol}`)
117
+ : "";
118
+ return Object.freeze({
119
+ startOffset: offset,
120
+ endOffset: offset,
121
+ replacement: `${prefix}${declaration}${eol}${suffix}`,
122
+ });
123
+ }
124
+ function requestNamed(model, id) {
125
+ return model.requests.find((request) => request.id === id) ?? null;
126
+ }
127
+ function exactCreateReplay(stored, request) {
128
+ return stored.taskId === request.taskId && stored.reason === request.reason &&
129
+ stored.createdAt === request.createdAt && stored.createdBy === request.actor &&
130
+ stored.locator === request.locator;
131
+ }
132
+ function replayResult(operation, text, model, stored) {
133
+ const digest = sha256DigestUtf8(text);
134
+ const projection = projectPlanReviewState(model);
135
+ return Object.freeze({
136
+ operation,
137
+ ok: true,
138
+ documentId: model.documentId,
139
+ changed: false,
140
+ originalDigest: digest,
141
+ updatedDigest: digest,
142
+ updatedText: text,
143
+ diff: null,
144
+ edits: Object.freeze([]),
145
+ requestBefore: stored,
146
+ requestAfter: stored,
147
+ projectionBefore: projection,
148
+ projectionAfter: projection,
149
+ planBasis: emptyBasis,
150
+ planReviewAuthority: null,
151
+ composedMutation: null,
152
+ diagnostics: Object.freeze([]),
153
+ diagnosticsTruncated: false,
154
+ });
155
+ }
156
+ export function planPlanReviewCreate(text, input, options = {}) {
157
+ const checked = validSource("create", text, options);
158
+ if (!("model" in checked))
159
+ return checked;
160
+ const normalized = normalizePlanReviewCreateRequest(input);
161
+ if (!normalized.ok || normalized.request === null) {
162
+ return failure("create", text, checked.model.documentId, normalized.diagnostics, options, { projectionBefore: projectPlanReviewState(checked.model) });
163
+ }
164
+ const existing = requestNamed(checked.model, normalized.request.requestId);
165
+ if (existing !== null) {
166
+ return exactCreateReplay(existing, normalized.request)
167
+ ? replayResult("create", text, checked.model, existing)
168
+ : failure("create", text, checked.model.documentId, [diagnostic("PTREV-105", "Plan Review request identity already has different normalized content", { request_id: normalized.request.requestId })], options, { requestBefore: existing, projectionBefore: projectPlanReviewState(checked.model) });
169
+ }
170
+ const edit = createInsertion(text, normalized.request.requestId, serializedOpen(normalized.request, lineEnding(text)));
171
+ const edits = normalizeTextEdits(text, [edit], "Plan Review create");
172
+ const candidate = applyTextEdits(text, edits);
173
+ const after = parsePlanReviewSource(candidate, PLAN_REVIEW_SOURCE_CAPABILITY, options);
174
+ if (!after.ok || after.model === null) {
175
+ return failure("create", text, checked.model.documentId, after.diagnostics, options, { projectionBefore: projectPlanReviewState(checked.model) });
176
+ }
177
+ const created = requestNamed(after.model, normalized.request.requestId);
178
+ if (created === null)
179
+ throw new Error("Plan Review create candidate lost its request");
180
+ return successful({
181
+ operation: "create", text, candidate, edits, before: checked.model,
182
+ after: after.model, requestBefore: null, requestAfter: created,
183
+ planBasis: emptyBasis, authority: null, composedMutation: null,
184
+ diagnostics: [], options,
185
+ });
186
+ }
187
+ function exactResolveReplay(stored, request) {
188
+ return stored.outcome === request.outcome && stored.resolvedAt === request.resolvedAt &&
189
+ stored.resolvedBy === request.actor && stored.resolutionReason === request.resolutionReason &&
190
+ stored.changeRequestDigest === request.changeRequestDigest;
191
+ }
192
+ const defaultDependencies = Object.freeze({
193
+ composeBatch: () => {
194
+ throw new TypeError("Plan Review plan_changed composition requires an Application batch planner");
195
+ },
196
+ });
197
+ function reboundComposedMutation(result, text, candidate) {
198
+ const sourceDigest = sha256DigestUtf8(text);
199
+ const governance = result["governance"];
200
+ return Object.freeze({
201
+ ...result,
202
+ originalDigest: sourceDigest,
203
+ updatedDigest: sha256DigestUtf8(candidate),
204
+ updatedText: candidate,
205
+ diff: createUnifiedDiff(text, candidate, {
206
+ originalLabel: "original",
207
+ updatedLabel: "candidate",
208
+ }),
209
+ ...(governance === null || typeof governance !== "object"
210
+ ? {}
211
+ : { governance: Object.freeze({
212
+ ...governance,
213
+ sourceDigest,
214
+ }) }),
215
+ });
216
+ }
217
+ function liftGrammar9EditsToGrammar10(text, edits) {
218
+ const versionStart = text.indexOf(" version 10");
219
+ if (versionStart < 0) {
220
+ throw new Error("Grammar 10 source lost its version field");
221
+ }
222
+ const baseBoundary = versionStart + " version 9".length;
223
+ const lift = (offset) => offset >= baseBoundary ? offset + 1 : offset;
224
+ return Object.freeze(edits.map((edit) => Object.freeze({
225
+ ...edit,
226
+ startOffset: lift(edit.startOffset),
227
+ endOffset: lift(edit.endOffset),
228
+ })));
229
+ }
230
+ function resolutionEdit(stored, request, reviewedSourceDigest, beforeBasis, afterBasis, eol) {
231
+ const fields = [
232
+ ` outcome ${request.outcome}`,
233
+ ` resolved_at ${request.resolvedAt}`,
234
+ ` resolved_by ${request.actor}`,
235
+ ` resolution_reason ${JSON.stringify(request.resolutionReason)}`,
236
+ ` reviewed_source_digest ${reviewedSourceDigest}`,
237
+ ...(request.outcome === "plan_changed" ? [
238
+ ` change_request_digest ${request.changeRequestDigest}`,
239
+ ` plan_basis_before ${beforeBasis}`,
240
+ ` plan_basis_after ${afterBasis}`,
241
+ ] : []),
242
+ ];
243
+ return Object.freeze({
244
+ startOffset: stored.span.end.offset,
245
+ endOffset: stored.span.end.offset,
246
+ replacement: `${eol}${fields.join(eol)}`,
247
+ });
248
+ }
249
+ function prepareResolve(text, input, options) {
250
+ const checked = validSource("resolve", text, options);
251
+ if (!("model" in checked))
252
+ return checked;
253
+ const projectionBefore = projectPlanReviewState(checked.model);
254
+ const normalized = normalizePlanReviewResolveRequest(input);
255
+ if (!normalized.ok || normalized.request === null) {
256
+ return failure("resolve", text, checked.model.documentId, normalized.diagnostics, options, { projectionBefore });
257
+ }
258
+ const stored = requestNamed(checked.model, normalized.request.requestId);
259
+ if (stored === null) {
260
+ return failure("resolve", text, checked.model.documentId, [diagnostic("PTREV-104", "Plan Review request does not exist", { request_id: normalized.request.requestId })], options, { projectionBefore });
261
+ }
262
+ if (stored.outcome !== null) {
263
+ return exactResolveReplay(stored, normalized.request)
264
+ ? replayResult("resolve", text, checked.model, stored)
265
+ : failure("resolve", text, checked.model.documentId, [diagnostic("PTREV-105", "Plan Review resolution replay does not match stored evidence", { request_id: stored.id })], options, { requestBefore: stored, projectionBefore });
266
+ }
267
+ return Object.freeze({
268
+ text, options, model: checked.model, projectionBefore,
269
+ request: normalized.request, stored,
270
+ });
271
+ }
272
+ function composeResolutionPlan(context, dependencies) {
273
+ if (context.request.outcome === "plan_retained") {
274
+ return Object.freeze({
275
+ planCandidate: context.text,
276
+ planEdits: Object.freeze([]),
277
+ composed: null,
278
+ });
279
+ }
280
+ if (context.request.request === null) {
281
+ throw new Error("normalized plan_changed request lost its batch");
282
+ }
283
+ const base = planReviewBaseText(context.text, scanPlanReviewDeclarationBlocks(context.text));
284
+ const planned = dependencies.composeBatch(base, context.request.request, {
285
+ actor: context.request.actor,
286
+ acceptedOwners: context.request.acceptedOwners,
287
+ });
288
+ const guarded = planned.ok && planned.changed && planned.updatedText !== null &&
289
+ planned.updatedDigest !== null &&
290
+ !planned.diagnostics.some(({ severity }) => severity === "error");
291
+ if (!guarded) {
292
+ return failure("resolve", context.text, context.model.documentId, [
293
+ ...planned.diagnostics,
294
+ diagnostic("PTREV-109", "composed Plan Review plan mutation did not satisfy every independent guard", { request_id: context.stored.id }),
295
+ ], context.options, {
296
+ requestBefore: context.stored,
297
+ projectionBefore: context.projectionBefore,
298
+ composedMutation: planned,
299
+ });
300
+ }
301
+ const planEdits = liftGrammar9EditsToGrammar10(context.text, planned.edits);
302
+ const planCandidate = applyTextEdits(context.text, planEdits);
303
+ return Object.freeze({
304
+ planCandidate,
305
+ planEdits,
306
+ composed: reboundComposedMutation(planned, context.text, planCandidate),
307
+ });
308
+ }
309
+ function evaluateResolutionBasis(context, composition) {
310
+ const beforeDigest = digestPlanReviewBasis(projectPlanReviewBasis(context.model));
311
+ const probeRequest = context.request.outcome === "plan_changed"
312
+ ? Object.freeze({
313
+ ...context.request,
314
+ outcome: "plan_retained",
315
+ request: null,
316
+ canonicalChangeRequest: null,
317
+ changeRequestDigest: null,
318
+ })
319
+ : context.request;
320
+ const probeEdit = resolutionEdit(context.stored, probeRequest, sha256DigestUtf8(composition.planCandidate), beforeDigest, beforeDigest, lineEnding(context.text));
321
+ const probeEdits = normalizeTextEdits(context.text, [...composition.planEdits, probeEdit], "Plan Review basis probe");
322
+ const probe = parsePlanReviewSource(applyTextEdits(context.text, probeEdits), PLAN_REVIEW_SOURCE_CAPABILITY, context.options);
323
+ if (probe.model === null) {
324
+ return failure("resolve", context.text, context.model.documentId, [diagnostic("PTREV-109", "complete Plan Review candidate basis is unavailable", { request_id: context.stored.id })], context.options, {
325
+ requestBefore: context.stored,
326
+ projectionBefore: context.projectionBefore,
327
+ composedMutation: composition.composed,
328
+ });
329
+ }
330
+ const afterDigest = digestPlanReviewBasis(projectPlanReviewBasis(probe.model));
331
+ const changed = beforeDigest !== afterDigest;
332
+ if (changed !== (context.request.outcome === "plan_changed")) {
333
+ return failure("resolve", context.text, context.model.documentId, [diagnostic("PTREV-107", context.request.outcome === "plan_retained"
334
+ ? "plan_retained requires an unchanged Plan Review basis"
335
+ : "plan_changed requires a changed Plan Review basis", { request_id: context.stored.id, before: beforeDigest, after: afterDigest })], context.options, {
336
+ requestBefore: context.stored,
337
+ projectionBefore: context.projectionBefore,
338
+ composedMutation: composition.composed,
339
+ });
340
+ }
341
+ return Object.freeze({
342
+ beforeDigest,
343
+ afterDigest,
344
+ projection: changed
345
+ ? Object.freeze({ status: "changed", beforeDigest, afterDigest })
346
+ : emptyBasis,
347
+ });
348
+ }
349
+ function finalizeResolution(context, composition, basis) {
350
+ const finalEdit = resolutionEdit(context.stored, context.request, sha256DigestUtf8(composition.planCandidate), basis.beforeDigest, basis.afterDigest, lineEnding(context.text));
351
+ const edits = normalizeTextEdits(context.text, [...composition.planEdits, finalEdit], "Plan Review complete resolution");
352
+ const candidate = applyTextEdits(context.text, edits);
353
+ const lifecycle = assessPlanReviewTaskLifecycle(context.text, candidate, "ordinary");
354
+ if (!lifecycle.ok) {
355
+ return failure("resolve", context.text, context.model.documentId, lifecycle.diagnostics, context.options, {
356
+ requestBefore: context.stored,
357
+ projectionBefore: context.projectionBefore,
358
+ composedMutation: composition.composed,
359
+ });
360
+ }
361
+ const after = parsePlanReviewSource(candidate, PLAN_REVIEW_SOURCE_CAPABILITY, context.options);
362
+ if (!after.ok || after.model === null) {
363
+ return failure("resolve", context.text, context.model.documentId, after.diagnostics, context.options, {
364
+ requestBefore: context.stored,
365
+ projectionBefore: context.projectionBefore,
366
+ composedMutation: composition.composed,
367
+ });
368
+ }
369
+ const authority = evaluatePlanReviewAuthority(context.stored.id, sha256DigestUtf8(context.text), sha256DigestUtf8(candidate), context.request.actor, context.request.acceptedOwners, governanceMetadataFromDocument(context.model.baseDocument.document).effective);
370
+ if (!authority.authorized) {
371
+ return failure("resolve", context.text, context.model.documentId, [diagnostic("PTREV-106", "Plan Review resolution authority was not established", { request_id: context.stored.id, required_owner: authority.effective_dag_owner })], context.options, {
372
+ requestBefore: context.stored,
373
+ projectionBefore: context.projectionBefore,
374
+ planReviewAuthority: authority,
375
+ composedMutation: composition.composed,
376
+ });
377
+ }
378
+ const resolved = requestNamed(after.model, context.stored.id);
379
+ if (resolved === null) {
380
+ throw new Error("Plan Review resolution candidate lost its request");
381
+ }
382
+ return successful({
383
+ operation: "resolve",
384
+ text: context.text,
385
+ candidate,
386
+ edits,
387
+ before: context.model,
388
+ after: after.model,
389
+ requestBefore: context.stored,
390
+ requestAfter: resolved,
391
+ planBasis: basis.projection,
392
+ authority,
393
+ composedMutation: composition.composed,
394
+ diagnostics: composition.composed?.diagnostics ?? [],
395
+ options: context.options,
396
+ });
397
+ }
398
+ export function planPlanReviewResolve(text, input, options = {}, dependencies = defaultDependencies) {
399
+ const prepared = prepareResolve(text, input, options);
400
+ if ("operation" in prepared)
401
+ return prepared;
402
+ const composition = composeResolutionPlan(prepared, dependencies);
403
+ if ("operation" in composition)
404
+ return composition;
405
+ if (prepared.request.outcome === "plan_changed") {
406
+ const preliminary = assessPlanReviewTaskLifecycle(text, composition.planCandidate, "ordinary");
407
+ const otherOpen = preliminary.blockingRequestIds
408
+ .filter((id) => id !== prepared.stored.id);
409
+ if (otherOpen.length > 0)
410
+ return failure("resolve", text, prepared.model.documentId, [diagnostic("PTREV-108", `Task removal would orphan Plan Review request(s): ${otherOpen.join(", ")}`, { request_ids: Object.freeze(otherOpen) })], options, {
411
+ requestBefore: prepared.stored,
412
+ projectionBefore: prepared.projectionBefore,
413
+ composedMutation: composition.composed,
414
+ });
415
+ }
416
+ const basis = evaluateResolutionBasis(prepared, composition);
417
+ if ("operation" in basis)
418
+ return basis;
419
+ return finalizeResolution(prepared, composition, basis);
420
+ }
421
+ //# sourceMappingURL=mutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation.js","sourceRoot":"","sources":["../../src/plan-review/mutation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PlanReviewProjectionV1, PlanReviewSourceModel } from "./source-types.js";
2
+ export declare const PLAN_REVIEW_PROJECTION_MODEL_VERSION: 1;
3
+ export declare function projectPlanReviewState(model: PlanReviewSourceModel): PlanReviewProjectionV1;
4
+ //# sourceMappingURL=projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../src/plan-review/projection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,oCAAoC,EAAG,CAAU,CAAC;AAE/D,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,qBAAqB,GAC3B,sBAAsB,CAgBxB"}
@@ -0,0 +1,19 @@
1
+ export const PLAN_REVIEW_PROJECTION_MODEL_VERSION = 1;
2
+ export function projectPlanReviewState(model) {
3
+ const openRequestIds = Object.freeze(model.requests
4
+ .filter(({ outcome }) => outcome === null)
5
+ .map(({ id }) => id));
6
+ const requiredActions = openRequestIds.length === 0
7
+ ? Object.freeze([])
8
+ : Object.freeze([Object.freeze({
9
+ kind: "review_before_new_downstream_work",
10
+ request_ids: openRequestIds,
11
+ })]);
12
+ return Object.freeze({
13
+ model_version: PLAN_REVIEW_PROJECTION_MODEL_VERSION,
14
+ state: openRequestIds.length === 0 ? "clear" : "review_required",
15
+ open_request_ids: openRequestIds,
16
+ required_actions: requiredActions,
17
+ });
18
+ }
19
+ //# sourceMappingURL=projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../src/plan-review/projection.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAU,CAAC;AAE/D,MAAM,UAAU,sBAAsB,CACpC,KAA4B;IAE5B,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ;SAChD,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC;SACzC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxB,MAAM,eAAe,GAAG,cAAc,CAAC,MAAM,KAAK,CAAC;QACjD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACnB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC3B,IAAI,EAAE,mCAA4C;gBAClD,WAAW,EAAE,cAAc;aAC5B,CAAC,CAAC,CAAC,CAAC;IACT,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,aAAa,EAAE,oCAAoC;QACnD,KAAK,EAAE,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB;QAChE,gBAAgB,EAAE,cAAc;QAChC,gBAAgB,EAAE,eAAe;KAClC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Count canonical JSON bytes without constructing escaped strings or JSON. */
2
+ export declare function planReviewBatchFitsUtf8(value: unknown, maximum: number): boolean;
3
+ //# sourceMappingURL=request-size.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-size.d.ts","sourceRoot":"","sources":["../../src/plan-review/request-size.ts"],"names":[],"mappings":"AAIA,+EAA+E;AAC/E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CA8DhF"}
@@ -0,0 +1,86 @@
1
+ // R: Bound canonical Plan Review batch JSON bytes before serialization.
2
+ const shortEscapes = new Set([0x22, 0x5c, 8, 9, 10, 12, 13]);
3
+ /** Count canonical JSON bytes without constructing escaped strings or JSON. */
4
+ export function planReviewBatchFitsUtf8(value, maximum) {
5
+ let bytes = 0;
6
+ const active = new Set();
7
+ function add(count) {
8
+ bytes += count;
9
+ return bytes <= maximum;
10
+ }
11
+ function string(text) {
12
+ if (!add(2))
13
+ return false;
14
+ for (let index = 0; index < text.length; index += 1) {
15
+ const code = text.charCodeAt(index);
16
+ let width;
17
+ if (shortEscapes.has(code))
18
+ width = 2;
19
+ else if (code < 0x20)
20
+ width = 6;
21
+ else if (code < 0x80)
22
+ width = 1;
23
+ else if (code < 0x800)
24
+ width = 2;
25
+ else if (code >= 0xd800 && code <= 0xdbff) {
26
+ const next = text.charCodeAt(index + 1);
27
+ if (!(next >= 0xdc00 && next <= 0xdfff))
28
+ return false;
29
+ index += 1;
30
+ width = 4;
31
+ }
32
+ else if (code >= 0xdc00 && code <= 0xdfff)
33
+ return false;
34
+ else
35
+ width = 3;
36
+ if (!add(width))
37
+ return false;
38
+ }
39
+ return true;
40
+ }
41
+ function array(items) {
42
+ for (let index = 0; index < items.length; index += 1) {
43
+ if ((index > 0 && !add(1)) || !visit(items[index]))
44
+ return false;
45
+ }
46
+ return true;
47
+ }
48
+ function object(item) {
49
+ let first = true;
50
+ for (const key of Object.keys(item)) {
51
+ if ((!first && !add(1)) || !string(key) || !add(1) || !visit(item[key]))
52
+ return false;
53
+ first = false;
54
+ }
55
+ return true;
56
+ }
57
+ function visit(item) {
58
+ if (item === null)
59
+ return add(4);
60
+ if (typeof item === "string")
61
+ return string(item);
62
+ if (typeof item === "boolean")
63
+ return add(item ? 4 : 5);
64
+ if (typeof item === "number") {
65
+ return Number.isSafeInteger(item) && add(String(item).length);
66
+ }
67
+ if (typeof item !== "object" || active.has(item))
68
+ return false;
69
+ active.add(item);
70
+ try {
71
+ if (!add(2))
72
+ return false;
73
+ return Array.isArray(item) ? array(item) : object(item);
74
+ }
75
+ finally {
76
+ active.delete(item);
77
+ }
78
+ }
79
+ try {
80
+ return visit(value);
81
+ }
82
+ catch {
83
+ return false;
84
+ }
85
+ }
86
+ //# sourceMappingURL=request-size.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-size.js","sourceRoot":"","sources":["../../src/plan-review/request-size.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Diagnostic } from "../model/diagnostics.js";
2
+ import { type NormalizedPlanReviewCreateRequestV1, type NormalizedPlanReviewResolveRequestV1 } from "./mutation-types.js";
3
+ export type PlanReviewRequestNormalization<T> = Readonly<{
4
+ ok: boolean;
5
+ request: T | null;
6
+ diagnostics: readonly Diagnostic[];
7
+ }>;
8
+ export declare function normalizePlanReviewCreateRequest(input: unknown): PlanReviewRequestNormalization<NormalizedPlanReviewCreateRequestV1>;
9
+ export declare function normalizePlanReviewResolveRequest(input: unknown): PlanReviewRequestNormalization<NormalizedPlanReviewResolveRequestV1>;
10
+ export declare function isSha256Digest(value: string): boolean;
11
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/plan-review/request.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAO1D,OAAO,EAGL,KAAK,mCAAmC,EACxC,KAAK,oCAAoC,EAC1C,MAAM,qBAAqB,CAAC;AAM7B,MAAM,MAAM,8BAA8B,CAAC,CAAC,IAAI,QAAQ,CAAC;IACvD,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IAClB,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CACpC,CAAC,CAAC;AA+DH,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,OAAO,GACb,8BAA8B,CAAC,mCAAmC,CAAC,CA0CrE;AAuKD,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,OAAO,GACb,8BAA8B,CAAC,oCAAoC,CAAC,CA8BtE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAErD"}