@vibe-commit/capture 0.6.1 → 0.8.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 +191 -9
- package/dist/account_not_here.d.ts +15 -0
- package/dist/account_not_here.js +25 -0
- package/dist/account_not_here.js.map +1 -0
- package/dist/agent_hooks.d.ts +8 -0
- package/dist/agent_hooks.js +31 -1
- package/dist/agent_hooks.js.map +1 -1
- package/dist/agents/claude_code.d.ts +34 -0
- package/dist/agents/claude_code.js +141 -8
- package/dist/agents/claude_code.js.map +1 -1
- package/dist/agents/codex_cli.d.ts +13 -0
- package/dist/agents/codex_cli.js +241 -2
- package/dist/agents/codex_cli.js.map +1 -1
- package/dist/agents/cursor.d.ts +34 -0
- package/dist/agents/cursor.js +115 -1
- package/dist/agents/cursor.js.map +1 -1
- package/dist/agents/session_listing.d.ts +29 -0
- package/dist/agents/session_listing.js +49 -0
- package/dist/agents/session_listing.js.map +1 -0
- package/dist/agents/types.d.ts +118 -8
- package/dist/agents/types.js +17 -3
- package/dist/agents/types.js.map +1 -1
- package/dist/commands/approval_pending.d.ts +9 -0
- package/dist/commands/approval_pending.js +23 -0
- package/dist/commands/approval_pending.js.map +1 -0
- package/dist/commands/auth.d.ts +7 -0
- package/dist/commands/auth.js +52 -11
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/backfill.d.ts +160 -0
- package/dist/commands/backfill.js +748 -0
- package/dist/commands/backfill.js.map +1 -0
- package/dist/commands/browser_credential.d.ts +6 -2
- package/dist/commands/browser_credential.js +34 -14
- package/dist/commands/browser_credential.js.map +1 -1
- package/dist/commands/connect.d.ts +146 -0
- package/dist/commands/connect.js +216 -117
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connect_account.d.ts +135 -0
- package/dist/commands/connect_account.js +321 -0
- package/dist/commands/connect_account.js.map +1 -0
- package/dist/commands/connect_picker.d.ts +27 -0
- package/dist/commands/connect_picker.js +549 -0
- package/dist/commands/connect_picker.js.map +1 -0
- package/dist/commands/context.d.ts +16 -0
- package/dist/commands/context.js +27 -0
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/credential_problem.d.ts +15 -4
- package/dist/commands/credential_problem.js +29 -22
- package/dist/commands/credential_problem.js.map +1 -1
- package/dist/commands/device_credential.d.ts +5 -1
- package/dist/commands/device_credential.js +17 -14
- package/dist/commands/device_credential.js.map +1 -1
- package/dist/commands/finalize.d.ts +95 -0
- package/dist/commands/finalize.js +249 -74
- package/dist/commands/finalize.js.map +1 -1
- package/dist/commands/finish_mint.d.ts +30 -6
- package/dist/commands/finish_mint.js +26 -6
- package/dist/commands/finish_mint.js.map +1 -1
- package/dist/commands/report.js +38 -30
- package/dist/commands/report.js.map +1 -1
- package/dist/commands/scan.d.ts +162 -0
- package/dist/commands/scan.js +507 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/status.d.ts +19 -1
- package/dist/commands/status.js +232 -26
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/status_hooks.d.ts +14 -0
- package/dist/commands/status_hooks.js +81 -0
- package/dist/commands/status_hooks.js.map +1 -0
- package/dist/commands/status_machine.d.ts +27 -0
- package/dist/commands/status_machine.js +210 -0
- package/dist/commands/status_machine.js.map +1 -0
- package/dist/commands/sync_reason.d.ts +17 -0
- package/dist/commands/sync_reason.js +25 -0
- package/dist/commands/sync_reason.js.map +1 -0
- package/dist/commands/why.js +44 -31
- package/dist/commands/why.js.map +1 -1
- package/dist/consent.d.ts +217 -0
- package/dist/consent.js +400 -1
- package/dist/consent.js.map +1 -1
- package/dist/copy/error_codes.d.ts +222 -0
- package/dist/copy/error_codes.js +105 -0
- package/dist/copy/error_codes.js.map +1 -0
- package/dist/copy/index.d.ts +2 -2
- package/dist/copy/index.js +2 -2
- package/dist/copy/index.js.map +1 -1
- package/dist/copy/strings.d.ts +617 -30
- package/dist/copy/strings.js +741 -36
- package/dist/copy/strings.js.map +1 -1
- package/dist/copy/time.d.ts +11 -0
- package/dist/copy/time.js +18 -0
- package/dist/copy/time.js.map +1 -1
- package/dist/credential.d.ts +5 -1
- package/dist/credential.js +2 -2
- package/dist/credential.js.map +1 -1
- package/dist/git.d.ts +43 -0
- package/dist/git.js +95 -0
- package/dist/git.js.map +1 -1
- package/dist/grants_sync.d.ts +165 -0
- package/dist/grants_sync.js +289 -0
- package/dist/grants_sync.js.map +1 -0
- package/dist/grants_verb.d.ts +70 -0
- package/dist/grants_verb.js +121 -0
- package/dist/grants_verb.js.map +1 -0
- package/dist/hooks/entry.d.ts +18 -1
- package/dist/hooks/entry.js +117 -14
- package/dist/hooks/entry.js.map +1 -1
- package/dist/hooks/post_commit.js +3 -3
- package/dist/hooks/post_commit.js.map +1 -1
- package/dist/hooks/post_rewrite.js +6 -4
- package/dist/hooks/post_rewrite.js.map +1 -1
- package/dist/hooks/session_grants.d.ts +59 -0
- package/dist/hooks/session_grants.js +91 -0
- package/dist/hooks/session_grants.js.map +1 -0
- package/dist/hooks/session_start.d.ts +114 -0
- package/dist/hooks/session_start.js +243 -0
- package/dist/hooks/session_start.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +76 -11
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +57 -0
- package/dist/install.js +54 -20
- package/dist/install.js.map +1 -1
- package/dist/json.d.ts +32 -9
- package/dist/json.js +35 -8
- package/dist/json.js.map +1 -1
- package/dist/machine_state.d.ts +52 -0
- package/dist/machine_state.js +63 -0
- package/dist/machine_state.js.map +1 -0
- package/dist/oauth/retire.d.ts +10 -0
- package/dist/oauth/retire.js +13 -0
- package/dist/oauth/retire.js.map +1 -1
- package/dist/oauth/session.d.ts +1 -0
- package/dist/org_pending.d.ts +52 -0
- package/dist/org_pending.js +109 -0
- package/dist/org_pending.js.map +1 -0
- package/dist/paths.d.ts +70 -0
- package/dist/paths.js +90 -0
- package/dist/paths.js.map +1 -1
- package/dist/pending_revoke.d.ts +117 -0
- package/dist/pending_revoke.js +233 -0
- package/dist/pending_revoke.js.map +1 -0
- package/dist/pending_revoke_file.d.ts +55 -0
- package/dist/pending_revoke_file.js +74 -0
- package/dist/pending_revoke_file.js.map +1 -0
- package/dist/picker.d.ts +208 -0
- package/dist/picker.js +526 -0
- package/dist/picker.js.map +1 -0
- package/dist/picker_checklist.d.ts +141 -0
- package/dist/picker_checklist.js +411 -0
- package/dist/picker_checklist.js.map +1 -0
- package/dist/policy.d.ts +70 -1
- package/dist/policy.js +68 -2
- package/dist/policy.js.map +1 -1
- package/dist/post.d.ts +91 -18
- package/dist/post.js +259 -27
- package/dist/post.js.map +1 -1
- package/dist/state.d.ts +6 -0
- package/dist/state.js +38 -1
- package/dist/state.js.map +1 -1
- package/dist/system_message.d.ts +32 -2
- package/dist/system_message.js +47 -5
- package/dist/system_message.js.map +1 -1
- package/dist/term.d.ts +28 -2
- package/dist/term.js +23 -2
- package/dist/term.js.map +1 -1
- package/dist/verb_help.d.ts +13 -0
- package/dist/verb_help.js +40 -0
- package/dist/verb_help.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -9
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What this machine captures, as the machine-level verbs need it (0.7.0, PR 3): `auth` outside a repo (D32), `status` from
|
|
3
|
+
* any folder (D6) and the picker's "No changes" line all say the same thing about the same facts, so they ask here.
|
|
4
|
+
*
|
|
5
|
+
* Reads `grants.json` and `projects.json` and, for each per-clone consent, the clone's remote (one `git remote get-url`
|
|
6
|
+
* apiece). Opens no transcript and writes nothing.
|
|
7
|
+
*/
|
|
8
|
+
import { EMPTY_GRANTS, normalizeSlug, ownerOfSlug, isLocalSlug, readAllowList, readGrants } from "./consent.js";
|
|
9
|
+
import { remoteSlugOfCommonDir } from "./git.js";
|
|
10
|
+
import { PICKER } from "./copy/index.js";
|
|
11
|
+
export function readPerClone(home) {
|
|
12
|
+
return Object.keys(readAllowList(home)).map((commonDir) => ({ commonDir, slug: remoteSlugOfCommonDir(commonDir) }));
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* ⛔ **Counts what ADMITS capture, not what is written down.** An excluded slug is not on whatever else says so; a repo an
|
|
16
|
+
* owner grant covers is counted once, under the owner; a per-clone consent whose clone has no remote (`local:`) is still a
|
|
17
|
+
* repo that is on, and counts as one.
|
|
18
|
+
*/
|
|
19
|
+
export function machineCapture(home) {
|
|
20
|
+
const read = readGrants(home);
|
|
21
|
+
if (read.kind === "unreadable")
|
|
22
|
+
return { kind: "unreadable" };
|
|
23
|
+
const grants = read.kind === "ok" ? read.grants : EMPTY_GRANTS;
|
|
24
|
+
const perClone = readPerClone(home);
|
|
25
|
+
const excluded = new Set(grants.excluded);
|
|
26
|
+
const owners = grants.owners;
|
|
27
|
+
const repos = new Set();
|
|
28
|
+
for (const slug of grants.repos) {
|
|
29
|
+
if (!excluded.has(slug) && !owners.includes(ownerOfSlug(slug)))
|
|
30
|
+
repos.add(slug);
|
|
31
|
+
}
|
|
32
|
+
for (const entry of perClone) {
|
|
33
|
+
const slug = entry.slug === null ? null : normalizeSlug(entry.slug);
|
|
34
|
+
if (slug === null || isLocalSlug(slug))
|
|
35
|
+
repos.add(`local:${entry.commonDir}`);
|
|
36
|
+
else if (!excluded.has(slug) && !owners.includes(ownerOfSlug(slug)))
|
|
37
|
+
repos.add(slug);
|
|
38
|
+
}
|
|
39
|
+
if (owners.length === 0 && repos.size === 0)
|
|
40
|
+
return { kind: "none" };
|
|
41
|
+
return { kind: "on", grants, perClone, owners: owners.length, repos: repos.size };
|
|
42
|
+
}
|
|
43
|
+
/** `1 owner and 2 repos` — or the empty string when nothing is on. */
|
|
44
|
+
export function machineSummary(capture) {
|
|
45
|
+
return capture.kind === "on" ? PICKER.summary(capture.owners, capture.repos) : "";
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Meaningful only for a clone `isCaptureAllowed` admits. An owner grant outranks a repo grant, which outranks a per-clone
|
|
49
|
+
* consent — the broadest reason first, so `status` names what would have to be removed to turn the repo off by grant.
|
|
50
|
+
*/
|
|
51
|
+
export function captureBasis(home, slug) {
|
|
52
|
+
const read = readGrants(home);
|
|
53
|
+
if (read.kind === "ok" && !isLocalSlug(slug)) {
|
|
54
|
+
const name = normalizeSlug(slug);
|
|
55
|
+
const owner = ownerOfSlug(name);
|
|
56
|
+
if (read.grants.owners.includes(owner))
|
|
57
|
+
return { kind: "owner", owner };
|
|
58
|
+
if (read.grants.repos.includes(name))
|
|
59
|
+
return { kind: "repo" };
|
|
60
|
+
}
|
|
61
|
+
return { kind: "clone" };
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=machine_state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine_state.js","sourceRoot":"","sources":["../src/machine_state.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth/retire.d.ts
CHANGED
|
@@ -31,6 +31,8 @@
|
|
|
31
31
|
*/
|
|
32
32
|
import type { IngestCredential } from "../credential.js";
|
|
33
33
|
export declare const RETIRE_PATH = "/oauth/ingest-credential/retire";
|
|
34
|
+
/** One best-effort revoke of a credential `g` holds, and the bound on a verb's whole retry of the queue (`pending_revoke.ts`). */
|
|
35
|
+
export declare const REVOKE_TIMEOUT_MS = 3000;
|
|
34
36
|
export type Retire =
|
|
35
37
|
/** The server revoked the old credential. */
|
|
36
38
|
{
|
|
@@ -62,3 +64,11 @@ export declare function retireCredential(mcpEndpoint: string, replacement: Inges
|
|
|
62
64
|
* result carries nothing of the credential.
|
|
63
65
|
*/
|
|
64
66
|
export declare function selfRevokeCredential(mcpEndpoint: string, credential: IngestCredential, deps: RetireDeps): Promise<Retire>;
|
|
67
|
+
/**
|
|
68
|
+
* `selfRevokeCredential`, plus the one thing a RETRY needs to know: `gone` is a 401, the server saying it does not accept this
|
|
69
|
+
* credential — already revoked, expired or never real — so there is nothing left to revoke and a queued retry stops. Every
|
|
70
|
+
* other result is `selfRevokeCredential`'s.
|
|
71
|
+
*/
|
|
72
|
+
export declare function selfRevokeOutcome(mcpEndpoint: string, credential: IngestCredential, deps: RetireDeps): Promise<Retire | {
|
|
73
|
+
readonly kind: "gone";
|
|
74
|
+
}>;
|
package/dist/oauth/retire.js
CHANGED
|
@@ -31,6 +31,8 @@
|
|
|
31
31
|
*/
|
|
32
32
|
import { HTTP_TIMEOUT_MS } from "./signin.js";
|
|
33
33
|
export const RETIRE_PATH = "/oauth/ingest-credential/retire";
|
|
34
|
+
/** One best-effort revoke of a credential `g` holds, and the bound on a verb's whole retry of the queue (`pending_revoke.ts`). */
|
|
35
|
+
export const REVOKE_TIMEOUT_MS = 3_000;
|
|
34
36
|
export function retireUrl(mcpEndpoint) {
|
|
35
37
|
return new URL(RETIRE_PATH, mcpEndpoint).toString();
|
|
36
38
|
}
|
|
@@ -75,6 +77,15 @@ export async function retireCredential(mcpEndpoint, replacement, old, deps) {
|
|
|
75
77
|
* result carries nothing of the credential.
|
|
76
78
|
*/
|
|
77
79
|
export async function selfRevokeCredential(mcpEndpoint, credential, deps) {
|
|
80
|
+
const outcome = await selfRevokeOutcome(mcpEndpoint, credential, deps);
|
|
81
|
+
return outcome.kind === "gone" ? { kind: "failed" } : outcome;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* `selfRevokeCredential`, plus the one thing a RETRY needs to know: `gone` is a 401, the server saying it does not accept this
|
|
85
|
+
* credential — already revoked, expired or never real — so there is nothing left to revoke and a queued retry stops. Every
|
|
86
|
+
* other result is `selfRevokeCredential`'s.
|
|
87
|
+
*/
|
|
88
|
+
export async function selfRevokeOutcome(mcpEndpoint, credential, deps) {
|
|
78
89
|
const controller = new AbortController();
|
|
79
90
|
const timer = setTimeout(() => controller.abort(), deps.timeoutMs ?? HTTP_TIMEOUT_MS);
|
|
80
91
|
try {
|
|
@@ -91,6 +102,8 @@ export async function selfRevokeCredential(mcpEndpoint, credential, deps) {
|
|
|
91
102
|
});
|
|
92
103
|
if (res.status === 404)
|
|
93
104
|
return { kind: "unknown" };
|
|
105
|
+
if (res.status === 401)
|
|
106
|
+
return { kind: "gone" };
|
|
94
107
|
if (res.status !== 200)
|
|
95
108
|
return { kind: "failed" };
|
|
96
109
|
const doc = (await res.json());
|
package/dist/oauth/retire.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retire.js","sourceRoot":"","sources":["../../src/oauth/retire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,CAAC,MAAM,WAAW,GAAG,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"retire.js","sourceRoot":"","sources":["../../src/oauth/retire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,CAAC,MAAM,WAAW,GAAG,iCAAiC,CAAC;AAE7D,kIAAkI;AAClI,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAiBvC,MAAM,UAAU,SAAS,CAAC,WAAmB;IAC3C,OAAO,IAAI,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,WAA6B,EAC7B,GAAqB,EACrB,IAAgB;IAEhB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,IAAI,eAAe,CAAC,CAAC;IACtF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE;YACnD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,WAAW,CAAC,MAAM,EAAE,EAAE;gBAC/C,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC3B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YACjD,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACnD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiC,CAAC;QAC/D,IAAI,GAAG,EAAE,OAAO,KAAK,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACtD,IAAI,GAAG,EAAE,OAAO,KAAK,KAAK;YAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QAC3D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,WAAmB,EACnB,UAA4B,EAC5B,IAAgB;IAEhB,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAAmB,EACnB,UAA4B,EAC5B,IAAgB;IAEhB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,IAAI,eAAe,CAAC,CAAC;IACtF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE;YACnD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,UAAU,CAAC,MAAM,EAAE,EAAE;gBAC9C,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC3B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACpC,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACnD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAChD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiC,CAAC;QAC/D,OAAO,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
|
package/dist/oauth/session.d.ts
CHANGED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "This repo's upload was refused because its org has not approved capture yet" — a one-bit memory, so `status` can say so
|
|
3
|
+
* (0.7.0, PR 3: VQ's claim-check-2 follow-up, Alexander's "Status lists them", and VT's review of the first design).
|
|
4
|
+
*
|
|
5
|
+
* The client already KNOWS this: a `403 capture_not_approved` is the answer to THIS repo's own upload, and `connect` prints the
|
|
6
|
+
* held beat for it. A hook treats the same 403 as `later` (the offset holds, the bytes stay on disk) and remembered nothing, so
|
|
7
|
+
* `status` could not tell a repo waiting on an owner from one that simply had not sent yet.
|
|
8
|
+
*
|
|
9
|
+
* ## ONE marker per SLUG, because an organization's approval is about the repo and not about one clone of it
|
|
10
|
+
*
|
|
11
|
+
* `<state>/org-pending/<digest of normalizeSlug(slug)>.mark`, holding the slug. The first design keyed the marker by the
|
|
12
|
+
* worktree, and it outlived the approval whenever a DIFFERENT clone, or a worktree since removed, was the one that delivered:
|
|
13
|
+
* machine `status` kept saying "the org must approve capture" about a repo that was approved. Keyed by slug, a 2xx from any clone
|
|
14
|
+
* removes it, and both statuses read the same file:
|
|
15
|
+
*
|
|
16
|
+
* - **in-repo `status`** reads the marker for the repo's slug (`readOrgPending`);
|
|
17
|
+
* - **machine `status`** lists the directory (`listOrgPending`): one small file per WAITING repo.
|
|
18
|
+
*
|
|
19
|
+
* ## The hot path stays flat
|
|
20
|
+
*
|
|
21
|
+
* Written on that 403 only; cleared on any 2xx by ONE `rmSync` of a path computed from `ctx.repoSlug`. No directory scan and no
|
|
22
|
+
* spawn on a delivery; the only scan is `listOrgPending`, by `status`, of this small directory. (`test/load-path.test.ts` pins
|
|
23
|
+
* that `clearOrgPending` and `markOrgPending` contain neither.)
|
|
24
|
+
*
|
|
25
|
+
* ## Rules
|
|
26
|
+
* - The slug is the CLIENT's (`ctx.repoSlug`), never anything in the response body, which names nobody.
|
|
27
|
+
* - `normalizeSlug` (consent.ts) on write, on clear and on both reads, so `Acme/Widget` and `acme/widget` are one marker.
|
|
28
|
+
* - No marker for a `local:` slug: it names a path, and no organization can hold it.
|
|
29
|
+
* - The file is NAMED by a digest and carries the slug inside, so a slug with `/` or anything a host allows is never a path.
|
|
30
|
+
* - Every function swallows its own failure: it runs on the hook's path, where nothing may throw, and a missing marker only
|
|
31
|
+
* means `status` says nothing extra.
|
|
32
|
+
*
|
|
33
|
+
* Old per-worktree markers (written by earlier builds of this PR) are not read and not migrated: they were never released.
|
|
34
|
+
*/
|
|
35
|
+
export interface OrgPending {
|
|
36
|
+
/** Epoch ms of the refusal. */
|
|
37
|
+
readonly at: number;
|
|
38
|
+
/** The body's `owners_notified`, carried exactly as `connect` reads it: `null` = not determinable. */
|
|
39
|
+
readonly ownersNotified: number | null;
|
|
40
|
+
/** The repo's normalized slug, as the CLIENT resolved it. `null` if the file carries none: such a marker is never listed. */
|
|
41
|
+
readonly slug: string | null;
|
|
42
|
+
}
|
|
43
|
+
export declare function markOrgPending(home: string, nowMs: number, ownersNotified: number | null, slug: string): void;
|
|
44
|
+
/** A delivery landed, so the org approved: remove this slug's marker, whichever clone wrote it. One `rmSync`. */
|
|
45
|
+
export declare function clearOrgPending(home: string, slug: string): void;
|
|
46
|
+
/** Is THIS repo (any clone of it) waiting on an organization's approval? In-repo `status`. */
|
|
47
|
+
export declare function readOrgPending(home: string, slug: string): OrgPending | null;
|
|
48
|
+
/**
|
|
49
|
+
* Every repo on this machine with a standing refusal, for the machine-level `status`: the slug directory, one small file per
|
|
50
|
+
* waiting repo. Never `sessions/*`, and only ever called by `status`, never on a delivery. Unreadable entries are skipped.
|
|
51
|
+
*/
|
|
52
|
+
export declare function listOrgPending(home: string): OrgPending[];
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "This repo's upload was refused because its org has not approved capture yet" — a one-bit memory, so `status` can say so
|
|
3
|
+
* (0.7.0, PR 3: VQ's claim-check-2 follow-up, Alexander's "Status lists them", and VT's review of the first design).
|
|
4
|
+
*
|
|
5
|
+
* The client already KNOWS this: a `403 capture_not_approved` is the answer to THIS repo's own upload, and `connect` prints the
|
|
6
|
+
* held beat for it. A hook treats the same 403 as `later` (the offset holds, the bytes stay on disk) and remembered nothing, so
|
|
7
|
+
* `status` could not tell a repo waiting on an owner from one that simply had not sent yet.
|
|
8
|
+
*
|
|
9
|
+
* ## ONE marker per SLUG, because an organization's approval is about the repo and not about one clone of it
|
|
10
|
+
*
|
|
11
|
+
* `<state>/org-pending/<digest of normalizeSlug(slug)>.mark`, holding the slug. The first design keyed the marker by the
|
|
12
|
+
* worktree, and it outlived the approval whenever a DIFFERENT clone, or a worktree since removed, was the one that delivered:
|
|
13
|
+
* machine `status` kept saying "the org must approve capture" about a repo that was approved. Keyed by slug, a 2xx from any clone
|
|
14
|
+
* removes it, and both statuses read the same file:
|
|
15
|
+
*
|
|
16
|
+
* - **in-repo `status`** reads the marker for the repo's slug (`readOrgPending`);
|
|
17
|
+
* - **machine `status`** lists the directory (`listOrgPending`): one small file per WAITING repo.
|
|
18
|
+
*
|
|
19
|
+
* ## The hot path stays flat
|
|
20
|
+
*
|
|
21
|
+
* Written on that 403 only; cleared on any 2xx by ONE `rmSync` of a path computed from `ctx.repoSlug`. No directory scan and no
|
|
22
|
+
* spawn on a delivery; the only scan is `listOrgPending`, by `status`, of this small directory. (`test/load-path.test.ts` pins
|
|
23
|
+
* that `clearOrgPending` and `markOrgPending` contain neither.)
|
|
24
|
+
*
|
|
25
|
+
* ## Rules
|
|
26
|
+
* - The slug is the CLIENT's (`ctx.repoSlug`), never anything in the response body, which names nobody.
|
|
27
|
+
* - `normalizeSlug` (consent.ts) on write, on clear and on both reads, so `Acme/Widget` and `acme/widget` are one marker.
|
|
28
|
+
* - No marker for a `local:` slug: it names a path, and no organization can hold it.
|
|
29
|
+
* - The file is NAMED by a digest and carries the slug inside, so a slug with `/` or anything a host allows is never a path.
|
|
30
|
+
* - Every function swallows its own failure: it runs on the hook's path, where nothing may throw, and a missing marker only
|
|
31
|
+
* means `status` says nothing extra.
|
|
32
|
+
*
|
|
33
|
+
* Old per-worktree markers (written by earlier builds of this PR) are not read and not migrated: they were never released.
|
|
34
|
+
*/
|
|
35
|
+
import { createHash } from "node:crypto";
|
|
36
|
+
import { mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
37
|
+
import { join } from "node:path";
|
|
38
|
+
import { isLocalSlug, normalizeSlug } from "./consent.js";
|
|
39
|
+
import { stateDir } from "./paths.js";
|
|
40
|
+
const SLUG_DIR = "org-pending";
|
|
41
|
+
function markerPath(home, slug) {
|
|
42
|
+
return join(stateDir(home), SLUG_DIR, `${createHash("sha256").update(normalizeSlug(slug)).digest("hex").slice(0, 32)}.mark`);
|
|
43
|
+
}
|
|
44
|
+
export function markOrgPending(home, nowMs, ownersNotified, slug) {
|
|
45
|
+
const name = normalizeSlug(slug);
|
|
46
|
+
if (name === "" || isLocalSlug(name))
|
|
47
|
+
return;
|
|
48
|
+
try {
|
|
49
|
+
const path = markerPath(home, name);
|
|
50
|
+
mkdirSync(join(path, ".."), { recursive: true, mode: 0o700 });
|
|
51
|
+
writeFileSync(path, `${JSON.stringify({ at: nowMs, owners_notified: ownersNotified, slug: name })}\n`, { mode: 0o600 });
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Nothing to remember it with; `status` says nothing extra.
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** A delivery landed, so the org approved: remove this slug's marker, whichever clone wrote it. One `rmSync`. */
|
|
58
|
+
export function clearOrgPending(home, slug) {
|
|
59
|
+
try {
|
|
60
|
+
rmSync(markerPath(home, slug), { force: true });
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// A marker that cannot be removed is a stale "waiting" line at worst, and the next delivery tries again.
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function parse(path) {
|
|
67
|
+
try {
|
|
68
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
69
|
+
if (parsed === null || typeof parsed !== "object")
|
|
70
|
+
return null;
|
|
71
|
+
const { at, owners_notified: owners, slug } = parsed;
|
|
72
|
+
if (typeof at !== "number" || !Number.isFinite(at) || at <= 0)
|
|
73
|
+
return null;
|
|
74
|
+
return {
|
|
75
|
+
at,
|
|
76
|
+
ownersNotified: typeof owners === "number" && Number.isFinite(owners) ? owners : null,
|
|
77
|
+
slug: typeof slug === "string" && slug !== "" ? normalizeSlug(slug) : null,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** Is THIS repo (any clone of it) waiting on an organization's approval? In-repo `status`. */
|
|
85
|
+
export function readOrgPending(home, slug) {
|
|
86
|
+
const name = normalizeSlug(slug);
|
|
87
|
+
if (name === "" || isLocalSlug(name))
|
|
88
|
+
return null;
|
|
89
|
+
return parse(markerPath(home, name));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Every repo on this machine with a standing refusal, for the machine-level `status`: the slug directory, one small file per
|
|
93
|
+
* waiting repo. Never `sessions/*`, and only ever called by `status`, never on a delivery. Unreadable entries are skipped.
|
|
94
|
+
*/
|
|
95
|
+
export function listOrgPending(home) {
|
|
96
|
+
const root = join(stateDir(home), SLUG_DIR);
|
|
97
|
+
let names;
|
|
98
|
+
try {
|
|
99
|
+
names = readdirSync(root);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
return names.flatMap((name) => {
|
|
105
|
+
const entry = parse(join(root, name));
|
|
106
|
+
return entry === null ? [] : [entry];
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=org_pending.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org_pending.js","sourceRoot":"","sources":["../src/org_pending.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
CHANGED
|
@@ -19,6 +19,25 @@ export declare function rootDir(home: string): string;
|
|
|
19
19
|
export declare function credentialsPath(home: string): string;
|
|
20
20
|
/** The per-project consent allow list. Consulted BEFORE any transcript read (D56 §D19). */
|
|
21
21
|
export declare function projectsPath(home: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* The slug-keyed grant list — owners, repos, exclusions and refusals. Read next to
|
|
24
|
+
* `projects.json` by `consent.ts`'s `isCaptureAllowed`, BEFORE any transcript read.
|
|
25
|
+
*/
|
|
26
|
+
export declare function grantsPath(home: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* What the SERVER told this machine about the account, and the refusals a hook saw (slice 2, S4). ⛔ A separate file
|
|
29
|
+
* from `grants.json` on purpose: hooks write this one and never write `grants.json`, whose `updateGrants`
|
|
30
|
+
* read-modify-write has no lock — a hook racing `vibecommit off` could otherwise restore a turned-off repo. Written whole
|
|
31
|
+
* and atomically; read by `consent.ts`'s `isCaptureAllowed` next to `grants.json`.
|
|
32
|
+
*/
|
|
33
|
+
export declare function grantsAccountPath(home: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Credentials `g` made and then removed from this machine whose revoke did not reach the server (slice 2, S4, R3-11): the next CLI
|
|
36
|
+
* verb retries each one. ⛔ **It holds a bearer token**, because a self-revoke is made with the credential itself and the local
|
|
37
|
+
* credential file was deleted. Mode 0600 like `credentials.json`, written atomically, CLI-only, and a row leaves it the moment the
|
|
38
|
+
* server says there is nothing left to revoke.
|
|
39
|
+
*/
|
|
40
|
+
export declare function pendingRevokePath(home: string): string;
|
|
22
41
|
/**
|
|
23
42
|
* The HUMAN lane's signed-in session — `CR-084d`. Mode 0600, enforced on read by
|
|
24
43
|
* the same `readSecretFile` the ingest credential goes through.
|
|
@@ -90,6 +109,25 @@ export declare function repoDayNoticePath(home: string, repoKey: string, day: st
|
|
|
90
109
|
* `day` is a UTC `YYYY-MM-DD` supplied by the caller, never read from a local clock here.
|
|
91
110
|
*/
|
|
92
111
|
export declare function machineDayNoticePath(home: string, day: string, key: string): string;
|
|
112
|
+
/**
|
|
113
|
+
* Once-per-`(machine, account epoch)` marker — slice 2, notice state 10 ("your account grants N repositories not captured on this
|
|
114
|
+
* machine yet"). The epoch is the server's version of the user's grants, so the message is spoken again only when the grants
|
|
115
|
+
* changed; a repeat per session or per day would nag about the same unchanged gap. `epoch` is a non-negative integer, `key` the state.
|
|
116
|
+
*/
|
|
117
|
+
export declare function machineEpochNoticePath(home: string, epoch: number, key: string): string;
|
|
118
|
+
/**
|
|
119
|
+
* Once-per-CLONE marker — 0.7.0, notices 6-8 and the `SessionStart` install record (eng review D4 · A).
|
|
120
|
+
*
|
|
121
|
+
* `cloneKey` is `src/hooks/session_start.ts`'s `cloneKey`: the git common dir PLUS the clone's oldest HEAD
|
|
122
|
+
* reflog entry, so a fresh clone at a path that used to hold another one is a different clone and gets its own
|
|
123
|
+
* notice and its own install. It is hashed here for the reason `repoDigest` hashes a repo key — `sanitise`
|
|
124
|
+
* truncates, and two deep checkouts sharing a prefix would otherwise share a marker.
|
|
125
|
+
*
|
|
126
|
+
* `clone/<digest>/<state>.json` is a third depth under `notices/`, apart from `<session>/<state>.json`,
|
|
127
|
+
* `repo-day/…` and `machine-day/…`, so no session id can resolve onto one. `state` of `installed` is the
|
|
128
|
+
* install record, which is not a notice and is kept beside them on purpose.
|
|
129
|
+
*/
|
|
130
|
+
export declare function cloneMarkerPath(home: string, cloneKey: string, state: string): string;
|
|
93
131
|
/**
|
|
94
132
|
* The binding key of the client's send state — `CR-017d`, the client half of
|
|
95
133
|
* `CR-017`.
|
|
@@ -405,5 +443,37 @@ export declare function isInsideAny(roots: readonly string[], candidate: string)
|
|
|
405
443
|
* would read and nothing would write.
|
|
406
444
|
*/
|
|
407
445
|
export declare function claudeSettingsPath(home: string, env: NodeJS.ProcessEnv): string;
|
|
446
|
+
/**
|
|
447
|
+
* Codex's thread index — `D11 · A`, eng review D2, Open Question 6.
|
|
448
|
+
*
|
|
449
|
+
* ⛔ **EXACTLY `state_5.sqlite`, and no glob.** Measured by VS on 2026-10-24: every
|
|
450
|
+
* column `scan` selects is in upstream's first `threads` migration (rust-v0.93.0)
|
|
451
|
+
* and none was ever dropped, but the FILE NAME carries a schema generation —
|
|
452
|
+
* `state_5` first ships in rust-v0.131.0, and from there bumps are
|
|
453
|
+
* non-destructive. A different `state_N` is therefore a store this client has not
|
|
454
|
+
* been checked against, and the adapter reports it rather than reading it.
|
|
455
|
+
*
|
|
456
|
+
* Beside `codexTranscriptRoot` and not under it, for the same reason the root
|
|
457
|
+
* sits beside Claude's: `CODEX_HOME ?? ~/.codex` is one product's fact, and the
|
|
458
|
+
* sessions directory is a child of it, not a parent.
|
|
459
|
+
*/
|
|
460
|
+
export declare function codexIndexDir(home: string, env: NodeJS.ProcessEnv): string;
|
|
461
|
+
/** The one index file name the Codex adapter accepts. See `codexIndexDir`. */
|
|
462
|
+
export declare const CODEX_INDEX_FILE = "state_5.sqlite";
|
|
463
|
+
/**
|
|
464
|
+
* Claude Code's own config file, whose `projects` map keys every folder it has
|
|
465
|
+
* been run in — `scan`'s second skip signal.
|
|
466
|
+
*
|
|
467
|
+
* `CLAUDE_CONFIG_DIR` is honoured as the other Claude paths honour it. ⚠ **That
|
|
468
|
+
* location is CARRIED, not measured**: the default `~/.claude.json` is the one
|
|
469
|
+
* this machine has. If a relocated config lives elsewhere the signal simply does
|
|
470
|
+
* not fire, which is the direction that skips less rather than more.
|
|
471
|
+
*
|
|
472
|
+
* ⚠ **The file holds far more than the map**
|
|
473
|
+
* (account and onboarding state), which is why its one reader takes the map's
|
|
474
|
+
* KEYS and nothing else, and never prints a parse error: Node 22's `JSON.parse`
|
|
475
|
+
* message quotes the text it choked on.
|
|
476
|
+
*/
|
|
477
|
+
export declare function claudeConfigPath(home: string, env: NodeJS.ProcessEnv): string;
|
|
408
478
|
export declare function codexHooksPath(home: string, env: NodeJS.ProcessEnv): string;
|
|
409
479
|
export declare function cursorHooksPath(home: string): string;
|
package/dist/paths.js
CHANGED
|
@@ -28,6 +28,31 @@ export function credentialsPath(home) {
|
|
|
28
28
|
export function projectsPath(home) {
|
|
29
29
|
return join(rootDir(home), "projects.json");
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* The slug-keyed grant list — owners, repos, exclusions and refusals. Read next to
|
|
33
|
+
* `projects.json` by `consent.ts`'s `isCaptureAllowed`, BEFORE any transcript read.
|
|
34
|
+
*/
|
|
35
|
+
export function grantsPath(home) {
|
|
36
|
+
return join(rootDir(home), "grants.json");
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* What the SERVER told this machine about the account, and the refusals a hook saw (slice 2, S4). ⛔ A separate file
|
|
40
|
+
* from `grants.json` on purpose: hooks write this one and never write `grants.json`, whose `updateGrants`
|
|
41
|
+
* read-modify-write has no lock — a hook racing `vibecommit off` could otherwise restore a turned-off repo. Written whole
|
|
42
|
+
* and atomically; read by `consent.ts`'s `isCaptureAllowed` next to `grants.json`.
|
|
43
|
+
*/
|
|
44
|
+
export function grantsAccountPath(home) {
|
|
45
|
+
return join(rootDir(home), "grants-account.json");
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Credentials `g` made and then removed from this machine whose revoke did not reach the server (slice 2, S4, R3-11): the next CLI
|
|
49
|
+
* verb retries each one. ⛔ **It holds a bearer token**, because a self-revoke is made with the credential itself and the local
|
|
50
|
+
* credential file was deleted. Mode 0600 like `credentials.json`, written atomically, CLI-only, and a row leaves it the moment the
|
|
51
|
+
* server says there is nothing left to revoke.
|
|
52
|
+
*/
|
|
53
|
+
export function pendingRevokePath(home) {
|
|
54
|
+
return join(rootDir(home), "pending-revoke.json");
|
|
55
|
+
}
|
|
31
56
|
/**
|
|
32
57
|
* The HUMAN lane's signed-in session — `CR-084d`. Mode 0600, enforced on read by
|
|
33
58
|
* the same `readSecretFile` the ingest credential goes through.
|
|
@@ -113,6 +138,29 @@ export function repoDayNoticePath(home, repoKey, day, state) {
|
|
|
113
138
|
export function machineDayNoticePath(home, day, key) {
|
|
114
139
|
return join(stateDir(home), "notices", "machine-day", sanitise(day), `${sanitise(key)}.json`);
|
|
115
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Once-per-`(machine, account epoch)` marker — slice 2, notice state 10 ("your account grants N repositories not captured on this
|
|
143
|
+
* machine yet"). The epoch is the server's version of the user's grants, so the message is spoken again only when the grants
|
|
144
|
+
* changed; a repeat per session or per day would nag about the same unchanged gap. `epoch` is a non-negative integer, `key` the state.
|
|
145
|
+
*/
|
|
146
|
+
export function machineEpochNoticePath(home, epoch, key) {
|
|
147
|
+
return join(stateDir(home), "notices", "machine-epoch", sanitise(String(epoch)), `${sanitise(key)}.json`);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Once-per-CLONE marker — 0.7.0, notices 6-8 and the `SessionStart` install record (eng review D4 · A).
|
|
151
|
+
*
|
|
152
|
+
* `cloneKey` is `src/hooks/session_start.ts`'s `cloneKey`: the git common dir PLUS the clone's oldest HEAD
|
|
153
|
+
* reflog entry, so a fresh clone at a path that used to hold another one is a different clone and gets its own
|
|
154
|
+
* notice and its own install. It is hashed here for the reason `repoDigest` hashes a repo key — `sanitise`
|
|
155
|
+
* truncates, and two deep checkouts sharing a prefix would otherwise share a marker.
|
|
156
|
+
*
|
|
157
|
+
* `clone/<digest>/<state>.json` is a third depth under `notices/`, apart from `<session>/<state>.json`,
|
|
158
|
+
* `repo-day/…` and `machine-day/…`, so no session id can resolve onto one. `state` of `installed` is the
|
|
159
|
+
* install record, which is not a notice and is kept beside them on purpose.
|
|
160
|
+
*/
|
|
161
|
+
export function cloneMarkerPath(home, cloneKey, state) {
|
|
162
|
+
return join(stateDir(home), "notices", "clone", repoDigest(cloneKey), `${sanitise(state)}.json`);
|
|
163
|
+
}
|
|
116
164
|
/**
|
|
117
165
|
* Per-`(repo, session)` send state — `CR-018`'s offset ledger, backlog and
|
|
118
166
|
* terminal stop, keyed by `CR-017d`.
|
|
@@ -510,6 +558,48 @@ export function claudeSettingsPath(home, env) {
|
|
|
510
558
|
: join(home, ".claude");
|
|
511
559
|
return join(root, "settings.json");
|
|
512
560
|
}
|
|
561
|
+
/**
|
|
562
|
+
* Codex's thread index — `D11 · A`, eng review D2, Open Question 6.
|
|
563
|
+
*
|
|
564
|
+
* ⛔ **EXACTLY `state_5.sqlite`, and no glob.** Measured by VS on 2026-10-24: every
|
|
565
|
+
* column `scan` selects is in upstream's first `threads` migration (rust-v0.93.0)
|
|
566
|
+
* and none was ever dropped, but the FILE NAME carries a schema generation —
|
|
567
|
+
* `state_5` first ships in rust-v0.131.0, and from there bumps are
|
|
568
|
+
* non-destructive. A different `state_N` is therefore a store this client has not
|
|
569
|
+
* been checked against, and the adapter reports it rather than reading it.
|
|
570
|
+
*
|
|
571
|
+
* Beside `codexTranscriptRoot` and not under it, for the same reason the root
|
|
572
|
+
* sits beside Claude's: `CODEX_HOME ?? ~/.codex` is one product's fact, and the
|
|
573
|
+
* sessions directory is a child of it, not a parent.
|
|
574
|
+
*/
|
|
575
|
+
export function codexIndexDir(home, env) {
|
|
576
|
+
const configured = env.CODEX_HOME;
|
|
577
|
+
return configured !== undefined && configured.trim() !== ""
|
|
578
|
+
? configured.trim()
|
|
579
|
+
: join(home, ".codex");
|
|
580
|
+
}
|
|
581
|
+
/** The one index file name the Codex adapter accepts. See `codexIndexDir`. */
|
|
582
|
+
export const CODEX_INDEX_FILE = "state_5.sqlite";
|
|
583
|
+
/**
|
|
584
|
+
* Claude Code's own config file, whose `projects` map keys every folder it has
|
|
585
|
+
* been run in — `scan`'s second skip signal.
|
|
586
|
+
*
|
|
587
|
+
* `CLAUDE_CONFIG_DIR` is honoured as the other Claude paths honour it. ⚠ **That
|
|
588
|
+
* location is CARRIED, not measured**: the default `~/.claude.json` is the one
|
|
589
|
+
* this machine has. If a relocated config lives elsewhere the signal simply does
|
|
590
|
+
* not fire, which is the direction that skips less rather than more.
|
|
591
|
+
*
|
|
592
|
+
* ⚠ **The file holds far more than the map**
|
|
593
|
+
* (account and onboarding state), which is why its one reader takes the map's
|
|
594
|
+
* KEYS and nothing else, and never prints a parse error: Node 22's `JSON.parse`
|
|
595
|
+
* message quotes the text it choked on.
|
|
596
|
+
*/
|
|
597
|
+
export function claudeConfigPath(home, env) {
|
|
598
|
+
const configured = env.CLAUDE_CONFIG_DIR;
|
|
599
|
+
return configured !== undefined && configured.trim() !== ""
|
|
600
|
+
? join(configured.trim(), ".claude.json")
|
|
601
|
+
: join(home, ".claude.json");
|
|
602
|
+
}
|
|
513
603
|
export function codexHooksPath(home, env) {
|
|
514
604
|
const configured = env.CODEX_HOME;
|
|
515
605
|
const root = configured !== undefined && configured.trim() !== ""
|
package/dist/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
|