things-api 0.9.0 → 0.11.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 (261) hide show
  1. package/README.md +57 -12
  2. package/dist/audit/log.js +56 -2
  3. package/dist/audit/log.js.map +1 -1
  4. package/dist/audit/schema.d.ts +26 -8
  5. package/dist/audit/schema.js +42 -1
  6. package/dist/audit/schema.js.map +1 -1
  7. package/dist/cli/clock.d.ts +8 -0
  8. package/dist/cli/clock.js +24 -0
  9. package/dist/cli/clock.js.map +1 -0
  10. package/dist/cli/commands/area.d.ts +26 -3
  11. package/dist/cli/commands/area.js +129 -75
  12. package/dist/cli/commands/area.js.map +1 -1
  13. package/dist/cli/commands/doctor.d.ts +1 -1
  14. package/dist/cli/commands/doctor.js +44 -5
  15. package/dist/cli/commands/doctor.js.map +1 -1
  16. package/dist/cli/commands/install-skill.d.ts +45 -0
  17. package/dist/cli/commands/install-skill.js +207 -0
  18. package/dist/cli/commands/install-skill.js.map +1 -0
  19. package/dist/cli/commands/mcp.js +23 -4
  20. package/dist/cli/commands/mcp.js.map +1 -1
  21. package/dist/cli/commands/project.d.ts +18 -1
  22. package/dist/cli/commands/project.js +74 -35
  23. package/dist/cli/commands/project.js.map +1 -1
  24. package/dist/cli/commands/reads.d.ts +15 -2
  25. package/dist/cli/commands/reads.js +459 -165
  26. package/dist/cli/commands/reads.js.map +1 -1
  27. package/dist/cli/commands/repeat-flags.d.ts +20 -0
  28. package/dist/cli/commands/repeat-flags.js +76 -0
  29. package/dist/cli/commands/repeat-flags.js.map +1 -0
  30. package/dist/cli/commands/setup.js +8 -4
  31. package/dist/cli/commands/setup.js.map +1 -1
  32. package/dist/cli/commands/show.js +53 -30
  33. package/dist/cli/commands/show.js.map +1 -1
  34. package/dist/cli/commands/todo.d.ts +1 -1
  35. package/dist/cli/commands/todo.js +20 -13
  36. package/dist/cli/commands/todo.js.map +1 -1
  37. package/dist/cli/commands/writes.js +388 -161
  38. package/dist/cli/commands/writes.js.map +1 -1
  39. package/dist/cli/did-you-mean.d.ts +1 -1
  40. package/dist/cli/excess-args.d.ts +15 -0
  41. package/dist/cli/excess-args.js +51 -0
  42. package/dist/cli/excess-args.js.map +1 -0
  43. package/dist/cli/glyphs.d.ts +55 -2
  44. package/dist/cli/glyphs.js +114 -21
  45. package/dist/cli/glyphs.js.map +1 -1
  46. package/dist/cli/help.d.ts +54 -0
  47. package/dist/cli/help.js +405 -0
  48. package/dist/cli/help.js.map +1 -0
  49. package/dist/cli/main.js +64 -26
  50. package/dist/cli/main.js.map +1 -1
  51. package/dist/cli/move-hint.d.ts +45 -0
  52. package/dist/cli/move-hint.js +196 -0
  53. package/dist/cli/move-hint.js.map +1 -0
  54. package/dist/cli/period.d.ts +9 -8
  55. package/dist/cli/period.js +56 -30
  56. package/dist/cli/period.js.map +1 -1
  57. package/dist/cli/read-driver.d.ts +26 -19
  58. package/dist/cli/read-driver.js +77 -33
  59. package/dist/cli/read-driver.js.map +1 -1
  60. package/dist/cli/render.d.ts +92 -28
  61. package/dist/cli/render.js +333 -103
  62. package/dist/cli/render.js.map +1 -1
  63. package/dist/cli/resolve-invocation.d.ts +42 -4
  64. package/dist/cli/resolve-invocation.js +97 -14
  65. package/dist/cli/resolve-invocation.js.map +1 -1
  66. package/dist/cli/skill-check.d.ts +21 -0
  67. package/dist/cli/skill-check.js +82 -0
  68. package/dist/cli/skill-check.js.map +1 -0
  69. package/dist/cli/skill.d.ts +62 -0
  70. package/dist/cli/skill.js +142 -0
  71. package/dist/cli/skill.js.map +1 -0
  72. package/dist/cli/tag-filters.d.ts +63 -0
  73. package/dist/cli/tag-filters.js +59 -0
  74. package/dist/cli/tag-filters.js.map +1 -0
  75. package/dist/cli/verb-hint.d.ts +25 -0
  76. package/dist/cli/verb-hint.js +163 -0
  77. package/dist/cli/verb-hint.js.map +1 -0
  78. package/dist/cli/version.d.ts +4 -0
  79. package/dist/cli/version.js +18 -0
  80. package/dist/cli/version.js.map +1 -0
  81. package/dist/cli/width.d.ts +135 -0
  82. package/dist/cli/width.js +313 -0
  83. package/dist/cli/width.js.map +1 -0
  84. package/dist/client.d.ts +160 -24
  85. package/dist/client.js +132 -19
  86. package/dist/client.js.map +1 -1
  87. package/dist/config.d.ts +11 -0
  88. package/dist/config.js +3 -0
  89. package/dist/config.js.map +1 -1
  90. package/dist/contracts.d.ts +97 -17
  91. package/dist/contracts.js +44 -1
  92. package/dist/contracts.js.map +1 -1
  93. package/dist/db/fingerprint.d.ts +12 -0
  94. package/dist/db/fingerprint.js +15 -1
  95. package/dist/db/fingerprint.js.map +1 -1
  96. package/dist/db/locate.js +1 -1
  97. package/dist/db/locate.js.map +1 -1
  98. package/dist/diagnose.d.ts +63 -0
  99. package/dist/diagnose.js +38 -1
  100. package/dist/diagnose.js.map +1 -1
  101. package/dist/index.d.ts +36 -5
  102. package/dist/index.js +38 -2
  103. package/dist/index.js.map +1 -1
  104. package/dist/mcp/server.d.ts +9 -1
  105. package/dist/mcp/server.js +1038 -436
  106. package/dist/mcp/server.js.map +1 -1
  107. package/dist/model/clock.d.ts +61 -0
  108. package/dist/model/clock.js +71 -0
  109. package/dist/model/clock.js.map +1 -0
  110. package/dist/model/dates.d.ts +26 -3
  111. package/dist/model/dates.js +84 -3
  112. package/dist/model/dates.js.map +1 -1
  113. package/dist/model/entities.d.ts +48 -10
  114. package/dist/model/entities.js.map +1 -1
  115. package/dist/model/mappers.d.ts +9 -2
  116. package/dist/model/mappers.js +32 -9
  117. package/dist/model/mappers.js.map +1 -1
  118. package/dist/model/serialize.d.ts +28 -0
  119. package/dist/model/serialize.js +80 -0
  120. package/dist/model/serialize.js.map +1 -0
  121. package/dist/model/when-sugar.d.ts +47 -0
  122. package/dist/model/when-sugar.js +45 -0
  123. package/dist/model/when-sugar.js.map +1 -0
  124. package/dist/read/area-view.d.ts +8 -1
  125. package/dist/read/area-view.js +55 -17
  126. package/dist/read/area-view.js.map +1 -1
  127. package/dist/read/detail.d.ts +1 -1
  128. package/dist/read/detail.js +11 -4
  129. package/dist/read/detail.js.map +1 -1
  130. package/dist/read/filter-contract.d.ts +117 -0
  131. package/dist/read/filter-contract.js +78 -0
  132. package/dist/read/filter-contract.js.map +1 -0
  133. package/dist/read/log-boundary.d.ts +1 -1
  134. package/dist/read/log-boundary.js +13 -3
  135. package/dist/read/log-boundary.js.map +1 -1
  136. package/dist/read/predicates.d.ts +30 -0
  137. package/dist/read/predicates.js +30 -0
  138. package/dist/read/predicates.js.map +1 -1
  139. package/dist/read/project-view.d.ts +12 -1
  140. package/dist/read/project-view.js +45 -12
  141. package/dist/read/project-view.js.map +1 -1
  142. package/dist/read/queries.d.ts +152 -7
  143. package/dist/read/queries.js +277 -36
  144. package/dist/read/queries.js.map +1 -1
  145. package/dist/read/sections.d.ts +51 -0
  146. package/dist/read/sections.js +37 -0
  147. package/dist/read/sections.js.map +1 -0
  148. package/dist/read/sidebar-order.js +2 -1
  149. package/dist/read/sidebar-order.js.map +1 -1
  150. package/dist/read/snapshot.d.ts +1 -1
  151. package/dist/read/snapshot.js +9 -2
  152. package/dist/read/snapshot.js.map +1 -1
  153. package/dist/read/tags.d.ts +27 -3
  154. package/dist/read/tags.js +83 -12
  155. package/dist/read/tags.js.map +1 -1
  156. package/dist/read/truncation.d.ts +71 -0
  157. package/dist/read/{pagination.js → truncation.js} +103 -94
  158. package/dist/read/truncation.js.map +1 -0
  159. package/dist/read/views.d.ts +147 -22
  160. package/dist/read/views.js +282 -80
  161. package/dist/read/views.js.map +1 -1
  162. package/dist/surface-copy.d.ts +19 -0
  163. package/dist/surface-copy.js +32 -0
  164. package/dist/surface-copy.js.map +1 -1
  165. package/dist/sync-health.d.ts +78 -0
  166. package/dist/sync-health.js +312 -0
  167. package/dist/sync-health.js.map +1 -0
  168. package/dist/write/accessibility-probe.d.ts +12 -0
  169. package/dist/write/accessibility-probe.js +71 -0
  170. package/dist/write/accessibility-probe.js.map +1 -0
  171. package/dist/write/automation-probe.d.ts +8 -1
  172. package/dist/write/automation-probe.js +16 -1
  173. package/dist/write/automation-probe.js.map +1 -1
  174. package/dist/write/batch.js +5 -2
  175. package/dist/write/batch.js.map +1 -1
  176. package/dist/write/capabilities.d.ts +8 -0
  177. package/dist/write/capabilities.js +13 -6
  178. package/dist/write/capabilities.js.map +1 -1
  179. package/dist/write/commands.d.ts +3 -1
  180. package/dist/write/commands.js +602 -49
  181. package/dist/write/commands.js.map +1 -1
  182. package/dist/write/edit-checklist.js +3 -2
  183. package/dist/write/edit-checklist.js.map +1 -1
  184. package/dist/write/guards.d.ts +2 -7
  185. package/dist/write/guards.js +87 -6
  186. package/dist/write/guards.js.map +1 -1
  187. package/dist/write/heading.js +2 -0
  188. package/dist/write/heading.js.map +1 -1
  189. package/dist/write/lock.d.ts +40 -2
  190. package/dist/write/lock.js +91 -14
  191. package/dist/write/lock.js.map +1 -1
  192. package/dist/write/make-repeating-project.d.ts +4 -0
  193. package/dist/write/make-repeating-project.js +253 -0
  194. package/dist/write/make-repeating-project.js.map +1 -0
  195. package/dist/write/operations.d.ts +145 -1
  196. package/dist/write/operations.js +48 -0
  197. package/dist/write/operations.js.map +1 -1
  198. package/dist/write/pipeline.d.ts +73 -2
  199. package/dist/write/pipeline.js +218 -43
  200. package/dist/write/pipeline.js.map +1 -1
  201. package/dist/write/planner.js +8 -1
  202. package/dist/write/planner.js.map +1 -1
  203. package/dist/write/pre-state.d.ts +105 -3
  204. package/dist/write/pre-state.js +144 -3
  205. package/dist/write/pre-state.js.map +1 -1
  206. package/dist/write/recurrence-rule-blob.d.ts +65 -0
  207. package/dist/write/recurrence-rule-blob.js +150 -0
  208. package/dist/write/recurrence-rule-blob.js.map +1 -0
  209. package/dist/write/reopen.js +3 -2
  210. package/dist/write/reopen.js.map +1 -1
  211. package/dist/write/reorder.js +27 -17
  212. package/dist/write/reorder.js.map +1 -1
  213. package/dist/write/repeat-rule.d.ts +22 -0
  214. package/dist/write/repeat-rule.js +258 -0
  215. package/dist/write/repeat-rule.js.map +1 -0
  216. package/dist/write/reversibility.js +49 -0
  217. package/dist/write/reversibility.js.map +1 -1
  218. package/dist/write/tag-refs.d.ts +47 -0
  219. package/dist/write/tag-refs.js +126 -0
  220. package/dist/write/tag-refs.js.map +1 -0
  221. package/dist/write/undo.d.ts +74 -5
  222. package/dist/write/undo.js +493 -80
  223. package/dist/write/undo.js.map +1 -1
  224. package/dist/write/vectors/registry.d.ts +15 -1
  225. package/dist/write/vectors/registry.js +65 -2
  226. package/dist/write/vectors/registry.js.map +1 -1
  227. package/dist/write/vectors/simulator.d.ts +44 -0
  228. package/dist/write/vectors/simulator.js +1136 -0
  229. package/dist/write/vectors/simulator.js.map +1 -0
  230. package/dist/write/vectors/types.d.ts +154 -3
  231. package/dist/write/vectors/ui-certification.d.ts +54 -0
  232. package/dist/write/vectors/ui-certification.js +43 -0
  233. package/dist/write/vectors/ui-certification.js.map +1 -0
  234. package/dist/write/vectors/ui-drag.d.ts +188 -0
  235. package/dist/write/vectors/ui-drag.js +1095 -0
  236. package/dist/write/vectors/ui-drag.js.map +1 -0
  237. package/dist/write/vectors/ui-recipes.d.ts +83 -0
  238. package/dist/write/vectors/ui-recipes.js +610 -0
  239. package/dist/write/vectors/ui-recipes.js.map +1 -0
  240. package/dist/write/vectors/ui.d.ts +152 -0
  241. package/dist/write/vectors/ui.js +704 -0
  242. package/dist/write/vectors/ui.js.map +1 -0
  243. package/dist/write/verify/delta.d.ts +141 -4
  244. package/dist/write/verify/delta.js +199 -21
  245. package/dist/write/verify/delta.js.map +1 -1
  246. package/dist/write/verify/poller.d.ts +7 -1
  247. package/dist/write/verify/poller.js +21 -1
  248. package/dist/write/verify/poller.js.map +1 -1
  249. package/package.json +18 -3
  250. package/skills/things-cli/SKILL.md +53 -0
  251. package/skills/things-cli/references/contracts.md +41 -0
  252. package/skills/things-cli/references/gui.md +11 -0
  253. package/skills/things-cli/references/model.md +51 -0
  254. package/dist/cli/exit-codes.d.ts +0 -26
  255. package/dist/cli/exit-codes.js +0 -26
  256. package/dist/cli/exit-codes.js.map +0 -1
  257. package/dist/cli/output.d.ts +0 -42
  258. package/dist/cli/output.js +0 -16
  259. package/dist/cli/output.js.map +0 -1
  260. package/dist/read/pagination.d.ts +0 -104
  261. package/dist/read/pagination.js.map +0 -1
@@ -3,7 +3,7 @@
3
3
  * world BEFORE a mutation. One read pass, snapshot semantics per statement.
4
4
  */
5
5
  import type { DatabaseSync } from "node:sqlite";
6
- import type { AnyTask, Project, TaskStatus, Todo } from "../model/entities.ts";
6
+ import type { AnyTask, Project, TaskStatus, TaskType, Todo } from "../model/entities.ts";
7
7
  import type { ContainerRef, ReorderParams } from "./operations.ts";
8
8
  export interface ResolvedContainer {
9
9
  uuid: string;
@@ -56,8 +56,14 @@ export interface PreState {
56
56
  destArea: ContainerResolution | null;
57
57
  /** Heading resolution inside the destination (or target's) project. */
58
58
  destHeading: ContainerResolution | null;
59
- /** Requested tag titles absent from TMTag (case-insensitive). */
59
+ /** Requested tag refs that resolve to no tag (unknown tags). */
60
60
  missingTags: string[];
61
+ /**
62
+ * Resolved leaf titles for the tag SET ops (todo.add/set-tags,
63
+ * project.set-tags, area.add/update) — name/path refs de-duplicated. What
64
+ * actually gets applied (by name, app-resolved) + asserted.
65
+ */
66
+ resolvedTagTitles: string[];
61
67
  /** tag.add parent resolution. */
62
68
  parentTag: ContainerResolution | null;
63
69
  /** area.delete / tag.delete target resolution (TMArea/TMTag). */
@@ -76,15 +82,111 @@ export interface PreState {
76
82
  sameTitleUuids: string[];
77
83
  /** Scope membership + wire list for the reorder operation. */
78
84
  reorder: ReorderPre | null;
85
+ /**
86
+ * area.reorder: the FULL area uuid list ordered by TMArea."index"
87
+ * (the canonical area order once materialized) — feeds the ordering delta's
88
+ * capture list so undo can restore the exact previous position.
89
+ */
90
+ areaOrder: string[] | null;
91
+ /** project.make-repeating: the row-selection taxonomy (UIC4-f). */
92
+ projectRepeat: ProjectRepeatTaxonomy | null;
93
+ /**
94
+ * project.make-repeating: the uuids of the source subtree rows (non-trashed
95
+ * to-dos + headings) captured pre-write — the result's `childrenReplaced`
96
+ * counts how many of these are dead post-op. Null for non-project ops.
97
+ */
98
+ repeatSubtreeUuids: string[] | null;
99
+ /** heading.convert-to-project: the project-reveal + heading-row ordinal (HEADCERT1). */
100
+ headingConvert: HeadingConvertTaxonomy | null;
79
101
  }
102
+ /**
103
+ * Row-selection taxonomy for `project.make-repeating` (UIC4-f). A project is
104
+ * made repeating by selecting it as a content-table ROW (settable
105
+ * AXSelectedRows), reachable in its AREA view or the SOMEDAY view but NOT the
106
+ * Anytime view (an area-less anytime project renders as a header there). The
107
+ * classifier resolves which view reveals a selectable row, or refuses.
108
+ */
109
+ export type ProjectRepeatRefusal = "not-a-project" | "trashed" | "logged" | "already-repeating" | "ambiguous-row" | "unexpected-start";
110
+ export type ProjectRepeatTaxonomy = {
111
+ /** Selectable row in the project's AREA view — reveal the area, then select the row. */
112
+ kind: "area";
113
+ /** The area uuid revealed via things:///show?id= to render the row. */
114
+ containerReveal: string;
115
+ title: string;
116
+ } | {
117
+ /** Area-less someday project — a selectable row in the SOMEDAY view. */
118
+ kind: "someday";
119
+ /** Literal "someday" (things:///show?id=someday). */
120
+ containerReveal: "someday";
121
+ title: string;
122
+ } | {
123
+ /**
124
+ * Area-less ANYTIME project — no selectable row in the Anytime view
125
+ * (renders as a header, UIC4-d). Reachable only after a cleanup-free
126
+ * coercion to Someday; the orchestrator does that leg, never the drive.
127
+ */
128
+ kind: "anytime";
129
+ title: string;
130
+ } | {
131
+ kind: "refuse";
132
+ refusal: ProjectRepeatRefusal;
133
+ detail: string;
134
+ };
80
135
  export declare function emptyPreState(): PreState;
136
+ /**
137
+ * The uuids of a project's source subtree rows (non-trashed to-dos AND
138
+ * headings, direct or heading-nested). `childrenReplaced` counts how many of
139
+ * these are dead post-op — the whole subtree in the delete-remint fate, just
140
+ * the flattened nested-template row in the nested-repeater preserve fate.
141
+ */
142
+ export declare function projectSubtreeUuids(db: DatabaseSync, projectUuid: string): string[];
143
+ /**
144
+ * Taxonomy for `heading.convert-to-project`'s pure-AX drive (HEADCERT1). A
145
+ * heading is not selectable via `things:///show` (the reveal URL selects to-dos
146
+ * only — the UIC1 blocker), but revealing the heading's PARENT PROJECT shows its
147
+ * content table, in which the heading renders as a selectable ROW. The row
148
+ * exposes no stable AX title handle (its title lives only in a hover-dependent
149
+ * "More" affordance), so identity is POSITIONAL: `ordinal` is the heading's
150
+ * 0-based position among the project's non-trashed headings in display (`index`)
151
+ * order, and the select-heading-row primitive walks the content table selecting
152
+ * the Nth row that is selectable AND has an empty `selected to dos` readback (a
153
+ * heading, not a to-do). Two same-titled headings are therefore unambiguous.
154
+ */
155
+ export type HeadingConvertTaxonomy = {
156
+ kind: "ok";
157
+ projectReveal: string;
158
+ ordinal: number;
159
+ } | {
160
+ kind: "refuse";
161
+ refusal: "not-a-heading" | "no-project" | "not-found";
162
+ detail: string;
163
+ };
164
+ export declare function classifyHeadingConvert(db: DatabaseSync, target: AnyTask | null): HeadingConvertTaxonomy;
165
+ /**
166
+ * Classify a project for `project.make-repeating`'s pure-AX row-selection
167
+ * recipe (UIC4-f), or refuse. Reads DB truth (area / start / template / status)
168
+ * — the orchestrator uses it to decide the Someday coercion; the command spec
169
+ * uses it (post-coercion) to build the reveal + row-select recipe.
170
+ */
171
+ export declare function classifyProjectRepeat(db: DatabaseSync, target: AnyTask | null): ProjectRepeatTaxonomy;
81
172
  export declare function resolveArea(db: DatabaseSync, ref: ContainerRef): ContainerResolution;
82
173
  export declare function resolveProject(db: DatabaseSync, ref: ContainerRef): ContainerResolution;
83
174
  export declare function resolveHeading(db: DatabaseSync, projectUuid: string, headingTitle: string): ContainerResolution;
84
175
  export declare function projectStatus(db: DatabaseSync, uuid: string): TaskStatus | null;
85
- export declare function missingTagTitles(db: DatabaseSync, titles: string[]): string[];
86
176
  export declare function resolveTag(db: DatabaseSync, ref: string): ContainerResolution;
87
177
  export declare function loadTarget(db: DatabaseSync, uuid: string): AnyTask | null;
178
+ /**
179
+ * Uuids of pre-existing TMTask rows matching a create-probe's (title, type),
180
+ * captured in the pre-read and threaded into the probe as `excludeUuids`.
181
+ * Create-mode verification discovers the row the app just made by (title,
182
+ * type); without this exclusion the probe could bind to a DIFFERENT same-title
183
+ * row that merely appeared in the trailing sinceEpoch window (a concurrent add,
184
+ * a repeat-template spawn, a sync insert), recording the wrong discoveredUuid —
185
+ * and a later undo would then trash the wrong item. Matches `findCreated`'s
186
+ * exact `title = ? AND type = ?` filter (case-sensitive) so the captured set is
187
+ * precisely the pre-existing rows that discovery would otherwise consider.
188
+ */
189
+ export declare function sameTitleTaskUuids(db: DatabaseSync, title: string, type: TaskType): string[];
88
190
  export declare function projectChildren(db: DatabaseSync, projectUuid: string): Todo[];
89
191
  /**
90
192
  * Titles of every DESCENDANT tag under the given tag (excluding itself).
@@ -10,6 +10,7 @@ export function emptyPreState() {
10
10
  destArea: null,
11
11
  destHeading: null,
12
12
  missingTags: [],
13
+ resolvedTagTitles: [],
13
14
  parentTag: null,
14
15
  entityTarget: null,
15
16
  childTags: [],
@@ -21,6 +22,134 @@ export function emptyPreState() {
21
22
  existingEntityUuids: [],
22
23
  sameTitleUuids: [],
23
24
  reorder: null,
25
+ areaOrder: null,
26
+ projectRepeat: null,
27
+ repeatSubtreeUuids: null,
28
+ headingConvert: null,
29
+ };
30
+ }
31
+ /**
32
+ * The uuids of a project's source subtree rows (non-trashed to-dos AND
33
+ * headings, direct or heading-nested). `childrenReplaced` counts how many of
34
+ * these are dead post-op — the whole subtree in the delete-remint fate, just
35
+ * the flattened nested-template row in the nested-repeater preserve fate.
36
+ */
37
+ export function projectSubtreeUuids(db, projectUuid) {
38
+ return db
39
+ .prepare(`SELECT uuid FROM TMTask
40
+ WHERE trashed = 0 AND (
41
+ (type = 0 AND (project = ? OR heading IN
42
+ (SELECT uuid FROM TMTask WHERE type = 2 AND project = ?)))
43
+ OR (type = 2 AND project = ?))`)
44
+ .all(projectUuid, projectUuid, projectUuid).map((r) => r.uuid);
45
+ }
46
+ export function classifyHeadingConvert(db, target) {
47
+ if (target === null || target.type !== "heading") {
48
+ return { kind: "refuse", refusal: "not-a-heading", detail: "target is not a heading" };
49
+ }
50
+ const project = target.project;
51
+ if (project === null) {
52
+ return {
53
+ kind: "refuse",
54
+ refusal: "no-project",
55
+ detail: "the heading has no owning project — cannot reveal a project view to select its row",
56
+ };
57
+ }
58
+ const rows = db
59
+ .prepare(`SELECT uuid FROM TMTask WHERE type = 2 AND project = ? AND trashed = 0 ORDER BY "index"`)
60
+ .all(project.uuid);
61
+ const ordinal = rows.findIndex((r) => r.uuid === target.uuid);
62
+ if (ordinal < 0) {
63
+ return {
64
+ kind: "refuse",
65
+ refusal: "not-found",
66
+ detail: "the heading was not found among its project's non-trashed headings",
67
+ };
68
+ }
69
+ return { kind: "ok", projectReveal: project.uuid, ordinal };
70
+ }
71
+ /**
72
+ * Count non-trashed projects with the given title that share the target's
73
+ * row-selection container, EXCLUDING the target itself. A non-zero count is a
74
+ * row-selection ambiguity: the AREA/SOMEDAY row exposes no title text or uuid
75
+ * to disambiguate (UIC4-b), so two same-titled projects cannot be told apart —
76
+ * the drive refuses fail-closed rather than guess which row to select.
77
+ */
78
+ function sameTitleRowCount(db, title, excludeUuid, container) {
79
+ const containerWhere = "areaUuid" in container ? "area = ?" : "area IS NULL AND start = 2 AND startDate IS NULL";
80
+ const binds = "areaUuid" in container ? [title, excludeUuid, container.areaUuid] : [title, excludeUuid];
81
+ const row = db
82
+ .prepare(`SELECT COUNT(*) AS n FROM TMTask
83
+ WHERE type = 1 AND trashed = 0 AND title = ? COLLATE NOCASE AND uuid != ? AND ${containerWhere}`)
84
+ .get(...binds);
85
+ return row.n;
86
+ }
87
+ /**
88
+ * Classify a project for `project.make-repeating`'s pure-AX row-selection
89
+ * recipe (UIC4-f), or refuse. Reads DB truth (area / start / template / status)
90
+ * — the orchestrator uses it to decide the Someday coercion; the command spec
91
+ * uses it (post-coercion) to build the reveal + row-select recipe.
92
+ */
93
+ export function classifyProjectRepeat(db, target) {
94
+ if (target === null || target.type !== "project") {
95
+ return { kind: "refuse", refusal: "not-a-project", detail: "target is not a project" };
96
+ }
97
+ if (target.trashed) {
98
+ return { kind: "refuse", refusal: "trashed", detail: "the project is in the Trash" };
99
+ }
100
+ if (target.status !== "open" || target.logged) {
101
+ return {
102
+ kind: "refuse",
103
+ refusal: "logged",
104
+ detail: `the project is ${target.logged ? "logged" : target.status} — only an open project can be made repeating`,
105
+ };
106
+ }
107
+ if (target.repeating.isTemplate) {
108
+ return {
109
+ kind: "refuse",
110
+ refusal: "already-repeating",
111
+ detail: "the project is already a repeating template",
112
+ };
113
+ }
114
+ const title = target.title;
115
+ if (target.area !== null) {
116
+ const areaUuid = target.area.uuid;
117
+ if (sameTitleRowCount(db, title, target.uuid, { areaUuid }) > 0) {
118
+ return {
119
+ kind: "refuse",
120
+ refusal: "ambiguous-row",
121
+ detail: `another project titled "${title}" shares this area — its selectable row cannot be disambiguated`,
122
+ };
123
+ }
124
+ return { kind: "area", containerReveal: areaUuid, title };
125
+ }
126
+ // Area-less: someday renders a selectable row; anytime needs coercion first.
127
+ if (target.start === "someday") {
128
+ if (sameTitleRowCount(db, title, target.uuid, { somedayAreaLess: true }) > 0) {
129
+ return {
130
+ kind: "refuse",
131
+ refusal: "ambiguous-row",
132
+ detail: `another area-less Someday project titled "${title}" exists — its row cannot be disambiguated`,
133
+ };
134
+ }
135
+ return { kind: "someday", containerReveal: "someday", title };
136
+ }
137
+ if (target.start === "active") {
138
+ // Post-coercion the project joins the Someday cohort; refuse if that would
139
+ // collide with an existing same-titled area-less Someday project.
140
+ if (sameTitleRowCount(db, title, target.uuid, { somedayAreaLess: true }) > 0) {
141
+ return {
142
+ kind: "refuse",
143
+ refusal: "ambiguous-row",
144
+ detail: `an area-less Someday project titled "${title}" already exists — coercing this one there would make its row ambiguous`,
145
+ };
146
+ }
147
+ return { kind: "anytime", title };
148
+ }
149
+ return {
150
+ kind: "refuse",
151
+ refusal: "unexpected-start",
152
+ detail: `the project has an unexpected schedule state (${target.start}) with no area — cannot resolve a selectable row`,
24
153
  };
25
154
  }
26
155
  export function resolveArea(db, ref) {
@@ -45,15 +174,27 @@ export function projectStatus(db, uuid) {
45
174
  return null;
46
175
  return TASK_STATUS_FROM_DB[row.status] ?? null;
47
176
  }
48
- export function missingTagTitles(db, titles) {
49
- return titles.filter((t) => db.prepare("SELECT 1 FROM TMTag WHERE title = ? COLLATE NOCASE").get(t) === undefined);
50
- }
51
177
  export function resolveTag(db, ref) {
52
178
  return resolveNamedRef(db, "TMTag", "1=1", [], ref);
53
179
  }
54
180
  export function loadTarget(db, uuid) {
55
181
  return byUuid(db, uuid);
56
182
  }
183
+ /**
184
+ * Uuids of pre-existing TMTask rows matching a create-probe's (title, type),
185
+ * captured in the pre-read and threaded into the probe as `excludeUuids`.
186
+ * Create-mode verification discovers the row the app just made by (title,
187
+ * type); without this exclusion the probe could bind to a DIFFERENT same-title
188
+ * row that merely appeared in the trailing sinceEpoch window (a concurrent add,
189
+ * a repeat-template spawn, a sync insert), recording the wrong discoveredUuid —
190
+ * and a later undo would then trash the wrong item. Matches `findCreated`'s
191
+ * exact `title = ? AND type = ?` filter (case-sensitive) so the captured set is
192
+ * precisely the pre-existing rows that discovery would otherwise consider.
193
+ */
194
+ export function sameTitleTaskUuids(db, title, type) {
195
+ const dbType = type === "project" ? 1 : type === "heading" ? 2 : 0;
196
+ return db.prepare("SELECT uuid FROM TMTask WHERE title = ? AND type = ?").all(title, dbType).map((r) => r.uuid);
197
+ }
57
198
  export function projectChildren(db, projectUuid) {
58
199
  const rows = db
59
200
  .prepare("SELECT uuid FROM TMTask WHERE type = 0 AND trashed = 0 AND (project = ? OR heading IN " +
@@ -1 +1 @@
1
- {"version":3,"file":"pre-state.js","sourceRoot":"","sources":["../../src/write/pre-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pre-state.js","sourceRoot":"","sources":["../../src/write/pre-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * The recurrence-rule SERIALIZER — the write-side inverse of the read-only
3
+ * decoder in {@link ../model/recurrence.ts}. It composes the `rt1_recurrenceRule`
4
+ * XML plist the Things app writes for a repeating template, in the exact shape
5
+ * the decoder round-trips (rrv=4, the `of` offset grammar, the year-4001 "forever"
6
+ * `ed` sentinel).
7
+ *
8
+ * Two consumers share it, and NEITHER writes to a real Things database:
9
+ * - the SIMULATOR write vector (src/write/vectors/simulator.ts), which applies
10
+ * the RSIM-characterized recurrence mutations as SQL against a synthetic
11
+ * fixture DB (docs/lab/rsim-results.md); and
12
+ * - the bench WORLD profile (bench/world.ts), which seeds synthetic templates.
13
+ *
14
+ * Repeat rules remain UI-only on any real surface (writes go through the app's
15
+ * Repeat dialog, never SQLite) — this serializer exists solely so bench/simulated
16
+ * writes can reproduce the app's row shape without a Things install. The
17
+ * low-level {@link ruleXml} takes a numeric {@link RuleSpec}; {@link composeRepeatRuleSpec}
18
+ * maps the consumer-facing {@link RepeatRuleParams} vocabulary onto that spec.
19
+ */
20
+ import { type IsoDate } from "../model/dates.ts";
21
+ import type { RepeatRuleParams } from "./operations.ts";
22
+ /** One entry in a rule's `of` offset array (numeric, decoder-facing encoding). */
23
+ export interface RuleOffsets {
24
+ /** 0-based day of month; -1 = last day. */
25
+ dy?: number;
26
+ /** 0-based month. */
27
+ mo?: number;
28
+ /** Weekday, 0 = Sunday … 6 = Saturday. */
29
+ wd?: number;
30
+ /** Nth weekday within the month (1..5); -1 = last. */
31
+ wdo?: number;
32
+ }
33
+ /** The numeric fields {@link ruleXml} renders into the plist. */
34
+ export interface RuleSpec {
35
+ /** 0 fixed · 1 after-completion. */
36
+ tp: 0 | 1;
37
+ /** 16 daily · 256 weekly · 8 monthly · 4 yearly. */
38
+ fu: 16 | 256 | 8 | 4;
39
+ /** Interval multiplier ("every fa units"). */
40
+ fa: number;
41
+ /** Start offset in days (≤ 0); default 0. */
42
+ ts?: number;
43
+ of?: RuleOffsets[];
44
+ /** Anchor epoch written to both `sr` and `ia` (the decoder ignores these). */
45
+ anchor: number;
46
+ /** End date, unix seconds; default the year-4001 "forever" sentinel. */
47
+ ed?: number;
48
+ /** Remaining repeat count; default 0 (= unlimited). */
49
+ rc?: number;
50
+ }
51
+ /** Distant-future `ed` sentinel (year 4001 — the same class the app writes). */
52
+ export declare const RULE_FOREVER = 64092211200;
53
+ /** Recurrence-unit code for each frequency (mirrors the decoder's UNITS map). */
54
+ export declare const FREQUENCY_TO_FU: Record<RepeatRuleParams["frequency"], 16 | 256 | 8 | 4>;
55
+ /** Compose an `rt1_recurrenceRule` XML plist the read-path decoder accepts. */
56
+ export declare function ruleXml(spec: RuleSpec): string;
57
+ /**
58
+ * Map the extended {@link RepeatRuleParams} vocabulary onto a numeric
59
+ * {@link RuleSpec}. `refIso` is the occurrence date the calendar anchor derives
60
+ * from when no explicit anchor is given; `anchor` seeds the (decoder-ignored)
61
+ * sr/ia epochs. A deadlined rule carries the start-offset in `ts` (ts = −N days
62
+ * earlier); the template's own `deadline` sentinel column — set by the applier,
63
+ * not here — is what actually flags deadline-ness (oddities §8a).
64
+ */
65
+ export declare function composeRepeatRuleSpec(params: RepeatRuleParams, refIso: IsoDate, anchor: number): RuleSpec;
@@ -0,0 +1,150 @@
1
+ /**
2
+ * The recurrence-rule SERIALIZER — the write-side inverse of the read-only
3
+ * decoder in {@link ../model/recurrence.ts}. It composes the `rt1_recurrenceRule`
4
+ * XML plist the Things app writes for a repeating template, in the exact shape
5
+ * the decoder round-trips (rrv=4, the `of` offset grammar, the year-4001 "forever"
6
+ * `ed` sentinel).
7
+ *
8
+ * Two consumers share it, and NEITHER writes to a real Things database:
9
+ * - the SIMULATOR write vector (src/write/vectors/simulator.ts), which applies
10
+ * the RSIM-characterized recurrence mutations as SQL against a synthetic
11
+ * fixture DB (docs/lab/rsim-results.md); and
12
+ * - the bench WORLD profile (bench/world.ts), which seeds synthetic templates.
13
+ *
14
+ * Repeat rules remain UI-only on any real surface (writes go through the app's
15
+ * Repeat dialog, never SQLite) — this serializer exists solely so bench/simulated
16
+ * writes can reproduce the app's row shape without a Things install. The
17
+ * low-level {@link ruleXml} takes a numeric {@link RuleSpec}; {@link composeRepeatRuleSpec}
18
+ * maps the consumer-facing {@link RepeatRuleParams} vocabulary onto that spec.
19
+ */
20
+ import {} from "../model/dates.js";
21
+ import { WEEKDAY_TO_WD } from "./repeat-rule.js";
22
+ /** Distant-future `ed` sentinel (year 4001 — the same class the app writes). */
23
+ export const RULE_FOREVER = 64_092_211_200;
24
+ /** Recurrence-unit code for each frequency (mirrors the decoder's UNITS map). */
25
+ export const FREQUENCY_TO_FU = {
26
+ daily: 16,
27
+ weekly: 256,
28
+ monthly: 8,
29
+ yearly: 4,
30
+ };
31
+ /** Compose an `rt1_recurrenceRule` XML plist the read-path decoder accepts. */
32
+ export function ruleXml(spec) {
33
+ const offsets = (spec.of ?? [{ dy: 0 }])
34
+ .map((o) => {
35
+ const entries = Object.entries(o)
36
+ .map(([k, v]) => `<key>${k}</key><integer>${v}</integer>`)
37
+ .join("");
38
+ return `<dict>${entries}</dict>`;
39
+ })
40
+ .join("");
41
+ return (`<?xml version="1.0" encoding="UTF-8"?>\n` +
42
+ `<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n` +
43
+ `<plist version="1.0"><dict>` +
44
+ `<key>ed</key><integer>${spec.ed ?? RULE_FOREVER}</integer>` +
45
+ `<key>fa</key><integer>${spec.fa}</integer>` +
46
+ `<key>fu</key><integer>${spec.fu}</integer>` +
47
+ `<key>ia</key><integer>${spec.anchor}</integer>` +
48
+ `<key>of</key><array>${offsets}</array>` +
49
+ `<key>rc</key><integer>${spec.rc ?? 0}</integer>` +
50
+ `<key>rrv</key><integer>4</integer>` +
51
+ `<key>sr</key><integer>${spec.anchor}</integer>` +
52
+ `<key>tp</key><integer>${spec.tp}</integer>` +
53
+ `<key>ts</key><integer>${spec.ts ?? 0}</integer>` +
54
+ `</dict></plist>\n`);
55
+ }
56
+ // -------------------------------------------------- vocabulary → spec
57
+ const ymd = (iso) => iso.split("-").map(Number);
58
+ /** Weekday (0 = Sunday) of an ISO date, evaluated at UTC noon (tz-invariant). */
59
+ function weekdayOf(iso) {
60
+ const [y, m, d] = ymd(iso);
61
+ return new Date(Date.UTC(y, m - 1, d, 12)).getUTCDay();
62
+ }
63
+ /**
64
+ * The `of` offsets for a rule. A FIXED rule anchors on its calendar placement —
65
+ * the explicit weekdays/monthly/yearly anchor when given, else derived from the
66
+ * occurrence date (`refIso`): a weekly rule fires on the occurrence's weekday, a
67
+ * monthly one on its day-of-month, a yearly one on its month + day. An
68
+ * AFTER-COMPLETION rule has NO calendar day, so Things writes only the unit's
69
+ * nominal zero-index offset (UIC6-e: weekly of=[{wd:0}], monthly of=[{dy:0}]);
70
+ * the decoder ignores it. Only the weekly after-completion shape is RSIM-proven
71
+ * (RSIM2); the daily/monthly/yearly nominals follow the UIC6-e convention.
72
+ */
73
+ function composeOffsets(params, refIso) {
74
+ if (params.afterCompletion === true) {
75
+ switch (params.frequency) {
76
+ case "daily":
77
+ return [{ dy: 0 }];
78
+ case "weekly":
79
+ return [{ wd: 0 }];
80
+ case "monthly":
81
+ return [{ dy: 0 }];
82
+ case "yearly":
83
+ return [{ mo: 0, dy: 0 }];
84
+ }
85
+ }
86
+ switch (params.frequency) {
87
+ case "daily":
88
+ return [{ dy: 0 }];
89
+ case "weekly": {
90
+ if (params.weekdays !== undefined) {
91
+ return params.weekdays.map((w) => ({ wd: WEEKDAY_TO_WD[w] }));
92
+ }
93
+ return [{ wd: weekdayOf(refIso) }];
94
+ }
95
+ case "monthly": {
96
+ const anchor = params.monthly;
97
+ if (anchor === undefined)
98
+ return [{ dy: ymd(refIso)[2] - 1 }];
99
+ return [monthlyOffset(anchor)];
100
+ }
101
+ case "yearly": {
102
+ const anchor = params.yearly;
103
+ if (anchor === undefined) {
104
+ const [, m, d] = ymd(refIso);
105
+ return [{ mo: m - 1, dy: d - 1 }];
106
+ }
107
+ return [{ mo: anchor.month - 1, ...monthlyOffset(anchor) }];
108
+ }
109
+ }
110
+ }
111
+ /** One month/year day anchor → its offset entry (day-of-month OR nth-weekday). */
112
+ function monthlyOffset(anchor) {
113
+ if ("day" in anchor) {
114
+ return { dy: anchor.day === "last" ? -1 : anchor.day - 1 };
115
+ }
116
+ return {
117
+ wd: WEEKDAY_TO_WD[anchor.weekday],
118
+ wdo: anchor.ordinal === "last" ? -1 : anchor.ordinal,
119
+ };
120
+ }
121
+ /**
122
+ * Map the extended {@link RepeatRuleParams} vocabulary onto a numeric
123
+ * {@link RuleSpec}. `refIso` is the occurrence date the calendar anchor derives
124
+ * from when no explicit anchor is given; `anchor` seeds the (decoder-ignored)
125
+ * sr/ia epochs. A deadlined rule carries the start-offset in `ts` (ts = −N days
126
+ * earlier); the template's own `deadline` sentinel column — set by the applier,
127
+ * not here — is what actually flags deadline-ness (oddities §8a).
128
+ */
129
+ export function composeRepeatRuleSpec(params, refIso, anchor) {
130
+ const deadlined = params.deadline === true || (params.startDaysEarlier ?? 0) > 0;
131
+ const spec = {
132
+ tp: params.afterCompletion === true ? 1 : 0,
133
+ fu: FREQUENCY_TO_FU[params.frequency],
134
+ fa: params.interval,
135
+ ts: deadlined ? -(params.startDaysEarlier ?? 0) : 0,
136
+ of: composeOffsets(params, refIso),
137
+ anchor,
138
+ };
139
+ const ends = params.ends;
140
+ if (ends !== undefined && ends.kind !== "never") {
141
+ if (ends.kind === "on-date") {
142
+ spec.ed = Math.floor(Date.parse(`${ends.date}T00:00:00Z`) / 1000);
143
+ }
144
+ else {
145
+ spec.rc = ends.count;
146
+ }
147
+ }
148
+ return spec;
149
+ }
150
+ //# sourceMappingURL=recurrence-rule-blob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recurrence-rule-blob.js","sourceRoot":"","sources":["../../src/write/recurrence-rule-blob.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  * as the project and a stopDate within CASCADE_WINDOW_SECONDS of the
7
7
  * project's. Each child reopen is a full verified mutation.
8
8
  */
9
- import { resolveTaskUuidPrefix } from "../read/queries.js";
9
+ import { resolveProjectWriteTarget } from "../read/queries.js";
10
10
  import { runMutation } from "./pipeline.js";
11
11
  /** P03: cascade writes stamp children within <2s of the project row. */
12
12
  export const CASCADE_WINDOW_SECONDS = 2;
@@ -22,7 +22,7 @@ function cascadeCandidates(deps, projectUuid) {
22
22
  .all(projectUuid, CASCADE_WINDOW_SECONDS);
23
23
  }
24
24
  export async function runProjectReopen(deps, uuid, options = {}) {
25
- uuid = resolveTaskUuidPrefix(deps.db, uuid);
25
+ uuid = resolveProjectWriteTarget(deps.db, uuid);
26
26
  const { restoreChildren, ...writeOptions } = options;
27
27
  // Candidates must be computed BEFORE the reopen clears the project's
28
28
  // stopDate (the window is relative to it).
@@ -54,6 +54,7 @@ export async function runProjectReopen(deps, uuid, options = {}) {
54
54
  });
55
55
  continue;
56
56
  }
57
+ // child reopens must land one at a time (mutation lock + create-probe verification must never race); an early failure also needs to stop the remaining legs
57
58
  const result = await runMutation(deps, "todo.reopen", { uuid: child.uuid }, writeOptions);
58
59
  children.push({ uuid: child.uuid, title: child.title, result });
59
60
  if (result.kind !== "ok")
@@ -1 +1 @@
1
- {"version":3,"file":"reopen.js","sourceRoot":"","sources":["../../src/write/reopen.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAA0D,MAAM,eAAe,CAAC;AAEpG,wEAAwE;AACxE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAsBxC,SAAS,iBAAiB,CAAC,IAAe,EAAE,WAAmB;IAC7D,OAAO,IAAI,CAAC,EAAE;SACX,OAAO,CACN;;;;;;6EAMuE,CACxE;SACA,GAAG,CAAC,WAAW,EAAE,sBAAsB,CAAkC,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAe,EACf,IAAY,EACZ,UAAgC,EAAE;IAElC,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,EAAE,eAAe,EAAE,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;IACrD,qEAAqE;IACrE,2CAA2C;IAC3C,MAAM,UAAU,GAAG,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAoC,EAAE,CAAC;IACrD,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACxD,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC/B,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,MAAM,EAAE;wBACN,IAAI,EAAE,SAAS;wBACf,EAAE,EAAE,aAAa;wBACjB,IAAI,EAAE;4BACJ,EAAE,EAAE,aAAa;4BACjB,MAAM,EAAE,aAAa;4BACrB,IAAI,EAAE,CAAC;4BACP,UAAU,EAAE,4BAA4B,KAAK,CAAC,KAAK,EAAE;4BACrD,aAAa,EAAE;gCACb,IAAI,EAAE,OAAO;gCACb,IAAI,EAAE,KAAK,CAAC,IAAI;gCAChB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;6BAC9C;4BACD,cAAc,EAAE,EAAE;yBACnB;qBACF;iBACF,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;YAC1F,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAChE,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;gBAAE,MAAM,CAAC,mCAAmC;QACtE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"reopen.js","sourceRoot":"","sources":["../../src/write/reopen.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAA0D,MAAM,eAAe,CAAC;AAEpG,wEAAwE;AACxE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAsBxC,SAAS,iBAAiB,CAAC,IAAe,EAAE,WAAmB;IAC7D,OAAO,IAAI,CAAC,EAAE;SACX,OAAO,CACN;;;;;;6EAMuE,CACxE;SACA,GAAG,CAAC,WAAW,EAAE,sBAAsB,CAAkC,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAe,EACf,IAAY,EACZ,UAAgC,EAAE;IAElC,IAAI,GAAG,yBAAyB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,EAAE,eAAe,EAAE,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;IACrD,qEAAqE;IACrE,2CAA2C;IAC3C,MAAM,UAAU,GAAG,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAoC,EAAE,CAAC;IACrD,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACxD,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC/B,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,MAAM,EAAE;wBACN,IAAI,EAAE,SAAS;wBACf,EAAE,EAAE,aAAa;wBACjB,IAAI,EAAE;4BACJ,EAAE,EAAE,aAAa;4BACjB,MAAM,EAAE,aAAa;4BACrB,IAAI,EAAE,CAAC;4BACP,UAAU,EAAE,4BAA4B,KAAK,CAAC,KAAK,EAAE;4BACrD,aAAa,EAAE;gCACb,IAAI,EAAE,OAAO;gCACb,IAAI,EAAE,KAAK,CAAC,IAAI;gCAChB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;6BAC9C;4BACD,cAAc,EAAE,EAAE;yBACnB;qBACF;iBACF,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,4JAA4J;YAC5J,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;YAC1F,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAChE,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;gBAAE,MAAM,CAAC,mCAAmC;QACtE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC"}