things-api 0.10.0 → 0.12.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 +50 -13
- package/dist/audit/schema.d.ts +7 -0
- package/dist/audit/schema.js.map +1 -1
- package/dist/cli/clock.d.ts +8 -0
- package/dist/cli/clock.js +24 -0
- package/dist/cli/clock.js.map +1 -0
- package/dist/cli/commands/area.d.ts +18 -11
- package/dist/cli/commands/area.js +61 -74
- package/dist/cli/commands/area.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +1 -2
- package/dist/cli/commands/doctor.js +11 -1
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/install-skill.d.ts +60 -0
- package/dist/cli/commands/install-skill.js +256 -0
- package/dist/cli/commands/install-skill.js.map +1 -0
- package/dist/cli/commands/mcp.js +9 -0
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/project.d.ts +1 -0
- package/dist/cli/commands/project.js +27 -34
- package/dist/cli/commands/project.js.map +1 -1
- package/dist/cli/commands/reads.d.ts +15 -2
- package/dist/cli/commands/reads.js +144 -44
- package/dist/cli/commands/reads.js.map +1 -1
- package/dist/cli/commands/setup.js +7 -2
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/show.js +38 -14
- package/dist/cli/commands/show.js.map +1 -1
- package/dist/cli/commands/todo.js +15 -9
- package/dist/cli/commands/todo.js.map +1 -1
- package/dist/cli/commands/writes.js +797 -174
- package/dist/cli/commands/writes.js.map +1 -1
- package/dist/cli/did-you-mean.d.ts +14 -3
- package/dist/cli/did-you-mean.js +26 -3
- package/dist/cli/did-you-mean.js.map +1 -1
- package/dist/cli/glyphs.d.ts +32 -2
- package/dist/cli/glyphs.js +83 -12
- package/dist/cli/glyphs.js.map +1 -1
- package/dist/cli/help.js +121 -16
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/main.js +33 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/move-hint.d.ts +46 -0
- package/dist/cli/move-hint.js +196 -0
- package/dist/cli/move-hint.js.map +1 -0
- package/dist/cli/period.d.ts +2 -8
- package/dist/cli/period.js +44 -30
- package/dist/cli/period.js.map +1 -1
- package/dist/cli/read-driver.d.ts +43 -5
- package/dist/cli/read-driver.js +91 -15
- package/dist/cli/read-driver.js.map +1 -1
- package/dist/cli/render.d.ts +19 -8
- package/dist/cli/render.js +70 -27
- package/dist/cli/render.js.map +1 -1
- package/dist/cli/resolve-invocation.d.ts +2 -2
- package/dist/cli/resolve-invocation.js +3 -3
- package/dist/cli/resolve-invocation.js.map +1 -1
- package/dist/cli/skill-check.d.ts +27 -0
- package/dist/cli/skill-check.js +99 -0
- package/dist/cli/skill-check.js.map +1 -0
- package/dist/cli/skill.d.ts +70 -0
- package/dist/cli/skill.js +152 -0
- package/dist/cli/skill.js.map +1 -0
- package/dist/cli/tag-filters.d.ts +6 -2
- package/dist/cli/tag-filters.js +8 -6
- package/dist/cli/tag-filters.js.map +1 -1
- package/dist/cli/verb-hint.js +28 -3
- package/dist/cli/verb-hint.js.map +1 -1
- package/dist/cli/version.d.ts +4 -0
- package/dist/cli/version.js +18 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/client.d.ts +171 -27
- package/dist/client.js +279 -40
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +66 -2
- package/dist/config.js +120 -12
- package/dist/config.js.map +1 -1
- package/dist/contracts.d.ts +186 -28
- package/dist/contracts.js +22 -1
- package/dist/contracts.js.map +1 -1
- package/dist/diagnose.d.ts +34 -2
- package/dist/diagnose.js +36 -1
- package/dist/diagnose.js.map +1 -1
- package/dist/index.d.ts +25 -9
- package/dist/index.js +22 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +9 -0
- package/dist/mcp/server.js +1157 -684
- package/dist/mcp/server.js.map +1 -1
- package/dist/model/clock.d.ts +61 -0
- package/dist/model/clock.js +71 -0
- package/dist/model/clock.js.map +1 -0
- package/dist/model/dates.d.ts +26 -3
- package/dist/model/dates.js +84 -3
- package/dist/model/dates.js.map +1 -1
- package/dist/model/entities.d.ts +60 -3
- package/dist/model/entities.js.map +1 -1
- package/dist/model/mappers.d.ts +4 -2
- package/dist/model/mappers.js +66 -9
- package/dist/model/mappers.js.map +1 -1
- package/dist/model/recurrence.d.ts +8 -1
- package/dist/model/recurrence.js.map +1 -1
- package/dist/read/area-filter.d.ts +76 -0
- package/dist/read/area-filter.js +59 -0
- package/dist/read/area-filter.js.map +1 -0
- package/dist/read/area-view.d.ts +12 -12
- package/dist/read/area-view.js +58 -34
- package/dist/read/area-view.js.map +1 -1
- package/dist/read/detail.d.ts +1 -1
- package/dist/read/detail.js +26 -12
- package/dist/read/detail.js.map +1 -1
- package/dist/read/log-boundary.d.ts +1 -1
- package/dist/read/log-boundary.js +13 -3
- package/dist/read/log-boundary.js.map +1 -1
- package/dist/read/predicates.d.ts +18 -0
- package/dist/read/predicates.js +19 -0
- package/dist/read/predicates.js.map +1 -1
- package/dist/read/project-view.d.ts +32 -16
- package/dist/read/project-view.js +80 -45
- package/dist/read/project-view.js.map +1 -1
- package/dist/read/pseudo-area.d.ts +29 -0
- package/dist/read/pseudo-area.js +27 -0
- package/dist/read/pseudo-area.js.map +1 -0
- package/dist/read/queries.d.ts +108 -19
- package/dist/read/queries.js +212 -35
- package/dist/read/queries.js.map +1 -1
- package/dist/read/scope.d.ts +126 -0
- package/dist/read/scope.js +162 -0
- package/dist/read/scope.js.map +1 -0
- package/dist/read/search-rank.d.ts +2 -5
- package/dist/read/shape.d.ts +162 -0
- package/dist/read/shape.js +686 -0
- package/dist/read/shape.js.map +1 -0
- package/dist/read/show-target.d.ts +9 -1
- package/dist/read/show-target.js +45 -4
- package/dist/read/show-target.js.map +1 -1
- package/dist/read/snapshot.d.ts +1 -1
- package/dist/read/snapshot.js +9 -2
- package/dist/read/snapshot.js.map +1 -1
- package/dist/read/stage.d.ts +199 -0
- package/dist/read/stage.js +125 -0
- package/dist/read/stage.js.map +1 -0
- package/dist/read/truncation.d.ts +8 -6
- package/dist/read/truncation.js +35 -10
- package/dist/read/truncation.js.map +1 -1
- package/dist/read/views.d.ts +61 -20
- package/dist/read/views.js +240 -82
- package/dist/read/views.js.map +1 -1
- package/dist/surface-copy.d.ts +9 -0
- package/dist/surface-copy.js +9 -0
- package/dist/surface-copy.js.map +1 -1
- package/dist/write/accessibility-probe.d.ts +1 -1
- package/dist/write/accessibility-probe.js +8 -0
- package/dist/write/accessibility-probe.js.map +1 -1
- package/dist/write/automation-probe.d.ts +1 -1
- package/dist/write/automation-probe.js +8 -0
- package/dist/write/automation-probe.js.map +1 -1
- package/dist/write/batch.d.ts +49 -10
- package/dist/write/batch.js +423 -70
- package/dist/write/batch.js.map +1 -1
- package/dist/write/commands.d.ts +1 -1
- package/dist/write/commands.js +316 -66
- package/dist/write/commands.js.map +1 -1
- package/dist/write/guards.d.ts +1 -1
- package/dist/write/guards.js +94 -10
- package/dist/write/guards.js.map +1 -1
- package/dist/write/heading.d.ts +10 -1
- package/dist/write/heading.js +35 -5
- package/dist/write/heading.js.map +1 -1
- package/dist/write/make-repeating-project.d.ts +2 -2
- package/dist/write/make-repeating-project.js +9 -9
- package/dist/write/make-repeating-project.js.map +1 -1
- package/dist/write/move.d.ts +130 -0
- package/dist/write/move.js +1533 -0
- package/dist/write/move.js.map +1 -0
- package/dist/write/operations.d.ts +105 -19
- package/dist/write/operations.js +56 -7
- package/dist/write/operations.js.map +1 -1
- package/dist/write/opid.d.ts +31 -0
- package/dist/write/opid.js +30 -0
- package/dist/write/opid.js.map +1 -0
- package/dist/write/pipeline.d.ts +122 -3
- package/dist/write/pipeline.js +309 -52
- package/dist/write/pipeline.js.map +1 -1
- package/dist/write/planner.js +8 -1
- package/dist/write/planner.js.map +1 -1
- package/dist/write/pre-state.d.ts +197 -6
- package/dist/write/pre-state.js +427 -20
- package/dist/write/pre-state.js.map +1 -1
- package/dist/write/recurrence-rule-blob.d.ts +65 -0
- package/dist/write/recurrence-rule-blob.js +150 -0
- package/dist/write/recurrence-rule-blob.js.map +1 -0
- package/dist/write/reorder.d.ts +23 -3
- package/dist/write/reorder.js +1871 -85
- package/dist/write/reorder.js.map +1 -1
- package/dist/write/reversibility.js +19 -7
- package/dist/write/reversibility.js.map +1 -1
- package/dist/write/scope-guard.d.ts +31 -0
- package/dist/write/scope-guard.js +162 -0
- package/dist/write/scope-guard.js.map +1 -0
- package/dist/write/undo.js +120 -13
- package/dist/write/undo.js.map +1 -1
- package/dist/write/vectors/applescript.js +16 -7
- package/dist/write/vectors/applescript.js.map +1 -1
- package/dist/write/vectors/registry.d.ts +5 -7
- package/dist/write/vectors/registry.js +49 -2
- package/dist/write/vectors/registry.js.map +1 -1
- package/dist/write/vectors/shortcuts.js +1 -1
- package/dist/write/vectors/shortcuts.js.map +1 -1
- package/dist/write/vectors/simulator.d.ts +44 -0
- package/dist/write/vectors/simulator.js +1192 -0
- package/dist/write/vectors/simulator.js.map +1 -0
- package/dist/write/vectors/types.d.ts +46 -0
- package/dist/write/vectors/ui-certification.d.ts +10 -4
- package/dist/write/vectors/ui-certification.js +43 -10
- package/dist/write/vectors/ui-certification.js.map +1 -1
- package/dist/write/vectors/ui-drag.d.ts +21 -1
- package/dist/write/vectors/ui-drag.js +138 -27
- package/dist/write/vectors/ui-drag.js.map +1 -1
- package/dist/write/vectors/ui-recipes.d.ts +34 -1
- package/dist/write/vectors/ui-recipes.js +217 -6
- package/dist/write/vectors/ui-recipes.js.map +1 -1
- package/dist/write/vectors/ui.d.ts +40 -1
- package/dist/write/vectors/ui.js +196 -39
- package/dist/write/vectors/ui.js.map +1 -1
- package/dist/write/verify/delta.d.ts +127 -2
- package/dist/write/verify/delta.js +255 -16
- package/dist/write/verify/delta.js.map +1 -1
- package/dist/write/verify/poller.d.ts +7 -1
- package/dist/write/verify/poller.js +20 -1
- package/dist/write/verify/poller.js.map +1 -1
- package/package.json +24 -3
- package/schema/envelope.schema.json +383 -0
- package/skills/things-cli/SKILL.md +70 -0
- package/skills/things-cli/references/banner.md +35 -0
- package/skills/things-cli/references/contracts.md +62 -0
- package/skills/things-cli/references/errors.md +49 -0
- package/skills/things-cli/references/gui.md +11 -0
- package/skills/things-cli/references/model.md +60 -0
- package/skills/things-cli/references/ordering.md +71 -0
package/dist/write/pipeline.d.ts
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import type { DatabaseSync } from "node:sqlite";
|
|
2
2
|
import type { AuditWriter } from "../audit/log.ts";
|
|
3
|
+
import { type AuditRecord } from "../audit/schema.ts";
|
|
3
4
|
import type { DisruptionTier, ThingsApiConfig } from "../config.ts";
|
|
4
5
|
import type { FingerprintStatus } from "../db/fingerprint.ts";
|
|
6
|
+
import { type ResolvedScope } from "../read/scope.ts";
|
|
5
7
|
import { type ShortcutsState } from "./availability.ts";
|
|
6
8
|
import { type EnvironmentTracker } from "./environment.ts";
|
|
7
9
|
import { type LikelyCause } from "./failure-hints.ts";
|
|
8
10
|
import { type HazardId } from "./guards.ts";
|
|
9
|
-
import type
|
|
11
|
+
import { type Acknowledgements, type OperationKind, type OperationParamsMap } from "./operations.ts";
|
|
10
12
|
import type { VectorId, WriteVector } from "./vectors/types.ts";
|
|
11
|
-
import { type DeltaSpec } from "./verify/delta.ts";
|
|
13
|
+
import { type DeltaSpec, type RepeatingDiscovery } from "./verify/delta.ts";
|
|
12
14
|
import { type PollerDeps } from "./verify/poller.ts";
|
|
13
15
|
export interface WriteOptions extends Acknowledgements {
|
|
14
16
|
/** Caps vector selection; defaults from the config profile. */
|
|
@@ -18,6 +20,16 @@ export interface WriteOptions extends Acknowledgements {
|
|
|
18
20
|
verifyTimeoutMs?: number;
|
|
19
21
|
/** Return the plan without executing (nothing is audited). */
|
|
20
22
|
dryRun?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Skip the post-execute state VERIFY poll for this write, treating a clean
|
|
25
|
+
* transport (exit 0) as ok. Fail-loud on the transport itself is preserved (a
|
|
26
|
+
* nonzero exit / deadline still runs the recovery re-verify). Used by the
|
|
27
|
+
* bounce orchestrator for the transient AWAY/BACK legs of a `when=` round-trip:
|
|
28
|
+
* the intermediate someday state is not independently verified — one verify
|
|
29
|
+
* per item round-trip (the placed-position + when-restore delta) is asserted by
|
|
30
|
+
* the orchestrator at item completion instead (reordgaps-results.md BOUNCE2).
|
|
31
|
+
*/
|
|
32
|
+
skipVerify?: boolean;
|
|
21
33
|
/**
|
|
22
34
|
* Create any tag named in this op's tags that does not exist yet (through the
|
|
23
35
|
* clean `make new tag` path, mkdir-p for `parent/child`) BEFORE applying —
|
|
@@ -38,6 +50,29 @@ export interface WriteOptions extends Acknowledgements {
|
|
|
38
50
|
* already-undone mutation is distinguishable from a nonexistent one.
|
|
39
51
|
*/
|
|
40
52
|
undoOf?: string;
|
|
53
|
+
/**
|
|
54
|
+
* Client idempotency id — a batch line's `opId` (set by the batch
|
|
55
|
+
* orchestrator) OR a single mutation's `--op-id` (set by the client `run`
|
|
56
|
+
* entry). Recorded on the audit record so a resubmission carrying the same id
|
|
57
|
+
* is recognized as already-applied. Recording is additive and never affects
|
|
58
|
+
* dispatch; the single-op idempotency CHECK (skip-and-replay on a match) runs
|
|
59
|
+
* in the client `run` entry before this pipeline is reached.
|
|
60
|
+
*/
|
|
61
|
+
opId?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Consumer IANA zone for THIS write, overriding the client's default zone.
|
|
64
|
+
* Only affects the clock-relative `when` tokens (today/evening) when
|
|
65
|
+
* {@link normalizeWhen} is set. Reminder times stay wall-clock and untranslated.
|
|
66
|
+
*/
|
|
67
|
+
zone?: string;
|
|
68
|
+
/**
|
|
69
|
+
* Normalize a CONSUMER-provided clock-relative `when` (today/evening) to the
|
|
70
|
+
* effective consumer zone BEFORE dispatch — set by the consumer entry points
|
|
71
|
+
* (the client's `run`, batch), NEVER by the internal orchestrators (undo,
|
|
72
|
+
* reorder), whose when tokens converse with app-written host state and must
|
|
73
|
+
* stay on the host clock.
|
|
74
|
+
*/
|
|
75
|
+
normalizeWhen?: boolean;
|
|
41
76
|
}
|
|
42
77
|
export interface MutationPlan {
|
|
43
78
|
op: OperationKind;
|
|
@@ -51,6 +86,13 @@ export type MutationResult = {
|
|
|
51
86
|
kind: "ok";
|
|
52
87
|
op: OperationKind;
|
|
53
88
|
uuid: string | null;
|
|
89
|
+
/**
|
|
90
|
+
* The mutated item's title (ADDITIVE), when the op targets a single
|
|
91
|
+
* pre-existing item — its pre-write title, captured before the change.
|
|
92
|
+
* Lets a batch log confirm WHAT was mutated without a second read. Absent
|
|
93
|
+
* for create/reorder ops, which have no single pre-existing target.
|
|
94
|
+
*/
|
|
95
|
+
title?: string;
|
|
54
96
|
observed: Record<string, unknown> | null;
|
|
55
97
|
vector: VectorId;
|
|
56
98
|
tier: DisruptionTier;
|
|
@@ -60,8 +102,34 @@ export type MutationResult = {
|
|
|
60
102
|
* unaffected by any other mutations made in between.
|
|
61
103
|
*/
|
|
62
104
|
undoToken?: string;
|
|
105
|
+
/**
|
|
106
|
+
* Make-repeating conversions (todo/project make-repeating, and
|
|
107
|
+
* project.add-repeating via its promote leg): the discovered template
|
|
108
|
+
* uuid, the FK-derived current-occurrence instance (use this for the
|
|
109
|
+
* VISIBLE item), and the replaced original uuid — plus `childrenReplaced`
|
|
110
|
+
* for project conversions. `uuid` still equals `templateUuid` (use it to
|
|
111
|
+
* reschedule the repeat). Absent for every other op.
|
|
112
|
+
*/
|
|
113
|
+
repeating?: RepeatingDiscovery;
|
|
63
114
|
/** Advisory notes (e.g. a changed environment tuple — consent may re-prompt later). */
|
|
64
115
|
warnings?: string[];
|
|
116
|
+
/**
|
|
117
|
+
* Co-bounced siblings (ADDITIVE): a bounce reorder that anchors a block
|
|
118
|
+
* with --before/--after (or lands it mid-bucket) must re-insert every
|
|
119
|
+
* UNNAMED member between the block and the bucket edge. Those items get a
|
|
120
|
+
* modification bump, a changes-feed entry, and an audit leg — disclosed
|
|
121
|
+
* here explicitly, never as fine print. Absent when only the named movees
|
|
122
|
+
* were touched.
|
|
123
|
+
*/
|
|
124
|
+
touched?: string[];
|
|
125
|
+
/**
|
|
126
|
+
* Idempotency replay (ADDITIVE, presence-keyed): `true` when this result
|
|
127
|
+
* did NOT execute — a mutation carrying an `opId` matched a prior verified
|
|
128
|
+
* `ok` record with the same id in the recent change history, so the earlier
|
|
129
|
+
* change stands and nothing ran again. The `uuid`/`title`/`undoToken` echo
|
|
130
|
+
* the ORIGINAL mutation's identity. Absent on a normal (executed) result.
|
|
131
|
+
*/
|
|
132
|
+
alreadyApplied?: true;
|
|
65
133
|
} | {
|
|
66
134
|
kind: "verify-failed";
|
|
67
135
|
op: OperationKind;
|
|
@@ -75,7 +143,7 @@ export type MutationResult = {
|
|
|
75
143
|
} | {
|
|
76
144
|
kind: "blocked";
|
|
77
145
|
op: OperationKind;
|
|
78
|
-
reason: "hazard" | "disruption-tier" | "drift" | "lock" | "environment";
|
|
146
|
+
reason: "hazard" | "disruption-tier" | "drift" | "lock" | "environment" | "clock" | "scope";
|
|
79
147
|
hazard?: HazardId;
|
|
80
148
|
detail: string;
|
|
81
149
|
remediation: string;
|
|
@@ -111,9 +179,60 @@ export interface WriteDeps {
|
|
|
111
179
|
/** Seam: installed Things proxy shortcuts, for the pre-dispatch availability gate (availability.ts). */
|
|
112
180
|
shortcutProxies?: () => ShortcutsState;
|
|
113
181
|
now?: () => Date;
|
|
182
|
+
/** Default consumer IANA zone (client-resolved from THINGS_TZ); normalizes consumer `when` tokens. */
|
|
183
|
+
zone?: string;
|
|
184
|
+
/**
|
|
185
|
+
* The active container scope (pinned at openThings). When set: uuid targets
|
|
186
|
+
* resolve scope-aware (out-of-scope == not-found parity), and the universal
|
|
187
|
+
* scope gate (evaluateScope) runs before the hazard guards. Absent = unscoped.
|
|
188
|
+
*/
|
|
189
|
+
scope?: ResolvedScope;
|
|
114
190
|
poller?: PollerDeps;
|
|
115
191
|
pkgVersion?: string;
|
|
192
|
+
/**
|
|
193
|
+
* Audit-trail directory (client-wired): read by `runBatch` for the opId
|
|
194
|
+
* idempotency lookback. Absent = no lookback (opId dedup is a no-op), which is
|
|
195
|
+
* the correct degraded behavior when the trail is unavailable.
|
|
196
|
+
*/
|
|
197
|
+
auditDirPath?: string;
|
|
116
198
|
}
|
|
117
199
|
export declare function readAuthToken(db: DatabaseSync): string | null;
|
|
200
|
+
/**
|
|
201
|
+
* Normalize a CONSUMER-provided clock-relative `when` for the effective zone,
|
|
202
|
+
* so the app (which would interpret the bare word on the HOST clock) never sees
|
|
203
|
+
* a relative token that means a different calendar date for the consumer.
|
|
204
|
+
*
|
|
205
|
+
* - `today` → the consumer-zone calendar date, dispatched as an explicit
|
|
206
|
+
* `when=YYYY-MM-DD` (with any reminder still appended) so verification agrees
|
|
207
|
+
* by construction. When the consumer's today already equals the app's today
|
|
208
|
+
* the token is left as-is (byte-identical dispatch). A consumer-today that is
|
|
209
|
+
* host-yesterday yields a past startDate — coherent (lands in Today with
|
|
210
|
+
* overdue-start semantics), documented, not special-cased.
|
|
211
|
+
* - `evening` → This Evening exists ONLY for the app machine's own current day
|
|
212
|
+
* (the startBucket=1 rows whose startDate is exactly the app's today; an
|
|
213
|
+
* "evening of another day" is not representable in Things' model, not even in
|
|
214
|
+
* the GUI — see src/read/views.ts). Refused fail-closed when the dates differ.
|
|
215
|
+
*
|
|
216
|
+
* Reminder times are wall-clock and tz-less in Things' own model — never
|
|
217
|
+
* translated here.
|
|
218
|
+
*/
|
|
219
|
+
export declare function normalizeConsumerWhen(params: Record<string, unknown>, now: Date, zone: string): {
|
|
220
|
+
ok: true;
|
|
221
|
+
params: Record<string, unknown>;
|
|
222
|
+
} | {
|
|
223
|
+
ok: false;
|
|
224
|
+
detail: string;
|
|
225
|
+
remediation: string;
|
|
226
|
+
};
|
|
118
227
|
export declare function runMutation<K extends OperationKind>(deps: WriteDeps, op: K, params: OperationParamsMap[K], options?: WriteOptions): Promise<MutationResult>;
|
|
228
|
+
/**
|
|
229
|
+
* Build the single-op idempotency REPLAY result from the matched audit record —
|
|
230
|
+
* a `kind: "ok"` MutationResult that did not execute (`alreadyApplied: true`),
|
|
231
|
+
* echoing the ORIGINAL mutation's identity. Mirrors the pipeline's own
|
|
232
|
+
* result-shaping: the `undoToken` is surfaced under the SAME rule the executor
|
|
233
|
+
* uses (only for a non-leg, reversible op — an irreversible op or a batch leg
|
|
234
|
+
* carries none), and `title` rides `requested.title` when the record stored one
|
|
235
|
+
* (the audit record has no dedicated title field — see the trail-record note).
|
|
236
|
+
*/
|
|
237
|
+
export declare function replayResultFromRecord(record: AuditRecord): MutationResult;
|
|
119
238
|
export declare function fingerprintLabel(fp: FingerprintStatus, config: ThingsApiConfig): "ok" | "drift" | "user-accepted" | "unknown";
|