things-api 0.19.4 → 0.20.1
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 +1 -1
- package/deputy/prebuilt/Things API Helper.app/Contents/CodeResources +0 -0
- 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/MacOS/things-deputy +0 -0
- package/dist/audit/schema.d.ts +28 -10
- package/dist/audit/schema.js +21 -0
- package/dist/audit/schema.js.map +1 -1
- package/dist/cli/commands/doctor.js +3 -1
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/op-result.js +15 -9
- package/dist/cli/commands/op-result.js.map +1 -1
- package/dist/cli/commands/repeat-flags.d.ts +19 -1
- package/dist/cli/commands/repeat-flags.js +71 -0
- package/dist/cli/commands/repeat-flags.js.map +1 -1
- package/dist/cli/commands/rescue.d.ts +12 -0
- package/dist/cli/commands/rescue.js +83 -0
- package/dist/cli/commands/rescue.js.map +1 -0
- package/dist/cli/commands/writes.js +35 -25
- package/dist/cli/commands/writes.js.map +1 -1
- package/dist/cli/help.js +25 -25
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/main.js +12 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/resolve-invocation.d.ts +9 -1
- package/dist/cli/resolve-invocation.js +71 -0
- package/dist/cli/resolve-invocation.js.map +1 -1
- package/dist/cli/unknown-command.d.ts +26 -0
- package/dist/cli/unknown-command.js +135 -0
- package/dist/cli/unknown-command.js.map +1 -0
- package/dist/contracts.d.ts +4 -3
- package/dist/contracts.js +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +55 -10
- package/dist/mcp/server.js.map +1 -1
- package/dist/model/entities.d.ts +11 -0
- package/dist/model/entities.js.map +1 -1
- package/dist/model/mappers.js +26 -9
- package/dist/model/mappers.js.map +1 -1
- package/dist/model/today-placement.d.ts +65 -0
- package/dist/model/today-placement.js +59 -0
- package/dist/model/today-placement.js.map +1 -0
- package/dist/op-result.d.ts +15 -2
- package/dist/op-result.js +72 -20
- package/dist/op-result.js.map +1 -1
- package/dist/process-instance.d.ts +41 -0
- package/dist/process-instance.js +82 -0
- package/dist/process-instance.js.map +1 -0
- package/dist/rescue.d.ts +247 -0
- package/dist/rescue.js +811 -0
- package/dist/rescue.js.map +1 -0
- package/dist/session-grant.js +4 -15
- package/dist/session-grant.js.map +1 -1
- package/dist/ui-state.d.ts +8 -4
- package/dist/ui-state.js +8 -4
- package/dist/ui-state.js.map +1 -1
- package/dist/write/commands.d.ts +9 -0
- package/dist/write/commands.js +138 -51
- package/dist/write/commands.js.map +1 -1
- package/dist/write/disclosures.d.ts +24 -0
- package/dist/write/disclosures.js +24 -0
- package/dist/write/disclosures.js.map +1 -1
- package/dist/write/experimental.d.ts +16 -0
- package/dist/write/experimental.js +19 -0
- package/dist/write/experimental.js.map +1 -1
- package/dist/write/failure-hints.js +3 -2
- package/dist/write/failure-hints.js.map +1 -1
- package/dist/write/guards.d.ts +1 -1
- package/dist/write/guards.js +130 -8
- package/dist/write/guards.js.map +1 -1
- package/dist/write/lock.d.ts +85 -1
- package/dist/write/lock.js +121 -6
- package/dist/write/lock.js.map +1 -1
- package/dist/write/move.js +33 -6
- package/dist/write/move.js.map +1 -1
- package/dist/write/operations.d.ts +52 -6
- package/dist/write/operations.js +22 -0
- package/dist/write/operations.js.map +1 -1
- package/dist/write/opid.d.ts +69 -8
- package/dist/write/opid.js +111 -17
- package/dist/write/opid.js.map +1 -1
- package/dist/write/param-schema.js +14 -2
- package/dist/write/param-schema.js.map +1 -1
- package/dist/write/pipeline.d.ts +43 -2
- package/dist/write/pipeline.js +206 -43
- package/dist/write/pipeline.js.map +1 -1
- package/dist/write/planner.d.ts +7 -0
- package/dist/write/planner.js +12 -0
- package/dist/write/planner.js.map +1 -1
- package/dist/write/pre-state.d.ts +9 -9
- package/dist/write/pre-state.js +44 -38
- package/dist/write/pre-state.js.map +1 -1
- package/dist/write/preserve-modified.d.ts +17 -8
- package/dist/write/preserve-modified.js.map +1 -1
- package/dist/write/promote-clone.js +60 -17
- package/dist/write/promote-clone.js.map +1 -1
- package/dist/write/reorder.js +28 -7
- package/dist/write/reorder.js.map +1 -1
- package/dist/write/repeat-rule.d.ts +25 -1
- package/dist/write/repeat-rule.js +69 -0
- package/dist/write/repeat-rule.js.map +1 -1
- package/dist/write/resolution-timestamps.js +103 -80
- package/dist/write/resolution-timestamps.js.map +1 -1
- package/dist/write/reversibility.js +2 -2
- package/dist/write/reversibility.js.map +1 -1
- package/dist/write/template-mutation.js +14 -2
- package/dist/write/template-mutation.js.map +1 -1
- package/dist/write/undo.js +45 -5
- package/dist/write/undo.js.map +1 -1
- package/dist/write/vectors/simulator.js +48 -2
- package/dist/write/vectors/simulator.js.map +1 -1
- package/dist/write/vectors/types.d.ts +10 -0
- package/dist/write/vectors/ui-drag.d.ts +102 -0
- package/dist/write/vectors/ui-drag.js +425 -11
- package/dist/write/vectors/ui-drag.js.map +1 -1
- package/dist/write/vectors/ui-state.d.ts +22 -6
- package/dist/write/vectors/ui-state.js +1 -1
- package/dist/write/vectors/ui-state.js.map +1 -1
- package/dist/write/vectors/ui.d.ts +29 -1
- package/dist/write/vectors/ui.js +57 -5
- package/dist/write/vectors/ui.js.map +1 -1
- package/dist/write/vectors/url-scheme.js +26 -0
- package/dist/write/vectors/url-scheme.js.map +1 -1
- package/package.json +1 -1
- package/schema/envelope.schema.json +1 -2
- package/skills/things-cli/SKILL.md +4 -2
- package/skills/things-cli/references/repeating.md +1 -1
- package/dist/cli/commands/ui-state.d.ts +0 -11
- package/dist/cli/commands/ui-state.js +0 -27
- package/dist/cli/commands/ui-state.js.map +0 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE Today / This-Evening placement law — one derivation, every surface.
|
|
3
|
+
*
|
|
4
|
+
* Things stores a Today member's evening flag as a raw `startBucket` byte, and it
|
|
5
|
+
* NEVER cleans that byte when the day it belongs to goes past ([SIT3
|
|
6
|
+
* REMSTALE](../../docs/lab/sit3-arrival-evening-lists.md), oddities §9n). The app
|
|
7
|
+
* instead re-derives placement at RENDER time against the device's current local
|
|
8
|
+
* day, so a `startBucket=1` row whose `startDate` has passed — a STALE evening
|
|
9
|
+
* row — renders in **Today proper**, below the day's daytime rows and ABOVE the
|
|
10
|
+
* "This Evening" section header, exactly like any other arrived member
|
|
11
|
+
* ([STEV1](../../docs/lab/stev1-stale-evening.md) cell 1).
|
|
12
|
+
*
|
|
13
|
+
* Every consumer of the evening flag therefore has to apply the same gate, and
|
|
14
|
+
* they must all apply the SAME one: the read views, the reorder scopes' member
|
|
15
|
+
* census, the bounce's concurrent-edit re-check, and the move planner's axis
|
|
16
|
+
* choice. Four independent spellings is what left a stale evening item refused by
|
|
17
|
+
* BOTH reorder scopes (#657) — `--in today` called it an evening-bucket item and
|
|
18
|
+
* `--in evening` called it stale. This module is the single spelling.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Where a row sits in the Today view: `"today"` (the daytime section),
|
|
22
|
+
* `"evening"` (the This Evening section), or `null` (not a Today member on the
|
|
23
|
+
* scheduled arm at all).
|
|
24
|
+
*/
|
|
25
|
+
export type TodayPlacement = "today" | "evening" | null;
|
|
26
|
+
/** The columns the placement law reads. */
|
|
27
|
+
export interface TodayPlacementRow {
|
|
28
|
+
/** `start`: 0 = inbox, 1 = anytime/active, 2 = someday. */
|
|
29
|
+
start: number;
|
|
30
|
+
/** Packed `startDate`, or null for an undated row. */
|
|
31
|
+
startDate: number | null;
|
|
32
|
+
/** Raw `startBucket`: 0 = Today proper, 1 = This Evening. */
|
|
33
|
+
startBucket: number | null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The Today/Evening placement of a row on the SCHEDULED arm, under `packedToday`
|
|
37
|
+
* (the device-local day, encoded — never a UTC date; see
|
|
38
|
+
* [timezones](../../docs/reference/timezones.md)).
|
|
39
|
+
*
|
|
40
|
+
* - An Inbox row (`start=0`) is never a scheduled Today member.
|
|
41
|
+
* - An undated or strictly-future row is not a member either.
|
|
42
|
+
* - An ARRIVED row (`startDate <= today`, `start` 1 or 2) IS a Today member — an
|
|
43
|
+
* overdue day and an arrived someday-scheduled row included.
|
|
44
|
+
* - It is in **This Evening** only while its evening flag is LIVE: `startBucket=1`
|
|
45
|
+
* with a `startDate` of EXACTLY today. Evening membership expires daily, so a
|
|
46
|
+
* past-dated bucket-1 row is `"today"`.
|
|
47
|
+
*
|
|
48
|
+
* Arrivedness is judged on the DATE alone, never on the start state: an arrived
|
|
49
|
+
* someday-scheduled row (`start=2`, `startDate <= today`) is a Today member and
|
|
50
|
+
* buckets today/evening like any other, matching how `deriveStage` reports it as
|
|
51
|
+
* `anytime` carrying the Today marker (#325).
|
|
52
|
+
*
|
|
53
|
+
* The DEADLINE arm of Today membership (an undated row pulled in by a due or
|
|
54
|
+
* overdue deadline) is not expressible from these three columns and is layered on
|
|
55
|
+
* by the reader (`mappers.todayMarkers`); it is never an evening member.
|
|
56
|
+
*/
|
|
57
|
+
export declare function todayPlacement(row: TodayPlacementRow, packedToday: number): TodayPlacement;
|
|
58
|
+
/**
|
|
59
|
+
* Whether a row's evening flag has gone STALE: the `startBucket=1` byte is still
|
|
60
|
+
* set, but the day it was set for has passed, so the app renders the row in Today
|
|
61
|
+
* proper. The reorder scopes use this to tell a stale movee (accepted by the
|
|
62
|
+
* `today` scope) from a live evening one (refused there, O03), and to point a
|
|
63
|
+
* stale movee's `evening`-scope refusal at the scope that does take it.
|
|
64
|
+
*/
|
|
65
|
+
export declare function isStaleEvening(row: TodayPlacementRow, packedToday: number): boolean;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE Today / This-Evening placement law — one derivation, every surface.
|
|
3
|
+
*
|
|
4
|
+
* Things stores a Today member's evening flag as a raw `startBucket` byte, and it
|
|
5
|
+
* NEVER cleans that byte when the day it belongs to goes past ([SIT3
|
|
6
|
+
* REMSTALE](../../docs/lab/sit3-arrival-evening-lists.md), oddities §9n). The app
|
|
7
|
+
* instead re-derives placement at RENDER time against the device's current local
|
|
8
|
+
* day, so a `startBucket=1` row whose `startDate` has passed — a STALE evening
|
|
9
|
+
* row — renders in **Today proper**, below the day's daytime rows and ABOVE the
|
|
10
|
+
* "This Evening" section header, exactly like any other arrived member
|
|
11
|
+
* ([STEV1](../../docs/lab/stev1-stale-evening.md) cell 1).
|
|
12
|
+
*
|
|
13
|
+
* Every consumer of the evening flag therefore has to apply the same gate, and
|
|
14
|
+
* they must all apply the SAME one: the read views, the reorder scopes' member
|
|
15
|
+
* census, the bounce's concurrent-edit re-check, and the move planner's axis
|
|
16
|
+
* choice. Four independent spellings is what left a stale evening item refused by
|
|
17
|
+
* BOTH reorder scopes (#657) — `--in today` called it an evening-bucket item and
|
|
18
|
+
* `--in evening` called it stale. This module is the single spelling.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* The Today/Evening placement of a row on the SCHEDULED arm, under `packedToday`
|
|
22
|
+
* (the device-local day, encoded — never a UTC date; see
|
|
23
|
+
* [timezones](../../docs/reference/timezones.md)).
|
|
24
|
+
*
|
|
25
|
+
* - An Inbox row (`start=0`) is never a scheduled Today member.
|
|
26
|
+
* - An undated or strictly-future row is not a member either.
|
|
27
|
+
* - An ARRIVED row (`startDate <= today`, `start` 1 or 2) IS a Today member — an
|
|
28
|
+
* overdue day and an arrived someday-scheduled row included.
|
|
29
|
+
* - It is in **This Evening** only while its evening flag is LIVE: `startBucket=1`
|
|
30
|
+
* with a `startDate` of EXACTLY today. Evening membership expires daily, so a
|
|
31
|
+
* past-dated bucket-1 row is `"today"`.
|
|
32
|
+
*
|
|
33
|
+
* Arrivedness is judged on the DATE alone, never on the start state: an arrived
|
|
34
|
+
* someday-scheduled row (`start=2`, `startDate <= today`) is a Today member and
|
|
35
|
+
* buckets today/evening like any other, matching how `deriveStage` reports it as
|
|
36
|
+
* `anytime` carrying the Today marker (#325).
|
|
37
|
+
*
|
|
38
|
+
* The DEADLINE arm of Today membership (an undated row pulled in by a due or
|
|
39
|
+
* overdue deadline) is not expressible from these three columns and is layered on
|
|
40
|
+
* by the reader (`mappers.todayMarkers`); it is never an evening member.
|
|
41
|
+
*/
|
|
42
|
+
export function todayPlacement(row, packedToday) {
|
|
43
|
+
if (row.start !== 1 && row.start !== 2)
|
|
44
|
+
return null;
|
|
45
|
+
if (row.startDate === null || row.startDate > packedToday)
|
|
46
|
+
return null;
|
|
47
|
+
return row.startBucket === 1 && row.startDate === packedToday ? "evening" : "today";
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Whether a row's evening flag has gone STALE: the `startBucket=1` byte is still
|
|
51
|
+
* set, but the day it was set for has passed, so the app renders the row in Today
|
|
52
|
+
* proper. The reorder scopes use this to tell a stale movee (accepted by the
|
|
53
|
+
* `today` scope) from a live evening one (refused there, O03), and to point a
|
|
54
|
+
* stale movee's `evening`-scope refusal at the scope that does take it.
|
|
55
|
+
*/
|
|
56
|
+
export function isStaleEvening(row, packedToday) {
|
|
57
|
+
return row.startBucket === 1 && todayPlacement(row, packedToday) === "today";
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=today-placement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"today-placement.js","sourceRoot":"","sources":["../../src/model/today-placement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAmBH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,cAAc,CAAC,GAAsB,EAAE,WAAmB;IACxE,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,CAAC,SAAS,GAAG,WAAW;QAAE,OAAO,IAAI,CAAC;IACvE,OAAO,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,GAAG,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;AACtF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,GAAsB,EAAE,WAAmB;IACxE,OAAO,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,cAAc,CAAC,GAAG,EAAE,WAAW,CAAC,KAAK,OAAO,CAAC;AAC/E,CAAC"}
|
package/dist/op-result.d.ts
CHANGED
|
@@ -10,7 +10,14 @@ export interface OpResultOptions {
|
|
|
10
10
|
*/
|
|
11
11
|
traceDir?: string;
|
|
12
12
|
}
|
|
13
|
-
export type OpResultStatus = "found" | "intent-only" | "unknown";
|
|
13
|
+
export type OpResultStatus = "found" | "in-flight" | "orphaned" | "intent-only" | "unknown";
|
|
14
|
+
/** The writing process behind an unsuperseded intent, and whether it still exists. */
|
|
15
|
+
export interface OpResultHolder {
|
|
16
|
+
pid: number;
|
|
17
|
+
/** The pid's recorded start time, which is what makes pid reuse detectable. */
|
|
18
|
+
start: string | null;
|
|
19
|
+
alive: boolean;
|
|
20
|
+
}
|
|
14
21
|
export interface OpResultData {
|
|
15
22
|
opId: string;
|
|
16
23
|
status: OpResultStatus;
|
|
@@ -51,8 +58,14 @@ export interface OpResultData {
|
|
|
51
58
|
ts: string | null;
|
|
52
59
|
/** The final record's wall-clock duration in ms; null when INTENT-ONLY / UNKNOWN. */
|
|
53
60
|
durationMs: number | null;
|
|
54
|
-
/** The newest correlated trace file path (
|
|
61
|
+
/** The newest correlated trace file path (unsuperseded intent, best-effort); null otherwise. */
|
|
55
62
|
tracePath: string | null;
|
|
63
|
+
/**
|
|
64
|
+
* The process behind an unsuperseded intent — the identity that decides
|
|
65
|
+
* IN-FLIGHT from ORPHANED (#639). Null on every settled status, and on the
|
|
66
|
+
* legacy intent that recorded no holder.
|
|
67
|
+
*/
|
|
68
|
+
holder: OpResultHolder | null;
|
|
56
69
|
/** A one-line behavioral explanation of the outcome for a human/agent caller. */
|
|
57
70
|
note: string;
|
|
58
71
|
}
|
package/dist/op-result.js
CHANGED
|
@@ -14,17 +14,26 @@
|
|
|
14
14
|
* caller runs `things op-result <op-id>` in a FRESH short-lived process and reads
|
|
15
15
|
* the final outcome the killed process already durably wrote (fsync per record).
|
|
16
16
|
*
|
|
17
|
-
*
|
|
17
|
+
* Four outcomes:
|
|
18
18
|
* - FOUND — a final (non-intent) record carries the id: report its result code,
|
|
19
19
|
* target uuid, and post-verify observation (the standard fields the killed
|
|
20
20
|
* process would have printed).
|
|
21
|
-
* -
|
|
22
|
-
*
|
|
23
|
-
*
|
|
21
|
+
* - IN-FLIGHT — an unsuperseded `intent` marker whose HOLDER IS ALIVE: the op is
|
|
22
|
+
* still running right now. The caller's move is to poll again, not to retry.
|
|
23
|
+
* - ORPHANED — an unsuperseded `intent` marker whose holder is GONE: the process
|
|
24
|
+
* died between touching the app and writing its final record, so the outcome is
|
|
25
|
+
* genuinely UNCERTAIN (the app-side change may have landed). The newest
|
|
24
26
|
* correlated trace file is surfaced when determinable.
|
|
25
27
|
* - UNKNOWN — no record carries the id: it never ran, the id is mistyped, or the
|
|
26
28
|
* record has aged out of the local history.
|
|
27
29
|
*
|
|
30
|
+
* Splitting the last two used to be impossible: an intent recorded no holder, so
|
|
31
|
+
* this could only hedge ("still running, OR died mid-flight") and the caller had
|
|
32
|
+
* to guess which. A keyed intent now carries the writing process's instance
|
|
33
|
+
* identity (#639), which makes it a question with an answer. The rare third
|
|
34
|
+
* shape — an intent with no holder recorded — keeps the old hedged status,
|
|
35
|
+
* because for that record the honest answer really is "cannot tell".
|
|
36
|
+
*
|
|
28
37
|
* This is a pure history read — it opens no database and drives nothing. Reused by
|
|
29
38
|
* the CLI subcommand and (read-only) the MCP surface through the single library
|
|
30
39
|
* entry point (src/index.ts), like {@link diagnose}.
|
|
@@ -32,6 +41,7 @@
|
|
|
32
41
|
import { readdirSync, statSync } from "node:fs";
|
|
33
42
|
import { join } from "node:path";
|
|
34
43
|
import { auditDir as defaultAuditDir, traceDir as defaultTraceDir } from "./paths.js";
|
|
44
|
+
import { instanceAlive } from "./process-instance.js";
|
|
35
45
|
import { readAuditRecords } from "./write/undo.js";
|
|
36
46
|
/** The trace file whose mtime is closest to `targetTs` (within a window), else null. */
|
|
37
47
|
function correlatedTrace(traceDir, targetTs) {
|
|
@@ -120,15 +130,22 @@ export function opResult(opId, options = {}) {
|
|
|
120
130
|
ts: null,
|
|
121
131
|
durationMs: null,
|
|
122
132
|
tracePath: null,
|
|
133
|
+
holder: null,
|
|
123
134
|
note: `no change-history record carries op-id "${opId}" — it never ran, the id is mistyped, or ` +
|
|
124
135
|
"the record has aged out of the local history (`things doctor` shows the history health)",
|
|
125
136
|
};
|
|
126
137
|
}
|
|
127
|
-
//
|
|
128
|
-
//
|
|
129
|
-
//
|
|
130
|
-
|
|
131
|
-
|
|
138
|
+
// An intent is superseded by the final of its OWN attempt, paired by `ts` —
|
|
139
|
+
// both records of one attempt derive from the same `startedAt`, which is the
|
|
140
|
+
// schema's documented sibling invariant. Deliberately NOT "the last record
|
|
141
|
+
// wins": `readAuditRecords` RE-SORTS the trail by `ts`, so file order does not
|
|
142
|
+
// survive the read. `findPendingIntent` (write/opid.ts) applies the identical
|
|
143
|
+
// rule, so the reporting surface and the dispatch gate can never disagree
|
|
144
|
+
// about whether a key is in flight.
|
|
145
|
+
const settled = new Set(matched.filter((r) => r.result !== "intent").map((r) => r.ts));
|
|
146
|
+
const pending = matched.findLast((r) => r.result === "intent" && !settled.has(r.ts));
|
|
147
|
+
if (pending === undefined) {
|
|
148
|
+
const finals = matched.filter((r) => r.result !== "intent");
|
|
132
149
|
const rec = finals[finals.length - 1];
|
|
133
150
|
return {
|
|
134
151
|
opId,
|
|
@@ -143,29 +160,64 @@ export function opResult(opId, options = {}) {
|
|
|
143
160
|
ts: rec.ts,
|
|
144
161
|
durationMs: rec.durationMs,
|
|
145
162
|
tracePath: null,
|
|
163
|
+
holder: null,
|
|
146
164
|
note: foundNote(rec.result, rec.uuid),
|
|
147
165
|
};
|
|
148
166
|
}
|
|
149
|
-
//
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
167
|
+
// An unsuperseded intent. Its holder decides which of the two very different
|
|
168
|
+
// situations this is — and the caller's next move differs completely between
|
|
169
|
+
// them, which is why the old single hedged answer was worth splitting.
|
|
170
|
+
const last = pending;
|
|
171
|
+
const tracePath = correlatedTrace(traceDir, last.ts);
|
|
172
|
+
const recorded = last.holder;
|
|
173
|
+
const holder = recorded === undefined ? null : { ...recorded, alive: instanceAlive(recorded) };
|
|
174
|
+
const target = last.uuid ?? "<uuid>";
|
|
175
|
+
const base = {
|
|
153
176
|
opId,
|
|
154
|
-
|
|
155
|
-
op: rec.op,
|
|
177
|
+
op: last.op,
|
|
156
178
|
result: null,
|
|
157
|
-
uuid:
|
|
179
|
+
uuid: last.uuid,
|
|
158
180
|
observed: null,
|
|
159
181
|
verify: null,
|
|
160
182
|
// An intent marker is written BEFORE the app is touched, so it never carries
|
|
161
183
|
// steps — the drive had not run yet. The trace file is the recovery here.
|
|
162
184
|
steps: null,
|
|
163
|
-
ts:
|
|
185
|
+
ts: last.ts,
|
|
164
186
|
durationMs: null,
|
|
165
187
|
tracePath,
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
188
|
+
holder,
|
|
189
|
+
};
|
|
190
|
+
if (holder !== null && holder.alive) {
|
|
191
|
+
return {
|
|
192
|
+
...base,
|
|
193
|
+
status: "in-flight",
|
|
194
|
+
note: `the operation is STILL RUNNING — it started ${last.ts} and the process that owns it ` +
|
|
195
|
+
`(pid ${holder.pid}) is alive. Nothing to recover yet: run this command again in a few ` +
|
|
196
|
+
"seconds until it reports a final outcome. Do NOT resubmit the write — a GUI-driven " +
|
|
197
|
+
"change takes seconds, and longer on a large or syncing database. (Resubmitting the same " +
|
|
198
|
+
"op-id while it runs is refused rather than executed, so a retry costs you the wait " +
|
|
199
|
+
"either way.)",
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
if (holder !== null) {
|
|
203
|
+
return {
|
|
204
|
+
...base,
|
|
205
|
+
status: "orphaned",
|
|
206
|
+
note: `the operation started ${last.ts} and the process that owned it (pid ${holder.pid}) is ` +
|
|
207
|
+
"GONE without recording an outcome — its app-side change may or may not have landed. " +
|
|
208
|
+
`Re-read the target (\`things show ${target}\`) and inspect the trace` +
|
|
209
|
+
(tracePath !== null ? ` (${tracePath})` : "") +
|
|
210
|
+
" rather than blind-retrying. Resubmitting the SAME command with the SAME op-id is safe: " +
|
|
211
|
+
"it re-reads state to decide whether that change is there, replaying it rather than " +
|
|
212
|
+
"repeating it (and refusing outright when the record cannot settle the question)",
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
...base,
|
|
217
|
+
status: "intent-only",
|
|
218
|
+
note: "the operation was recorded as STARTED but no final outcome was written, and the record " +
|
|
219
|
+
"names no process, so whether it is still running cannot be determined from here. The " +
|
|
220
|
+
`outcome is UNCERTAIN: re-read the target (\`things show ${target}\`) and inspect the trace` +
|
|
169
221
|
(tracePath !== null ? ` (${tracePath})` : "") +
|
|
170
222
|
" rather than blind-retrying",
|
|
171
223
|
};
|
package/dist/op-result.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"op-result.js","sourceRoot":"","sources":["../src/op-result.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"op-result.js","sourceRoot":"","sources":["../src/op-result.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** The process that owns an in-flight piece of work, as an identity (not just a pid). */
|
|
2
|
+
export interface ProcessInstance {
|
|
3
|
+
pid: number;
|
|
4
|
+
/**
|
|
5
|
+
* The pid's start time (`ps -o lstart=`), stable for that process's whole
|
|
6
|
+
* life. Null when it could not be read — the pid alone then carries the
|
|
7
|
+
* answer, which is weaker but never fabricated.
|
|
8
|
+
*/
|
|
9
|
+
start: string | null;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Does a process with this pid exist right now? (Signal 0 tests existence only.)
|
|
13
|
+
*
|
|
14
|
+
* Non-positive pids are rejected BEFORE the syscall, and that guard is
|
|
15
|
+
* load-bearing rather than defensive tidiness: in `kill(2)`, pid 0 means "every
|
|
16
|
+
* process in the caller's group" and a negative pid means "the group" — both
|
|
17
|
+
* succeed, so a zero or negative holder would report itself alive forever and
|
|
18
|
+
* wedge its idempotency key. A holder is always a real process or it is nothing.
|
|
19
|
+
*/
|
|
20
|
+
export declare function pidAlive(pid: number): boolean;
|
|
21
|
+
/** A pid's start time, or null when the pid is gone / `ps` could not answer. */
|
|
22
|
+
export declare function processStart(pid: number): string | null;
|
|
23
|
+
/** This process, as the identity to record on a piece of work it is starting. */
|
|
24
|
+
export declare function currentInstance(): ProcessInstance;
|
|
25
|
+
/** Seams so tests never shell out. */
|
|
26
|
+
export interface InstanceLivenessDeps {
|
|
27
|
+
pidAlive?: (pid: number) => boolean;
|
|
28
|
+
processStart?: (pid: number) => string | null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Is the RECORDED instance still running?
|
|
32
|
+
*
|
|
33
|
+
* Deliberately CONSERVATIVE: this answers a question whose wrong answer is
|
|
34
|
+
* expensive in one direction only. Reporting a dead writer as alive costs a
|
|
35
|
+
* caller one more poll; reporting a LIVE writer as dead invites a second
|
|
36
|
+
* execution of a mutation that is still in flight. So every ambiguity — a start
|
|
37
|
+
* time that was never recorded, a `ps` that would not answer now — resolves to
|
|
38
|
+
* "alive". Only a pid that is gone, or one whose start time PROVES it is a
|
|
39
|
+
* different process wearing the same number, is reported dead.
|
|
40
|
+
*/
|
|
41
|
+
export declare function instanceAlive(instance: ProcessInstance, deps?: InstanceLivenessDeps): boolean;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PROCESS INSTANCE IDENTITY — a pid paired with its start time, which is what
|
|
3
|
+
* makes "is that process still alive?" answerable across a pid reuse.
|
|
4
|
+
*
|
|
5
|
+
* A bare pid is not an identity: the kernel recycles pids, so a dead writer's
|
|
6
|
+
* number can belong to an unrelated process minutes later and `kill(pid, 0)`
|
|
7
|
+
* would report the writer as alive. Pairing the pid with `ps -o lstart=` — a
|
|
8
|
+
* value the reusing process cannot reproduce, because it is the moment the
|
|
9
|
+
* kernel started IT — turns the pair into an identity that only the original
|
|
10
|
+
* process satisfies.
|
|
11
|
+
*
|
|
12
|
+
* This is the same instance-key shape `session-grant.ts` uses to decide whether
|
|
13
|
+
* the app instance a grant was minted for is still the one running; both callers
|
|
14
|
+
* share this module so the liveness rule is stated once.
|
|
15
|
+
*/
|
|
16
|
+
import { execFileSync } from "node:child_process";
|
|
17
|
+
/**
|
|
18
|
+
* Does a process with this pid exist right now? (Signal 0 tests existence only.)
|
|
19
|
+
*
|
|
20
|
+
* Non-positive pids are rejected BEFORE the syscall, and that guard is
|
|
21
|
+
* load-bearing rather than defensive tidiness: in `kill(2)`, pid 0 means "every
|
|
22
|
+
* process in the caller's group" and a negative pid means "the group" — both
|
|
23
|
+
* succeed, so a zero or negative holder would report itself alive forever and
|
|
24
|
+
* wedge its idempotency key. A holder is always a real process or it is nothing.
|
|
25
|
+
*/
|
|
26
|
+
export function pidAlive(pid) {
|
|
27
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
28
|
+
return false;
|
|
29
|
+
try {
|
|
30
|
+
process.kill(pid, 0);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** A pid's start time, or null when the pid is gone / `ps` could not answer. */
|
|
38
|
+
export function processStart(pid) {
|
|
39
|
+
try {
|
|
40
|
+
const out = execFileSync("ps", ["-p", String(pid), "-o", "lstart="], {
|
|
41
|
+
encoding: "utf8",
|
|
42
|
+
timeout: 3000,
|
|
43
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
44
|
+
});
|
|
45
|
+
const trimmed = out.trim();
|
|
46
|
+
return trimmed === "" ? null : trimmed;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// A dead pid exits nonzero — the instance is gone, which is an answer.
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** This process, as the identity to record on a piece of work it is starting. */
|
|
54
|
+
export function currentInstance() {
|
|
55
|
+
return { pid: process.pid, start: processStart(process.pid) };
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Is the RECORDED instance still running?
|
|
59
|
+
*
|
|
60
|
+
* Deliberately CONSERVATIVE: this answers a question whose wrong answer is
|
|
61
|
+
* expensive in one direction only. Reporting a dead writer as alive costs a
|
|
62
|
+
* caller one more poll; reporting a LIVE writer as dead invites a second
|
|
63
|
+
* execution of a mutation that is still in flight. So every ambiguity — a start
|
|
64
|
+
* time that was never recorded, a `ps` that would not answer now — resolves to
|
|
65
|
+
* "alive". Only a pid that is gone, or one whose start time PROVES it is a
|
|
66
|
+
* different process wearing the same number, is reported dead.
|
|
67
|
+
*/
|
|
68
|
+
export function instanceAlive(instance, deps = {}) {
|
|
69
|
+
const alive = deps.pidAlive ?? pidAlive;
|
|
70
|
+
const start = deps.processStart ?? processStart;
|
|
71
|
+
if (!alive(instance.pid))
|
|
72
|
+
return false;
|
|
73
|
+
// The pid exists. Without both start times we cannot rule out reuse, so we
|
|
74
|
+
// do not: the conservative answer is that this is still our process.
|
|
75
|
+
if (instance.start === null)
|
|
76
|
+
return true;
|
|
77
|
+
const current = start(instance.pid);
|
|
78
|
+
if (current === null)
|
|
79
|
+
return true;
|
|
80
|
+
return current === instance.start;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=process-instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-instance.js","sourceRoot":"","sources":["../src/process-instance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAalD;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE;YACnE,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,eAAe;IAC7B,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AAChE,CAAC;AAQD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,QAAyB,EAAE,OAA6B,EAAE;IACtF,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,2EAA2E;IAC3E,qEAAqE;IACrE,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,OAAO,KAAK,QAAQ,CAAC,KAAK,CAAC;AACpC,CAAC"}
|