@yu_robotics/remote-cli 1.6.117 → 1.6.128

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.
Files changed (101) hide show
  1. package/README.md +41 -9
  2. package/dist/client/MessageHandler.d.ts.map +1 -1
  3. package/dist/client/MessageHandler.js +41 -29
  4. package/dist/client/MessageHandler.js.map +1 -1
  5. package/dist/client/WebSocketClient.d.ts +6 -0
  6. package/dist/client/WebSocketClient.d.ts.map +1 -1
  7. package/dist/client/WebSocketClient.js +4 -0
  8. package/dist/client/WebSocketClient.js.map +1 -1
  9. package/dist/commands/config.js +7 -0
  10. package/dist/commands/config.js.map +1 -1
  11. package/dist/commands/start.d.ts.map +1 -1
  12. package/dist/commands/start.js +36 -11
  13. package/dist/commands/start.js.map +1 -1
  14. package/dist/delegation/BackendRegistry.d.ts.map +1 -1
  15. package/dist/delegation/BackendRegistry.js +15 -8
  16. package/dist/delegation/BackendRegistry.js.map +1 -1
  17. package/dist/executor/ClaudePersistentExecutor.d.ts.map +1 -1
  18. package/dist/executor/ClaudePersistentExecutor.js +18 -4
  19. package/dist/executor/ClaudePersistentExecutor.js.map +1 -1
  20. package/dist/executor/CodexAppServerClient.d.ts +5 -0
  21. package/dist/executor/CodexAppServerClient.d.ts.map +1 -1
  22. package/dist/executor/CodexAppServerClient.js +6 -2
  23. package/dist/executor/CodexAppServerClient.js.map +1 -1
  24. package/dist/executor/DshExecutor.d.ts +4 -0
  25. package/dist/executor/DshExecutor.d.ts.map +1 -1
  26. package/dist/executor/DshExecutor.js +8 -0
  27. package/dist/executor/DshExecutor.js.map +1 -1
  28. package/dist/executor/claude/ClaudeStderrFilter.d.ts +11 -0
  29. package/dist/executor/claude/ClaudeStderrFilter.d.ts.map +1 -0
  30. package/dist/executor/claude/ClaudeStderrFilter.js +69 -0
  31. package/dist/executor/claude/ClaudeStderrFilter.js.map +1 -0
  32. package/dist/executor/dsh/DshAccountUsage.d.ts +12 -0
  33. package/dist/executor/dsh/DshAccountUsage.d.ts.map +1 -0
  34. package/dist/executor/dsh/DshAccountUsage.js +134 -0
  35. package/dist/executor/dsh/DshAccountUsage.js.map +1 -0
  36. package/dist/executor/dsh/DshAccountUsagePlugin.d.ts +16 -0
  37. package/dist/executor/dsh/DshAccountUsagePlugin.d.ts.map +1 -0
  38. package/dist/executor/dsh/DshAccountUsagePlugin.js +19 -0
  39. package/dist/executor/dsh/DshAccountUsagePlugin.js.map +1 -0
  40. package/dist/maintenance/CodexStatusProbe.d.ts +26 -0
  41. package/dist/maintenance/CodexStatusProbe.d.ts.map +1 -0
  42. package/dist/maintenance/CodexStatusProbe.js +124 -0
  43. package/dist/maintenance/CodexStatusProbe.js.map +1 -0
  44. package/dist/maintenance/CodexWeekly.d.ts +17 -0
  45. package/dist/maintenance/CodexWeekly.d.ts.map +1 -0
  46. package/dist/maintenance/CodexWeekly.js +60 -0
  47. package/dist/maintenance/CodexWeekly.js.map +1 -0
  48. package/dist/maintenance/MaintenanceClient.d.ts +23 -0
  49. package/dist/maintenance/MaintenanceClient.d.ts.map +1 -0
  50. package/dist/maintenance/MaintenanceClient.js +69 -0
  51. package/dist/maintenance/MaintenanceClient.js.map +1 -0
  52. package/dist/maintenance/PrivateStore.d.ts +10 -0
  53. package/dist/maintenance/PrivateStore.d.ts.map +1 -0
  54. package/dist/maintenance/PrivateStore.js +54 -0
  55. package/dist/maintenance/PrivateStore.js.map +1 -0
  56. package/dist/maintenance/ReleaseNotes.d.ts +30 -0
  57. package/dist/maintenance/ReleaseNotes.d.ts.map +1 -0
  58. package/dist/maintenance/ReleaseNotes.js +139 -0
  59. package/dist/maintenance/ReleaseNotes.js.map +1 -0
  60. package/dist/maintenance/ReleaseOverview.d.ts +23 -0
  61. package/dist/maintenance/ReleaseOverview.d.ts.map +1 -0
  62. package/dist/maintenance/ReleaseOverview.js +56 -0
  63. package/dist/maintenance/ReleaseOverview.js.map +1 -0
  64. package/dist/maintenance/SubscriptionInspection.d.ts +49 -0
  65. package/dist/maintenance/SubscriptionInspection.d.ts.map +1 -0
  66. package/dist/maintenance/SubscriptionInspection.js +193 -0
  67. package/dist/maintenance/SubscriptionInspection.js.map +1 -0
  68. package/dist/maintenance/SubscriptionReminderStore.d.ts +12 -0
  69. package/dist/maintenance/SubscriptionReminderStore.d.ts.map +1 -0
  70. package/dist/maintenance/SubscriptionReminderStore.js +60 -0
  71. package/dist/maintenance/SubscriptionReminderStore.js.map +1 -0
  72. package/dist/maintenance/UpdateNotices.d.ts +21 -0
  73. package/dist/maintenance/UpdateNotices.d.ts.map +1 -0
  74. package/dist/maintenance/UpdateNotices.js +104 -0
  75. package/dist/maintenance/UpdateNotices.js.map +1 -0
  76. package/dist/maintenance/Version.d.ts +3 -0
  77. package/dist/maintenance/Version.d.ts.map +1 -0
  78. package/dist/maintenance/Version.js +42 -0
  79. package/dist/maintenance/Version.js.map +1 -0
  80. package/dist/maintenance/release-notes.json +1 -0
  81. package/dist/service/ServiceManager.d.ts.map +1 -1
  82. package/dist/service/ServiceManager.js +4 -2
  83. package/dist/service/ServiceManager.js.map +1 -1
  84. package/dist/thread/DelegationSettings.d.ts +4 -0
  85. package/dist/thread/DelegationSettings.d.ts.map +1 -0
  86. package/dist/thread/DelegationSettings.js +8 -0
  87. package/dist/thread/DelegationSettings.js.map +1 -0
  88. package/dist/thread/types.d.ts +1 -1
  89. package/dist/thread/types.d.ts.map +1 -1
  90. package/dist/types/config.d.ts +5 -0
  91. package/dist/types/config.d.ts.map +1 -1
  92. package/dist/types/config.js.map +1 -1
  93. package/dist/utils/BackendCommand.d.ts +8 -0
  94. package/dist/utils/BackendCommand.d.ts.map +1 -0
  95. package/dist/utils/BackendCommand.js +26 -0
  96. package/dist/utils/BackendCommand.js.map +1 -0
  97. package/dist/utils/BackendEnvironment.d.ts +16 -0
  98. package/dist/utils/BackendEnvironment.d.ts.map +1 -0
  99. package/dist/utils/BackendEnvironment.js +70 -0
  100. package/dist/utils/BackendEnvironment.js.map +1 -0
  101. package/package.json +2 -2
@@ -0,0 +1,12 @@
1
+ import { spawn } from 'child_process';
2
+ export declare const DSH_ACCOUNT_USAGE_PREFIX = "REMOTE_CLI_DSH_ACCOUNT_USAGE:";
3
+ export interface DshAccountUsageDependencies {
4
+ spawnProcess?: typeof spawn;
5
+ timeoutMs?: number;
6
+ killGraceMs?: number;
7
+ }
8
+ /** Project only wallet amounts; never expose profile fields or coerce decimal strings. */
9
+ export declare function formatDshAccountBalance(value: unknown): string | null;
10
+ /** Read the native account service without an ACP session, model turn, or Web server. */
11
+ export declare function queryDshAccountUsage(command: string, cwd: string, dependencies?: DshAccountUsageDependencies): Promise<string | null>;
12
+ //# sourceMappingURL=DshAccountUsage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DshAccountUsage.d.ts","sourceRoot":"","sources":["../../../src/executor/dsh/DshAccountUsage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,eAAe,CAAC;AAMzD,eAAO,MAAM,wBAAwB,kCAAkC,CAAC;AAIxE,MAAM,WAAW,2BAA2B;IAC1C,YAAY,CAAC,EAAE,OAAO,KAAK,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,0FAA0F;AAC1F,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAiBrE;AAED,yFAAyF;AACzF,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EACrE,YAAY,GAAE,2BAAgC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuExE"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DSH_ACCOUNT_USAGE_PREFIX = void 0;
7
+ exports.formatDshAccountBalance = formatDshAccountBalance;
8
+ exports.queryDshAccountUsage = queryDshAccountUsage;
9
+ const child_process_1 = require("child_process");
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const url_1 = require("url");
13
+ const DshPrivacy_1 = require("./DshPrivacy");
14
+ exports.DSH_ACCOUNT_USAGE_PREFIX = 'REMOTE_CLI_DSH_ACCOUNT_USAGE:';
15
+ const MAX_OUTPUT_BYTES = 64 * 1024;
16
+ const MAX_RESULT_LENGTH = 4096;
17
+ /** Project only wallet amounts; never expose profile fields or coerce decimal strings. */
18
+ function formatDshAccountBalance(value) {
19
+ if (!value || typeof value !== 'object')
20
+ return null;
21
+ const snapshot = value;
22
+ if (snapshot.status !== 'ready')
23
+ return null;
24
+ const lines = [];
25
+ for (const [key, label] of [['value', 'Recharge balance'], ['bonusWallets', 'Bonus balance']]) {
26
+ const wallets = snapshot[key];
27
+ if (!Array.isArray(wallets) || wallets.length > 32)
28
+ return null;
29
+ for (const wallet of wallets) {
30
+ if (!wallet || !['CNY', 'USD'].includes(wallet.currency)
31
+ || typeof wallet.balance !== 'string' || wallet.balance.length > 128
32
+ || !/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(wallet.balance))
33
+ return null;
34
+ lines.push(`- ${label}: ${wallet.currency} ${wallet.balance}`);
35
+ }
36
+ }
37
+ const output = lines.join('\n');
38
+ return output && output.length <= MAX_RESULT_LENGTH ? output : null;
39
+ }
40
+ /** Read the native account service without an ACP session, model turn, or Web server. */
41
+ async function queryDshAccountUsage(command, cwd, dependencies = {}) {
42
+ let launch;
43
+ let child;
44
+ try {
45
+ launch = (0, DshPrivacy_1.createDshPrivacyLaunch)();
46
+ const plugin = (0, url_1.pathToFileURL)(path_1.default.join(__dirname, 'DshAccountUsagePlugin.js')).href;
47
+ fs_1.default.appendFileSync(launch.args[3], [
48
+ '- insert:',
49
+ ' - id: remote-cli-dsh-account-usage',
50
+ ` name: ${JSON.stringify(plugin)}`,
51
+ ' config:',
52
+ ` version: ${JSON.stringify(require('../../../package.json').version)}`,
53
+ ' locale: en-US',
54
+ ` timezoneOffsetSeconds: ${-new Date().getTimezoneOffset() * 60}`,
55
+ '',
56
+ ].join('\n'));
57
+ child = (dependencies.spawnProcess ?? child_process_1.spawn)(command, launch.args, { cwd, env: launch.env, stdio: ['pipe', 'pipe', 'ignore'] });
58
+ }
59
+ catch {
60
+ try {
61
+ launch?.dispose();
62
+ }
63
+ catch { /* Cleanup must not disclose native diagnostics. */ }
64
+ return null;
65
+ }
66
+ return new Promise(resolve => {
67
+ let settled = false;
68
+ let completed = false;
69
+ let result = null;
70
+ let pending = '';
71
+ let bytes = 0;
72
+ let killTimer;
73
+ const timeout = setTimeout(() => settle(null), dependencies.timeoutMs ?? 12_000);
74
+ const complete = () => {
75
+ if (completed)
76
+ return;
77
+ completed = true;
78
+ clearTimeout(timeout);
79
+ clearTimeout(killTimer);
80
+ try {
81
+ launch?.dispose();
82
+ }
83
+ catch { /* Do not relay private native errors. */ }
84
+ resolve(result);
85
+ };
86
+ const settle = (output) => {
87
+ if (settled || completed)
88
+ return;
89
+ settled = true;
90
+ result = output;
91
+ clearTimeout(timeout);
92
+ killTimer = setTimeout(() => {
93
+ try {
94
+ child.kill('SIGKILL');
95
+ }
96
+ catch { /* The owned process may have exited. */ }
97
+ complete();
98
+ }, dependencies.killGraceMs ?? 2000);
99
+ try {
100
+ child.kill('SIGTERM');
101
+ }
102
+ catch { /* The kill deadline still bounds cleanup. */ }
103
+ };
104
+ child.once('error', () => settle(null));
105
+ child.once('exit', complete);
106
+ child.stdout?.on('data', (chunk) => {
107
+ if (settled || completed)
108
+ return;
109
+ bytes += chunk.length;
110
+ if (bytes > MAX_OUTPUT_BYTES) {
111
+ settle(null);
112
+ return;
113
+ }
114
+ pending += chunk.toString('utf8');
115
+ let newline;
116
+ while ((newline = pending.indexOf('\n')) !== -1) {
117
+ const line = pending.slice(0, newline);
118
+ pending = pending.slice(newline + 1);
119
+ if (!line.startsWith(exports.DSH_ACCOUNT_USAGE_PREFIX))
120
+ continue;
121
+ try {
122
+ const message = JSON.parse(line.slice(exports.DSH_ACCOUNT_USAGE_PREFIX.length));
123
+ settle(typeof message?.output === 'string' && message.output.length <= MAX_RESULT_LENGTH
124
+ ? message.output : null);
125
+ }
126
+ catch {
127
+ settle(null);
128
+ }
129
+ return;
130
+ }
131
+ });
132
+ });
133
+ }
134
+ //# sourceMappingURL=DshAccountUsage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DshAccountUsage.js","sourceRoot":"","sources":["../../../src/executor/dsh/DshAccountUsage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare const name = "remote-cli-dsh-account-usage";
2
+ export declare const inject: string[];
3
+ interface AccountMetadata {
4
+ version: string;
5
+ locale: string;
6
+ timezoneOffsetSeconds: number;
7
+ }
8
+ interface AccountContext {
9
+ deepseekAccount: {
10
+ getBalance(metadata: AccountMetadata): Promise<unknown>;
11
+ };
12
+ }
13
+ /** A one-shot native DSH plugin. Only the sanitized balance projection reaches stdout. */
14
+ export declare function apply(context: AccountContext, metadata: AccountMetadata): Promise<void>;
15
+ export {};
16
+ //# sourceMappingURL=DshAccountUsagePlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DshAccountUsagePlugin.d.ts","sourceRoot":"","sources":["../../../src/executor/dsh/DshAccountUsagePlugin.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI,iCAAiC,CAAC;AACnD,eAAO,MAAM,MAAM,UAAsB,CAAC;AAE1C,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,UAAU,cAAc;IACtB,eAAe,EAAE;QAAE,UAAU,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;CAC9E;AAED,0FAA0F;AAC1F,wBAAsB,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7F"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inject = exports.name = void 0;
4
+ exports.apply = apply;
5
+ const DshAccountUsage_1 = require("./DshAccountUsage");
6
+ exports.name = 'remote-cli-dsh-account-usage';
7
+ exports.inject = ['deepseekAccount'];
8
+ /** A one-shot native DSH plugin. Only the sanitized balance projection reaches stdout. */
9
+ async function apply(context, metadata) {
10
+ let output = null;
11
+ try {
12
+ output = (0, DshAccountUsage_1.formatDshAccountBalance)(await context.deepseekAccount.getBalance(metadata));
13
+ }
14
+ catch {
15
+ // Missing authentication, quota-service failures, and provider details stay private.
16
+ }
17
+ process.stdout.write(`${DshAccountUsage_1.DSH_ACCOUNT_USAGE_PREFIX}${JSON.stringify({ output })}\n`);
18
+ }
19
+ //# sourceMappingURL=DshAccountUsagePlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DshAccountUsagePlugin.js","sourceRoot":"","sources":["../../../src/executor/dsh/DshAccountUsagePlugin.ts"],"names":[],"mappings":";;;AAgBA,sBAMC;AAtBD,uDAAsF;AAEzE,QAAA,IAAI,GAAG,8BAA8B,CAAC;AACtC,QAAA,MAAM,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAY1C,0FAA0F;AACnF,KAAK,UAAU,KAAK,CAAC,OAAuB,EAAE,QAAyB;IAC5E,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,CAAC;QAAC,MAAM,GAAG,IAAA,yCAAuB,EAAC,MAAM,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QACnG,qFAAqF;IACvF,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,0CAAwB,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;AACrF,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { type CodexAppServerClientOptions } from '../executor/CodexAppServerClient';
2
+ import type { ExecutorConfig } from '../types/config';
3
+ import { type WeeklyObservation } from './CodexWeekly';
4
+ export interface StatusProbeClient {
5
+ request(method: string, params?: unknown): Promise<any>;
6
+ stop(): Promise<void>;
7
+ onMessage(handler: (message: any) => void): () => void;
8
+ respondError(id: string | number, message: string): void;
9
+ }
10
+ interface ProbeOptions {
11
+ config: () => ExecutorConfig | undefined;
12
+ nativeHome?: () => string;
13
+ createClient?: (options: CodexAppServerClientOptions) => StatusProbeClient;
14
+ now?: () => number;
15
+ deadlineMs?: number;
16
+ }
17
+ /** Status only: existing native tokens are read locally, loaded ephemerally, and never refreshed or written by this feature. */
18
+ export declare class CodexStatusProbe {
19
+ private readonly options;
20
+ private readonly createClient;
21
+ private readonly now;
22
+ constructor(options: ProbeOptions);
23
+ inspect(signal: AbortSignal): Promise<WeeklyObservation | undefined>;
24
+ }
25
+ export {};
26
+ //# sourceMappingURL=CodexStatusProbe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodexStatusProbe.d.ts","sourceRoot":"","sources":["../../src/maintenance/CodexStatusProbe.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwB,KAAK,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAE1G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAA0B,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE/E,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACvD,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1D;AACD,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,cAAc,GAAG,SAAS,CAAC;IACzC,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,iBAAiB,CAAC;IAC3E,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,gIAAgI;AAChI,qBAAa,gBAAgB;IAGf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4C;IACzE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBACN,OAAO,EAAE,YAAY;IAK5C,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;CAoE3E"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CodexStatusProbe = void 0;
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const CodexAppServerClient_1 = require("../executor/CodexAppServerClient");
11
+ const BackendCommand_1 = require("../utils/BackendCommand");
12
+ const CodexWeekly_1 = require("./CodexWeekly");
13
+ /** Status only: existing native tokens are read locally, loaded ephemerally, and never refreshed or written by this feature. */
14
+ class CodexStatusProbe {
15
+ options;
16
+ createClient;
17
+ now;
18
+ constructor(options) {
19
+ this.options = options;
20
+ this.createClient = options.createClient ?? (opts => new CodexAppServerClient_1.CodexAppServerClient(opts));
21
+ this.now = options.now ?? Date.now;
22
+ }
23
+ async inspect(signal) {
24
+ let temporary;
25
+ let client;
26
+ let timedOut = false;
27
+ let timer;
28
+ const ensureActive = () => { if (timedOut || signal.aborted)
29
+ throw new Error('Status probe cancelled.'); };
30
+ let abort;
31
+ try {
32
+ const deadline = new Promise((_, reject) => {
33
+ abort = () => { timedOut = true; reject(new Error('Status probe cancelled.')); };
34
+ signal.addEventListener('abort', abort, { once: true });
35
+ timer = setTimeout(() => { timedOut = true; reject(new Error('Status probe deadline reached.')); }, this.options.deadlineMs ?? 15_000);
36
+ timer.unref?.();
37
+ });
38
+ const operation = (async () => {
39
+ ensureActive();
40
+ const nativeHome = this.options.nativeHome?.() ?? process.env.CODEX_HOME ?? path_1.default.join(os_1.default.homedir(), '.codex');
41
+ const authPath = path_1.default.join(nativeHome, 'auth.json');
42
+ const stat = await promises_1.default.stat(authPath);
43
+ ensureActive();
44
+ if (!stat.isFile() || stat.size > 64 * 1024)
45
+ return;
46
+ const auth = JSON.parse(await promises_1.default.readFile(authPath, 'utf8'));
47
+ ensureActive();
48
+ // API-key/keyring/custom auth is unsupported, never substituted for a native ChatGPT account.
49
+ const token = auth?.tokens?.access_token, accountId = auth?.tokens?.account_id;
50
+ if (auth?.auth_mode === 'apikey' || typeof token !== 'string' || !token || token.length > 20000
51
+ || typeof accountId !== 'string' || !accountId || accountId.length > 200)
52
+ return;
53
+ const credentialGeneration = `${stat.ino}:${stat.size}:${stat.mtimeMs}`;
54
+ temporary = await promises_1.default.mkdtemp(path_1.default.join(os_1.default.tmpdir(), 'remote-cli-status-'));
55
+ ensureActive();
56
+ await promises_1.default.chmod(temporary, 0o700);
57
+ ensureActive();
58
+ const env = {};
59
+ for (const name of ['PATH', 'HOME', 'USERPROFILE', 'SYSTEMROOT', 'SystemRoot', 'WINDIR', 'TMP', 'TEMP', 'TMPDIR', 'LANG', 'LC_ALL', 'SSL_CERT_FILE', 'SSL_CERT_DIR', 'NODE_EXTRA_CA_CERTS']) {
60
+ if (process.env[name] !== undefined)
61
+ env[name] = process.env[name];
62
+ }
63
+ env.CODEX_HOME = temporary;
64
+ env.RUST_LOG = 'error';
65
+ const overrides = ['cli_auth_credentials_store="ephemeral"', 'model_provider="openai"', 'forced_login_method="chatgpt"',
66
+ 'analytics.enabled=false', 'feedback.enabled=false', 'history.persistence="none"', 'web_search="disabled"',
67
+ 'features.shell_tool=false', 'features.apps=false', 'features.multi_agent=false'];
68
+ client = this.createClient({ command: (0, BackendCommand_1.getBackendCommand)('codex', this.options.config()), cwd: temporary, env,
69
+ launchArgs: overrides.flatMap(v => ['-c', v]), requestTimeoutMs: 5000, killEscalationMs: 1000 });
70
+ client.onMessage(message => {
71
+ // A probe never executes server-requested integrations or token refresh callbacks.
72
+ if (message.id != null && message.method)
73
+ client?.respondError(message.id, 'Maintenance probes do not handle this request.');
74
+ });
75
+ // Unknown native versions or managed overrides must not silently turn ephemeral auth into a disk write.
76
+ const configured = await Promise.race([client.request('config/read', { includeLayers: false }), deadline]);
77
+ ensureActive();
78
+ const effective = configured?.config;
79
+ if (effective?.cli_auth_credentials_store !== 'ephemeral' || effective.model_provider !== 'openai'
80
+ || effective.analytics?.enabled !== false || effective.feedback?.enabled !== false
81
+ || Object.values(effective.mcp_servers ?? {}).some((server) => server?.enabled !== false))
82
+ return;
83
+ const login = await Promise.race([client.request('account/login/start', { type: 'chatgptAuthTokens', accessToken: token, chatgptAccountId: accountId }), deadline]);
84
+ ensureActive();
85
+ if (login?.type !== 'chatgptAuthTokens')
86
+ return;
87
+ const raw = await Promise.race([client.request('account/rateLimits/read', { excludeResetCreditDetails: true }), deadline]);
88
+ ensureActive();
89
+ const after = await promises_1.default.stat(authPath);
90
+ ensureActive();
91
+ if (`${after.ino}:${after.size}:${after.mtimeMs}` !== credentialGeneration)
92
+ return;
93
+ return (0, CodexWeekly_1.codexWeeklyObservation)(raw, accountId, credentialGeneration, this.now());
94
+ })();
95
+ // Wait for setup to settle before cleanup, even if a local filesystem operation finishes after the deadline.
96
+ try {
97
+ return await Promise.race([operation, deadline]);
98
+ }
99
+ finally {
100
+ timedOut = true;
101
+ await operation.catch(() => { });
102
+ }
103
+ }
104
+ catch {
105
+ return;
106
+ }
107
+ finally {
108
+ if (timer)
109
+ clearTimeout(timer);
110
+ if (abort)
111
+ signal.removeEventListener('abort', abort);
112
+ try {
113
+ await client?.stop();
114
+ }
115
+ catch { /* Never delete a credential-free temporary home while its process exit is unconfirmed. */
116
+ temporary = undefined;
117
+ }
118
+ if (temporary)
119
+ await promises_1.default.rm(temporary, { recursive: true, force: true });
120
+ }
121
+ }
122
+ }
123
+ exports.CodexStatusProbe = CodexStatusProbe;
124
+ //# sourceMappingURL=CodexStatusProbe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodexStatusProbe.js","sourceRoot":"","sources":["../../src/maintenance/CodexStatusProbe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare const WEEK_SECONDS: number;
2
+ export declare const INSPECTION_INTERVAL_MS = 3600000;
3
+ export interface WeeklyObservation {
4
+ identity: string;
5
+ /** Stable, local-only account/bucket fingerprint, independent of credential refreshes. */
6
+ accountKey: string;
7
+ /** Local sampling time in milliseconds. */
8
+ observedAt: number;
9
+ /** Absolute provider reset timestamp in Unix seconds. */
10
+ resetsAt: number;
11
+ candidate: boolean;
12
+ }
13
+ /** Parse native numeric fields, never formatted /status text or window length alone. */
14
+ export declare function codexWeeklyObservation(raw: unknown, accountId: string, credentialGeneration: string, observedAt: number): WeeklyObservation | undefined;
15
+ /** Notification eligibility only; advancing timestamps do not prove a quota reset occurred. */
16
+ export declare function floatingWeeklyPair(previous: WeeklyObservation, current: WeeklyObservation): boolean;
17
+ //# sourceMappingURL=CodexWeekly.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodexWeekly.d.ts","sourceRoot":"","sources":["../../src/maintenance/CodexWeekly.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,QAAY,CAAC;AACtC,eAAO,MAAM,sBAAsB,UAAW,CAAC;AAC/C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,0FAA0F;IAC1F,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wFAAwF;AACxF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CA8BvJ;AAED,+FAA+F;AAC/F,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAKnG"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.INSPECTION_INTERVAL_MS = exports.WEEK_SECONDS = void 0;
4
+ exports.codexWeeklyObservation = codexWeeklyObservation;
5
+ exports.floatingWeeklyPair = floatingWeeklyPair;
6
+ const crypto_1 = require("crypto");
7
+ exports.WEEK_SECONDS = 7 * 86400;
8
+ exports.INSPECTION_INTERVAL_MS = 3600_000;
9
+ /** Parse native numeric fields, never formatted /status text or window length alone. */
10
+ function codexWeeklyObservation(raw, accountId, credentialGeneration, observedAt) {
11
+ if (!raw || typeof raw !== 'object' || !accountId || !Number.isFinite(observedAt))
12
+ return;
13
+ const value = raw;
14
+ if (value.accountId != null && value.accountId !== accountId)
15
+ return;
16
+ let buckets;
17
+ if (value.rateLimitsByLimitId != null) {
18
+ if (typeof value.rateLimitsByLimitId !== 'object' || Array.isArray(value.rateLimitsByLimitId))
19
+ return;
20
+ buckets = Object.entries(value.rateLimitsByLimitId);
21
+ }
22
+ else if (value.rateLimits && typeof value.rateLimits === 'object') {
23
+ buckets = [[value.rateLimits.limitId ?? 'codex', value.rateLimits]];
24
+ }
25
+ else
26
+ return;
27
+ const weekly = [];
28
+ for (const [key, bucket] of buckets) {
29
+ if (!bucket || typeof bucket !== 'object' || !key || key.length > 200)
30
+ return;
31
+ if (bucket.limitId != null && bucket.limitId !== key)
32
+ return;
33
+ for (const field of ['primary', 'secondary']) {
34
+ const window = bucket[field];
35
+ if (window == null)
36
+ continue;
37
+ if (typeof window !== 'object' || !Number.isFinite(window.usedPercent) || window.usedPercent < 0 || window.usedPercent > 100
38
+ || !Number.isFinite(window.windowDurationMins) || window.windowDurationMins <= 0
39
+ || !Number.isSafeInteger(window.resetsAt) || window.resetsAt <= 0)
40
+ return;
41
+ if (window.windowDurationMins === 10080)
42
+ weekly.push({ bucket: key, reset: window.resetsAt, used: window.usedPercent });
43
+ }
44
+ }
45
+ // Ambiguous weekly buckets cannot authorize a reminder for a guessed account/window.
46
+ if (weekly.length !== 1)
47
+ return;
48
+ const w = weekly[0];
49
+ return { identity: JSON.stringify([accountId, credentialGeneration, w.bucket]),
50
+ accountKey: (0, crypto_1.createHash)('sha256').update(JSON.stringify(['codex', accountId, w.bucket])).digest('hex'), observedAt, resetsAt: w.reset,
51
+ candidate: w.used === 0 && Math.abs(w.reset - observedAt / 1000 - exports.WEEK_SECONDS) <= 120 };
52
+ }
53
+ /** Notification eligibility only; advancing timestamps do not prove a quota reset occurred. */
54
+ function floatingWeeklyPair(previous, current) {
55
+ const elapsed = current.observedAt - previous.observedAt;
56
+ return previous.identity === current.identity && previous.candidate && current.candidate
57
+ && elapsed >= exports.INSPECTION_INTERVAL_MS - 120_000 && elapsed <= exports.INSPECTION_INTERVAL_MS + 120_000
58
+ && Math.abs(current.resetsAt - previous.resetsAt - elapsed / 1000) <= 120;
59
+ }
60
+ //# sourceMappingURL=CodexWeekly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodexWeekly.js","sourceRoot":"","sources":["../../src/maintenance/CodexWeekly.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { ExecutorConfig } from '../types/config';
2
+ export interface MaintenanceTransport {
3
+ send(message: object): void;
4
+ on(event: 'disconnected', handler: () => void): void;
5
+ }
6
+ /** Local service lifecycle, deliberately independent of normal task and updater routing. */
7
+ export declare class MaintenanceClient {
8
+ private readonly updates?;
9
+ private readonly subscriptions?;
10
+ private runningVersion?;
11
+ private bound;
12
+ private stopped;
13
+ private initializing?;
14
+ constructor(transport: MaintenanceTransport, configDir: string, serverUrl: string, deviceId: string, config: () => ExecutorConfig | undefined, enabled?: {
15
+ updateNotice?: boolean;
16
+ subscriptionInspection?: boolean;
17
+ });
18
+ started(version: string): Promise<void>;
19
+ private initialize;
20
+ handle(message: any): Promise<boolean>;
21
+ stop(): Promise<void>;
22
+ }
23
+ //# sourceMappingURL=MaintenanceClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaintenanceClient.d.ts","sourceRoot":"","sources":["../../src/maintenance/MaintenanceClient.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,MAAM,WAAW,oBAAoB;IAAG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;CAAE;AAE3H,4FAA4F;AAC5F,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAyB;IACxD,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAgB;gBACzB,SAAS,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EACjG,MAAM,EAAE,MAAM,cAAc,GAAG,SAAS,EAAE,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;KAAO;IAUhH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7C,OAAO,CAAC,UAAU;IAQZ,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAetC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAC5B"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MaintenanceClient = void 0;
4
+ const UpdateNotices_1 = require("./UpdateNotices");
5
+ const CodexStatusProbe_1 = require("./CodexStatusProbe");
6
+ const SubscriptionInspection_1 = require("./SubscriptionInspection");
7
+ const SubscriptionReminderStore_1 = require("./SubscriptionReminderStore");
8
+ /** Local service lifecycle, deliberately independent of normal task and updater routing. */
9
+ class MaintenanceClient {
10
+ updates;
11
+ subscriptions;
12
+ runningVersion;
13
+ bound = false;
14
+ stopped = false;
15
+ initializing;
16
+ constructor(transport, configDir, serverUrl, deviceId, config, enabled = {}) {
17
+ if (enabled.updateNotice !== false)
18
+ this.updates = new UpdateNotices_1.UpdateNotices(configDir, serverUrl, deviceId, m => transport.send(m));
19
+ if (enabled.subscriptionInspection !== false) {
20
+ const probe = new CodexStatusProbe_1.CodexStatusProbe({ config });
21
+ this.subscriptions = new SubscriptionInspection_1.SubscriptionInspection((0, SubscriptionInspection_1.inspectionAdapters)(signal => probe.inspect(signal)), m => transport.send(m), Date.now, undefined, undefined, new SubscriptionReminderStore_1.SubscriptionReminderStore(configDir, serverUrl, deviceId));
22
+ }
23
+ transport.on('disconnected', () => { this.bound = false; this.updates?.disconnected(); this.subscriptions?.disconnected(); });
24
+ }
25
+ async started(version) {
26
+ this.runningVersion = version;
27
+ await this.initialize();
28
+ }
29
+ initialize() {
30
+ if (this.stopped || !this.bound || !this.runningVersion)
31
+ return Promise.resolve();
32
+ return this.initializing ??= (async () => {
33
+ try {
34
+ await this.updates?.started(this.runningVersion);
35
+ }
36
+ catch {
37
+ console.warn('[Maintenance] Update notices unavailable; normal messaging is unchanged.');
38
+ }
39
+ if (!this.stopped)
40
+ this.subscriptions?.start();
41
+ })();
42
+ }
43
+ async handle(message) {
44
+ if (message.type === 'binding_confirm') {
45
+ this.bound = message.data?.success === true;
46
+ this.updates?.registered(message.data?.success === true && message.data?.capabilities?.updateNotice === true);
47
+ this.subscriptions?.registered(message.data?.success === true && message.data?.capabilities?.subscriptionInspection === true);
48
+ await this.initialize();
49
+ return false;
50
+ }
51
+ if (message.type === 'update_notice_ack' || message.type === 'update_notice_view') {
52
+ try {
53
+ await this.updates?.handle(message);
54
+ }
55
+ catch {
56
+ console.warn('[Maintenance] Update notice acknowledgement or paging failed.');
57
+ }
58
+ return true;
59
+ }
60
+ if (message.type === 'subscription_reminder_ack' || message.type === 'subscription_action') {
61
+ await this.subscriptions?.handle(message);
62
+ return true;
63
+ }
64
+ return false;
65
+ }
66
+ async stop() { this.stopped = true; this.updates?.stop(); await this.subscriptions?.stop(); }
67
+ }
68
+ exports.MaintenanceClient = MaintenanceClient;
69
+ //# sourceMappingURL=MaintenanceClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaintenanceClient.js","sourceRoot":"","sources":["../../src/maintenance/MaintenanceClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** Small private, atomic state file. Invalid data fails closed, never erases a ledger. */
2
+ export declare class PrivateStore<T> {
3
+ private readonly filename;
4
+ private readonly validate;
5
+ private writes;
6
+ constructor(filename: string, validate: (value: unknown) => value is T);
7
+ read(): Promise<T | undefined>;
8
+ write(value: T): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=PrivateStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrivateStore.d.ts","sourceRoot":"","sources":["../../src/maintenance/PrivateStore.ts"],"names":[],"mappings":"AAIA,0FAA0F;AAC1F,qBAAa,YAAY,CAAC,CAAC;IAEb,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAAU,OAAO,CAAC,QAAQ,CAAC,QAAQ;IADxE,OAAO,CAAC,MAAM,CAAqB;gBACN,QAAQ,EAAE,MAAM,EAAmB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC;IAElG,IAAI,IAAI,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAapC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAa/B"}