@yu_robotics/remote-cli 1.6.121 → 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 (63) hide show
  1. package/README.md +21 -1
  2. package/dist/client/WebSocketClient.d.ts +6 -0
  3. package/dist/client/WebSocketClient.d.ts.map +1 -1
  4. package/dist/client/WebSocketClient.js +4 -0
  5. package/dist/client/WebSocketClient.js.map +1 -1
  6. package/dist/commands/config.js +7 -0
  7. package/dist/commands/config.js.map +1 -1
  8. package/dist/commands/start.d.ts.map +1 -1
  9. package/dist/commands/start.js +11 -0
  10. package/dist/commands/start.js.map +1 -1
  11. package/dist/executor/CodexAppServerClient.d.ts +5 -0
  12. package/dist/executor/CodexAppServerClient.d.ts.map +1 -1
  13. package/dist/executor/CodexAppServerClient.js +6 -2
  14. package/dist/executor/CodexAppServerClient.js.map +1 -1
  15. package/dist/executor/claude/ClaudeStderrFilter.d.ts +1 -1
  16. package/dist/executor/claude/ClaudeStderrFilter.d.ts.map +1 -1
  17. package/dist/executor/claude/ClaudeStderrFilter.js +3 -2
  18. package/dist/executor/claude/ClaudeStderrFilter.js.map +1 -1
  19. package/dist/maintenance/CodexStatusProbe.d.ts +26 -0
  20. package/dist/maintenance/CodexStatusProbe.d.ts.map +1 -0
  21. package/dist/maintenance/CodexStatusProbe.js +124 -0
  22. package/dist/maintenance/CodexStatusProbe.js.map +1 -0
  23. package/dist/maintenance/CodexWeekly.d.ts +17 -0
  24. package/dist/maintenance/CodexWeekly.d.ts.map +1 -0
  25. package/dist/maintenance/CodexWeekly.js +60 -0
  26. package/dist/maintenance/CodexWeekly.js.map +1 -0
  27. package/dist/maintenance/MaintenanceClient.d.ts +23 -0
  28. package/dist/maintenance/MaintenanceClient.d.ts.map +1 -0
  29. package/dist/maintenance/MaintenanceClient.js +69 -0
  30. package/dist/maintenance/MaintenanceClient.js.map +1 -0
  31. package/dist/maintenance/PrivateStore.d.ts +10 -0
  32. package/dist/maintenance/PrivateStore.d.ts.map +1 -0
  33. package/dist/maintenance/PrivateStore.js +54 -0
  34. package/dist/maintenance/PrivateStore.js.map +1 -0
  35. package/dist/maintenance/ReleaseNotes.d.ts +30 -0
  36. package/dist/maintenance/ReleaseNotes.d.ts.map +1 -0
  37. package/dist/maintenance/ReleaseNotes.js +139 -0
  38. package/dist/maintenance/ReleaseNotes.js.map +1 -0
  39. package/dist/maintenance/ReleaseOverview.d.ts +23 -0
  40. package/dist/maintenance/ReleaseOverview.d.ts.map +1 -0
  41. package/dist/maintenance/ReleaseOverview.js +56 -0
  42. package/dist/maintenance/ReleaseOverview.js.map +1 -0
  43. package/dist/maintenance/SubscriptionInspection.d.ts +49 -0
  44. package/dist/maintenance/SubscriptionInspection.d.ts.map +1 -0
  45. package/dist/maintenance/SubscriptionInspection.js +193 -0
  46. package/dist/maintenance/SubscriptionInspection.js.map +1 -0
  47. package/dist/maintenance/SubscriptionReminderStore.d.ts +12 -0
  48. package/dist/maintenance/SubscriptionReminderStore.d.ts.map +1 -0
  49. package/dist/maintenance/SubscriptionReminderStore.js +60 -0
  50. package/dist/maintenance/SubscriptionReminderStore.js.map +1 -0
  51. package/dist/maintenance/UpdateNotices.d.ts +21 -0
  52. package/dist/maintenance/UpdateNotices.d.ts.map +1 -0
  53. package/dist/maintenance/UpdateNotices.js +104 -0
  54. package/dist/maintenance/UpdateNotices.js.map +1 -0
  55. package/dist/maintenance/Version.d.ts +3 -0
  56. package/dist/maintenance/Version.d.ts.map +1 -0
  57. package/dist/maintenance/Version.js +42 -0
  58. package/dist/maintenance/Version.js.map +1 -0
  59. package/dist/maintenance/release-notes.json +1 -0
  60. package/dist/types/config.d.ts +5 -0
  61. package/dist/types/config.d.ts.map +1 -1
  62. package/dist/types/config.js.map +1 -1
  63. package/package.json +2 -2
@@ -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":";;;;;;AAAA,2DAA6B;AAC7B,gDAAwB;AACxB,4CAAoB;AACpB,2EAA0G;AAC1G,4DAA4D;AAE5D,+CAA+E;AAgB/E,gIAAgI;AAChI,MAAa,gBAAgB;IAGE;IAFZ,YAAY,CAA4C;IACxD,GAAG,CAAe;IACnC,YAA6B,OAAqB;QAArB,YAAO,GAAP,OAAO,CAAc;QAChD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,2CAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAmB;QAC/B,IAAI,SAA6B,CAAC;QAClC,IAAI,MAAqC,CAAC;QAC1C,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,KAAgD,CAAC;QACrD,MAAM,YAAY,GAAG,GAAG,EAAE,GAAG,IAAI,QAAQ,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3G,IAAI,KAA+B,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAChD,KAAK,GAAG,GAAG,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC,CAAC;gBACvI,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YAClB,CAAC,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC5B,YAAY,EAAE,CAAC;gBACf,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;gBAC9G,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;gBACpD,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAAC,YAAY,EAAE,CAAC;gBACrD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI;oBAAE,OAAO;gBACpD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;gBAAC,YAAY,EAAE,CAAC;gBAC7E,8FAA8F;gBAC9F,MAAM,KAAK,GAAG,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC;gBAC/E,IAAI,IAAI,EAAE,SAAS,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK;uBAC1F,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG;oBAAE,OAAO;gBACnF,MAAM,oBAAoB,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACxE,SAAS,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;gBAAC,YAAY,EAAE,CAAC;gBAC3F,MAAM,kBAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAAC,YAAY,EAAE,CAAC;gBACjD,MAAM,GAAG,GAAsB,EAAE,CAAC;gBAClC,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,CAAC,EAAE,CAAC;oBAC5L,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS;wBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACrE,CAAC;gBACD,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC3B,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC;gBACvB,MAAM,SAAS,GAAG,CAAC,wCAAwC,EAAE,yBAAyB,EAAE,+BAA+B;oBACrH,yBAAyB,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,uBAAuB;oBAC1G,2BAA2B,EAAE,qBAAqB,EAAE,4BAA4B,CAAC,CAAC;gBACpF,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,IAAA,kCAAiB,EAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG;oBAC1G,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;oBACzB,mFAAmF;oBACnF,IAAI,OAAO,CAAC,EAAE,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM;wBAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,gDAAgD,CAAC,CAAC;gBAC/H,CAAC,CAAC,CAAC;gBACH,wGAAwG;gBACxG,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAAC,YAAY,EAAE,CAAC;gBAC3H,MAAM,SAAS,GAAG,UAAU,EAAE,MAAM,CAAC;gBACrC,IAAI,SAAS,EAAE,0BAA0B,KAAK,WAAW,IAAI,SAAS,CAAC,cAAc,KAAK,QAAQ;uBAC7F,SAAS,CAAC,SAAS,EAAE,OAAO,KAAK,KAAK,IAAI,SAAS,CAAC,QAAQ,EAAE,OAAO,KAAK,KAAK;uBAC/E,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,KAAK,CAAC;oBAAE,OAAO;gBACzG,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAAC,YAAY,EAAE,CAAC;gBACpL,IAAI,KAAK,EAAE,IAAI,KAAK,mBAAmB;oBAAE,OAAO;gBAChD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAAC,YAAY,EAAE,CAAC;gBAC3I,MAAM,KAAK,GAAG,MAAM,kBAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAAC,YAAY,EAAE,CAAC;gBACtD,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,KAAK,oBAAoB;oBAAE,OAAO;gBACnF,OAAO,IAAA,oCAAsB,EAAC,GAAG,EAAE,SAAS,EAAE,oBAAoB,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAClF,CAAC,CAAC,EAAE,CAAC;YACL,6GAA6G;YAC7G,IAAI,CAAC;gBAAC,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;YAAC,CAAC;oBACjD,CAAC;gBAAC,QAAQ,GAAG,IAAI,CAAC;gBAAC,MAAM,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO;QAAC,CAAC;gBACX,CAAC;YACP,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,KAAK;gBAAE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACtD,IAAI,CAAC;gBAAC,MAAM,MAAM,EAAE,IAAI,EAAE,CAAC;YAAC,CAAC;YAC7B,MAAM,CAAC,CAAC,0FAA0F;gBAAC,SAAS,GAAG,SAAS,CAAC;YAAC,CAAC;YAC3H,IAAI,SAAS;gBAAE,MAAM,kBAAE,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;CACF;AA5ED,4CA4EC"}
@@ -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"}
@@ -0,0 +1,54 @@
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.PrivateStore = void 0;
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const crypto_1 = require("crypto");
10
+ /** Small private, atomic state file. Invalid data fails closed, never erases a ledger. */
11
+ class PrivateStore {
12
+ filename;
13
+ validate;
14
+ writes = Promise.resolve();
15
+ constructor(filename, validate) {
16
+ this.filename = filename;
17
+ this.validate = validate;
18
+ }
19
+ async read() {
20
+ try {
21
+ const stat = await promises_1.default.lstat(this.filename);
22
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.size > 1024 * 1024)
23
+ throw new Error('Unsafe maintenance state.');
24
+ const value = JSON.parse(await promises_1.default.readFile(this.filename, 'utf8'));
25
+ if (!this.validate(value))
26
+ throw new Error('Invalid maintenance state.');
27
+ return value;
28
+ }
29
+ catch (error) {
30
+ if (error.code === 'ENOENT')
31
+ return;
32
+ throw new Error('Maintenance state could not be read.');
33
+ }
34
+ }
35
+ write(value) {
36
+ const operation = this.writes.then(async () => {
37
+ if (!this.validate(value) || Buffer.byteLength(JSON.stringify(value)) > 1024 * 1024)
38
+ throw new Error('Invalid maintenance state.');
39
+ await promises_1.default.mkdir(path_1.default.dirname(this.filename), { recursive: true, mode: 0o700 });
40
+ const temporary = `${this.filename}.${(0, crypto_1.randomUUID)()}.tmp`;
41
+ try {
42
+ await promises_1.default.writeFile(temporary, JSON.stringify(value), { flag: 'wx', mode: 0o600 });
43
+ await promises_1.default.rename(temporary, this.filename);
44
+ }
45
+ finally {
46
+ await promises_1.default.rm(temporary, { force: true });
47
+ }
48
+ });
49
+ this.writes = operation.catch(() => { });
50
+ return operation;
51
+ }
52
+ }
53
+ exports.PrivateStore = PrivateStore;
54
+ //# sourceMappingURL=PrivateStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrivateStore.js","sourceRoot":"","sources":["../../src/maintenance/PrivateStore.ts"],"names":[],"mappings":";;;;;;AAAA,2DAA6B;AAC7B,gDAAwB;AACxB,mCAAoC;AAEpC,0FAA0F;AAC1F,MAAa,YAAY;IAEM;IAAmC;IADxD,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IACnC,YAA6B,QAAgB,EAAmB,QAAwC;QAA3E,aAAQ,GAAR,QAAQ,CAAQ;QAAmB,aAAQ,GAAR,QAAQ,CAAgC;IAAG,CAAC;IAE5G,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YACrH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,kBAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YACnE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YACzE,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO;YACpC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAQ;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC5C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YACnI,MAAM,kBAAE,CAAC,KAAK,CAAC,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9E,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAA,mBAAU,GAAE,MAAM,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,kBAAE,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAClF,MAAM,kBAAE,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5C,CAAC;oBAAS,CAAC;gBAAC,MAAM,kBAAE,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AA9BD,oCA8BC"}
@@ -0,0 +1,30 @@
1
+ import { type ReleaseChange, type ReleaseOverview } from './ReleaseOverview';
2
+ export declare const NOTICE_INTRODUCTION_VERSION = "1.6.123";
3
+ export declare const NOTICE_PAGE_BYTES: number;
4
+ export declare const USER_SUMMARY_BYTES: number;
5
+ export interface ReleaseSection {
6
+ version: string;
7
+ text: string;
8
+ details?: string;
9
+ changes?: ReleaseChange[];
10
+ }
11
+ export interface ReleaseIndex {
12
+ format: 1;
13
+ firstVersion: string;
14
+ sections: ReleaseSection[];
15
+ }
16
+ export interface ReleasePage {
17
+ coverage: 'complete' | 'partial' | 'unavailable';
18
+ sections: ReleaseSection[];
19
+ offset: number;
20
+ nextOffset?: number;
21
+ totalSections: number;
22
+ overview?: ReleaseOverview;
23
+ }
24
+ /** Top-level headings inside fenced examples are not releases. Historical summaries are ignored. */
25
+ export declare function parseReleaseNotes(markdown: string): ReleaseSection[];
26
+ export declare function buildReleaseIndex(markdown: string, currentVersion: string, userMarkdown: string): ReleaseIndex;
27
+ export declare function loadReleaseIndex(): Promise<ReleaseIndex | undefined>;
28
+ /** Pages contain complete Markdown sections. Missing publication history is never invented. */
29
+ export declare function releasePage(index: ReleaseIndex | undefined, from: string, to: string, offset?: number): ReleasePage;
30
+ //# sourceMappingURL=ReleaseNotes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReleaseNotes.d.ts","sourceRoot":"","sources":["../../src/maintenance/ReleaseNotes.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6C,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAExH,eAAO,MAAM,2BAA2B,YAAY,CAAC;AACrD,eAAO,MAAM,iBAAiB,QAAY,CAAC;AAC3C,eAAO,MAAM,kBAAkB,QAAW,CAAC;AAE3C,MAAM,WAAW,cAAc;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,aAAa,EAAE,CAAA;CAAE;AAC9G,MAAM,WAAW,YAAY;IAAG,MAAM,EAAE,CAAC,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,EAAE,CAAA;CAAE;AAC7F,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,aAAa,CAAC;IACjD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,oGAAoG;AACpG,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE,CAkBpE;AAmBD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,YAAY,CAyB9G;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAU1E;AAED,+FAA+F;AAC/F,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,WAAW,CAsB9G"}
@@ -0,0 +1,139 @@
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.USER_SUMMARY_BYTES = exports.NOTICE_PAGE_BYTES = exports.NOTICE_INTRODUCTION_VERSION = void 0;
7
+ exports.parseReleaseNotes = parseReleaseNotes;
8
+ exports.buildReleaseIndex = buildReleaseIndex;
9
+ exports.loadReleaseIndex = loadReleaseIndex;
10
+ exports.releasePage = releasePage;
11
+ const promises_1 = __importDefault(require("fs/promises"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const Version_1 = require("./Version");
14
+ const ReleaseOverview_1 = require("./ReleaseOverview");
15
+ exports.NOTICE_INTRODUCTION_VERSION = '1.6.123';
16
+ exports.NOTICE_PAGE_BYTES = 20 * 1024;
17
+ exports.USER_SUMMARY_BYTES = 2 * 1024;
18
+ /** Top-level headings inside fenced examples are not releases. Historical summaries are ignored. */
19
+ function parseReleaseNotes(markdown) {
20
+ const result = [];
21
+ let current;
22
+ let fence;
23
+ for (const line of markdown.split(/\r?\n/)) {
24
+ const marker = /^\s{0,3}(`{3,}|~{3,})/.exec(line)?.[1];
25
+ if (marker) {
26
+ if (!fence)
27
+ fence = marker;
28
+ else if (marker[0] === fence[0] && marker.length >= fence.length)
29
+ fence = undefined;
30
+ }
31
+ if (!fence && /^##\s/.test(line)) {
32
+ const match = /^##\s+(?:\[([^\]]+)\]|(\S+))(?:\s+-\s+\d{4}-\d{2}-\d{2})?\s*$/.exec(line);
33
+ const version = match?.[1] ?? match?.[2];
34
+ current = version && (0, Version_1.validNoticeVersion)(version) ? { version, text: '' } : undefined;
35
+ if (current) {
36
+ if (result.some(s => (0, Version_1.compareNoticeVersions)(s.version, current.version) === 0))
37
+ throw new Error('Duplicate release version.');
38
+ result.push(current);
39
+ }
40
+ }
41
+ else if (current)
42
+ current.text += `${line}\n`;
43
+ }
44
+ return result.map(s => ({ ...s, text: s.text.trim() })).sort((a, b) => (0, Version_1.compareNoticeVersions)(b.version, a.version));
45
+ }
46
+ function validateUserSummary(section) {
47
+ const lines = section.text.split(/\r?\n/).filter(line => line.trim());
48
+ if (lines.length < 2 || lines.length > 4 || !/^###\s+\S/.test(lines[0]) || Array.from(lines[0]).length > 100
49
+ || lines.slice(1).some(line => !/^- \S/.test(line))) {
50
+ throw new Error('User release summaries require one short heading and one to three single-line bullets.');
51
+ }
52
+ if (!/\p{Script=Han}/u.test(section.text))
53
+ throw new Error('User release summaries require Chinese text.');
54
+ if (Buffer.byteLength(section.text) > exports.USER_SUMMARY_BYTES)
55
+ throw new Error('User release summary exceeds the summary budget.');
56
+ const changes = lines.slice(1).map(line => {
57
+ const match = /^- \[([a-z][a-z0-9-]{0,39})\|([^\]\r\n|]+)\] (\S.*)$/.exec(line);
58
+ if (!match)
59
+ throw new Error('User release bullets require a stable feature tag and display title.');
60
+ return { topic: match[1], title: match[2], text: match[3] };
61
+ });
62
+ if (!(0, ReleaseOverview_1.validReleaseChanges)(changes))
63
+ throw new Error('Invalid user release feature metadata.');
64
+ return { text: [lines[0], ...changes.map(change => `- ${change.text}`)].join('\n'), changes };
65
+ }
66
+ function buildReleaseIndex(markdown, currentVersion, userMarkdown) {
67
+ const technical = parseReleaseNotes(markdown).filter(s => (0, Version_1.compareNoticeVersions)(s.version, exports.NOTICE_INTRODUCTION_VERSION) >= 0
68
+ && (0, Version_1.compareNoticeVersions)(s.version, currentVersion) <= 0);
69
+ if (!technical.some(s => (0, Version_1.compareNoticeVersions)(s.version, currentVersion) === 0 && s.text))
70
+ throw new Error('Current release requires a changelog entry.');
71
+ const summaries = parseReleaseNotes(userMarkdown).filter(s => (0, Version_1.compareNoticeVersions)(s.version, exports.NOTICE_INTRODUCTION_VERSION) >= 0
72
+ && (0, Version_1.compareNoticeVersions)(s.version, currentVersion) <= 0);
73
+ if (!summaries.some(s => (0, Version_1.compareNoticeVersions)(s.version, currentVersion) === 0 && s.text))
74
+ throw new Error('Current release requires a user release summary.');
75
+ const localized = new Map();
76
+ const titles = new Map();
77
+ for (const summary of summaries) {
78
+ const parsed = validateUserSummary(summary);
79
+ for (const change of parsed.changes) {
80
+ if (titles.has(change.topic) && titles.get(change.topic) !== change.title)
81
+ throw new Error('Release feature tags must retain a stable display title.');
82
+ titles.set(change.topic, change.title);
83
+ }
84
+ localized.set(summary.version, parsed);
85
+ if (!technical.some(s => (0, Version_1.compareNoticeVersions)(s.version, summary.version) === 0 && s.text))
86
+ throw new Error('User release summary requires a matching changelog entry.');
87
+ }
88
+ const sections = technical.map(section => {
89
+ const summary = summaries.find(s => (0, Version_1.compareNoticeVersions)(s.version, section.version) === 0);
90
+ return summary ? { version: section.version, ...localized.get(summary.version), details: section.text } : section;
91
+ });
92
+ // Oversized sections are rejected at release time rather than silently chopped at runtime.
93
+ if (sections.some(s => Buffer.byteLength(JSON.stringify(s)) > exports.NOTICE_PAGE_BYTES - 1024))
94
+ throw new Error('Release section exceeds the notice page budget.');
95
+ return { format: 1, firstVersion: exports.NOTICE_INTRODUCTION_VERSION, sections };
96
+ }
97
+ async function loadReleaseIndex() {
98
+ try {
99
+ const value = JSON.parse(await promises_1.default.readFile(path_1.default.join(__dirname, 'release-notes.json'), 'utf8'));
100
+ if (value?.format !== 1 || !(0, Version_1.validNoticeVersion)(value.firstVersion) || !Array.isArray(value.sections)
101
+ || value.sections.some((s) => !(0, Version_1.validNoticeVersion)(s?.version) || typeof s.text !== 'string'
102
+ || s.details !== undefined && typeof s.details !== 'string'
103
+ || s.changes !== undefined && !(0, ReleaseOverview_1.validReleaseChanges)(s.changes)
104
+ || Buffer.byteLength(JSON.stringify(s)) > exports.NOTICE_PAGE_BYTES - 1024))
105
+ return;
106
+ return value;
107
+ }
108
+ catch {
109
+ return;
110
+ }
111
+ }
112
+ /** Pages contain complete Markdown sections. Missing publication history is never invented. */
113
+ function releasePage(index, from, to, offset = 0) {
114
+ if (!(0, Version_1.validNoticeVersion)(from) || !(0, Version_1.validNoticeVersion)(to) || (0, Version_1.compareNoticeVersions)(from, to) >= 0
115
+ || !Number.isSafeInteger(offset) || offset < 0)
116
+ throw new Error('Invalid release-note range.');
117
+ const available = (index?.sections ?? []).filter(s => (0, Version_1.compareNoticeVersions)(s.version, from) > 0
118
+ && (0, Version_1.compareNoticeVersions)(s.version, to) <= 0).sort((a, b) => (0, Version_1.compareNoticeVersions)(b.version, a.version));
119
+ const coverage = !available.length ? 'unavailable' : index && (0, Version_1.compareNoticeVersions)(from, index.firstVersion) >= 0
120
+ && available.some(s => (0, Version_1.compareNoticeVersions)(s.version, to) === 0) ? 'complete' : 'partial';
121
+ // Feature metadata remains local; only the bounded overview crosses the wire.
122
+ const views = available.map(section => ({ version: section.version, text: section.text,
123
+ ...(section.details === undefined ? {} : { details: section.details }) }));
124
+ const largest = views.reduce((size, section) => Math.max(size, Buffer.byteLength(JSON.stringify(section))), 0);
125
+ const overview = (0, ReleaseOverview_1.buildReleaseOverview)(available, exports.NOTICE_PAGE_BYTES - 1024 - largest);
126
+ const sections = [];
127
+ let bytes = 1024 + (overview ? Buffer.byteLength(JSON.stringify(overview)) : 0);
128
+ for (const s of views.slice(offset)) {
129
+ const size = Buffer.byteLength(JSON.stringify(s));
130
+ if (sections.length >= 10 || bytes + size > exports.NOTICE_PAGE_BYTES)
131
+ break;
132
+ sections.push(s);
133
+ bytes += size;
134
+ }
135
+ const next = offset + sections.length;
136
+ return { coverage, sections, offset, totalSections: available.length, ...(overview ? { overview } : {}),
137
+ ...(next < available.length ? { nextOffset: next } : {}) };
138
+ }
139
+ //# sourceMappingURL=ReleaseNotes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReleaseNotes.js","sourceRoot":"","sources":["../../src/maintenance/ReleaseNotes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export declare const OVERVIEW_BYTES: number;
2
+ export declare const OVERVIEW_MAX_GROUPS = 6;
3
+ export declare const OVERVIEW_MAX_ITEMS = 12;
4
+ export interface ReleaseChange {
5
+ topic: string;
6
+ title: string;
7
+ text: string;
8
+ }
9
+ export interface ReleaseOverview {
10
+ groups: {
11
+ topic: string;
12
+ title: string;
13
+ items: string[];
14
+ }[];
15
+ totalGroups: number;
16
+ totalItems: number;
17
+ }
18
+ export declare function validReleaseChanges(value: unknown): value is ReleaseChange[];
19
+ /** Aggregate the full selected range, never only the currently displayed page. */
20
+ export declare function buildReleaseOverview(sections: {
21
+ changes?: ReleaseChange[];
22
+ }[], budget?: number): ReleaseOverview | undefined;
23
+ //# sourceMappingURL=ReleaseOverview.d.ts.map