perttool 0.11.1 → 0.12.1

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 (179) hide show
  1. package/CHANGELOG.md +32 -1
  2. package/README.md +9 -4
  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/history/project-history.d.ts.map +1 -1
  53. package/dist/history/project-history.js +15 -0
  54. package/dist/history/project-history.js.map +1 -1
  55. package/dist/history/unit-conversion-proof.d.ts +7 -0
  56. package/dist/history/unit-conversion-proof.d.ts.map +1 -0
  57. package/dist/history/unit-conversion-proof.js +83 -0
  58. package/dist/history/unit-conversion-proof.js.map +1 -0
  59. package/dist/index.d.ts +19 -5
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +15 -4
  62. package/dist/index.js.map +1 -1
  63. package/dist/model/rfc8785.d.ts +2 -0
  64. package/dist/model/rfc8785.d.ts.map +1 -0
  65. package/dist/model/rfc8785.js +47 -0
  66. package/dist/model/rfc8785.js.map +1 -0
  67. package/dist/plan-review/advance.d.ts +28 -0
  68. package/dist/plan-review/advance.d.ts.map +1 -0
  69. package/dist/plan-review/advance.js +67 -0
  70. package/dist/plan-review/advance.js.map +1 -0
  71. package/dist/plan-review/authority.d.ts +4 -0
  72. package/dist/plan-review/authority.d.ts.map +1 -0
  73. package/dist/plan-review/authority.js +21 -0
  74. package/dist/plan-review/authority.js.map +1 -0
  75. package/dist/plan-review/basis.d.ts +25 -0
  76. package/dist/plan-review/basis.d.ts.map +1 -0
  77. package/dist/plan-review/basis.js +287 -0
  78. package/dist/plan-review/basis.js.map +1 -0
  79. package/dist/plan-review/format.d.ts +5 -0
  80. package/dist/plan-review/format.d.ts.map +1 -0
  81. package/dist/plan-review/format.js +54 -0
  82. package/dist/plan-review/format.js.map +1 -0
  83. package/dist/plan-review/lifecycle.d.ts +11 -0
  84. package/dist/plan-review/lifecycle.d.ts.map +1 -0
  85. package/dist/plan-review/lifecycle.js +80 -0
  86. package/dist/plan-review/lifecycle.js.map +1 -0
  87. package/dist/plan-review/mutation-types.d.ts +112 -0
  88. package/dist/plan-review/mutation-types.d.ts.map +1 -0
  89. package/dist/plan-review/mutation-types.js +4 -0
  90. package/dist/plan-review/mutation-types.js.map +1 -0
  91. package/dist/plan-review/mutation.d.ts +4 -0
  92. package/dist/plan-review/mutation.d.ts.map +1 -0
  93. package/dist/plan-review/mutation.js +421 -0
  94. package/dist/plan-review/mutation.js.map +1 -0
  95. package/dist/plan-review/projection.d.ts +4 -0
  96. package/dist/plan-review/projection.d.ts.map +1 -0
  97. package/dist/plan-review/projection.js +19 -0
  98. package/dist/plan-review/projection.js.map +1 -0
  99. package/dist/plan-review/request-size.d.ts +3 -0
  100. package/dist/plan-review/request-size.d.ts.map +1 -0
  101. package/dist/plan-review/request-size.js +86 -0
  102. package/dist/plan-review/request-size.js.map +1 -0
  103. package/dist/plan-review/request.d.ts +11 -0
  104. package/dist/plan-review/request.d.ts.map +1 -0
  105. package/dist/plan-review/request.js +268 -0
  106. package/dist/plan-review/request.js.map +1 -0
  107. package/dist/plan-review/source-lexical.d.ts +23 -0
  108. package/dist/plan-review/source-lexical.d.ts.map +1 -0
  109. package/dist/plan-review/source-lexical.js +75 -0
  110. package/dist/plan-review/source-lexical.js.map +1 -0
  111. package/dist/plan-review/source-types.d.ts +81 -0
  112. package/dist/plan-review/source-types.d.ts.map +1 -0
  113. package/dist/plan-review/source-types.js +2 -0
  114. package/dist/plan-review/source-types.js.map +1 -0
  115. package/dist/plan-review/source.d.ts +16 -0
  116. package/dist/plan-review/source.d.ts.map +1 -0
  117. package/dist/plan-review/source.js +346 -0
  118. package/dist/plan-review/source.js.map +1 -0
  119. package/dist/plan-review/write.d.ts +4 -0
  120. package/dist/plan-review/write.d.ts.map +1 -0
  121. package/dist/plan-review/write.js +51 -0
  122. package/dist/plan-review/write.js.map +1 -0
  123. package/dist/planning-pool/history-guard.d.ts +7 -1
  124. package/dist/planning-pool/history-guard.d.ts.map +1 -1
  125. package/dist/planning-pool/history-guard.js +13 -12
  126. package/dist/planning-pool/history-guard.js.map +1 -1
  127. package/dist/planning-pool/projection.d.ts +1 -1
  128. package/dist/planning-pool/projection.d.ts.map +1 -1
  129. package/dist/planning-pool/projection.js.map +1 -1
  130. package/dist/planning-pool/source-lexical.d.ts.map +1 -1
  131. package/dist/planning-pool/source-lexical.js +2 -22
  132. package/dist/planning-pool/source-lexical.js.map +1 -1
  133. package/dist/recommendation/override-types.d.ts +2 -2
  134. package/dist/recommendation/override-types.d.ts.map +1 -1
  135. package/dist/recommendation/override.d.ts +1 -1
  136. package/dist/recommendation/override.d.ts.map +1 -1
  137. package/dist/recommendation/override.js +6 -5
  138. package/dist/recommendation/override.js.map +1 -1
  139. package/dist/schema/registry.d.ts +1 -1
  140. package/dist/schema/registry.d.ts.map +1 -1
  141. package/dist/schema/registry.js +5 -2
  142. package/dist/schema/registry.js.map +1 -1
  143. package/dist/temporal-schedule/source-lexical.d.ts +5 -0
  144. package/dist/temporal-schedule/source-lexical.d.ts.map +1 -1
  145. package/dist/temporal-schedule/source-lexical.js +21 -4
  146. package/dist/temporal-schedule/source-lexical.js.map +1 -1
  147. package/dist/version.d.ts +1 -1
  148. package/dist/version.d.ts.map +1 -1
  149. package/dist/version.js +2 -1
  150. package/dist/version.js.map +1 -1
  151. package/package.json +1 -1
  152. package/schemas/Perttool.AdvanceResult.v4.schema.json +4 -1
  153. package/schemas/Perttool.AgentGuidanceResult.v1.schema.json +1 -1
  154. package/schemas/Perttool.AnalysisResult.v7.schema.json +1 -1
  155. package/schemas/Perttool.CheckResult.v6.schema.json +1 -1
  156. package/schemas/Perttool.CliError.v1.schema.json +1 -1
  157. package/schemas/Perttool.CommandHelpResult.v1.schema.json +2 -2
  158. package/schemas/Perttool.ExportResult.v1.schema.json +1 -1
  159. package/schemas/Perttool.FormatResult.v1.schema.json +1 -1
  160. package/schemas/Perttool.GuideResult.v1.schema.json +1 -1
  161. package/schemas/Perttool.HistoricalGraphResult.v1.schema.json +1 -1
  162. package/schemas/Perttool.ImportResult.v1.schema.json +1 -1
  163. package/schemas/Perttool.InitResult.v1.schema.json +1 -1
  164. package/schemas/Perttool.MilestoneAcceptanceMigrationResult.v1.schema.json +1 -1
  165. package/schemas/Perttool.MilestoneAcceptanceResult.v1.schema.json +1 -1
  166. package/schemas/Perttool.MutationResult.v6.schema.json +1 -1
  167. package/schemas/{Perttool.NextResult.v8.schema.json → Perttool.NextResult.v9.schema.json} +40 -7
  168. package/schemas/Perttool.PlanAssuranceResult.v2.schema.json +1 -1
  169. package/schemas/Perttool.PlanReviewMutationResult.v1.schema.json +2203 -0
  170. package/schemas/Perttool.PlanReviewResult.v1.schema.json +245 -0
  171. package/schemas/Perttool.PlanningMutationResult.v1.schema.json +1 -1
  172. package/schemas/Perttool.PlanningPoolResult.v1.schema.json +1 -1
  173. package/schemas/Perttool.PlanningReshapePreflightResult.v1.schema.json +1 -1
  174. package/schemas/Perttool.ProjectHistoryResult.v1.schema.json +1 -1
  175. package/schemas/Perttool.ProjectResult.v5.schema.json +1 -1
  176. package/schemas/Perttool.SchemaResult.v1.schema.json +1 -1
  177. package/schemas/Perttool.UnitMigrationResult.v5.schema.json +1 -1
  178. package/schemas/Perttool.VelocityObservationResult.v1.schema.json +1 -1
  179. package/dist/perttool-vscode-private-0.0.0-d1578b9.vsix +0 -0
@@ -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":"AAAA,wEAAwE;AAExE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAE7D,+EAA+E;AAC/E,MAAM,UAAU,uBAAuB,CAAC,KAAc,EAAE,OAAe;IACrE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,SAAS,GAAG,CAAC,KAAa;QACxB,KAAK,IAAI,KAAK,CAAC;QACf,OAAO,KAAK,IAAI,OAAO,CAAC;IAC1B,CAAC;IACD,SAAS,MAAM,CAAC,IAAY;QAC1B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,KAAa,CAAC;YAClB,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,KAAK,GAAG,CAAC,CAAC;iBACjC,IAAI,IAAI,GAAG,IAAI;gBAAE,KAAK,GAAG,CAAC,CAAC;iBAC3B,IAAI,IAAI,GAAG,IAAI;gBAAE,KAAK,GAAG,CAAC,CAAC;iBAC3B,IAAI,IAAI,GAAG,KAAK;gBAAE,KAAK,GAAG,CAAC,CAAC;iBAC5B,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBACxC,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;oBAAE,OAAO,KAAK,CAAC;gBACtD,KAAK,IAAI,CAAC,CAAC;gBACX,KAAK,GAAG,CAAC,CAAC;YACZ,CAAC;iBAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM;gBAAE,OAAO,KAAK,CAAC;;gBACrD,KAAK,GAAG,CAAC,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;QAChC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,SAAS,KAAK,CAAC,KAAyB;QACtC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QACnE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,SAAS,MAAM,CAAC,IAA6B;QAC3C,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;YACtF,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,SAAS,KAAK,CAAC,IAAa;QAC1B,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,OAAO,IAAI,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAC/D,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC1B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAA+B,CAAC,CAAC;QACrF,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -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"}
@@ -0,0 +1,268 @@
1
+ // R: Normalize and validate closed Plan Review mutation requests.
2
+ import { canonicalizeEventDateTimeSourceToken } from "../model/calendar.js";
3
+ import { compareStableStrings } from "../model/diagnostics.js";
4
+ import { rfc8785Json } from "../model/rfc8785.js";
5
+ import { sha256DigestUtf8 } from "../model/sha256.js";
6
+ import { PLAN_REVIEW_SOURCE_LIMITS } from "./source.js";
7
+ import { planReviewBatchFitsUtf8 } from "./request-size.js";
8
+ import { PLAN_REVIEW_CREATE_REQUEST_ID, PLAN_REVIEW_RESOLVE_REQUEST_ID, } from "./mutation-types.js";
9
+ const identifierPattern = /^[A-Za-z][A-Za-z0-9_-]*$/u;
10
+ const digestPattern = /^sha256:[0-9a-f]{64}$/u;
11
+ const encoder = new TextEncoder();
12
+ function diagnostic(message, cause) {
13
+ return Object.freeze({
14
+ code: "PTREV-104",
15
+ severity: "error",
16
+ message,
17
+ helpTopic: "editing",
18
+ data: Object.freeze({ cause }),
19
+ });
20
+ }
21
+ function failure(message, cause) {
22
+ return Object.freeze({
23
+ ok: false,
24
+ request: null,
25
+ diagnostics: Object.freeze([diagnostic(message, cause)]),
26
+ });
27
+ }
28
+ function record(input) {
29
+ return input !== null && typeof input === "object" && !Array.isArray(input)
30
+ ? input
31
+ : null;
32
+ }
33
+ function closed(value, fields) {
34
+ const allowed = new Set(fields);
35
+ return Object.keys(value).every((field) => allowed.has(field));
36
+ }
37
+ function nonemptyWithin(value, maximum) {
38
+ return typeof value === "string" && value.length > 0 &&
39
+ encoder.encode(value).byteLength <= maximum;
40
+ }
41
+ function validIdentifier(value) {
42
+ return typeof value === "string" && identifierPattern.test(value);
43
+ }
44
+ function canonicalDateTime(value) {
45
+ return typeof value === "string"
46
+ ? canonicalizeEventDateTimeSourceToken(value)
47
+ : null;
48
+ }
49
+ export function normalizePlanReviewCreateRequest(input) {
50
+ const value = record(input);
51
+ const fields = ["schemaVersion", "requestId", "taskId", "reason", "createdAt", "actor", "locator"];
52
+ if (value === null || !closed(value, fields)) {
53
+ return failure("invalid Plan Review create request", "unsupported_field");
54
+ }
55
+ if (value.schemaVersion !== PLAN_REVIEW_CREATE_REQUEST_ID) {
56
+ return failure("invalid Plan Review create request", "invalid_schema_version");
57
+ }
58
+ if (!validIdentifier(value.requestId) || !validIdentifier(value.taskId)) {
59
+ return failure("invalid Plan Review create request", "invalid_identity");
60
+ }
61
+ if (!nonemptyWithin(value.reason, PLAN_REVIEW_SOURCE_LIMITS.reasonUtf8Bytes)) {
62
+ return failure("invalid Plan Review create request", "invalid_reason");
63
+ }
64
+ const createdAt = canonicalDateTime(value.createdAt);
65
+ if (createdAt === null) {
66
+ return failure("invalid Plan Review create request", "invalid_created_at");
67
+ }
68
+ if (!validIdentifier(value.actor)) {
69
+ return failure("invalid Plan Review create request", "invalid_actor");
70
+ }
71
+ if (value.locator !== undefined &&
72
+ (typeof value.locator !== "string" ||
73
+ encoder.encode(value.locator).byteLength > PLAN_REVIEW_SOURCE_LIMITS.locatorUtf8Bytes)) {
74
+ return failure("invalid Plan Review create request", "invalid_locator");
75
+ }
76
+ return Object.freeze({
77
+ ok: true,
78
+ request: Object.freeze({
79
+ schemaVersion: PLAN_REVIEW_CREATE_REQUEST_ID,
80
+ requestId: value.requestId,
81
+ taskId: value.taskId,
82
+ reason: value.reason,
83
+ createdAt,
84
+ actor: value.actor,
85
+ locator: value.locator ?? null,
86
+ }),
87
+ diagnostics: Object.freeze([]),
88
+ });
89
+ }
90
+ function normalizedBatch(input) {
91
+ const value = record(input);
92
+ if (value === null || !closed(value, ["kind", "mutations"]) || value.kind !== "batch" ||
93
+ !Array.isArray(value.mutations) || value.mutations.length === 0 ||
94
+ value.mutations.length > 10_000)
95
+ return null;
96
+ if (value.mutations.some((item) => {
97
+ const mutation = record(item);
98
+ return mutation === null || typeof mutation.kind !== "string" ||
99
+ mutation.kind.startsWith("plan_review.") || !closedAtomicMutation(mutation);
100
+ }))
101
+ return null;
102
+ try {
103
+ if (!planReviewBatchFitsUtf8(value, 8_388_608))
104
+ return null;
105
+ const canonical = rfc8785Json(value);
106
+ if (encoder.encode(canonical).byteLength > 8_388_608)
107
+ return null;
108
+ return Object.freeze({
109
+ request: value,
110
+ canonical,
111
+ digest: sha256DigestUtf8(canonical),
112
+ });
113
+ }
114
+ catch {
115
+ return null;
116
+ }
117
+ }
118
+ const atomicFields = Object.freeze({
119
+ "project.set": ["kind", "set", "clear"],
120
+ "task.add": ["kind", "id", "from", "to", "task"],
121
+ "task.set": ["kind", "id", "from", "to", "set", "clear", "addTags", "removeTags", "upsertRequirements", "removeRequirements"],
122
+ "task.remove": ["kind", "id"],
123
+ "task.finish": ["kind", "id"],
124
+ "gate.add": ["kind", "id", "from", "to", "gate"],
125
+ "gate.set": ["kind", "id", "from", "to", "set"],
126
+ "gate.remove": ["kind", "id"],
127
+ "milestone.add": ["kind", "id", "milestone"],
128
+ "milestone.set": ["kind", "id", "set", "clear", "addTags", "removeTags"],
129
+ "milestone.remove": ["kind", "id"],
130
+ "resource.add": ["kind", "id", "resource"],
131
+ "resource.set": ["kind", "id", "set", "clear"],
132
+ "resource.remove": ["kind", "id"],
133
+ });
134
+ const nestedFields = Object.freeze({
135
+ projectSet: ["id", "version", "title", "description", "asOf", "durationUnit", "velocity", "finish", "goalOwner", "goalDelegates", "dagOwner", "dagDelegates", "criticalEpsilon", "targetDuration"],
136
+ task: ["title", "description", "duration", "estimate", "notBefore", "deadline", "status", "priority", "requirements", "owner", "tags", "blockedReason", "source"],
137
+ taskSet: ["title", "description", "duration", "estimate", "notBefore", "deadline", "status", "priority", "owner", "blockedReason", "source"],
138
+ estimate: ["optimistic", "mostLikely", "pessimistic"],
139
+ requirement: ["resourceId", "units"],
140
+ gate: ["reason"],
141
+ milestone: ["title", "description", "state", "deadline", "tags"],
142
+ milestoneSet: ["title", "description", "state", "deadline"],
143
+ resource: ["title", "capacity", "description"],
144
+ resourceSet: ["title", "description", "capacity"],
145
+ });
146
+ function closedOptionalObject(value, fields) {
147
+ if (value === undefined)
148
+ return true;
149
+ const object = record(value);
150
+ return object !== null && closed(object, fields);
151
+ }
152
+ function closedObjectArray(value, fields) {
153
+ return value === undefined || (Array.isArray(value) && value.every((item) => {
154
+ const object = record(item);
155
+ return object !== null && closed(object, fields);
156
+ }));
157
+ }
158
+ function taskMutationFieldsClosed(value, addition) {
159
+ const item = addition ? value["task"] : value["set"];
160
+ const fields = addition ? nestedFields["task"] : nestedFields["taskSet"];
161
+ if (!closedOptionalObject(item, fields))
162
+ return false;
163
+ const itemRecord = item === undefined ? null : record(item);
164
+ if (itemRecord !== null &&
165
+ !closedOptionalObject(itemRecord["estimate"], nestedFields["estimate"]))
166
+ return false;
167
+ if (itemRecord !== null &&
168
+ !closedObjectArray(itemRecord["requirements"], nestedFields["requirement"]))
169
+ return false;
170
+ return closedObjectArray(value["upsertRequirements"], nestedFields["requirement"]);
171
+ }
172
+ function namedMutationFieldsClosed(value, addition, additionField, additionShape, setShape) {
173
+ const item = addition ? value[additionField] : value["set"];
174
+ return closedOptionalObject(item, nestedFields[addition ? additionShape : setShape]);
175
+ }
176
+ function closedAtomicMutation(value) {
177
+ const kind = typeof value.kind === "string" ? value.kind : "";
178
+ const fields = atomicFields[kind];
179
+ if (fields === undefined || !closed(value, fields))
180
+ return false;
181
+ if (kind === "project.set") {
182
+ return closedOptionalObject(value["set"], nestedFields["projectSet"]);
183
+ }
184
+ if (kind === "task.add" || kind === "task.set") {
185
+ return taskMutationFieldsClosed(value, kind === "task.add");
186
+ }
187
+ if (kind === "gate.add" || kind === "gate.set") {
188
+ return namedMutationFieldsClosed(value, kind === "gate.add", "gate", "gate", "gate");
189
+ }
190
+ if (kind === "milestone.add" || kind === "milestone.set") {
191
+ return namedMutationFieldsClosed(value, kind === "milestone.add", "milestone", "milestone", "milestoneSet");
192
+ }
193
+ if (kind === "resource.add" || kind === "resource.set") {
194
+ return namedMutationFieldsClosed(value, kind === "resource.add", "resource", "resource", "resourceSet");
195
+ }
196
+ return true;
197
+ }
198
+ function resolveBasics(value) {
199
+ if (value.schemaVersion !== PLAN_REVIEW_RESOLVE_REQUEST_ID)
200
+ return "invalid_schema_version";
201
+ if (!validIdentifier(value.requestId))
202
+ return "invalid_request_id";
203
+ if (value.outcome !== "plan_retained" && value.outcome !== "plan_changed")
204
+ return "invalid_outcome";
205
+ const resolvedAt = canonicalDateTime(value.resolvedAt);
206
+ if (resolvedAt === null)
207
+ return "invalid_resolved_at";
208
+ if (!validIdentifier(value.actor))
209
+ return "invalid_actor";
210
+ if (!nonemptyWithin(value.resolutionReason, PLAN_REVIEW_SOURCE_LIMITS.resolutionReasonUtf8Bytes)) {
211
+ return "invalid_resolution_reason";
212
+ }
213
+ return Object.freeze({
214
+ requestId: value.requestId,
215
+ outcome: value.outcome,
216
+ resolvedAt,
217
+ actor: value.actor,
218
+ resolutionReason: value.resolutionReason,
219
+ });
220
+ }
221
+ function acceptedOwners(value) {
222
+ const accepted = value ?? [];
223
+ if (!Array.isArray(accepted) || accepted.some((owner) => !validIdentifier(owner)))
224
+ return null;
225
+ if (new Set(accepted).size !== accepted.length)
226
+ return null;
227
+ return Object.freeze([...accepted].sort(compareStableStrings));
228
+ }
229
+ function resolveBatch(outcome, request) {
230
+ if (outcome === "plan_retained")
231
+ return request === undefined ? null : "invalid";
232
+ return normalizedBatch(request) ?? "invalid";
233
+ }
234
+ export function normalizePlanReviewResolveRequest(input) {
235
+ const value = record(input);
236
+ const fields = ["schemaVersion", "requestId", "outcome", "resolvedAt", "actor", "resolutionReason", "acceptedOwners", "request"];
237
+ if (value === null || !closed(value, fields)) {
238
+ return failure("invalid Plan Review resolve request", "unsupported_field");
239
+ }
240
+ const basics = resolveBasics(value);
241
+ if (typeof basics === "string") {
242
+ return failure("invalid Plan Review resolve request", basics);
243
+ }
244
+ const accepted = acceptedOwners(value.acceptedOwners);
245
+ if (accepted === null) {
246
+ return failure("invalid Plan Review resolve request", "invalid_accepted_owner");
247
+ }
248
+ const batch = resolveBatch(basics.outcome, value.request);
249
+ if (batch === "invalid") {
250
+ return failure("invalid Plan Review resolve request", "invalid_change_request");
251
+ }
252
+ return Object.freeze({
253
+ ok: true,
254
+ request: Object.freeze({
255
+ schemaVersion: PLAN_REVIEW_RESOLVE_REQUEST_ID,
256
+ ...basics,
257
+ acceptedOwners: accepted,
258
+ request: batch?.request ?? null,
259
+ canonicalChangeRequest: batch?.canonical ?? null,
260
+ changeRequestDigest: batch?.digest ?? null,
261
+ }),
262
+ diagnostics: Object.freeze([]),
263
+ });
264
+ }
265
+ export function isSha256Digest(value) {
266
+ return digestPattern.test(value);
267
+ }
268
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/plan-review/request.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { SourceSpan } from "../model/diagnostics.js";
2
+ import { type TemporalSourceLine } from "../temporal-schedule/source-lexical.js";
3
+ export interface PlanReviewDeclarationBlock {
4
+ readonly id: string;
5
+ readonly taskId: string;
6
+ readonly header: TemporalSourceLine;
7
+ readonly lines: readonly TemporalSourceLine[];
8
+ readonly span: SourceSpan;
9
+ readonly idSpan: SourceSpan;
10
+ readonly taskIdSpan: SourceSpan;
11
+ }
12
+ export interface PlanReviewFieldBlock {
13
+ readonly name: string;
14
+ readonly rawValue: string;
15
+ readonly line: TemporalSourceLine;
16
+ readonly span: SourceSpan;
17
+ readonly valueSpan: SourceSpan;
18
+ }
19
+ export declare function scanPlanReviewDeclarationBlocks(text: string): readonly PlanReviewDeclarationBlock[];
20
+ export declare function planReviewFields(block: PlanReviewDeclarationBlock): readonly PlanReviewFieldBlock[];
21
+ export declare function malformedPlanReviewHeaderLines(text: string, blocks: readonly PlanReviewDeclarationBlock[]): readonly TemporalSourceLine[];
22
+ export declare function planReviewBaseText(text: string, blocks: readonly PlanReviewDeclarationBlock[]): string;
23
+ //# sourceMappingURL=source-lexical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-lexical.d.ts","sourceRoot":"","sources":["../../src/plan-review/source-lexical.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAML,KAAK,kBAAkB,EACxB,MAAM,wCAAwC,CAAC;AAEhD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;CAChC;AAuBD,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,GACX,SAAS,0BAA0B,EAAE,CA6BvC;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,0BAA0B,GAChC,SAAS,oBAAoB,EAAE,CAgBjC;AAED,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,0BAA0B,EAAE,GAC5C,SAAS,kBAAkB,EAAE,CAM/B;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,0BAA0B,EAAE,GAC5C,MAAM,CAER"}
@@ -0,0 +1,75 @@
1
+ import { maskSourceDeclarationBlocks, sourceDeclarationBlockEnd, sourcePosition, sourceSliceSpan, splitTemporalSourceLines, } from "../temporal-schedule/source-lexical.js";
2
+ const identifier = "[A-Za-z][A-Za-z0-9_-]*";
3
+ const headerPattern = new RegExp(`^plan_review_request (${identifier}) (${identifier}):$`, "u");
4
+ function headerText(line) {
5
+ return line.number === 0 && line.text.startsWith("\uFEFF")
6
+ ? line.text.slice(1)
7
+ : line.text;
8
+ }
9
+ function headerSpan(line, token, after = 0) {
10
+ const start = line.text.indexOf(token, after);
11
+ return sourceSliceSpan(line, start, start + token.length);
12
+ }
13
+ export function scanPlanReviewDeclarationBlocks(text) {
14
+ const lines = splitTemporalSourceLines(text);
15
+ const blocks = [];
16
+ for (let index = 0; index < lines.length; index += 1) {
17
+ const header = lines[index];
18
+ if (/^\s/u.test(header.text))
19
+ continue;
20
+ const match = headerPattern.exec(headerText(header));
21
+ if (match === null)
22
+ continue;
23
+ const end = sourceDeclarationBlockEnd(lines, index);
24
+ const body = lines.slice(index + 1, end);
25
+ const last = body.at(-1) ?? header;
26
+ const id = match[1];
27
+ const taskId = match[2];
28
+ const idSpan = headerSpan(header, id);
29
+ blocks.push(Object.freeze({
30
+ id,
31
+ taskId,
32
+ header,
33
+ lines: Object.freeze(body),
34
+ span: Object.freeze({
35
+ start: sourcePosition(header, 0),
36
+ end: sourcePosition(last, last.text.length),
37
+ }),
38
+ idSpan,
39
+ taskIdSpan: headerSpan(header, taskId, idSpan.end.column),
40
+ }));
41
+ index = end - 1;
42
+ }
43
+ return Object.freeze(blocks);
44
+ }
45
+ export function planReviewFields(block) {
46
+ return Object.freeze(block.lines.flatMap((line) => {
47
+ if (line.text === "" || /^\s*#/u.test(line.text))
48
+ return [];
49
+ const match = /^ ([a-z_]+) (.+)$/u.exec(line.text);
50
+ if (match === null)
51
+ return [];
52
+ const name = match[1];
53
+ const rawValue = match[2];
54
+ const valueColumn = name.length + 3;
55
+ return [Object.freeze({
56
+ name,
57
+ rawValue,
58
+ line,
59
+ span: sourceSliceSpan(line, 0, line.text.length),
60
+ valueSpan: sourceSliceSpan(line, valueColumn, valueColumn + rawValue.length),
61
+ })];
62
+ }));
63
+ }
64
+ export function malformedPlanReviewHeaderLines(text, blocks) {
65
+ const known = new Set(blocks.map(({ header }) => header.start));
66
+ return Object.freeze(splitTemporalSourceLines(text).filter((line) => {
67
+ if (known.has(line.start) || /^\s/u.test(line.text))
68
+ return false;
69
+ return /^(?:\uFEFF)?plan_review_request(?:\s|:|$)/u.test(line.text);
70
+ }));
71
+ }
72
+ export function planReviewBaseText(text, blocks) {
73
+ return maskSourceDeclarationBlocks(text, blocks, 10, 9);
74
+ }
75
+ //# sourceMappingURL=source-lexical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-lexical.js","sourceRoot":"","sources":["../../src/plan-review/source-lexical.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { DiagnosticCounts, SourceSpan } from "../model/diagnostics.js";
2
+ import type { TextEdit } from "../mutation/text-edits.js";
3
+ import type { PlanningPoolSourceModel } from "../planning-pool/source-types.js";
4
+ import type { TargetGrammar6ValidatedDocument } from "../semantic/target-validator.js";
5
+ export interface PlanReviewSourceCapability {
6
+ readonly id: "perttool.target-grammar-10-plan-review-source";
7
+ readonly version: 1;
8
+ readonly grammarVersion: 10;
9
+ }
10
+ export type PlanReviewOutcome = "plan_retained" | "plan_changed";
11
+ export type PlanReviewTaskReferenceState = "current" | "historical";
12
+ export interface PlanReviewRequestSource {
13
+ readonly kind: "plan_review_request";
14
+ readonly id: string;
15
+ readonly qualifiedId: string;
16
+ readonly taskId: string;
17
+ readonly qualifiedTaskId: string;
18
+ readonly taskReferenceState: PlanReviewTaskReferenceState;
19
+ readonly model: 1;
20
+ readonly reason: string;
21
+ readonly createdAt: string;
22
+ readonly createdBy: string;
23
+ readonly locator: string | null;
24
+ readonly outcome: PlanReviewOutcome | null;
25
+ readonly resolvedAt: string | null;
26
+ readonly resolvedBy: string | null;
27
+ readonly resolutionReason: string | null;
28
+ readonly reviewedSourceDigest: string | null;
29
+ readonly changeRequestDigest: string | null;
30
+ readonly planBasisBefore: string | null;
31
+ readonly planBasisAfter: string | null;
32
+ readonly span: SourceSpan;
33
+ readonly idSpan: SourceSpan;
34
+ readonly taskIdSpan: SourceSpan;
35
+ }
36
+ export interface PlanReviewSourceModel {
37
+ readonly schemaVersion: "Perttool.PlanReviewRequestModel.v1";
38
+ readonly modelVersion: 1;
39
+ readonly grammarVersion: 10;
40
+ readonly documentId: string;
41
+ readonly qualifiedNamespace: string;
42
+ readonly base: PlanningPoolSourceModel;
43
+ readonly baseDocument: TargetGrammar6ValidatedDocument;
44
+ readonly requests: readonly PlanReviewRequestSource[];
45
+ }
46
+ export interface PlanReviewSourceDiagnostic {
47
+ readonly code: string;
48
+ readonly severity: "error" | "warning" | "info";
49
+ readonly message: string;
50
+ readonly entityId?: string;
51
+ readonly span?: SourceSpan;
52
+ readonly data?: Readonly<Record<string, unknown>>;
53
+ }
54
+ export interface PlanReviewSourceResult {
55
+ readonly ok: boolean;
56
+ readonly grammarVersion: number | null;
57
+ readonly documentId: string | null;
58
+ readonly model: PlanReviewSourceModel | null;
59
+ readonly diagnostics: readonly PlanReviewSourceDiagnostic[];
60
+ readonly diagnosticCounts: DiagnosticCounts;
61
+ readonly diagnosticsTruncated: boolean;
62
+ }
63
+ export interface PlanReviewFormatResult {
64
+ readonly ok: boolean;
65
+ readonly documentId: string | null;
66
+ readonly changed: boolean;
67
+ readonly formattedText: string | null;
68
+ readonly edits: readonly TextEdit[];
69
+ readonly diagnostics: readonly PlanReviewSourceDiagnostic[];
70
+ readonly diagnosticsTruncated: boolean;
71
+ }
72
+ export interface PlanReviewProjectionV1 {
73
+ readonly model_version: 1;
74
+ readonly state: "clear" | "review_required";
75
+ readonly open_request_ids: readonly string[];
76
+ readonly required_actions: readonly ({
77
+ readonly kind: "review_before_new_downstream_work";
78
+ readonly request_ids: readonly string[];
79
+ })[];
80
+ }
81
+ //# sourceMappingURL=source-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-types.d.ts","sourceRoot":"","sources":["../../src/plan-review/source-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=source-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-types.js","sourceRoot":"","sources":["../../src/plan-review/source-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import type { PlanReviewSourceCapability, PlanReviewSourceModel, PlanReviewSourceResult } from "./source-types.js";
2
+ export declare const PLAN_REVIEW_SOURCE_MODEL_VERSION: 1;
3
+ export declare const PLAN_REVIEW_SOURCE_CAPABILITY: PlanReviewSourceCapability;
4
+ export declare const PLAN_REVIEW_SOURCE_LIMITS: Readonly<{
5
+ sourceOrCandidateUtf8Bytes: 8388608;
6
+ requests: 10000;
7
+ reasonUtf8Bytes: 16384;
8
+ resolutionReasonUtf8Bytes: 16384;
9
+ locatorUtf8Bytes: 8192;
10
+ }>;
11
+ export declare const PLAN_REVIEW_REQUEST_FIELD_ORDER: readonly ["model", "reason", "created_at", "created_by", "locator", "outcome", "resolved_at", "resolved_by", "resolution_reason", "reviewed_source_digest", "change_request_digest", "plan_basis_before", "plan_basis_after"];
12
+ export declare function parsePlanReviewSource(text: string, capability: PlanReviewSourceCapability, options?: Readonly<{
13
+ maxDiagnostics?: number;
14
+ }>): PlanReviewSourceResult;
15
+ export declare function planReviewSourceModel(source: PlanReviewSourceResult): PlanReviewSourceModel;
16
+ //# sourceMappingURL=source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/plan-review/source.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAGV,0BAA0B,EAE1B,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,gCAAgC,EAAG,CAAU,CAAC;AAE3D,eAAO,MAAM,6BAA6B,EAAE,0BAKxC,CAAC;AAEL,eAAO,MAAM,yBAAyB;;;;;;EAMpC,CAAC;AAEH,eAAO,MAAM,+BAA+B,+NAcjC,CAAC;AAkbZ,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,0BAA0B,EACtC,OAAO,GAAE,QAAQ,CAAC;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAAM,GAClD,sBAAsB,CAmDxB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,sBAAsB,GAC7B,qBAAqB,CAKvB"}