perttool 0.10.6 → 0.11.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 (241) hide show
  1. package/CHANGELOG.md +56 -1
  2. package/README.md +273 -609
  3. package/dist/application/cli-facade.d.ts +4 -10
  4. package/dist/application/cli-facade.d.ts.map +1 -1
  5. package/dist/application/cli-facade.js +1 -1
  6. package/dist/application/cli-facade.js.map +1 -1
  7. package/dist/application/contract10-candidate.d.ts +33 -0
  8. package/dist/application/contract10-candidate.d.ts.map +1 -0
  9. package/dist/application/contract10-candidate.js +38 -0
  10. package/dist/application/contract10-candidate.js.map +1 -0
  11. package/dist/application/contract10-planning-history.d.ts +4 -0
  12. package/dist/application/contract10-planning-history.d.ts.map +1 -0
  13. package/dist/application/contract10-planning-history.js +28 -0
  14. package/dist/application/contract10-planning-history.js.map +1 -0
  15. package/dist/application/contract10-planning.d.ts +61 -0
  16. package/dist/application/contract10-planning.d.ts.map +1 -0
  17. package/dist/application/contract10-planning.js +165 -0
  18. package/dist/application/contract10-planning.js.map +1 -0
  19. package/dist/application/contract10-runtime.d.ts +185 -0
  20. package/dist/application/contract10-runtime.d.ts.map +1 -0
  21. package/dist/application/contract10-runtime.js +236 -0
  22. package/dist/application/contract10-runtime.js.map +1 -0
  23. package/dist/application/contract8-milestone-acceptance.d.ts +6 -22
  24. package/dist/application/contract8-milestone-acceptance.d.ts.map +1 -1
  25. package/dist/application/contract8-milestone-acceptance.js +21 -99
  26. package/dist/application/contract8-milestone-acceptance.js.map +1 -1
  27. package/dist/application/contract8-milestone-read.d.ts +25 -0
  28. package/dist/application/contract8-milestone-read.d.ts.map +1 -0
  29. package/dist/application/contract8-milestone-read.js +111 -0
  30. package/dist/application/contract8-milestone-read.js.map +1 -0
  31. package/dist/application/contract9-assurance-evaluate.d.ts +3 -0
  32. package/dist/application/contract9-assurance-evaluate.d.ts.map +1 -0
  33. package/dist/application/contract9-assurance-evaluate.js +75 -0
  34. package/dist/application/contract9-assurance-evaluate.js.map +1 -0
  35. package/dist/application/contract9-assurance.d.ts +1 -2
  36. package/dist/application/contract9-assurance.d.ts.map +1 -1
  37. package/dist/application/contract9-assurance.js +2 -56
  38. package/dist/application/contract9-assurance.js.map +1 -1
  39. package/dist/application/contract9-candidate.d.ts +8 -0
  40. package/dist/application/contract9-candidate.d.ts.map +1 -1
  41. package/dist/application/contract9-candidate.js +36 -11
  42. package/dist/application/contract9-candidate.js.map +1 -1
  43. package/dist/application/contract9-mixed-mutation.d.ts +3 -0
  44. package/dist/application/contract9-mixed-mutation.d.ts.map +1 -1
  45. package/dist/application/contract9-mixed-mutation.js +5 -4
  46. package/dist/application/contract9-mixed-mutation.js.map +1 -1
  47. package/dist/application/contract9-temporal.js +1 -1
  48. package/dist/application/contract9-temporal.js.map +1 -1
  49. package/dist/application/target-actuals-analysis.d.ts.map +1 -1
  50. package/dist/application/target-actuals-analysis.js +10 -6
  51. package/dist/application/target-actuals-analysis.js.map +1 -1
  52. package/dist/application/target-temporal-analysis.d.ts +1 -0
  53. package/dist/application/target-temporal-analysis.d.ts.map +1 -1
  54. package/dist/application/target-temporal-analysis.js +5 -1
  55. package/dist/application/target-temporal-analysis.js.map +1 -1
  56. package/dist/cli.js +761 -87
  57. package/dist/cli.js.map +1 -1
  58. package/dist/command/contract10-discovery.d.ts +17 -0
  59. package/dist/command/contract10-discovery.d.ts.map +1 -0
  60. package/dist/command/contract10-discovery.js +304 -0
  61. package/dist/command/contract10-discovery.js.map +1 -0
  62. package/dist/command/contract10-usage.d.ts +24 -0
  63. package/dist/command/contract10-usage.d.ts.map +1 -0
  64. package/dist/command/contract10-usage.js +49 -0
  65. package/dist/command/contract10-usage.js.map +1 -0
  66. package/dist/core/index.d.ts +11 -2
  67. package/dist/core/index.d.ts.map +1 -1
  68. package/dist/core/index.js +3 -1
  69. package/dist/core/index.js.map +1 -1
  70. package/dist/help/assurance-guide.js +1 -1
  71. package/dist/help/assurance-guide.js.map +1 -1
  72. package/dist/help/contract10-guide.d.ts +10 -0
  73. package/dist/help/contract10-guide.d.ts.map +1 -0
  74. package/dist/help/contract10-guide.js +244 -0
  75. package/dist/help/contract10-guide.js.map +1 -0
  76. package/dist/index.d.ts +18 -8
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +8 -5
  79. package/dist/index.js.map +1 -1
  80. package/dist/milestone-acceptance/advance.d.ts +9 -0
  81. package/dist/milestone-acceptance/advance.d.ts.map +1 -1
  82. package/dist/milestone-acceptance/advance.js +29 -2
  83. package/dist/milestone-acceptance/advance.js.map +1 -1
  84. package/dist/milestone-acceptance/mutation.d.ts +2 -0
  85. package/dist/milestone-acceptance/mutation.d.ts.map +1 -1
  86. package/dist/milestone-acceptance/mutation.js +48 -12
  87. package/dist/milestone-acceptance/mutation.js.map +1 -1
  88. package/dist/model/source-result.d.ts +12 -0
  89. package/dist/model/source-result.d.ts.map +1 -0
  90. package/dist/model/source-result.js +16 -0
  91. package/dist/model/source-result.js.map +1 -0
  92. package/dist/mutation/advance-deletion.d.ts +1 -0
  93. package/dist/mutation/advance-deletion.d.ts.map +1 -1
  94. package/dist/mutation/advance-deletion.js +4 -1
  95. package/dist/mutation/advance-deletion.js.map +1 -1
  96. package/dist/mutation/validated-source.d.ts +30 -0
  97. package/dist/mutation/validated-source.d.ts.map +1 -0
  98. package/dist/mutation/validated-source.js +58 -0
  99. package/dist/mutation/validated-source.js.map +1 -0
  100. package/dist/node/planning-token-store.d.ts +3 -0
  101. package/dist/node/planning-token-store.d.ts.map +1 -0
  102. package/dist/node/planning-token-store.js +90 -0
  103. package/dist/node/planning-token-store.js.map +1 -0
  104. package/dist/parser/document-parser.d.ts +1 -0
  105. package/dist/parser/document-parser.d.ts.map +1 -1
  106. package/dist/parser/document-parser.js +1 -1
  107. package/dist/parser/document-parser.js.map +1 -1
  108. package/dist/perttool-vscode-private-0.0.0-d1578b9.vsix +0 -0
  109. package/dist/planning-pool/advance.d.ts +10 -0
  110. package/dist/planning-pool/advance.d.ts.map +1 -0
  111. package/dist/planning-pool/advance.js +158 -0
  112. package/dist/planning-pool/advance.js.map +1 -0
  113. package/dist/planning-pool/format.d.ts +12 -0
  114. package/dist/planning-pool/format.d.ts.map +1 -0
  115. package/dist/planning-pool/format.js +199 -0
  116. package/dist/planning-pool/format.js.map +1 -0
  117. package/dist/planning-pool/history-guard.d.ts +19 -0
  118. package/dist/planning-pool/history-guard.d.ts.map +1 -0
  119. package/dist/planning-pool/history-guard.js +123 -0
  120. package/dist/planning-pool/history-guard.js.map +1 -0
  121. package/dist/planning-pool/history-types.d.ts +174 -0
  122. package/dist/planning-pool/history-types.d.ts.map +1 -0
  123. package/dist/planning-pool/history-types.js +2 -0
  124. package/dist/planning-pool/history-types.js.map +1 -0
  125. package/dist/planning-pool/history.d.ts +11 -0
  126. package/dist/planning-pool/history.d.ts.map +1 -0
  127. package/dist/planning-pool/history.js +977 -0
  128. package/dist/planning-pool/history.js.map +1 -0
  129. package/dist/planning-pool/human.d.ts +9 -0
  130. package/dist/planning-pool/human.d.ts.map +1 -0
  131. package/dist/planning-pool/human.js +305 -0
  132. package/dist/planning-pool/human.js.map +1 -0
  133. package/dist/planning-pool/intent-types.d.ts +76 -0
  134. package/dist/planning-pool/intent-types.d.ts.map +1 -0
  135. package/dist/planning-pool/intent-types.js +2 -0
  136. package/dist/planning-pool/intent-types.js.map +1 -0
  137. package/dist/planning-pool/intent.d.ts +7 -0
  138. package/dist/planning-pool/intent.d.ts.map +1 -0
  139. package/dist/planning-pool/intent.js +590 -0
  140. package/dist/planning-pool/intent.js.map +1 -0
  141. package/dist/planning-pool/observation-types.d.ts +143 -0
  142. package/dist/planning-pool/observation-types.d.ts.map +1 -0
  143. package/dist/planning-pool/observation-types.js +2 -0
  144. package/dist/planning-pool/observation-types.js.map +1 -0
  145. package/dist/planning-pool/observation.d.ts +8 -0
  146. package/dist/planning-pool/observation.d.ts.map +1 -0
  147. package/dist/planning-pool/observation.js +582 -0
  148. package/dist/planning-pool/observation.js.map +1 -0
  149. package/dist/planning-pool/projection.d.ts +28 -0
  150. package/dist/planning-pool/projection.d.ts.map +1 -0
  151. package/dist/planning-pool/projection.js +148 -0
  152. package/dist/planning-pool/projection.js.map +1 -0
  153. package/dist/planning-pool/public-core.d.ts +32 -0
  154. package/dist/planning-pool/public-core.d.ts.map +1 -0
  155. package/dist/planning-pool/public-core.js +122 -0
  156. package/dist/planning-pool/public-core.js.map +1 -0
  157. package/dist/planning-pool/reshape-normalize.d.ts +15 -0
  158. package/dist/planning-pool/reshape-normalize.d.ts.map +1 -0
  159. package/dist/planning-pool/reshape-normalize.js +688 -0
  160. package/dist/planning-pool/reshape-normalize.js.map +1 -0
  161. package/dist/planning-pool/reshape-token.d.ts +20 -0
  162. package/dist/planning-pool/reshape-token.d.ts.map +1 -0
  163. package/dist/planning-pool/reshape-token.js +193 -0
  164. package/dist/planning-pool/reshape-token.js.map +1 -0
  165. package/dist/planning-pool/reshape-types.d.ts +183 -0
  166. package/dist/planning-pool/reshape-types.d.ts.map +1 -0
  167. package/dist/planning-pool/reshape-types.js +2 -0
  168. package/dist/planning-pool/reshape-types.js.map +1 -0
  169. package/dist/planning-pool/reshape.d.ts +13 -0
  170. package/dist/planning-pool/reshape.d.ts.map +1 -0
  171. package/dist/planning-pool/reshape.js +1434 -0
  172. package/dist/planning-pool/reshape.js.map +1 -0
  173. package/dist/planning-pool/source-lexical.d.ts +30 -0
  174. package/dist/planning-pool/source-lexical.d.ts.map +1 -0
  175. package/dist/planning-pool/source-lexical.js +158 -0
  176. package/dist/planning-pool/source-lexical.js.map +1 -0
  177. package/dist/planning-pool/source-types.d.ts +169 -0
  178. package/dist/planning-pool/source-types.d.ts.map +1 -0
  179. package/dist/planning-pool/source-types.js +2 -0
  180. package/dist/planning-pool/source-types.js.map +1 -0
  181. package/dist/planning-pool/source-values.d.ts +16 -0
  182. package/dist/planning-pool/source-values.d.ts.map +1 -0
  183. package/dist/planning-pool/source-values.js +120 -0
  184. package/dist/planning-pool/source-values.js.map +1 -0
  185. package/dist/planning-pool/source.d.ts +18 -0
  186. package/dist/planning-pool/source.d.ts.map +1 -0
  187. package/dist/planning-pool/source.js +811 -0
  188. package/dist/planning-pool/source.js.map +1 -0
  189. package/dist/planning-pool/window-types.d.ts +133 -0
  190. package/dist/planning-pool/window-types.d.ts.map +1 -0
  191. package/dist/planning-pool/window-types.js +2 -0
  192. package/dist/planning-pool/window-types.js.map +1 -0
  193. package/dist/planning-pool/window.d.ts +6 -0
  194. package/dist/planning-pool/window.d.ts.map +1 -0
  195. package/dist/planning-pool/window.js +625 -0
  196. package/dist/planning-pool/window.js.map +1 -0
  197. package/dist/schema/registry.d.ts +1 -1
  198. package/dist/schema/registry.d.ts.map +1 -1
  199. package/dist/schema/registry.js +17 -3
  200. package/dist/schema/registry.js.map +1 -1
  201. package/dist/temporal-schedule/format.d.ts.map +1 -1
  202. package/dist/temporal-schedule/format.js +4 -54
  203. package/dist/temporal-schedule/format.js.map +1 -1
  204. package/dist/temporal-schedule/source-lexical.d.ts +9 -0
  205. package/dist/temporal-schedule/source-lexical.d.ts.map +1 -1
  206. package/dist/temporal-schedule/source-lexical.js +21 -10
  207. package/dist/temporal-schedule/source-lexical.js.map +1 -1
  208. package/dist/temporal-schedule/source.d.ts.map +1 -1
  209. package/dist/temporal-schedule/source.js +3 -13
  210. package/dist/temporal-schedule/source.js.map +1 -1
  211. package/dist/version.d.ts +1 -1
  212. package/dist/version.js +1 -1
  213. package/package.json +1 -1
  214. package/schemas/{Perttool.AdvanceResult.v3.schema.json → Perttool.AdvanceResult.v4.schema.json} +42 -4
  215. package/schemas/Perttool.AgentGuidanceResult.v1.schema.json +1 -1
  216. package/schemas/Perttool.AnalysisResult.v7.schema.json +1 -1
  217. package/schemas/Perttool.CheckResult.v6.schema.json +1 -1
  218. package/schemas/Perttool.CliError.v1.schema.json +1 -1
  219. package/schemas/Perttool.CommandHelpResult.v1.schema.json +2 -2
  220. package/schemas/Perttool.ExportResult.v1.schema.json +1 -1
  221. package/schemas/Perttool.FormatResult.v1.schema.json +1 -1
  222. package/schemas/Perttool.GuideResult.v1.schema.json +1 -1
  223. package/schemas/Perttool.HistoricalGraphResult.v1.schema.json +1 -1
  224. package/schemas/Perttool.ImportResult.v1.schema.json +1 -1
  225. package/schemas/Perttool.InitResult.v1.schema.json +1 -1
  226. package/schemas/Perttool.MilestoneAcceptanceMigrationResult.v1.schema.json +1 -1
  227. package/schemas/Perttool.MilestoneAcceptanceResult.v1.schema.json +1 -1
  228. package/schemas/Perttool.MutationResult.v6.schema.json +1 -1
  229. package/schemas/Perttool.NextResult.v8.schema.json +7 -4
  230. package/schemas/Perttool.PlanAssuranceResult.v2.schema.json +1 -1
  231. package/schemas/Perttool.PlanningMutationResult.v1.schema.json +567 -0
  232. package/schemas/Perttool.PlanningObservationRequest.v1.schema.json +6 -0
  233. package/schemas/Perttool.PlanningPoolResult.v1.schema.json +469 -0
  234. package/schemas/Perttool.PlanningReshapePreflightResult.v1.schema.json +906 -0
  235. package/schemas/Perttool.PlanningReshapeRequest.v1.schema.json +19 -0
  236. package/schemas/Perttool.ProjectHistoryResult.v1.schema.json +1 -1
  237. package/schemas/Perttool.ProjectResult.v5.schema.json +1 -1
  238. package/schemas/Perttool.SchemaResult.v1.schema.json +1 -1
  239. package/schemas/{Perttool.UnitMigrationResult.v4.schema.json → Perttool.UnitMigrationResult.v5.schema.json} +42 -17
  240. package/schemas/Perttool.VelocityObservationResult.v1.schema.json +1 -1
  241. package/schemas/Perttool.WindowMutationRequest.v1.schema.json +6 -0
@@ -0,0 +1,590 @@
1
+ export const PLANNING_INTENT_REQUEST_SCHEMA_VERSION = "Perttool.PlanningIntentRequest.v1";
2
+ const digestPattern = /^sha256:[0-9a-f]{64}$/u;
3
+ const qualifiedPattern = /^[A-Za-z][A-Za-z0-9_-]*::[A-Za-z][A-Za-z0-9_-]*$/u;
4
+ function diagnostic(message) {
5
+ return Object.freeze({
6
+ code: "PTPOOL-118",
7
+ severity: "error",
8
+ message,
9
+ data: Object.freeze({}),
10
+ });
11
+ }
12
+ function record(value) {
13
+ return typeof value === "object" && value !== null && !Array.isArray(value)
14
+ ? value
15
+ : null;
16
+ }
17
+ function closed(value, fields, label, diagnostics) {
18
+ const parsed = record(value);
19
+ if (parsed === null) {
20
+ diagnostics.push(diagnostic(`${label} must be an object`));
21
+ return null;
22
+ }
23
+ const expected = new Set(fields);
24
+ const missing = fields.filter((field) => !Object.hasOwn(parsed, field));
25
+ const unknown = Object.keys(parsed).filter((field) => !expected.has(field));
26
+ if (missing.length > 0)
27
+ diagnostics.push(diagnostic(`${label} is missing fields: ${missing.join(", ")}`));
28
+ if (unknown.length > 0)
29
+ diagnostics.push(diagnostic(`${label} has unknown fields: ${unknown.join(", ")}`));
30
+ return missing.length === 0 && unknown.length === 0 ? parsed : null;
31
+ }
32
+ function text(value, label, diagnostics, nonEmpty = true) {
33
+ if (typeof value !== "string" || (nonEmpty && value.length === 0)) {
34
+ diagnostics.push(diagnostic(`${label} must be ${nonEmpty ? "a non-empty" : "a"} string`));
35
+ return null;
36
+ }
37
+ return value;
38
+ }
39
+ function nullableText(value, label, diagnostics, nonEmpty) {
40
+ return value === null ? null : text(value, label, diagnostics, nonEmpty) ?? undefined;
41
+ }
42
+ function qualified(value, label, diagnostics) {
43
+ const parsed = text(value, label, diagnostics);
44
+ if (parsed !== null && !qualifiedPattern.test(parsed)) {
45
+ diagnostics.push(diagnostic(`${label} must be a fully qualified identity`));
46
+ return null;
47
+ }
48
+ return parsed;
49
+ }
50
+ function nullableQualified(value, label, diagnostics) {
51
+ return value === null ? null : qualified(value, label, diagnostics) ?? undefined;
52
+ }
53
+ function qualifiedSet(value, label, diagnostics) {
54
+ if (!Array.isArray(value)) {
55
+ diagnostics.push(diagnostic(`${label} must be an array`));
56
+ return null;
57
+ }
58
+ const result = value.map((item) => qualified(item, label, diagnostics));
59
+ if (result.some((item) => item === null))
60
+ return null;
61
+ const strings = result;
62
+ if (new Set(strings).size !== strings.length)
63
+ diagnostics.push(diagnostic(`${label} contains a duplicate`));
64
+ return Object.freeze([...strings].sort());
65
+ }
66
+ function booleanValue(value, label, diagnostics) {
67
+ if (typeof value !== "boolean") {
68
+ diagnostics.push(diagnostic(`${label} must be boolean`));
69
+ return null;
70
+ }
71
+ return value;
72
+ }
73
+ function parseCarryTarget(value, diagnostics) {
74
+ if (value === null)
75
+ return null;
76
+ const kind = record(value)?.["kind"];
77
+ if (kind === "existing") {
78
+ const parsed = closed(value, ["kind", "window_id"], "existing carry-over target", diagnostics);
79
+ const windowId = parsed === null ? null : qualified(parsed["window_id"], "carry-over window_id", diagnostics);
80
+ return parsed === null || windowId === null ? undefined : Object.freeze({ kind, window_id: windowId });
81
+ }
82
+ if (kind === "new") {
83
+ const parsed = closed(value, ["kind", "window_id", "title", "objective", "start", "end"], "new carry-over target", diagnostics);
84
+ if (parsed === null)
85
+ return undefined;
86
+ const windowId = qualified(parsed["window_id"], "carry-over window_id", diagnostics);
87
+ const title = text(parsed["title"], "carry-over title", diagnostics);
88
+ const objective = text(parsed["objective"], "carry-over objective", diagnostics);
89
+ const start = nullableText(parsed["start"], "carry-over start", diagnostics, true);
90
+ const end = nullableText(parsed["end"], "carry-over end", diagnostics, true);
91
+ return windowId === null || title === null || objective === null || start === undefined || end === undefined
92
+ ? undefined
93
+ : Object.freeze({ kind, window_id: windowId, title, objective, start, end });
94
+ }
95
+ diagnostics.push(diagnostic("carry_over_target must be null, existing, or new"));
96
+ return undefined;
97
+ }
98
+ function parseCreateWorkAction(value, diagnostics) {
99
+ const parsed = closed(value, ["kind", "work_id", "title", "description", "insert_after_work_id"], "create_work action", diagnostics);
100
+ if (parsed === null)
101
+ return null;
102
+ const workId = qualified(parsed["work_id"], "work_id", diagnostics);
103
+ const title = text(parsed["title"], "title", diagnostics);
104
+ const description = text(parsed["description"], "description", diagnostics, false);
105
+ const anchor = nullableQualified(parsed["insert_after_work_id"], "insert_after_work_id", diagnostics);
106
+ return workId === null || title === null || description === null || anchor === undefined
107
+ ? null
108
+ : Object.freeze({ kind: "create_work", work_id: workId, title, description, insert_after_work_id: anchor });
109
+ }
110
+ function parseUpdateWorkAction(value, diagnostics) {
111
+ const parsed = closed(value, ["kind", "work_id", "title", "description"], "update_work action", diagnostics);
112
+ if (parsed === null)
113
+ return null;
114
+ const workId = qualified(parsed["work_id"], "work_id", diagnostics);
115
+ const title = nullableText(parsed["title"], "title", diagnostics, true);
116
+ const description = nullableText(parsed["description"], "description", diagnostics, false);
117
+ if (title === null && description === null)
118
+ diagnostics.push(diagnostic("update_work requires title or description"));
119
+ return workId === null || title === undefined || description === undefined || (title === null && description === null)
120
+ ? null
121
+ : Object.freeze({ kind: "update_work", work_id: workId, title, description });
122
+ }
123
+ function parseMoveWorkAction(value, diagnostics) {
124
+ const parsed = closed(value, ["kind", "work_id", "insert_after_work_id"], "move_work action", diagnostics);
125
+ if (parsed === null)
126
+ return null;
127
+ const workId = qualified(parsed["work_id"], "work_id", diagnostics);
128
+ const anchor = nullableQualified(parsed["insert_after_work_id"], "insert_after_work_id", diagnostics);
129
+ return workId === null || anchor === undefined ? null : Object.freeze({ kind: "move_work", work_id: workId, insert_after_work_id: anchor });
130
+ }
131
+ function parseDependencyAction(value, diagnostics) {
132
+ const parsed = closed(value, ["kind", "dependent_work_id", "prerequisite_work_id", "present"], "set_dependency action", diagnostics);
133
+ if (parsed === null)
134
+ return null;
135
+ const dependent = qualified(parsed["dependent_work_id"], "dependent_work_id", diagnostics);
136
+ const prerequisite = qualified(parsed["prerequisite_work_id"], "prerequisite_work_id", diagnostics);
137
+ const present = booleanValue(parsed["present"], "present", diagnostics);
138
+ return dependent === null || prerequisite === null || present === null
139
+ ? null
140
+ : Object.freeze({ kind: "set_dependency", dependent_work_id: dependent, prerequisite_work_id: prerequisite, present });
141
+ }
142
+ function parseArchiveAction(value, diagnostics) {
143
+ const parsed = closed(value, ["kind", "work_id"], "archive_work action", diagnostics);
144
+ const workId = parsed === null ? null : qualified(parsed["work_id"], "work_id", diagnostics);
145
+ return parsed === null || workId === null ? null : Object.freeze({ kind: "archive_work", work_id: workId });
146
+ }
147
+ function parseProjectAction(value, diagnostics) {
148
+ const parsed = closed(value, ["kind", "event_ids", "activity_ids"], "project action", diagnostics);
149
+ if (parsed === null)
150
+ return null;
151
+ const events = qualifiedSet(parsed["event_ids"], "event_ids", diagnostics);
152
+ const activities = qualifiedSet(parsed["activity_ids"], "activity_ids", diagnostics);
153
+ if ((events?.length ?? 0) + (activities?.length ?? 0) === 0)
154
+ diagnostics.push(diagnostic("project action must select at least one entity"));
155
+ return events === null || activities === null || events.length + activities.length === 0
156
+ ? null
157
+ : Object.freeze({ kind: "project", event_ids: events, activity_ids: activities });
158
+ }
159
+ function parseDeferAction(value, diagnostics) {
160
+ const parsed = closed(value, ["kind", "task_ids", "milestone_ids"], "defer action", diagnostics);
161
+ if (parsed === null)
162
+ return null;
163
+ const tasks = qualifiedSet(parsed["task_ids"], "task_ids", diagnostics);
164
+ const milestones = qualifiedSet(parsed["milestone_ids"], "milestone_ids", diagnostics);
165
+ if ((tasks?.length ?? 0) + (milestones?.length ?? 0) === 0)
166
+ diagnostics.push(diagnostic("defer action must select at least one entity"));
167
+ return tasks === null || milestones === null || tasks.length + milestones.length === 0
168
+ ? null
169
+ : Object.freeze({ kind: "defer", task_ids: tasks, milestone_ids: milestones });
170
+ }
171
+ function parseCreateWindowAction(value, diagnostics) {
172
+ const parsed = closed(value, ["kind", "window_id", "title", "objective", "start", "end", "work_ids"], "create_window action", diagnostics);
173
+ if (parsed === null)
174
+ return null;
175
+ const windowId = qualified(parsed["window_id"], "window_id", diagnostics);
176
+ const title = text(parsed["title"], "title", diagnostics);
177
+ const objective = text(parsed["objective"], "objective", diagnostics);
178
+ const start = nullableText(parsed["start"], "start", diagnostics, true);
179
+ const end = nullableText(parsed["end"], "end", diagnostics, true);
180
+ const works = qualifiedSet(parsed["work_ids"], "work_ids", diagnostics);
181
+ if (works !== null && works.length === 0)
182
+ diagnostics.push(diagnostic("create_window requires at least one Work"));
183
+ return windowId === null || title === null || objective === null || start === undefined || end === undefined || works === null || works.length === 0
184
+ ? null
185
+ : Object.freeze({ kind: "create_window", window_id: windowId, title, objective, start, end, work_ids: works });
186
+ }
187
+ function parseMembershipAction(value, diagnostics) {
188
+ const parsed = closed(value, ["kind", "window_id", "work_id", "selected"], "set_window_membership action", diagnostics);
189
+ if (parsed === null)
190
+ return null;
191
+ const windowId = qualified(parsed["window_id"], "window_id", diagnostics);
192
+ const workId = qualified(parsed["work_id"], "work_id", diagnostics);
193
+ const selected = booleanValue(parsed["selected"], "selected", diagnostics);
194
+ return windowId === null || workId === null || selected === null
195
+ ? null
196
+ : Object.freeze({ kind: "set_window_membership", window_id: windowId, work_id: workId, selected });
197
+ }
198
+ function parseCloseWindowAction(value, diagnostics) {
199
+ const parsed = closed(value, ["kind", "window_id", "carry_over_work_ids", "carry_over_target"], "close_window action", diagnostics);
200
+ if (parsed === null)
201
+ return null;
202
+ const windowId = qualified(parsed["window_id"], "window_id", diagnostics);
203
+ const works = qualifiedSet(parsed["carry_over_work_ids"], "carry_over_work_ids", diagnostics);
204
+ const target = parseCarryTarget(parsed["carry_over_target"], diagnostics);
205
+ if (works !== null && (works.length === 0) !== (target === null))
206
+ diagnostics.push(diagnostic("close_window requires a target exactly when carry-over is non-empty"));
207
+ return windowId === null || works === null || target === undefined || ((works.length === 0) !== (target === null))
208
+ ? null
209
+ : Object.freeze({ kind: "close_window", window_id: windowId, carry_over_work_ids: works, carry_over_target: target });
210
+ }
211
+ function parseAction(value, diagnostics) {
212
+ switch (record(value)?.["kind"]) {
213
+ case "create_work": return parseCreateWorkAction(value, diagnostics);
214
+ case "update_work": return parseUpdateWorkAction(value, diagnostics);
215
+ case "move_work": return parseMoveWorkAction(value, diagnostics);
216
+ case "set_dependency": return parseDependencyAction(value, diagnostics);
217
+ case "archive_work": return parseArchiveAction(value, diagnostics);
218
+ case "project": return parseProjectAction(value, diagnostics);
219
+ case "defer": return parseDeferAction(value, diagnostics);
220
+ case "create_window": return parseCreateWindowAction(value, diagnostics);
221
+ case "set_window_membership": return parseMembershipAction(value, diagnostics);
222
+ case "close_window": return parseCloseWindowAction(value, diagnostics);
223
+ }
224
+ diagnostics.push(diagnostic("Planning intent action kind is unsupported"));
225
+ return null;
226
+ }
227
+ function normalizeIntent(input, diagnostics) {
228
+ const parsed = closed(input, ["request_schema_version", "source_digest", "action"], "Planning intent request", diagnostics);
229
+ if (parsed === null)
230
+ return null;
231
+ if (parsed["request_schema_version"] !== PLANNING_INTENT_REQUEST_SCHEMA_VERSION) {
232
+ diagnostics.push(diagnostic("Planning intent request schema identity is unsupported"));
233
+ }
234
+ const sourceDigest = text(parsed["source_digest"], "source_digest", diagnostics);
235
+ if (sourceDigest !== null && !digestPattern.test(sourceDigest))
236
+ diagnostics.push(diagnostic("source_digest must be a lowercase SHA-256 identity"));
237
+ const action = parseAction(parsed["action"], diagnostics);
238
+ return sourceDigest === null || !digestPattern.test(sourceDigest) || action === null
239
+ ? null
240
+ : Object.freeze({ request_schema_version: PLANNING_INTENT_REQUEST_SCHEMA_VERSION, source_digest: sourceDigest, action });
241
+ }
242
+ export function isPlanningIntentRequest(input) {
243
+ return record(input)?.["request_schema_version"] === PLANNING_INTENT_REQUEST_SCHEMA_VERSION;
244
+ }
245
+ function local(qualifiedId) {
246
+ return qualifiedId.slice(qualifiedId.indexOf("::") + 2);
247
+ }
248
+ function findWork(model, id, diagnostics) {
249
+ const work = model.works.find(({ qualifiedId }) => qualifiedId === id) ?? null;
250
+ if (work === null)
251
+ diagnostics.push(diagnostic(`Work ${id} does not exist`));
252
+ return work;
253
+ }
254
+ function descriptionElement(work, destinationText, index, discard = false) {
255
+ const source = work.description?.value ?? "";
256
+ if (source.length === 0 && destinationText.length === 0 && !discard)
257
+ return null;
258
+ return Object.freeze({
259
+ element_id: `INTENT_DESCRIPTION_${String(index).padStart(4, "0")}`,
260
+ origin: Object.freeze({
261
+ kind: "existing",
262
+ work_id: work.qualifiedId,
263
+ start_utf16: 0,
264
+ end_utf16: source.length,
265
+ source_text: source,
266
+ }),
267
+ destination: discard
268
+ ? Object.freeze({ kind: "discard", reason: "explicit eligible archive" })
269
+ : Object.freeze({ kind: "work", work_id: work.qualifiedId, position: 0, text: destinationText }),
270
+ });
271
+ }
272
+ function preservedRelations(model, affected) {
273
+ const entities = new Map();
274
+ const associations = [];
275
+ const links = [];
276
+ const dependencies = [];
277
+ const memberships = [];
278
+ for (const work of model.works.filter(({ qualifiedId }) => affected.has(qualifiedId))) {
279
+ for (const event of work.events) {
280
+ entities.set(`event:${event.qualifiedId}`, Object.freeze({ entity_kind: "event", entity_id: event.qualifiedId, action: "retain" }));
281
+ associations.push(Object.freeze({ entity_kind: "event", entity_id: event.qualifiedId, origin_work_id: work.qualifiedId, destination_work_id: work.qualifiedId }));
282
+ }
283
+ for (const activity of work.activities) {
284
+ entities.set(`activity:${activity.qualifiedId}`, Object.freeze({ entity_kind: "activity", entity_id: activity.qualifiedId, action: "retain" }));
285
+ associations.push(Object.freeze({ entity_kind: "activity", entity_id: activity.qualifiedId, origin_work_id: work.qualifiedId, destination_work_id: work.qualifiedId }));
286
+ }
287
+ for (const milestone of work.milestoneLinks) {
288
+ links.push(Object.freeze({ strict_kind: "milestone", strict_id: milestone.qualifiedId, origin_work_id: work.qualifiedId, destination_work_id: work.qualifiedId }));
289
+ }
290
+ for (const task of work.taskLinks) {
291
+ links.push(Object.freeze({ strict_kind: "task", strict_id: task.qualifiedId, origin_work_id: work.qualifiedId, destination_work_id: work.qualifiedId }));
292
+ }
293
+ }
294
+ for (const dependent of model.works) {
295
+ for (const prerequisite of dependent.dependsOn) {
296
+ if (affected.has(dependent.qualifiedId) || affected.has(prerequisite.qualifiedId)) {
297
+ dependencies.push(Object.freeze({
298
+ dependent_work_id: dependent.qualifiedId,
299
+ prerequisite_work_id: prerequisite.qualifiedId,
300
+ action: "retain",
301
+ }));
302
+ }
303
+ }
304
+ }
305
+ for (const window of model.windows) {
306
+ for (const work of window.works) {
307
+ if (affected.has(work.qualifiedId))
308
+ memberships.push(Object.freeze({
309
+ window_id: window.qualifiedId,
310
+ origin_work_id: work.qualifiedId,
311
+ destination_work_id: work.qualifiedId,
312
+ }));
313
+ }
314
+ }
315
+ return { entities: [...entities.values()], associations, links, dependencies, memberships };
316
+ }
317
+ function orderedWorkIds(model) {
318
+ const declared = model.workOrder.map(({ qualifiedId }) => qualifiedId);
319
+ return declared.length === model.works.length
320
+ ? [...declared]
321
+ : model.works.map(({ qualifiedId }) => qualifiedId);
322
+ }
323
+ function moveAfter(order, id, after) {
324
+ const result = order.filter((candidate) => candidate !== id);
325
+ const position = after === null ? 0 : result.indexOf(after) + 1;
326
+ result.splice(Math.max(0, position), 0, id);
327
+ return result;
328
+ }
329
+ function reshapeBase(request, affected, relations) {
330
+ return {
331
+ request_schema_version: "Perttool.PlanningReshapeRequest.v2",
332
+ normalization_contract: "perttool.planning-reshape-normalization@2",
333
+ source_digest: request.source_digest,
334
+ intent: "reshape",
335
+ affected_work_ids: affected,
336
+ created_works: [],
337
+ work_title_dispositions: [],
338
+ removed_work_ids: [],
339
+ semantic_elements: [],
340
+ planning_entity_dispositions: relations.entities,
341
+ association_dispositions: relations.associations,
342
+ projection_link_dispositions: relations.links,
343
+ dependency_dispositions: relations.dependencies,
344
+ window_membership_dispositions: relations.memberships,
345
+ final_work_order: [],
346
+ add_residual_description: [],
347
+ strict_fragment: null,
348
+ window_close: null,
349
+ };
350
+ }
351
+ function compileCreateWork(request, action, model, diagnostics) {
352
+ if (model.works.some(({ qualifiedId }) => qualifiedId === action.work_id))
353
+ diagnostics.push(diagnostic(`Work ${action.work_id} already exists`));
354
+ if (action.insert_after_work_id !== null)
355
+ findWork(model, action.insert_after_work_id, diagnostics);
356
+ const relations = preservedRelations(model, new Set());
357
+ const base = reshapeBase(request, [action.work_id], relations);
358
+ const order = moveAfter([...orderedWorkIds(model), action.work_id], action.work_id, action.insert_after_work_id);
359
+ const semanticElements = action.description.length === 0
360
+ ? Object.freeze([])
361
+ : Object.freeze([Object.freeze({
362
+ element_id: "INTENT_DESCRIPTION_0001",
363
+ origin: Object.freeze({ kind: "created", source_text: action.description, asserted_new_meaning: true }),
364
+ destination: Object.freeze({ kind: "work", work_id: action.work_id, position: 0, text: action.description }),
365
+ })]);
366
+ return Object.freeze({
367
+ ...base,
368
+ created_works: Object.freeze([{ work_id: action.work_id, title: action.title, insert_after_work_id: action.insert_after_work_id }]),
369
+ semantic_elements: semanticElements,
370
+ final_work_order: Object.freeze(order),
371
+ });
372
+ }
373
+ function compileMoveWork(request, action, model, diagnostics) {
374
+ findWork(model, action.work_id, diagnostics);
375
+ if (action.insert_after_work_id !== null)
376
+ findWork(model, action.insert_after_work_id, diagnostics);
377
+ if (action.work_id === action.insert_after_work_id)
378
+ diagnostics.push(diagnostic("A Work cannot be moved after itself"));
379
+ const base = reshapeBase(request, [], preservedRelations(model, new Set()));
380
+ return Object.freeze({ ...base, final_work_order: Object.freeze(moveAfter(orderedWorkIds(model), action.work_id, action.insert_after_work_id)) });
381
+ }
382
+ function compileWorkMaintenance(request, action, model, diagnostics) {
383
+ const work = findWork(model, action.work_id, diagnostics);
384
+ if (work === null)
385
+ return null;
386
+ const affected = new Set([action.work_id]);
387
+ const base = reshapeBase(request, [action.work_id], preservedRelations(model, affected));
388
+ const archive = action.kind === "archive_work";
389
+ const desiredDescription = archive ? "" : action.description ?? work.description?.value ?? "";
390
+ const element = descriptionElement(work, desiredDescription, 1, archive);
391
+ return Object.freeze({
392
+ ...base,
393
+ intent: archive ? "archive" : "reshape",
394
+ work_title_dispositions: archive || action.title === null
395
+ ? Object.freeze([])
396
+ : Object.freeze([{ work_id: action.work_id, title: action.title }]),
397
+ removed_work_ids: archive ? Object.freeze([action.work_id]) : Object.freeze([]),
398
+ semantic_elements: element === null ? Object.freeze([]) : Object.freeze([element]),
399
+ final_work_order: archive
400
+ ? Object.freeze(orderedWorkIds(model).filter((id) => id !== action.work_id))
401
+ : Object.freeze([]),
402
+ });
403
+ }
404
+ function unchangedDescriptionElements(model, affected) {
405
+ return Object.freeze(model.works.filter(({ qualifiedId }) => affected.has(qualifiedId))
406
+ .map((work, index) => descriptionElement(work, work.description?.value ?? "", index + 1))
407
+ .filter((item) => item !== null));
408
+ }
409
+ function compileDependency(request, action, model, diagnostics) {
410
+ const dependent = findWork(model, action.dependent_work_id, diagnostics);
411
+ const prerequisite = findWork(model, action.prerequisite_work_id, diagnostics);
412
+ if (action.dependent_work_id === action.prerequisite_work_id)
413
+ diagnostics.push(diagnostic("A Work cannot depend on itself"));
414
+ if (dependent === null || prerequisite === null)
415
+ return null;
416
+ const exists = dependent.dependsOn.some(({ qualifiedId }) => qualifiedId === action.prerequisite_work_id);
417
+ if (exists === action.present)
418
+ return reshapeBase(request, [], preservedRelations(model, new Set()));
419
+ const affected = new Set([action.dependent_work_id, action.prerequisite_work_id]);
420
+ const base = reshapeBase(request, [...affected].sort(), preservedRelations(model, affected));
421
+ const targetKey = `${action.dependent_work_id}|${action.prerequisite_work_id}`;
422
+ const retained = base.dependency_dispositions.filter((item) => `${item.dependent_work_id}|${item.prerequisite_work_id}` !== targetKey);
423
+ const disposition = Object.freeze({
424
+ dependent_work_id: action.dependent_work_id,
425
+ prerequisite_work_id: action.prerequisite_work_id,
426
+ action: action.present ? "create" : "no_longer_required",
427
+ ...(action.present ? {} : { reason: "explicit dependency maintenance" }),
428
+ });
429
+ return Object.freeze({
430
+ ...base,
431
+ semantic_elements: unchangedDescriptionElements(model, affected),
432
+ dependency_dispositions: Object.freeze([...retained, disposition]),
433
+ });
434
+ }
435
+ function compileProject(request, action, model) {
436
+ const eventSet = new Set(action.event_ids);
437
+ const activitySet = new Set(action.activity_ids);
438
+ const affected = new Set(model.works.filter((work) => work.events.some(({ qualifiedId }) => eventSet.has(qualifiedId)) ||
439
+ work.activities.some(({ qualifiedId }) => activitySet.has(qualifiedId)))
440
+ .map(({ qualifiedId }) => qualifiedId));
441
+ const relations = preservedRelations(model, affected);
442
+ const entityMap = new Map(relations.entities.map((item) => [`${item.entity_kind}:${item.entity_id}`, item]));
443
+ for (const id of action.event_ids)
444
+ entityMap.set(`event:${id}`, Object.freeze({ entity_kind: "event", entity_id: id, action: "project" }));
445
+ for (const id of action.activity_ids)
446
+ entityMap.set(`activity:${id}`, Object.freeze({ entity_kind: "activity", entity_id: id, action: "project" }));
447
+ const associations = relations.associations.map((item) => (item.entity_kind === "event" ? eventSet : activitySet).has(item.entity_id)
448
+ ? Object.freeze({ ...item, destination_work_id: null })
449
+ : item);
450
+ const addedLinks = associations.flatMap((item) => {
451
+ const selected = (item.entity_kind === "event" ? eventSet : activitySet).has(item.entity_id);
452
+ return !selected || item.origin_work_id === null ? [] : [Object.freeze({
453
+ strict_kind: item.entity_kind === "event" ? "milestone" : "task",
454
+ strict_id: item.entity_id,
455
+ origin_work_id: null,
456
+ destination_work_id: item.origin_work_id,
457
+ })];
458
+ });
459
+ const base = reshapeBase(request, [...affected].sort(), { ...relations, entities: [...entityMap.values()], associations, links: [...relations.links, ...addedLinks] });
460
+ return Object.freeze({
461
+ ...base,
462
+ intent: "project",
463
+ semantic_elements: unchangedDescriptionElements(model, affected),
464
+ strict_fragment: Object.freeze({ kind: "project", event_ids: action.event_ids, activity_ids: action.activity_ids }),
465
+ });
466
+ }
467
+ function compileDefer(request, action, model) {
468
+ const taskSet = new Set(action.task_ids);
469
+ const milestoneSet = new Set(action.milestone_ids);
470
+ const affected = new Set(model.works.filter((work) => work.taskLinks.some(({ qualifiedId }) => taskSet.has(qualifiedId)) ||
471
+ work.milestoneLinks.some(({ qualifiedId }) => milestoneSet.has(qualifiedId)))
472
+ .map(({ qualifiedId }) => qualifiedId));
473
+ const relations = preservedRelations(model, affected);
474
+ const entityMap = new Map(relations.entities.map((item) => [`${item.entity_kind}:${item.entity_id}`, item]));
475
+ for (const id of action.task_ids)
476
+ entityMap.set(`activity:${id}`, Object.freeze({ entity_kind: "activity", entity_id: id, action: "defer" }));
477
+ for (const id of action.milestone_ids)
478
+ entityMap.set(`event:${id}`, Object.freeze({ entity_kind: "event", entity_id: id, action: "defer" }));
479
+ const associations = [...relations.associations];
480
+ const links = relations.links.map((item) => {
481
+ const selected = (item.strict_kind === "task" ? taskSet : milestoneSet).has(item.strict_id);
482
+ if (!selected)
483
+ return item;
484
+ associations.push(Object.freeze({
485
+ entity_kind: item.strict_kind === "task" ? "activity" : "event",
486
+ entity_id: item.strict_id,
487
+ origin_work_id: null,
488
+ destination_work_id: item.origin_work_id,
489
+ }));
490
+ return Object.freeze({ ...item, destination_work_id: null });
491
+ });
492
+ const base = reshapeBase(request, [...affected].sort(), { ...relations, entities: [...entityMap.values()], associations, links });
493
+ return Object.freeze({
494
+ ...base,
495
+ intent: "defer",
496
+ semantic_elements: unchangedDescriptionElements(model, affected),
497
+ strict_fragment: Object.freeze({ kind: "defer", task_ids: action.task_ids, milestone_ids: action.milestone_ids }),
498
+ });
499
+ }
500
+ function compileReshape(request, model, diagnostics) {
501
+ const action = request.action;
502
+ switch (action.kind) {
503
+ case "create_work": return compileCreateWork(request, action, model, diagnostics);
504
+ case "update_work": return compileWorkMaintenance(request, action, model, diagnostics);
505
+ case "move_work": return compileMoveWork(request, action, model, diagnostics);
506
+ case "set_dependency": return compileDependency(request, action, model, diagnostics);
507
+ case "archive_work": return compileWorkMaintenance(request, action, model, diagnostics);
508
+ case "project": return compileProject(request, action, model);
509
+ case "defer": return compileDefer(request, action, model);
510
+ default: return null;
511
+ }
512
+ }
513
+ function compileWindow(request, model, diagnostics) {
514
+ const action = request.action;
515
+ if (action.kind === "create_window")
516
+ return Object.freeze({
517
+ request_schema_version: "Perttool.WindowMutationRequest.v1",
518
+ source_digest: request.source_digest,
519
+ operation: "add",
520
+ window_id: action.window_id,
521
+ final: Object.freeze({ title: action.title, objective: action.objective, start: action.start, end: action.end, work_ids: action.work_ids }),
522
+ objective_disposition: null,
523
+ carry_over_work_ids: Object.freeze([]),
524
+ carry_over_target: null,
525
+ });
526
+ if (action.kind === "set_window_membership") {
527
+ const window = model.windows.find(({ qualifiedId }) => qualifiedId === action.window_id);
528
+ if (window === undefined) {
529
+ diagnostics.push(diagnostic(`Window ${action.window_id} does not exist`));
530
+ return null;
531
+ }
532
+ findWork(model, action.work_id, diagnostics);
533
+ const works = new Set(window.works.map(({ qualifiedId }) => qualifiedId));
534
+ if (action.selected)
535
+ works.add(action.work_id);
536
+ else
537
+ works.delete(action.work_id);
538
+ return Object.freeze({
539
+ request_schema_version: "Perttool.WindowMutationRequest.v1",
540
+ source_digest: request.source_digest,
541
+ operation: "set",
542
+ window_id: action.window_id,
543
+ final: Object.freeze({
544
+ title: window.title,
545
+ objective: window.objective,
546
+ start: window.start?.sourceText ?? null,
547
+ end: window.end?.sourceText ?? null,
548
+ work_ids: Object.freeze([...works].sort()),
549
+ }),
550
+ objective_disposition: null,
551
+ carry_over_work_ids: Object.freeze([]),
552
+ carry_over_target: null,
553
+ });
554
+ }
555
+ if (action.kind === "close_window")
556
+ return Object.freeze({
557
+ request_schema_version: "Perttool.WindowMutationRequest.v1",
558
+ source_digest: request.source_digest,
559
+ operation: "close",
560
+ window_id: action.window_id,
561
+ final: null,
562
+ objective_disposition: "discard",
563
+ carry_over_work_ids: action.carry_over_work_ids,
564
+ carry_over_target: action.carry_over_target,
565
+ });
566
+ return null;
567
+ }
568
+ export function compilePlanningIntentRequest(input, model) {
569
+ const diagnostics = [];
570
+ const normalizedIntent = normalizeIntent(input, diagnostics);
571
+ if (normalizedIntent === null || diagnostics.length > 0)
572
+ return Object.freeze({
573
+ ok: false,
574
+ normalizedIntent: null,
575
+ reshapeRequest: null,
576
+ windowRequest: null,
577
+ diagnostics: Object.freeze(diagnostics),
578
+ });
579
+ const windowAction = ["create_window", "set_window_membership", "close_window"].includes(normalizedIntent.action.kind);
580
+ const reshapeRequest = windowAction ? null : compileReshape(normalizedIntent, model, diagnostics);
581
+ const windowRequest = windowAction ? compileWindow(normalizedIntent, model, diagnostics) : null;
582
+ return Object.freeze({
583
+ ok: diagnostics.length === 0 && (reshapeRequest !== null || windowRequest !== null),
584
+ normalizedIntent,
585
+ reshapeRequest,
586
+ windowRequest,
587
+ diagnostics: Object.freeze(diagnostics),
588
+ });
589
+ }
590
+ //# sourceMappingURL=intent.js.map