botmux 3.12.1 → 3.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/dist/.runtime-build-id +1 -1
- package/dist/bot-registry.d.ts +7 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +46 -13
- package/dist/bot-registry.js.map +1 -1
- package/dist/core/config-dir.d.ts +167 -0
- package/dist/core/config-dir.d.ts.map +1 -0
- package/dist/core/config-dir.js +152 -0
- package/dist/core/config-dir.js.map +1 -0
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +48 -0
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/per-bot-env.d.ts.map +1 -1
- package/dist/core/per-bot-env.js +9 -0
- package/dist/core/per-bot-env.js.map +1 -1
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +19 -2
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +44 -3
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +499 -63
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/types.d.ts +26 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +64 -0
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +301 -10
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +13 -6
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/auth.d.ts +8 -0
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +16 -11
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/web/bot-multi-select.d.ts +33 -0
- package/dist/dashboard/web/bot-multi-select.d.ts.map +1 -0
- package/dist/dashboard/web/bot-multi-select.js +34 -0
- package/dist/dashboard/web/bot-multi-select.js.map +1 -0
- package/dist/dashboard/web/groups-page.d.ts +13 -0
- package/dist/dashboard/web/groups-page.d.ts.map +1 -1
- package/dist/dashboard/web/groups-page.js +25 -7
- package/dist/dashboard/web/groups-page.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +8 -4
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-page.js +15 -23
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts +13 -0
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +25 -0
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/{bot-defaults-page-HL655CNR.js → bot-defaults-page-NQJFJ45Z.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-BFUTTYVK.js → chunk-5QJB24I2.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-ELL53D62.js → chunk-6JTZJRQJ.js} +2 -2
- package/dist/dashboard-web/chunks/{chunk-5ZL7NLR5.js → chunk-CU4SUKK3.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-5PAYQ3KT.js → chunk-KEEYQ3WF.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-WLIVBPJC.js +1 -0
- package/dist/dashboard-web/chunks/{connectors-page-3QQACF23.js → connectors-page-HADHZXXZ.js} +1 -1
- package/dist/dashboard-web/chunks/groups-page-5TYF46RS.js +8 -0
- package/dist/dashboard-web/chunks/{insights-page-ZZ3JEJ6L.js → insights-page-EVGGJI5L.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-ROJ5GZ4N.js → monitor-room-HRGR2ENP.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-IATV7KJF.js → monitoring-page-LBU7TTTW.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-TYO5OIIT.js → office-page-DF6RRBMN.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-VJUULZF2.js → overview-page-ZB6QH2EX.js} +1 -1
- package/dist/dashboard-web/chunks/{roles-page-7RJJKZGK.js → roles-page-ZBZGHIIF.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-JTEJ5IXW.js → schedules-page-NQVQC3QY.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-DXBCDWCS.js +8 -0
- package/dist/dashboard-web/chunks/{settings-page-7CTTFBRS.js → settings-page-E7NN4NVQ.js} +1 -1
- package/dist/dashboard-web/chunks/{skills-page-57NZECJ3.js → skills-page-2QAVB2SA.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-6YYIMJG3.js → team-federation-page-VGWL53AE.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-ZGKBSBK3.js → v3-page-AY35LKCX.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-AACJF6DB.js → whiteboards-page-BNWUU4KG.js} +1 -1
- package/dist/dashboard-web/style.css +61 -53
- package/dist/features/codex-notifier/internal-turn.d.ts +1 -2
- package/dist/features/codex-notifier/internal-turn.d.ts.map +1 -1
- package/dist/features/codex-notifier/internal-turn.js +1 -13
- package/dist/features/codex-notifier/internal-turn.js.map +1 -1
- package/dist/i18n/en.js +2 -2
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.js +2 -2
- package/dist/i18n/zh.js.map +1 -1
- package/dist/platform/secure-host-file.d.ts +63 -0
- package/dist/platform/secure-host-file.d.ts.map +1 -1
- package/dist/platform/secure-host-file.js +90 -25
- package/dist/platform/secure-host-file.js.map +1 -1
- package/dist/services/async-trigger-store.d.ts +24 -4
- package/dist/services/async-trigger-store.d.ts.map +1 -1
- package/dist/services/async-trigger-store.js +81 -19
- package/dist/services/async-trigger-store.js.map +1 -1
- package/dist/services/codex-session-meta.d.ts +4 -0
- package/dist/services/codex-session-meta.d.ts.map +1 -0
- package/dist/services/codex-session-meta.js +15 -0
- package/dist/services/codex-session-meta.js.map +1 -0
- package/dist/services/idempotency-store.d.ts +18 -3
- package/dist/services/idempotency-store.d.ts.map +1 -1
- package/dist/services/idempotency-store.js +30 -12
- package/dist/services/idempotency-store.js.map +1 -1
- package/dist/services/traex-transcript.d.ts +7 -5
- package/dist/services/traex-transcript.d.ts.map +1 -1
- package/dist/services/traex-transcript.js +139 -33
- package/dist/services/traex-transcript.js.map +1 -1
- package/dist/services/trigger-types.d.ts +14 -1
- package/dist/services/trigger-types.d.ts.map +1 -1
- package/dist/services/trigger-types.js +35 -0
- package/dist/services/trigger-types.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/child-env.d.ts +1 -1
- package/dist/utils/child-env.d.ts.map +1 -1
- package/dist/utils/child-env.js +18 -0
- package/dist/utils/child-env.js.map +1 -1
- package/dist/worker.js +35 -2
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/chunk-6ALR252E.js +0 -1
- package/dist/dashboard-web/chunks/groups-page-SDZMJ7UV.js +0 -8
- package/dist/dashboard-web/chunks/sessions-page-KD7HDT3U.js +0 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async-trigger-store.js","sourceRoot":"","sources":["../../src/services/async-trigger-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAiC/D,SAAS,MAAM;IACb,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,WAAW,CAAC,SAAiB;IACpC,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,IAAI,CAAC,SAAiB;IAC7B,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,CAAqB,CAAC;QACvE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAClG,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;IACrH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,4CAA4C,SAAS,KAAK,GAAG,EAAE,CAAC,CAAC;QAC9E,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"async-trigger-store.js","sourceRoot":"","sources":["../../src/services/async-trigger-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** `session_meta.source` is the protocol-level origin. Internal/subagent
|
|
2
|
+
* sessions are runtime helpers rather than the user's visible top-level task. */
|
|
3
|
+
export declare function isInternalCodexSessionMeta(meta: unknown): boolean;
|
|
4
|
+
//# sourceMappingURL=codex-session-meta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-session-meta.d.ts","sourceRoot":"","sources":["../../src/services/codex-session-meta.ts"],"names":[],"mappings":"AAAA;iFACiF;AACjF,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAQjE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** `session_meta.source` is the protocol-level origin. Internal/subagent
|
|
2
|
+
* sessions are runtime helpers rather than the user's visible top-level task. */
|
|
3
|
+
export function isInternalCodexSessionMeta(meta) {
|
|
4
|
+
if (!meta || typeof meta !== 'object' || Array.isArray(meta))
|
|
5
|
+
return false;
|
|
6
|
+
const payload = meta;
|
|
7
|
+
if (typeof payload.thread_source === 'string' && payload.thread_source !== 'user')
|
|
8
|
+
return true;
|
|
9
|
+
const source = payload.source;
|
|
10
|
+
if (!source || typeof source !== 'object' || Array.isArray(source))
|
|
11
|
+
return false;
|
|
12
|
+
const sourceRecord = source;
|
|
13
|
+
return sourceRecord.internal !== undefined || sourceRecord.subagent !== undefined;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=codex-session-meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-session-meta.js","sourceRoot":"","sources":["../../src/services/codex-session-meta.ts"],"names":[],"mappings":"AAAA;iFACiF;AACjF,MAAM,UAAU,0BAA0B,CAAC,IAAa;IACtD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3E,MAAM,OAAO,GAAG,IAA+B,CAAC;IAChD,IAAI,OAAO,OAAO,CAAC,aAAa,KAAK,QAAQ,IAAI,OAAO,CAAC,aAAa,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAC/F,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACjF,MAAM,YAAY,GAAG,MAAiC,CAAC;IACvD,OAAO,YAAY,CAAC,QAAQ,KAAK,SAAS,IAAI,YAAY,CAAC,QAAQ,KAAK,SAAS,CAAC;AACpF,CAAC"}
|
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
export type IdempotencyState = 'reserved' | 'attempting';
|
|
2
|
+
/** Which dispatch seam a lease governs. `fresh` = a fresh async-virtual session
|
|
3
|
+
* (one lease → one throwaway session, #776). `turn` = a follow-up turn on an
|
|
4
|
+
* EXISTING, potentially long-lived SHARED session (#71). The kind is an
|
|
5
|
+
* UNFORGEABLE domain separator baked into the on-disk key derivation, NOT a
|
|
6
|
+
* user-supplied string: a caller cannot craft a `fresh` key that collides with
|
|
7
|
+
* a `turn` lease (or vice-versa) because the kind participates in the file hash.
|
|
8
|
+
* Reconcile also reads it to avoid fresh-only teardown (closeSession) on a turn
|
|
9
|
+
* lease whose session is shared and must survive. Absent on disk = legacy
|
|
10
|
+
* pre-#71 record → treated as `fresh` (the only kind that existed then). */
|
|
11
|
+
export type IdempotencyKind = 'fresh' | 'turn';
|
|
2
12
|
export interface IdempotencyRecord {
|
|
3
13
|
ownerLarkAppId: string;
|
|
4
14
|
sessionId: string;
|
|
@@ -9,6 +19,9 @@ export interface IdempotencyRecord {
|
|
|
9
19
|
state: IdempotencyState;
|
|
10
20
|
createdAt: number;
|
|
11
21
|
updatedAt: number;
|
|
22
|
+
/** Dispatch seam this lease governs (see IdempotencyKind). Omitted on legacy
|
|
23
|
+
* pre-#71 records → read as 'fresh'. */
|
|
24
|
+
kind?: IdempotencyKind;
|
|
12
25
|
}
|
|
13
26
|
export type ClaimResult = {
|
|
14
27
|
kind: 'won';
|
|
@@ -24,7 +37,7 @@ export declare class IdempotencyConflictError extends Error {
|
|
|
24
37
|
/** Non-locking read for the pre-check in trigger-session (a fast reject before
|
|
25
38
|
* creating a session). Owner mismatch → undefined. Corrupt → THROWS. The
|
|
26
39
|
* authoritative decision is always re-taken under the lock in claim/takeover. */
|
|
27
|
-
export declare function lookup(ownerLarkAppId: string, key: string): IdempotencyRecord | undefined;
|
|
40
|
+
export declare function lookup(ownerLarkAppId: string, key: string, kind?: IdempotencyKind): IdempotencyRecord | undefined;
|
|
28
41
|
/**
|
|
29
42
|
* Claim (owner, key) for a fresh `reserved` lease, or return the existing one —
|
|
30
43
|
* all inside the per-key lock (read → decide → durable write is atomic wrt other
|
|
@@ -38,6 +51,7 @@ export declare function claim(input: {
|
|
|
38
51
|
ownerBootId: string;
|
|
39
52
|
key: string;
|
|
40
53
|
now: number;
|
|
54
|
+
kind?: IdempotencyKind;
|
|
41
55
|
}): ClaimResult;
|
|
42
56
|
/**
|
|
43
57
|
* Take over an OLDER-boot `reserved` lease with a fresh reserved lease (new
|
|
@@ -61,13 +75,14 @@ export declare function takeover(input: {
|
|
|
61
75
|
requestHash: string;
|
|
62
76
|
ownerBootId: string;
|
|
63
77
|
now: number;
|
|
78
|
+
kind?: IdempotencyKind;
|
|
64
79
|
}): ClaimResult;
|
|
65
80
|
/** CAS a record to a new state under the lock. Verifies full identity + revision
|
|
66
81
|
* before writing (rejects a stale/foreign writer). Returns the written record. */
|
|
67
82
|
export declare function transition(ownerLarkAppId: string, key: string, from: IdempotencyRecord, patch: {
|
|
68
83
|
state: IdempotencyState;
|
|
69
84
|
now: number;
|
|
70
|
-
}): IdempotencyRecord;
|
|
85
|
+
}, kind?: IdempotencyKind): IdempotencyRecord;
|
|
71
86
|
/** Compare-and-remove: delete the lease ONLY if it still matches `expect`
|
|
72
87
|
* (identity + revision + state) under the lock. Used to release a `reserved`
|
|
73
88
|
* lease we created but abandoned before dispatch. Returns a discriminated
|
|
@@ -77,7 +92,7 @@ export declare function transition(ownerLarkAppId: string, key: string, from: Id
|
|
|
77
92
|
* delete) instead of swallowing both (finding #1). A lock-internal re-read
|
|
78
93
|
* corruption or an ambiguous unlink error (EIO/EROFS/…) THROWS — the caller
|
|
79
94
|
* must be able to trust that `removed` means the lease is truly released. */
|
|
80
|
-
export declare function compareAndRemove(ownerLarkAppId: string, key: string, expect: IdempotencyRecord): RemoveByPathResult;
|
|
95
|
+
export declare function compareAndRemove(ownerLarkAppId: string, key: string, expect: IdempotencyRecord, kind?: IdempotencyKind): RemoveByPathResult;
|
|
81
96
|
/** Enumerate the leases owned by a SINGLE bot (boot reconcile is owner-scoped).
|
|
82
97
|
* Reads only `idempotency/<sha256(owner)>/` — a foreign bot's corrupt lease
|
|
83
98
|
* lives under a different subdir and is never even opened here, so it can't
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idempotency-store.d.ts","sourceRoot":"","sources":["../../src/services/idempotency-store.ts"],"names":[],"mappings":"AAsCA,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,YAAY,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,gBAAgB,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"idempotency-store.d.ts","sourceRoot":"","sources":["../../src/services/idempotency-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -56,10 +56,23 @@ function ownerDir(ownerLarkAppId) {
|
|
|
56
56
|
const ownerHash = createHash('sha256').update(ownerLarkAppId).digest('hex');
|
|
57
57
|
return join(baseDir(), ownerHash);
|
|
58
58
|
}
|
|
59
|
-
/** Filename = <ownerDir>/sha256(owner \0 key).json. The
|
|
60
|
-
*
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
/** Filename = <ownerDir>/sha256(owner \0 [kind \0] key).json. The kind participates
|
|
60
|
+
* in the digest as an UNFORGEABLE domain separator: a `fresh` key and a `turn`
|
|
61
|
+
* key with the same string land on DIFFERENT files, so a caller cannot forge a
|
|
62
|
+
* fresh `idempotencyKey` that collides with a `turn:` lease (codex #818 P1). The
|
|
63
|
+
* NUL separators keep the digest collision-free.
|
|
64
|
+
*
|
|
65
|
+
* BACKWARD COMPAT: `fresh` reproduces the EXACT pre-#71 digest `sha256(owner \0
|
|
66
|
+
* key)` (no kind segment at all), so leases written by older builds keep their
|
|
67
|
+
* path across upgrade. Only the new `turn` kind inserts a `kind \0` segment. A
|
|
68
|
+
* user-supplied fresh key can't reach the turn keyspace because it never gets
|
|
69
|
+
* the `turn\0` prefix injected here — the kind is a trusted call-site argument,
|
|
70
|
+
* not derived from the key string. */
|
|
71
|
+
function fileFor(ownerLarkAppId, key, kind = 'fresh') {
|
|
72
|
+
const h = createHash('sha256').update(ownerLarkAppId).update('\0');
|
|
73
|
+
if (kind !== 'fresh')
|
|
74
|
+
h.update(kind).update('\0');
|
|
75
|
+
const digest = h.update(key).digest('hex');
|
|
63
76
|
return join(ownerDir(ownerLarkAppId), `${digest}.json`);
|
|
64
77
|
}
|
|
65
78
|
function ensureDirFor(fp) {
|
|
@@ -109,8 +122,8 @@ function sameIdentity(a, b) {
|
|
|
109
122
|
/** Non-locking read for the pre-check in trigger-session (a fast reject before
|
|
110
123
|
* creating a session). Owner mismatch → undefined. Corrupt → THROWS. The
|
|
111
124
|
* authoritative decision is always re-taken under the lock in claim/takeover. */
|
|
112
|
-
export function lookup(ownerLarkAppId, key) {
|
|
113
|
-
const rec = readRecord(fileFor(ownerLarkAppId, key));
|
|
125
|
+
export function lookup(ownerLarkAppId, key, kind = 'fresh') {
|
|
126
|
+
const rec = readRecord(fileFor(ownerLarkAppId, key, kind));
|
|
114
127
|
if (!rec)
|
|
115
128
|
return undefined;
|
|
116
129
|
if (rec.ownerLarkAppId !== ownerLarkAppId)
|
|
@@ -123,7 +136,8 @@ export function lookup(ownerLarkAppId, key) {
|
|
|
123
136
|
* daemons/boots). Throws on corrupt/IO (fail-closed) and on payload conflict.
|
|
124
137
|
*/
|
|
125
138
|
export function claim(input) {
|
|
126
|
-
const
|
|
139
|
+
const kind = input.kind ?? 'fresh';
|
|
140
|
+
const fp = fileFor(input.ownerLarkAppId, input.key, kind);
|
|
127
141
|
return withKeyLock(fp, () => {
|
|
128
142
|
const existing = readRecord(fp);
|
|
129
143
|
if (existing) {
|
|
@@ -137,6 +151,7 @@ export function claim(input) {
|
|
|
137
151
|
ownerLarkAppId: input.ownerLarkAppId, sessionId: input.sessionId, triggerId: input.triggerId,
|
|
138
152
|
requestHash: input.requestHash, ownerBootId: input.ownerBootId,
|
|
139
153
|
revision: 1, state: 'reserved', createdAt: input.now, updatedAt: input.now,
|
|
154
|
+
...(kind !== 'fresh' ? { kind } : {}),
|
|
140
155
|
};
|
|
141
156
|
writeRecord(fp, rec);
|
|
142
157
|
return { kind: 'won', record: rec };
|
|
@@ -156,7 +171,8 @@ export function claim(input) {
|
|
|
156
171
|
* - present, different payload → conflict.
|
|
157
172
|
*/
|
|
158
173
|
export function takeover(input) {
|
|
159
|
-
const
|
|
174
|
+
const kind = input.kind ?? 'fresh';
|
|
175
|
+
const fp = fileFor(input.ownerLarkAppId, input.key, kind);
|
|
160
176
|
return withKeyLock(fp, () => {
|
|
161
177
|
const current = readRecord(fp);
|
|
162
178
|
if (!current) {
|
|
@@ -164,6 +180,7 @@ export function takeover(input) {
|
|
|
164
180
|
ownerLarkAppId: input.ownerLarkAppId, sessionId: input.sessionId, triggerId: input.triggerId,
|
|
165
181
|
requestHash: input.requestHash, ownerBootId: input.ownerBootId,
|
|
166
182
|
revision: 1, state: 'reserved', createdAt: input.now, updatedAt: input.now,
|
|
183
|
+
...(kind !== 'fresh' ? { kind } : {}),
|
|
167
184
|
};
|
|
168
185
|
writeRecord(fp, rec);
|
|
169
186
|
return { kind: 'won', record: rec };
|
|
@@ -187,6 +204,7 @@ export function takeover(input) {
|
|
|
187
204
|
ownerLarkAppId: input.ownerLarkAppId, sessionId: input.sessionId, triggerId: input.triggerId,
|
|
188
205
|
requestHash: input.requestHash, ownerBootId: input.ownerBootId,
|
|
189
206
|
revision: current.revision + 1, state: 'reserved', createdAt: current.createdAt, updatedAt: input.now,
|
|
207
|
+
...(kind !== 'fresh' ? { kind } : {}),
|
|
190
208
|
};
|
|
191
209
|
writeRecord(fp, rec);
|
|
192
210
|
return { kind: 'won', record: rec };
|
|
@@ -194,8 +212,8 @@ export function takeover(input) {
|
|
|
194
212
|
}
|
|
195
213
|
/** CAS a record to a new state under the lock. Verifies full identity + revision
|
|
196
214
|
* before writing (rejects a stale/foreign writer). Returns the written record. */
|
|
197
|
-
export function transition(ownerLarkAppId, key, from, patch) {
|
|
198
|
-
const fp = fileFor(ownerLarkAppId, key);
|
|
215
|
+
export function transition(ownerLarkAppId, key, from, patch, kind = 'fresh') {
|
|
216
|
+
const fp = fileFor(ownerLarkAppId, key, kind);
|
|
199
217
|
return withKeyLock(fp, () => {
|
|
200
218
|
const current = readRecord(fp);
|
|
201
219
|
if (!current)
|
|
@@ -230,8 +248,8 @@ function strictUnlink(fp) {
|
|
|
230
248
|
* delete) instead of swallowing both (finding #1). A lock-internal re-read
|
|
231
249
|
* corruption or an ambiguous unlink error (EIO/EROFS/…) THROWS — the caller
|
|
232
250
|
* must be able to trust that `removed` means the lease is truly released. */
|
|
233
|
-
export function compareAndRemove(ownerLarkAppId, key, expect) {
|
|
234
|
-
return compareAndRemoveByPath(fileFor(ownerLarkAppId, key), expect);
|
|
251
|
+
export function compareAndRemove(ownerLarkAppId, key, expect, kind = 'fresh') {
|
|
252
|
+
return compareAndRemoveByPath(fileFor(ownerLarkAppId, key, kind), expect);
|
|
235
253
|
}
|
|
236
254
|
/** Enumerate the leases owned by a SINGLE bot (boot reconcile is owner-scoped).
|
|
237
255
|
* Reads only `idempotency/<sha256(owner)>/` — a foreign bot's corrupt lease
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idempotency-store.js","sourceRoot":"","sources":["../../src/services/idempotency-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"idempotency-store.js","sourceRoot":"","sources":["../../src/services/idempotency-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAkC/D,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACrB;IAA5B,YAA4B,QAA2B;QACrD,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAD7C,aAAQ,GAAR,QAAQ,CAAmB;QAErD,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,SAAS,OAAO;IACd,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AACrD,CAAC;AAED;;;;;oDAKoD;AACpD,SAAS,QAAQ,CAAC,cAAsB;IACtC,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AACpC,CAAC;AAED;;;;;;;;;;;uCAWuC;AACvC,SAAS,OAAO,CAAC,cAAsB,EAAE,GAAW,EAAE,OAAwB,OAAO;IACnF,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnE,IAAI,IAAI,KAAK,OAAO;QAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,YAAY,CAAC,EAAU;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;IACxB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED;;;8BAG8B;AAC9B,SAAS,WAAW,CAAI,EAAU,EAAE,EAAW;IAC7C,YAAY,CAAC,EAAE,CAAC,CAAC;IACjB,OAAO,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAED;uEACuE;AACvE,SAAS,UAAU,CAAC,EAAU;IAC5B,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,CAAsB,CAAC;IACxE,IACE,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;WAC9B,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ;WACvC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ;WAClC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ;WAClC,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;WACpC,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;WACpC,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ;WACjC,CAAC,IAAI,CAAC,KAAK,KAAK,UAAU,IAAI,IAAI,CAAC,KAAK,KAAK,YAAY,CAAC,EAC7D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,EAAU,EAAE,GAAsB;IACrD,YAAY,CAAC,EAAE,CAAC,CAAC;IACjB,mBAAmB,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC;AACvG,CAAC;AAED;8DAC8D;AAC9D,SAAS,YAAY,CAAC,CAAoB,EAAE,CAE3C;IACC,OAAO,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,cAAc;WACvC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;WAC3B,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;WAC3B,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;WAC/B,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW,CAAC;AACvC,CAAC;AAED;;kFAEkF;AAClF,MAAM,UAAU,MAAM,CAAC,cAAsB,EAAE,GAAW,EAAE,OAAwB,OAAO;IACzF,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,IAAI,GAAG,CAAC,cAAc,KAAK,cAAc;QAAE,OAAO,SAAS,CAAC;IAC5D,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,KAGrB;IACC,MAAM,IAAI,GAAoB,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC;IACpD,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1D,OAAO,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE;QAC1B,MAAM,QAAQ,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,QAAQ,CAAC,cAAc,KAAK,KAAK,CAAC,cAAc;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAC3G,IAAI,QAAQ,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;gBAAE,MAAM,IAAI,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YAC7F,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAChD,CAAC;QACD,MAAM,GAAG,GAAsB;YAC7B,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;YAC5F,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9D,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG;YAC1E,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtC,CAAC;QACF,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,QAAQ,CAAC,KAGxB;IACC,MAAM,IAAI,GAAoB,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC;IACpD,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1D,OAAO,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE;QAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,GAAG,GAAsB;gBAC7B,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC5F,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9D,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG;gBAC1E,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtC,CAAC;YACF,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACrB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACtC,CAAC;QACD,IAAI,OAAO,CAAC,cAAc,KAAK,KAAK,CAAC,cAAc;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC1G,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;YAAE,MAAM,IAAI,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAC3F,yEAAyE;QACzE,4EAA4E;QAC5E,sBAAsB;QACtB,MAAM,mBAAmB,GACvB,OAAO,CAAC,KAAK,KAAK,UAAU;eACzB,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC,MAAM,CAAC,QAAQ;eAC1C,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,MAAM,CAAC,WAAW;eAChD,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;eACzC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAC/C,CAAC;QACD,MAAM,GAAG,GAAsB;YAC7B,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;YAC5F,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9D,QAAQ,EAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG;YACrG,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtC,CAAC;QACF,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;mFACmF;AACnF,MAAM,UAAU,UAAU,CACxB,cAAsB,EAAE,GAAW,EAAE,IAAuB,EAC5D,KAA+C,EAAE,OAAwB,OAAO;IAEhF,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9C,OAAO,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE;QAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACzE,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,4EAA4E,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/G,CAAC;QACD,MAAM,IAAI,GAAsB,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;QACzH,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;yBAGyB;AACzB,SAAS,YAAY,CAAC,EAAU;IAC9B,IAAI,CAAC;QAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IACvB,OAAO,GAAQ,EAAE,CAAC;QAAC,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ;YAAE,MAAM,GAAG,CAAC;IAAC,CAAC;AAC7D,CAAC;AAED;;;;;;;;8EAQ8E;AAC9E,MAAM,UAAU,gBAAgB,CAAC,cAAsB,EAAE,GAAW,EAAE,MAAyB,EAAE,OAAwB,OAAO;IAC9H,OAAO,sBAAsB,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AAC5E,CAAC;AAED;;;;;;8DAM8D;AAC9D,MAAM,UAAU,eAAe,CAC7B,cAAsB,EACtB,OAAqC,EAAE;IAEvC,MAAM,GAAG,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,GAAG,GAAuD,EAAE,CAAC;IACnE,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;YAC3B,2EAA2E;YAC3E,gEAAgE;YAChE,IAAI,GAAG,IAAI,GAAG,CAAC,cAAc,KAAK,cAAc;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACxF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,IAAI,CAAC,cAAc;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,EAAE,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1G,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAoBD;;;;;;;;;;;;;;;;qDAgBqD;AACrD,MAAM,UAAU,sBAAsB,CAAC,EAAU,EAAE,MAAyB;IAC1E,OAAO,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE;QAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,qEAAqE;QACrG,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;YAC7G,yEAAyE;YACzE,qEAAqE;YACrE,wEAAwE;YACxE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACnF,CAAC;QACD,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,iDAAiD;QACnE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -33,7 +33,7 @@ export declare function drainTraexRollout(path: string, fromOffset: number): Tra
|
|
|
33
33
|
* cannot surface a half-written model — matching drainTraexRollout. */
|
|
34
34
|
export declare function readLatestTraexRuntime(path: string): TraexRuntimeSnapshot;
|
|
35
35
|
/** Authoritative submit confirmation used by the adapter. Only a complete
|
|
36
|
-
*
|
|
36
|
+
* event_msg/user_message record appended after `fromOffset` can match. */
|
|
37
37
|
export declare function traexRolloutHasUserInputSince(path: string, fromOffset: number, expectedText: string): boolean;
|
|
38
38
|
export interface TraexHistoryMatch {
|
|
39
39
|
found: boolean;
|
|
@@ -52,10 +52,12 @@ export declare function traexHistoryMatchDelta(path: string, fromByte: number, e
|
|
|
52
52
|
/** Current byte size of history.jsonl (0 when absent), captured before a paste
|
|
53
53
|
* so the confirmation scan only considers lines this submit appends. */
|
|
54
54
|
export declare function traexHistorySize(path: string): number;
|
|
55
|
-
/** Find the rollout
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
|
|
55
|
+
/** Find the visible top-level rollout an externally-running TRAE process owns.
|
|
56
|
+
* TRAE can keep the parent rollout and internal guardian/subagent rollouts open
|
|
57
|
+
* in the same process. Internal rollouts are never adoptable. When a current
|
|
58
|
+
* top-level session is supplied it remains preferred unless a newer top-level
|
|
59
|
+
* user rollout proves a real in-process `/new` rotation. */
|
|
60
|
+
export declare function findTraexRolloutByPid(pid: number, preferredSessionId?: string): {
|
|
59
61
|
path: string;
|
|
60
62
|
cliSessionId: string;
|
|
61
63
|
} | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traex-transcript.d.ts","sourceRoot":"","sources":["../../src/services/traex-transcript.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"traex-transcript.d.ts","sourceRoot":"","sources":["../../src/services/traex-transcript.ts"],"names":[],"mappings":"AA+BA,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EAEtB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAAE,wBAAwB,IAAI,wBAAwB,EAAE,CAAC;AAChE,OAAO,EAAE,oBAAoB,IAAI,oBAAoB,EAAE,CAAC;AACxD,YAAY,EAAE,gBAAgB,IAAI,gBAAgB,EAAE,CAAC;AAErD,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACxD,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA0DD;;;;;6EAK6E;AAC7E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAmFpF;AAED;;;;;;;;;;;uEAWuE;AACvE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAgEzE;AAMD;0EAC0E;AAC1E,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAKT;AAeD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;oEAGoE;AACpE,MAAM,MAAM,qBAAqB,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC;AAQlF;;;yEAGyE;AACzE,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,qBAAqB,GAChC,iBAAiB,CA2BnB;AAED;yEACyE;AACzE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGrD;AAkKD;;;;6DAI6D;AAC7D,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,kBAAkB,CAAC,EAAE,MAAM,GAC1B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAKpD;AAED;;;;;;gCAMgC;AAChC,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAQ7E;AAED;;;;;;wEAMwE;AACxE,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,GACrC,OAAO,CAGT;AAGD;;yCAEyC;AACzC,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAqBpF"}
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* TRAE is a Codex-family CLI, but its terminal event is NOT byte-identical to
|
|
5
5
|
* upstream Codex:
|
|
6
|
-
* - user input is
|
|
6
|
+
* - genuine user input is confirmed by event_msg `user_message`; TRAE also
|
|
7
|
+
* writes internal runtime injections as response_item role=user messages,
|
|
8
|
+
* so those records alone are not user-attribution evidence;
|
|
7
9
|
* - assistant response_item messages have no `phase` and are emitted many
|
|
8
10
|
* times during tool use, so none of them is a safe turn boundary;
|
|
9
11
|
* - event_msg `task_complete` is the durable end-of-turn marker and carries
|
|
@@ -20,29 +22,19 @@ import { execSync } from 'node:child_process';
|
|
|
20
22
|
import { platform } from 'node:os';
|
|
21
23
|
import { join } from 'node:path';
|
|
22
24
|
import { splitCodexEventsByCutoff, extractLastCodexTurn, codexSessionIdFromRolloutPath, } from './codex-transcript.js';
|
|
25
|
+
import { isInternalCodexSessionMeta } from './codex-session-meta.js';
|
|
23
26
|
import { baselineJsonlCursor } from './jsonl-cursor.js';
|
|
24
27
|
import { traeSessionsRoot } from './traex-paths.js';
|
|
25
28
|
export { splitCodexEventsByCutoff as splitTraexEventsByCutoff };
|
|
26
29
|
export { extractLastCodexTurn as extractLastTraexTurn };
|
|
27
30
|
const IS_LINUX = platform() === 'linux';
|
|
31
|
+
const TRAEX_SESSION_META_SCAN_MAX_BYTES = 4 * 1024 * 1024;
|
|
32
|
+
const traexRolloutMetaCache = new Map();
|
|
28
33
|
/** Upper bound on how far back readLatestTraexRuntime scans for the newest
|
|
29
34
|
* model/effort. The newest turn_context sits near the tail, so this is only a
|
|
30
35
|
* pathological-file guard (cf. #740): never synchronously parse a multi-GB
|
|
31
36
|
* rollout on attach just to surface advisory runtime identity. */
|
|
32
37
|
const TRAEX_RUNTIME_SCAN_MAX_BYTES = 4 * 1024 * 1024;
|
|
33
|
-
function joinInputText(content) {
|
|
34
|
-
if (!Array.isArray(content))
|
|
35
|
-
return '';
|
|
36
|
-
const parts = [];
|
|
37
|
-
for (const block of content) {
|
|
38
|
-
if (block && typeof block === 'object' && block.type === 'input_text') {
|
|
39
|
-
const text = block.text;
|
|
40
|
-
if (typeof text === 'string')
|
|
41
|
-
parts.push(text);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return parts.join('');
|
|
45
|
-
}
|
|
46
38
|
function eventTimestampMs(value) {
|
|
47
39
|
const parsed = typeof value === 'string' ? Date.parse(value) : NaN;
|
|
48
40
|
return Number.isFinite(parsed) ? parsed : Date.now();
|
|
@@ -138,10 +130,10 @@ export function drainTraexRollout(path, fromOffset) {
|
|
|
138
130
|
timestampMs: eventTimestampMs(obj.timestamp),
|
|
139
131
|
...(sourceSessionId ? { sourceSessionId } : {}),
|
|
140
132
|
};
|
|
141
|
-
if (obj.type === '
|
|
142
|
-
&& payload.type === '
|
|
143
|
-
&& payload.
|
|
144
|
-
const userText =
|
|
133
|
+
if (obj.type === 'event_msg'
|
|
134
|
+
&& payload.type === 'user_message'
|
|
135
|
+
&& typeof payload.message === 'string') {
|
|
136
|
+
const userText = payload.message;
|
|
145
137
|
if (userText)
|
|
146
138
|
events.push({ ...base, kind: 'user', text: userText });
|
|
147
139
|
continue;
|
|
@@ -282,7 +274,7 @@ function normaliseInputText(text) {
|
|
|
282
274
|
return text.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
|
283
275
|
}
|
|
284
276
|
/** Authoritative submit confirmation used by the adapter. Only a complete
|
|
285
|
-
*
|
|
277
|
+
* event_msg/user_message record appended after `fromOffset` can match. */
|
|
286
278
|
export function traexRolloutHasUserInputSince(path, fromOffset, expectedText) {
|
|
287
279
|
const expected = normaliseInputText(expectedText);
|
|
288
280
|
return drainTraexRollout(path, fromOffset).events.some(event => event.kind === 'user' && normaliseInputText(event.text) === expected);
|
|
@@ -374,6 +366,124 @@ function matchTraexRolloutPath(target) {
|
|
|
374
366
|
return undefined;
|
|
375
367
|
return { path: target, cliSessionId: sid };
|
|
376
368
|
}
|
|
369
|
+
function traexRolloutMeta(path) {
|
|
370
|
+
const cached = traexRolloutMetaCache.get(path);
|
|
371
|
+
if (cached)
|
|
372
|
+
return cached;
|
|
373
|
+
let size;
|
|
374
|
+
try {
|
|
375
|
+
size = statSync(path).size;
|
|
376
|
+
}
|
|
377
|
+
catch {
|
|
378
|
+
return { kind: 'empty' };
|
|
379
|
+
}
|
|
380
|
+
if (size <= 0)
|
|
381
|
+
return { kind: 'empty' };
|
|
382
|
+
const length = Math.min(size, TRAEX_SESSION_META_SCAN_MAX_BYTES);
|
|
383
|
+
const buffer = Buffer.alloc(length);
|
|
384
|
+
let bytesRead = 0;
|
|
385
|
+
let fd;
|
|
386
|
+
try {
|
|
387
|
+
fd = openSync(path, 'r');
|
|
388
|
+
bytesRead = readSync(fd, buffer, 0, length, 0);
|
|
389
|
+
}
|
|
390
|
+
catch {
|
|
391
|
+
return { kind: 'pending' };
|
|
392
|
+
}
|
|
393
|
+
finally {
|
|
394
|
+
if (fd !== undefined)
|
|
395
|
+
closeSync(fd);
|
|
396
|
+
}
|
|
397
|
+
const content = buffer.subarray(0, bytesRead);
|
|
398
|
+
const newline = content.indexOf(0x0a);
|
|
399
|
+
if (newline < 0)
|
|
400
|
+
return { kind: 'pending' };
|
|
401
|
+
let entry;
|
|
402
|
+
try {
|
|
403
|
+
entry = JSON.parse(content.subarray(0, newline).toString('utf8'));
|
|
404
|
+
}
|
|
405
|
+
catch {
|
|
406
|
+
return { kind: 'pending' };
|
|
407
|
+
}
|
|
408
|
+
if (entry?.type !== 'session_meta' || !entry.payload || typeof entry.payload !== 'object') {
|
|
409
|
+
const result = { kind: 'legacy' };
|
|
410
|
+
traexRolloutMetaCache.set(path, result);
|
|
411
|
+
return result;
|
|
412
|
+
}
|
|
413
|
+
const payload = entry.payload;
|
|
414
|
+
const threadSource = payload.thread_source;
|
|
415
|
+
let kind = 'legacy';
|
|
416
|
+
if (isInternalCodexSessionMeta(payload)) {
|
|
417
|
+
kind = 'internal';
|
|
418
|
+
}
|
|
419
|
+
else if (threadSource === 'user') {
|
|
420
|
+
kind = 'user';
|
|
421
|
+
}
|
|
422
|
+
const rawTimestamp = typeof payload.timestamp === 'string'
|
|
423
|
+
? payload.timestamp
|
|
424
|
+
: typeof entry.timestamp === 'string'
|
|
425
|
+
? entry.timestamp
|
|
426
|
+
: undefined;
|
|
427
|
+
const parsedTimestamp = rawTimestamp ? Date.parse(rawTimestamp) : NaN;
|
|
428
|
+
const result = {
|
|
429
|
+
kind,
|
|
430
|
+
...(Number.isFinite(parsedTimestamp) ? { startedAtMs: parsedTimestamp } : {}),
|
|
431
|
+
};
|
|
432
|
+
if (traexRolloutMetaCache.size >= 512) {
|
|
433
|
+
const oldest = traexRolloutMetaCache.keys().next().value;
|
|
434
|
+
if (oldest)
|
|
435
|
+
traexRolloutMetaCache.delete(oldest);
|
|
436
|
+
}
|
|
437
|
+
traexRolloutMetaCache.set(path, result);
|
|
438
|
+
return result;
|
|
439
|
+
}
|
|
440
|
+
function traexRolloutRefs(targets) {
|
|
441
|
+
const refs = new Map();
|
|
442
|
+
for (const target of targets) {
|
|
443
|
+
const hit = matchTraexRolloutPath(target);
|
|
444
|
+
if (!hit || refs.has(hit.path))
|
|
445
|
+
continue;
|
|
446
|
+
refs.set(hit.path, { ...hit, ...traexRolloutMeta(hit.path) });
|
|
447
|
+
}
|
|
448
|
+
return [...refs.values()];
|
|
449
|
+
}
|
|
450
|
+
function newestTraexRollout(refs) {
|
|
451
|
+
const timestamped = refs.filter((ref) => ref.startedAtMs !== undefined);
|
|
452
|
+
if (timestamped.length === 0)
|
|
453
|
+
return undefined;
|
|
454
|
+
const maxStartedAt = Math.max(...timestamped.map(ref => ref.startedAtMs));
|
|
455
|
+
const newest = timestamped.filter(ref => ref.startedAtMs === maxStartedAt);
|
|
456
|
+
return newest.length === 1 ? newest[0] : undefined;
|
|
457
|
+
}
|
|
458
|
+
function selectableTraexRollouts(refs) {
|
|
459
|
+
const userRefs = refs.filter(ref => ref.kind === 'user');
|
|
460
|
+
if (userRefs.length > 0)
|
|
461
|
+
return userRefs;
|
|
462
|
+
const legacyRefs = refs.filter(ref => ref.kind === 'legacy');
|
|
463
|
+
if (legacyRefs.length > 0)
|
|
464
|
+
return legacyRefs;
|
|
465
|
+
return [];
|
|
466
|
+
}
|
|
467
|
+
function selectTraexRollout(refs, preferredSessionId) {
|
|
468
|
+
const candidates = selectableTraexRollouts(refs);
|
|
469
|
+
if (candidates.length === 0)
|
|
470
|
+
return undefined;
|
|
471
|
+
const preferred = preferredSessionId
|
|
472
|
+
? candidates.find(ref => ref.cliSessionId.toLowerCase() === preferredSessionId.toLowerCase())
|
|
473
|
+
: undefined;
|
|
474
|
+
const newest = newestTraexRollout(candidates);
|
|
475
|
+
if (preferred) {
|
|
476
|
+
if (newest?.startedAtMs !== undefined
|
|
477
|
+
&& preferred.startedAtMs !== undefined
|
|
478
|
+
&& newest.startedAtMs > preferred.startedAtMs) {
|
|
479
|
+
return newest;
|
|
480
|
+
}
|
|
481
|
+
return preferred;
|
|
482
|
+
}
|
|
483
|
+
if (candidates.length === 1)
|
|
484
|
+
return candidates[0];
|
|
485
|
+
return newest;
|
|
486
|
+
}
|
|
377
487
|
/** Enumerate the file paths a pid holds open (Linux /proc, else lsof). Shared
|
|
378
488
|
* by findTraexRolloutByPid (single) and findTraexRolloutSetByPid (ownership
|
|
379
489
|
* set) so both derive from one source. Returns undefined when enumeration is
|
|
@@ -417,19 +527,17 @@ function traexProcessOpenTargets(pid) {
|
|
|
417
527
|
}
|
|
418
528
|
return targets;
|
|
419
529
|
}
|
|
420
|
-
/** Find the rollout
|
|
421
|
-
*
|
|
422
|
-
*
|
|
423
|
-
|
|
530
|
+
/** Find the visible top-level rollout an externally-running TRAE process owns.
|
|
531
|
+
* TRAE can keep the parent rollout and internal guardian/subagent rollouts open
|
|
532
|
+
* in the same process. Internal rollouts are never adoptable. When a current
|
|
533
|
+
* top-level session is supplied it remains preferred unless a newer top-level
|
|
534
|
+
* user rollout proves a real in-process `/new` rotation. */
|
|
535
|
+
export function findTraexRolloutByPid(pid, preferredSessionId) {
|
|
424
536
|
const targets = traexProcessOpenTargets(pid);
|
|
425
537
|
if (!targets)
|
|
426
538
|
return undefined;
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
if (hit)
|
|
430
|
-
return hit;
|
|
431
|
-
}
|
|
432
|
-
return undefined;
|
|
539
|
+
const selected = selectTraexRollout(traexRolloutRefs(targets), preferredSessionId);
|
|
540
|
+
return selected ? { path: selected.path, cliSessionId: selected.cliSessionId } : undefined;
|
|
433
541
|
}
|
|
434
542
|
/** Lowercased set of TRAE session ids whose rollout the pid holds open. The
|
|
435
543
|
* ownership gate for a shared-history.jsonl submit match: only a sid this pid
|
|
@@ -443,10 +551,8 @@ export function findTraexRolloutSetByPid(pid) {
|
|
|
443
551
|
if (!targets)
|
|
444
552
|
return undefined;
|
|
445
553
|
const set = new Set();
|
|
446
|
-
for (const
|
|
447
|
-
|
|
448
|
-
if (hit)
|
|
449
|
-
set.add(hit.cliSessionId.toLowerCase());
|
|
554
|
+
for (const ref of selectableTraexRollouts(traexRolloutRefs(targets))) {
|
|
555
|
+
set.add(ref.cliSessionId.toLowerCase());
|
|
450
556
|
}
|
|
451
557
|
return set;
|
|
452
558
|
}
|