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
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Active Accessibility-consent probe for the ui vector: ask System Events for
3
+ * one element of the Things process's UI tree and classify the outcome. This
4
+ * is a DIFFERENT permission from Automation (which automation-probe.ts covers)
5
+ * — driving the Accessibility tree needs the process running things-api to
6
+ * hold Accessibility (System Settings ▸ Privacy & Security ▸ Accessibility).
7
+ *
8
+ * OPT-IN, exactly like the Automation probe: the query itself is a
9
+ * consent-requiring call, so on an ungranted machine it makes macOS show the
10
+ * Accessibility prompt. Skipped when Things is not running so a diagnostic
11
+ * never launches the app. The probe doubles as a light recipe canary: it
12
+ * resolves the "Items" menu every recipe enters through, so a missing menu
13
+ * (a Things update, or a non-English app) surfaces here too.
14
+ */
15
+ import { execFileSync } from "node:child_process";
16
+ import { isThingsRunning } from "./automation-probe.js";
17
+ import { simFenceActive } from "./vectors/simulator.js";
18
+ // Resolve the "Items" menu — the entry point of every ui recipe. Returns
19
+ // "true"/"false"; a permission failure throws before it can answer.
20
+ const PROBE_SCRIPT = 'tell application "System Events" to tell process "Things3" to return (exists menu "Items" of menu bar 1)';
21
+ function defaultRun(script, timeoutMs) {
22
+ return execFileSync("osascript", ["-e", script], { encoding: "utf8", timeout: timeoutMs });
23
+ }
24
+ export function probeAccessibility(deps = {}) {
25
+ if (simFenceActive()) {
26
+ return {
27
+ status: "simulated",
28
+ detail: "the simulator fence is active — the Accessibility probe was skipped so a bench run never " +
29
+ "queries the app's UI tree.",
30
+ };
31
+ }
32
+ if (!(deps.isAppRunning ?? isThingsRunning)()) {
33
+ return {
34
+ status: "app-not-running",
35
+ detail: "Things is not running — the probe was skipped so a diagnostic never launches the " +
36
+ "app. Launch Things and re-run with --probe-accessibility.",
37
+ };
38
+ }
39
+ try {
40
+ const out = (deps.run ?? defaultRun)(PROBE_SCRIPT, deps.timeoutMs ?? 8000).trim();
41
+ if (out === "true") {
42
+ return {
43
+ status: "granted",
44
+ detail: "Accessibility is granted and the Things 'Items' menu resolves.",
45
+ };
46
+ }
47
+ return {
48
+ status: "menu-missing",
49
+ detail: "Accessibility appears granted but the 'Items' menu did not resolve — a Things update " +
50
+ "may have changed the menu, or the app may not be in English. The ui recipes would " +
51
+ "refuse (fail-closed) until re-certified.",
52
+ };
53
+ }
54
+ catch (err) {
55
+ const e = err;
56
+ const stderr = typeof e.stderr === "string" ? e.stderr : err instanceof Error ? err.message : String(err);
57
+ if (/-25211|-1719|not allowed assistive access|accessibility/i.test(stderr)) {
58
+ return {
59
+ status: "denied",
60
+ detail: "macOS declined the Accessibility query: the process running things-api is not granted " +
61
+ "Accessibility. Grant it under System Settings > Privacy & Security > Accessibility " +
62
+ "(see docs/setup.md for the closet-mini setup).",
63
+ };
64
+ }
65
+ return {
66
+ status: "inconclusive",
67
+ detail: `the probe failed for another reason: ${stderr.trim() || "unknown error"}`,
68
+ };
69
+ }
70
+ }
71
+ //# sourceMappingURL=accessibility-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessibility-probe.js","sourceRoot":"","sources":["../../src/write/accessibility-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAsBxD,yEAAyE;AACzE,oEAAoE;AACpE,MAAM,YAAY,GAChB,0GAA0G,CAAC;AAE7G,SAAS,UAAU,CAAC,MAAc,EAAE,SAAiB;IACnD,OAAO,YAAY,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA+B,EAAE;IAClE,IAAI,cAAc,EAAE,EAAE,CAAC;QACrB,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,MAAM,EACJ,2FAA2F;gBAC3F,4BAA4B;SAC/B,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,eAAe,CAAC,EAAE,EAAE,CAAC;QAC9C,OAAO;YACL,MAAM,EAAE,iBAAiB;YACzB,MAAM,EACJ,mFAAmF;gBACnF,2DAA2D;SAC9D,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAClF,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,gEAAgE;aACzE,CAAC;QACJ,CAAC;QACD,OAAO;YACL,MAAM,EAAE,cAAc;YACtB,MAAM,EACJ,uFAAuF;gBACvF,oFAAoF;gBACpF,0CAA0C;SAC7C,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAA2B,CAAC;QACtC,MAAM,MAAM,GACV,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7F,IAAI,0DAA0D,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5E,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,MAAM,EACJ,wFAAwF;oBACxF,qFAAqF;oBACrF,gDAAgD;aACnD,CAAC;QACJ,CAAC;QACD,OAAO;YACL,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,wCAAwC,MAAM,CAAC,IAAI,EAAE,IAAI,eAAe,EAAE;SACnF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,4 +1,4 @@
1
- export type AutomationProbeStatus = "granted" | "denied" | "pending" | "app-not-running" | "inconclusive";
1
+ export type AutomationProbeStatus = "granted" | "denied" | "pending" | "app-not-running" | "inconclusive" | "simulated";
2
2
  export interface AutomationProbeResult {
3
3
  status: AutomationProbeStatus;
4
4
  detail: string;
@@ -9,4 +9,11 @@ export interface AutomationProbeDeps {
9
9
  run?: (script: string, timeoutMs: number) => string;
10
10
  timeoutMs?: number;
11
11
  }
12
+ /**
13
+ * Is the Things app process present? No app = a frozen database (there is no
14
+ * background sync daemon). The single stable process-check shape in this
15
+ * binary — reused by the sync-health section so macOS never sees a second
16
+ * command shape.
17
+ */
18
+ export declare function isThingsRunning(): boolean;
12
19
  export declare function probeAutomation(deps?: AutomationProbeDeps): AutomationProbeResult;
@@ -8,8 +8,15 @@
8
8
  */
9
9
  import { execFileSync } from "node:child_process";
10
10
  import { automationGrantee } from "./failure-hints.js";
11
+ import { simFenceActive } from "./vectors/simulator.js";
11
12
  const PROBE_SCRIPT = 'tell application "Things3" to count of areas';
12
- function defaultIsAppRunning() {
13
+ /**
14
+ * Is the Things app process present? No app = a frozen database (there is no
15
+ * background sync daemon). The single stable process-check shape in this
16
+ * binary — reused by the sync-health section so macOS never sees a second
17
+ * command shape.
18
+ */
19
+ export function isThingsRunning() {
13
20
  try {
14
21
  execFileSync("pgrep", ["-x", "Things3"], { stdio: "ignore" });
15
22
  return true;
@@ -18,10 +25,18 @@ function defaultIsAppRunning() {
18
25
  return false;
19
26
  }
20
27
  }
28
+ const defaultIsAppRunning = isThingsRunning;
21
29
  function defaultRun(script, timeoutMs) {
22
30
  return execFileSync("osascript", ["-e", script], { encoding: "utf8", timeout: timeoutMs });
23
31
  }
24
32
  export function probeAutomation(deps = {}) {
33
+ if (simFenceActive()) {
34
+ return {
35
+ status: "simulated",
36
+ detail: "the simulator fence is active — the Automation probe was skipped so a bench run never " +
37
+ "sends an Apple Event to the app.",
38
+ };
39
+ }
25
40
  if (!(deps.isAppRunning ?? defaultIsAppRunning)()) {
26
41
  return {
27
42
  status: "app-not-running",
@@ -1 +1 @@
1
- {"version":3,"file":"automation-probe.js","sourceRoot":"","sources":["../../src/write/automation-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAqBvD,MAAM,YAAY,GAAG,8CAA8C,CAAC;AAEpE,SAAS,mBAAmB;IAC1B,IAAI,CAAC;QACH,YAAY,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,MAAc,EAAE,SAAiB;IACnD,OAAO,YAAY,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAA4B,EAAE;IAC5D,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,mBAAmB,CAAC,EAAE,EAAE,CAAC;QAClD,OAAO;YACL,MAAM,EAAE,iBAAiB;YACzB,MAAM,EACJ,mFAAmF;gBACnF,gCAAgC;SACnC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;QAC/D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,sDAAsD,EAAE,CAAC;IAC/F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAAqE,CAAC;QAChF,MAAM,MAAM,GACV,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7F,0EAA0E;QAC1E,0EAA0E;QAC1E,mEAAmE;QACnE,mEAAmE;QACnE,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACzF,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,MAAM,EACJ,4EAA4E;oBAC5E,iDAAiD,iBAAiB,EAAE,aAAa;oBACjF,4EAA4E;oBAC5E,gFAAgF;oBAChF,kCAAkC;aACrC,CAAC;QACJ,CAAC;QACD,IAAI,+CAA+C,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,MAAM,EACJ,qEAAqE,iBAAiB,EAAE,GAAG;oBAC3F,kFAAkF;oBAClF,uDAAuD;aAC1D,CAAC;QACJ,CAAC;QACD,OAAO;YACL,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,wCAAwC,MAAM,CAAC,IAAI,EAAE,IAAI,eAAe,EAAE;SACnF,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"automation-probe.js","sourceRoot":"","sources":["../../src/write/automation-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAsBxD,MAAM,YAAY,GAAG,8CAA8C,CAAC;AAEpE;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,YAAY,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,mBAAmB,GAAG,eAAe,CAAC;AAE5C,SAAS,UAAU,CAAC,MAAc,EAAE,SAAiB;IACnD,OAAO,YAAY,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAA4B,EAAE;IAC5D,IAAI,cAAc,EAAE,EAAE,CAAC;QACrB,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,MAAM,EACJ,wFAAwF;gBACxF,kCAAkC;SACrC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,mBAAmB,CAAC,EAAE,EAAE,CAAC;QAClD,OAAO;YACL,MAAM,EAAE,iBAAiB;YACzB,MAAM,EACJ,mFAAmF;gBACnF,gCAAgC;SACnC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;QAC/D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,sDAAsD,EAAE,CAAC;IAC/F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAAqE,CAAC;QAChF,MAAM,MAAM,GACV,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7F,0EAA0E;QAC1E,0EAA0E;QAC1E,mEAAmE;QACnE,mEAAmE;QACnE,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACzF,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,MAAM,EACJ,4EAA4E;oBAC5E,iDAAiD,iBAAiB,EAAE,aAAa;oBACjF,4EAA4E;oBAC5E,gFAAgF;oBAChF,kCAAkC;aACrC,CAAC;QACJ,CAAC;QACD,IAAI,+CAA+C,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,MAAM,EACJ,qEAAqE,iBAAiB,EAAE,GAAG;oBAC3F,kFAAkF;oBAClF,uDAAuD;aAC1D,CAAC;QACJ,CAAC;QACD,OAAO;YACL,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,wCAAwC,MAAM,CAAC,IAAI,EAAE,IAAI,eAAe,EAAE;SACnF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -74,8 +74,11 @@ export async function runBatch(deps, ops, options = {}, onResult) {
74
74
  // the runtime validators (loud on bad shapes), same as single ops.
75
75
  outcome =
76
76
  entry.op === "reorder"
77
- ? await runReorder(deps, entry.params, writeOptions)
78
- : await runMutation(deps, entry.op, entry.params, writeOptions);
77
+ ? // batch ops run sequentially by design: the mutation lock serializes them and create-probe verification must never race
78
+ await runReorder(deps, entry.params, writeOptions)
79
+ : // same sequencing requirement as the reorder branch above; batch is
80
+ // a consumer entry point, so a consumer `when` normalizes to the zone
81
+ await runMutation(deps, entry.op, entry.params, { ...writeOptions, normalizeWhen: true });
79
82
  }
80
83
  catch (err) {
81
84
  // Param-shape errors (exclusive combos etc.) surface per-op, not fatally.
@@ -1 +1 @@
1
- {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/write/batch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/write/batch.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { type OperationKind } from "./operations.ts";
7
7
  import { type ReversibilityEntry } from "./reversibility.ts";
8
+ import { type CertificationEntry } from "./vectors/ui-certification.ts";
8
9
  import type { VectorId, VectorSupport } from "./vectors/types.ts";
9
10
  export interface CapabilityEntry {
10
11
  op: OperationKind;
@@ -15,5 +16,12 @@ export interface CapabilityEntry {
15
16
  } & (VectorSupport | {
16
17
  support: "no";
17
18
  }))[];
19
+ /**
20
+ * ui-vector ops only: the on-device certification status. `uncertified`
21
+ * means the GUI recipe is wired but not yet confirmed on real hardware (see
22
+ * docs/lab/ui-certification-runbook.md); the op still runs, but a successful
23
+ * drive carries a warning to that effect.
24
+ */
25
+ certification?: CertificationEntry;
18
26
  }
19
27
  export declare function capabilitiesTable(op?: OperationKind): CapabilityEntry[];
@@ -5,15 +5,22 @@
5
5
  */
6
6
  import { OPERATION_KINDS } from "./operations.js";
7
7
  import { REVERSIBILITY } from "./reversibility.js";
8
+ import { certificationOf } from "./vectors/ui-certification.js";
8
9
  import { defaultVectors } from "./vectors/registry.js";
9
10
  export function capabilitiesTable(op) {
10
11
  const vectors = defaultVectors();
11
12
  const ops = op !== undefined ? [op] : [...OPERATION_KINDS];
12
- return ops.map((kind) => ({
13
- op: kind,
14
- undo: REVERSIBILITY[kind],
15
- // oxlint-disable-next-line no-map-spread -- building fresh capability rows, not mutating
16
- vectors: vectors.map((v) => ({ vector: v.id, ...(v.matrix[kind] ?? { support: "no" }) })),
17
- }));
13
+ return ops.map((kind) => {
14
+ const cert = certificationOf(kind);
15
+ const entry = {
16
+ op: kind,
17
+ undo: REVERSIBILITY[kind],
18
+ // oxlint-disable-next-line no-map-spread -- building fresh capability rows, not mutating
19
+ vectors: vectors.map((v) => ({ vector: v.id, ...(v.matrix[kind] ?? { support: "no" }) })),
20
+ };
21
+ if (cert !== undefined)
22
+ entry.certification = cert;
23
+ return entry;
24
+ });
18
25
  }
19
26
  //# sourceMappingURL=capabilities.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/write/capabilities.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,eAAe,EAAsB,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAUvD,MAAM,UAAU,iBAAiB,CAAC,EAAkB;IAClD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxB,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC;QACzB,yFAAyF;QACzF,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;KAC1F,CAAC,CAAC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/write/capabilities.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,eAAe,EAAsB,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAA2B,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAiBvD,MAAM,UAAU,iBAAiB,CAAC,EAAkB;IAClD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,KAAK,GAAoB;YAC7B,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC;YACzB,yFAAyF;YACzF,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;SAC1F,CAAC;QACF,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;QACnD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -9,8 +9,9 @@ import { type IsoDate } from "../model/dates.ts";
9
9
  import type { HazardId } from "./guards.ts";
10
10
  import type { OperationKind, OperationParamsMap } from "./operations.ts";
11
11
  import { type PreState } from "./pre-state.ts";
12
+ import { assertRepeatRule } from "./repeat-rule.ts";
12
13
  import type { CompiledInvocation, VectorId } from "./vectors/types.ts";
13
- import type { DeltaSpec } from "./verify/delta.ts";
14
+ import { type DeltaSpec } from "./verify/delta.ts";
14
15
  export interface CompileCtx {
15
16
  token: string | null;
16
17
  }
@@ -27,6 +28,7 @@ export interface CommandSpec<K extends OperationKind = OperationKind> {
27
28
  expectedDelta(pre: PreState, params: OperationParamsMap[K], ctx: DeltaCtx): DeltaSpec;
28
29
  compile(params: OperationParamsMap[K], vector: VectorId, pre: PreState, ctx: CompileCtx): CompiledInvocation;
29
30
  }
31
+ export { assertRepeatRule };
30
32
  export declare const COMMANDS: {
31
33
  [K in OperationKind]: CommandSpec<K>;
32
34
  };