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.
Files changed (151) hide show
  1. package/README.md +30 -4
  2. package/README_EN.md +11 -3
  3. package/config/fly-two-bots.example.json +3 -1
  4. package/dist/commands/DoctorCommand.d.ts +20 -0
  5. package/dist/commands/DoctorCommand.d.ts.map +1 -0
  6. package/dist/commands/DoctorCommand.js +107 -0
  7. package/dist/commands/DoctorCommand.js.map +1 -0
  8. package/dist/commands/OutboxCommand.d.ts +17 -0
  9. package/dist/commands/OutboxCommand.d.ts.map +1 -0
  10. package/dist/commands/OutboxCommand.js +102 -0
  11. package/dist/commands/OutboxCommand.js.map +1 -0
  12. package/dist/commands/ReconcileCommand.d.ts +24 -0
  13. package/dist/commands/ReconcileCommand.d.ts.map +1 -0
  14. package/dist/commands/ReconcileCommand.js +70 -0
  15. package/dist/commands/ReconcileCommand.js.map +1 -0
  16. package/dist/commands/SchedulerCommand.d.ts.map +1 -1
  17. package/dist/commands/SchedulerCommand.js +5 -0
  18. package/dist/commands/SchedulerCommand.js.map +1 -1
  19. package/dist/commands/SchedulerRunOnceCommand.d.ts.map +1 -1
  20. package/dist/commands/SchedulerRunOnceCommand.js +6 -0
  21. package/dist/commands/SchedulerRunOnceCommand.js.map +1 -1
  22. package/dist/commands/index.d.ts +4 -1
  23. package/dist/commands/index.d.ts.map +1 -1
  24. package/dist/commands/index.js +10 -1
  25. package/dist/commands/index.js.map +1 -1
  26. package/dist/commands/scheduler-runtime.d.ts +10 -1
  27. package/dist/commands/scheduler-runtime.d.ts.map +1 -1
  28. package/dist/commands/scheduler-runtime.js +157 -47
  29. package/dist/commands/scheduler-runtime.js.map +1 -1
  30. package/dist/config/types.d.ts +14 -1
  31. package/dist/config/types.d.ts.map +1 -1
  32. package/dist/config/validation.d.ts.map +1 -1
  33. package/dist/config/validation.js +10 -0
  34. package/dist/config/validation.js.map +1 -1
  35. package/dist/delivery/DeliveryAck.d.ts +70 -0
  36. package/dist/delivery/DeliveryAck.d.ts.map +1 -0
  37. package/dist/delivery/DeliveryAck.js +72 -0
  38. package/dist/delivery/DeliveryAck.js.map +1 -0
  39. package/dist/delivery/DeliveryDispatcher.d.ts +1 -0
  40. package/dist/delivery/DeliveryDispatcher.d.ts.map +1 -1
  41. package/dist/delivery/DeliveryDispatcher.js +9 -1
  42. package/dist/delivery/DeliveryDispatcher.js.map +1 -1
  43. package/dist/delivery/DeliveryService.d.ts +74 -0
  44. package/dist/delivery/DeliveryService.d.ts.map +1 -0
  45. package/dist/delivery/DeliveryService.js +209 -0
  46. package/dist/delivery/DeliveryService.js.map +1 -0
  47. package/dist/delivery/HttpMultipartDelivery.d.ts +11 -1
  48. package/dist/delivery/HttpMultipartDelivery.d.ts.map +1 -1
  49. package/dist/delivery/HttpMultipartDelivery.js +70 -67
  50. package/dist/delivery/HttpMultipartDelivery.js.map +1 -1
  51. package/dist/delivery/LegacyOutboxMigration.d.ts +21 -0
  52. package/dist/delivery/LegacyOutboxMigration.d.ts.map +1 -0
  53. package/dist/delivery/LegacyOutboxMigration.js +125 -0
  54. package/dist/delivery/LegacyOutboxMigration.js.map +1 -0
  55. package/dist/delivery/OutboxWorker.d.ts +70 -0
  56. package/dist/delivery/OutboxWorker.d.ts.map +1 -0
  57. package/dist/delivery/OutboxWorker.js +211 -0
  58. package/dist/delivery/OutboxWorker.js.map +1 -0
  59. package/dist/delivery/types.d.ts +15 -0
  60. package/dist/delivery/types.d.ts.map +1 -1
  61. package/dist/download/DownloadManager.d.ts +17 -12
  62. package/dist/download/DownloadManager.d.ts.map +1 -1
  63. package/dist/download/DownloadManager.js +31 -53
  64. package/dist/download/DownloadManager.js.map +1 -1
  65. package/dist/download/IllustrationDownloader.d.ts +1 -0
  66. package/dist/download/IllustrationDownloader.d.ts.map +1 -1
  67. package/dist/download/IllustrationDownloader.js +19 -1
  68. package/dist/download/IllustrationDownloader.js.map +1 -1
  69. package/dist/download/NovelDownloader.d.ts +3 -1
  70. package/dist/download/NovelDownloader.d.ts.map +1 -1
  71. package/dist/download/NovelDownloader.js +30 -2
  72. package/dist/download/NovelDownloader.js.map +1 -1
  73. package/dist/download/handlers/IllustrationTargetHandler.d.ts +18 -8
  74. package/dist/download/handlers/IllustrationTargetHandler.d.ts.map +1 -1
  75. package/dist/download/handlers/IllustrationTargetHandler.js +101 -74
  76. package/dist/download/handlers/IllustrationTargetHandler.js.map +1 -1
  77. package/dist/download/handlers/NovelTargetHandler.d.ts +8 -8
  78. package/dist/download/handlers/NovelTargetHandler.d.ts.map +1 -1
  79. package/dist/download/handlers/NovelTargetHandler.js +64 -83
  80. package/dist/download/handlers/NovelTargetHandler.js.map +1 -1
  81. package/dist/download/plan/DownloadPlanner.d.ts +6 -1
  82. package/dist/download/plan/DownloadPlanner.d.ts.map +1 -1
  83. package/dist/download/plan/DownloadPlanner.js +28 -5
  84. package/dist/download/plan/DownloadPlanner.js.map +1 -1
  85. package/dist/index.js +1 -1
  86. package/dist/index.js.map +1 -1
  87. package/dist/notification/NotificationPolicy.d.ts +38 -0
  88. package/dist/notification/NotificationPolicy.d.ts.map +1 -0
  89. package/dist/notification/NotificationPolicy.js +89 -0
  90. package/dist/notification/NotificationPolicy.js.map +1 -0
  91. package/dist/package.json +1 -1
  92. package/dist/pixiv/PixivClient.d.ts +4 -0
  93. package/dist/pixiv/PixivClient.d.ts.map +1 -1
  94. package/dist/pixiv/PixivClient.js +15 -2
  95. package/dist/pixiv/PixivClient.js.map +1 -1
  96. package/dist/pixiv/RateLimitCoordinator.d.ts +30 -0
  97. package/dist/pixiv/RateLimitCoordinator.d.ts.map +1 -0
  98. package/dist/pixiv/RateLimitCoordinator.js +66 -0
  99. package/dist/pixiv/RateLimitCoordinator.js.map +1 -0
  100. package/dist/pixiv/client/PixivApiCore.d.ts +5 -0
  101. package/dist/pixiv/client/PixivApiCore.d.ts.map +1 -1
  102. package/dist/pixiv/client/PixivApiCore.js +31 -9
  103. package/dist/pixiv/client/PixivApiCore.js.map +1 -1
  104. package/dist/scheduler/ScheduleTriggerServer.d.ts +7 -0
  105. package/dist/scheduler/ScheduleTriggerServer.d.ts.map +1 -1
  106. package/dist/scheduler/ScheduleTriggerServer.js +17 -0
  107. package/dist/scheduler/ScheduleTriggerServer.js.map +1 -1
  108. package/dist/scheduler/SlotCoordinator.d.ts +15 -0
  109. package/dist/scheduler/SlotCoordinator.d.ts.map +1 -1
  110. package/dist/scheduler/SlotCoordinator.js +74 -0
  111. package/dist/scheduler/SlotCoordinator.js.map +1 -1
  112. package/dist/scheduler/SlotStateMachine.d.ts +32 -0
  113. package/dist/scheduler/SlotStateMachine.d.ts.map +1 -0
  114. package/dist/scheduler/SlotStateMachine.js +65 -0
  115. package/dist/scheduler/SlotStateMachine.js.map +1 -0
  116. package/dist/scheduler/TargetOutcome.d.ts +63 -0
  117. package/dist/scheduler/TargetOutcome.d.ts.map +1 -0
  118. package/dist/scheduler/TargetOutcome.js +28 -0
  119. package/dist/scheduler/TargetOutcome.js.map +1 -0
  120. package/dist/storage/Database.d.ts +16 -0
  121. package/dist/storage/Database.d.ts.map +1 -1
  122. package/dist/storage/Database.js +29 -0
  123. package/dist/storage/Database.js.map +1 -1
  124. package/dist/storage/DatabaseMigration.d.ts.map +1 -1
  125. package/dist/storage/DatabaseMigration.js +66 -0
  126. package/dist/storage/DatabaseMigration.js.map +1 -1
  127. package/dist/storage/repositories/DeliveryRepository.d.ts +73 -0
  128. package/dist/storage/repositories/DeliveryRepository.d.ts.map +1 -0
  129. package/dist/storage/repositories/DeliveryRepository.js +148 -0
  130. package/dist/storage/repositories/DeliveryRepository.js.map +1 -0
  131. package/dist/storage/repositories/MetadataRepository.d.ts +27 -0
  132. package/dist/storage/repositories/MetadataRepository.d.ts.map +1 -0
  133. package/dist/storage/repositories/MetadataRepository.js +58 -0
  134. package/dist/storage/repositories/MetadataRepository.js.map +1 -0
  135. package/dist/storage/repositories/OutboxRepository.d.ts +72 -0
  136. package/dist/storage/repositories/OutboxRepository.d.ts.map +1 -0
  137. package/dist/storage/repositories/OutboxRepository.js +200 -0
  138. package/dist/storage/repositories/OutboxRepository.js.map +1 -0
  139. package/dist/storage/repositories/SlotRepository.d.ts +26 -1
  140. package/dist/storage/repositories/SlotRepository.d.ts.map +1 -1
  141. package/dist/storage/repositories/SlotRepository.js +76 -2
  142. package/dist/storage/repositories/SlotRepository.js.map +1 -1
  143. package/dist/utils/config-validator-unified.d.ts.map +1 -1
  144. package/dist/utils/config-validator-unified.js +14 -0
  145. package/dist/utils/config-validator-unified.js.map +1 -1
  146. package/dist/webui/package.json +1 -1
  147. package/package.json +1 -1
  148. package/dist/delivery/DeliveryOutbox.d.ts +0 -43
  149. package/dist/delivery/DeliveryOutbox.d.ts.map +0 -1
  150. package/dist/delivery/DeliveryOutbox.js +0 -293
  151. 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` 和 `url` 里可用 `${环境变量名}` 引用环境变量(Token 别写死进配置)。
153
+ `headers`、`url` 和 `readinessUrl` 里可用 `${环境变量名}` 引用环境变量(Token 别写死进配置)。
154
+ 插画 cache 投递会在 multipart 的 `previews` 字段携带 Pixiv 的低分辨率预览(与 `files`
155
+ 一一对应),原图仍是权威素材;通用接收端可以忽略该可选字段。
153
156
 
154
- 投递是「发件箱」式的,进程重启也不丢:失败的文件和待投清单保存在数据库同级的
155
- `delivery-outbox/`,下次运行先补投,按「5 分钟起步、最长 6 小时」指数退避重试,
156
- 成功后才清理。「今天没有可投稿内容」这类通知也走同一个 outbox,审核端暂时挂掉也能继续重试。
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. Failed delivery
129
- keeps both files and the durable outbox manifest beside the SQLite database;
130
- the next run retries them before processing new targets. Final no-match
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":"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"}
@@ -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;IAkJjF,OAAO,CAAC,uBAAuB;IAQ/B,QAAQ,IAAI,MAAM;CAYnB"}
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":";AAAA;;GAEG;;;AAEH,uCAAwC;AACxC,yCAA6C;AAE7C,sCAAwE;AACxE,4EAAyE;AACzE,8EAA6F;AAC7F,kEAA+D;AAE/D,2DAA6D;AAE7D;;;;;GAKG;AACH,SAAS,cAAc,CAAC,MAAwB;IAC9C,IAAI,MAAM,CAAC,gBAAgB,EAAE,IAAI,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAC9D,OAAO,MAAM,CAAC,gBAAgB,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAa,gBAAiB,SAAQ,qBAAW;IACtC,IAAI,GAAG,WAAW,CAAC;IACnB,WAAW,GAAG,gDAAgD,CAAC;IAC/D,OAAO,GAAa,CAAC,GAAG,CAAC,CAAC;IAC1B,QAAQ,GAAG;QAClB,QAAQ,EAAE,0BAAe,CAAC,QAAQ;QAClC,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,IAAI;KAClB,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,OAAuB,EAAE,IAAiB;QACtD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAA,sBAAa,EAAC,IAAI,CAAC,OAAO,CAAC,MAA4B,CAAC,CAAC;YAC5E,MAAM,OAAO,GAAG,MAAM,IAAA,0CAAsB,EAAC,IAAI,CAAC,OAAO,CAAC,MAA4B,CAAC,CAAC;YACxF,MAAM,oBAAoB,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAE1E,MAAM,OAAO,GAAG,IAAI,2CAAoB,CAAC;gBACvC,UAAU;gBACV,UAAU,EAAE,GAAG,EAAE;oBACf,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;oBAClD,IAAI,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,oBAAoB,EAAE,CAAC;wBAChE,MAAM,IAAI,KAAK,CACb,iIAAiI,CAClI,CAAC;oBACJ,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,EAAE,OAAO,CAAC,MAAM;gBACvB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,SAAS,EAAE,OAAO,CAAC,qBAAqB;gBACxC,SAAS,EAAE;oBACT,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,cAAc;oBAClE,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,cAAc;oBAChE,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC;iBACxD;aACF,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAE7C,2EAA2E;YAC3E,uEAAuE;YACvE,yEAAyE;YACzE,0EAA0E;YAC1E,+DAA+D;YAC/D,IAAI,aAAa,GAAiC,IAAI,CAAC;YACvD,IAAI,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAiB,CAAC;gBAC5C,MAAM,WAAW,GAAG,IAAI,iCAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC1D,MAAM,aAAa,GAAG,GAAqB,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC;gBACxF,MAAM,QAAQ,GAAG,CAAC,GAAqB,EAAE,UAAkB,EAAE,EAAE,CAC7D,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;gBAEzE,oEAAoE;gBACpE,gEAAgE;gBAChE,iEAAiE;gBACjE,sBAAsB;gBACtB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqC,CAAC;gBAE9D,aAAa,GAAG,IAAI,6CAAqB,CACvC,6CAAqB,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EACrD;oBACE,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE;oBAC1C,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE;wBACzC,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;wBAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;wBACvC,IAAI,CAAC,IAAI;4BAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,UAAU,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;wBAC5E,MAAM,QAAQ,GAAG,WAAW,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;wBAC7E,IAAI,CAAC,QAAQ,CAAC,OAAO;4BAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,8BAA8B,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;wBAC1H,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACvC,CAAC;oBACD,GAAG,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE;wBAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;wBAC3B,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBACnC,IAAI,QAAQ;4BAAE,OAAO,QAAQ,CAAC;wBAC9B,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;wBAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;wBACvC,MAAM,OAAO,GAAG,CAAC,KAAK,IAA+B,EAAE;4BACrD,IAAI,CAAC;gCACH,IAAI,CAAC,IAAI;oCAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;gCACpG,4DAA4D;gCAC5D,2DAA2D;gCAC3D,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,MAAuB,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gCAC3F,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gCAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oCACxE,QAAQ,EAAE,CAAC,CAAC,QAAQ;oCACpB,MAAM,EAAE,CAAC,CAAC,MAAM;oCAChB,MAAM,EAAE,CAAC,CAAC,MAAM;oCAChB,KAAK,EAAE,CAAC,CAAC,SAAS;iCACnB,CAAC,CAAC,CAAC;gCACJ,OAAO;oCACL,UAAU;oCACV,MAAM,EAAE,OAAO,CAAC,MAAM;oCACtB,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,QAAQ;oCAC/B,gBAAgB,EAAE,GAAG,EAAE,MAAM,KAAK,SAAS,IAAI,GAAG,EAAE,MAAM,KAAK,SAAS;oCACxE,KAAK;iCACN,CAAC;4BACJ,CAAC;oCAAS,CAAC;gCACT,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;4BACvB,CAAC;wBACH,CAAC,CAAC,EAAE,CAAC;wBACL,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;wBAC3B,OAAO,OAAO,CAAC;oBACjB,CAAC;oBACD,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE;wBACrB,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;wBAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;wBACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;wBAC9F,MAAM,GAAG,GAAG,QAAQ,IAAI,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;wBACxE,OAAO;4BACL,UAAU;4BACV,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,UAAU;4BAC3B,UAAU,EAAE,GAAG,EAAE,MAAM,IAAI,IAAI;yBAChC,CAAC;oBACJ,CAAC;iBACF,CACF,CAAC;gBACF,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;gBACpE,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,IAAI,CAAC,CAAC;gBACzD,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,EAAE,CAAC,IAAI,KAAK,UAAU;oBACpB,CAAC,CAAC,2FAA2F;oBAC7F,CAAC,CAAC,iEAAiE,EACrE,EAAE,IAAI,EAAE,CACT,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;gBAC/C,aAAa,EAAE,IAAI,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC;YAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC/B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACxB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;gBAC1E,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,qBAAqB;YACrB,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;gBACvC,OAAO,EAAE,sFAAsF;gBAC/F,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE;gBAC3D,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;IACH,CAAC;IAEO,uBAAuB,CAAC,MAAwB;QACtD,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;IACL,CAAC;IAED,QAAQ;QACN,OAAO;;;;;;;;;iEASsD,CAAC;IAChE,CAAC;CACF;AAhLD,4CAgLC"}
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;IAyDjF,QAAQ,IAAI,MAAM;CAiBnB"}
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":"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"}
1
+ {"version":3,"file":"SchedulerRunOnceCommand.js","sourceRoot":"","sources":["../../src/commands/SchedulerRunOnceCommand.ts"],"names":[],"mappings":"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"}
@@ -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