things-api 0.18.0 → 0.19.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.
- package/README.md +16 -9
- package/deputy/AppIcon.icns +0 -0
- package/deputy/VERSION +1 -1
- package/deputy/helpers-Info.plist +4 -0
- package/deputy/prebuilt/Things API Helper.app/Contents/CodeResources +0 -0
- package/deputy/prebuilt/Things API Helper.app/Contents/Helpers/things-reader.app/Contents/Info.plist +3 -1
- package/deputy/prebuilt/Things API Helper.app/Contents/Helpers/things-reader.app/Contents/MacOS/things-reader +0 -0
- package/deputy/prebuilt/Things API Helper.app/Contents/Helpers/things-reader.app/Contents/Resources/AppIcon.icns +0 -0
- package/deputy/prebuilt/Things API Helper.app/Contents/Helpers/things-reader.app/Contents/_CodeSignature/CodeResources +15 -2
- package/deputy/prebuilt/Things API Helper.app/Contents/Info.plist +5 -1
- package/deputy/prebuilt/Things API Helper.app/Contents/MacOS/things-deputy +0 -0
- package/deputy/prebuilt/Things API Helper.app/Contents/Resources/AppIcon.icns +0 -0
- package/deputy/prebuilt/Things API Helper.app/Contents/_CodeSignature/CodeResources +14 -2
- package/deputy/reader/Info.plist +2 -0
- package/deputy/reader/entitlements.plist +30 -0
- package/deputy/reader/main.swift +129 -40
- package/deputy/src/server.swift +25 -2
- package/deputy/src/tcc.swift +58 -0
- package/dist/audit/schema.d.ts +13 -1
- package/dist/audit/schema.js.map +1 -1
- package/dist/capability.d.ts +160 -0
- package/dist/capability.js +416 -0
- package/dist/capability.js.map +1 -0
- package/dist/cli/commands/doctor.js +127 -1
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/helpers.js +178 -51
- package/dist/cli/commands/helpers.js.map +1 -1
- package/dist/cli/commands/op-result.js +6 -0
- package/dist/cli/commands/op-result.js.map +1 -1
- package/dist/cli/commands/reads.js +47 -1
- package/dist/cli/commands/reads.js.map +1 -1
- package/dist/cli/commands/setup.d.ts +9 -0
- package/dist/cli/commands/setup.js +63 -83
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/writes.d.ts +1 -1
- package/dist/cli/commands/writes.js +241 -107
- package/dist/cli/commands/writes.js.map +1 -1
- package/dist/cli/dry-run.d.ts +1 -1
- package/dist/cli/dry-run.js +1 -1
- package/dist/cli/glyphs.d.ts +23 -4
- package/dist/cli/glyphs.js +46 -19
- package/dist/cli/glyphs.js.map +1 -1
- package/dist/cli/help.d.ts +1 -1
- package/dist/cli/help.js +49 -27
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/period.d.ts +3 -1
- package/dist/cli/period.js +1 -1
- package/dist/cli/period.js.map +1 -1
- package/dist/cli/read-driver.js +26 -1
- package/dist/cli/read-driver.js.map +1 -1
- package/dist/cli/render.d.ts +31 -4
- package/dist/cli/render.js +127 -15
- package/dist/cli/render.js.map +1 -1
- package/dist/client.d.ts +22 -2
- package/dist/client.js +36 -13
- package/dist/client.js.map +1 -1
- package/dist/contracts.d.ts +6 -2
- package/dist/contracts.js +1 -1
- package/dist/contracts.js.map +1 -1
- package/dist/deputy/install.d.ts +219 -5
- package/dist/deputy/install.js +803 -31
- package/dist/deputy/install.js.map +1 -1
- package/dist/deputy/notices.js +2 -2
- package/dist/deputy/notices.js.map +1 -1
- package/dist/deputy/protocol.d.ts +59 -5
- package/dist/deputy/protocol.js +48 -11
- package/dist/deputy/protocol.js.map +1 -1
- package/dist/deputy/routing.d.ts +21 -0
- package/dist/deputy/routing.js +111 -27
- package/dist/deputy/routing.js.map +1 -1
- package/dist/diagnose.d.ts +14 -1
- package/dist/diagnose.js +46 -6
- package/dist/diagnose.js.map +1 -1
- package/dist/direct-setup.d.ts +78 -0
- package/dist/direct-setup.js +484 -0
- package/dist/direct-setup.js.map +1 -0
- package/dist/host-access.d.ts +63 -0
- package/dist/host-access.js +165 -0
- package/dist/host-access.js.map +1 -0
- package/dist/index.d.ts +20 -5
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +27 -1
- package/dist/mcp/server.js +285 -100
- package/dist/mcp/server.js.map +1 -1
- package/dist/op-result.d.ts +9 -0
- package/dist/op-result.js +5 -0
- package/dist/op-result.js.map +1 -1
- package/dist/read/filter-contract.d.ts +1 -1
- package/dist/read/filter-contract.js +4 -0
- package/dist/read/filter-contract.js.map +1 -1
- package/dist/read/shape.js +4 -0
- package/dist/read/shape.js.map +1 -1
- package/dist/read/views.d.ts +29 -0
- package/dist/read/views.js +60 -0
- package/dist/read/views.js.map +1 -1
- package/dist/session-grant.d.ts +48 -0
- package/dist/session-grant.js +170 -0
- package/dist/session-grant.js.map +1 -0
- package/dist/surface-copy.d.ts +8 -0
- package/dist/surface-copy.js +8 -0
- package/dist/surface-copy.js.map +1 -1
- package/dist/wizard.d.ts +58 -0
- package/dist/wizard.js +167 -0
- package/dist/wizard.js.map +1 -0
- package/dist/write/availability.d.ts +1 -1
- package/dist/write/availability.js +3 -3
- package/dist/write/availability.js.map +1 -1
- package/dist/write/batch.d.ts +20 -0
- package/dist/write/batch.js +94 -15
- package/dist/write/batch.js.map +1 -1
- package/dist/write/capabilities.d.ts +9 -0
- package/dist/write/capabilities.js +2 -0
- package/dist/write/capabilities.js.map +1 -1
- package/dist/write/clear-reminder.js +1 -1
- package/dist/write/clear-reminder.js.map +1 -1
- package/dist/write/commands.d.ts +12 -1
- package/dist/write/commands.js +112 -224
- package/dist/write/commands.js.map +1 -1
- package/dist/write/failure-hints.d.ts +3 -1
- package/dist/write/failure-hints.js.map +1 -1
- package/dist/write/guards.js +19 -2
- package/dist/write/guards.js.map +1 -1
- package/dist/write/lock.d.ts +16 -13
- package/dist/write/lock.js +55 -0
- package/dist/write/lock.js.map +1 -1
- package/dist/write/make-repeating-project.js +9 -13
- package/dist/write/make-repeating-project.js.map +1 -1
- package/dist/write/operations.d.ts +36 -21
- package/dist/write/operations.js +7 -0
- package/dist/write/operations.js.map +1 -1
- package/dist/write/opid.d.ts +14 -0
- package/dist/write/opid.js +22 -0
- package/dist/write/opid.js.map +1 -1
- package/dist/write/param-schema.d.ts +124 -0
- package/dist/write/param-schema.js +747 -0
- package/dist/write/param-schema.js.map +1 -0
- package/dist/write/pipeline.d.ts +76 -2
- package/dist/write/pipeline.js +190 -2
- package/dist/write/pipeline.js.map +1 -1
- package/dist/write/pre-state.d.ts +8 -0
- package/dist/write/pre-state.js +29 -2
- package/dist/write/pre-state.js.map +1 -1
- package/dist/write/promote-clone.js +539 -439
- package/dist/write/promote-clone.js.map +1 -1
- package/dist/write/reorder.js +25 -8
- package/dist/write/reorder.js.map +1 -1
- package/dist/write/repeat-rule.d.ts +28 -1
- package/dist/write/repeat-rule.js +54 -4
- package/dist/write/repeat-rule.js.map +1 -1
- package/dist/write/resolution-timestamps.d.ts +11 -0
- package/dist/write/resolution-timestamps.js +83 -38
- package/dist/write/resolution-timestamps.js.map +1 -1
- package/dist/write/reversibility.js +4 -0
- package/dist/write/reversibility.js.map +1 -1
- package/dist/write/template-mutation.d.ts +137 -0
- package/dist/write/template-mutation.js +451 -0
- package/dist/write/template-mutation.js.map +1 -0
- package/dist/write/undo.js +10 -20
- package/dist/write/undo.js.map +1 -1
- package/dist/write/update-fields.d.ts +151 -0
- package/dist/write/update-fields.js +427 -0
- package/dist/write/update-fields.js.map +1 -0
- package/dist/write/vectors/applescript.js +3 -0
- package/dist/write/vectors/applescript.js.map +1 -1
- package/dist/write/vectors/registry.d.ts +1 -1
- package/dist/write/vectors/registry.js +10 -2
- package/dist/write/vectors/registry.js.map +1 -1
- package/dist/write/vectors/shortcuts.js +2 -2
- package/dist/write/vectors/shortcuts.js.map +1 -1
- package/dist/write/vectors/simulator.js +7 -2
- package/dist/write/vectors/simulator.js.map +1 -1
- package/dist/write/vectors/types.d.ts +57 -0
- package/dist/write/vectors/ui-recipes.d.ts +19 -0
- package/dist/write/vectors/ui-recipes.js +30 -0
- package/dist/write/vectors/ui-recipes.js.map +1 -1
- package/dist/write/vectors/ui.d.ts +13 -0
- package/dist/write/vectors/ui.js +62 -13
- package/dist/write/vectors/ui.js.map +1 -1
- package/dist/write/verify/delta.d.ts +21 -0
- package/dist/write/verify/delta.js.map +1 -1
- package/package.json +2 -1
- package/schema/envelope.schema.json +5 -3
- package/scripts/build-helpers.sh +5 -0
- package/skills/things-cli/SKILL.md +5 -3
- package/skills/things-cli/references/contracts.md +1 -0
- package/skills/things-cli/references/data-model.md +3 -0
- package/skills/things-cli/references/errors.md +1 -1
- package/skills/things-cli/references/gui.md +1 -0
- package/skills/things-cli/references/repeating.md +6 -0
- package/skills/things-cli/references/tag-cleanup.md +64 -0
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ONE registry of the to-do / project UPDATE vocabulary
|
|
3
|
+
* ({@link UpdateFields}) — and the primitives its fields are built from.
|
|
4
|
+
*
|
|
5
|
+
* `todo.update` / `project.update` is the widest multi-consumer vocabulary in
|
|
6
|
+
* the write engine: the same seven fields are spoken by
|
|
7
|
+
*
|
|
8
|
+
* 1. the URL compilation (`update` / `update-project` parameters),
|
|
9
|
+
* 2. the expected-delta assertions (what verify — and the audit trail's
|
|
10
|
+
* pre-capture, which snapshots exactly the ASSERTED fields — must prove),
|
|
11
|
+
* 3. the undo inverse (which pre-values restore the field), and
|
|
12
|
+
* 4. the CLI / MCP patch builders (flags → params, including the two `clear-*`
|
|
13
|
+
* flags that spell a `null`).
|
|
14
|
+
*
|
|
15
|
+
* Per the exhaustive-map doctrine (decisions.md 2026-08-17, #491) none of those
|
|
16
|
+
* may hand-enumerate the vocabulary: each consumer derives from an EXHAUSTIVE
|
|
17
|
+
* `Record<keyof …, …>` here, where every field is either a producer or an
|
|
18
|
+
* explicit skip carrying a WRITTEN reason. A field added to {@link UpdateFields}
|
|
19
|
+
* breaks compilation in {@link UPDATE_FIELD_MAP} until it is consciously handled
|
|
20
|
+
* for all three engine legs, and in {@link UPDATE_INPUT_MAP} until both consumer
|
|
21
|
+
* surfaces accept it — so "accepted by the CLI, silently never reaches the URL"
|
|
22
|
+
* and "asserted shallowly, so a silent app no-op verifies ok" are unreachable by
|
|
23
|
+
* construction rather than by review.
|
|
24
|
+
*
|
|
25
|
+
* The semantic backstop the types cannot give is the DISCRIMINATION property
|
|
26
|
+
* test in test/unit/update-fields.test.ts (two patches sharing a requested-field
|
|
27
|
+
* footprint but differing in ≥1 value ⇒ asserts(A) UNSATISFIED against state(B)).
|
|
28
|
+
*/
|
|
29
|
+
import { decodeReminderTime, encodeReminderTime, reminderUrlToken, } from "../model/dates.js";
|
|
30
|
+
import { splitWhenSugar } from "../model/when-sugar.js";
|
|
31
|
+
import { reminderIsLive } from "../read/stage.js";
|
|
32
|
+
// ------------------------------------------------------- shared field primitives
|
|
33
|
+
/** Round-trip normalization: "6:5"-style inputs → canonical "06:05". */
|
|
34
|
+
export function normalizeReminder(time) {
|
|
35
|
+
return decodeReminderTime(encodeReminderTime(time)) ?? time;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The URL `when` value with an optional reminder token appended through the
|
|
39
|
+
* deterministic emitter (never a bare 1–11 hour — oddity 2d).
|
|
40
|
+
*/
|
|
41
|
+
export function whenWithReminder(when, reminder) {
|
|
42
|
+
if (reminder === undefined || reminder === null)
|
|
43
|
+
return when;
|
|
44
|
+
return `${when}@${reminderUrlToken(reminder)}`;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The schedule assertions a `when` value implies. Shared with the ADD verbs
|
|
48
|
+
* (mode "add"), which mint a fresh row rather than re-scheduling an existing one.
|
|
49
|
+
*/
|
|
50
|
+
export function whenAssertions(when, todayIso, opts = { mode: "add" }) {
|
|
51
|
+
// Strict shape check: an unvalidated string used to flow straight into the
|
|
52
|
+
// URL (e.g. "2026-07-20@09:30", the raw URL grammar) — the app would SET
|
|
53
|
+
// date+reminder while verification asserted the literal string as the date,
|
|
54
|
+
// reporting a false mismatch on a write that succeeded.
|
|
55
|
+
if (when !== "today" &&
|
|
56
|
+
when !== "evening" &&
|
|
57
|
+
when !== "anytime" &&
|
|
58
|
+
when !== "someday" &&
|
|
59
|
+
!/^\d{4}-\d{2}-\d{2}$/.test(when)) {
|
|
60
|
+
throw new RangeError(when.includes("@")
|
|
61
|
+
? `invalid when "${when}" — a reminder time is a separate parameter (reminder: "HH:mm"; CLI --reminder), not an @ suffix`
|
|
62
|
+
: `invalid when "${when}" — expected today | evening | anytime | someday | YYYY-MM-DD`);
|
|
63
|
+
}
|
|
64
|
+
switch (when) {
|
|
65
|
+
case "today":
|
|
66
|
+
// Today's non-evening section: in Today (the `today` marker) AND NOT in the
|
|
67
|
+
// evening sub-bucket (the presence-keyed `evening` marker absent — asserted
|
|
68
|
+
// as null, which valuesEqual treats as absent). Gated to Today members under
|
|
69
|
+
// the verify clock exactly as the retired `todaySection` was.
|
|
70
|
+
//
|
|
71
|
+
// The `startDate` assertion differs by op (field bug §0½.8):
|
|
72
|
+
// - ADD mints a fresh Today item with no schedule history, so the app dates
|
|
73
|
+
// it EXACTLY today — exact equality is right.
|
|
74
|
+
// - UPDATE of an item ALREADY in Today whose `startDate` has already arrived
|
|
75
|
+
// (past or today): the app PRESERVES that historical date rather than
|
|
76
|
+
// rewriting the storage byte to today (arrived-date law). Assert the
|
|
77
|
+
// arrived-date PREDICATE (non-null and <= today) so a preserved historical
|
|
78
|
+
// date verifies, while an undated deadline-only pull (null startDate) is
|
|
79
|
+
// still rejected — the item's Today membership then rests only on a
|
|
80
|
+
// deadline, not on the requested schedule.
|
|
81
|
+
return [
|
|
82
|
+
{ field: "start", equals: "active" },
|
|
83
|
+
opts.mode === "update"
|
|
84
|
+
? { field: "startDate", satisfies: { predicate: "arrived-on-or-before", date: todayIso } }
|
|
85
|
+
: { field: "startDate", equals: todayIso },
|
|
86
|
+
{ field: "today", equals: true },
|
|
87
|
+
{ field: "evening", equals: null },
|
|
88
|
+
];
|
|
89
|
+
case "evening":
|
|
90
|
+
// The This-Evening sub-bucket: the `evening` marker (which implies `today`).
|
|
91
|
+
return [
|
|
92
|
+
{ field: "start", equals: "active" },
|
|
93
|
+
{ field: "startDate", equals: todayIso },
|
|
94
|
+
{ field: "evening", equals: true },
|
|
95
|
+
];
|
|
96
|
+
case "anytime":
|
|
97
|
+
return [
|
|
98
|
+
{ field: "start", equals: "active" },
|
|
99
|
+
{ field: "startDate", equals: null },
|
|
100
|
+
];
|
|
101
|
+
case "someday":
|
|
102
|
+
return [{ field: "start", equals: "someday" }];
|
|
103
|
+
default:
|
|
104
|
+
// Concrete date: assert only the date — start-state semantics differ
|
|
105
|
+
// for past/today/future dates (only the date itself is invariant).
|
|
106
|
+
return [{ field: "startDate", equals: when }];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The effective reminder a when-bearing update should leave behind. A bare
|
|
111
|
+
* `when=` CLEARS an existing reminder (R07/R20), so when the caller
|
|
112
|
+
* re-schedules to today/evening/a date without addressing the reminder we
|
|
113
|
+
* auto-preserve the current one; an explicit null is the intentional clear.
|
|
114
|
+
*
|
|
115
|
+
* §9n: a reminder whose row's `startDate` is already strictly PAST is
|
|
116
|
+
* presentation-dead (the GUI hides its bell; the byte lingers in the DB). We do
|
|
117
|
+
* NOT auto-preserve such a stale byte — carrying it into the re-schedule would
|
|
118
|
+
* RESURRECT a reminder the user believes gone. A LIVE reminder (startDate
|
|
119
|
+
* today/future) is preserved as before. The liveness test is the SAME
|
|
120
|
+
* {@link reminderIsLive} predicate the read side gates on, consulted against the
|
|
121
|
+
* target's CURRENT `startDate` under the response clock.
|
|
122
|
+
*/
|
|
123
|
+
export function effectiveReminder(pre, params) {
|
|
124
|
+
if (params.reminder !== undefined)
|
|
125
|
+
return params.reminder;
|
|
126
|
+
const when = params.when;
|
|
127
|
+
const schedulable = when === "today" ||
|
|
128
|
+
when === "evening" ||
|
|
129
|
+
(typeof when === "string" && /^\d{4}-\d{2}-\d{2}$/.test(when));
|
|
130
|
+
if (!schedulable)
|
|
131
|
+
return null;
|
|
132
|
+
const target = pre.target;
|
|
133
|
+
if (target === null || target.type === "heading")
|
|
134
|
+
return null;
|
|
135
|
+
if (!reminderIsLive(target.startDate, pre.todayIso))
|
|
136
|
+
return null;
|
|
137
|
+
// Read the RAW stored byte off the substrate (top-level `reminder` is
|
|
138
|
+
// live-gated under the LOAD clock, which can differ from `pre.todayIso` under a
|
|
139
|
+
// pinned THINGS_NOW). The `reminderIsLive` guard above applies liveness under
|
|
140
|
+
// the injected clock explicitly, so the raw byte + this gate reproduce the
|
|
141
|
+
// former semantics exactly.
|
|
142
|
+
return target.derived.reminder;
|
|
143
|
+
}
|
|
144
|
+
export function assertNotesModesExclusive(params) {
|
|
145
|
+
if (params.notes !== undefined &&
|
|
146
|
+
(params.appendNotes !== undefined || params.prependNotes !== undefined)) {
|
|
147
|
+
throw new RangeError("notes (replace) is exclusive with appendNotes/prependNotes");
|
|
148
|
+
}
|
|
149
|
+
if (params.appendNotes !== undefined && params.prependNotes !== undefined) {
|
|
150
|
+
throw new RangeError("appendNotes and prependNotes cannot be combined in one update");
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/** The notes body an append/prepend leg should leave behind (E04/E05/E11/E12). */
|
|
154
|
+
function joinedNotes(pre, params) {
|
|
155
|
+
const current = pre.target !== null && pre.target.type !== "heading" ? pre.target.notes : "";
|
|
156
|
+
// Separator semantics probed: newline-joined, no stray newline against an
|
|
157
|
+
// empty note (E04/E05/E11/E12).
|
|
158
|
+
if (params.appendNotes !== undefined) {
|
|
159
|
+
return current === "" ? params.appendNotes : `${current}\n${params.appendNotes}`;
|
|
160
|
+
}
|
|
161
|
+
if (params.prependNotes !== undefined) {
|
|
162
|
+
return current === "" ? params.prependNotes : `${params.prependNotes}\n${current}`;
|
|
163
|
+
}
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* EXHAUSTIVE over every key of {@link UpdateFields}. The mapped-type key set
|
|
168
|
+
* (`-?` makes each required) is what makes a newly added field a COMPILE error
|
|
169
|
+
* until it earns an entry here.
|
|
170
|
+
*/
|
|
171
|
+
const UPDATE_FIELD_MAP = {
|
|
172
|
+
title: {
|
|
173
|
+
wire: (p) => ({ title: p.title }),
|
|
174
|
+
assert: (p) => [{ field: "title", equals: p.title }],
|
|
175
|
+
restore: { preField: "title" },
|
|
176
|
+
},
|
|
177
|
+
notes: {
|
|
178
|
+
wire: (p) => ({ notes: p.notes }),
|
|
179
|
+
assert: (p) => [{ field: "notes", equals: p.notes }],
|
|
180
|
+
restore: { preField: "notes" },
|
|
181
|
+
},
|
|
182
|
+
appendNotes: {
|
|
183
|
+
wire: (p) => ({ "append-notes": p.appendNotes }),
|
|
184
|
+
assert: (p, pre) => [{ field: "notes", equals: joinedNotes(pre, p) }],
|
|
185
|
+
restore: {
|
|
186
|
+
skip: "an append asserts the RESULTING notes body, so the captured `notes` pre-value (the " +
|
|
187
|
+
"`notes` entry's inverse) restores it — there is no separate append to invert",
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
prependNotes: {
|
|
191
|
+
wire: (p) => ({ "prepend-notes": p.prependNotes }),
|
|
192
|
+
assert: (p, pre) => [{ field: "notes", equals: joinedNotes(pre, p) }],
|
|
193
|
+
restore: {
|
|
194
|
+
skip: "a prepend asserts the RESULTING notes body, so the captured `notes` pre-value (the " +
|
|
195
|
+
"`notes` entry's inverse) restores it — there is no separate prepend to invert",
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
when: {
|
|
199
|
+
// The reminder rides ALONG this parameter (`when=<value>@<token>`) — see the
|
|
200
|
+
// `reminder` entry's wire skip.
|
|
201
|
+
wire: (p, pre) => ({
|
|
202
|
+
when: p.when === undefined ? undefined : whenWithReminder(p.when, effectiveReminder(pre, p)),
|
|
203
|
+
}),
|
|
204
|
+
assert: (p, pre, ctx) => p.when === undefined ? [] : whenAssertions(p.when, ctx.todayIso, { mode: "update" }),
|
|
205
|
+
restore: {
|
|
206
|
+
skip: "the schedule axis is restored as ONE reconstructed `when=` step by undo's " +
|
|
207
|
+
"scheduleSteps() (start/startDate/today/evening, or an Inbox move), not field-by-field",
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
reminder: {
|
|
211
|
+
wire: {
|
|
212
|
+
skip: "the URL scheme has no standalone reminder parameter — a reminder rides the `when` " +
|
|
213
|
+
"value as its `@<token>` suffix, emitted by the `when` entry through effectiveReminder. " +
|
|
214
|
+
"H-REMINDER-SCOPE refuses a reminder without a schedulable when, so one can never be " +
|
|
215
|
+
"requested with no `when` to carry it",
|
|
216
|
+
},
|
|
217
|
+
// Asserted whenever the SCHEDULE is rewritten (a bare `when=` clears an
|
|
218
|
+
// existing reminder unless it is auto-preserved — R07/R20, effectiveReminder),
|
|
219
|
+
// and whenever a reminder is requested outright: a requested reminder that the
|
|
220
|
+
// wire could not carry must fail verification, never pass silently.
|
|
221
|
+
assertWhen: (p) => p.when !== undefined || p.reminder !== undefined,
|
|
222
|
+
assert: (p, pre) => {
|
|
223
|
+
const reminder = effectiveReminder(pre, p);
|
|
224
|
+
return [
|
|
225
|
+
{ field: "reminder", equals: reminder === null ? null : normalizeReminder(reminder) },
|
|
226
|
+
];
|
|
227
|
+
},
|
|
228
|
+
restore: {
|
|
229
|
+
skip: "carried by the schedule step undo's scheduleSteps() builds — a reminder can only be " +
|
|
230
|
+
"re-attached together with the `when` it hangs on (R07/R20)",
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
deadline: {
|
|
234
|
+
// The empty string is the URL's deadline CLEAR (a null deadline).
|
|
235
|
+
wire: (p) => ({ deadline: p.deadline === null ? "" : p.deadline }),
|
|
236
|
+
assert: (p) => [{ field: "deadline", equals: p.deadline }],
|
|
237
|
+
restore: { preField: "deadline" },
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
/** The vocabulary's keys, in registry order (the order consumers emit in). */
|
|
241
|
+
const UPDATE_FIELD_KEYS = Object.keys(UPDATE_FIELD_MAP);
|
|
242
|
+
/**
|
|
243
|
+
* The `update` / `update-project` URL parameters for a patch (the target `id` is
|
|
244
|
+
* the caller's). Every field either contributes here or carries a written reason
|
|
245
|
+
* for why it cannot — a flag accepted by a consumer can no longer be dropped on
|
|
246
|
+
* the way to the wire without one.
|
|
247
|
+
*/
|
|
248
|
+
export function updateWireParams(params, pre) {
|
|
249
|
+
const out = {};
|
|
250
|
+
for (const key of UPDATE_FIELD_KEYS) {
|
|
251
|
+
const spec = UPDATE_FIELD_MAP[key];
|
|
252
|
+
if ("skip" in spec.wire)
|
|
253
|
+
continue;
|
|
254
|
+
Object.assign(out, spec.wire(params, pre));
|
|
255
|
+
}
|
|
256
|
+
return out;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* The expected-delta assertions for a patch: REQUESTED-FIELDS-ONLY (a field the
|
|
260
|
+
* caller did not set contributes nothing, keeping its don't-care semantics), and
|
|
261
|
+
* every requested field contributes — the audit pre-capture snapshots exactly
|
|
262
|
+
* this set, so it is also what undo has to restore from.
|
|
263
|
+
*/
|
|
264
|
+
export function updateAssertions(params, pre, ctx) {
|
|
265
|
+
const out = [];
|
|
266
|
+
for (const key of UPDATE_FIELD_KEYS) {
|
|
267
|
+
const spec = UPDATE_FIELD_MAP[key];
|
|
268
|
+
if ("skip" in spec.assert)
|
|
269
|
+
continue;
|
|
270
|
+
const present = spec.assertWhen !== undefined ? spec.assertWhen(params) : params[key] !== undefined;
|
|
271
|
+
if (present)
|
|
272
|
+
out.push(...spec.assert(params, pre, ctx));
|
|
273
|
+
}
|
|
274
|
+
return out;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* The undo inverse's per-field parameters, read off an audit record's captured
|
|
278
|
+
* pre-state (`record.pre`). The schedule axis is NOT here — undo reconstructs it
|
|
279
|
+
* as one `when=` step (see the `when` / `reminder` skips).
|
|
280
|
+
*/
|
|
281
|
+
export function updateRestoreParams(pre) {
|
|
282
|
+
const out = {};
|
|
283
|
+
if (pre === null)
|
|
284
|
+
return out;
|
|
285
|
+
for (const key of UPDATE_FIELD_KEYS) {
|
|
286
|
+
const spec = UPDATE_FIELD_MAP[key];
|
|
287
|
+
if ("skip" in spec.restore)
|
|
288
|
+
continue;
|
|
289
|
+
const captured = pre[spec.restore.preField];
|
|
290
|
+
if (captured !== undefined)
|
|
291
|
+
out[key] = captured;
|
|
292
|
+
}
|
|
293
|
+
return out;
|
|
294
|
+
}
|
|
295
|
+
/** CLI flag spellings. */
|
|
296
|
+
export const CLI_UPDATE_LABELS = {
|
|
297
|
+
when: "--when",
|
|
298
|
+
reminder: "--reminder",
|
|
299
|
+
notes: "--notes",
|
|
300
|
+
appendNotes: "--append-notes",
|
|
301
|
+
prependNotes: "--prepend-notes",
|
|
302
|
+
clearReminder: "--clear-reminder",
|
|
303
|
+
deadline: "--deadline",
|
|
304
|
+
clearDeadline: "--clear-deadline",
|
|
305
|
+
};
|
|
306
|
+
/** MCP tool-parameter spellings. */
|
|
307
|
+
export const MCP_UPDATE_LABELS = {
|
|
308
|
+
when: "when",
|
|
309
|
+
reminder: "reminder",
|
|
310
|
+
notes: "notes",
|
|
311
|
+
appendNotes: "append_notes",
|
|
312
|
+
prependNotes: "prepend_notes",
|
|
313
|
+
clearReminder: "clear_reminder",
|
|
314
|
+
deadline: "deadline",
|
|
315
|
+
clearDeadline: "clear_deadline",
|
|
316
|
+
};
|
|
317
|
+
/**
|
|
318
|
+
* EXHAUSTIVE over the consumer vocabulary — the CLI and MCP update verbs share
|
|
319
|
+
* this ONE mapping instead of each spelling out the field list (the drift that
|
|
320
|
+
* let the two surfaces validate different flag pairs).
|
|
321
|
+
*/
|
|
322
|
+
const UPDATE_INPUT_MAP = {
|
|
323
|
+
title: { kind: "value", param: "title" },
|
|
324
|
+
notes: { kind: "value", param: "notes" },
|
|
325
|
+
appendNotes: { kind: "value", param: "appendNotes" },
|
|
326
|
+
prependNotes: { kind: "value", param: "prependNotes" },
|
|
327
|
+
when: { kind: "value", param: "when" },
|
|
328
|
+
reminder: { kind: "value", param: "reminder" },
|
|
329
|
+
clearReminder: { kind: "clear", param: "reminder" },
|
|
330
|
+
deadline: { kind: "value", param: "deadline" },
|
|
331
|
+
clearDeadline: { kind: "clear", param: "deadline" },
|
|
332
|
+
createdAt: { kind: "value", param: "createdAt" },
|
|
333
|
+
completedAt: { kind: "value", param: "completedAt" },
|
|
334
|
+
};
|
|
335
|
+
const UPDATE_INPUT_KEYS = Object.keys(UPDATE_INPUT_MAP);
|
|
336
|
+
/** camelCase → the snake_case spelling of the same key (`appendNotes` → `append_notes`). */
|
|
337
|
+
function snakeOf(key) {
|
|
338
|
+
return key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`);
|
|
339
|
+
}
|
|
340
|
+
/** Read one vocabulary key from a surface's parsed options bag (either spelling). */
|
|
341
|
+
function read(source, key) {
|
|
342
|
+
return source[key] ?? source[snakeOf(key)];
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Build an update patch from a consumer surface's parsed options, or report the
|
|
346
|
+
* ONE usage error. Accepts either spelling of each key (commander's camelCase or
|
|
347
|
+
* MCP's snake_case) and ignores everything outside the vocabulary, so a surface
|
|
348
|
+
* hands its whole options bag over instead of re-listing the fields.
|
|
349
|
+
*
|
|
350
|
+
* Owns every mutually-exclusive pair in the vocabulary — the notes modes, both
|
|
351
|
+
* `clear-*` flags against their setters, and the `when` value's `@time` sugar
|
|
352
|
+
* (which is a reminder, so it collides with BOTH reminder flags). A contradiction
|
|
353
|
+
* is refused, never silently resolved in favor of one flag.
|
|
354
|
+
*/
|
|
355
|
+
export function buildUpdatePatch(source, labels = CLI_UPDATE_LABELS) {
|
|
356
|
+
const bag = {};
|
|
357
|
+
for (const key of UPDATE_INPUT_KEYS) {
|
|
358
|
+
const value = read(source, key);
|
|
359
|
+
if (value !== undefined)
|
|
360
|
+
bag[key] = value;
|
|
361
|
+
}
|
|
362
|
+
const notesModes = [bag["notes"], bag["appendNotes"], bag["prependNotes"]].filter((v) => v !== undefined);
|
|
363
|
+
if (notesModes.length > 1) {
|
|
364
|
+
return {
|
|
365
|
+
kind: "error",
|
|
366
|
+
message: `${labels.notes}, ${labels.appendNotes}, ${labels.prependNotes} are exclusive`,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
const clearReminder = bag["clearReminder"] === true;
|
|
370
|
+
const clearDeadline = bag["clearDeadline"] === true;
|
|
371
|
+
if (bag["reminder"] !== undefined && clearReminder) {
|
|
372
|
+
return {
|
|
373
|
+
kind: "error",
|
|
374
|
+
message: `pass at most one of ${labels.reminder} / ${labels.clearReminder}`,
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
if (bag["deadline"] !== undefined && clearDeadline) {
|
|
378
|
+
return {
|
|
379
|
+
kind: "error",
|
|
380
|
+
message: `pass at most one of ${labels.deadline} / ${labels.clearDeadline}`,
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
// The `@time` suffix IS a reminder: it collides with the clear flag exactly as
|
|
384
|
+
// it collides with an explicit reminder (both would otherwise be applied, and
|
|
385
|
+
// the loser silently dropped).
|
|
386
|
+
const sugar = splitWhenSugar(bag["when"], bag["reminder"] !== undefined || clearReminder, labels);
|
|
387
|
+
if (sugar.kind === "error")
|
|
388
|
+
return { kind: "error", message: sugar.message };
|
|
389
|
+
if (sugar.kind === "split") {
|
|
390
|
+
bag["when"] = sugar.when;
|
|
391
|
+
bag["reminder"] = sugar.reminder;
|
|
392
|
+
}
|
|
393
|
+
const patch = {};
|
|
394
|
+
for (const key of UPDATE_INPUT_KEYS) {
|
|
395
|
+
const spec = UPDATE_INPUT_MAP[key];
|
|
396
|
+
const value = bag[key];
|
|
397
|
+
if (spec.kind === "clear") {
|
|
398
|
+
if (value === true)
|
|
399
|
+
patch[spec.param] = null;
|
|
400
|
+
continue;
|
|
401
|
+
}
|
|
402
|
+
// The values are surface-parsed strings; the pipeline validates their SHAPE
|
|
403
|
+
// (whenAssertions / the reminder codec / the date parsers) and refuses a bad
|
|
404
|
+
// one with a named error, so no re-validation happens here. A NON-string
|
|
405
|
+
// present value is refused rather than skipped (#580): silently dropping it
|
|
406
|
+
// produced an update that reported success while leaving the field untouched
|
|
407
|
+
// — the same silent-degradation genus this registry exists to make
|
|
408
|
+
// unreachable.
|
|
409
|
+
if (value === undefined)
|
|
410
|
+
continue;
|
|
411
|
+
if (typeof value !== "string") {
|
|
412
|
+
return {
|
|
413
|
+
kind: "error",
|
|
414
|
+
message: `${labels[key] ?? key}: expected a string — received ${value === null
|
|
415
|
+
? "null"
|
|
416
|
+
: Array.isArray(value)
|
|
417
|
+
? "an array"
|
|
418
|
+
: typeof value === "object"
|
|
419
|
+
? "an object"
|
|
420
|
+
: typeof value}`,
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
patch[spec.param] = value;
|
|
424
|
+
}
|
|
425
|
+
return { kind: "ok", patch: patch };
|
|
426
|
+
}
|
|
427
|
+
//# sourceMappingURL=update-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-fields.js","sourceRoot":"","sources":["../../src/write/update-fields.ts"],"names":[],"mappings":"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"}
|
|
@@ -249,6 +249,9 @@ export function createAppleScriptVector() {
|
|
|
249
249
|
return {
|
|
250
250
|
id: "applescript",
|
|
251
251
|
matrix: APPLESCRIPT_MATRIX,
|
|
252
|
+
// The one transport that puts a real Apple Event on the wire — so the one
|
|
253
|
+
// the pipeline's app-control gate applies to (permissions doctrine).
|
|
254
|
+
sendsAppleEvents: true,
|
|
252
255
|
execute(invocation) {
|
|
253
256
|
return runOsascript(invocation.payload);
|
|
254
257
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applescript.js","sourceRoot":"","sources":["../../../src/write/vectors/applescript.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"applescript.js","sourceRoot":"","sources":["../../../src/write/vectors/applescript.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,4 +13,4 @@ import type { UiDriveAux } from "./ui-drag.ts";
|
|
|
13
13
|
* anchors the simulator fence's equality check so the applier and the pipeline's
|
|
14
14
|
* verifier can never split-brain across two different databases.
|
|
15
15
|
*/
|
|
16
|
-
export declare function defaultVectors(config?: ThingsApiConfig, uiAux?: UiDriveAux, resolvedDbPath?: string): WriteVector[];
|
|
16
|
+
export declare function defaultVectors(config?: ThingsApiConfig, uiAux?: UiDriveAux, resolvedDbPath?: string, dbPathIsExplicit?: boolean): WriteVector[];
|
|
@@ -22,7 +22,7 @@ import { createUrlSchemeVector } from "./url-scheme.js";
|
|
|
22
22
|
* anchors the simulator fence's equality check so the applier and the pipeline's
|
|
23
23
|
* verifier can never split-brain across two different databases.
|
|
24
24
|
*/
|
|
25
|
-
export function defaultVectors(config = loadConfig(), uiAux = {}, resolvedDbPath) {
|
|
25
|
+
export function defaultVectors(config = loadConfig(), uiAux = {}, resolvedDbPath, dbPathIsExplicit = false) {
|
|
26
26
|
// Bench harness (Phase 0): THINGS_SIM_WRITES=1 REQUESTS simulated writes. When
|
|
27
27
|
// it is unset (the ordinary path) the real transports are returned unchanged.
|
|
28
28
|
// When it IS set, the simulator's fence MUST hold — THINGS_DB names a fenced
|
|
@@ -53,8 +53,16 @@ export function defaultVectors(config = loadConfig(), uiAux = {}, resolvedDbPath
|
|
|
53
53
|
// point with a marked DB means the env fence is absent/incomplete (the exact
|
|
54
54
|
// shape of the escape that fired real url-scheme adds at a live app while
|
|
55
55
|
// verification read the fixture) — refuse rather than return real transports.
|
|
56
|
+
// The sweep opens each candidate to read the marker, so it may only touch
|
|
57
|
+
// EXPLICITLY supplied paths (Article VI plain-file world): a bench fixture
|
|
58
|
+
// is only ever reached via THINGS_DB or an explicit dbPath, and the LOCATED
|
|
59
|
+
// default container is definitionally not one. Opening the default container
|
|
60
|
+
// here is also an Article I violation — from a non-FDA host that open raises
|
|
61
|
+
// the app-data consent modal (measured live 2026-08-24: every `things` read
|
|
62
|
+
// from a grant-less terminal hung on this exact check, prompting as the
|
|
63
|
+
// host, even with reads fully routed through the reader).
|
|
56
64
|
const envDb = process.env["THINGS_DB"];
|
|
57
|
-
const markedPath = [resolvedDbPath, envDb]
|
|
65
|
+
const markedPath = [dbPathIsExplicit ? resolvedDbPath : undefined, envDb]
|
|
58
66
|
.filter((p) => p !== undefined && p.trim() !== "")
|
|
59
67
|
.find((p) => dbCarriesBenchMarker(p));
|
|
60
68
|
if (markedPath !== undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/write/vectors/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAwB,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGnG,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAC5B,SAA0B,UAAU,EAAE,EACtC,QAAoB,EAAE,EACtB,cAAuB;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/write/vectors/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,7 +27,7 @@ export const SHORTCUTS_MATRIX = {
|
|
|
27
27
|
evidence: ["S02"],
|
|
28
28
|
notes: "`things-proxy-create-heading` — the one surface that creates a heading in an " +
|
|
29
29
|
"EXISTING project (dead on URL T09/U09 and AppleScript A31). Requires the Things " +
|
|
30
|
-
"proxy shortcuts (`things setup
|
|
30
|
+
"proxy shortcuts (`things setup`); no transactional undo (heading delete " +
|
|
31
31
|
"is interactive-only, so undo reports irreversible)",
|
|
32
32
|
},
|
|
33
33
|
"todo.clear-dated-reminder": {
|
|
@@ -42,7 +42,7 @@ export const SHORTCUTS_MATRIX = {
|
|
|
42
42
|
"(RC01/RC02) for NON-REPEATING items when it is not (the bounce when= CRASHES a repeating " +
|
|
43
43
|
"template, R09 — repeating stays Shortcuts-only). The clear is REVERSIBLE either way: undo " +
|
|
44
44
|
"re-attaches the reminder via the URL set path (R17/R18). Same-date bare `when=` is sticky " +
|
|
45
|
-
"(R20/R21, oddity 2e). Requires the Things proxy shortcuts (`things setup
|
|
45
|
+
"(R20/R21, oddity 2e). Requires the Things proxy shortcuts (`things setup`)",
|
|
46
46
|
},
|
|
47
47
|
};
|
|
48
48
|
function defaultRun(shortcut, inputPath, outputPath) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shortcuts.js","sourceRoot":"","sources":["../../../src/write/vectors/shortcuts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGlE,sEAAsE;AACtE,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAEpC,MAAM,CAAC,MAAM,gBAAgB,GAAiB;IAC5C,qBAAqB,EAAE;QACrB,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,CAAC;QACb,UAAU,EAAE,WAAW;QACvB,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,KAAK,EACH,+EAA+E;YAC/E,kFAAkF;YAClF,
|
|
1
|
+
{"version":3,"file":"shortcuts.js","sourceRoot":"","sources":["../../../src/write/vectors/shortcuts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGlE,sEAAsE;AACtE,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAEpC,MAAM,CAAC,MAAM,gBAAgB,GAAiB;IAC5C,qBAAqB,EAAE;QACrB,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,CAAC;QACb,UAAU,EAAE,WAAW;QACvB,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,KAAK,EACH,+EAA+E;YAC/E,kFAAkF;YAClF,0EAA0E;YAC1E,oDAAoD;KACvD;IACD,2BAA2B,EAAE;QAC3B,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,CAAC;QACb,UAAU,EAAE,WAAW;QACvB,QAAQ,EAAE,CAAC,SAAS,CAAC;QACrB,KAAK,EACH,yFAAyF;YACzF,qFAAqF;YACrF,0FAA0F;YAC1F,mFAAmF;YACnF,2FAA2F;YAC3F,4FAA4F;YAC5F,4FAA4F;YAC5F,4EAA4E;KAC/E;CACF,CAAC;AAaF,SAAS,UAAU,CACjB,QAAgB,EAChB,SAAiB,EACjB,UAAkB;IAElB,4EAA4E;IAC5E,qEAAqE;IACrE,kEAAkE;IAClE,OAAO,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAuB,UAAU;IACrE,OAAO;QACL,EAAE,EAAE,WAAW;QACf,MAAM,EAAE,gBAAgB;QACxB,KAAK,CAAC,OAAO,CAAC,UAA8B;YAC1C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC;YAChE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;YAC5C,IAAI,CAAC;gBACH,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBACzE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;gBAC3E,uEAAuE;gBACvE,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBAC5C,CAAC;gBAAC,MAAM,CAAC;oBACP,mEAAmE;gBACrE,CAAC;gBACD,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;YAC/B,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -26,7 +26,7 @@ import { DatabaseSync } from "node:sqlite";
|
|
|
26
26
|
import { readDatabaseVersion } from "../../db/fingerprint.js";
|
|
27
27
|
import { addDaysIso, decodePackedDate, encodePackedDate, encodeReminderTime, localToday, } from "../../model/dates.js";
|
|
28
28
|
import { decodeRecurrenceRule } from "../../model/recurrence.js";
|
|
29
|
-
import { resolveResolutionInstant } from "../commands.js";
|
|
29
|
+
import { assertContainerRef, resolveResolutionInstant } from "../commands.js";
|
|
30
30
|
import { computeReorderPre, resolveArea, resolveHeading, resolveProject, resolveTag, } from "../pre-state.js";
|
|
31
31
|
import { fixedSpawnPlan, isIsoDate } from "../repeat-anchor.js";
|
|
32
32
|
import { composeRepeatRuleSpec, ruleXml } from "../recurrence-rule-blob.js";
|
|
@@ -212,8 +212,13 @@ function scheduleColumns(when, todayIso, hasContainer) {
|
|
|
212
212
|
}
|
|
213
213
|
}
|
|
214
214
|
function containerUuid(sim, ref, kind) {
|
|
215
|
-
|
|
215
|
+
// Presence, not a duck-test — the same law the engine's own `containerGiven`
|
|
216
|
+
// follows (#580): a present ref that names neither a uuid nor a title THROWS
|
|
217
|
+
// instead of reading as "no container", so the simulator can never model a
|
|
218
|
+
// placement-free create for a caller who asked for a placement.
|
|
219
|
+
if (ref === undefined || ref === null)
|
|
216
220
|
return null;
|
|
221
|
+
assertContainerRef(ref);
|
|
217
222
|
const res = kind === "project" ? resolveProject(sim, ref) : resolveArea(sim, ref);
|
|
218
223
|
if (res.resolved === null)
|
|
219
224
|
throw new Error(`simulator: unresolved ${kind} reference`);
|