pixivflow 2.12.3 → 2.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -4
- package/README_EN.md +11 -3
- package/config/fly-two-bots.example.json +3 -1
- package/dist/commands/DoctorCommand.d.ts +20 -0
- package/dist/commands/DoctorCommand.d.ts.map +1 -0
- package/dist/commands/DoctorCommand.js +107 -0
- package/dist/commands/DoctorCommand.js.map +1 -0
- package/dist/commands/OutboxCommand.d.ts +17 -0
- package/dist/commands/OutboxCommand.d.ts.map +1 -0
- package/dist/commands/OutboxCommand.js +102 -0
- package/dist/commands/OutboxCommand.js.map +1 -0
- package/dist/commands/ReconcileCommand.d.ts +24 -0
- package/dist/commands/ReconcileCommand.d.ts.map +1 -0
- package/dist/commands/ReconcileCommand.js +70 -0
- package/dist/commands/ReconcileCommand.js.map +1 -0
- package/dist/commands/SchedulerCommand.d.ts.map +1 -1
- package/dist/commands/SchedulerCommand.js +5 -0
- package/dist/commands/SchedulerCommand.js.map +1 -1
- package/dist/commands/SchedulerRunOnceCommand.d.ts.map +1 -1
- package/dist/commands/SchedulerRunOnceCommand.js +6 -0
- package/dist/commands/SchedulerRunOnceCommand.js.map +1 -1
- package/dist/commands/index.d.ts +4 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +10 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/scheduler-runtime.d.ts +10 -1
- package/dist/commands/scheduler-runtime.d.ts.map +1 -1
- package/dist/commands/scheduler-runtime.js +157 -47
- package/dist/commands/scheduler-runtime.js.map +1 -1
- package/dist/config/types.d.ts +14 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +10 -0
- package/dist/config/validation.js.map +1 -1
- package/dist/delivery/DeliveryAck.d.ts +70 -0
- package/dist/delivery/DeliveryAck.d.ts.map +1 -0
- package/dist/delivery/DeliveryAck.js +72 -0
- package/dist/delivery/DeliveryAck.js.map +1 -0
- package/dist/delivery/DeliveryDispatcher.d.ts +1 -0
- package/dist/delivery/DeliveryDispatcher.d.ts.map +1 -1
- package/dist/delivery/DeliveryDispatcher.js +9 -1
- package/dist/delivery/DeliveryDispatcher.js.map +1 -1
- package/dist/delivery/DeliveryService.d.ts +74 -0
- package/dist/delivery/DeliveryService.d.ts.map +1 -0
- package/dist/delivery/DeliveryService.js +209 -0
- package/dist/delivery/DeliveryService.js.map +1 -0
- package/dist/delivery/HttpMultipartDelivery.d.ts +11 -1
- package/dist/delivery/HttpMultipartDelivery.d.ts.map +1 -1
- package/dist/delivery/HttpMultipartDelivery.js +70 -67
- package/dist/delivery/HttpMultipartDelivery.js.map +1 -1
- package/dist/delivery/LegacyOutboxMigration.d.ts +21 -0
- package/dist/delivery/LegacyOutboxMigration.d.ts.map +1 -0
- package/dist/delivery/LegacyOutboxMigration.js +125 -0
- package/dist/delivery/LegacyOutboxMigration.js.map +1 -0
- package/dist/delivery/OutboxWorker.d.ts +70 -0
- package/dist/delivery/OutboxWorker.d.ts.map +1 -0
- package/dist/delivery/OutboxWorker.js +211 -0
- package/dist/delivery/OutboxWorker.js.map +1 -0
- package/dist/delivery/types.d.ts +15 -0
- package/dist/delivery/types.d.ts.map +1 -1
- package/dist/download/DownloadManager.d.ts +17 -12
- package/dist/download/DownloadManager.d.ts.map +1 -1
- package/dist/download/DownloadManager.js +31 -53
- package/dist/download/DownloadManager.js.map +1 -1
- package/dist/download/IllustrationDownloader.d.ts +1 -0
- package/dist/download/IllustrationDownloader.d.ts.map +1 -1
- package/dist/download/IllustrationDownloader.js +19 -1
- package/dist/download/IllustrationDownloader.js.map +1 -1
- package/dist/download/NovelDownloader.d.ts +3 -1
- package/dist/download/NovelDownloader.d.ts.map +1 -1
- package/dist/download/NovelDownloader.js +30 -2
- package/dist/download/NovelDownloader.js.map +1 -1
- package/dist/download/handlers/IllustrationTargetHandler.d.ts +18 -8
- package/dist/download/handlers/IllustrationTargetHandler.d.ts.map +1 -1
- package/dist/download/handlers/IllustrationTargetHandler.js +101 -74
- package/dist/download/handlers/IllustrationTargetHandler.js.map +1 -1
- package/dist/download/handlers/NovelTargetHandler.d.ts +8 -8
- package/dist/download/handlers/NovelTargetHandler.d.ts.map +1 -1
- package/dist/download/handlers/NovelTargetHandler.js +64 -83
- package/dist/download/handlers/NovelTargetHandler.js.map +1 -1
- package/dist/download/plan/DownloadPlanner.d.ts +6 -1
- package/dist/download/plan/DownloadPlanner.d.ts.map +1 -1
- package/dist/download/plan/DownloadPlanner.js +28 -5
- package/dist/download/plan/DownloadPlanner.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/notification/NotificationPolicy.d.ts +38 -0
- package/dist/notification/NotificationPolicy.d.ts.map +1 -0
- package/dist/notification/NotificationPolicy.js +89 -0
- package/dist/notification/NotificationPolicy.js.map +1 -0
- package/dist/package.json +1 -1
- package/dist/pixiv/PixivClient.d.ts +4 -0
- package/dist/pixiv/PixivClient.d.ts.map +1 -1
- package/dist/pixiv/PixivClient.js +15 -2
- package/dist/pixiv/PixivClient.js.map +1 -1
- package/dist/pixiv/RateLimitCoordinator.d.ts +30 -0
- package/dist/pixiv/RateLimitCoordinator.d.ts.map +1 -0
- package/dist/pixiv/RateLimitCoordinator.js +66 -0
- package/dist/pixiv/RateLimitCoordinator.js.map +1 -0
- package/dist/pixiv/client/PixivApiCore.d.ts +5 -0
- package/dist/pixiv/client/PixivApiCore.d.ts.map +1 -1
- package/dist/pixiv/client/PixivApiCore.js +31 -9
- package/dist/pixiv/client/PixivApiCore.js.map +1 -1
- package/dist/scheduler/ScheduleTriggerServer.d.ts +7 -0
- package/dist/scheduler/ScheduleTriggerServer.d.ts.map +1 -1
- package/dist/scheduler/ScheduleTriggerServer.js +17 -0
- package/dist/scheduler/ScheduleTriggerServer.js.map +1 -1
- package/dist/scheduler/SlotCoordinator.d.ts +15 -0
- package/dist/scheduler/SlotCoordinator.d.ts.map +1 -1
- package/dist/scheduler/SlotCoordinator.js +74 -0
- package/dist/scheduler/SlotCoordinator.js.map +1 -1
- package/dist/scheduler/SlotStateMachine.d.ts +32 -0
- package/dist/scheduler/SlotStateMachine.d.ts.map +1 -0
- package/dist/scheduler/SlotStateMachine.js +65 -0
- package/dist/scheduler/SlotStateMachine.js.map +1 -0
- package/dist/scheduler/TargetOutcome.d.ts +63 -0
- package/dist/scheduler/TargetOutcome.d.ts.map +1 -0
- package/dist/scheduler/TargetOutcome.js +28 -0
- package/dist/scheduler/TargetOutcome.js.map +1 -0
- package/dist/storage/Database.d.ts +16 -0
- package/dist/storage/Database.d.ts.map +1 -1
- package/dist/storage/Database.js +29 -0
- package/dist/storage/Database.js.map +1 -1
- package/dist/storage/DatabaseMigration.d.ts.map +1 -1
- package/dist/storage/DatabaseMigration.js +66 -0
- package/dist/storage/DatabaseMigration.js.map +1 -1
- package/dist/storage/repositories/DeliveryRepository.d.ts +73 -0
- package/dist/storage/repositories/DeliveryRepository.d.ts.map +1 -0
- package/dist/storage/repositories/DeliveryRepository.js +148 -0
- package/dist/storage/repositories/DeliveryRepository.js.map +1 -0
- package/dist/storage/repositories/MetadataRepository.d.ts +27 -0
- package/dist/storage/repositories/MetadataRepository.d.ts.map +1 -0
- package/dist/storage/repositories/MetadataRepository.js +58 -0
- package/dist/storage/repositories/MetadataRepository.js.map +1 -0
- package/dist/storage/repositories/OutboxRepository.d.ts +72 -0
- package/dist/storage/repositories/OutboxRepository.d.ts.map +1 -0
- package/dist/storage/repositories/OutboxRepository.js +200 -0
- package/dist/storage/repositories/OutboxRepository.js.map +1 -0
- package/dist/storage/repositories/SlotRepository.d.ts +26 -1
- package/dist/storage/repositories/SlotRepository.d.ts.map +1 -1
- package/dist/storage/repositories/SlotRepository.js +76 -2
- package/dist/storage/repositories/SlotRepository.js.map +1 -1
- package/dist/utils/config-validator-unified.d.ts.map +1 -1
- package/dist/utils/config-validator-unified.js +14 -0
- package/dist/utils/config-validator-unified.js.map +1 -1
- package/dist/webui/package.json +1 -1
- package/package.json +1 -1
- package/dist/delivery/DeliveryOutbox.d.ts +0 -43
- package/dist/delivery/DeliveryOutbox.d.ts.map +0 -1
- package/dist/delivery/DeliveryOutbox.js +0 -293
- package/dist/delivery/DeliveryOutbox.js.map +0 -1
package/README.md
CHANGED
|
@@ -122,6 +122,7 @@ pixivflow scheduler # 按 cron 配置长期挂机自动收集
|
|
|
122
122
|
"tg-example": {
|
|
123
123
|
"type": "httpMultipart",
|
|
124
124
|
"url": "https://your-domain.example/api/bot1/v1/submissions",
|
|
125
|
+
"readinessUrl": "https://your-domain.example/ready",
|
|
125
126
|
"notificationUrl": "https://your-domain.example/api/bot1/v1/notifications",
|
|
126
127
|
"headers": { "Authorization": "Bearer ${TG_SUBMIT_TOKEN}" },
|
|
127
128
|
"fileField": "files",
|
|
@@ -149,11 +150,33 @@ pixivflow scheduler # 按 cron 配置长期挂机自动收集
|
|
|
149
150
|
}
|
|
150
151
|
```
|
|
151
152
|
|
|
152
|
-
`headers` 和 `
|
|
153
|
+
`headers`、`url` 和 `readinessUrl` 里可用 `${环境变量名}` 引用环境变量(Token 别写死进配置)。
|
|
154
|
+
插画 cache 投递会在 multipart 的 `previews` 字段携带 Pixiv 的低分辨率预览(与 `files`
|
|
155
|
+
一一对应),原图仍是权威素材;通用接收端可以忽略该可选字段。
|
|
153
156
|
|
|
154
|
-
|
|
155
|
-
`
|
|
156
|
-
|
|
157
|
+
投递是**事务发件箱(SQLite outbox)**式的,at-least-once 执行、effectively-once
|
|
158
|
+
可见效果:每个外部副作用(一次内容投递、一条通知)在 `outbox` 表落一行,带幂等键和
|
|
159
|
+
行级租约,独立 worker 立即泵送、指数退避重试(默认 5 分钟起步、最长 6 小时),超过
|
|
160
|
+
`maxAttempts` 进 dead 状态并在投递账记 `failed`。进程崩溃 / 机器挂起后重启,残留的
|
|
161
|
+
`processing` 租约过期即被新进程接管,重试同一个幂等意图——下游按
|
|
162
|
+
`idempotent_replay`(同键,ACK 丢失重试)或 `duplicate_existing`(历史重复)收敛,
|
|
163
|
+
频道里仍然只有一条消息。旧版文件型 `delivery-outbox/*.json` 清单在启动时自动一次性
|
|
164
|
+
迁移进 SQLite,迁移幂等。「今天没有可投稿内容」这类通知与内容投递走同一张表、独立泵送,
|
|
165
|
+
审核端暂时挂掉不会互相阻塞。
|
|
166
|
+
|
|
167
|
+
配置 `readinessUrl` 后,worker 每次认领都先检查依赖 `/ready`。非 2xx 只把 row 放回 pending,
|
|
168
|
+
不增加 attempt;这与 `/live` 的“进程还活着”语义严格分开。dead letter 通过正式 CLI 恢复:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
pixivflow outbox list --status dead
|
|
172
|
+
pixivflow outbox inspect <id>
|
|
173
|
+
pixivflow outbox retry <id> # 只接受 dead row,保留 idempotency key
|
|
174
|
+
pixivflow outbox retry --dead
|
|
175
|
+
pixivflow outbox cancel <id> # 只取消尚未执行的 row
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
`run-once` 会重新执行下载计划,不等价于 outbox replay;不要手改 SQLite 的
|
|
179
|
+
`next_attempt_at`。
|
|
157
180
|
|
|
158
181
|
运维通知可直接把 `notificationUrl` 指向 [Apprise API](docs/APPRISE.md),由 Apprise 统一发送
|
|
159
182
|
Email、Telegram、Discord、ntfy 等渠道;PixivFlow 不实现这些通知协议。
|
|
@@ -174,6 +197,9 @@ Email、Telegram、Discord、ntfy 等渠道;PixivFlow 不实现这些通知协
|
|
|
174
197
|
| `pixivflow config` | 配置管理(查看 / 编辑 / 备份 / 恢复) |
|
|
175
198
|
| `pixivflow status` | 下载统计与最近记录 |
|
|
176
199
|
| `pixivflow health` | 健康检查:配置、目录可写性、连通性 |
|
|
200
|
+
| `pixivflow doctor` | 可靠性体检:卡住的 slot/outbox 租约、pending 投递、dead 行;`--repair` 收敛 |
|
|
201
|
+
| `pixivflow reconcile` | 把下游已确认的历史重复登记进投递账本(默认 dry-run,`--repair` 落库) |
|
|
202
|
+
| `pixivflow outbox` | 列出、检查、重放 dead letter 或取消尚未执行的 durable intent |
|
|
177
203
|
| `pixivflow tags discover <词>` | 发现相关 Tag(Pixiv 联想 + 作品标签共现),只列候选不改配置 |
|
|
178
204
|
| `pixivflow tags apply <清单> --target <id> --select <tag1,tag2>` | 人工确认后把所选 Tag 原子写入配置并触发热重载 |
|
|
179
205
|
| `pixivflow topic resolve <主题>` | 查看自动推导出的相关 Tag 空间(`--type illustration\|novel`、`--refresh`) |
|
package/README_EN.md
CHANGED
|
@@ -102,6 +102,7 @@ merely translates an HTTP multipart submission API into configuration:
|
|
|
102
102
|
"sharing-api": {
|
|
103
103
|
"type": "httpMultipart",
|
|
104
104
|
"url": "https://example.test/submissions",
|
|
105
|
+
"readinessUrl": "https://example.test/ready",
|
|
105
106
|
"notificationUrl": "https://example.test/notifications",
|
|
106
107
|
"headers": { "Authorization": "Bearer ${SHARING_TOKEN}" },
|
|
107
108
|
"fileField": "files",
|
|
@@ -125,12 +126,19 @@ merely translates an HTTP multipart submission API into configuration:
|
|
|
125
126
|
}
|
|
126
127
|
```
|
|
127
128
|
|
|
128
|
-
Headers and URLs accept arbitrary `${ENV_NAME}` interpolation.
|
|
129
|
-
|
|
130
|
-
|
|
129
|
+
Headers and URLs accept arbitrary `${ENV_NAME}` interpolation. Cache-mode
|
|
130
|
+
illustration delivery also sends an optional, one-to-one Pixiv preview in the
|
|
131
|
+
`previews` multipart field while retaining the original as the authoritative
|
|
132
|
+
artifact. Failed delivery keeps both files in the SQLite outbox; the worker
|
|
133
|
+
retries the same intent after restart. Final no-match
|
|
131
134
|
notifications use the same durable outbox, so a restart or a temporary review
|
|
132
135
|
endpoint outage does not silently lose the alert.
|
|
133
136
|
|
|
137
|
+
When `readinessUrl` is configured, a non-2xx readiness response defers the row
|
|
138
|
+
without incrementing its attempt count. Use `pixivflow outbox list`,
|
|
139
|
+
`inspect <id>`, `retry <id>` / `retry --dead`, and `cancel <id>` for recovery;
|
|
140
|
+
`run-once` is not an outbox replay command.
|
|
141
|
+
|
|
134
142
|
Interactive configuration wizard: `pixivflow setup`.
|
|
135
143
|
|
|
136
144
|
## Common commands
|
|
@@ -78,6 +78,7 @@
|
|
|
78
78
|
"telepost-bot1": {
|
|
79
79
|
"type": "httpMultipart",
|
|
80
80
|
"url": "http://127.0.0.1:8080/api/bot1/v1/submissions",
|
|
81
|
+
"readinessUrl": "http://127.0.0.1:8080/ready",
|
|
81
82
|
"notificationUrl": "http://127.0.0.1:8080/api/bot1/v1/notifications",
|
|
82
83
|
"headers": {
|
|
83
84
|
"Authorization": "Bearer ${TELEPOST_BOT1_SUBMIT_TOKEN}"
|
|
@@ -110,6 +111,7 @@
|
|
|
110
111
|
"telepost-bot2": {
|
|
111
112
|
"type": "httpMultipart",
|
|
112
113
|
"url": "http://127.0.0.1:8080/api/bot2/v1/submissions",
|
|
114
|
+
"readinessUrl": "http://127.0.0.1:8080/ready",
|
|
113
115
|
"notificationUrl": "http://127.0.0.1:8080/api/bot2/v1/notifications",
|
|
114
116
|
"headers": {
|
|
115
117
|
"Authorization": "Bearer ${TELEPOST_BOT2_SUBMIT_TOKEN}"
|
|
@@ -249,4 +251,4 @@
|
|
|
249
251
|
}
|
|
250
252
|
],
|
|
251
253
|
"initialDelay": 0
|
|
252
|
-
}
|
|
254
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor: cold-start / crash / suspend consistency diagnostics for the
|
|
3
|
+
* reliability subsystem. Read-only by default; --repair applies safe,
|
|
4
|
+
* idempotent convergence actions. Uses only SQLite - no external services.
|
|
5
|
+
*/
|
|
6
|
+
import { BaseCommand } from './Command';
|
|
7
|
+
import { CommandCategory } from './metadata';
|
|
8
|
+
import { CommandArgs, CommandContext, CommandResult } from './types';
|
|
9
|
+
export declare class DoctorCommand extends BaseCommand {
|
|
10
|
+
readonly name = "doctor";
|
|
11
|
+
readonly description = "Diagnose and (with --repair) converge slots, deliveries and outbox";
|
|
12
|
+
readonly metadata: {
|
|
13
|
+
category: CommandCategory;
|
|
14
|
+
requiresAuth: boolean;
|
|
15
|
+
longRunning: boolean;
|
|
16
|
+
};
|
|
17
|
+
readonly requiresToken = false;
|
|
18
|
+
execute(context: CommandContext, args: CommandArgs): Promise<CommandResult>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=DoctorCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DoctorCommand.d.ts","sourceRoot":"","sources":["../../src/commands/DoctorCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAYrE,qBAAa,aAAc,SAAQ,WAAW;IAC5C,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,wEAAwE;IAC5F,QAAQ,CAAC,QAAQ;;;;MAAoF;IACrG,QAAQ,CAAC,aAAa,SAAS;IAEzB,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;CA0FlF"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DoctorCommand = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Doctor: cold-start / crash / suspend consistency diagnostics for the
|
|
6
|
+
* reliability subsystem. Read-only by default; --repair applies safe,
|
|
7
|
+
* idempotent convergence actions. Uses only SQLite - no external services.
|
|
8
|
+
*/
|
|
9
|
+
const Command_1 = require("./Command");
|
|
10
|
+
const metadata_1 = require("./metadata");
|
|
11
|
+
const Database_1 = require("../storage/Database");
|
|
12
|
+
const OutboxWorker_1 = require("../delivery/OutboxWorker");
|
|
13
|
+
const DeliveryDispatcher_1 = require("../delivery/DeliveryDispatcher");
|
|
14
|
+
const LegacyOutboxMigration_1 = require("../delivery/LegacyOutboxMigration");
|
|
15
|
+
class DoctorCommand extends Command_1.BaseCommand {
|
|
16
|
+
name = 'doctor';
|
|
17
|
+
description = 'Diagnose and (with --repair) converge slots, deliveries and outbox';
|
|
18
|
+
metadata = { category: metadata_1.CommandCategory.MONITORING, requiresAuth: true, longRunning: false };
|
|
19
|
+
requiresToken = false;
|
|
20
|
+
async execute(context, args) {
|
|
21
|
+
const repair = Boolean(args.options.repair);
|
|
22
|
+
const dbPath = context.config.storage?.databasePath ?? './data/pixiv-downloader.db';
|
|
23
|
+
const findings = [];
|
|
24
|
+
const fixed = [];
|
|
25
|
+
const db = new Database_1.Database(dbPath);
|
|
26
|
+
try {
|
|
27
|
+
db.migrate();
|
|
28
|
+
findings.push({ level: 'info', code: 'schema', message: 'Schema migrations applied / current' });
|
|
29
|
+
const mig = (0, LegacyOutboxMigration_1.migrateLegacyOutbox)(db);
|
|
30
|
+
if (mig.imported || mig.delivered || mig.failed) {
|
|
31
|
+
findings.push({
|
|
32
|
+
level: mig.failed ? 'warn' : 'info',
|
|
33
|
+
code: 'legacy-outbox',
|
|
34
|
+
message: 'legacy manifests scanned=' + mig.scanned + ' imported=' + mig.imported + ' delivered=' + mig.delivered + ' failed=' + mig.failed,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const deliveries = db.deliveries.countByStatus();
|
|
38
|
+
const pendingDelivery = deliveries.pending ?? 0;
|
|
39
|
+
if (pendingDelivery > 0) {
|
|
40
|
+
findings.push({ level: 'warn', code: 'deliveries-pending', message: pendingDelivery + ' delivery intent(s) not yet confirmed by the downstream' });
|
|
41
|
+
}
|
|
42
|
+
if (deliveries.failed) {
|
|
43
|
+
findings.push({ level: 'warn', code: 'deliveries-failed', message: deliveries.failed + ' delivery intent(s) marked failed' });
|
|
44
|
+
}
|
|
45
|
+
const counts = db.outbox.counts();
|
|
46
|
+
if (counts.dead > 0) {
|
|
47
|
+
findings.push({ level: 'critical', code: 'outbox-dead', message: counts.dead + ' outbox row(s) dead after exhausting retries (manual reconciliation required)' });
|
|
48
|
+
}
|
|
49
|
+
const stale = db.outbox.staleProcessing();
|
|
50
|
+
if (stale.length > 0) {
|
|
51
|
+
findings.push({ level: repair ? 'info' : 'warn', code: 'outbox-stale-processing', message: stale.length + ' row(s) stuck in processing from a crashed/killed run' });
|
|
52
|
+
if (repair) {
|
|
53
|
+
for (const row of stale)
|
|
54
|
+
db.outbox.release(row.id);
|
|
55
|
+
fixed.push('released ' + stale.length + ' stale processing row(s) back for retry');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const staleLeases = db.slots.slotsWithStaleLease();
|
|
59
|
+
if (staleLeases.length > 0) {
|
|
60
|
+
findings.push({ level: repair ? 'info' : 'warn', code: 'slot-stale-lease', message: staleLeases.length + ' slot(s) carry an expired lease from a crashed worker: ' + staleLeases.slice(0, 5).join(', ') });
|
|
61
|
+
if (repair) {
|
|
62
|
+
for (const id of staleLeases)
|
|
63
|
+
db.slots.releaseSlotLease(id, 'doctor-repair');
|
|
64
|
+
fixed.push('released ' + staleLeases.length + ' stale slot lease(s)');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
let unfinishedCells = 0;
|
|
68
|
+
for (const slot of db.slots.getRecentSlots(50)) {
|
|
69
|
+
if (slot.status === 'running' || slot.status === 'failed') {
|
|
70
|
+
for (const cell of db.slots.getCells(slot.id)) {
|
|
71
|
+
if (cell.status === 'delivery_pending')
|
|
72
|
+
unfinishedCells++;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (unfinishedCells > 0) {
|
|
77
|
+
findings.push({ level: 'info', code: 'cells-delivery-pending', message: unfinishedCells + ' cell(s) waiting on durable delivery confirmation (outbox converges them)' });
|
|
78
|
+
}
|
|
79
|
+
if (repair) {
|
|
80
|
+
const worker = new OutboxWorker_1.OutboxWorker(db, new DeliveryDispatcher_1.DeliveryDispatcher(context.config.delivery));
|
|
81
|
+
const res = await worker.drainOnce(20);
|
|
82
|
+
if (res.done > 0)
|
|
83
|
+
fixed.push('outbox pump delivered/confirmed ' + res.done + ' row(s)');
|
|
84
|
+
if (res.dead > 0)
|
|
85
|
+
fixed.push('outbox pump marked ' + res.dead + ' row(s) dead');
|
|
86
|
+
}
|
|
87
|
+
const critical = findings.filter((f) => f.level === 'critical');
|
|
88
|
+
const warns = findings.filter((f) => f.level === 'warn');
|
|
89
|
+
for (const f of findings) {
|
|
90
|
+
const icon = f.level === 'critical' ? 'CRIT' : f.level === 'warn' ? 'WARN' : 'OK';
|
|
91
|
+
context.logger.info('[' + icon + '] [' + f.code + '] ' + f.message);
|
|
92
|
+
}
|
|
93
|
+
for (const x of fixed)
|
|
94
|
+
context.logger.info('repaired: ' + x);
|
|
95
|
+
return this.success(critical.length
|
|
96
|
+
? 'doctor found ' + critical.length + ' critical, ' + warns.length + ' warning(s)'
|
|
97
|
+
: warns.length
|
|
98
|
+
? 'doctor found ' + warns.length + ' warning(s)'
|
|
99
|
+
: 'doctor: all reliability state healthy', { findings, repaired: fixed, deliveryCounts: deliveries, outboxCounts: counts });
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
db.close();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.DoctorCommand = DoctorCommand;
|
|
107
|
+
//# sourceMappingURL=DoctorCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DoctorCommand.js","sourceRoot":"","sources":["../../src/commands/DoctorCommand.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH,uCAAwC;AACxC,yCAA6C;AAE7C,kDAA+C;AAC/C,2DAAwD;AACxD,uEAAoE;AACpE,6EAAwE;AAQxE,MAAa,aAAc,SAAQ,qBAAW;IACnC,IAAI,GAAG,QAAQ,CAAC;IAChB,WAAW,GAAG,oEAAoE,CAAC;IACnF,QAAQ,GAAG,EAAE,QAAQ,EAAE,0BAAe,CAAC,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAC5F,aAAa,GAAG,KAAK,CAAC;IAE/B,KAAK,CAAC,OAAO,CAAC,OAAuB,EAAE,IAAiB;QACtD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,IAAI,4BAA4B,CAAC;QACpF,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,MAAM,EAAE,GAAG,IAAI,mBAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC;YACH,EAAE,CAAC,OAAO,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,qCAAqC,EAAE,CAAC,CAAC;YAEjG,MAAM,GAAG,GAAG,IAAA,2CAAmB,EAAC,EAAE,CAAC,CAAC;YACpC,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBAChD,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;oBACnC,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,2BAA2B,GAAG,GAAG,CAAC,OAAO,GAAG,YAAY,GAAG,GAAG,CAAC,QAAQ,GAAG,aAAa,GAAG,GAAG,CAAC,SAAS,GAAG,UAAU,GAAG,GAAG,CAAC,MAAM;iBAC3I,CAAC,CAAC;YACL,CAAC;YAED,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;YACjD,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;YAChD,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,eAAe,GAAG,yDAAyD,EAAE,CAAC,CAAC;YACrJ,CAAC;YACD,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,GAAG,mCAAmC,EAAE,CAAC,CAAC;YAChI,CAAC;YAED,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,GAAG,+EAA+E,EAAE,CAAC,CAAC;YACpK,CAAC;YACD,MAAM,KAAK,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YAC1C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,uDAAuD,EAAE,CAAC,CAAC;gBACrK,IAAI,MAAM,EAAE,CAAC;oBACX,KAAK,MAAM,GAAG,IAAI,KAAK;wBAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACnD,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,yCAAyC,CAAC,CAAC;gBACrF,CAAC;YACH,CAAC;YAED,MAAM,WAAW,GAAG,EAAE,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;YACnD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,GAAG,yDAAyD,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC3M,IAAI,MAAM,EAAE,CAAC;oBACX,KAAK,MAAM,EAAE,IAAI,WAAW;wBAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;oBAC7E,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,MAAM,GAAG,sBAAsB,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;YAED,IAAI,eAAe,GAAG,CAAC,CAAC;YACxB,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC1D,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;wBAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,kBAAkB;4BAAE,eAAe,EAAE,CAAC;oBAC5D,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,eAAe,GAAG,2EAA2E,EAAE,CAAC,CAAC;YAC3K,CAAC;YAED,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,MAAM,GAAG,IAAI,2BAAY,CAAC,EAAE,EAAE,IAAI,uCAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACrF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACvC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,kCAAkC,GAAG,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC;gBACxF,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,qBAAqB,GAAG,GAAG,CAAC,IAAI,GAAG,cAAc,CAAC,CAAC;YAClF,CAAC;YAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC;YAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;YACzD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;YACtE,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YAE7D,OAAO,IAAI,CAAC,OAAO,CACjB,QAAQ,CAAC,MAAM;gBACb,CAAC,CAAC,eAAe,GAAG,QAAQ,CAAC,MAAM,GAAG,aAAa,GAAG,KAAK,CAAC,MAAM,GAAG,aAAa;gBAClF,CAAC,CAAC,KAAK,CAAC,MAAM;oBACZ,CAAC,CAAC,eAAe,GAAG,KAAK,CAAC,MAAM,GAAG,aAAa;oBAChD,CAAC,CAAC,uCAAuC,EAC7C,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,CAChF,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC;CACF;AAhGD,sCAgGC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BaseCommand } from './Command';
|
|
2
|
+
import { CommandCategory } from './metadata';
|
|
3
|
+
import { CommandArgs, CommandContext, CommandResult } from './types';
|
|
4
|
+
export declare class OutboxCommand extends BaseCommand {
|
|
5
|
+
readonly name = "outbox";
|
|
6
|
+
readonly description = "List, inspect, retry or cancel durable delivery intents";
|
|
7
|
+
readonly requiresToken = false;
|
|
8
|
+
readonly metadata: {
|
|
9
|
+
category: CommandCategory;
|
|
10
|
+
requiresAuth: boolean;
|
|
11
|
+
longRunning: boolean;
|
|
12
|
+
};
|
|
13
|
+
getUsage(): string;
|
|
14
|
+
execute(context: CommandContext, args: CommandArgs): Promise<CommandResult>;
|
|
15
|
+
private summary;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=OutboxCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutboxCommand.d.ts","sourceRoot":"","sources":["../../src/commands/OutboxCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAQrE,qBAAa,aAAc,SAAQ,WAAW;IAC5C,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,6DAA6D;IACjF,QAAQ,CAAC,aAAa,SAAS;IAC/B,QAAQ,CAAC,QAAQ;;;;MAIf;IAEF,QAAQ,IAAI,MAAM;IAUZ,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAyDjF,OAAO,CAAC,OAAO;CAWhB"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OutboxCommand = void 0;
|
|
4
|
+
const Command_1 = require("./Command");
|
|
5
|
+
const metadata_1 = require("./metadata");
|
|
6
|
+
const Database_1 = require("../storage/Database");
|
|
7
|
+
const STATUSES = new Set([
|
|
8
|
+
'pending', 'processing', 'retry_wait', 'done', 'dead', 'cancelled',
|
|
9
|
+
]);
|
|
10
|
+
class OutboxCommand extends Command_1.BaseCommand {
|
|
11
|
+
name = 'outbox';
|
|
12
|
+
description = 'List, inspect, retry or cancel durable delivery intents';
|
|
13
|
+
requiresToken = false;
|
|
14
|
+
metadata = {
|
|
15
|
+
category: metadata_1.CommandCategory.MAINTENANCE,
|
|
16
|
+
requiresAuth: true,
|
|
17
|
+
longRunning: false,
|
|
18
|
+
};
|
|
19
|
+
getUsage() {
|
|
20
|
+
return [
|
|
21
|
+
'pixivflow outbox list [--status dead] [--limit 100]',
|
|
22
|
+
'pixivflow outbox inspect <id>',
|
|
23
|
+
'pixivflow outbox retry <id>',
|
|
24
|
+
'pixivflow outbox retry --dead',
|
|
25
|
+
'pixivflow outbox cancel <id>',
|
|
26
|
+
].join('\n');
|
|
27
|
+
}
|
|
28
|
+
async execute(context, args) {
|
|
29
|
+
const action = args.positional[0] ?? 'list';
|
|
30
|
+
const id = args.positional[1];
|
|
31
|
+
const db = new Database_1.Database(context.config.storage?.databasePath ?? './data/pixiv-downloader.db');
|
|
32
|
+
try {
|
|
33
|
+
db.migrate();
|
|
34
|
+
if (action === 'list') {
|
|
35
|
+
const rawStatus = typeof args.options.status === 'string'
|
|
36
|
+
? args.options.status : undefined;
|
|
37
|
+
if (rawStatus && !STATUSES.has(rawStatus)) {
|
|
38
|
+
return this.failure(`unknown outbox status: ${rawStatus}`);
|
|
39
|
+
}
|
|
40
|
+
const limit = Number(args.options.limit ?? 100);
|
|
41
|
+
const rows = db.outbox.list(rawStatus, Number.isFinite(limit) ? limit : 100);
|
|
42
|
+
for (const row of rows)
|
|
43
|
+
context.logger.info('outbox', this.summary(row));
|
|
44
|
+
return this.success(`${rows.length} outbox row(s)`, rows.map((row) => this.summary(row)));
|
|
45
|
+
}
|
|
46
|
+
if (action === 'inspect') {
|
|
47
|
+
if (!id)
|
|
48
|
+
return this.failure('Usage: pixivflow outbox inspect <id>');
|
|
49
|
+
const row = db.outbox.get(id);
|
|
50
|
+
return row ? this.success('outbox row', row) : this.failure(`outbox row not found: ${id}`);
|
|
51
|
+
}
|
|
52
|
+
if (action === 'retry') {
|
|
53
|
+
const rows = args.options.dead ? db.outbox.list('dead', 500) : [];
|
|
54
|
+
if (!args.options.dead) {
|
|
55
|
+
if (!id)
|
|
56
|
+
return this.failure('Usage: pixivflow outbox retry <id> | --dead');
|
|
57
|
+
const row = db.outbox.get(id);
|
|
58
|
+
if (!row)
|
|
59
|
+
return this.failure(`outbox row not found: ${id}`);
|
|
60
|
+
if (row.status !== 'dead') {
|
|
61
|
+
return this.failure(`outbox row is not dead: ${id}`);
|
|
62
|
+
}
|
|
63
|
+
rows.push(row);
|
|
64
|
+
}
|
|
65
|
+
for (const row of rows)
|
|
66
|
+
db.outbox.requeue(row.id);
|
|
67
|
+
return this.success(`requeued ${rows.length} outbox row(s)`, { ids: rows.map((row) => row.id) });
|
|
68
|
+
}
|
|
69
|
+
if (action === 'cancel') {
|
|
70
|
+
if (!id)
|
|
71
|
+
return this.failure('Usage: pixivflow outbox cancel <id>');
|
|
72
|
+
const row = db.outbox.get(id);
|
|
73
|
+
if (!row || !db.outbox.cancel(id)) {
|
|
74
|
+
return this.failure(`outbox row is missing, processing or already terminal: ${id}`);
|
|
75
|
+
}
|
|
76
|
+
if (row.deliveryId) {
|
|
77
|
+
db.deliveries.recordAck(row.deliveryId, {
|
|
78
|
+
status: 'failed', remoteStatus: 'cancelled', error: 'cancelled by operator',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return this.success('outbox row cancelled', { id });
|
|
82
|
+
}
|
|
83
|
+
return this.failure(this.getUsage());
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
db.close();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
summary(row) {
|
|
90
|
+
return {
|
|
91
|
+
id: row.id,
|
|
92
|
+
kind: row.kind,
|
|
93
|
+
status: row.status,
|
|
94
|
+
deliveryTarget: row.deliveryTarget,
|
|
95
|
+
attempts: row.attempts,
|
|
96
|
+
nextAttemptAt: row.nextAttemptAt,
|
|
97
|
+
lastError: row.lastError,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.OutboxCommand = OutboxCommand;
|
|
102
|
+
//# sourceMappingURL=OutboxCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutboxCommand.js","sourceRoot":"","sources":["../../src/commands/OutboxCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* reconcile: accept a downstream-confirmed historical duplicate as fact.
|
|
3
|
+
*
|
|
4
|
+
* This is the ONLY way a post-lock historical duplicate enters the ledger.
|
|
5
|
+
* Default mode is a dry-run (prints what would change); --repair applies it.
|
|
6
|
+
*
|
|
7
|
+
* pixivflow reconcile --target bot1 --type illustration --pixiv-id 123 \
|
|
8
|
+
* --remote-id 987 --reason "found in channel history" [--repair]
|
|
9
|
+
*/
|
|
10
|
+
import { BaseCommand } from './Command';
|
|
11
|
+
import { CommandCategory } from './metadata';
|
|
12
|
+
import { CommandArgs, CommandContext, CommandResult } from './types';
|
|
13
|
+
export declare class ReconcileCommand extends BaseCommand {
|
|
14
|
+
readonly name = "reconcile";
|
|
15
|
+
readonly description = "Reconcile a downstream-confirmed historical duplicate (dry-run unless --repair)";
|
|
16
|
+
readonly metadata: {
|
|
17
|
+
category: CommandCategory;
|
|
18
|
+
requiresAuth: boolean;
|
|
19
|
+
longRunning: boolean;
|
|
20
|
+
};
|
|
21
|
+
readonly requiresToken = false;
|
|
22
|
+
execute(context: CommandContext, args: CommandArgs): Promise<CommandResult>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ReconcileCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReconcileCommand.d.ts","sourceRoot":"","sources":["../../src/commands/ReconcileCommand.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAIrE,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,WAAW,qFAAqF;IACzG,QAAQ,CAAC,QAAQ;;;;MAAoF;IACrG,QAAQ,CAAC,aAAa,SAAS;IAEzB,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;CAiDlF"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ReconcileCommand = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* reconcile: accept a downstream-confirmed historical duplicate as fact.
|
|
6
|
+
*
|
|
7
|
+
* This is the ONLY way a post-lock historical duplicate enters the ledger.
|
|
8
|
+
* Default mode is a dry-run (prints what would change); --repair applies it.
|
|
9
|
+
*
|
|
10
|
+
* pixivflow reconcile --target bot1 --type illustration --pixiv-id 123 \
|
|
11
|
+
* --remote-id 987 --reason "found in channel history" [--repair]
|
|
12
|
+
*/
|
|
13
|
+
const Command_1 = require("./Command");
|
|
14
|
+
const metadata_1 = require("./metadata");
|
|
15
|
+
const Database_1 = require("../storage/Database");
|
|
16
|
+
const DeliveryService_1 = require("../delivery/DeliveryService");
|
|
17
|
+
class ReconcileCommand extends Command_1.BaseCommand {
|
|
18
|
+
name = 'reconcile';
|
|
19
|
+
description = 'Reconcile a downstream-confirmed historical duplicate (dry-run unless --repair)';
|
|
20
|
+
metadata = { category: metadata_1.CommandCategory.MONITORING, requiresAuth: true, longRunning: false };
|
|
21
|
+
requiresToken = false;
|
|
22
|
+
async execute(context, args) {
|
|
23
|
+
const target = String(args.options.target ?? '').trim();
|
|
24
|
+
const workType = String(args.options.type ?? '').trim();
|
|
25
|
+
const pixivId = String(args.options['pixiv-id'] ?? args.options.pixivId ?? '').trim();
|
|
26
|
+
const remoteId = args.options['remote-id'] ? String(args.options['remote-id']) : undefined;
|
|
27
|
+
const reason = String(args.options.reason ?? 'manual reconciliation').trim();
|
|
28
|
+
const repair = Boolean(args.options.repair);
|
|
29
|
+
if (!target || !workType || !pixivId) {
|
|
30
|
+
return this.failure('Usage: reconcile --target <name> --type <illustration|novel> --pixiv-id <id> [--remote-id <id>] [--reason <text>] [--repair]');
|
|
31
|
+
}
|
|
32
|
+
if (workType !== 'illustration' && workType !== 'novel') {
|
|
33
|
+
return this.failure('--type must be illustration or novel');
|
|
34
|
+
}
|
|
35
|
+
const dbPath = context.config.storage?.databasePath ?? './data/pixiv-downloader.db';
|
|
36
|
+
const db = new Database_1.Database(dbPath);
|
|
37
|
+
try {
|
|
38
|
+
db.migrate();
|
|
39
|
+
const service = new DeliveryService_1.DeliveryService(db);
|
|
40
|
+
const already = service.isAlreadyDelivered(target, workType, pixivId);
|
|
41
|
+
if (already) {
|
|
42
|
+
context.logger.info('Already recorded as delivered/duplicate; nothing to reconcile', { target, workType, pixivId });
|
|
43
|
+
return this.success('already reconciled', { target, workType, pixivId, noop: true });
|
|
44
|
+
}
|
|
45
|
+
if (!repair) {
|
|
46
|
+
context.logger.info('DRY RUN (pass --repair to apply)', { target, workType, pixivId, remoteId, reason });
|
|
47
|
+
return this.success('dry-run: would record historical duplicate', { dryRun: true, target, workType, pixivId, remoteId, reason });
|
|
48
|
+
}
|
|
49
|
+
const res = service.reconcileHistoricalDuplicate({
|
|
50
|
+
deliveryTarget: target,
|
|
51
|
+
workType,
|
|
52
|
+
pixivId,
|
|
53
|
+
remoteId,
|
|
54
|
+
reason,
|
|
55
|
+
});
|
|
56
|
+
return this.success('historical duplicate reconciled into ledger', {
|
|
57
|
+
deliveryId: res.deliveryId,
|
|
58
|
+
created: res.created,
|
|
59
|
+
target,
|
|
60
|
+
workType,
|
|
61
|
+
pixivId,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
db.close();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.ReconcileCommand = ReconcileCommand;
|
|
70
|
+
//# sourceMappingURL=ReconcileCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReconcileCommand.js","sourceRoot":"","sources":["../../src/commands/ReconcileCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchedulerCommand.d.ts","sourceRoot":"","sources":["../../src/commands/SchedulerCommand.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAmBrE;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,WAAW,oDAAoD;IACxE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAS;IACnC,QAAQ,CAAC,QAAQ;;;;MAIf;IAEI,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"SchedulerCommand.d.ts","sourceRoot":"","sources":["../../src/commands/SchedulerCommand.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAmBrE;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,WAAW,oDAAoD;IACxE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAS;IACnC,QAAQ,CAAC,QAAQ;;;;MAIf;IAEI,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAwJjF,OAAO,CAAC,uBAAuB;IAQ/B,QAAQ,IAAI,MAAM;CAYnB"}
|
|
@@ -58,6 +58,10 @@ class SchedulerCommand extends Command_1.BaseCommand {
|
|
|
58
58
|
},
|
|
59
59
|
});
|
|
60
60
|
const status = manager.start(runtime.config);
|
|
61
|
+
// Independent outbox pump: deliveries/notifications retry promptly on a
|
|
62
|
+
// timer and resume after crash/machine-stop without waiting for the next
|
|
63
|
+
// scheduled run. It never gates Telegram/scheduler readiness.
|
|
64
|
+
runtime.startOutboxWorker();
|
|
61
65
|
// Authenticated HTTP trigger. Mounted in external mode (the external clock
|
|
62
66
|
// wakes the machine here) and, opt-in, in internal mode for manual/ops
|
|
63
67
|
// triggers. Business logic lives in runJob/SlotCoordinator; this handler
|
|
@@ -122,6 +126,7 @@ class SchedulerCommand extends Command_1.BaseCommand {
|
|
|
122
126
|
inFlight.set(key, promise);
|
|
123
127
|
return promise;
|
|
124
128
|
},
|
|
129
|
+
drainOutbox: () => runtime.drainOutbox(),
|
|
125
130
|
status: (scheduleId) => {
|
|
126
131
|
const cfg = resolveConfig();
|
|
127
132
|
const plan = findPlan(cfg, scheduleId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchedulerCommand.js","sourceRoot":"","sources":["../../src/commands/SchedulerCommand.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SchedulerCommand.js","sourceRoot":"","sources":["../../src/commands/SchedulerCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchedulerRunOnceCommand.d.ts","sourceRoot":"","sources":["../../src/commands/SchedulerRunOnceCommand.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAKrE,qBAAa,uBAAwB,SAAQ,WAAW;IACtD,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,WAAW,2DAA2D;IAC/E,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAsB;IAChD,QAAQ,CAAC,QAAQ;;;;MAIf;IAEI,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"SchedulerRunOnceCommand.d.ts","sourceRoot":"","sources":["../../src/commands/SchedulerRunOnceCommand.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAKrE,qBAAa,uBAAwB,SAAQ,WAAW;IACtD,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,WAAW,2DAA2D;IAC/E,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAsB;IAChD,QAAQ,CAAC,QAAQ;;;;MAIf;IAEI,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IA+DjF,QAAQ,IAAI,MAAM;CAiBnB"}
|
|
@@ -55,8 +55,14 @@ class SchedulerRunOnceCommand extends Command_1.BaseCommand {
|
|
|
55
55
|
// occurrence complete nor be resumed as one. Explicit replacement.
|
|
56
56
|
runtime.runJob(runtime.config, plan, { adhoc: true, triggerSource: 'manual', onlyTarget: targetFilter }), timeoutMs, () => runtime.cancelActive(`run timeout after ${timeoutMs}ms`), `plan ${plan.id}`);
|
|
57
57
|
}
|
|
58
|
+
// Flush deliveries/notifications created by this one-shot before exit.
|
|
59
|
+
// A bounded drain: durable rows survive if they cannot finish now and the
|
|
60
|
+
// scheduler daemon (or a later run-once) retries them.
|
|
61
|
+
const drained = await runtime.drainOutbox();
|
|
62
|
+
context.logger.info('Outbox drain complete', drained);
|
|
58
63
|
return this.success('Scheduled plans completed', {
|
|
59
64
|
schedules: plans.map((plan) => plan.id),
|
|
65
|
+
outbox: drained,
|
|
60
66
|
});
|
|
61
67
|
}
|
|
62
68
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchedulerRunOnceCommand.js","sourceRoot":"","sources":["../../src/commands/SchedulerRunOnceCommand.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEH,uCAAwC;AACxC,yCAA6C;AAE7C,sDAA0D;AAC1D,sDAAqE;AACrE,2DAA6E;AAE7E,MAAa,uBAAwB,SAAQ,qBAAW;IAC7C,IAAI,GAAG,UAAU,CAAC;IAClB,WAAW,GAAG,uDAAuD,CAAC;IACtE,OAAO,GAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACvC,QAAQ,GAAG;QAClB,QAAQ,EAAE,0BAAe,CAAC,QAAQ;QAClC,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,KAAK;KACnB,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,OAAuB,EAAE,IAAiB;QACtD,MAAM,OAAO,GAAG,MAAM,IAAA,0CAAsB,EAAC,IAAI,CAAC,OAAO,CAAC,MAA4B,CAAC,CAAC;QACxF,MAAM,YAAY,GAAI,IAAI,CAAC,OAAO,CAAC,MAA6B,EAAE,IAAI,EAAE,CAAC;QACzE,IAAI,CAAC;YACH,IAAI,KAAK,GAAG,IAAA,4BAAgB,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5E,IAAI,YAAY,EAAE,CAAC;gBACjB,6CAA6C;gBAC7C,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC9E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,YAAY,EAAE,CAAC,CAAC;oBAC5E,OAAO,IAAI,CAAC,OAAO,CAAC,wCAAwC,YAAY,EAAE,CAAC,CAAC;gBAC9E,CAAC;YACH,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;gBAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;YACrD,CAAC;YAED,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,YAAY;gBACV,CAAC,CAAC,kCAAkC,YAAY,OAAO;gBACvD,CAAC,CAAC,oCAAoC,EACxC,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAC5C,CAAC;YACF,oEAAoE;YACpE,uEAAuE;YACvE,uEAAuE;YACvE,8CAA8C;YAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,IAAI,uCAA2B,CAAC;gBAC9D,MAAM,IAAA,kCAAc;gBAClB,oEAAoE;gBACpE,6DAA6D;gBAC7D,mEAAmE;gBACnE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,EACxG,SAAS,EACT,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,qBAAqB,SAAS,IAAI,CAAC,EAC9D,QAAQ,IAAI,CAAC,EAAE,EAAE,CAClB,CAAC;YACJ,CAAC;YAED,OAAO,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE;gBAC/C,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"SchedulerRunOnceCommand.js","sourceRoot":"","sources":["../../src/commands/SchedulerRunOnceCommand.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEH,uCAAwC;AACxC,yCAA6C;AAE7C,sDAA0D;AAC1D,sDAAqE;AACrE,2DAA6E;AAE7E,MAAa,uBAAwB,SAAQ,qBAAW;IAC7C,IAAI,GAAG,UAAU,CAAC;IAClB,WAAW,GAAG,uDAAuD,CAAC;IACtE,OAAO,GAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACvC,QAAQ,GAAG;QAClB,QAAQ,EAAE,0BAAe,CAAC,QAAQ;QAClC,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,KAAK;KACnB,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,OAAuB,EAAE,IAAiB;QACtD,MAAM,OAAO,GAAG,MAAM,IAAA,0CAAsB,EAAC,IAAI,CAAC,OAAO,CAAC,MAA4B,CAAC,CAAC;QACxF,MAAM,YAAY,GAAI,IAAI,CAAC,OAAO,CAAC,MAA6B,EAAE,IAAI,EAAE,CAAC;QACzE,IAAI,CAAC;YACH,IAAI,KAAK,GAAG,IAAA,4BAAgB,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5E,IAAI,YAAY,EAAE,CAAC;gBACjB,6CAA6C;gBAC7C,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC9E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,YAAY,EAAE,CAAC,CAAC;oBAC5E,OAAO,IAAI,CAAC,OAAO,CAAC,wCAAwC,YAAY,EAAE,CAAC,CAAC;gBAC9E,CAAC;YACH,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;gBAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;YACrD,CAAC;YAED,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,YAAY;gBACV,CAAC,CAAC,kCAAkC,YAAY,OAAO;gBACvD,CAAC,CAAC,oCAAoC,EACxC,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAC5C,CAAC;YACF,oEAAoE;YACpE,uEAAuE;YACvE,uEAAuE;YACvE,8CAA8C;YAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,IAAI,uCAA2B,CAAC;gBAC9D,MAAM,IAAA,kCAAc;gBAClB,oEAAoE;gBACpE,6DAA6D;gBAC7D,mEAAmE;gBACnE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,EACxG,SAAS,EACT,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,qBAAqB,SAAS,IAAI,CAAC,EAC9D,QAAQ,IAAI,CAAC,EAAE,EAAE,CAClB,CAAC;YACJ,CAAC;YAED,uEAAuE;YACvE,0EAA0E;YAC1E,uDAAuD;YACvD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;YAC5C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE;gBAC/C,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,MAAM,EAAE,OAAO;aAChB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE;gBAC/D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC7E,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACtD,EAAE,KAAK,EAAE,CACV,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO;;;;;;;;;;;;;;gDAcqC,CAAC;IAC/C,CAAC;CACF;AA1FD,0DA0FC"}
|
package/dist/commands/index.d.ts
CHANGED
|
@@ -14,6 +14,8 @@ import { MigrateConfigCommand } from './MigrateConfigCommand';
|
|
|
14
14
|
import { NormalizeCommand } from './NormalizeCommand';
|
|
15
15
|
import { WebUICommand } from './WebUICommand';
|
|
16
16
|
import { HealthCommand } from './HealthCommand';
|
|
17
|
+
import { DoctorCommand } from './DoctorCommand';
|
|
18
|
+
import { ReconcileCommand } from './ReconcileCommand';
|
|
17
19
|
import { StatusCommand } from './StatusCommand';
|
|
18
20
|
import { LogsCommand } from './LogsCommand';
|
|
19
21
|
import { ConfigCommand } from './ConfigCommand';
|
|
@@ -25,6 +27,7 @@ import { DirsCommand } from './DirsCommand';
|
|
|
25
27
|
import { VersionCommand } from './VersionCommand';
|
|
26
28
|
import { TagsCommand } from './TagsCommand';
|
|
27
29
|
import { TopicCommand } from './TopicCommand';
|
|
30
|
+
import { OutboxCommand } from './OutboxCommand';
|
|
28
31
|
/**
|
|
29
32
|
* Create and register all commands
|
|
30
33
|
*/
|
|
@@ -32,5 +35,5 @@ export declare function registerAllCommands(registry: CommandRegistry): void;
|
|
|
32
35
|
/**
|
|
33
36
|
* Export all command classes
|
|
34
37
|
*/
|
|
35
|
-
export { HelpCommand, LoginCommand, LoginHeadlessCommand, RefreshCommand, DownloadCommand, RandomDownloadCommand, SchedulerCommand, SchedulerRunOnceCommand, MigrateConfigCommand, NormalizeCommand, WebUICommand, HealthCommand, StatusCommand, LogsCommand, ConfigCommand, BackupCommand, MaintainCommand, MonitorCommand, SetupCommand, DirsCommand, VersionCommand, TagsCommand, TopicCommand, };
|
|
38
|
+
export { HelpCommand, LoginCommand, LoginHeadlessCommand, RefreshCommand, DownloadCommand, RandomDownloadCommand, SchedulerCommand, SchedulerRunOnceCommand, MigrateConfigCommand, NormalizeCommand, WebUICommand, HealthCommand, DoctorCommand, ReconcileCommand, StatusCommand, LogsCommand, ConfigCommand, BackupCommand, MaintainCommand, MonitorCommand, SetupCommand, DirsCommand, VersionCommand, TagsCommand, TopicCommand, OutboxCommand, };
|
|
36
39
|
//# sourceMappingURL=index.d.ts.map
|