@kaitranntt/ccs 7.77.1 → 7.78.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 +2 -1
- package/dist/auth/account-profile-diagnostics.d.ts +21 -0
- package/dist/auth/account-profile-diagnostics.d.ts.map +1 -0
- package/dist/auth/account-profile-diagnostics.js +130 -0
- package/dist/auth/account-profile-diagnostics.js.map +1 -0
- package/dist/auth/auth-commands.d.ts +2 -1
- package/dist/auth/auth-commands.d.ts.map +1 -1
- package/dist/auth/auth-commands.js +30 -12
- package/dist/auth/auth-commands.js.map +1 -1
- package/dist/auth/commands/backup-command.d.ts.map +1 -1
- package/dist/auth/commands/backup-command.js +7 -2
- package/dist/auth/commands/backup-command.js.map +1 -1
- package/dist/auth/commands/create-command.d.ts.map +1 -1
- package/dist/auth/commands/create-command.js +20 -16
- package/dist/auth/commands/create-command.js.map +1 -1
- package/dist/auth/commands/default-command.d.ts +1 -1
- package/dist/auth/commands/default-command.d.ts.map +1 -1
- package/dist/auth/commands/default-command.js +10 -2
- package/dist/auth/commands/default-command.js.map +1 -1
- package/dist/auth/commands/index.d.ts +1 -0
- package/dist/auth/commands/index.d.ts.map +1 -1
- package/dist/auth/commands/index.js +3 -1
- package/dist/auth/commands/index.js.map +1 -1
- package/dist/auth/commands/list-command.d.ts.map +1 -1
- package/dist/auth/commands/list-command.js +16 -3
- package/dist/auth/commands/list-command.js.map +1 -1
- package/dist/auth/commands/remove-command.d.ts.map +1 -1
- package/dist/auth/commands/remove-command.js +5 -1
- package/dist/auth/commands/remove-command.js.map +1 -1
- package/dist/auth/commands/resources-command.d.ts +3 -0
- package/dist/auth/commands/resources-command.d.ts.map +1 -0
- package/dist/auth/commands/resources-command.js +115 -0
- package/dist/auth/commands/resources-command.js.map +1 -0
- package/dist/auth/commands/show-command.d.ts.map +1 -1
- package/dist/auth/commands/show-command.js +54 -3
- package/dist/auth/commands/show-command.js.map +1 -1
- package/dist/auth/commands/types.d.ts +31 -1
- package/dist/auth/commands/types.d.ts.map +1 -1
- package/dist/auth/commands/types.js +41 -2
- package/dist/auth/commands/types.js.map +1 -1
- package/dist/auth/profile-continuity-inheritance.d.ts.map +1 -1
- package/dist/auth/profile-continuity-inheritance.js +2 -1
- package/dist/auth/profile-continuity-inheritance.js.map +1 -1
- package/dist/auth/profile-detector.d.ts.map +1 -1
- package/dist/auth/profile-detector.js +1 -0
- package/dist/auth/profile-detector.js.map +1 -1
- package/dist/auth/profile-registry.d.ts +2 -0
- package/dist/auth/profile-registry.d.ts.map +1 -1
- package/dist/auth/profile-registry.js +6 -2
- package/dist/auth/profile-registry.js.map +1 -1
- package/dist/auth/shared-resource-policy.d.ts +20 -0
- package/dist/auth/shared-resource-policy.d.ts.map +1 -0
- package/dist/auth/shared-resource-policy.js +69 -0
- package/dist/auth/shared-resource-policy.js.map +1 -0
- package/dist/ccs.js +1 -1
- package/dist/ccs.js.map +1 -1
- package/dist/cliproxy/ai-providers/codex-plan-compatibility.d.ts.map +1 -1
- package/dist/cliproxy/ai-providers/codex-plan-compatibility.js +2 -2
- package/dist/cliproxy/ai-providers/codex-plan-compatibility.js.map +1 -1
- package/dist/cliproxy/ai-providers/codex-reasoning-proxy.d.ts +8 -2
- package/dist/cliproxy/ai-providers/codex-reasoning-proxy.d.ts.map +1 -1
- package/dist/cliproxy/ai-providers/codex-reasoning-proxy.js +82 -33
- package/dist/cliproxy/ai-providers/codex-reasoning-proxy.js.map +1 -1
- package/dist/cliproxy/ai-providers/model-id-normalizer.d.ts +1 -1
- package/dist/cliproxy/ai-providers/model-id-normalizer.d.ts.map +1 -1
- package/dist/cliproxy/ai-providers/model-id-normalizer.js +28 -11
- package/dist/cliproxy/ai-providers/model-id-normalizer.js.map +1 -1
- package/dist/cliproxy/auth/oauth-handler.d.ts +39 -1
- package/dist/cliproxy/auth/oauth-handler.d.ts.map +1 -1
- package/dist/cliproxy/auth/oauth-handler.js +116 -1
- package/dist/cliproxy/auth/oauth-handler.js.map +1 -1
- package/dist/cliproxy/auth/oauth-process.d.ts.map +1 -1
- package/dist/cliproxy/auth/oauth-process.js +94 -3
- package/dist/cliproxy/auth/oauth-process.js.map +1 -1
- package/dist/cliproxy/auth/oauth-trace/diagnose-failure.d.ts +24 -0
- package/dist/cliproxy/auth/oauth-trace/diagnose-failure.d.ts.map +1 -0
- package/dist/cliproxy/auth/oauth-trace/diagnose-failure.js +159 -0
- package/dist/cliproxy/auth/oauth-trace/diagnose-failure.js.map +1 -0
- package/dist/cliproxy/auth/oauth-trace/index.d.ts +4 -0
- package/dist/cliproxy/auth/oauth-trace/index.d.ts.map +1 -0
- package/dist/cliproxy/auth/oauth-trace/index.js +14 -0
- package/dist/cliproxy/auth/oauth-trace/index.js.map +1 -0
- package/dist/cliproxy/auth/oauth-trace/redactor.d.ts +22 -0
- package/dist/cliproxy/auth/oauth-trace/redactor.d.ts.map +1 -0
- package/dist/cliproxy/auth/oauth-trace/redactor.js +112 -0
- package/dist/cliproxy/auth/oauth-trace/redactor.js.map +1 -0
- package/dist/cliproxy/auth/oauth-trace/sink-file.d.ts +18 -0
- package/dist/cliproxy/auth/oauth-trace/sink-file.d.ts.map +1 -0
- package/dist/cliproxy/auth/oauth-trace/sink-file.js +90 -0
- package/dist/cliproxy/auth/oauth-trace/sink-file.js.map +1 -0
- package/dist/cliproxy/auth/oauth-trace/sink-memory.d.ts +13 -0
- package/dist/cliproxy/auth/oauth-trace/sink-memory.d.ts.map +1 -0
- package/dist/cliproxy/auth/oauth-trace/sink-memory.js +31 -0
- package/dist/cliproxy/auth/oauth-trace/sink-memory.js.map +1 -0
- package/dist/cliproxy/auth/oauth-trace/sink-verbose-stdout.d.ts +11 -0
- package/dist/cliproxy/auth/oauth-trace/sink-verbose-stdout.d.ts.map +1 -0
- package/dist/cliproxy/auth/oauth-trace/sink-verbose-stdout.js +47 -0
- package/dist/cliproxy/auth/oauth-trace/sink-verbose-stdout.js.map +1 -0
- package/dist/cliproxy/auth/oauth-trace/trace-events.d.ts +51 -0
- package/dist/cliproxy/auth/oauth-trace/trace-events.d.ts.map +1 -0
- package/dist/cliproxy/auth/oauth-trace/trace-events.js +44 -0
- package/dist/cliproxy/auth/oauth-trace/trace-events.js.map +1 -0
- package/dist/cliproxy/auth/oauth-trace/trace-recorder.d.ts +34 -0
- package/dist/cliproxy/auth/oauth-trace/trace-recorder.d.ts.map +1 -0
- package/dist/cliproxy/auth/oauth-trace/trace-recorder.js +83 -0
- package/dist/cliproxy/auth/oauth-trace/trace-recorder.js.map +1 -0
- package/dist/cliproxy/config/thinking-config.d.ts.map +1 -1
- package/dist/cliproxy/config/thinking-config.js +9 -8
- package/dist/cliproxy/config/thinking-config.js.map +1 -1
- package/dist/cliproxy/model-catalog.d.ts +2 -0
- package/dist/cliproxy/model-catalog.d.ts.map +1 -1
- package/dist/cliproxy/model-catalog.js +2 -0
- package/dist/cliproxy/model-catalog.js.map +1 -1
- package/dist/cliproxy/provider-capabilities.d.ts +3 -0
- package/dist/cliproxy/provider-capabilities.d.ts.map +1 -1
- package/dist/cliproxy/provider-capabilities.js +14 -2
- package/dist/cliproxy/provider-capabilities.js.map +1 -1
- package/dist/cliproxy/services/oauth-usage-log-transformer.d.ts +4 -0
- package/dist/cliproxy/services/oauth-usage-log-transformer.d.ts.map +1 -0
- package/dist/cliproxy/services/oauth-usage-log-transformer.js +162 -0
- package/dist/cliproxy/services/oauth-usage-log-transformer.js.map +1 -0
- package/dist/cliproxy/services/stats-fetcher.d.ts +4 -0
- package/dist/cliproxy/services/stats-fetcher.d.ts.map +1 -1
- package/dist/cliproxy/services/stats-fetcher.js +133 -25
- package/dist/cliproxy/services/stats-fetcher.js.map +1 -1
- package/dist/cliproxy/services/stats-transformer.d.ts.map +1 -1
- package/dist/cliproxy/services/stats-transformer.js +85 -13
- package/dist/cliproxy/services/stats-transformer.js.map +1 -1
- package/dist/cliproxy/services/usage-compatibility-transformer.d.ts +12 -0
- package/dist/cliproxy/services/usage-compatibility-transformer.d.ts.map +1 -0
- package/dist/cliproxy/services/usage-compatibility-transformer.js +458 -0
- package/dist/cliproxy/services/usage-compatibility-transformer.js.map +1 -0
- package/dist/commands/cliproxy/variant-subcommand.d.ts.map +1 -1
- package/dist/commands/cliproxy/variant-subcommand.js +44 -12
- package/dist/commands/cliproxy/variant-subcommand.js.map +1 -1
- package/dist/commands/command-catalog.d.ts +1 -1
- package/dist/commands/command-catalog.d.ts.map +1 -1
- package/dist/commands/command-catalog.js +3 -2
- package/dist/commands/command-catalog.js.map +1 -1
- package/dist/commands/completion-backend.d.ts.map +1 -1
- package/dist/commands/completion-backend.js +7 -0
- package/dist/commands/completion-backend.js.map +1 -1
- package/dist/commands/copilot-command.js +3 -1
- package/dist/commands/copilot-command.js.map +1 -1
- package/dist/commands/help-command.d.ts.map +1 -1
- package/dist/commands/help-command.js +2 -1
- package/dist/commands/help-command.js.map +1 -1
- package/dist/commands/sync-command.d.ts.map +1 -1
- package/dist/commands/sync-command.js +3 -2
- package/dist/commands/sync-command.js.map +1 -1
- package/dist/config/loader/yaml-serializer.d.ts.map +1 -1
- package/dist/config/loader/yaml-serializer.js +4 -3
- package/dist/config/loader/yaml-serializer.js.map +1 -1
- package/dist/config/migration-manager.d.ts.map +1 -1
- package/dist/config/migration-manager.js +12 -0
- package/dist/config/migration-manager.js.map +1 -1
- package/dist/config/schemas/auth.d.ts +2 -0
- package/dist/config/schemas/auth.d.ts.map +1 -1
- package/dist/config/schemas/auth.js.map +1 -1
- package/dist/config/schemas/copilot-cursor.d.ts +2 -2
- package/dist/config/schemas/copilot-cursor.js +1 -1
- package/dist/config/schemas/unified-config.d.ts +1 -1
- package/dist/config/schemas/unified-config.d.ts.map +1 -1
- package/dist/delegation/delegation-handler.d.ts.map +1 -1
- package/dist/delegation/delegation-handler.js +107 -33
- package/dist/delegation/delegation-handler.js.map +1 -1
- package/dist/delegation/headless-executor.js +1 -1
- package/dist/delegation/headless-executor.js.map +1 -1
- package/dist/dispatcher/flows/account-flow.d.ts.map +1 -1
- package/dist/dispatcher/flows/account-flow.js +4 -3
- package/dist/dispatcher/flows/account-flow.js.map +1 -1
- package/dist/dispatcher/flows/settings-flow.js +1 -1
- package/dist/dispatcher/flows/settings-flow.js.map +1 -1
- package/dist/proxy/upstream-url.d.ts.map +1 -1
- package/dist/proxy/upstream-url.js +8 -0
- package/dist/proxy/upstream-url.js.map +1 -1
- package/dist/shared/claude-extension-setup.d.ts.map +1 -1
- package/dist/shared/claude-extension-setup.js +5 -1
- package/dist/shared/claude-extension-setup.js.map +1 -1
- package/dist/shared/provider-preset-catalog.d.ts +1 -1
- package/dist/shared/provider-preset-catalog.d.ts.map +1 -1
- package/dist/shared/provider-preset-catalog.js +1 -1
- package/dist/shared/provider-preset-catalog.js.map +1 -1
- package/dist/types/config.d.ts +2 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/ui/assets/accounts-CW9bbE4S.js +1 -0
- package/dist/ui/assets/{alert-dialog-C6npAhT0.js → alert-dialog-ClPYGzV3.js} +1 -1
- package/dist/ui/assets/{api-DZosWVkR.js → api-BjpAFHdA.js} +1 -1
- package/dist/ui/assets/{auth-section-D4MZkgcP.js → auth-section-wl4-fzwD.js} +1 -1
- package/dist/ui/assets/{backups-section-DvMJrmHH.js → backups-section-CRfyOhtX.js} +1 -1
- package/dist/ui/assets/{channels-BVftYfOn.js → channels-DH0HkSGX.js} +1 -1
- package/dist/ui/assets/{checkbox-BLRznRTO.js → checkbox-CTpEjpTH.js} +1 -1
- package/dist/ui/assets/{claude-extension-C6OeBQ73.js → claude-extension-BQOBO5Au.js} +1 -1
- package/dist/ui/assets/{cliproxy-ai-providers-BAJ78pUc.js → cliproxy-ai-providers-DoUPKyI5.js} +1 -1
- package/dist/ui/assets/{cliproxy-control-panel-XEvUMVJe.js → cliproxy-control-panel-CvjXdHw9.js} +1 -1
- package/dist/ui/assets/cliproxy-qUbiZjec.js +3 -0
- package/dist/ui/assets/{codex-CY2vikqX.js → codex-BeeazJpw.js} +1 -1
- package/dist/ui/assets/{confirm-dialog-DjLHh1qX.js → confirm-dialog-CYj_LLWN.js} +1 -1
- package/dist/ui/assets/{copilot-afee2lL9.js → copilot-ZCJeM_Zk.js} +2 -2
- package/dist/ui/assets/{cursor-DuWy60wp.js → cursor-CtBjQ1_j.js} +1 -1
- package/dist/ui/assets/{droid-FlceoQ6k.js → droid-BLmzMBtN.js} +1 -1
- package/dist/ui/assets/{globalenv-section-DpJ7unxC.js → globalenv-section-0ENDeVbM.js} +1 -1
- package/dist/ui/assets/{health-BEMgcKD3.js → health-BEnDHk-j.js} +1 -1
- package/dist/ui/assets/{icons-DQFHtVq5.js → icons-DzKUh8vG.js} +1 -1
- package/dist/ui/assets/{index-Cj7EjEq6.js → index-B3xma6R0.js} +1 -1
- package/dist/ui/assets/index-Bs28kNJN.js +72 -0
- package/dist/ui/assets/{index-Ba4ysocb.js → index-C04Kst21.js} +1 -1
- package/dist/ui/assets/{index-0n_43sCZ.js → index-Cip18A41.js} +1 -1
- package/dist/ui/assets/{index-DOC7_hun.js → index-ClMz157R.js} +1 -1
- package/dist/ui/assets/index-D2_yb3d2.css +1 -0
- package/dist/ui/assets/{index-Cq9VySs6.js → index-DrCrZ7r1.js} +1 -1
- package/dist/ui/assets/{index-0GkznW41.js → index-O9Qq-UJq.js} +1 -1
- package/dist/ui/assets/{logs-Dth4naJl.js → logs-DQxVdsHm.js} +1 -1
- package/dist/ui/assets/{masked-input-DL6pJ8pE.js → masked-input-eN6tFUjN.js} +1 -1
- package/dist/ui/assets/{proxy-status-widget-DW4cPFeD.js → proxy-status-widget-50UIM6S8.js} +1 -1
- package/dist/ui/assets/{raw-json-settings-editor-panel-Dcumu3Qi.js → raw-json-settings-editor-panel-DqKmVWL-.js} +1 -1
- package/dist/ui/assets/{searchable-select-CWL2D5Ft.js → searchable-select-JO0gngYE.js} +1 -1
- package/dist/ui/assets/{separator-Do_vqTQD.js → separator-AoncAA6l.js} +1 -1
- package/dist/ui/assets/shared-BTv96-3y.js +8 -0
- package/dist/ui/assets/{table-BP6nBZzg.js → table-BM_YK49c.js} +1 -1
- package/dist/ui/assets/{updates-BTHJZ7Rk.js → updates-eo4H4NOg.js} +1 -1
- package/dist/ui/assets/use-accounts-ELLatpzU.js +1 -0
- package/dist/ui/index.html +3 -3
- package/dist/utils/shell-executor.d.ts +6 -1
- package/dist/utils/shell-executor.d.ts.map +1 -1
- package/dist/utils/shell-executor.js +15 -2
- package/dist/utils/shell-executor.js.map +1 -1
- package/dist/web-server/routes/account-route-helpers.d.ts +3 -0
- package/dist/web-server/routes/account-route-helpers.d.ts.map +1 -1
- package/dist/web-server/routes/account-route-helpers.js.map +1 -1
- package/dist/web-server/routes/account-routes.d.ts.map +1 -1
- package/dist/web-server/routes/account-routes.js +97 -4
- package/dist/web-server/routes/account-routes.js.map +1 -1
- package/dist/web-server/routes/cliproxy-auth-routes.d.ts.map +1 -1
- package/dist/web-server/routes/cliproxy-auth-routes.js +32 -0
- package/dist/web-server/routes/cliproxy-auth-routes.js.map +1 -1
- package/dist/web-server/shared-routes-collections.d.ts +13 -0
- package/dist/web-server/shared-routes-collections.d.ts.map +1 -0
- package/dist/web-server/shared-routes-collections.js +170 -0
- package/dist/web-server/shared-routes-collections.js.map +1 -0
- package/dist/web-server/shared-routes-content.d.ts +16 -0
- package/dist/web-server/shared-routes-content.d.ts.map +1 -0
- package/dist/web-server/shared-routes-content.js +152 -0
- package/dist/web-server/shared-routes-content.js.map +1 -0
- package/dist/web-server/shared-routes-markdown-walker.d.ts +12 -0
- package/dist/web-server/shared-routes-markdown-walker.d.ts.map +1 -0
- package/dist/web-server/shared-routes-markdown-walker.js +97 -0
- package/dist/web-server/shared-routes-markdown-walker.js.map +1 -0
- package/dist/web-server/shared-routes-markdown.d.ts +18 -0
- package/dist/web-server/shared-routes-markdown.d.ts.map +1 -0
- package/dist/web-server/shared-routes-markdown.js +167 -0
- package/dist/web-server/shared-routes-markdown.js.map +1 -0
- package/dist/web-server/shared-routes-path-guards.d.ts +16 -0
- package/dist/web-server/shared-routes-path-guards.d.ts.map +1 -0
- package/dist/web-server/shared-routes-path-guards.js +93 -0
- package/dist/web-server/shared-routes-path-guards.js.map +1 -0
- package/dist/web-server/shared-routes-plugin-registry-content.d.ts +12 -0
- package/dist/web-server/shared-routes-plugin-registry-content.d.ts.map +1 -0
- package/dist/web-server/shared-routes-plugin-registry-content.js +93 -0
- package/dist/web-server/shared-routes-plugin-registry-content.js.map +1 -0
- package/dist/web-server/shared-routes-plugins.d.ts +21 -0
- package/dist/web-server/shared-routes-plugins.d.ts.map +1 -0
- package/dist/web-server/shared-routes-plugins.js +197 -0
- package/dist/web-server/shared-routes-plugins.js.map +1 -0
- package/dist/web-server/shared-routes-symlink-status.d.ts +27 -0
- package/dist/web-server/shared-routes-symlink-status.d.ts.map +1 -0
- package/dist/web-server/shared-routes-symlink-status.js +135 -0
- package/dist/web-server/shared-routes-symlink-status.js.map +1 -0
- package/dist/web-server/shared-routes-types.d.ts +23 -0
- package/dist/web-server/shared-routes-types.d.ts.map +1 -0
- package/dist/web-server/shared-routes-types.js +15 -0
- package/dist/web-server/shared-routes-types.js.map +1 -0
- package/dist/web-server/shared-routes.d.ts +2 -1
- package/dist/web-server/shared-routes.d.ts.map +1 -1
- package/dist/web-server/shared-routes.js +49 -455
- package/dist/web-server/shared-routes.js.map +1 -1
- package/package.json +1 -1
- package/dist/ui/assets/accounts-CybVGDsm.js +0 -1
- package/dist/ui/assets/cliproxy-B3Jyu3r9.js +0 -3
- package/dist/ui/assets/index-6xrth3Oz.css +0 -1
- package/dist/ui/assets/index-BRtgic66.js +0 -72
- package/dist/ui/assets/shared-CwWuZx24.js +0 -8
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatErrorMessage = exports.diagnoseFailure = void 0;
|
|
4
|
+
const trace_events_1 = require("./trace-events");
|
|
5
|
+
const BROWSER_OPEN_HEURISTIC_MS = 5000;
|
|
6
|
+
/**
|
|
7
|
+
* Pure function: read a recorder snapshot and decide which failure branch fits best.
|
|
8
|
+
* No side effects, no console writes.
|
|
9
|
+
*/
|
|
10
|
+
function diagnoseFailure(snapshot) {
|
|
11
|
+
if (snapshot.length === 0) {
|
|
12
|
+
return { branchId: 'UNKNOWN', data: {} };
|
|
13
|
+
}
|
|
14
|
+
const has = (phase) => snapshot.some((e) => e.phase === phase);
|
|
15
|
+
const last = (phase) => [...snapshot].reverse().find((e) => e.phase === phase);
|
|
16
|
+
const lastError = [...snapshot].reverse().find((e) => e.phase === trace_events_1.OAuthTracePhase.Error);
|
|
17
|
+
// Provider gate aborts (highest priority — explicit error code)
|
|
18
|
+
if (lastError?.error?.code === 'GEMINI_PLUS_MISSING_CRED') {
|
|
19
|
+
return { branchId: 'GEMINI_PLUS_MISSING_CRED', data: lastError.data ?? {} };
|
|
20
|
+
}
|
|
21
|
+
if (lastError?.error?.code === 'AGY_RESPONSIBILITY_DECLINED') {
|
|
22
|
+
return { branchId: 'AGY_RESPONSIBILITY_DECLINED', data: lastError.data ?? {} };
|
|
23
|
+
}
|
|
24
|
+
if (lastError?.error?.code === 'CALLBACK_REJECTED') {
|
|
25
|
+
return {
|
|
26
|
+
branchId: 'TOKEN_EXCHANGE_REJECTED',
|
|
27
|
+
data: { upstreamError: lastError.error.message, ...(lastError.data ?? {}) },
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (has(trace_events_1.OAuthTracePhase.PasteCallbackInvalid)) {
|
|
31
|
+
const ev = last(trace_events_1.OAuthTracePhase.PasteCallbackInvalid);
|
|
32
|
+
return { branchId: 'PASTE_INVALID', data: ev?.data ?? {} };
|
|
33
|
+
}
|
|
34
|
+
if (has(trace_events_1.OAuthTracePhase.Cancelled)) {
|
|
35
|
+
return { branchId: 'SESSION_CANCELLED', data: {} };
|
|
36
|
+
}
|
|
37
|
+
if (has(trace_events_1.OAuthTracePhase.Timeout)) {
|
|
38
|
+
const ev = last(trace_events_1.OAuthTracePhase.Timeout);
|
|
39
|
+
return { branchId: 'TIMEOUT', data: ev?.data ?? {} };
|
|
40
|
+
}
|
|
41
|
+
const exitEv = last(trace_events_1.OAuthTracePhase.BinaryExit);
|
|
42
|
+
if (exitEv) {
|
|
43
|
+
const code = exitEv.data?.code ?? null;
|
|
44
|
+
if (code !== null && code !== 0) {
|
|
45
|
+
return {
|
|
46
|
+
branchId: 'BINARY_ERROR_EXIT',
|
|
47
|
+
data: {
|
|
48
|
+
code,
|
|
49
|
+
stderrTail: exitEv.data?.stderrTail ?? '',
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// exit=0 (or no exit) plus token-file states
|
|
55
|
+
if (has(trace_events_1.OAuthTracePhase.TokenFileMissing)) {
|
|
56
|
+
return { branchId: 'TOKEN_FILE_MISSING_POST_EXIT', data: {} };
|
|
57
|
+
}
|
|
58
|
+
if (!has(trace_events_1.OAuthTracePhase.AuthUrlDisplayed)) {
|
|
59
|
+
return { branchId: 'URL_NOT_DISPLAYED', data: {} };
|
|
60
|
+
}
|
|
61
|
+
// URL was displayed: did browser open within heuristic window?
|
|
62
|
+
if (!has(trace_events_1.OAuthTracePhase.BrowserOpened)) {
|
|
63
|
+
const urlEv = last(trace_events_1.OAuthTracePhase.AuthUrlDisplayed);
|
|
64
|
+
const lastTs = snapshot[snapshot.length - 1].ts;
|
|
65
|
+
if (urlEv && lastTs - urlEv.ts >= BROWSER_OPEN_HEURISTIC_MS) {
|
|
66
|
+
return { branchId: 'BROWSER_NOT_OPENED', data: {} };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (has(trace_events_1.OAuthTracePhase.BrowserOpened) &&
|
|
70
|
+
!has(trace_events_1.OAuthTracePhase.CallbackObservedHeuristic) &&
|
|
71
|
+
has(trace_events_1.OAuthTracePhase.BinaryExit)) {
|
|
72
|
+
return { branchId: 'CALLBACK_NEVER_OBSERVED', data: {} };
|
|
73
|
+
}
|
|
74
|
+
return { branchId: 'UNKNOWN', data: {} };
|
|
75
|
+
}
|
|
76
|
+
exports.diagnoseFailure = diagnoseFailure;
|
|
77
|
+
/**
|
|
78
|
+
* Map a diagnosed branch to user-facing message lines (ASCII only, no emojis).
|
|
79
|
+
* Always ends with a concrete next-step command.
|
|
80
|
+
*/
|
|
81
|
+
function formatErrorMessage(result, opts) {
|
|
82
|
+
const { branchId, data } = result;
|
|
83
|
+
const { provider, callbackPort, platform, verbose } = opts;
|
|
84
|
+
const lines = [];
|
|
85
|
+
switch (branchId) {
|
|
86
|
+
case 'URL_NOT_DISPLAYED':
|
|
87
|
+
lines.push('OAuth URL was never produced.');
|
|
88
|
+
lines.push('The CLIProxy binary may have failed to start or exited too early.');
|
|
89
|
+
lines.push(`Try: ccs ${provider} --auth --verbose`);
|
|
90
|
+
break;
|
|
91
|
+
case 'BROWSER_NOT_OPENED':
|
|
92
|
+
lines.push('OAuth URL was displayed but the browser did not open.');
|
|
93
|
+
lines.push('Copy the URL above and open it manually in any browser.');
|
|
94
|
+
break;
|
|
95
|
+
case 'CALLBACK_NEVER_OBSERVED':
|
|
96
|
+
lines.push(`Browser completed login but no callback reached localhost:${callbackPort ?? '?'}.`);
|
|
97
|
+
lines.push('Common cause: firewall, antivirus, or browser on a different machine.');
|
|
98
|
+
lines.push(`Try paste-callback mode: ccs ${provider} --auth --no-browser`);
|
|
99
|
+
if (platform === 'win32' && callbackPort) {
|
|
100
|
+
lines.push('On Windows, try as Administrator:');
|
|
101
|
+
lines.push(` netsh advfirewall firewall add rule name="CCS OAuth" dir=in action=allow protocol=TCP localport=${callbackPort}`);
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
case 'BINARY_ERROR_EXIT': {
|
|
105
|
+
const code = data['code'] ?? '?';
|
|
106
|
+
lines.push(`CLIProxy binary exited with code ${code}.`);
|
|
107
|
+
const tail = String(data['stderrTail'] ?? '').trim();
|
|
108
|
+
if (tail)
|
|
109
|
+
lines.push(` ${tail}`);
|
|
110
|
+
lines.push(`Try: ccs ${provider} --auth --verbose`);
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
case 'TOKEN_FILE_MISSING_POST_EXIT':
|
|
114
|
+
lines.push('Authentication appeared to succeed but no token file was created.');
|
|
115
|
+
lines.push('Update CLIProxy and retry: ccs update');
|
|
116
|
+
break;
|
|
117
|
+
case 'TIMEOUT': {
|
|
118
|
+
const min = data['timeoutMs'] ? Math.round(data['timeoutMs'] / 60000) : '?';
|
|
119
|
+
lines.push(`OAuth flow timed out after ${min} minutes.`);
|
|
120
|
+
lines.push(`Re-run and complete login faster: ccs ${provider} --auth`);
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
case 'SESSION_CANCELLED':
|
|
124
|
+
lines.push('OAuth flow was cancelled.');
|
|
125
|
+
break;
|
|
126
|
+
case 'TOKEN_EXCHANGE_REJECTED':
|
|
127
|
+
lines.push(`Token exchange rejected by provider: ${String(data['upstreamError'] ?? 'unknown')}.`);
|
|
128
|
+
lines.push(`Try: ccs ${provider} --auth --verbose`);
|
|
129
|
+
break;
|
|
130
|
+
case 'PASTE_INVALID':
|
|
131
|
+
lines.push(`Pasted callback URL invalid: ${String(data['reason'] ?? 'unknown')}.`);
|
|
132
|
+
lines.push('Re-run and paste the full URL after browser login.');
|
|
133
|
+
break;
|
|
134
|
+
case 'GEMINI_PLUS_MISSING_CRED':
|
|
135
|
+
lines.push('Gemini-plus OAuth credentials missing.');
|
|
136
|
+
lines.push('See: docs/providers/gemini.md');
|
|
137
|
+
break;
|
|
138
|
+
case 'AGY_RESPONSIBILITY_DECLINED':
|
|
139
|
+
lines.push('Antigravity responsibility prompt was declined.');
|
|
140
|
+
lines.push(`Re-run and accept to proceed: ccs ${provider} --auth`);
|
|
141
|
+
break;
|
|
142
|
+
case 'UNKNOWN':
|
|
143
|
+
default:
|
|
144
|
+
lines.push('Token not found after authentication');
|
|
145
|
+
lines.push('Common causes:');
|
|
146
|
+
lines.push(' 1. OAuth session timed out');
|
|
147
|
+
lines.push(' 2. Callback server could not receive the redirect');
|
|
148
|
+
lines.push(' 3. Browser did not redirect to localhost properly');
|
|
149
|
+
lines.push(`Try: ccs ${provider} --auth --verbose`);
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
if (verbose) {
|
|
153
|
+
lines.push('');
|
|
154
|
+
lines.push('Run with --verbose for the trace summary.');
|
|
155
|
+
}
|
|
156
|
+
return lines;
|
|
157
|
+
}
|
|
158
|
+
exports.formatErrorMessage = formatErrorMessage;
|
|
159
|
+
//# sourceMappingURL=diagnose-failure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose-failure.js","sourceRoot":"","sources":["../../../../src/cliproxy/auth/oauth-trace/diagnose-failure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { OAuthTracePhase, type OAuthTraceEvent, type OAuthTraceSink } from './trace-events';
|
|
2
|
+
export { createOAuthTraceRecorder, type OAuthTraceRecorder, type OAuthTraceRecorderOptions, } from './trace-recorder';
|
|
3
|
+
export { redactString, redactUrl, redactJsonShallow, redactBearer, REDACTED_PLACEHOLDER, } from './redactor';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cliproxy/auth/oauth-trace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EACL,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,GAC/B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.REDACTED_PLACEHOLDER = exports.redactBearer = exports.redactJsonShallow = exports.redactUrl = exports.redactString = exports.createOAuthTraceRecorder = exports.OAuthTracePhase = void 0;
|
|
4
|
+
var trace_events_1 = require("./trace-events");
|
|
5
|
+
Object.defineProperty(exports, "OAuthTracePhase", { enumerable: true, get: function () { return trace_events_1.OAuthTracePhase; } });
|
|
6
|
+
var trace_recorder_1 = require("./trace-recorder");
|
|
7
|
+
Object.defineProperty(exports, "createOAuthTraceRecorder", { enumerable: true, get: function () { return trace_recorder_1.createOAuthTraceRecorder; } });
|
|
8
|
+
var redactor_1 = require("./redactor");
|
|
9
|
+
Object.defineProperty(exports, "redactString", { enumerable: true, get: function () { return redactor_1.redactString; } });
|
|
10
|
+
Object.defineProperty(exports, "redactUrl", { enumerable: true, get: function () { return redactor_1.redactUrl; } });
|
|
11
|
+
Object.defineProperty(exports, "redactJsonShallow", { enumerable: true, get: function () { return redactor_1.redactJsonShallow; } });
|
|
12
|
+
Object.defineProperty(exports, "redactBearer", { enumerable: true, get: function () { return redactor_1.redactBearer; } });
|
|
13
|
+
Object.defineProperty(exports, "REDACTED_PLACEHOLDER", { enumerable: true, get: function () { return redactor_1.REDACTED_PLACEHOLDER; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cliproxy/auth/oauth-trace/index.ts"],"names":[],"mappings":";;;AAAA,+CAA4F;AAAnF,+GAAA,eAAe,OAAA;AACxB,mDAI0B;AAHxB,0HAAA,wBAAwB,OAAA;AAI1B,uCAMoB;AALlB,wGAAA,YAAY,OAAA;AACZ,qGAAA,SAAS,OAAA;AACT,6GAAA,iBAAiB,OAAA;AACjB,wGAAA,YAAY,OAAA;AACZ,gHAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth secret redactor — single choke point.
|
|
3
|
+
*
|
|
4
|
+
* Every value reaching any sink passes through these helpers first.
|
|
5
|
+
* Adding a new sensitive key here is the only place it has to change.
|
|
6
|
+
*
|
|
7
|
+
* DEFERRED: per-event syscall throttling; fsync / file-size cap on file sink.
|
|
8
|
+
*/
|
|
9
|
+
/** Redact sensitive query-param values inside any string. Idempotent. */
|
|
10
|
+
export declare function redactString(s: string): string;
|
|
11
|
+
/** Redact a parsed URL by name; returns redacted href or original on parse error. */
|
|
12
|
+
export declare function redactUrl(u: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Shallow-redact a plain object. Returns a new object; original is not mutated.
|
|
15
|
+
* Arrays are recursed so token arrays (e.g. `{tokens:[{access_token:'AT'}]}`)
|
|
16
|
+
* do not bypass redaction.
|
|
17
|
+
*/
|
|
18
|
+
export declare function redactJsonShallow(input: Record<string, unknown>): Record<string, unknown>;
|
|
19
|
+
/** Redact an Authorization header value. */
|
|
20
|
+
export declare function redactBearer(header: string): string;
|
|
21
|
+
export declare const REDACTED_PLACEHOLDER = "***REDACTED***";
|
|
22
|
+
//# sourceMappingURL=redactor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redactor.d.ts","sourceRoot":"","sources":["../../../../src/cliproxy/auth/oauth-trace/redactor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmCH,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED,qFAAqF;AACrF,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAiC3C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBzF;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,eAAO,MAAM,oBAAoB,mBAAW,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OAuth secret redactor — single choke point.
|
|
4
|
+
*
|
|
5
|
+
* Every value reaching any sink passes through these helpers first.
|
|
6
|
+
* Adding a new sensitive key here is the only place it has to change.
|
|
7
|
+
*
|
|
8
|
+
* DEFERRED: per-event syscall throttling; fsync / file-size cap on file sink.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.REDACTED_PLACEHOLDER = exports.redactBearer = exports.redactJsonShallow = exports.redactUrl = exports.redactString = void 0;
|
|
12
|
+
const SENSITIVE_QUERY_KEYS = [
|
|
13
|
+
'code',
|
|
14
|
+
'state',
|
|
15
|
+
'access_token',
|
|
16
|
+
'refresh_token',
|
|
17
|
+
'id_token',
|
|
18
|
+
'client_secret',
|
|
19
|
+
'authorization',
|
|
20
|
+
// PKCE / device-flow / assertion keys
|
|
21
|
+
'code_verifier',
|
|
22
|
+
'device_code',
|
|
23
|
+
'assertion',
|
|
24
|
+
'subject_token',
|
|
25
|
+
];
|
|
26
|
+
const SENSITIVE_OBJECT_KEYS = new Set(SENSITIVE_QUERY_KEYS.map((k) => k.toLowerCase()).concat(['authorization', 'bearer', 'token']));
|
|
27
|
+
const REDACTED = '***REDACTED***';
|
|
28
|
+
/**
|
|
29
|
+
* Matches sensitive keys in query strings, fragments, and standard params.
|
|
30
|
+
* Lookbehind covers: `?`, `&`, `#`, and `&#` (fragment-then-amp) delimiters.
|
|
31
|
+
* Keys are decoded before matching to catch URL-encoded bypass attempts.
|
|
32
|
+
*/
|
|
33
|
+
const QUERY_PARAM_REGEX = new RegExp(`(?<=[?&#])(${SENSITIVE_QUERY_KEYS.join('|')})=[^&#\\s]+`, 'gi');
|
|
34
|
+
const BEARER_REGEX = /Bearer\s+[A-Za-z0-9._\-~+/=]+/gi;
|
|
35
|
+
/** Redact sensitive query-param values inside any string. Idempotent. */
|
|
36
|
+
function redactString(s) {
|
|
37
|
+
if (!s)
|
|
38
|
+
return s;
|
|
39
|
+
return s
|
|
40
|
+
.replace(QUERY_PARAM_REGEX, (_full, key) => `${key}=${REDACTED}`)
|
|
41
|
+
.replace(BEARER_REGEX, `Bearer ${REDACTED}`);
|
|
42
|
+
}
|
|
43
|
+
exports.redactString = redactString;
|
|
44
|
+
/** Redact a parsed URL by name; returns redacted href or original on parse error. */
|
|
45
|
+
function redactUrl(u) {
|
|
46
|
+
try {
|
|
47
|
+
const url = new URL(u);
|
|
48
|
+
// Redact query params — URL parser already decoded keys, compare decoded.
|
|
49
|
+
for (const key of SENSITIVE_QUERY_KEYS) {
|
|
50
|
+
if (url.searchParams.has(key))
|
|
51
|
+
url.searchParams.set(key, REDACTED);
|
|
52
|
+
}
|
|
53
|
+
// Also catch URL-encoded key names that URL.searchParams may not normalise
|
|
54
|
+
// (e.g. `?%63%6F%64%65=SECRET`). Decode all keys and re-check.
|
|
55
|
+
for (const [rawKey, rawVal] of [...url.searchParams.entries()]) {
|
|
56
|
+
const decoded = decodeURIComponent(rawKey).toLowerCase();
|
|
57
|
+
if ((SENSITIVE_OBJECT_KEYS.has(decoded) || SENSITIVE_QUERY_KEYS.includes(decoded)) &&
|
|
58
|
+
rawVal !== REDACTED) {
|
|
59
|
+
url.searchParams.set(rawKey, REDACTED);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Redact fragment — strip leading `#`, prepend `?` so QUERY_PARAM_REGEX
|
|
63
|
+
// matches the first param (lookbehind requires `?`, `&`, or `#`).
|
|
64
|
+
if (url.hash) {
|
|
65
|
+
const bare = url.hash.slice(1); // remove leading '#'
|
|
66
|
+
const fakeQuery = `?${bare}`;
|
|
67
|
+
const redacted = redactString(fakeQuery);
|
|
68
|
+
url.hash = redacted.slice(1); // put back without the fake '?'
|
|
69
|
+
}
|
|
70
|
+
return url.toString();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return redactString(u);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.redactUrl = redactUrl;
|
|
77
|
+
/**
|
|
78
|
+
* Shallow-redact a plain object. Returns a new object; original is not mutated.
|
|
79
|
+
* Arrays are recursed so token arrays (e.g. `{tokens:[{access_token:'AT'}]}`)
|
|
80
|
+
* do not bypass redaction.
|
|
81
|
+
*/
|
|
82
|
+
function redactJsonShallow(input) {
|
|
83
|
+
const out = {};
|
|
84
|
+
for (const [key, value] of Object.entries(input)) {
|
|
85
|
+
if (SENSITIVE_OBJECT_KEYS.has(key.toLowerCase())) {
|
|
86
|
+
out[key] = REDACTED;
|
|
87
|
+
}
|
|
88
|
+
else if (typeof value === 'string') {
|
|
89
|
+
out[key] = redactString(value);
|
|
90
|
+
}
|
|
91
|
+
else if (Array.isArray(value)) {
|
|
92
|
+
out[key] = value.map((item) => item && typeof item === 'object' && !Array.isArray(item)
|
|
93
|
+
? redactJsonShallow(item)
|
|
94
|
+
: item);
|
|
95
|
+
}
|
|
96
|
+
else if (value && typeof value === 'object') {
|
|
97
|
+
out[key] = redactJsonShallow(value);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
out[key] = value;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
105
|
+
exports.redactJsonShallow = redactJsonShallow;
|
|
106
|
+
/** Redact an Authorization header value. */
|
|
107
|
+
function redactBearer(header) {
|
|
108
|
+
return header.replace(BEARER_REGEX, `Bearer ${REDACTED}`);
|
|
109
|
+
}
|
|
110
|
+
exports.redactBearer = redactBearer;
|
|
111
|
+
exports.REDACTED_PLACEHOLDER = REDACTED;
|
|
112
|
+
//# sourceMappingURL=redactor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redactor.js","sourceRoot":"","sources":["../../../../src/cliproxy/auth/oauth-trace/redactor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { OAuthTraceSink } from './trace-events';
|
|
2
|
+
/**
|
|
3
|
+
* Append-mode JSONL file sink. Off by default; enabled when callers pass an instance.
|
|
4
|
+
*
|
|
5
|
+
* - File path: `${dir}/oauth-YYYYMMDD.log` (date from `now()` per write call).
|
|
6
|
+
* - Permissions: dir 0o700, file 0o600 (user-only). World-readable would leak machine info.
|
|
7
|
+
* - Failure-tolerant: if write fails (disk full, perm denied), logs once to stderr and
|
|
8
|
+
* keeps dropping events silently — sink must never throw out of `write()`.
|
|
9
|
+
*/
|
|
10
|
+
export interface FileSinkOptions {
|
|
11
|
+
dir: string;
|
|
12
|
+
/** Test seam — defaults to `() => new Date()`. */
|
|
13
|
+
now?: () => Date;
|
|
14
|
+
/** Test seam — error notifier (defaults to one-shot stderr write). */
|
|
15
|
+
onError?: (msg: string) => void;
|
|
16
|
+
}
|
|
17
|
+
export declare function createFileSink(options: FileSinkOptions): OAuthTraceSink;
|
|
18
|
+
//# sourceMappingURL=sink-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sink-file.d.ts","sourceRoot":"","sources":["../../../../src/cliproxy/auth/oauth-trace/sink-file.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEjE;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,sEAAsE;IACtE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CA+DvE"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.createFileSink = void 0;
|
|
27
|
+
const fs = __importStar(require("fs"));
|
|
28
|
+
const path = __importStar(require("path"));
|
|
29
|
+
function createFileSink(options) {
|
|
30
|
+
const now = options.now ?? (() => new Date());
|
|
31
|
+
let warned = false;
|
|
32
|
+
const onError = options.onError ??
|
|
33
|
+
((msg) => {
|
|
34
|
+
if (!warned) {
|
|
35
|
+
warned = true;
|
|
36
|
+
process.stderr.write(`[oauth-trace] file sink disabled: ${msg}\n`);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
let cachedDate = null;
|
|
40
|
+
function ensureDir() {
|
|
41
|
+
fs.mkdirSync(options.dir, { recursive: true, mode: 0o700 });
|
|
42
|
+
}
|
|
43
|
+
function dateStr(d) {
|
|
44
|
+
const yyyy = d.getFullYear().toString().padStart(4, '0');
|
|
45
|
+
const mm = (d.getMonth() + 1).toString().padStart(2, '0');
|
|
46
|
+
const dd = d.getDate().toString().padStart(2, '0');
|
|
47
|
+
return `${yyyy}${mm}${dd}`;
|
|
48
|
+
}
|
|
49
|
+
function pathForToday() {
|
|
50
|
+
const ds = dateStr(now());
|
|
51
|
+
cachedDate = ds;
|
|
52
|
+
return path.join(options.dir, `oauth-${ds}.log`);
|
|
53
|
+
}
|
|
54
|
+
function appendOne(event) {
|
|
55
|
+
const file = pathForToday();
|
|
56
|
+
const line = JSON.stringify(event) + '\n';
|
|
57
|
+
let fd = null;
|
|
58
|
+
try {
|
|
59
|
+
ensureDir();
|
|
60
|
+
fd = fs.openSync(file, 'a', 0o600);
|
|
61
|
+
fs.writeSync(fd, line);
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
if (fd !== null) {
|
|
65
|
+
try {
|
|
66
|
+
fs.closeSync(fd);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// ignore
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
write(event) {
|
|
76
|
+
try {
|
|
77
|
+
appendOne(event);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
onError(err.message);
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
async flush() {
|
|
84
|
+
// appendSync paths are flushed per-write; no buffer to drain.
|
|
85
|
+
void cachedDate;
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
exports.createFileSink = createFileSink;
|
|
90
|
+
//# sourceMappingURL=sink-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sink-file.js","sourceRoot":"","sources":["../../../../src/cliproxy/auth/oauth-trace/sink-file.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAmB7B,SAAgB,cAAc,CAAC,OAAwB;IACrD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC9C,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,OAAO,GACX,OAAO,CAAC,OAAO;QACf,CAAC,CAAC,GAAW,EAAE,EAAE;YACf,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,GAAG,IAAI,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,GAAG,IAAI,CAAC,CAAC;YACrE,CAAC;QACH,CAAC,CAAC,CAAC;IAEL,IAAI,UAAU,GAAkB,IAAI,CAAC;IAErC,SAAS,SAAS;QAChB,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,SAAS,OAAO,CAAC,CAAO;QACtB,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACzD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACnD,OAAO,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IAC7B,CAAC;IAED,SAAS,YAAY;QACnB,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1B,UAAU,GAAG,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,SAAS,SAAS,CAAC,KAAsB;QACvC,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QAC1C,IAAI,EAAE,GAAkB,IAAI,CAAC;QAC7B,IAAI,CAAC;YACH,SAAS,EAAE,CAAC;YACZ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACnC,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAChB,IAAI,CAAC;oBACH,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACnB,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,CAAC,KAAK;YACT,IAAI,CAAC;gBACH,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,KAAK,CAAC,KAAK;YACT,8DAA8D;YAC9D,KAAK,UAAU,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC;AA/DD,wCA+DC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { OAuthTraceEvent, OAuthTraceSink } from './trace-events';
|
|
2
|
+
/** Default ring-buffer capacity. Keeps latest N events; oldest are dropped. */
|
|
3
|
+
export declare const MEMORY_SINK_MAX_EVENTS = 1000;
|
|
4
|
+
/**
|
|
5
|
+
* In-memory ring buffer sink. Used for diagnose-failure analysis after a flow ends.
|
|
6
|
+
* Caps at MAX_EVENTS to bound memory; oldest are dropped when full.
|
|
7
|
+
* `droppedCount` tracks how many events were discarded so callers know data loss occurred.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createMemorySink(maxEvents?: number): OAuthTraceSink & {
|
|
10
|
+
snapshot(): OAuthTraceEvent[];
|
|
11
|
+
droppedCount(): number;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=sink-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sink-memory.d.ts","sourceRoot":"","sources":["../../../../src/cliproxy/auth/oauth-trace/sink-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEjE,+EAA+E;AAC/E,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,SAAyB,GACjC,cAAc,GAAG;IAAE,QAAQ,IAAI,eAAe,EAAE,CAAC;IAAC,YAAY,IAAI,MAAM,CAAA;CAAE,CAkB5E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMemorySink = exports.MEMORY_SINK_MAX_EVENTS = void 0;
|
|
4
|
+
/** Default ring-buffer capacity. Keeps latest N events; oldest are dropped. */
|
|
5
|
+
exports.MEMORY_SINK_MAX_EVENTS = 1000;
|
|
6
|
+
/**
|
|
7
|
+
* In-memory ring buffer sink. Used for diagnose-failure analysis after a flow ends.
|
|
8
|
+
* Caps at MAX_EVENTS to bound memory; oldest are dropped when full.
|
|
9
|
+
* `droppedCount` tracks how many events were discarded so callers know data loss occurred.
|
|
10
|
+
*/
|
|
11
|
+
function createMemorySink(maxEvents = exports.MEMORY_SINK_MAX_EVENTS) {
|
|
12
|
+
const events = [];
|
|
13
|
+
let dropped = 0;
|
|
14
|
+
return {
|
|
15
|
+
write(event) {
|
|
16
|
+
if (events.length >= maxEvents) {
|
|
17
|
+
events.shift();
|
|
18
|
+
dropped++;
|
|
19
|
+
}
|
|
20
|
+
events.push(event);
|
|
21
|
+
},
|
|
22
|
+
snapshot() {
|
|
23
|
+
return events.slice();
|
|
24
|
+
},
|
|
25
|
+
droppedCount() {
|
|
26
|
+
return dropped;
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
exports.createMemorySink = createMemorySink;
|
|
31
|
+
//# sourceMappingURL=sink-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sink-memory.js","sourceRoot":"","sources":["../../../../src/cliproxy/auth/oauth-trace/sink-memory.ts"],"names":[],"mappings":";;;AAEA,+EAA+E;AAClE,QAAA,sBAAsB,GAAG,IAAI,CAAC;AAE3C;;;;GAIG;AACH,SAAgB,gBAAgB,CAC9B,SAAS,GAAG,8BAAsB;IAElC,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO;QACL,KAAK,CAAC,KAAK;YACT,IAAI,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;gBAC/B,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,QAAQ;YACN,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QACD,YAAY;YACV,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC;AApBD,4CAoBC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { OAuthTraceSink } from './trace-events';
|
|
2
|
+
/**
|
|
3
|
+
* Verbose stdout sink. Writes one ASCII line per event when verbose=true.
|
|
4
|
+
* Format: `[oauth-trace] +{elapsedMs}ms {phase} {key=val ...}`
|
|
5
|
+
* No emojis (CCS terminal rule). Goes to stderr to avoid mingling with normal stdout.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createVerboseStdoutSink(opts: {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
out?: (line: string) => void;
|
|
10
|
+
}): OAuthTraceSink;
|
|
11
|
+
//# sourceMappingURL=sink-verbose-stdout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sink-verbose-stdout.d.ts","sourceRoot":"","sources":["../../../../src/cliproxy/auth/oauth-trace/sink-verbose-stdout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,GAAG,cAAc,CAoBjB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createVerboseStdoutSink = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Verbose stdout sink. Writes one ASCII line per event when verbose=true.
|
|
6
|
+
* Format: `[oauth-trace] +{elapsedMs}ms {phase} {key=val ...}`
|
|
7
|
+
* No emojis (CCS terminal rule). Goes to stderr to avoid mingling with normal stdout.
|
|
8
|
+
*/
|
|
9
|
+
function createVerboseStdoutSink(opts) {
|
|
10
|
+
const out = opts.out ?? ((line) => process.stderr.write(line + '\n'));
|
|
11
|
+
return {
|
|
12
|
+
write(event) {
|
|
13
|
+
if (!opts.enabled)
|
|
14
|
+
return;
|
|
15
|
+
const parts = [];
|
|
16
|
+
parts.push(`[oauth-trace] +${event.elapsedMs}ms ${event.phase}`);
|
|
17
|
+
if (event.data) {
|
|
18
|
+
for (const [k, v] of Object.entries(event.data)) {
|
|
19
|
+
if (v === undefined)
|
|
20
|
+
continue;
|
|
21
|
+
parts.push(`${k}=${formatValue(v)}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (event.error) {
|
|
25
|
+
parts.push(`error_code=${event.error.code ?? 'unknown'}`);
|
|
26
|
+
parts.push(`error_msg="${event.error.message.replace(/"/g, "'")}"`);
|
|
27
|
+
}
|
|
28
|
+
out(parts.join(' '));
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
exports.createVerboseStdoutSink = createVerboseStdoutSink;
|
|
33
|
+
function formatValue(v) {
|
|
34
|
+
if (v === null)
|
|
35
|
+
return 'null';
|
|
36
|
+
if (typeof v === 'string')
|
|
37
|
+
return v.includes(' ') ? `"${v.replace(/"/g, "'")}"` : v;
|
|
38
|
+
if (typeof v === 'number' || typeof v === 'boolean')
|
|
39
|
+
return String(v);
|
|
40
|
+
try {
|
|
41
|
+
return JSON.stringify(v);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return '[unserializable]';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=sink-verbose-stdout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sink-verbose-stdout.js","sourceRoot":"","sources":["../../../../src/cliproxy/auth/oauth-trace/sink-verbose-stdout.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACH,SAAgB,uBAAuB,CAAC,IAGvC;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;IAC9E,OAAO;QACL,KAAK,CAAC,KAAK;YACT,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO;YAC1B,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YACjE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBAChD,IAAI,CAAC,KAAK,SAAS;wBAAE,SAAS;oBAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;gBAC1D,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YACtE,CAAC;YACD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC;AAvBD,0DAuBC;AAED,SAAS,WAAW,CAAC,CAAU;IAC7B,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAC9B,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,kBAAkB,CAAC;IAC5B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth trace event taxonomy.
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for phase IDs that flow through the OAuth pipeline.
|
|
5
|
+
* Additive only — never remove or renumber.
|
|
6
|
+
*/
|
|
7
|
+
export declare enum OAuthTracePhase {
|
|
8
|
+
PreflightStart = "preflight.start",
|
|
9
|
+
PreflightOk = "preflight.ok",
|
|
10
|
+
PreflightPortBlocked = "preflight.port_blocked",
|
|
11
|
+
BinarySpawn = "binary.spawn",
|
|
12
|
+
BinaryStdout = "binary.stdout",
|
|
13
|
+
BinaryStderr = "binary.stderr",
|
|
14
|
+
BinaryExit = "binary.exit",
|
|
15
|
+
AuthUrlDisplayed = "auth.url_displayed",
|
|
16
|
+
BrowserOpened = "browser.opened",
|
|
17
|
+
CallbackObservedHeuristic = "callback.observed_heuristic",
|
|
18
|
+
PasteCallbackPrompted = "paste.prompted",
|
|
19
|
+
PasteCallbackReceived = "paste.received",
|
|
20
|
+
PasteCallbackInvalid = "paste.invalid",
|
|
21
|
+
PasteCallbackSubmitted = "paste.submitted",
|
|
22
|
+
TokenExchangePending = "token.exchange_pending",
|
|
23
|
+
TokenFileAppeared = "token.file_appeared",
|
|
24
|
+
TokenFileMissing = "token.file_missing",
|
|
25
|
+
ProjectSelectionPrompted = "project.selection_prompted",
|
|
26
|
+
ProjectSelectionResolved = "project.selection_resolved",
|
|
27
|
+
AgyResponsibilityPrompted = "agy.responsibility_prompted",
|
|
28
|
+
AgyResponsibilityResolved = "agy.responsibility_resolved",
|
|
29
|
+
Timeout = "timeout",
|
|
30
|
+
Cancelled = "cancelled",
|
|
31
|
+
Error = "error"
|
|
32
|
+
}
|
|
33
|
+
/** A single OAuth trace event. `data` MUST be redacted before construction. */
|
|
34
|
+
export interface OAuthTraceEvent {
|
|
35
|
+
sessionId: string;
|
|
36
|
+
provider: string;
|
|
37
|
+
phase: OAuthTracePhase;
|
|
38
|
+
ts: number;
|
|
39
|
+
elapsedMs: number;
|
|
40
|
+
data?: Record<string, unknown>;
|
|
41
|
+
error?: {
|
|
42
|
+
code?: string;
|
|
43
|
+
message: string;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** Sink interface — accept events that have already been redacted. */
|
|
47
|
+
export interface OAuthTraceSink {
|
|
48
|
+
write(event: OAuthTraceEvent): void;
|
|
49
|
+
flush?(): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=trace-events.d.ts.map
|