things-api 0.11.0 → 0.13.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 -5
- package/dist/audit/schema.d.ts +7 -0
- package/dist/audit/schema.js.map +1 -1
- package/dist/cli/canonical-ref.d.ts +21 -0
- package/dist/cli/canonical-ref.js +23 -0
- package/dist/cli/canonical-ref.js.map +1 -0
- package/dist/cli/commands/area.d.ts +18 -11
- package/dist/cli/commands/area.js +81 -77
- 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 +19 -4
- package/dist/cli/commands/install-skill.js +130 -52
- package/dist/cli/commands/install-skill.js.map +1 -1
- package/dist/cli/commands/mcp.js +21 -1
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/project.d.ts +1 -0
- package/dist/cli/commands/project.js +92 -48
- package/dist/cli/commands/project.js.map +1 -1
- package/dist/cli/commands/reads.d.ts +5 -1
- package/dist/cli/commands/reads.js +110 -31
- package/dist/cli/commands/reads.js.map +1 -1
- package/dist/cli/commands/setup.js +11 -4
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/show.js +75 -36
- package/dist/cli/commands/show.js.map +1 -1
- package/dist/cli/commands/todo.js +2 -2
- package/dist/cli/commands/todo.js.map +1 -1
- package/dist/cli/commands/writes.js +795 -144
- 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 +44 -7
- package/dist/cli/did-you-mean.js.map +1 -1
- package/dist/cli/dry-run.d.ts +55 -0
- package/dist/cli/dry-run.js +92 -0
- package/dist/cli/dry-run.js.map +1 -0
- package/dist/cli/glyphs.d.ts +16 -2
- package/dist/cli/glyphs.js +60 -12
- package/dist/cli/glyphs.js.map +1 -1
- package/dist/cli/help.js +69 -13
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/main.js +8 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/move-hint.d.ts +3 -2
- package/dist/cli/move-hint.js +2 -2
- package/dist/cli/move-hint.js.map +1 -1
- package/dist/cli/read-driver.d.ts +53 -5
- package/dist/cli/read-driver.js +82 -15
- package/dist/cli/read-driver.js.map +1 -1
- package/dist/cli/ref-render.d.ts +14 -0
- package/dist/cli/ref-render.js +9 -0
- package/dist/cli/ref-render.js.map +1 -0
- package/dist/cli/render.d.ts +40 -14
- package/dist/cli/render.js +128 -55
- package/dist/cli/render.js.map +1 -1
- package/dist/cli/resolve-invocation.d.ts +7 -5
- package/dist/cli/resolve-invocation.js +16 -7
- package/dist/cli/resolve-invocation.js.map +1 -1
- package/dist/cli/skill-check.d.ts +12 -6
- package/dist/cli/skill-check.js +31 -14
- package/dist/cli/skill-check.js.map +1 -1
- package/dist/cli/skill.d.ts +8 -0
- package/dist/cli/skill.js +10 -0
- package/dist/cli/skill.js.map +1 -1
- package/dist/cli/verb-hint.js +1 -1
- package/dist/cli/verb-hint.js.map +1 -1
- package/dist/client.d.ts +158 -26
- package/dist/client.js +254 -38
- 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 +187 -28
- package/dist/contracts.js +22 -1
- package/dist/contracts.js.map +1 -1
- package/dist/db/baselines/db-v26.js +4 -1
- package/dist/db/baselines/db-v26.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 +21 -8
- package/dist/index.js +26 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +9 -0
- package/dist/mcp/server.js +790 -322
- package/dist/mcp/server.js.map +1 -1
- package/dist/model/entities.d.ts +57 -4
- package/dist/model/entities.js.map +1 -1
- package/dist/model/mappers.d.ts +2 -0
- package/dist/model/mappers.js +44 -2
- 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/model/serialize.js +15 -3
- package/dist/model/serialize.js.map +1 -1
- package/dist/read/area-filter.d.ts +76 -0
- package/dist/read/area-filter.js +58 -0
- package/dist/read/area-filter.js.map +1 -0
- package/dist/read/area-view.d.ts +22 -11
- package/dist/read/area-view.js +54 -28
- package/dist/read/area-view.js.map +1 -1
- package/dist/read/detail.js +15 -8
- package/dist/read/detail.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 +91 -15
- package/dist/read/project-view.js +135 -37
- 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 +175 -19
- package/dist/read/queries.js +376 -32
- package/dist/read/queries.js.map +1 -1
- package/dist/read/scope.d.ts +126 -0
- package/dist/read/scope.js +161 -0
- package/dist/read/scope.js.map +1 -0
- package/dist/read/search-rank.d.ts +2 -5
- package/dist/read/shape.d.ts +181 -0
- package/dist/read/shape.js +737 -0
- package/dist/read/shape.js.map +1 -0
- package/dist/read/show-target.d.ts +9 -1
- package/dist/read/show-target.js +77 -17
- package/dist/read/show-target.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 +7 -12
- package/dist/read/truncation.js +56 -21
- package/dist/read/truncation.js.map +1 -1
- package/dist/read/views.d.ts +68 -16
- package/dist/read/views.js +206 -52
- package/dist/read/views.js.map +1 -1
- package/dist/surface-copy.d.ts +16 -0
- package/dist/surface-copy.js +16 -0
- package/dist/surface-copy.js.map +1 -1
- package/dist/write/batch.d.ts +49 -10
- package/dist/write/batch.js +423 -71
- package/dist/write/batch.js.map +1 -1
- package/dist/write/commands.js +268 -55
- package/dist/write/commands.js.map +1 -1
- package/dist/write/guards.d.ts +1 -1
- package/dist/write/guards.js +71 -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 +134 -0
- package/dist/write/move.js +1874 -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 +70 -3
- package/dist/write/pipeline.js +198 -33
- package/dist/write/pipeline.js.map +1 -1
- package/dist/write/pre-state.d.ts +172 -8
- package/dist/write/pre-state.js +467 -25
- package/dist/write/pre-state.js.map +1 -1
- package/dist/write/reorder.d.ts +23 -3
- package/dist/write/reorder.js +2106 -86
- 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/shortcuts.js +1 -1
- package/dist/write/vectors/shortcuts.js.map +1 -1
- package/dist/write/vectors/simulator.js +83 -27
- package/dist/write/vectors/simulator.js.map +1 -1
- package/dist/write/vectors/types.d.ts +11 -0
- package/dist/write/vectors/ui-certification.d.ts +3 -3
- package/dist/write/vectors/ui-certification.js +41 -5
- 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 +21 -1
- package/dist/write/vectors/ui-recipes.js +166 -7
- package/dist/write/vectors/ui-recipes.js.map +1 -1
- package/dist/write/vectors/ui.d.ts +25 -1
- package/dist/write/vectors/ui.js +142 -33
- package/dist/write/vectors/ui.js.map +1 -1
- package/dist/write/verify/delta.d.ts +17 -1
- package/dist/write/verify/delta.js +106 -29
- package/dist/write/verify/delta.js.map +1 -1
- package/package.json +7 -1
- package/schema/envelope.schema.json +397 -0
- package/skills/things-cli/SKILL.md +36 -17
- package/skills/things-cli/references/banner.md +35 -0
- package/skills/things-cli/references/contracts.md +32 -9
- package/skills/things-cli/references/errors.md +57 -0
- package/skills/things-cli/references/gui.md +1 -1
- package/skills/things-cli/references/model.md +18 -7
- package/skills/things-cli/references/ordering.md +88 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recurrence.js","sourceRoot":"","sources":["../../src/model/recurrence.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recurrence.js","sourceRoot":"","sources":["../../src/model/recurrence.ts"],"names":[],"mappings":"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"}
|
package/dist/model/serialize.js
CHANGED
|
@@ -26,10 +26,22 @@
|
|
|
26
26
|
* can be "" (an untitled to-do) and MUST still be present.
|
|
27
27
|
*/
|
|
28
28
|
const IDENTITY_KEYS = new Set(["uuid", "type", "title", "name"]);
|
|
29
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* A to-do/project/heading row: uuid + a task-type discriminant. `type` is
|
|
31
|
+
* PRESENCE-KEYED on the shaped wire — omitted on a to-do (absent `type` = to-do,
|
|
32
|
+
* the same convention the wire uses), present for project/heading — so a
|
|
33
|
+
* type-less row with a uuid + title (and no competing `visible` area
|
|
34
|
+
* discriminant) IS a to-do here. Shaping runs before this transform, so the
|
|
35
|
+
* type has already been dropped by the time we prune.
|
|
36
|
+
*/
|
|
30
37
|
function isTaskEntity(o) {
|
|
31
|
-
|
|
32
|
-
|
|
38
|
+
const t = o["type"];
|
|
39
|
+
if (t === "to-do" || t === "project" || t === "heading")
|
|
40
|
+
return true;
|
|
41
|
+
return (t === undefined &&
|
|
42
|
+
typeof o["uuid"] === "string" &&
|
|
43
|
+
typeof o["title"] === "string" &&
|
|
44
|
+
typeof o["visible"] !== "boolean");
|
|
33
45
|
}
|
|
34
46
|
/** An area: uuid + the `visible` flag (distinguishes it from a bare Ref). */
|
|
35
47
|
function isAreaEntity(o) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../src/model/serialize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;GAIG;AACH,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAItF
|
|
1
|
+
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../src/model/serialize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;GAIG;AACH,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAItF;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,CAAM;IAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACpB,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrE,OAAO,CACL,CAAC,KAAK,SAAS;QACf,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,QAAQ;QAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ;QAC9B,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,SAAS,CAClC,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,SAAS,YAAY,CAAC,CAAM;IAC1B,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC;AAC5E,CAAC;AAED,gFAAgF;AAChF,SAAS,WAAW,CAAC,CAAM;IACzB,OAAO,CACL,CAAC,CAAC,MAAM,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,QAAQ,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,CAC9F,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,SAAS,aAAa,CAAC,CAAM;IAC3B,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,2EAA2E;AAC3E,SAAS,OAAO,CAAC,CAAU;IACzB,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,KAAK,CAAC,KAAc;IAC3B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxD,+EAA+E;IAC/E,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,KAAY,CAAC;QACvB,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,GAAG,GAAQ,EAAE,CAAC;QACpB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACjB,IAAI,WAAW,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;gBAAE,SAAS;YACnE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAI,OAAU;IACrC,OAAO,KAAK,CAAC,OAAO,CAAM,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `--area` view filter: a pure POST-FILTER applied to an already-computed
|
|
3
|
+
* list view, restricting it to one area. It NEVER changes a view's membership
|
|
4
|
+
* or ordering logic — it runs after the view is shaped and BEFORE any row cap /
|
|
5
|
+
* truncation, so `--limit` (and the grouped per-block caps) size the filtered
|
|
6
|
+
* result, not the raw one.
|
|
7
|
+
*
|
|
8
|
+
* KEEP RULE (transitive): a row survives when its EFFECTIVE area is the target —
|
|
9
|
+
* its own `area`, or (for a to-do nested in a project, directly or via a
|
|
10
|
+
* heading) its containing project's area. Project rows survive when the
|
|
11
|
+
* project's own area is the target. Everything else is dropped: other areas,
|
|
12
|
+
* area-less loose items, area-less projects and their children, and Inbox rows.
|
|
13
|
+
* The entity's `area` Ref already IS this effective area (queries.ts
|
|
14
|
+
* EFFECTIVE_AREA, surfaced by mappers.ts), so the rule is a single comparison.
|
|
15
|
+
*
|
|
16
|
+
* The filtering lives here in the library layer, not in the CLI/MCP consumers:
|
|
17
|
+
* both surfaces enable it by passing an `area` ref, and the client applies it
|
|
18
|
+
* uniformly across every shaped view (flat lists, the Today split, and the
|
|
19
|
+
* grouped sidebar catalogues).
|
|
20
|
+
*/
|
|
21
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
22
|
+
import type { IsoDate } from "../model/dates.ts";
|
|
23
|
+
import type { ListItem, SidebarSection, TodayView } from "./views.ts";
|
|
24
|
+
/**
|
|
25
|
+
* The resolved target of an `area` filter — the area's uuid and title. Surfaced
|
|
26
|
+
* as the additive `meta.filter.area` annotation so a consumer knows exactly
|
|
27
|
+
* which area the returned rows were scoped to.
|
|
28
|
+
*/
|
|
29
|
+
export interface AreaFilterTarget {
|
|
30
|
+
uuid: string;
|
|
31
|
+
title: string;
|
|
32
|
+
}
|
|
33
|
+
/** The additive `meta.filter` annotation, emitted only when a filter is active. */
|
|
34
|
+
export interface ViewFilterMeta {
|
|
35
|
+
area: AreaFilterTarget;
|
|
36
|
+
}
|
|
37
|
+
/** A per-read `area` scope accepted by the flat/grouped/Today view reads. */
|
|
38
|
+
export interface AreaScopedRead {
|
|
39
|
+
/**
|
|
40
|
+
* Restrict the computed view to one area (uuid or unique name): its direct
|
|
41
|
+
* items and its projects' children (heading-nested included). Unresolvable
|
|
42
|
+
* or ambiguous references throw {@link ReferenceResolutionError}, exactly like
|
|
43
|
+
* every other ref argument.
|
|
44
|
+
*/
|
|
45
|
+
area?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolve an area ref (uuid or unique name) to its uuid + title via the SAME
|
|
49
|
+
* resolver the `things areas <ref>` view command uses, then read the title for
|
|
50
|
+
* the {@link ViewFilterMeta} annotation. Throws on an unresolvable/ambiguous
|
|
51
|
+
* ref, carrying the standard machine-readable candidate shape.
|
|
52
|
+
*/
|
|
53
|
+
export declare function resolveAreaFilter(db: DatabaseSync, ref: string): AreaFilterTarget;
|
|
54
|
+
/**
|
|
55
|
+
* The transitive keep-rule: the row's EFFECTIVE area is the target. The reserved
|
|
56
|
+
* {@link LOOSE_REF} sentinel selects the area-less rows instead — an effective
|
|
57
|
+
* area of null (the row's own area is null AND, for a project child, its project
|
|
58
|
+
* carries no area either; `item.area` already IS that effective area).
|
|
59
|
+
*/
|
|
60
|
+
export declare function itemInArea(item: ListItem, areaUuid: string): boolean;
|
|
61
|
+
/** Filter a flat view (upcoming) to the target area. */
|
|
62
|
+
export declare function filterListByArea<T extends ListItem>(items: T[], areaUuid: string): T[];
|
|
63
|
+
/**
|
|
64
|
+
* Filter the grouped sidebar catalogue (anytime/someday) to the target area:
|
|
65
|
+
* each section's items are filtered by the keep-rule and empty sections drop.
|
|
66
|
+
* A section is already grouped by effective area, so at most one survives — but
|
|
67
|
+
* the per-item pass keeps the rule identical to the flat/Today paths.
|
|
68
|
+
*/
|
|
69
|
+
export declare function filterSectionsByArea(sections: SidebarSection[], areaUuid: string): SidebarSection[];
|
|
70
|
+
/**
|
|
71
|
+
* Filter the today view to the target area. The counts are recomputed over the
|
|
72
|
+
* surviving OPEN members so they reflect exactly the rows the view now returns —
|
|
73
|
+
* the same treatment {@link todayView} gives its `eveningOnly` filter — never a
|
|
74
|
+
* count that includes dropped rows.
|
|
75
|
+
*/
|
|
76
|
+
export declare function filterTodayByArea(view: TodayView, areaUuid: string, todayIso: IsoDate): TodayView;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { resolveAreaUuid } from "./queries.js";
|
|
2
|
+
import { isLooseRef, LOOSE_REF } from "./pseudo-area.js";
|
|
3
|
+
/**
|
|
4
|
+
* Resolve an area ref (uuid or unique name) to its uuid + title via the SAME
|
|
5
|
+
* resolver the `things areas <ref>` view command uses, then read the title for
|
|
6
|
+
* the {@link ViewFilterMeta} annotation. Throws on an unresolvable/ambiguous
|
|
7
|
+
* ref, carrying the standard machine-readable candidate shape.
|
|
8
|
+
*/
|
|
9
|
+
export function resolveAreaFilter(db, ref) {
|
|
10
|
+
// The reserved `loose` ref addresses the NULL area (area-less items) as a
|
|
11
|
+
// pseudo-area — no real uuid to resolve. The sentinel uuid `loose` is itself
|
|
12
|
+
// a valid read-surface ref (it round-trips), so `meta.filter.area` stays
|
|
13
|
+
// consumable. See itemInArea + the native-query loose clauses (logbook/search).
|
|
14
|
+
if (isLooseRef(ref))
|
|
15
|
+
return { uuid: LOOSE_REF, title: "Loose" };
|
|
16
|
+
const uuid = resolveAreaUuid(db, ref);
|
|
17
|
+
const row = db.prepare("SELECT title FROM TMArea WHERE uuid = ?").get(uuid);
|
|
18
|
+
return { uuid, title: row?.title ?? "" };
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The transitive keep-rule: the row's EFFECTIVE area is the target. The reserved
|
|
22
|
+
* {@link LOOSE_REF} sentinel selects the area-less rows instead — an effective
|
|
23
|
+
* area of null (the row's own area is null AND, for a project child, its project
|
|
24
|
+
* carries no area either; `item.area` already IS that effective area).
|
|
25
|
+
*/
|
|
26
|
+
export function itemInArea(item, areaUuid) {
|
|
27
|
+
if (areaUuid === LOOSE_REF)
|
|
28
|
+
return item.area == null;
|
|
29
|
+
return item.area?.uuid === areaUuid;
|
|
30
|
+
}
|
|
31
|
+
/** Filter a flat view (upcoming) to the target area. */
|
|
32
|
+
export function filterListByArea(items, areaUuid) {
|
|
33
|
+
return items.filter((i) => itemInArea(i, areaUuid));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Filter the grouped sidebar catalogue (anytime/someday) to the target area:
|
|
37
|
+
* each section's items are filtered by the keep-rule and empty sections drop.
|
|
38
|
+
* A section is already grouped by effective area, so at most one survives — but
|
|
39
|
+
* the per-item pass keeps the rule identical to the flat/Today paths.
|
|
40
|
+
*/
|
|
41
|
+
export function filterSectionsByArea(sections, areaUuid) {
|
|
42
|
+
return sections
|
|
43
|
+
.map((s) => ({ area: s.area, items: s.items.filter((i) => itemInArea(i, areaUuid)) }))
|
|
44
|
+
.filter((s) => s.items.length > 0);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Filter the today view to the target area. The counts are recomputed over the
|
|
48
|
+
* surviving OPEN members so they reflect exactly the rows the view now returns —
|
|
49
|
+
* the same treatment {@link todayView} gives its `eveningOnly` filter — never a
|
|
50
|
+
* count that includes dropped rows.
|
|
51
|
+
*/
|
|
52
|
+
export function filterTodayByArea(view, areaUuid, todayIso) {
|
|
53
|
+
const items = view.items.filter((i) => itemInArea(i, areaUuid));
|
|
54
|
+
const open = items.filter((i) => i.status === "open");
|
|
55
|
+
const dueOrOverdue = open.filter((i) => i.deadline !== null && i.deadline <= todayIso).length;
|
|
56
|
+
return { items, counts: { dueOrOverdue, other: open.length - dueOrOverdue } };
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=area-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"area-filter.js","sourceRoot":"","sources":["../../src/read/area-filter.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AA6BzD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAgB,EAAE,GAAW;IAC7D,0EAA0E;IAC1E,6EAA6E;IAC7E,yEAAyE;IACzE,gFAAgF;IAChF,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,CAAC,IAAI,CAE7D,CAAC;IACd,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAc,EAAE,QAAgB;IACzD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IACrD,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC;AACtC,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,gBAAgB,CAAqB,KAAU,EAAE,QAAgB;IAC/E,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAA0B,EAC1B,QAAgB;IAEhB,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;SACrF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAe,EAAE,QAAgB,EAAE,QAAiB;IACpF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,MAAM,CAAC;IAC9F,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,YAAY,EAAE,EAAE,CAAC;AAChF,CAAC"}
|
package/dist/read/area-view.d.ts
CHANGED
|
@@ -1,27 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Composite area view mirroring the native UI: the area's direct to-dos
|
|
3
3
|
* (active first), its projects as rows in sidebar order, later items
|
|
4
|
-
* (scheduled by date / repeating templates / someday)
|
|
4
|
+
* (scheduled by date / repeating templates / someday). Trashed children are
|
|
5
|
+
* excluded entirely (GUI-faithful — §6½/PLOG1-a) and the area logbook is a
|
|
6
|
+
* bounded QUERY (`things logbook --area <ref>`), not a view section.
|
|
5
7
|
* Structural twin of project-view.ts; area to-dos are never headed.
|
|
6
8
|
*/
|
|
7
9
|
import type { DatabaseSync } from "node:sqlite";
|
|
8
10
|
import type { Area, IsoDateGroup, Project, Todo } from "../model/entities.ts";
|
|
9
11
|
import { type ViewFilter } from "./views.ts";
|
|
10
12
|
export interface AreaView {
|
|
11
|
-
area
|
|
13
|
+
/** The area, or `null` for the `loose` pseudo-area (the NULL-area composite). */
|
|
14
|
+
area: Area | null;
|
|
15
|
+
/**
|
|
16
|
+
* ALL live (non-logbook) DIRECT to-dos of the area, in `index` order, each
|
|
17
|
+
* carrying `stage` + `when` — the flat wire representation (read-shape doctrine
|
|
18
|
+
* §3.13's area-view `items[]`). Area direct to-dos are never headed and never
|
|
19
|
+
* project-nested, so they are fully self-describing once `area` (the card
|
|
20
|
+
* states it) is dropped. The structured buckets below (`active`, `scheduled`,
|
|
21
|
+
* `someday`, `repeating`) re-group the SAME to-dos into the GUI render layout
|
|
22
|
+
* for the byte-stable TTY (the library owns the clock + `todayIndex`).
|
|
23
|
+
* `projects[]` is the SEPARATE order axis (sidebar rank) and is NOT folded in.
|
|
24
|
+
*/
|
|
25
|
+
items: Todo[];
|
|
12
26
|
/** Open, unscheduled/current direct to-dos, by index. */
|
|
13
27
|
active: Todo[];
|
|
14
28
|
/** The area's open projects in sidebar order (someday projects included). */
|
|
15
29
|
projects: Project[];
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
};
|
|
23
|
-
logged: Todo[];
|
|
24
|
-
trashed: Todo[];
|
|
30
|
+
/** Future-dated direct to-dos grouped by date ascending. */
|
|
31
|
+
scheduled: IsoDateGroup<Todo>[];
|
|
32
|
+
/** Someday (incubated, undated) direct to-dos. */
|
|
33
|
+
someday: Todo[];
|
|
34
|
+
/** Repeating template rows owned by this area (invisible in list views). */
|
|
35
|
+
repeating: Todo[];
|
|
25
36
|
}
|
|
26
37
|
/** A someday project row: open, incubated, no start date. */
|
|
27
38
|
export declare const isSomedayProjectRow: (p: Project) => boolean;
|
package/dist/read/area-view.js
CHANGED
|
@@ -3,6 +3,7 @@ import { mapProject, mapTodo } from "../model/mappers.js";
|
|
|
3
3
|
import { fetchTagsForTasks, fetchTaskRows, makeRefResolver, resolveAreaUuid } from "./queries.js";
|
|
4
4
|
import { logBoundary, markLogged } from "./log-boundary.js";
|
|
5
5
|
import { OVERDUE } from "./predicates.js";
|
|
6
|
+
import { isLooseRef } from "./pseudo-area.js";
|
|
6
7
|
import { areaTags } from "./tags.js";
|
|
7
8
|
import { tagFilter } from "./views.js";
|
|
8
9
|
// The area card splits its open projects into three display buckets by their
|
|
@@ -21,19 +22,48 @@ export const isActiveProjectRow = (p, todayIso) => !isSomedayProjectRow(p) && !i
|
|
|
21
22
|
/** Resolves by uuid or unique (case-insensitive) title; throws like the ref resolvers. */
|
|
22
23
|
export function areaView(db, ref, now, filter = {}, zone) {
|
|
23
24
|
const overdue = filter.overdue === true;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
25
|
+
// The reserved `loose` ref addresses the NULL area (area-less items) as a
|
|
26
|
+
// pseudo-area: `area === null`, and the per-kind area predicates swap to the
|
|
27
|
+
// NULL-area membership rule (projects with no area; direct to-dos with no area
|
|
28
|
+
// AND no project AND not in the Inbox). Every other filter/section behaves
|
|
29
|
+
// identically, so the two paths differ ONLY in the area clause + the synthetic
|
|
30
|
+
// null area object.
|
|
31
|
+
const loose = isLooseRef(ref);
|
|
32
|
+
let area;
|
|
33
|
+
// The per-kind area membership: PROJECTS filter on the area FK; DIRECT to-dos
|
|
34
|
+
// additionally exclude project-nested rows and Inbox captures (start=0) — a
|
|
35
|
+
// real area's `t.area = ?` gets those exclusions for free (an inbox/nested row
|
|
36
|
+
// carries no area FK), so they only appear in the NULL-area branch.
|
|
37
|
+
let projectAreaSql;
|
|
38
|
+
let projectAreaBinds;
|
|
39
|
+
let todoAreaSql;
|
|
40
|
+
let todoAreaBinds;
|
|
41
|
+
if (loose) {
|
|
42
|
+
area = null;
|
|
43
|
+
projectAreaSql = "t.area IS NULL";
|
|
44
|
+
projectAreaBinds = [];
|
|
45
|
+
todoAreaSql = "t.area IS NULL AND t.project IS NULL AND t.start != 0";
|
|
46
|
+
todoAreaBinds = [];
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const uuid = resolveAreaUuid(db, ref);
|
|
50
|
+
const row = db
|
|
51
|
+
.prepare(`SELECT uuid, title, visible, "index" FROM TMArea WHERE uuid = ?`)
|
|
52
|
+
.get(uuid);
|
|
53
|
+
if (row === undefined)
|
|
54
|
+
throw new Error(`no area with uuid ${uuid}`);
|
|
55
|
+
area = {
|
|
56
|
+
uuid: row.uuid,
|
|
57
|
+
title: row.title ?? "",
|
|
58
|
+
visible: row.visible !== 0,
|
|
59
|
+
// Area tags by NAME only (tag uuids are internal).
|
|
60
|
+
tags: areaTags(db, uuid).map((t) => ({ title: t.title })),
|
|
61
|
+
};
|
|
62
|
+
projectAreaSql = "t.area = ?";
|
|
63
|
+
projectAreaBinds = [uuid];
|
|
64
|
+
todoAreaSql = "t.area = ?";
|
|
65
|
+
todoAreaBinds = [uuid];
|
|
66
|
+
}
|
|
37
67
|
const refs = makeRefResolver(db);
|
|
38
68
|
const tagsOf = (rows) => fetchTagsForTasks(db, rows.map((r) => r.uuid));
|
|
39
69
|
const boundary = logBoundary(db, now, zone);
|
|
@@ -61,11 +91,11 @@ export function areaView(db, ref, now, filter = {}, zone) {
|
|
|
61
91
|
// Open projects PLUS closed ones the log-move sweep has not passed — the
|
|
62
92
|
// GUI keeps those checked in place (completion ≠ logged). Under --overdue the
|
|
63
93
|
// OVERDUE predicate's own `status = 0` narrows this to open overdue projects.
|
|
64
|
-
const projectRows = fetchTaskRows(db, `t.type = 1 AND
|
|
65
|
-
AND (t.status = 0 OR t.stopDate > ?)${overdueSql}${tf.sql} ORDER BY t."index" ASC`, [
|
|
94
|
+
const projectRows = fetchTaskRows(db, `t.type = 1 AND ${projectAreaSql} AND t.trashed = 0
|
|
95
|
+
AND (t.status = 0 OR t.stopDate > ?)${overdueSql}${tf.sql} ORDER BY t."index" ASC`, [...projectAreaBinds, boundary.getTime() / 1000, ...overdueBinds, ...tf.binds]);
|
|
66
96
|
const projectTags = tagsOf(projectRows);
|
|
67
97
|
const projects = markLogged(projectRows.map((r) => mapProject(r, refs, projectTags.get(r.uuid) ?? [], packedToday)), boundary);
|
|
68
|
-
const todoRows = fetchTaskRows(db, `t.type = 0 AND t.
|
|
98
|
+
const todoRows = fetchTaskRows(db, `t.type = 0 AND t.trashed = 0 AND ${todoAreaSql}${overdueSql}${tf.sql} ORDER BY t."index" ASC`, [...todoAreaBinds, ...overdueBinds, ...tf.binds]);
|
|
69
99
|
const todoTags = tagsOf(todoRows);
|
|
70
100
|
const todos = todoRows.map((r) => ({
|
|
71
101
|
row: r,
|
|
@@ -76,23 +106,16 @@ export function areaView(db, ref, now, filter = {}, zone) {
|
|
|
76
106
|
const scheduledRows = [];
|
|
77
107
|
const repeating = [];
|
|
78
108
|
const someday = [];
|
|
79
|
-
const logged = [];
|
|
80
|
-
const trashed = [];
|
|
81
109
|
for (const { row: todoRow, todo } of todos) {
|
|
82
|
-
if (todoRow.trashed === 1) {
|
|
83
|
-
trashed.push(todo);
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
110
|
if (todo.repeating.isTemplate) {
|
|
87
111
|
repeating.push(todo);
|
|
88
112
|
continue;
|
|
89
113
|
}
|
|
90
114
|
if (todoRow.status !== 0) {
|
|
91
115
|
// Completion ≠ logged: closed-but-unswept items stay checked in the
|
|
92
|
-
// active block, like the GUI.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
else
|
|
116
|
+
// active block, like the GUI. Logged rows (past the log boundary) are
|
|
117
|
+
// NOT a view section — they live in `things logbook --area <ref>`.
|
|
118
|
+
if (!todo.logged)
|
|
96
119
|
active.push(todo);
|
|
97
120
|
continue;
|
|
98
121
|
}
|
|
@@ -110,7 +133,6 @@ export function areaView(db, ref, now, filter = {}, zone) {
|
|
|
110
133
|
}
|
|
111
134
|
active.push(todo);
|
|
112
135
|
}
|
|
113
|
-
logged.sort((a, b) => (b.stopped?.getTime() ?? 0) - (a.stopped?.getTime() ?? 0));
|
|
114
136
|
const scheduled = [];
|
|
115
137
|
// Within a day the UI sorts by todayIndex ASC (Upcoming drag order).
|
|
116
138
|
for (const { date, todo } of scheduledRows.toSorted((a, b) => a.date.localeCompare(b.date) || a.ti - b.ti)) {
|
|
@@ -120,6 +142,10 @@ export function areaView(db, ref, now, filter = {}, zone) {
|
|
|
120
142
|
else
|
|
121
143
|
scheduled.push({ date, items: [todo] });
|
|
122
144
|
}
|
|
123
|
-
|
|
145
|
+
// The flat wire `items[]`: every LIVE direct to-do in area index order (the
|
|
146
|
+
// `todos` fetch is already `ORDER BY index ASC`). Excludes swept logged rows
|
|
147
|
+
// (the area view has no logbook section — they live in `things logbook --area`).
|
|
148
|
+
const items = todos.map((t) => t.todo).filter((td) => !td.logged);
|
|
149
|
+
return { area, items, active, projects, scheduled, someday, repeating };
|
|
124
150
|
}
|
|
125
151
|
//# sourceMappingURL=area-view.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"area-view.js","sourceRoot":"","sources":["../../src/read/area-view.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"area-view.js","sourceRoot":"","sources":["../../src/read/area-view.ts"],"names":[],"mappings":"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"}
|
package/dist/read/detail.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { mapChecklistItem, mapHeading, mapProject, mapTodo, } from "../model/mappers.js";
|
|
2
2
|
import { decodeRecurrenceRule } from "../model/recurrence.js";
|
|
3
3
|
import { encodePackedDate, localToday } from "../model/dates.js";
|
|
4
|
-
import { fetchChecklistRows, fetchTagsForTasks, fetchTaskByUuid, makeHeadingProjectResolver, makeRefResolver, } from "./queries.js";
|
|
4
|
+
import { fetchChecklistRows, fetchTagsForTasks, fetchTaskByUuid, latestInstanceUuid, makeHeadingProjectResolver, makeRefResolver, } from "./queries.js";
|
|
5
5
|
import { logBoundary, markLogged } from "./log-boundary.js";
|
|
6
6
|
import { inheritedTagsFor } from "./tags.js";
|
|
7
7
|
// `now`/`zone` supply the evaluation clock used to gate `todaySection` to
|
|
@@ -34,14 +34,21 @@ function materializeOne(db, row, packedToday) {
|
|
|
34
34
|
entity.headingProject = p;
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
|
-
if (entity.repeating.isTemplate
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
if (entity.repeating.isTemplate) {
|
|
38
|
+
if (row.rt1_recurrenceRule !== null) {
|
|
39
|
+
try {
|
|
40
|
+
entity.repeating.rule = decodeRecurrenceRule(row.rt1_recurrenceRule);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Unknown rule schema (future Things build) — surface the template
|
|
44
|
+
// without a decoded rule rather than failing the whole read.
|
|
45
|
+
}
|
|
44
46
|
}
|
|
47
|
+
// The GUI "Show Latest" pick (SL1) — detail-only; the shaper emits it NESTED
|
|
48
|
+
// inside the wire `repeating` object. Omitted when the template has none.
|
|
49
|
+
const latest = latestInstanceUuid(db, row.uuid);
|
|
50
|
+
if (latest !== null)
|
|
51
|
+
entity.repeating.latestInstance = latest;
|
|
45
52
|
}
|
|
46
53
|
return entity;
|
|
47
54
|
}
|
package/dist/read/detail.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detail.js","sourceRoot":"","sources":["../../src/read/detail.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,OAAO,GAER,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,0BAA0B,EAC1B,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,0EAA0E;AAC1E,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAChF,MAAM,UAAU,MAAM,CACpB,EAAgB,EAChB,IAAY,EACZ,MAAY,IAAI,IAAI,EAAE,EACtB,IAAa;IAEb,MAAM,GAAG,GAAG,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,cAAc,CAAC,EAAE,EAAE,GAAG,EAAE,gBAAgB,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,cAAc,CAAC,EAAgB,EAAE,GAAY,EAAE,WAAmB;IACzE,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,iBAAiB,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACnE,MAAM,MAAM,GACV,GAAG,CAAC,IAAI,KAAK,CAAC;QACZ,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC;QAC1C,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAC5C,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,aAAa,GAAG,gBAAgB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,MAAM,CAAC,SAAS,GAAG,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9C,uEAAuE;QACvE,sDAAsD;QACtD,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,0BAA0B,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9D,IAAI,CAAC,KAAK,IAAI;gBAAE,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,IAAI,GAAG,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"detail.js","sourceRoot":"","sources":["../../src/read/detail.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,24 @@ export declare const OPEN_OR_UNSWEPT = "t.type IN (0, 1) AND t.trashed = 0 AND (
|
|
|
34
34
|
export declare const OVERDUE = "t.deadline IS NOT NULL AND t.deadline < ? AND t.status = 0";
|
|
35
35
|
/** An item's own anytime membership: unscheduled-active, or dated <= today. */
|
|
36
36
|
export declare const ANYTIME_SELF: (col: string) => string;
|
|
37
|
+
/**
|
|
38
|
+
* The Today DEADLINE-PULL arm (BANNER1 / BANNER1b, docs/lab/banner1-research.md):
|
|
39
|
+
* an UNDATED row (startDate NULL) that a due/overdue, un-dismissed deadline pulls
|
|
40
|
+
* into Today — even from the Inbox or Someday, while its raw `start` still reads
|
|
41
|
+
* 0/2. This is the EXACT second arm {@link todayView} uses; it is written ONCE
|
|
42
|
+
* here so the three GUI-faithful memberships that turn on it can never drift from
|
|
43
|
+
* the pull the Today view claims (BANNER1 law L-A):
|
|
44
|
+
* - `todayView` INCLUDES it (a deadline pulls the row into Today);
|
|
45
|
+
* - `anytimeView` INCLUDES it (Anytime ⊇ Today's to-dos — the pull re-files the
|
|
46
|
+
* row into Anytime, BANNER1b);
|
|
47
|
+
* - `somedayView` / `inboxView` EXCLUDE it (the GUI removes a pulled row from
|
|
48
|
+
* Someday/Inbox even before it materializes, BANNER1 Q1b).
|
|
49
|
+
* The `startDate IS NULL` clause scopes it to UNMATERIALIZED pulls; the
|
|
50
|
+
* suppression guard drops a dismissed nag (supp == deadline) and lets a re-armed
|
|
51
|
+
* one (supp < deadline) through (oddities §8e). ONE bind: today as a packed-date
|
|
52
|
+
* int (encodePackedDate(localToday(now))), the same injected clock every view uses.
|
|
53
|
+
*/
|
|
54
|
+
export declare const DEADLINE_PULLED = "(t.deadline IS NOT NULL AND t.deadline <= ? AND t.startDate IS NULL\n AND (t.deadlineSuppressionDate IS NULL OR t.deadlineSuppressionDate < t.deadline))";
|
|
37
55
|
/**
|
|
38
56
|
* The item's effective project: its own link, or its heading's project for
|
|
39
57
|
* headed children (heading rows carry the project link).
|
package/dist/read/predicates.js
CHANGED
|
@@ -45,6 +45,25 @@ export const OVERDUE = `t.deadline IS NOT NULL AND t.deadline < ? AND t.status =
|
|
|
45
45
|
/** An item's own anytime membership: unscheduled-active, or dated <= today. */
|
|
46
46
|
export const ANYTIME_SELF = (col) => `((${col}.start = 1 AND (${col}.startDate IS NULL OR ${col}.startDate <= ?))
|
|
47
47
|
OR (${col}.start = 2 AND ${col}.startDate IS NOT NULL AND ${col}.startDate <= ?))`;
|
|
48
|
+
/**
|
|
49
|
+
* The Today DEADLINE-PULL arm (BANNER1 / BANNER1b, docs/lab/banner1-research.md):
|
|
50
|
+
* an UNDATED row (startDate NULL) that a due/overdue, un-dismissed deadline pulls
|
|
51
|
+
* into Today — even from the Inbox or Someday, while its raw `start` still reads
|
|
52
|
+
* 0/2. This is the EXACT second arm {@link todayView} uses; it is written ONCE
|
|
53
|
+
* here so the three GUI-faithful memberships that turn on it can never drift from
|
|
54
|
+
* the pull the Today view claims (BANNER1 law L-A):
|
|
55
|
+
* - `todayView` INCLUDES it (a deadline pulls the row into Today);
|
|
56
|
+
* - `anytimeView` INCLUDES it (Anytime ⊇ Today's to-dos — the pull re-files the
|
|
57
|
+
* row into Anytime, BANNER1b);
|
|
58
|
+
* - `somedayView` / `inboxView` EXCLUDE it (the GUI removes a pulled row from
|
|
59
|
+
* Someday/Inbox even before it materializes, BANNER1 Q1b).
|
|
60
|
+
* The `startDate IS NULL` clause scopes it to UNMATERIALIZED pulls; the
|
|
61
|
+
* suppression guard drops a dismissed nag (supp == deadline) and lets a re-armed
|
|
62
|
+
* one (supp < deadline) through (oddities §8e). ONE bind: today as a packed-date
|
|
63
|
+
* int (encodePackedDate(localToday(now))), the same injected clock every view uses.
|
|
64
|
+
*/
|
|
65
|
+
export const DEADLINE_PULLED = `(t.deadline IS NOT NULL AND t.deadline <= ? AND t.startDate IS NULL
|
|
66
|
+
AND (t.deadlineSuppressionDate IS NULL OR t.deadlineSuppressionDate < t.deadline))`;
|
|
48
67
|
/**
|
|
49
68
|
* The item's effective project: its own link, or its heading's project for
|
|
50
69
|
* headed children (heading rows carry the project link).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"predicates.js","sourceRoot":"","sources":["../../src/read/predicates.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,oFAAoF;AACpF,MAAM,CAAC,MAAM,IAAI,GAAG,0CAA0C,YAAY,EAAE,CAAC;AAE7E,yDAAyD;AACzD,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,IAAI,mBAAmB,CAAC;AAE/C;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,IAAI,8EAA8E,CAAC;AAErH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,4DAA4D,CAAC;AAEpF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAU,EAAE,CAClD,KAAK,GAAG,mBAAmB,GAAG,yBAAyB,GAAG;UAClD,GAAG,kBAAkB,GAAG,8BAA8B,GAAG,mBAAmB,CAAC;AAEvF;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,gFAAgF,CAAC;AAE5G;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,WAAW;6CACR,WAAW;8CACV,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAEpE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;QAE3B,WAAW;+CAC4B,WAAW,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"predicates.js","sourceRoot":"","sources":["../../src/read/predicates.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,oFAAoF;AACpF,MAAM,CAAC,MAAM,IAAI,GAAG,0CAA0C,YAAY,EAAE,CAAC;AAE7E,yDAAyD;AACzD,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,IAAI,mBAAmB,CAAC;AAE/C;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,IAAI,8EAA8E,CAAC;AAErH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,4DAA4D,CAAC;AAEpF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAU,EAAE,CAClD,KAAK,GAAG,mBAAmB,GAAG,yBAAyB,GAAG;UAClD,GAAG,kBAAkB,GAAG,8BAA8B,GAAG,mBAAmB,CAAC;AAEvF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;uFACwD,CAAC;AAExF;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,gFAAgF,CAAC;AAE5G;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,WAAW;6CACR,WAAW;8CACV,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAEpE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;QAE3B,WAAW;+CAC4B,WAAW,uBAAuB,CAAC"}
|