@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.
- package/README.md +41 -9
- package/dist/client/MessageHandler.d.ts.map +1 -1
- package/dist/client/MessageHandler.js +41 -29
- package/dist/client/MessageHandler.js.map +1 -1
- package/dist/client/WebSocketClient.d.ts +6 -0
- package/dist/client/WebSocketClient.d.ts.map +1 -1
- package/dist/client/WebSocketClient.js +4 -0
- package/dist/client/WebSocketClient.js.map +1 -1
- package/dist/commands/config.js +7 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +36 -11
- package/dist/commands/start.js.map +1 -1
- package/dist/delegation/BackendRegistry.d.ts.map +1 -1
- package/dist/delegation/BackendRegistry.js +15 -8
- package/dist/delegation/BackendRegistry.js.map +1 -1
- package/dist/executor/ClaudePersistentExecutor.d.ts.map +1 -1
- package/dist/executor/ClaudePersistentExecutor.js +18 -4
- package/dist/executor/ClaudePersistentExecutor.js.map +1 -1
- package/dist/executor/CodexAppServerClient.d.ts +5 -0
- package/dist/executor/CodexAppServerClient.d.ts.map +1 -1
- package/dist/executor/CodexAppServerClient.js +6 -2
- package/dist/executor/CodexAppServerClient.js.map +1 -1
- package/dist/executor/DshExecutor.d.ts +4 -0
- package/dist/executor/DshExecutor.d.ts.map +1 -1
- package/dist/executor/DshExecutor.js +8 -0
- package/dist/executor/DshExecutor.js.map +1 -1
- package/dist/executor/claude/ClaudeStderrFilter.d.ts +11 -0
- package/dist/executor/claude/ClaudeStderrFilter.d.ts.map +1 -0
- package/dist/executor/claude/ClaudeStderrFilter.js +69 -0
- package/dist/executor/claude/ClaudeStderrFilter.js.map +1 -0
- package/dist/executor/dsh/DshAccountUsage.d.ts +12 -0
- package/dist/executor/dsh/DshAccountUsage.d.ts.map +1 -0
- package/dist/executor/dsh/DshAccountUsage.js +134 -0
- package/dist/executor/dsh/DshAccountUsage.js.map +1 -0
- package/dist/executor/dsh/DshAccountUsagePlugin.d.ts +16 -0
- package/dist/executor/dsh/DshAccountUsagePlugin.d.ts.map +1 -0
- package/dist/executor/dsh/DshAccountUsagePlugin.js +19 -0
- package/dist/executor/dsh/DshAccountUsagePlugin.js.map +1 -0
- package/dist/maintenance/CodexStatusProbe.d.ts +26 -0
- package/dist/maintenance/CodexStatusProbe.d.ts.map +1 -0
- package/dist/maintenance/CodexStatusProbe.js +124 -0
- package/dist/maintenance/CodexStatusProbe.js.map +1 -0
- package/dist/maintenance/CodexWeekly.d.ts +17 -0
- package/dist/maintenance/CodexWeekly.d.ts.map +1 -0
- package/dist/maintenance/CodexWeekly.js +60 -0
- package/dist/maintenance/CodexWeekly.js.map +1 -0
- package/dist/maintenance/MaintenanceClient.d.ts +23 -0
- package/dist/maintenance/MaintenanceClient.d.ts.map +1 -0
- package/dist/maintenance/MaintenanceClient.js +69 -0
- package/dist/maintenance/MaintenanceClient.js.map +1 -0
- package/dist/maintenance/PrivateStore.d.ts +10 -0
- package/dist/maintenance/PrivateStore.d.ts.map +1 -0
- package/dist/maintenance/PrivateStore.js +54 -0
- package/dist/maintenance/PrivateStore.js.map +1 -0
- package/dist/maintenance/ReleaseNotes.d.ts +30 -0
- package/dist/maintenance/ReleaseNotes.d.ts.map +1 -0
- package/dist/maintenance/ReleaseNotes.js +139 -0
- package/dist/maintenance/ReleaseNotes.js.map +1 -0
- package/dist/maintenance/ReleaseOverview.d.ts +23 -0
- package/dist/maintenance/ReleaseOverview.d.ts.map +1 -0
- package/dist/maintenance/ReleaseOverview.js +56 -0
- package/dist/maintenance/ReleaseOverview.js.map +1 -0
- package/dist/maintenance/SubscriptionInspection.d.ts +49 -0
- package/dist/maintenance/SubscriptionInspection.d.ts.map +1 -0
- package/dist/maintenance/SubscriptionInspection.js +193 -0
- package/dist/maintenance/SubscriptionInspection.js.map +1 -0
- package/dist/maintenance/SubscriptionReminderStore.d.ts +12 -0
- package/dist/maintenance/SubscriptionReminderStore.d.ts.map +1 -0
- package/dist/maintenance/SubscriptionReminderStore.js +60 -0
- package/dist/maintenance/SubscriptionReminderStore.js.map +1 -0
- package/dist/maintenance/UpdateNotices.d.ts +21 -0
- package/dist/maintenance/UpdateNotices.d.ts.map +1 -0
- package/dist/maintenance/UpdateNotices.js +104 -0
- package/dist/maintenance/UpdateNotices.js.map +1 -0
- package/dist/maintenance/Version.d.ts +3 -0
- package/dist/maintenance/Version.d.ts.map +1 -0
- package/dist/maintenance/Version.js +42 -0
- package/dist/maintenance/Version.js.map +1 -0
- package/dist/maintenance/release-notes.json +1 -0
- package/dist/service/ServiceManager.d.ts.map +1 -1
- package/dist/service/ServiceManager.js +4 -2
- package/dist/service/ServiceManager.js.map +1 -1
- package/dist/thread/DelegationSettings.d.ts +4 -0
- package/dist/thread/DelegationSettings.d.ts.map +1 -0
- package/dist/thread/DelegationSettings.js +8 -0
- package/dist/thread/DelegationSettings.js.map +1 -0
- package/dist/thread/types.d.ts +1 -1
- package/dist/thread/types.d.ts.map +1 -1
- package/dist/types/config.d.ts +5 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/utils/BackendCommand.d.ts +8 -0
- package/dist/utils/BackendCommand.d.ts.map +1 -0
- package/dist/utils/BackendCommand.js +26 -0
- package/dist/utils/BackendCommand.js.map +1 -0
- package/dist/utils/BackendEnvironment.d.ts +16 -0
- package/dist/utils/BackendEnvironment.d.ts.map +1 -0
- package/dist/utils/BackendEnvironment.js +70 -0
- package/dist/utils/BackendEnvironment.js.map +1 -0
- package/package.json +2 -2
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReleaseOverview.d.ts","sourceRoot":"","sources":["../../src/maintenance/ReleaseOverview.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,QAAW,CAAC;AACvC,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,MAAM,WAAW,aAAa;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAC7E,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,EAAE,CAO5E;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE;IAAE,OAAO,CAAC,EAAE,aAAa,EAAE,CAAA;CAAE,EAAE,EAAE,MAAM,SAAiB,GAAG,eAAe,GAAG,SAAS,CAyBpI"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OVERVIEW_MAX_ITEMS = exports.OVERVIEW_MAX_GROUPS = exports.OVERVIEW_BYTES = void 0;
|
|
4
|
+
exports.validReleaseChanges = validReleaseChanges;
|
|
5
|
+
exports.buildReleaseOverview = buildReleaseOverview;
|
|
6
|
+
exports.OVERVIEW_BYTES = 6 * 1024;
|
|
7
|
+
exports.OVERVIEW_MAX_GROUPS = 6;
|
|
8
|
+
exports.OVERVIEW_MAX_ITEMS = 12;
|
|
9
|
+
function validReleaseChanges(value) {
|
|
10
|
+
return Array.isArray(value) && value.length >= 1 && value.length <= 3 && value.every(change => change && typeof change.topic === 'string' && /^[a-z][a-z0-9-]{0,39}$/.test(change.topic)
|
|
11
|
+
&& typeof change.title === 'string' && change.title.trim() === change.title && change.title.length > 0
|
|
12
|
+
&& Array.from(change.title).length <= 80 && !/[\r\n\[\]<>|*\x60]/.test(change.title)
|
|
13
|
+
&& typeof change.text === 'string' && change.text.trim() === change.text && change.text.length > 0
|
|
14
|
+
&& !/[\r\n]/.test(change.text) && Buffer.byteLength(change.text) <= 2 * 1024);
|
|
15
|
+
}
|
|
16
|
+
/** Aggregate the full selected range, never only the currently displayed page. */
|
|
17
|
+
function buildReleaseOverview(sections, budget = exports.OVERVIEW_BYTES) {
|
|
18
|
+
if (!Number.isFinite(budget) || budget <= 0 || !sections.length || sections.some(section => !section.changes))
|
|
19
|
+
return;
|
|
20
|
+
const groups = new Map();
|
|
21
|
+
for (const section of sections)
|
|
22
|
+
for (const change of section.changes) {
|
|
23
|
+
let group = groups.get(change.topic);
|
|
24
|
+
if (!group) {
|
|
25
|
+
group = { topic: change.topic, title: change.title, items: [], seen: new Set() };
|
|
26
|
+
groups.set(change.topic, group);
|
|
27
|
+
}
|
|
28
|
+
if (!group.seen.has(change.text)) {
|
|
29
|
+
group.items.push(change.text);
|
|
30
|
+
group.seen.add(change.text);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const overview = { groups: [], totalGroups: groups.size,
|
|
34
|
+
totalItems: [...groups.values()].reduce((total, group) => total + group.items.length, 0) };
|
|
35
|
+
let shown = 0;
|
|
36
|
+
const limit = Math.min(budget, exports.OVERVIEW_BYTES);
|
|
37
|
+
for (const group of groups.values()) {
|
|
38
|
+
if (overview.groups.length >= exports.OVERVIEW_MAX_GROUPS || shown >= exports.OVERVIEW_MAX_ITEMS)
|
|
39
|
+
break;
|
|
40
|
+
const visible = { topic: group.topic, title: group.title, items: [] };
|
|
41
|
+
overview.groups.push(visible);
|
|
42
|
+
for (const item of group.items) {
|
|
43
|
+
if (shown >= exports.OVERVIEW_MAX_ITEMS)
|
|
44
|
+
break;
|
|
45
|
+
visible.items.push(item);
|
|
46
|
+
if (Buffer.byteLength(JSON.stringify(overview)) > limit)
|
|
47
|
+
visible.items.pop();
|
|
48
|
+
else
|
|
49
|
+
shown++;
|
|
50
|
+
}
|
|
51
|
+
if (!visible.items.length)
|
|
52
|
+
overview.groups.pop();
|
|
53
|
+
}
|
|
54
|
+
return overview.groups.length ? overview : undefined;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=ReleaseOverview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReleaseOverview.js","sourceRoot":"","sources":["../../src/maintenance/ReleaseOverview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { BackendKey } from '../types/config';
|
|
2
|
+
import { type WeeklyObservation } from './CodexWeekly';
|
|
3
|
+
import type { SubscriptionReminderStore } from './SubscriptionReminderStore';
|
|
4
|
+
export interface InspectionAdapter {
|
|
5
|
+
backend: BackendKey;
|
|
6
|
+
inspect(signal: AbortSignal): Promise<{
|
|
7
|
+
kind: 'unsupported' | 'unavailable';
|
|
8
|
+
} | {
|
|
9
|
+
kind: 'observed';
|
|
10
|
+
observation: WeeklyObservation;
|
|
11
|
+
}>;
|
|
12
|
+
}
|
|
13
|
+
export declare function inspectionAdapters(codex: (signal: AbortSignal) => Promise<WeeklyObservation | undefined>): InspectionAdapter[];
|
|
14
|
+
/** Observations stay in memory; acknowledged delivery suppression can survive CLI restarts. */
|
|
15
|
+
export declare class SubscriptionInspection {
|
|
16
|
+
private readonly adapters;
|
|
17
|
+
private readonly send;
|
|
18
|
+
private readonly now;
|
|
19
|
+
private readonly intervalMs;
|
|
20
|
+
private readonly retryMs;
|
|
21
|
+
private readonly store?;
|
|
22
|
+
private previous?;
|
|
23
|
+
private reminder?;
|
|
24
|
+
private suppressed;
|
|
25
|
+
private accountKey?;
|
|
26
|
+
private conditionRevision;
|
|
27
|
+
private persistenceUnavailable;
|
|
28
|
+
private operations;
|
|
29
|
+
private supported;
|
|
30
|
+
private stopped;
|
|
31
|
+
private inFlight?;
|
|
32
|
+
private timer?;
|
|
33
|
+
private deliveryTimer?;
|
|
34
|
+
private readonly controller;
|
|
35
|
+
private readonly generation;
|
|
36
|
+
constructor(adapters: InspectionAdapter[], send: (message: object) => void, now?: () => number, intervalMs?: number, retryMs?: number, store?: SubscriptionReminderStore | undefined);
|
|
37
|
+
start(): void;
|
|
38
|
+
registered(supported: boolean): void;
|
|
39
|
+
disconnected(): void;
|
|
40
|
+
stop(): Promise<void>;
|
|
41
|
+
cycle(): Promise<void>;
|
|
42
|
+
handle(message: any): Promise<void>;
|
|
43
|
+
private enqueue;
|
|
44
|
+
private disablePersistence;
|
|
45
|
+
private scheduleCycle;
|
|
46
|
+
private deliver;
|
|
47
|
+
private clearDeliveryTimer;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=SubscriptionInspection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubscriptionInspection.d.ts","sourceRoot":"","sources":["../../src/maintenance/SubscriptionInspection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAA8C,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACnG,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAE7E,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,aAAa,GAAG,aAAa,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,WAAW,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAAC;CACvI;AAID,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,GAAG,iBAAiB,EAAE,CAM9H;AAED,+FAA+F;AAC/F,qBAAa,sBAAsB;IAerB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAAuB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAC/E,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAa,OAAO,CAAC,QAAQ,CAAC,UAAU;IAA2B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAC/G,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;IAhBzB,OAAO,CAAC,QAAQ,CAAC,CAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,CAAgB;IACjC,OAAO,CAAC,KAAK,CAAC,CAAgC;IAC9C,OAAO,CAAC,aAAa,CAAC,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;gBACd,QAAQ,EAAE,iBAAiB,EAAE,EAAmB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EACzF,GAAG,eAAW,EAAmB,UAAU,SAAyB,EAAmB,OAAO,SAAS,EACvG,KAAK,CAAC,EAAE,yBAAyB,YAAA;IAEpD,KAAK,IAAI,IAAI;IACb,UAAU,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IACpC,YAAY,IAAI,IAAI;IACd,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6CtB,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBnC,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,kBAAkB;CAC3B"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SubscriptionInspection = void 0;
|
|
4
|
+
exports.inspectionAdapters = inspectionAdapters;
|
|
5
|
+
const crypto_1 = require("crypto");
|
|
6
|
+
const CodexWeekly_1 = require("./CodexWeekly");
|
|
7
|
+
const BACKENDS = ['claude', 'codex', 'agy', 'pi', 'opencode', 'kimi', 'zcode', 'dsh'];
|
|
8
|
+
function inspectionAdapters(codex) {
|
|
9
|
+
return BACKENDS.map(backend => ({ backend, inspect: async (signal) => {
|
|
10
|
+
if (backend !== 'codex')
|
|
11
|
+
return { kind: 'unsupported' };
|
|
12
|
+
const observation = await codex(signal);
|
|
13
|
+
return observation ? { kind: 'observed', observation } : { kind: 'unavailable' };
|
|
14
|
+
} }));
|
|
15
|
+
}
|
|
16
|
+
/** Observations stay in memory; acknowledged delivery suppression can survive CLI restarts. */
|
|
17
|
+
class SubscriptionInspection {
|
|
18
|
+
adapters;
|
|
19
|
+
send;
|
|
20
|
+
now;
|
|
21
|
+
intervalMs;
|
|
22
|
+
retryMs;
|
|
23
|
+
store;
|
|
24
|
+
previous;
|
|
25
|
+
reminder;
|
|
26
|
+
suppressed = false;
|
|
27
|
+
accountKey;
|
|
28
|
+
conditionRevision = 0;
|
|
29
|
+
persistenceUnavailable = false;
|
|
30
|
+
operations = Promise.resolve();
|
|
31
|
+
supported = false;
|
|
32
|
+
stopped = false;
|
|
33
|
+
inFlight;
|
|
34
|
+
timer;
|
|
35
|
+
deliveryTimer;
|
|
36
|
+
controller = new AbortController();
|
|
37
|
+
generation = (0, crypto_1.randomUUID)();
|
|
38
|
+
constructor(adapters, send, now = Date.now, intervalMs = CodexWeekly_1.INSPECTION_INTERVAL_MS, retryMs = 60_000, store) {
|
|
39
|
+
this.adapters = adapters;
|
|
40
|
+
this.send = send;
|
|
41
|
+
this.now = now;
|
|
42
|
+
this.intervalMs = intervalMs;
|
|
43
|
+
this.retryMs = retryMs;
|
|
44
|
+
this.store = store;
|
|
45
|
+
}
|
|
46
|
+
start() { if (!this.stopped && !this.timer && !this.inFlight)
|
|
47
|
+
this.scheduleCycle(0); }
|
|
48
|
+
registered(supported) { this.supported = supported; this.deliver(); }
|
|
49
|
+
disconnected() { this.supported = false; this.clearDeliveryTimer(); }
|
|
50
|
+
async stop() {
|
|
51
|
+
this.stopped = true;
|
|
52
|
+
this.disconnected();
|
|
53
|
+
this.controller.abort();
|
|
54
|
+
if (this.timer)
|
|
55
|
+
clearTimeout(this.timer);
|
|
56
|
+
this.timer = undefined;
|
|
57
|
+
await this.inFlight;
|
|
58
|
+
await this.operations;
|
|
59
|
+
this.previous = undefined;
|
|
60
|
+
this.reminder = undefined;
|
|
61
|
+
}
|
|
62
|
+
cycle() {
|
|
63
|
+
if (this.stopped)
|
|
64
|
+
return Promise.resolve();
|
|
65
|
+
if (this.inFlight)
|
|
66
|
+
return this.inFlight;
|
|
67
|
+
const operation = this.enqueue(async () => {
|
|
68
|
+
if (this.stopped || this.persistenceUnavailable)
|
|
69
|
+
return;
|
|
70
|
+
if (this.store) {
|
|
71
|
+
try {
|
|
72
|
+
await this.store.initialize();
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
this.disablePersistence();
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
for (const adapter of this.adapters) {
|
|
80
|
+
if (this.stopped)
|
|
81
|
+
break;
|
|
82
|
+
let result;
|
|
83
|
+
try {
|
|
84
|
+
result = await adapter.inspect(this.controller.signal);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
continue;
|
|
88
|
+
} // Unavailable evidence never clears delivery suppression or a valid baseline.
|
|
89
|
+
if (this.stopped || adapter.backend !== 'codex' || result.kind !== 'observed')
|
|
90
|
+
continue;
|
|
91
|
+
try {
|
|
92
|
+
const current = result.observation;
|
|
93
|
+
if (current.accountKey !== this.accountKey) {
|
|
94
|
+
this.suppressed = this.store ? await this.store.isSuppressed(current.accountKey) : false;
|
|
95
|
+
this.accountKey = current.accountKey;
|
|
96
|
+
this.conditionRevision++;
|
|
97
|
+
this.reminder = undefined;
|
|
98
|
+
this.clearDeliveryTimer();
|
|
99
|
+
this.previous = undefined;
|
|
100
|
+
}
|
|
101
|
+
if (this.previous && (current.identity !== this.previous.identity || current.observedAt < this.previous.observedAt)) {
|
|
102
|
+
this.reminder = undefined;
|
|
103
|
+
this.clearDeliveryTimer();
|
|
104
|
+
this.previous = undefined;
|
|
105
|
+
}
|
|
106
|
+
if (!current.candidate) {
|
|
107
|
+
this.conditionRevision++;
|
|
108
|
+
this.reminder = undefined;
|
|
109
|
+
this.clearDeliveryTimer();
|
|
110
|
+
if (this.suppressed && this.store)
|
|
111
|
+
await this.store.setSuppressed(current.accountKey, false);
|
|
112
|
+
this.suppressed = false;
|
|
113
|
+
}
|
|
114
|
+
if (!this.suppressed && !this.reminder && this.previous && (0, CodexWeekly_1.floatingWeeklyPair)(this.previous, current)) {
|
|
115
|
+
this.reminder = { reminderId: (0, crypto_1.randomUUID)(), generation: this.generation, expiresAt: this.now() + 2 * CodexWeekly_1.INSPECTION_INTERVAL_MS,
|
|
116
|
+
activationAvailable: false, backend: 'codex' };
|
|
117
|
+
this.deliver();
|
|
118
|
+
}
|
|
119
|
+
// Retry samples within the hourly cadence do not replace the previous independent sample.
|
|
120
|
+
if (!this.previous || current.observedAt - this.previous.observedAt >= this.intervalMs - 120_000 || !current.candidate)
|
|
121
|
+
this.previous = current;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
this.disablePersistence();
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
this.inFlight = operation;
|
|
130
|
+
return operation.finally(() => { if (this.inFlight === operation)
|
|
131
|
+
this.inFlight = undefined; });
|
|
132
|
+
}
|
|
133
|
+
handle(message) {
|
|
134
|
+
if (!this.supported || !this.reminder || !this.accountKey || message.reminderId !== this.reminder.reminderId || message.generation !== this.generation
|
|
135
|
+
|| this.reminder.expiresAt <= this.now())
|
|
136
|
+
return Promise.resolve();
|
|
137
|
+
if (message.type === 'subscription_reminder_ack' || message.type === 'subscription_action' && message.decision === 'dismiss') {
|
|
138
|
+
const accountKey = this.accountKey, revision = this.conditionRevision;
|
|
139
|
+
this.suppressed = true;
|
|
140
|
+
this.clearDeliveryTimer();
|
|
141
|
+
return this.enqueue(async () => {
|
|
142
|
+
// A valid non-candidate observation takes precedence over an ACK queued during that probe.
|
|
143
|
+
if (this.persistenceUnavailable || this.accountKey === accountKey && this.conditionRevision !== revision)
|
|
144
|
+
return;
|
|
145
|
+
try {
|
|
146
|
+
await this.store?.setSuppressed(accountKey, true);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
this.disablePersistence();
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
// Every other action is ignored: quota notices never execute prompts or trigger extra probes.
|
|
154
|
+
return Promise.resolve();
|
|
155
|
+
}
|
|
156
|
+
enqueue(operation) {
|
|
157
|
+
const result = this.operations.then(operation);
|
|
158
|
+
this.operations = result.catch(() => { });
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
disablePersistence() {
|
|
162
|
+
if (!this.persistenceUnavailable)
|
|
163
|
+
console.warn('[Maintenance] Quota reminders paused: local delivery state is unavailable. Normal messaging is unchanged.');
|
|
164
|
+
this.persistenceUnavailable = true;
|
|
165
|
+
this.clearDeliveryTimer();
|
|
166
|
+
}
|
|
167
|
+
scheduleCycle(delay) {
|
|
168
|
+
this.timer = setTimeout(() => {
|
|
169
|
+
this.timer = undefined;
|
|
170
|
+
void this.cycle().finally(() => { if (!this.stopped)
|
|
171
|
+
this.scheduleCycle(this.intervalMs); });
|
|
172
|
+
}, delay);
|
|
173
|
+
this.timer.unref?.();
|
|
174
|
+
}
|
|
175
|
+
deliver() {
|
|
176
|
+
if (this.stopped || this.persistenceUnavailable || !this.supported || !this.reminder || this.suppressed || this.deliveryTimer)
|
|
177
|
+
return;
|
|
178
|
+
if (this.reminder.expiresAt <= this.now()) {
|
|
179
|
+
this.reminder = undefined;
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
this.send({ type: 'subscription_reminder', reminder: this.reminder });
|
|
184
|
+
}
|
|
185
|
+
catch { /* Retry only the card, never a model request. */ }
|
|
186
|
+
this.deliveryTimer = setTimeout(() => { this.deliveryTimer = undefined; this.deliver(); }, this.retryMs);
|
|
187
|
+
this.deliveryTimer.unref?.();
|
|
188
|
+
}
|
|
189
|
+
clearDeliveryTimer() { if (this.deliveryTimer)
|
|
190
|
+
clearTimeout(this.deliveryTimer); this.deliveryTimer = undefined; }
|
|
191
|
+
}
|
|
192
|
+
exports.SubscriptionInspection = SubscriptionInspection;
|
|
193
|
+
//# sourceMappingURL=SubscriptionInspection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubscriptionInspection.js","sourceRoot":"","sources":["../../src/maintenance/SubscriptionInspection.ts"],"names":[],"mappings":";;;AAYA,gDAMC;AAlBD,mCAAoC;AAEpC,+CAAmG;AASnG,MAAM,QAAQ,GAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACpG,SAAgB,kBAAkB,CAAC,KAAsE;IACvG,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;YACjE,IAAI,OAAO,KAAK,OAAO;gBAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;YACxD,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;YACxC,OAAO,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QACnF,CAAC,EAAE,CAAC,CAAC,CAAC;AACR,CAAC;AAED,+FAA+F;AAC/F,MAAa,sBAAsB;IAeJ;IAAgD;IAC1D;IAAiC;IAAsD;IACvF;IAhBX,QAAQ,CAAqB;IAC7B,QAAQ,CAAY;IACpB,UAAU,GAAG,KAAK,CAAC;IACnB,UAAU,CAAU;IACpB,iBAAiB,GAAG,CAAC,CAAC;IACtB,sBAAsB,GAAG,KAAK,CAAC;IAC/B,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAC/B,SAAS,GAAG,KAAK,CAAC;IAClB,OAAO,GAAG,KAAK,CAAC;IAChB,QAAQ,CAAiB;IACzB,KAAK,CAAiC;IACtC,aAAa,CAAiC;IACrC,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,UAAU,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC3C,YAA6B,QAA6B,EAAmB,IAA+B,EACzF,MAAM,IAAI,CAAC,GAAG,EAAmB,aAAa,oCAAsB,EAAmB,UAAU,MAAM,EACvG,KAAiC;QAFvB,aAAQ,GAAR,QAAQ,CAAqB;QAAmB,SAAI,GAAJ,IAAI,CAA2B;QACzF,QAAG,GAAH,GAAG,CAAW;QAAmB,eAAU,GAAV,UAAU,CAAyB;QAAmB,YAAO,GAAP,OAAO,CAAS;QACvG,UAAK,GAAL,KAAK,CAA4B;IAAG,CAAC;IAExD,KAAK,KAAW,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,UAAU,CAAC,SAAkB,IAAU,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpF,YAAY,KAAW,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAClE,IAAI,IAAI,CAAC,KAAK;YAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACjE,MAAM,IAAI,CAAC,QAAQ,CAAC;QACpB,MAAM,IAAI,CAAC,UAAU,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAAC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IACvD,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YACxC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,sBAAsB;gBAAE,OAAO;YACxD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC;oBAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBAAC,CAAC;gBACtC,MAAM,CAAC;oBAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAAC,OAAO;gBAAC,CAAC;YAC9C,CAAC;YACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpC,IAAI,IAAI,CAAC,OAAO;oBAAE,MAAM;gBACxB,IAAI,MAAyD,CAAC;gBAC9D,IAAI,CAAC;oBAAC,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAAC,CAAC;gBAC/D,MAAM,CAAC;oBAAC,SAAS;gBAAC,CAAC,CAAC,8EAA8E;gBAClG,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;oBAAE,SAAS;gBACxF,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC;oBACnC,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;wBAC3C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;wBACzF,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;wBAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBAC/D,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;wBAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBAAC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;oBAClF,CAAC;oBACD,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;wBACpH,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;wBAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBAAC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;oBAClF,CAAC;oBACD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;wBACvB,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBACzB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;wBAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBACrD,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK;4BAAE,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;wBAC7F,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;oBAC1B,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAA,gCAAkB,EAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;wBACtG,IAAI,CAAC,QAAQ,GAAG,EAAE,UAAU,EAAE,IAAA,mBAAU,GAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,oCAAsB;4BACzH,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;wBACjD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACjB,CAAC;oBACD,0FAA0F;oBAC1F,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS;wBAAE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;gBAClJ,CAAC;gBAAC,MAAM,CAAC;oBAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAAC,MAAM;gBAAC,CAAC;YAC/C,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,OAAO,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,CAAC;IAED,MAAM,CAAC,OAAY;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU;eACjJ,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QACrE,IAAI,OAAO,CAAC,IAAI,KAAK,2BAA2B,IAAI,OAAO,CAAC,IAAI,KAAK,qBAAqB,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC7H,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACtE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;gBAC7B,2FAA2F;gBAC3F,IAAI,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,IAAI,IAAI,CAAC,iBAAiB,KAAK,QAAQ;oBAAE,OAAO;gBACjH,IAAI,CAAC;oBAAC,MAAM,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBAAC,CAAC;gBAC1D,MAAM,CAAC;oBAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC;QACD,8FAA8F;QAC9F,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAEO,OAAO,CAAC,SAA8B;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,IAAI,CAAC,sBAAsB;YAAE,OAAO,CAAC,IAAI,CAAC,2GAA2G,CAAC,CAAC;QAC5J,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAChE,CAAC;IAEO,aAAa,CAAC,KAAa;QACjC,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/F,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IACvB,CAAC;IACO,OAAO;QACb,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QACtI,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAAC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;YAAC,OAAO;QAAC,CAAC;QACjF,IAAI,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iDAAiD,CAAC,CAAC;QAC1I,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACzG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC;IAC/B,CAAC;IACO,kBAAkB,KAAW,IAAI,IAAI,CAAC,aAAa;QAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC;CACjI;AAtHD,wDAsHC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Persist delivery suppression, never credentials, raw account IDs, or quota observations. */
|
|
2
|
+
export declare class SubscriptionReminderStore {
|
|
3
|
+
private readonly store;
|
|
4
|
+
private accounts;
|
|
5
|
+
private initializing?;
|
|
6
|
+
private operations;
|
|
7
|
+
constructor(configDir: string, serverUrl: string, deviceId: string);
|
|
8
|
+
initialize(): Promise<void>;
|
|
9
|
+
isSuppressed(accountKey: string): Promise<boolean>;
|
|
10
|
+
setSuppressed(accountKey: string, suppressed: boolean): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=SubscriptionReminderStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubscriptionReminderStore.d.ts","sourceRoot":"","sources":["../../src/maintenance/SubscriptionReminderStore.ts"],"names":[],"mappings":"AAcA,+FAA+F;AAC/F,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,YAAY,CAAC,CAAgB;IACrC,OAAO,CAAC,UAAU,CAAqB;gBAE3B,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAKlE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOxD,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAatE"}
|