pixivflow 2.13.0 → 2.15.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 (82) hide show
  1. package/README.md +20 -2
  2. package/README_EN.md +11 -3
  3. package/config/fly-two-bots.example.json +3 -1
  4. package/dist/commands/OutboxCommand.d.ts +17 -0
  5. package/dist/commands/OutboxCommand.d.ts.map +1 -0
  6. package/dist/commands/OutboxCommand.js +149 -0
  7. package/dist/commands/OutboxCommand.js.map +1 -0
  8. package/dist/commands/RunsCommand.d.ts +21 -0
  9. package/dist/commands/RunsCommand.d.ts.map +1 -0
  10. package/dist/commands/RunsCommand.js +65 -0
  11. package/dist/commands/RunsCommand.js.map +1 -0
  12. package/dist/commands/VersionCommand.d.ts +2 -0
  13. package/dist/commands/VersionCommand.d.ts.map +1 -1
  14. package/dist/commands/VersionCommand.js +10 -46
  15. package/dist/commands/VersionCommand.js.map +1 -1
  16. package/dist/commands/index.d.ts +3 -1
  17. package/dist/commands/index.d.ts.map +1 -1
  18. package/dist/commands/index.js +7 -1
  19. package/dist/commands/index.js.map +1 -1
  20. package/dist/commands/scheduler-runtime.d.ts.map +1 -1
  21. package/dist/commands/scheduler-runtime.js +2 -0
  22. package/dist/commands/scheduler-runtime.js.map +1 -1
  23. package/dist/config/types.d.ts +4 -0
  24. package/dist/config/types.d.ts.map +1 -1
  25. package/dist/config/validation.d.ts.map +1 -1
  26. package/dist/config/validation.js +10 -0
  27. package/dist/config/validation.js.map +1 -1
  28. package/dist/delivery/DeliveryDispatcher.d.ts +4 -0
  29. package/dist/delivery/DeliveryDispatcher.d.ts.map +1 -1
  30. package/dist/delivery/DeliveryDispatcher.js +12 -0
  31. package/dist/delivery/DeliveryDispatcher.js.map +1 -1
  32. package/dist/delivery/DeliveryService.d.ts.map +1 -1
  33. package/dist/delivery/DeliveryService.js +2 -0
  34. package/dist/delivery/DeliveryService.js.map +1 -1
  35. package/dist/delivery/HttpMultipartDelivery.d.ts +14 -0
  36. package/dist/delivery/HttpMultipartDelivery.d.ts.map +1 -1
  37. package/dist/delivery/HttpMultipartDelivery.js +59 -16
  38. package/dist/delivery/HttpMultipartDelivery.js.map +1 -1
  39. package/dist/delivery/OutboxWorker.d.ts +15 -0
  40. package/dist/delivery/OutboxWorker.d.ts.map +1 -1
  41. package/dist/delivery/OutboxWorker.js +136 -4
  42. package/dist/delivery/OutboxWorker.js.map +1 -1
  43. package/dist/delivery/errorClass.d.ts +12 -0
  44. package/dist/delivery/errorClass.d.ts.map +1 -0
  45. package/dist/delivery/errorClass.js +34 -0
  46. package/dist/delivery/errorClass.js.map +1 -0
  47. package/dist/delivery/types.d.ts +4 -0
  48. package/dist/delivery/types.d.ts.map +1 -1
  49. package/dist/download/IllustrationDownloader.d.ts +1 -0
  50. package/dist/download/IllustrationDownloader.d.ts.map +1 -1
  51. package/dist/download/IllustrationDownloader.js +19 -1
  52. package/dist/download/IllustrationDownloader.js.map +1 -1
  53. package/dist/download/handlers/IllustrationTargetHandler.d.ts.map +1 -1
  54. package/dist/download/handlers/IllustrationTargetHandler.js +1 -0
  55. package/dist/download/handlers/IllustrationTargetHandler.js.map +1 -1
  56. package/dist/index.js +1 -1
  57. package/dist/index.js.map +1 -1
  58. package/dist/package.json +1 -1
  59. package/dist/scheduler/SlotCoordinator.d.ts +7 -0
  60. package/dist/scheduler/SlotCoordinator.d.ts.map +1 -1
  61. package/dist/scheduler/SlotCoordinator.js +26 -0
  62. package/dist/scheduler/SlotCoordinator.js.map +1 -1
  63. package/dist/storage/DatabaseMigration.d.ts.map +1 -1
  64. package/dist/storage/DatabaseMigration.js +22 -0
  65. package/dist/storage/DatabaseMigration.js.map +1 -1
  66. package/dist/storage/repositories/OutboxRepository.d.ts +59 -1
  67. package/dist/storage/repositories/OutboxRepository.d.ts.map +1 -1
  68. package/dist/storage/repositories/OutboxRepository.js +202 -0
  69. package/dist/storage/repositories/OutboxRepository.js.map +1 -1
  70. package/dist/utils/config-validator-unified.d.ts.map +1 -1
  71. package/dist/utils/config-validator-unified.js +14 -0
  72. package/dist/utils/config-validator-unified.js.map +1 -1
  73. package/dist/utils/redact.d.ts +14 -0
  74. package/dist/utils/redact.d.ts.map +1 -0
  75. package/dist/utils/redact.js +47 -0
  76. package/dist/utils/redact.js.map +1 -0
  77. package/dist/version.d.ts +5 -0
  78. package/dist/version.d.ts.map +1 -0
  79. package/dist/version.js +6 -0
  80. package/dist/version.js.map +1 -0
  81. package/dist/webui/package.json +1 -1
  82. package/package.json +2 -2
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,7 +150,9 @@ 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
157
  投递是**事务发件箱(SQLite outbox)**式的,at-least-once 执行、effectively-once
155
158
  可见效果:每个外部副作用(一次内容投递、一条通知)在 `outbox` 表落一行,带幂等键和
@@ -161,6 +164,20 @@ pixivflow scheduler # 按 cron 配置长期挂机自动收集
161
164
  迁移进 SQLite,迁移幂等。「今天没有可投稿内容」这类通知与内容投递走同一张表、独立泵送,
162
165
  审核端暂时挂掉不会互相阻塞。
163
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`。
180
+
164
181
  运维通知可直接把 `notificationUrl` 指向 [Apprise API](docs/APPRISE.md),由 Apprise 统一发送
165
182
  Email、Telegram、Discord、ntfy 等渠道;PixivFlow 不实现这些通知协议。
166
183
 
@@ -182,6 +199,7 @@ Email、Telegram、Discord、ntfy 等渠道;PixivFlow 不实现这些通知协
182
199
  | `pixivflow health` | 健康检查:配置、目录可写性、连通性 |
183
200
  | `pixivflow doctor` | 可靠性体检:卡住的 slot/outbox 租约、pending 投递、dead 行;`--repair` 收敛 |
184
201
  | `pixivflow reconcile` | 把下游已确认的历史重复登记进投递账本(默认 dry-run,`--repair` 落库) |
202
+ | `pixivflow outbox` | 列出、检查、重放 dead letter 或取消尚未执行的 durable intent |
185
203
  | `pixivflow tags discover <词>` | 发现相关 Tag(Pixiv 联想 + 作品标签共现),只列候选不改配置 |
186
204
  | `pixivflow tags apply <清单> --target <id> --select <tag1,tag2>` | 人工确认后把所选 Tag 原子写入配置并触发热重载 |
187
205
  | `pixivflow topic resolve <主题>` | 查看自动推导出的相关 Tag 空间(`--type illustration\|novel`、`--refresh`) |
@@ -229,4 +247,4 @@ Bug 与功能建议请提交到
229
247
 
230
248
  ## 许可证
231
249
 
232
- [MIT](LICENSE)
250
+ [MIT](LICENSE)
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,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;AA+BrE,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;IAiFjF,OAAO,CAAC,OAAO;CAWhB"}
@@ -0,0 +1,149 @@
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
+ /** Operator-initiated audit event (never counts as an attempt). */
11
+ function recordCliEvent(db, row, event) {
12
+ let executionId;
13
+ let slotId;
14
+ let pixivId;
15
+ try {
16
+ const c = JSON.parse(row.payloadJson).context ?? {};
17
+ const str = (v) => (typeof v === 'string' ? v : undefined);
18
+ executionId = str(c.executionId) ?? str(c.slotId);
19
+ slotId = str(c.slotId);
20
+ pixivId = str(c.pixivId);
21
+ }
22
+ catch { /* payload without context (e.g. notification) */ }
23
+ db.outbox.recordEvent({
24
+ event,
25
+ actor: 'cli',
26
+ countsAsAttempt: 0,
27
+ deliveryId: row.deliveryId,
28
+ outboxId: row.id,
29
+ deliveryTarget: row.deliveryTarget,
30
+ executionId, slotId, pixivId,
31
+ });
32
+ }
33
+ class OutboxCommand extends Command_1.BaseCommand {
34
+ name = 'outbox';
35
+ description = 'List, inspect, retry or cancel durable delivery intents';
36
+ requiresToken = false;
37
+ metadata = {
38
+ category: metadata_1.CommandCategory.MAINTENANCE,
39
+ requiresAuth: true,
40
+ longRunning: false,
41
+ };
42
+ getUsage() {
43
+ return [
44
+ 'pixivflow outbox list [--status dead] [--limit 100]',
45
+ 'pixivflow outbox inspect <id>',
46
+ 'pixivflow outbox retry <id>',
47
+ 'pixivflow outbox retry --dead',
48
+ 'pixivflow outbox cancel <id>',
49
+ ].join('\n');
50
+ }
51
+ async execute(context, args) {
52
+ const action = args.positional[0] ?? 'list';
53
+ const id = args.positional[1];
54
+ const db = new Database_1.Database(context.config.storage?.databasePath ?? './data/pixiv-downloader.db');
55
+ try {
56
+ db.migrate();
57
+ if (action === 'list') {
58
+ const rawStatus = typeof args.options.status === 'string'
59
+ ? args.options.status : undefined;
60
+ if (rawStatus && !STATUSES.has(rawStatus)) {
61
+ return this.failure(`unknown outbox status: ${rawStatus}`);
62
+ }
63
+ const limit = Number(args.options.limit ?? 100);
64
+ const rows = db.outbox.list(rawStatus, Number.isFinite(limit) ? limit : 100);
65
+ for (const row of rows)
66
+ context.logger.info('outbox', this.summary(row));
67
+ return this.success(`${rows.length} outbox row(s)`, rows.map((row) => this.summary(row)));
68
+ }
69
+ if (action === 'inspect') {
70
+ if (!id)
71
+ return this.failure('Usage: pixivflow outbox inspect <id>');
72
+ const row = db.outbox.get(id);
73
+ if (!row)
74
+ return this.failure(`outbox row not found: ${id}`);
75
+ const events = db.outbox.listEvents({ outboxId: id, limit: 20 });
76
+ const deferred = events.filter((e) => e.event === 'outbox.deferred');
77
+ const failures = events.filter((e) => e.countsAsAttempt === 1);
78
+ for (const e of deferred) {
79
+ context.logger.info('not ready (deferred, no attempt consumed)', {
80
+ ts: e.ts, errorClass: e.errorClass, detail: e.detail,
81
+ });
82
+ }
83
+ for (const e of failures) {
84
+ context.logger.info('attempt-consuming event', {
85
+ event: e.event, ts: e.ts, errorClass: e.errorClass, retryable: e.retryable, detail: e.detail,
86
+ });
87
+ }
88
+ return this.success('outbox row', {
89
+ row,
90
+ events: events.map((e) => ({
91
+ ts: e.ts, event: e.event, errorClass: e.errorClass,
92
+ countsAsAttempt: e.countsAsAttempt, retryable: e.retryable, actor: e.actor, detail: e.detail,
93
+ })),
94
+ });
95
+ }
96
+ if (action === 'retry') {
97
+ const rows = args.options.dead ? db.outbox.list('dead', 500) : [];
98
+ if (!args.options.dead) {
99
+ if (!id)
100
+ return this.failure('Usage: pixivflow outbox retry <id> | --dead');
101
+ const row = db.outbox.get(id);
102
+ if (!row)
103
+ return this.failure(`outbox row not found: ${id}`);
104
+ if (row.status !== 'dead') {
105
+ return this.failure(`outbox row is not dead: ${id}`);
106
+ }
107
+ rows.push(row);
108
+ }
109
+ for (const row of rows) {
110
+ db.outbox.requeue(row.id);
111
+ recordCliEvent(db, row, 'outbox.replay_requested');
112
+ }
113
+ return this.success(`requeued ${rows.length} outbox row(s)`, { ids: rows.map((row) => row.id) });
114
+ }
115
+ if (action === 'cancel') {
116
+ if (!id)
117
+ return this.failure('Usage: pixivflow outbox cancel <id>');
118
+ const row = db.outbox.get(id);
119
+ if (!row || !db.outbox.cancel(id)) {
120
+ return this.failure(`outbox row is missing, processing or already terminal: ${id}`);
121
+ }
122
+ if (row.deliveryId) {
123
+ db.deliveries.recordAck(row.deliveryId, {
124
+ status: 'failed', remoteStatus: 'cancelled', error: 'cancelled by operator',
125
+ });
126
+ }
127
+ recordCliEvent(db, row, 'outbox.cancelled');
128
+ return this.success('outbox row cancelled', { id });
129
+ }
130
+ return this.failure(this.getUsage());
131
+ }
132
+ finally {
133
+ db.close();
134
+ }
135
+ }
136
+ summary(row) {
137
+ return {
138
+ id: row.id,
139
+ kind: row.kind,
140
+ status: row.status,
141
+ deliveryTarget: row.deliveryTarget,
142
+ attempts: row.attempts,
143
+ nextAttemptAt: row.nextAttemptAt,
144
+ lastError: row.lastError,
145
+ };
146
+ }
147
+ }
148
+ exports.OutboxCommand = OutboxCommand;
149
+ //# 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,21 @@
1
+ import { BaseCommand } from './Command';
2
+ import { CommandCategory } from './metadata';
3
+ import { CommandArgs, CommandContext, CommandResult } from './types';
4
+ /**
5
+ * Read-only observability queries over scheduler occurrences:
6
+ * pixivflow runs list [--limit 20]
7
+ * pixivflow runs show <executionId> (executionId == slot id)
8
+ */
9
+ export declare class RunsCommand extends BaseCommand {
10
+ readonly name = "runs";
11
+ readonly description = "List scheduler runs and show one execution summary";
12
+ readonly requiresToken = false;
13
+ readonly metadata: {
14
+ category: CommandCategory;
15
+ requiresAuth: boolean;
16
+ longRunning: boolean;
17
+ };
18
+ getUsage(): string;
19
+ execute(context: CommandContext, args: CommandArgs): Promise<CommandResult>;
20
+ }
21
+ //# sourceMappingURL=RunsCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunsCommand.d.ts","sourceRoot":"","sources":["../../src/commands/RunsCommand.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;AAGrE;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,WAAW;IAC1C,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,wDAAwD;IAC5E,QAAQ,CAAC,aAAa,SAAS;IAC/B,QAAQ,CAAC,QAAQ;;;;MAIf;IAEF,QAAQ,IAAI,MAAM;IAOZ,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;CAmClF"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RunsCommand = void 0;
4
+ const Command_1 = require("./Command");
5
+ const metadata_1 = require("./metadata");
6
+ const Database_1 = require("../storage/Database");
7
+ /**
8
+ * Read-only observability queries over scheduler occurrences:
9
+ * pixivflow runs list [--limit 20]
10
+ * pixivflow runs show <executionId> (executionId == slot id)
11
+ */
12
+ class RunsCommand extends Command_1.BaseCommand {
13
+ name = 'runs';
14
+ description = 'List scheduler runs and show one execution summary';
15
+ requiresToken = false;
16
+ metadata = {
17
+ category: metadata_1.CommandCategory.MAINTENANCE,
18
+ requiresAuth: true,
19
+ longRunning: false,
20
+ };
21
+ getUsage() {
22
+ return [
23
+ 'pixivflow runs list [--limit 20]',
24
+ 'pixivflow runs show <executionId>',
25
+ ].join('\n');
26
+ }
27
+ async execute(context, args) {
28
+ const action = args.positional[0] ?? 'list';
29
+ const db = new Database_1.Database(context.config.storage?.databasePath ?? './data/pixiv-downloader.db');
30
+ try {
31
+ db.migrate();
32
+ if (action === 'list') {
33
+ const limit = Number(args.options.limit ?? 20);
34
+ const rows = db.getRecentSchedulerExecutions(Number.isFinite(limit) ? limit : 20);
35
+ const data = rows.map((r) => ({
36
+ id: r.id,
37
+ number: r.executionNumber,
38
+ scheduleId: r.scheduleId,
39
+ status: r.status,
40
+ start: r.startTime,
41
+ end: r.endTime,
42
+ durationMs: r.duration,
43
+ }));
44
+ for (const row of data)
45
+ context.logger.info('run', row);
46
+ return this.success(`${data.length} run(s)`, data);
47
+ }
48
+ if (action === 'show') {
49
+ const executionId = args.positional[1];
50
+ if (!executionId)
51
+ return this.failure('Usage: pixivflow runs show <executionId>');
52
+ const summary = db.outbox.executionSummary(executionId);
53
+ const text = JSON.stringify(summary, null, 2);
54
+ context.logger.info(text);
55
+ return this.success('execution summary', summary);
56
+ }
57
+ return this.failure(this.getUsage());
58
+ }
59
+ finally {
60
+ db.close();
61
+ }
62
+ }
63
+ }
64
+ exports.RunsCommand = RunsCommand;
65
+ //# sourceMappingURL=RunsCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunsCommand.js","sourceRoot":"","sources":["../../src/commands/RunsCommand.ts"],"names":[],"mappings":";;;AAAA,uCAAwC;AACxC,yCAA6C;AAE7C,kDAA+C;AAE/C;;;;GAIG;AACH,MAAa,WAAY,SAAQ,qBAAW;IACjC,IAAI,GAAG,MAAM,CAAC;IACd,WAAW,GAAG,oDAAoD,CAAC;IACnE,aAAa,GAAG,KAAK,CAAC;IACtB,QAAQ,GAAG;QAClB,QAAQ,EAAE,0BAAe,CAAC,WAAW;QACrC,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,KAAK;KACnB,CAAC;IAEF,QAAQ;QACN,OAAO;YACL,kCAAkC;YAClC,mCAAmC;SACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB,EAAE,IAAiB;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;QAC5C,MAAM,EAAE,GAAG,IAAI,mBAAQ,CACrB,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,IAAI,4BAA4B,CACrE,CAAC;QACF,IAAI,CAAC;YACH,EAAE,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC/C,MAAM,IAAI,GAAG,EAAE,CAAC,4BAA4B,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAClF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC5B,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,MAAM,EAAE,CAAC,CAAC,eAAe;oBACzB,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,KAAK,EAAE,CAAC,CAAC,SAAS;oBAClB,GAAG,EAAE,CAAC,CAAC,OAAO;oBACd,UAAU,EAAE,CAAC,CAAC,QAAQ;iBACvB,CAAC,CAAC,CAAC;gBACJ,KAAK,MAAM,GAAG,IAAI,IAAI;oBAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBACxD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,SAAS,EAAE,IAAI,CAAC,CAAC;YACrD,CAAC;YACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACvC,IAAI,CAAC,WAAW;oBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC;gBAClF,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBACxD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC9C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;YACpD,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvC,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC;CACF;AApDD,kCAoDC"}
@@ -4,6 +4,8 @@
4
4
  import { BaseCommand } from './Command';
5
5
  import { CommandCategory } from './metadata';
6
6
  import { CommandArgs, CommandContext, CommandResult } from './types';
7
+ /** Human-readable version with the baked-in commit SHA. */
8
+ export declare function versionString(): string;
7
9
  /**
8
10
  * Version command implementation
9
11
  */
@@ -1 +1 @@
1
- {"version":3,"file":"VersionCommand.d.ts","sourceRoot":"","sources":["../../src/commands/VersionCommand.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,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;;GAEG;AACH,qBAAa,cAAe,SAAQ,WAAW;IAC7C,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,4BAA4B;IAChD,QAAQ,CAAC,OAAO,WAAS;IACzB,QAAQ,CAAC,QAAQ;;;;MAIf;IAEI,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;CAwBlF"}
1
+ {"version":3,"file":"VersionCommand.d.ts","sourceRoot":"","sources":["../../src/commands/VersionCommand.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,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;AAGrE,2DAA2D;AAC3D,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,WAAW;IAC7C,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,4BAA4B;IAChD,QAAQ,CAAC,OAAO,WAAS;IACzB,QAAQ,CAAC,QAAQ;;;;MAIf;IAEI,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;CAelF"}
@@ -2,45 +2,16 @@
2
2
  /**
3
3
  * Version command - displays the application version
4
4
  */
5
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- var desc = Object.getOwnPropertyDescriptor(m, k);
8
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
- desc = { enumerable: true, get: function() { return m[k]; } };
10
- }
11
- Object.defineProperty(o, k2, desc);
12
- }) : (function(o, m, k, k2) {
13
- if (k2 === undefined) k2 = k;
14
- o[k2] = m[k];
15
- }));
16
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
- Object.defineProperty(o, "default", { enumerable: true, value: v });
18
- }) : function(o, v) {
19
- o["default"] = v;
20
- });
21
- var __importStar = (this && this.__importStar) || (function () {
22
- var ownKeys = function(o) {
23
- ownKeys = Object.getOwnPropertyNames || function (o) {
24
- var ar = [];
25
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
- return ar;
27
- };
28
- return ownKeys(o);
29
- };
30
- return function (mod) {
31
- if (mod && mod.__esModule) return mod;
32
- var result = {};
33
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
- __setModuleDefault(result, mod);
35
- return result;
36
- };
37
- })();
38
5
  Object.defineProperty(exports, "__esModule", { value: true });
39
6
  exports.VersionCommand = void 0;
7
+ exports.versionString = versionString;
40
8
  const Command_1 = require("./Command");
41
9
  const metadata_1 = require("./metadata");
42
- const fs = __importStar(require("fs/promises"));
43
- const path = __importStar(require("path"));
10
+ const version_1 = require("../version");
11
+ /** Human-readable version with the baked-in commit SHA. */
12
+ function versionString() {
13
+ return `${version_1.BUILD.version} (commit ${version_1.BUILD.commit})`;
14
+ }
44
15
  /**
45
16
  * Version command implementation
46
17
  */
@@ -55,19 +26,12 @@ class VersionCommand extends Command_1.BaseCommand {
55
26
  };
56
27
  async execute(context, args) {
57
28
  try {
58
- // Go up from dist/commands/ to the project root
59
- const packageJsonPath = path.resolve(__dirname, '../../package.json');
60
- const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8');
61
- const { version } = JSON.parse(packageJsonContent);
62
- console.log(`PixivFlow v${version}`);
63
- return {
64
- success: true,
65
- message: `Version: ${version}`,
66
- data: { version }
67
- };
29
+ const line = `PixivFlow v${versionString()}`;
30
+ console.log(line);
31
+ return { success: true, message: `Version: ${versionString()}`, data: version_1.BUILD };
68
32
  }
69
33
  catch (error) {
70
- context.logger.error('Failed to read version from package.json', { error });
34
+ context.logger.error('Failed to read version information', { error });
71
35
  console.error('Error: Could not read version information.');
72
36
  return {
73
37
  success: false,
@@ -1 +1 @@
1
- {"version":3,"file":"VersionCommand.js","sourceRoot":"","sources":["../../src/commands/VersionCommand.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAwC;AACxC,yCAA6C;AAE7C,gDAAkC;AAClC,2CAA6B;AAE7B;;GAEG;AACH,MAAa,cAAe,SAAQ,qBAAW;IACpC,IAAI,GAAG,SAAS,CAAC;IACjB,WAAW,GAAG,wBAAwB,CAAC;IACvC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,QAAQ,GAAG;QAClB,QAAQ,EAAE,0BAAe,CAAC,OAAO;QACjC,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,KAAK;KACnB,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,OAAuB,EAAE,IAAiB;QACtD,IAAI,CAAC;YACH,gDAAgD;YAChD,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;YACtE,MAAM,kBAAkB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YACvE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAEnD,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC;YAErC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,YAAY,OAAO,EAAE;gBAC9B,IAAI,EAAE,EAAE,OAAO,EAAE;aAClB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5E,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC5D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,wBAAwB;gBACjC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aACjE,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAlCD,wCAkCC"}
1
+ {"version":3,"file":"VersionCommand.js","sourceRoot":"","sources":["../../src/commands/VersionCommand.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAQH,sCAEC;AARD,uCAAwC;AACxC,yCAA6C;AAE7C,wCAAmC;AAEnC,2DAA2D;AAC3D,SAAgB,aAAa;IAC3B,OAAO,GAAG,eAAK,CAAC,OAAO,YAAY,eAAK,CAAC,MAAM,GAAG,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAa,cAAe,SAAQ,qBAAW;IACpC,IAAI,GAAG,SAAS,CAAC;IACjB,WAAW,GAAG,wBAAwB,CAAC;IACvC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,QAAQ,GAAG;QAClB,QAAQ,EAAE,0BAAe,CAAC,OAAO;QACjC,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,KAAK;KACnB,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,OAAuB,EAAE,IAAiB;QACtD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,cAAc,aAAa,EAAE,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,aAAa,EAAE,EAAE,EAAE,IAAI,EAAE,eAAK,EAAE,CAAC;QAChF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACtE,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC5D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,wBAAwB;gBACjC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aACjE,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAzBD,wCAyBC"}
@@ -27,6 +27,8 @@ import { DirsCommand } from './DirsCommand';
27
27
  import { VersionCommand } from './VersionCommand';
28
28
  import { TagsCommand } from './TagsCommand';
29
29
  import { TopicCommand } from './TopicCommand';
30
+ import { OutboxCommand } from './OutboxCommand';
31
+ import { RunsCommand } from './RunsCommand';
30
32
  /**
31
33
  * Create and register all commands
32
34
  */
@@ -34,5 +36,5 @@ export declare function registerAllCommands(registry: CommandRegistry): void;
34
36
  /**
35
37
  * Export all command classes
36
38
  */
37
- 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, };
39
+ 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, RunsCommand, };
38
40
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CA0BnE;AAED;;GAEG;AACH,OAAO,EACL,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACd,YAAY,EACZ,WAAW,EACX,cAAc,EACd,WAAW,EACX,YAAY,GACb,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CA4BnE;AAED;;GAEG;AACH,OAAO,EACL,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACd,YAAY,EACZ,WAAW,EACX,cAAc,EACd,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,GACZ,CAAC"}
@@ -3,7 +3,7 @@
3
3
  * Command exports and registration
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.TopicCommand = exports.TagsCommand = exports.VersionCommand = exports.DirsCommand = exports.SetupCommand = exports.MonitorCommand = exports.MaintainCommand = exports.BackupCommand = exports.ConfigCommand = exports.LogsCommand = exports.StatusCommand = exports.ReconcileCommand = exports.DoctorCommand = exports.HealthCommand = exports.WebUICommand = exports.NormalizeCommand = exports.MigrateConfigCommand = exports.SchedulerRunOnceCommand = exports.SchedulerCommand = exports.RandomDownloadCommand = exports.DownloadCommand = exports.RefreshCommand = exports.LoginHeadlessCommand = exports.LoginCommand = exports.HelpCommand = void 0;
6
+ exports.RunsCommand = exports.OutboxCommand = exports.TopicCommand = exports.TagsCommand = exports.VersionCommand = exports.DirsCommand = exports.SetupCommand = exports.MonitorCommand = exports.MaintainCommand = exports.BackupCommand = exports.ConfigCommand = exports.LogsCommand = exports.StatusCommand = exports.ReconcileCommand = exports.DoctorCommand = exports.HealthCommand = exports.WebUICommand = exports.NormalizeCommand = exports.MigrateConfigCommand = exports.SchedulerRunOnceCommand = exports.SchedulerCommand = exports.RandomDownloadCommand = exports.DownloadCommand = exports.RefreshCommand = exports.LoginHeadlessCommand = exports.LoginCommand = exports.HelpCommand = void 0;
7
7
  exports.registerAllCommands = registerAllCommands;
8
8
  const HelpCommand_1 = require("./HelpCommand");
9
9
  Object.defineProperty(exports, "HelpCommand", { enumerable: true, get: function () { return HelpCommand_1.HelpCommand; } });
@@ -55,6 +55,10 @@ const TagsCommand_1 = require("./TagsCommand");
55
55
  Object.defineProperty(exports, "TagsCommand", { enumerable: true, get: function () { return TagsCommand_1.TagsCommand; } });
56
56
  const TopicCommand_1 = require("./TopicCommand");
57
57
  Object.defineProperty(exports, "TopicCommand", { enumerable: true, get: function () { return TopicCommand_1.TopicCommand; } });
58
+ const OutboxCommand_1 = require("./OutboxCommand");
59
+ Object.defineProperty(exports, "OutboxCommand", { enumerable: true, get: function () { return OutboxCommand_1.OutboxCommand; } });
60
+ const RunsCommand_1 = require("./RunsCommand");
61
+ Object.defineProperty(exports, "RunsCommand", { enumerable: true, get: function () { return RunsCommand_1.RunsCommand; } });
58
62
  /**
59
63
  * Create and register all commands
60
64
  */
@@ -84,5 +88,7 @@ function registerAllCommands(registry) {
84
88
  registry.register(new VersionCommand_1.VersionCommand());
85
89
  registry.register(new TagsCommand_1.TagsCommand());
86
90
  registry.register(new TopicCommand_1.TopicCommand());
91
+ registry.register(new OutboxCommand_1.OutboxCommand());
92
+ registry.register(new RunsCommand_1.RunsCommand());
87
93
  }
88
94
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAgCH,kDA0BC;AAvDD,+CAA4C;AA6D1C,4FA7DO,yBAAW,OA6DP;AA5Db,iDAA8C;AA6D5C,6FA7DO,2BAAY,OA6DP;AA5Dd,iEAA8D;AA6D5D,qGA7DO,2CAAoB,OA6DP;AA5DtB,qDAAkD;AA6DhD,+FA7DO,+BAAc,OA6DP;AA5DhB,uDAAoD;AA6DlD,gGA7DO,iCAAe,OA6DP;AA5DjB,mEAAgE;AA6D9D,sGA7DO,6CAAqB,OA6DP;AA5DvB,yDAAsD;AA6DpD,iGA7DO,mCAAgB,OA6DP;AA5DlB,uEAAoE;AA6DlE,wGA7DO,iDAAuB,OA6DP;AA5DzB,iEAA8D;AA6D5D,qGA7DO,2CAAoB,OA6DP;AA5DtB,yDAAsD;AA6DpD,iGA7DO,mCAAgB,OA6DP;AA5DlB,iDAA8C;AA6D5C,6FA7DO,2BAAY,OA6DP;AA5Dd,mDAAgD;AA6D9C,8FA7DO,6BAAa,OA6DP;AA5Df,mDAAgD;AA6D9C,8FA7DO,6BAAa,OA6DP;AA5Df,yDAAsD;AA6DpD,iGA7DO,mCAAgB,OA6DP;AA5DlB,mDAAgD;AA6D9C,8FA7DO,6BAAa,OA6DP;AA5Df,+CAA4C;AA6D1C,4FA7DO,yBAAW,OA6DP;AA5Db,mDAAgD;AA6D9C,8FA7DO,6BAAa,OA6DP;AA5Df,mDAAgD;AA6D9C,8FA7DO,6BAAa,OA6DP;AA5Df,uDAAoD;AA6DlD,gGA7DO,iCAAe,OA6DP;AA5DjB,qDAAkD;AA6DhD,+FA7DO,+BAAc,OA6DP;AA5DhB,iDAA8C;AA6D5C,6FA7DO,2BAAY,OA6DP;AA5Dd,+CAA4C;AA6D1C,4FA7DO,yBAAW,OA6DP;AA5Db,qDAAkD;AA6DhD,+FA7DO,+BAAc,OA6DP;AA5DhB,+CAA4C;AA6D1C,4FA7DO,yBAAW,OA6DP;AA5Db,iDAA8C;AA6D5C,6FA7DO,2BAAY,OA6DP;AA3Dd;;GAEG;AACH,SAAgB,mBAAmB,CAAC,QAAyB;IAC3D,QAAQ,CAAC,QAAQ,CAAC,IAAI,yBAAW,EAAE,CAAC,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,IAAI,2BAAY,EAAE,CAAC,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,IAAI,2CAAoB,EAAE,CAAC,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,IAAI,+BAAc,EAAE,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,IAAI,iCAAe,EAAE,CAAC,CAAC;IACzC,QAAQ,CAAC,QAAQ,CAAC,IAAI,6CAAqB,EAAE,CAAC,CAAC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,IAAI,mCAAgB,EAAE,CAAC,CAAC;IAC1C,QAAQ,CAAC,QAAQ,CAAC,IAAI,iDAAuB,EAAE,CAAC,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,IAAI,2CAAoB,EAAE,CAAC,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,IAAI,mCAAgB,EAAE,CAAC,CAAC;IAC1C,QAAQ,CAAC,QAAQ,CAAC,IAAI,2BAAY,EAAE,CAAC,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,IAAI,6BAAa,EAAE,CAAC,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,IAAI,6BAAa,EAAE,CAAC,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,IAAI,mCAAgB,EAAE,CAAC,CAAC;IAC1C,QAAQ,CAAC,QAAQ,CAAC,IAAI,6BAAa,EAAE,CAAC,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,IAAI,yBAAW,EAAE,CAAC,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,IAAI,6BAAa,EAAE,CAAC,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,IAAI,6BAAa,EAAE,CAAC,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,IAAI,iCAAe,EAAE,CAAC,CAAC;IACzC,QAAQ,CAAC,QAAQ,CAAC,IAAI,+BAAc,EAAE,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,IAAI,2BAAY,EAAE,CAAC,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,IAAI,yBAAW,EAAE,CAAC,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,IAAI,+BAAc,EAAE,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,IAAI,yBAAW,EAAE,CAAC,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,IAAI,2BAAY,EAAE,CAAC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler-runtime.d.ts","sourceRoot":"","sources":["../../src/commands/scheduler-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAA6B,cAAc,EAAE,gBAAgB,EAAgB,MAAM,WAAW,CAAC;AACtG,OAAO,EAAE,QAAQ,EAA0B,MAAM,qBAAqB,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAU3E,OAAO,EAAE,kBAAkB,EAAiB,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIpD,+EAA+E;AAC/E,MAAM,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,gBAAgB,EAAE,UAAU,CAAC,OAAO,6BAA6B,CAAC,CAAC;IACnE,6EAA6E;IAC7E,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrG,kDAAkD;IAClD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,qEAAqE;IACrE,qBAAqB,CACnB,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,+DAA+D;IAC/D,iBAAiB,IAAI,IAAI,CAAC;IAC1B,6DAA6D;IAC7D,WAAW,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3F,8EAA8E;IAC9E,KAAK,IAAI,IAAI,CAAC;CACf;AAiGD,wBAAsB,qBAAqB,CACvC,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CAiBjB;AAWD,wBAAsB,sBAAsB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqS9F;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,IAAI,EACrB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,CAAC,CAAC,CAcZ"}
1
+ {"version":3,"file":"scheduler-runtime.d.ts","sourceRoot":"","sources":["../../src/commands/scheduler-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAA6B,cAAc,EAAE,gBAAgB,EAAgB,MAAM,WAAW,CAAC;AACtG,OAAO,EAAE,QAAQ,EAA0B,MAAM,qBAAqB,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAU3E,OAAO,EAAE,kBAAkB,EAAiB,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAKpD,+EAA+E;AAC/E,MAAM,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,gBAAgB,EAAE,UAAU,CAAC,OAAO,6BAA6B,CAAC,CAAC;IACnE,6EAA6E;IAC7E,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrG,kDAAkD;IAClD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,qEAAqE;IACrE,qBAAqB,CACnB,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,+DAA+D;IAC/D,iBAAiB,IAAI,IAAI,CAAC;IAC1B,6DAA6D;IAC7D,WAAW,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3F,8EAA8E;IAC9E,KAAK,IAAI,IAAI,CAAC;CACf;AAiGD,wBAAsB,qBAAqB,CACvC,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CAiBjB;AAWD,wBAAsB,sBAAsB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsS9F;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,IAAI,EACrB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,CAAC,CAAC,CAcZ"}
@@ -60,6 +60,7 @@ const NotificationPolicy_1 = require("../notification/NotificationPolicy");
60
60
  const node_crypto_1 = require("node:crypto");
61
61
  const placeholders_1 = require("../config/placeholders");
62
62
  const logger_1 = require("../logger");
63
+ const version_1 = require("../version");
63
64
  /**
64
65
  * Open the pixivflow database with a startup integrity check. A structurally
65
66
  * corrupt file (quick_check failure) is isolated aside and replaced with a
@@ -161,6 +162,7 @@ function buildProxyUrl(network) {
161
162
  return `${protocol}://${auth}${proxy.host}:${proxy.port}`;
162
163
  }
163
164
  async function createSchedulerRuntime(configPathArg) {
165
+ logger_1.logger.info('PixivFlow runtime starting', { component: 'pixivflow', version: version_1.BUILD.version, commit: version_1.BUILD.commit });
164
166
  // Keep TODAY/YESTERDAY placeholders intact. They are resolved afresh for
165
167
  // every plan execution, not frozen at daemon startup.
166
168
  const configPath = (0, config_1.getConfigPath)(configPathArg);