@rubytech/create-maxy-code 0.1.473 → 0.1.475
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/__tests__/google-client-id-env.test.js +3 -2
- package/package.json +1 -1
- package/payload/platform/neo4j/schema.cypher +4 -1
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +29 -16
- package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
- package/payload/platform/plugins/docs/references/google-guide.md +25 -12
- package/payload/platform/plugins/docs/references/voice-mirror-guide.md +2 -2
- package/payload/platform/plugins/google/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/google/PLUGIN.md +73 -14
- package/payload/platform/plugins/google/mcp/dist/__tests__/account-audit.test.d.ts +2 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/account-audit.test.d.ts.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/account-audit.test.js +229 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/account-audit.test.js.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/account-register.test.js +9 -9
- package/payload/platform/plugins/google/mcp/dist/__tests__/account-register.test.js.map +1 -1
- package/payload/platform/plugins/google/mcp/dist/__tests__/consent-url-redirect.test.d.ts +2 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/consent-url-redirect.test.d.ts.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/consent-url-redirect.test.js +17 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/consent-url-redirect.test.js.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/loopback-listener.test.d.ts +2 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/loopback-listener.test.d.ts.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/loopback-listener.test.js +146 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/loopback-listener.test.js.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/pending-redirect.test.d.ts +2 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/pending-redirect.test.d.ts.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/pending-redirect.test.js +19 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/pending-redirect.test.js.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/register-redirect-chain.test.d.ts +2 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/register-redirect-chain.test.d.ts.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/register-redirect-chain.test.js +41 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/register-redirect-chain.test.js.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/auth/account-audit.d.ts +44 -0
- package/payload/platform/plugins/google/mcp/dist/auth/account-audit.d.ts.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/auth/account-audit.js +112 -0
- package/payload/platform/plugins/google/mcp/dist/auth/account-audit.js.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/auth/loopback-listener.d.ts +17 -0
- package/payload/platform/plugins/google/mcp/dist/auth/loopback-listener.d.ts.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/auth/loopback-listener.js +143 -0
- package/payload/platform/plugins/google/mcp/dist/auth/loopback-listener.js.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/auth/pending-store.d.ts +9 -0
- package/payload/platform/plugins/google/mcp/dist/auth/pending-store.d.ts.map +1 -1
- package/payload/platform/plugins/google/mcp/dist/auth/pending-store.js.map +1 -1
- package/payload/platform/plugins/google/mcp/dist/index.js +73 -5
- package/payload/platform/plugins/google/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/google/mcp/dist/scripts/account-audit.d.ts +2 -0
- package/payload/platform/plugins/google/mcp/dist/scripts/account-audit.d.ts.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/scripts/account-audit.js +37 -0
- package/payload/platform/plugins/google/mcp/dist/scripts/account-audit.js.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/tools/account-register.d.ts +20 -4
- package/payload/platform/plugins/google/mcp/dist/tools/account-register.d.ts.map +1 -1
- package/payload/platform/plugins/google/mcp/dist/tools/account-register.js +19 -9
- package/payload/platform/plugins/google/mcp/dist/tools/account-register.js.map +1 -1
- package/payload/platform/plugins/google/references/auth.md +331 -367
- package/payload/platform/plugins/voice-mirror/PLUGIN.md +1 -1
- package/payload/platform/plugins/voice-mirror/mcp/dist/index.js +3 -3
- package/payload/platform/plugins/voice-mirror/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/voice-mirror/mcp/dist/lib/voice-corpus.d.ts +14 -1
- package/payload/platform/plugins/voice-mirror/mcp/dist/lib/voice-corpus.d.ts.map +1 -1
- package/payload/platform/plugins/voice-mirror/mcp/dist/lib/voice-corpus.js +15 -0
- package/payload/platform/plugins/voice-mirror/mcp/dist/lib/voice-corpus.js.map +1 -1
- package/payload/platform/plugins/voice-mirror/mcp/dist/tools/voice-distil-profile.d.ts.map +1 -1
- package/payload/platform/plugins/voice-mirror/mcp/dist/tools/voice-distil-profile.js +3 -1
- package/payload/platform/plugins/voice-mirror/mcp/dist/tools/voice-distil-profile.js.map +1 -1
- package/payload/platform/plugins/voice-mirror/mcp/scripts/smoke.mjs +51 -4
- package/payload/platform/plugins/voice-mirror/skills/voice-mirror/SKILL.md +4 -0
- package/payload/platform/scripts/backfill-task-ids.sh +206 -0
- package/payload/platform/services/claude-session-manager/dist/activity-rows.d.ts +21 -3
- package/payload/platform/services/claude-session-manager/dist/activity-rows.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/activity-rows.js +6 -2
- package/payload/platform/services/claude-session-manager/dist/activity-rows.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.js +43 -5
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.d.ts +9 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.js +78 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.js.map +1 -1
- package/payload/server/public/activity.html +6 -6
- package/payload/server/public/assets/{AdminLoginScreens-B7TQZV8u.js → AdminLoginScreens-B44KbEuC.js} +1 -1
- package/payload/server/public/assets/{AdminShell-DAuri4Yh.js → AdminShell-BjxV2qkb.js} +2 -2
- package/payload/server/public/assets/{Checkbox-B1XhnhPk.js → Checkbox-DSeZNGNA.js} +1 -1
- package/payload/server/public/assets/activity-Mz1BhgB1.js +1 -0
- package/payload/server/public/assets/{admin-BdcccSb5.js → admin-B4LpTCur.js} +1 -1
- package/payload/server/public/assets/{browser-B6woQ2qX.js → browser-CEFvaWwI.js} +1 -1
- package/payload/server/public/assets/{calendar-CalCeg5T.js → calendar-B3zo6V34.js} +1 -1
- package/payload/server/public/assets/chat-5tJdo9i_.js +1 -0
- package/payload/server/public/assets/chevron-left-BJllrPBj.js +1 -0
- package/payload/server/public/assets/data-Du79EgR-.js +1 -0
- package/payload/server/public/assets/{graph-HeZaatSQ.js → graph-RaOrnSf2.js} +1 -1
- package/payload/server/public/assets/{graph-labels-4W7JuOgG.js → graph-labels-GlTEIYJj.js} +1 -1
- package/payload/server/public/assets/{maximize-2-DKx-aTPb.js → maximize-2-CHDa8p5h.js} +1 -1
- package/payload/server/public/assets/{operator-DD9L2VJM.js → operator-DtqHY4jV.js} +1 -1
- package/payload/server/public/assets/{page-tJxw0zNO.js → page-CkhFj8GQ.js} +1 -1
- package/payload/server/public/assets/{page-Ceado9Kr.js → page-DxnWgPtd.js} +1 -1
- package/payload/server/public/assets/{public-BYFWxyeC.js → public-D5TUfQ3I.js} +1 -1
- package/payload/server/public/assets/{rotate-ccw-DrzdV9h7.js → rotate-ccw-BJjVAQQY.js} +1 -1
- package/payload/server/public/assets/tasks-CM9pYYG1.js +1 -0
- package/payload/server/public/assets/{time-entry-format-Bn79w6tq.js → time-entry-format-C5RYEYjM.js} +1 -1
- package/payload/server/public/assets/{triangle-alert-CjDVh6r-.js → triangle-alert-DLfIsuo_.js} +1 -1
- package/payload/server/public/assets/{useCopyFeedback-DXHkkJw-.js → useCopyFeedback-7yKeiAzV.js} +1 -1
- package/payload/server/public/assets/{useSelectionMode-D2H8jAhE.js → useSelectionMode-CWlh6AEq.js} +1 -1
- package/payload/server/public/assets/{useSubAccountSwitcher-Br7Z6Cpu.css → useSubAccountSwitcher-B2n9QPVI.css} +1 -1
- package/payload/server/public/assets/{useVoiceRecorder-zUvPe55I.js → useVoiceRecorder-j3ZArZ2H.js} +1 -1
- package/payload/server/public/browser.html +5 -5
- package/payload/server/public/calendar.html +6 -6
- package/payload/server/public/chat.html +12 -12
- package/payload/server/public/data.html +11 -11
- package/payload/server/public/graph.html +11 -11
- package/payload/server/public/index.html +14 -14
- package/payload/server/public/operator.html +14 -14
- package/payload/server/public/public.html +12 -12
- package/payload/server/public/tasks.html +5 -5
- package/payload/server/server.js +433 -313
- package/payload/server/public/assets/activity-kRwzxEKU.js +0 -1
- package/payload/server/public/assets/chat-9s2-L06v.js +0 -1
- package/payload/server/public/assets/chevron-left-C3ho8SnB.js +0 -1
- package/payload/server/public/assets/data-Cfr-7ERI.js +0 -1
- package/payload/server/public/assets/tasks-DSwoxGzh.js +0 -1
- /package/payload/server/public/assets/{useSubAccountSwitcher-CUJpgkKI.js → useSubAccountSwitcher-CBlKgwms.js} +0 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { mkdtempSync } from "node:fs";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { newState, runAccountRegisterStart } from "../tools/account-register.js";
|
|
7
|
+
import { PendingStore } from "../auth/pending-store.js";
|
|
8
|
+
/** The consent URL, the pending entry and therefore the exchange must all
|
|
9
|
+
* carry one redirect. Google compares the exchange's value byte-for-byte
|
|
10
|
+
* against the one that issued the code, so a divergence here is the
|
|
11
|
+
* redirect_uri_mismatch that reads like a wrong client type. */
|
|
12
|
+
test("the consent URL and the pending entry carry the same redirect", async () => {
|
|
13
|
+
const dir = mkdtempSync(join(tmpdir(), "g-"));
|
|
14
|
+
const r = await runAccountRegisterStart({
|
|
15
|
+
accountId: "acct",
|
|
16
|
+
accountsDir: dir,
|
|
17
|
+
clientId: "cid",
|
|
18
|
+
state: newState(),
|
|
19
|
+
redirectUri: "http://127.0.0.1:54321",
|
|
20
|
+
});
|
|
21
|
+
assert.equal(r.status, "pending");
|
|
22
|
+
const inUrl = new URL(r.consentUrl).searchParams.get("redirect_uri");
|
|
23
|
+
const inPending = new PendingStore("acct", dir).read()?.redirectUri;
|
|
24
|
+
assert.equal(inUrl, "http://127.0.0.1:54321");
|
|
25
|
+
assert.equal(inPending, "http://127.0.0.1:54321");
|
|
26
|
+
assert.equal(inUrl, inPending);
|
|
27
|
+
});
|
|
28
|
+
test("the state minted by the caller is the state persisted and sent", async () => {
|
|
29
|
+
const dir = mkdtempSync(join(tmpdir(), "g-"));
|
|
30
|
+
const state = newState();
|
|
31
|
+
const r = await runAccountRegisterStart({
|
|
32
|
+
accountId: "acct",
|
|
33
|
+
accountsDir: dir,
|
|
34
|
+
clientId: "cid",
|
|
35
|
+
state,
|
|
36
|
+
redirectUri: "http://127.0.0.1:1234",
|
|
37
|
+
});
|
|
38
|
+
assert.equal(new URL(r.consentUrl).searchParams.get("state"), state);
|
|
39
|
+
assert.equal(new PendingStore("acct", dir).read()?.state, state);
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=register-redirect-chain.test.js.map
|
package/payload/platform/plugins/google/mcp/dist/__tests__/register-redirect-chain.test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-redirect-chain.test.js","sourceRoot":"","sources":["../../src/__tests__/register-redirect-chain.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD;;;iEAGiE;AACjE,IAAI,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;IAC/E,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,MAAM,uBAAuB,CAAC;QACtC,SAAS,EAAE,MAAM;QACjB,WAAW,EAAE,GAAG;QAChB,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,QAAQ,EAAE;QACjB,WAAW,EAAE,wBAAwB;KACtC,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,UAAW,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC;IACpE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;IAChF,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,CAAC,GAAG,MAAM,uBAAuB,CAAC;QACtC,SAAS,EAAE,MAAM;QACjB,WAAW,EAAE,GAAG;QAChB,QAAQ,EAAE,KAAK;QACf,KAAK;QACL,WAAW,EAAE,uBAAuB;KACrC,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAW,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IACtE,MAAM,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACnE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type TokenBlob } from "./token-store.js";
|
|
2
|
+
/** Google revokes a refresh token after six months without use. */
|
|
3
|
+
export declare const REFRESH_INACTIVITY_LIMIT_DAYS = 180;
|
|
4
|
+
/** How much of the inactivity clock must remain before an account is merely
|
|
5
|
+
* `ok`. Thirty days is the window in which an operator can still act. */
|
|
6
|
+
export declare const REFRESH_EXPIRING_THRESHOLD_DAYS = 30;
|
|
7
|
+
export type RefreshStatus = "ok" | "expiring" | "expired";
|
|
8
|
+
export interface AccountAuditRow {
|
|
9
|
+
accountId: string;
|
|
10
|
+
email: string;
|
|
11
|
+
refreshTtlDays: number;
|
|
12
|
+
status: RefreshStatus;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Classify one token blob against the inactivity clock.
|
|
16
|
+
*
|
|
17
|
+
* A blob holding NO refresh token is `expired` with zero days regardless of how
|
|
18
|
+
* recently it was written: it works until the access token lapses, about an hour
|
|
19
|
+
* out, and then dies. Reporting it as `ok` because `lastRefresh` is recent would
|
|
20
|
+
* be precisely the false all-clear this audit exists to prevent.
|
|
21
|
+
*/
|
|
22
|
+
export declare function classifyRefresh(blob: TokenBlob, nowMs: number): {
|
|
23
|
+
refreshTtlDays: number;
|
|
24
|
+
status: RefreshStatus;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Every connected Google account under every account, classified.
|
|
28
|
+
*
|
|
29
|
+
* An unreadable blob is skipped rather than thrown: one corrupt store must never
|
|
30
|
+
* blind the audit to every other account. It is not reported as a row because it
|
|
31
|
+
* has no TTL to report — `google-account-list` is the surface that already
|
|
32
|
+
* distinguishes `unreadable` from healthy.
|
|
33
|
+
*/
|
|
34
|
+
export declare function auditConnectedAccounts(accountsDir: string, nowMs: number): AccountAuditRow[];
|
|
35
|
+
/**
|
|
36
|
+
* One audit cycle: a line per connected account, then a heartbeat.
|
|
37
|
+
*
|
|
38
|
+
* The heartbeat fires on EVERY cycle, including cycles that find nothing. An
|
|
39
|
+
* audit that has stopped running would otherwise be indistinguishable from an
|
|
40
|
+
* audit reporting all-clear, and the standing absence of this line over more
|
|
41
|
+
* than one interval is the documented signal that the audit is not running.
|
|
42
|
+
*/
|
|
43
|
+
export declare function runAccountAudit(accountsDir: string, nowMs: number, emit: (line: string) => void): AccountAuditRow[];
|
|
44
|
+
//# sourceMappingURL=account-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-audit.d.ts","sourceRoot":"","sources":["../../src/auth/account-audit.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE9D,mEAAmE;AACnE,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAEjD;0EAC0E;AAC1E,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAMlD,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,UAAU,GAAG,SAAS,CAAC;AAW1D,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,MAAM,GACZ;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAWnD;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE,CAkB5F;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC3B,eAAe,EAAE,CAYnB"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standing refresh-token audit (Task 1773).
|
|
3
|
+
*
|
|
4
|
+
* A connected account's refresh token expiring emits no event and does not
|
|
5
|
+
* reproduce on demand: nothing touches the account, it simply stops working at
|
|
6
|
+
* some future date. Without a periodic reconciliation, "which connected accounts
|
|
7
|
+
* are close to falling off?" is unanswerable without reading every token store by
|
|
8
|
+
* hand. This module is that reconciliation.
|
|
9
|
+
*
|
|
10
|
+
* WHAT `refreshTtlDays` MEANS. Google issues no expiry for a refresh token and
|
|
11
|
+
* the stored blob holds none — `TokenBlob` carries `accessTokenExpiry` and
|
|
12
|
+
* `lastRefresh`, nothing more. The one bounded, locally-computable clock is
|
|
13
|
+
* Google's six-month INACTIVITY revocation: a refresh token unused for 180 days
|
|
14
|
+
* is revoked. So `refreshTtlDays` is days remaining on that inactivity clock,
|
|
15
|
+
* measured from `lastRefresh`. It is NOT a expiry Google published, and it does
|
|
16
|
+
* not predict the other revocation causes (the user revoking access, a password
|
|
17
|
+
* change, or the app being unpublished), none of which are locally observable.
|
|
18
|
+
*
|
|
19
|
+
* Runs against local stores only — no network. It reads what is on disk and
|
|
20
|
+
* classifies it, so it cannot itself break a working connection.
|
|
21
|
+
*/
|
|
22
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
23
|
+
import { join } from "node:path";
|
|
24
|
+
import { TokenStore } from "./token-store.js";
|
|
25
|
+
/** Google revokes a refresh token after six months without use. */
|
|
26
|
+
export const REFRESH_INACTIVITY_LIMIT_DAYS = 180;
|
|
27
|
+
/** How much of the inactivity clock must remain before an account is merely
|
|
28
|
+
* `ok`. Thirty days is the window in which an operator can still act. */
|
|
29
|
+
export const REFRESH_EXPIRING_THRESHOLD_DAYS = 30;
|
|
30
|
+
const DAY_MS = 86_400_000;
|
|
31
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
32
|
+
/** The audit line is space-delimited `k=v`, so a value carrying whitespace would
|
|
33
|
+
* split into bogus fields and a reader would mis-parse the record for exactly
|
|
34
|
+
* the account most likely to need attention. The directory name is already
|
|
35
|
+
* folded by `sanitizeAccountKey`, but `blob.email` comes from Google's
|
|
36
|
+
* primary-calendar id and is never sanitized on the way in. */
|
|
37
|
+
function logSafe(value) {
|
|
38
|
+
return value.replace(/\s+/g, "_");
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Classify one token blob against the inactivity clock.
|
|
42
|
+
*
|
|
43
|
+
* A blob holding NO refresh token is `expired` with zero days regardless of how
|
|
44
|
+
* recently it was written: it works until the access token lapses, about an hour
|
|
45
|
+
* out, and then dies. Reporting it as `ok` because `lastRefresh` is recent would
|
|
46
|
+
* be precisely the false all-clear this audit exists to prevent.
|
|
47
|
+
*/
|
|
48
|
+
export function classifyRefresh(blob, nowMs) {
|
|
49
|
+
if (blob.refreshToken === null)
|
|
50
|
+
return { refreshTtlDays: 0, status: "expired" };
|
|
51
|
+
// Clamp idleDays at 0 so a lastRefresh in the future — a device whose clock ran
|
|
52
|
+
// ahead, or a blob restored from a host whose clock did — cannot report more
|
|
53
|
+
// days remaining than the limit this module documents as the maximum.
|
|
54
|
+
// `PendingStore.ageSec` clamps its analogous value for the same reason.
|
|
55
|
+
const idleDays = Math.max(0, Math.floor((nowMs - blob.lastRefresh) / DAY_MS));
|
|
56
|
+
const refreshTtlDays = REFRESH_INACTIVITY_LIMIT_DAYS - idleDays;
|
|
57
|
+
if (refreshTtlDays <= 0)
|
|
58
|
+
return { refreshTtlDays, status: "expired" };
|
|
59
|
+
if (refreshTtlDays <= REFRESH_EXPIRING_THRESHOLD_DAYS)
|
|
60
|
+
return { refreshTtlDays, status: "expiring" };
|
|
61
|
+
return { refreshTtlDays, status: "ok" };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Every connected Google account under every account, classified.
|
|
65
|
+
*
|
|
66
|
+
* An unreadable blob is skipped rather than thrown: one corrupt store must never
|
|
67
|
+
* blind the audit to every other account. It is not reported as a row because it
|
|
68
|
+
* has no TTL to report — `google-account-list` is the surface that already
|
|
69
|
+
* distinguishes `unreadable` from healthy.
|
|
70
|
+
*/
|
|
71
|
+
export function auditConnectedAccounts(accountsDir, nowMs) {
|
|
72
|
+
if (!existsSync(accountsDir))
|
|
73
|
+
return [];
|
|
74
|
+
const rows = [];
|
|
75
|
+
for (const accountId of readdirSync(accountsDir)) {
|
|
76
|
+
if (!UUID_RE.test(accountId))
|
|
77
|
+
continue;
|
|
78
|
+
const connectedDir = join(accountsDir, accountId, "secrets", "google", "accounts");
|
|
79
|
+
if (!existsSync(connectedDir))
|
|
80
|
+
continue;
|
|
81
|
+
for (const key of readdirSync(connectedDir)) {
|
|
82
|
+
try {
|
|
83
|
+
const blob = new TokenStore(accountId, accountsDir, key).read();
|
|
84
|
+
if (!blob)
|
|
85
|
+
continue;
|
|
86
|
+
rows.push({ accountId, email: logSafe(blob.email ?? key), ...classifyRefresh(blob, nowMs) });
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
/* unreadable store — skip, never blind the whole scan */
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return rows;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* One audit cycle: a line per connected account, then a heartbeat.
|
|
97
|
+
*
|
|
98
|
+
* The heartbeat fires on EVERY cycle, including cycles that find nothing. An
|
|
99
|
+
* audit that has stopped running would otherwise be indistinguishable from an
|
|
100
|
+
* audit reporting all-clear, and the standing absence of this line over more
|
|
101
|
+
* than one interval is the documented signal that the audit is not running.
|
|
102
|
+
*/
|
|
103
|
+
export function runAccountAudit(accountsDir, nowMs, emit) {
|
|
104
|
+
const rows = auditConnectedAccounts(accountsDir, nowMs);
|
|
105
|
+
for (const r of rows) {
|
|
106
|
+
emit(`[google-account-audit] account=${r.accountId} email=${r.email} refreshTtlDays=${r.refreshTtlDays} status=${r.status}`);
|
|
107
|
+
}
|
|
108
|
+
const count = (s) => rows.filter((r) => r.status === s).length;
|
|
109
|
+
emit(`[google-account-audit] op=heartbeat accounts=${rows.length} ok=${count("ok")} expiring=${count("expiring")} expired=${count("expired")}`);
|
|
110
|
+
return rows;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=account-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-audit.js","sourceRoot":"","sources":["../../src/auth/account-audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface LoopbackListener {
|
|
2
|
+
readonly redirectUri: string;
|
|
3
|
+
readonly port: number;
|
|
4
|
+
close(reason: string): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
/** Resolves null when the bind fails, so the caller falls back to the fixed
|
|
7
|
+
* redirect and the paste path still completes the registration. A refusal
|
|
8
|
+
* here would turn an optimisation into a regression on any install that
|
|
9
|
+
* cannot bind. */
|
|
10
|
+
export declare function startLoopbackListener(args: {
|
|
11
|
+
accountId: string;
|
|
12
|
+
state: string;
|
|
13
|
+
onCode: (code: string) => Promise<{
|
|
14
|
+
email: string;
|
|
15
|
+
}>;
|
|
16
|
+
}): Promise<LoopbackListener | null>;
|
|
17
|
+
//# sourceMappingURL=loopback-listener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loopback-listener.d.ts","sourceRoot":"","sources":["../../src/auth/loopback-listener.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AA0BD;;;mBAGmB;AACnB,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA6HnC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single-shot loopback listener for the Desktop-client consent redirect.
|
|
3
|
+
*
|
|
4
|
+
* Bound to 127.0.0.1 on an OS-assigned port. RFC 8252 §7.3 makes the port
|
|
5
|
+
* irrelevant when Google matches a loopback redirect, so binding :0 costs
|
|
6
|
+
* nothing and avoids the contention two co-resident brands would have on a
|
|
7
|
+
* fixed port. The IP literal is mandatory — that port-agnostic matching does
|
|
8
|
+
* NOT extend to the hostname `localhost`.
|
|
9
|
+
*
|
|
10
|
+
* This is reached only when consent happens on the install's own host. When
|
|
11
|
+
* the user consents on a phone, nothing reaches it and the paste path
|
|
12
|
+
* completes the registration instead. That is the designed cross-device route,
|
|
13
|
+
* not a failure of this listener.
|
|
14
|
+
*
|
|
15
|
+
* The module knows nothing about Google or tokens: it captures a code,
|
|
16
|
+
* verifies `state`, hands off, renders, and closes.
|
|
17
|
+
*/
|
|
18
|
+
import { createServer } from "node:http";
|
|
19
|
+
import { log } from "../lib/log.js";
|
|
20
|
+
function escapeHtml(s) {
|
|
21
|
+
return s
|
|
22
|
+
.replace(/&/g, "&")
|
|
23
|
+
.replace(/</g, "<")
|
|
24
|
+
.replace(/>/g, ">")
|
|
25
|
+
.replace(/"/g, """);
|
|
26
|
+
}
|
|
27
|
+
/** The URL of these responses carries an authorization code. RFC 8252 §8.1
|
|
28
|
+
* wants it kept out of caches and out of any Referer. The page is
|
|
29
|
+
* self-contained today so no request can carry one, but a later edit adding a
|
|
30
|
+
* link or an image would turn that into a code leak. */
|
|
31
|
+
const HEADERS = {
|
|
32
|
+
"content-type": "text/html",
|
|
33
|
+
"cache-control": "no-store",
|
|
34
|
+
"referrer-policy": "no-referrer",
|
|
35
|
+
};
|
|
36
|
+
function page(title, body) {
|
|
37
|
+
return `<!doctype html><html><head><meta charset="utf-8"><title>${title}</title>
|
|
38
|
+
<style>body{font-family:system-ui,sans-serif;max-width:34rem;margin:4rem auto;padding:0 1rem;line-height:1.5}
|
|
39
|
+
h1{font-size:1.3rem}</style></head><body><h1>${title}</h1>${body}</body></html>`;
|
|
40
|
+
}
|
|
41
|
+
/** Resolves null when the bind fails, so the caller falls back to the fixed
|
|
42
|
+
* redirect and the paste path still completes the registration. A refusal
|
|
43
|
+
* here would turn an optimisation into a regression on any install that
|
|
44
|
+
* cannot bind. */
|
|
45
|
+
export async function startLoopbackListener(args) {
|
|
46
|
+
const server = createServer();
|
|
47
|
+
const port = await new Promise((resolve) => {
|
|
48
|
+
server.once("error", (err) => {
|
|
49
|
+
log({
|
|
50
|
+
tag: "[google-oauth]",
|
|
51
|
+
op: "listen-failed",
|
|
52
|
+
account: args.accountId,
|
|
53
|
+
reg: args.state,
|
|
54
|
+
reason: err.code ?? err.message,
|
|
55
|
+
});
|
|
56
|
+
resolve(null);
|
|
57
|
+
});
|
|
58
|
+
server.listen(0, "127.0.0.1", () => {
|
|
59
|
+
const addr = server.address();
|
|
60
|
+
resolve(typeof addr === "object" && addr !== null ? addr.port : null);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
if (port === null)
|
|
64
|
+
return null;
|
|
65
|
+
const redirectUri = `http://127.0.0.1:${port}`;
|
|
66
|
+
let closed = false;
|
|
67
|
+
const close = (reason) => new Promise((resolve) => {
|
|
68
|
+
if (closed)
|
|
69
|
+
return resolve();
|
|
70
|
+
closed = true;
|
|
71
|
+
server.close(() => {
|
|
72
|
+
log({ tag: "[google-oauth]", op: "close", reg: args.state, account: args.accountId, reason });
|
|
73
|
+
resolve();
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
/** Single-shot is enforced at accept time, not by closing after the
|
|
77
|
+
* exchange. `server.close()` stops new connections but the socket keeps
|
|
78
|
+
* accepting until the in-flight response ends, so a browser reload during
|
|
79
|
+
* the ~1s exchange would otherwise call `onCode` twice with the same code
|
|
80
|
+
* and paint `invalid_grant` over a connection that had just succeeded. */
|
|
81
|
+
let consumed = false;
|
|
82
|
+
server.on("request", (req, res) => {
|
|
83
|
+
const url = new URL(req.url ?? "/", redirectUri);
|
|
84
|
+
const state = url.searchParams.get("state");
|
|
85
|
+
const code = url.searchParams.get("code");
|
|
86
|
+
const denied = url.searchParams.get("error");
|
|
87
|
+
const matched = state === args.state;
|
|
88
|
+
log({
|
|
89
|
+
tag: "[google-oauth]",
|
|
90
|
+
op: "callback",
|
|
91
|
+
reg: args.state,
|
|
92
|
+
account: args.accountId,
|
|
93
|
+
"state-match": matched ? "true" : "false",
|
|
94
|
+
...(denied ? { error: denied } : {}),
|
|
95
|
+
});
|
|
96
|
+
if (consumed) {
|
|
97
|
+
res.writeHead(409, HEADERS);
|
|
98
|
+
res.end(page("Already handled", "<p>This link has already been used. Check the chat for the result.</p>"));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// A cancelled consent arrives with `error=access_denied` and no code, and
|
|
102
|
+
// its state matches. Reporting that as a mismatched link would contradict
|
|
103
|
+
// the log line and misdescribe what the user did.
|
|
104
|
+
if (matched && denied) {
|
|
105
|
+
consumed = true;
|
|
106
|
+
res.writeHead(400, HEADERS);
|
|
107
|
+
res.end(page("Consent was not granted", `<p>Google reported <code>${escapeHtml(denied)}</code>. Nothing was connected. Start again from the chat if that was not deliberate.</p>`));
|
|
108
|
+
void close("denied");
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (!matched || !code) {
|
|
112
|
+
res.writeHead(400, HEADERS);
|
|
113
|
+
res.end(page("That link did not match", "<p>This page was opened with a link that does not match the connection in progress. Start again from the chat.</p>"));
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
consumed = true;
|
|
117
|
+
void args
|
|
118
|
+
.onCode(code)
|
|
119
|
+
.then(({ email }) => {
|
|
120
|
+
res.writeHead(200, HEADERS);
|
|
121
|
+
res.end(page(`Connected ${escapeHtml(email)}`, "<p>Your calendar is connected. Return to the chat and say you're done.</p>"));
|
|
122
|
+
})
|
|
123
|
+
.catch((err) => {
|
|
124
|
+
// Never claim success on a failed exchange, and never swallow Google's
|
|
125
|
+
// own words: invalid_grant means expired or reused, and the operator
|
|
126
|
+
// needs to read that rather than a generic apology.
|
|
127
|
+
res.writeHead(400, HEADERS);
|
|
128
|
+
res.end(page("Could not finish connecting", `<p>${escapeHtml(err.message)}</p><p>Return to the chat and try again.</p>`));
|
|
129
|
+
})
|
|
130
|
+
// Writing the response can itself throw — a socket Node destroyed at
|
|
131
|
+
// requestTimeout makes the catch branch's writeHead raise
|
|
132
|
+
// ERR_HTTP_HEADERS_SENT. Without this the rejection is unhandled, which
|
|
133
|
+
// under Node's default takes the whole MCP server down.
|
|
134
|
+
.catch(() => {
|
|
135
|
+
if (!res.writableEnded)
|
|
136
|
+
res.destroy();
|
|
137
|
+
})
|
|
138
|
+
.finally(() => void close("exchanged"));
|
|
139
|
+
});
|
|
140
|
+
log({ tag: "[google-oauth]", op: "listen", account: args.accountId, reg: args.state, port });
|
|
141
|
+
return { redirectUri, port, close };
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=loopback-listener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loopback-listener.js","sourceRoot":"","sources":["../../src/auth/loopback-listener.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,15 @@ export interface PendingOAuth {
|
|
|
2
2
|
state: string;
|
|
3
3
|
verifier: string;
|
|
4
4
|
createdAt: number;
|
|
5
|
+
/** The redirect_uri the consent URL carried. Google compares the exchange's
|
|
6
|
+
* redirect_uri byte-for-byte against it, and since Task 1799 the port is
|
|
7
|
+
* whatever the loopback listener bound, so the constant can no longer be
|
|
8
|
+
* assumed.
|
|
9
|
+
*
|
|
10
|
+
* Optional because an entry written before 1799 carries no such field and
|
|
11
|
+
* may still be mid-flight across an upgrade; readers fall back to the fixed
|
|
12
|
+
* loopback constant for those. */
|
|
13
|
+
redirectUri?: string;
|
|
5
14
|
}
|
|
6
15
|
export declare class PendingStore {
|
|
7
16
|
readonly accountId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pending-store.d.ts","sourceRoot":"","sources":["../../src/auth/pending-store.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"pending-store.d.ts","sourceRoot":"","sources":["../../src/auth/pending-store.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;;uCAOmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,YAAY;IAOrB,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM;IAP9B,OAAO,CAAC,GAAG,CAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAGtB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM;IAO9B,wDAAwD;IACxD,OAAO,CAAC,OAAO;IAcf,KAAK,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI;IAoB5B,IAAI,IAAI,YAAY,GAAG,IAAI;IAS3B,KAAK,IAAI,IAAI;IAIb;;;gFAG4E;IAC5E,MAAM,IAAI,MAAM,GAAG,IAAI;CAIxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pending-store.js","sourceRoot":"","sources":["../../src/auth/pending-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,YAAY,EACZ,UAAU,EACV,MAAM,EACN,QAAQ,EACR,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"pending-store.js","sourceRoot":"","sources":["../../src/auth/pending-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,7 +31,9 @@ import { resolve } from "node:path";
|
|
|
31
31
|
import { z } from "zod";
|
|
32
32
|
import { TokenStore } from "./auth/token-store.js";
|
|
33
33
|
import { log } from "./lib/log.js";
|
|
34
|
-
import { runAccountRegisterStart, runAccountRegisterPoll, runAccountRegisterSubmit, listConnected, } from "./tools/account-register.js";
|
|
34
|
+
import { runAccountRegisterStart, runAccountRegisterPoll, runAccountRegisterSubmit, listConnected, newState, LOOPBACK_REDIRECT_URI, PENDING_LIFETIME_SEC, } from "./tools/account-register.js";
|
|
35
|
+
import { startLoopbackListener } from "./auth/loopback-listener.js";
|
|
36
|
+
import { PendingStore } from "./auth/pending-store.js";
|
|
35
37
|
import { runCalendarList } from "./tools/calendar-list.js";
|
|
36
38
|
import { runCalendarEvent } from "./tools/calendar-event.js";
|
|
37
39
|
import { runCalendarCreate } from "./tools/calendar-create.js";
|
|
@@ -42,6 +44,11 @@ import { runCalendarFreebusy } from "./tools/calendar-freebusy.js";
|
|
|
42
44
|
import { runAccountInfo } from "./tools/account-info.js";
|
|
43
45
|
import { runAccountList } from "./tools/account-list.js";
|
|
44
46
|
import { lifelineTool } from "../../../../lib/mcp-lifeline/dist/index.js";
|
|
47
|
+
/** Module scope, not request scope: a listener must outlive the register tool
|
|
48
|
+
* call so the consenting browser can still reach it minutes later. The MCP
|
|
49
|
+
* server is long-lived per session (StdioServerTransport below), so this map
|
|
50
|
+
* persists across tool calls. One live listener per account. */
|
|
51
|
+
const listeners = new Map();
|
|
45
52
|
// Plugin-system boot tolerance — see Task 202. Module init must never exit;
|
|
46
53
|
// the plugin-system spawn enumerates tools/list before any per-account env is
|
|
47
54
|
// set. Per-call refusal preserves isolation without emptying the registry.
|
|
@@ -126,17 +133,69 @@ function getConfig(account) {
|
|
|
126
133
|
};
|
|
127
134
|
}
|
|
128
135
|
const server = new McpServer({ name: "google", version: "0.1.0" });
|
|
129
|
-
lifelineTool(server, "google-account-register", "Start connecting a Google Calendar for this account. Returns a consent URL — relay it to the user, who opens it on any device, signs in and approves.
|
|
136
|
+
lifelineTool(server, "google-account-register", "Start connecting a Google Calendar for this account. Returns a consent URL — relay it to the user, who opens it on any device, signs in and approves. If they approve ON THIS MACHINE the connection completes by itself and their browser confirms it; ask them to say so and then call google-account-register-poll. If they approve on another device (a phone), their browser lands on a page that FAILS TO LOAD; that is expected, and they should copy the whole address-bar URL and pass it to google-account-register-submit. Does NOT block. Refuses while another registration is already live.", {}, async () => {
|
|
130
137
|
if (!ACCOUNT_ID)
|
|
131
138
|
return refuseNoAccount("google-account-register");
|
|
132
139
|
try {
|
|
133
140
|
if (!GOOGLE_CLIENT_ID || !GOOGLE_CLIENT_SECRET) {
|
|
134
141
|
return fail("This brand ships no Google vendor app; google tools are inert until one is provisioned.");
|
|
135
142
|
}
|
|
143
|
+
const accountId = ACCOUNT_ID;
|
|
144
|
+
// A refusal must stay side-effect free. Binding first and asking after
|
|
145
|
+
// would, on any retry inside the pending window, close the listener the
|
|
146
|
+
// user's live consent URL points at and strand a second one whose state
|
|
147
|
+
// appears in no URL — re-creating the dead loopback this tool exists to
|
|
148
|
+
// remove, triggered by an ordinary "try that again".
|
|
149
|
+
const live = new PendingStore(accountId, ACCOUNTS_DIR).ageSec();
|
|
150
|
+
if (live !== null && live < PENDING_LIFETIME_SEC) {
|
|
151
|
+
return ok(await runAccountRegisterStart({
|
|
152
|
+
accountId,
|
|
153
|
+
accountsDir: ACCOUNTS_DIR,
|
|
154
|
+
clientId: GOOGLE_CLIENT_ID,
|
|
155
|
+
state: newState(),
|
|
156
|
+
redirectUri: LOOPBACK_REDIRECT_URI,
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
// State is minted here so the listener can be started with it before the
|
|
160
|
+
// consent URL exists; the listener verifies it on the callback.
|
|
161
|
+
const state = newState();
|
|
162
|
+
const prior = listeners.get(accountId);
|
|
163
|
+
if (prior) {
|
|
164
|
+
await prior.close("superseded");
|
|
165
|
+
listeners.delete(accountId);
|
|
166
|
+
}
|
|
167
|
+
const listener = await startLoopbackListener({
|
|
168
|
+
accountId,
|
|
169
|
+
state,
|
|
170
|
+
onCode: async (code) => {
|
|
171
|
+
try {
|
|
172
|
+
const done = await runAccountRegisterSubmit({
|
|
173
|
+
accountId,
|
|
174
|
+
accountsDir: ACCOUNTS_DIR,
|
|
175
|
+
clientId: GOOGLE_CLIENT_ID,
|
|
176
|
+
clientSecret: GOOGLE_CLIENT_SECRET,
|
|
177
|
+
code,
|
|
178
|
+
});
|
|
179
|
+
return { email: done.email };
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
// Drop the entry on failure too, so `listeners.has(id)` keeps
|
|
183
|
+
// meaning "a listener is live" — the server is closed either way.
|
|
184
|
+
listeners.delete(accountId);
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
if (listener)
|
|
189
|
+
listeners.set(accountId, listener);
|
|
136
190
|
const res = await runAccountRegisterStart({
|
|
137
|
-
accountId
|
|
191
|
+
accountId,
|
|
138
192
|
accountsDir: ACCOUNTS_DIR,
|
|
139
193
|
clientId: GOOGLE_CLIENT_ID,
|
|
194
|
+
state,
|
|
195
|
+
// Bind failure is not fatal: the consent URL still issues against the
|
|
196
|
+
// fixed loopback, nothing binds it, and the paste path completes the
|
|
197
|
+
// registration exactly as it did before this listener existed.
|
|
198
|
+
redirectUri: listener?.redirectUri ?? LOOPBACK_REDIRECT_URI,
|
|
140
199
|
});
|
|
141
200
|
return ok(res);
|
|
142
201
|
}
|
|
@@ -283,13 +342,22 @@ lifelineTool(server, "google-account-register-submit", "Finish connecting a Goog
|
|
|
283
342
|
if (!GOOGLE_CLIENT_ID || !GOOGLE_CLIENT_SECRET) {
|
|
284
343
|
return fail("This brand ships no Google vendor app; google tools are inert until one is provisioned.");
|
|
285
344
|
}
|
|
286
|
-
|
|
345
|
+
const res = await runAccountRegisterSubmit({
|
|
287
346
|
accountId: ACCOUNT_ID,
|
|
288
347
|
accountsDir: ACCOUNTS_DIR,
|
|
289
348
|
clientId: GOOGLE_CLIENT_ID,
|
|
290
349
|
clientSecret: GOOGLE_CLIENT_SECRET,
|
|
291
350
|
code,
|
|
292
|
-
})
|
|
351
|
+
});
|
|
352
|
+
// The paste path won the race. The listener for this registration can
|
|
353
|
+
// never fire now — its pending entry is cleared — so release its port
|
|
354
|
+
// rather than leaving it bound until the process exits.
|
|
355
|
+
const held = listeners.get(ACCOUNT_ID);
|
|
356
|
+
if (held) {
|
|
357
|
+
await held.close("exchanged-by-paste");
|
|
358
|
+
listeners.delete(ACCOUNT_ID);
|
|
359
|
+
}
|
|
360
|
+
return ok(res);
|
|
293
361
|
}
|
|
294
362
|
catch (err) {
|
|
295
363
|
return fail(`google-account-register-submit failed: ${err.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-audit.d.ts","sourceRoot":"","sources":["../../src/scripts/account-audit.ts"],"names":[],"mappings":""}
|