pixivflow 2.12.2 → 2.13.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 +12 -4
- 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/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 +3 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +7 -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 +169 -47
- package/dist/commands/scheduler-runtime.js.map +1 -1
- package/dist/config/types.d.ts +10 -1
- package/dist/config/types.d.ts.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.js +1 -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 +207 -0
- package/dist/delivery/DeliveryService.js.map +1 -0
- package/dist/delivery/HttpMultipartDelivery.d.ts +10 -1
- package/dist/delivery/HttpMultipartDelivery.d.ts.map +1 -1
- package/dist/delivery/HttpMultipartDelivery.js +40 -65
- 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 +69 -0
- package/dist/delivery/OutboxWorker.d.ts.map +1 -0
- package/dist/delivery/OutboxWorker.js +194 -0
- package/dist/delivery/OutboxWorker.js.map +1 -0
- package/dist/delivery/types.d.ts +11 -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/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 +100 -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/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 +70 -0
- package/dist/storage/repositories/OutboxRepository.d.ts.map +1 -0
- package/dist/storage/repositories/OutboxRepository.js +187 -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/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
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OutboxRepository = void 0;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const BaseRepository_1 = require("./BaseRepository");
|
|
6
|
+
/**
|
|
7
|
+
* SQLite transactional outbox. One durable row per intended external side
|
|
8
|
+
* effect (a content delivery or a notification). A single OutboxWorker claims
|
|
9
|
+
* due rows with a short lease, performs the effect, and marks them done. Rows
|
|
10
|
+
* survive process kill / machine stop; a restart simply resumes due rows.
|
|
11
|
+
*/
|
|
12
|
+
class OutboxRepository extends BaseRepository_1.BaseRepository {
|
|
13
|
+
static owner() {
|
|
14
|
+
return `${process.pid}-${(0, node_crypto_1.randomUUID)().slice(0, 8)}`;
|
|
15
|
+
}
|
|
16
|
+
/** Insert an intent. Returns the row. Idempotent on (kind, idempotency_key). */
|
|
17
|
+
enqueue(input, now = Date.now()) {
|
|
18
|
+
const id = (0, node_crypto_1.randomUUID)();
|
|
19
|
+
const payloadJson = JSON.stringify(input.payload ?? {});
|
|
20
|
+
this.db
|
|
21
|
+
.prepare(`INSERT INTO outbox
|
|
22
|
+
(id, kind, idempotency_key, delivery_id, delivery_target, payload_json,
|
|
23
|
+
status, attempts, max_attempts, next_attempt_at, created_at, updated_at)
|
|
24
|
+
VALUES
|
|
25
|
+
(@id, @kind, @idempotencyKey, @deliveryId, @deliveryTarget, @payloadJson,
|
|
26
|
+
'pending', 0, @maxAttempts, @dueAt, @now, @now)
|
|
27
|
+
ON CONFLICT(kind, idempotency_key) WHERE idempotency_key IS NOT NULL
|
|
28
|
+
DO UPDATE SET updated_at = @now`)
|
|
29
|
+
.run({
|
|
30
|
+
id,
|
|
31
|
+
kind: input.kind,
|
|
32
|
+
idempotencyKey: input.idempotencyKey ?? null,
|
|
33
|
+
deliveryId: input.deliveryId ?? null,
|
|
34
|
+
deliveryTarget: input.deliveryTarget,
|
|
35
|
+
payloadJson,
|
|
36
|
+
maxAttempts: input.maxAttempts ?? 12,
|
|
37
|
+
dueAt: input.dueAt ?? now,
|
|
38
|
+
now,
|
|
39
|
+
});
|
|
40
|
+
// On conflict the existing row is authoritative; fetch by the natural key.
|
|
41
|
+
if (input.idempotencyKey) {
|
|
42
|
+
return this.getByKey(input.kind, input.idempotencyKey);
|
|
43
|
+
}
|
|
44
|
+
return this.get(id);
|
|
45
|
+
}
|
|
46
|
+
get(id) {
|
|
47
|
+
const row = this.db.prepare(`SELECT * FROM outbox WHERE id = ?`).get(id);
|
|
48
|
+
return row ? this.toRow(row) : null;
|
|
49
|
+
}
|
|
50
|
+
getByKey(kind, key) {
|
|
51
|
+
const row = this.db
|
|
52
|
+
.prepare(`SELECT * FROM outbox WHERE kind = ? AND idempotency_key = ?`)
|
|
53
|
+
.get(kind, key);
|
|
54
|
+
return row ? this.toRow(row) : null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Claim up to `limit` due rows for `owner`. Due = pending/retry_wait whose
|
|
58
|
+
* next_attempt_at has passed, OR processing rows whose lease expired (a
|
|
59
|
+
* crashed prior worker). The claim is a compare-and-set inside one
|
|
60
|
+
* statement, so two workers/processes never grab the same row.
|
|
61
|
+
*/
|
|
62
|
+
claimDue(owner, leaseMs, limit, now = Date.now()) {
|
|
63
|
+
const ids = this.db
|
|
64
|
+
.prepare(`SELECT id FROM outbox
|
|
65
|
+
WHERE status IN ('pending','retry_wait') AND next_attempt_at <= @now
|
|
66
|
+
OR (status = 'processing' AND lease_until IS NOT NULL AND lease_until <= @now)
|
|
67
|
+
ORDER BY next_attempt_at ASC
|
|
68
|
+
LIMIT @limit`)
|
|
69
|
+
.all({ now, limit }).map((r) => r.id);
|
|
70
|
+
if (ids.length === 0)
|
|
71
|
+
return [];
|
|
72
|
+
const claim = this.db.prepare(`UPDATE outbox
|
|
73
|
+
SET status = 'processing', lease_owner = @owner, lease_until = @until, updated_at = @now
|
|
74
|
+
WHERE id = @id
|
|
75
|
+
AND (status IN ('pending','retry_wait') AND next_attempt_at <= @now
|
|
76
|
+
OR (status = 'processing' AND lease_until IS NOT NULL AND lease_until <= @now))`);
|
|
77
|
+
const out = [];
|
|
78
|
+
const tx = this.db.transaction((rows) => {
|
|
79
|
+
for (const id of rows) {
|
|
80
|
+
const info = claim.run({ id, owner, until: now + leaseMs, now });
|
|
81
|
+
if (info.changes > 0) {
|
|
82
|
+
const row = this.get(id);
|
|
83
|
+
if (row)
|
|
84
|
+
out.push(row);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
tx(ids);
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
markDone(id, now = Date.now()) {
|
|
92
|
+
this.db
|
|
93
|
+
.prepare(`UPDATE outbox
|
|
94
|
+
SET status='done', lease_owner=NULL, lease_until=NULL, last_error=NULL,
|
|
95
|
+
completed_at=@now, updated_at=@now
|
|
96
|
+
WHERE id=@id`)
|
|
97
|
+
.run({ id, now });
|
|
98
|
+
}
|
|
99
|
+
/** Schedule a later retry, or flip to dead once attempts are exhausted. */
|
|
100
|
+
markRetry(id, nextAt, error, now = Date.now()) {
|
|
101
|
+
const row = this.get(id);
|
|
102
|
+
if (!row)
|
|
103
|
+
return 'dead';
|
|
104
|
+
const attempts = row.attempts + 1;
|
|
105
|
+
const dead = attempts >= row.maxAttempts;
|
|
106
|
+
this.db
|
|
107
|
+
.prepare(`UPDATE outbox
|
|
108
|
+
SET attempts=@attempts,
|
|
109
|
+
status=@status,
|
|
110
|
+
next_attempt_at=@nextAt,
|
|
111
|
+
lease_owner=NULL, lease_until=NULL,
|
|
112
|
+
last_error=@error, updated_at=@now
|
|
113
|
+
WHERE id=@id`)
|
|
114
|
+
.run({
|
|
115
|
+
id,
|
|
116
|
+
attempts,
|
|
117
|
+
status: dead ? 'dead' : 'retry_wait',
|
|
118
|
+
nextAt: dead ? row.nextAttemptAt : nextAt,
|
|
119
|
+
error: error.slice(0, 1000),
|
|
120
|
+
now,
|
|
121
|
+
});
|
|
122
|
+
return dead ? 'dead' : 'retry_wait';
|
|
123
|
+
}
|
|
124
|
+
/** Release a processing row back to pending without counting a retry. */
|
|
125
|
+
release(id, now = Date.now()) {
|
|
126
|
+
this.db
|
|
127
|
+
.prepare(`UPDATE outbox SET status='pending', lease_owner=NULL, lease_until=NULL,
|
|
128
|
+
next_attempt_at=@now, updated_at=@now WHERE id=@id AND status='processing'`)
|
|
129
|
+
.run({ id, now });
|
|
130
|
+
}
|
|
131
|
+
/** Reopen a dead row for one more attempt (operator / reconcile action). */
|
|
132
|
+
requeue(id, dueAt = Date.now()) {
|
|
133
|
+
this.db
|
|
134
|
+
.prepare(`UPDATE outbox SET status='retry_wait', next_attempt_at=@dueAt, attempts=0,
|
|
135
|
+
last_error=NULL, lease_owner=NULL, lease_until=NULL,
|
|
136
|
+
completed_at=NULL, updated_at=@dueAt WHERE id=@id`)
|
|
137
|
+
.run({ id, dueAt });
|
|
138
|
+
}
|
|
139
|
+
counts(now = Date.now()) {
|
|
140
|
+
const one = (sql, ...params) => this.db.prepare(sql).get(...params).n;
|
|
141
|
+
const pending = one(`SELECT COUNT(*) n FROM outbox WHERE status IN ('pending','retry_wait')`);
|
|
142
|
+
const retryWait = one(`SELECT COUNT(*) n FROM outbox WHERE status='retry_wait'`);
|
|
143
|
+
const processing = one(`SELECT COUNT(*) n FROM outbox WHERE status='processing'`);
|
|
144
|
+
const dead = one(`SELECT COUNT(*) n FROM outbox WHERE status='dead'`);
|
|
145
|
+
const done24h = one(`SELECT COUNT(*) n FROM outbox WHERE status='done' AND completed_at >= ?`, now - 86_400_000);
|
|
146
|
+
const oldest = this.db
|
|
147
|
+
.prepare(`SELECT MIN(next_attempt_at) t FROM outbox WHERE status IN ('pending','retry_wait')`)
|
|
148
|
+
.get();
|
|
149
|
+
return {
|
|
150
|
+
pending,
|
|
151
|
+
retryWait,
|
|
152
|
+
processing,
|
|
153
|
+
dead,
|
|
154
|
+
done24h,
|
|
155
|
+
oldestPendingMs: oldest.t == null ? null : Math.max(0, now - oldest.t),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/** Rows still non-terminal (used by reconcile/doctor). */
|
|
159
|
+
staleProcessing(now = Date.now()) {
|
|
160
|
+
const rows = this.db
|
|
161
|
+
.prepare(`SELECT * FROM outbox WHERE status='processing' AND lease_until IS NOT NULL AND lease_until <= ?`)
|
|
162
|
+
.all(now);
|
|
163
|
+
return rows.map((r) => this.toRow(r));
|
|
164
|
+
}
|
|
165
|
+
toRow(row) {
|
|
166
|
+
return {
|
|
167
|
+
id: row.id,
|
|
168
|
+
kind: row.kind,
|
|
169
|
+
idempotencyKey: row.idempotency_key,
|
|
170
|
+
deliveryId: row.delivery_id,
|
|
171
|
+
deliveryTarget: row.delivery_target,
|
|
172
|
+
payloadJson: row.payload_json,
|
|
173
|
+
status: row.status,
|
|
174
|
+
attempts: row.attempts,
|
|
175
|
+
maxAttempts: row.max_attempts,
|
|
176
|
+
nextAttemptAt: row.next_attempt_at,
|
|
177
|
+
leaseOwner: row.lease_owner,
|
|
178
|
+
leaseUntil: row.lease_until,
|
|
179
|
+
lastError: row.last_error,
|
|
180
|
+
createdAt: row.created_at,
|
|
181
|
+
updatedAt: row.updated_at,
|
|
182
|
+
completedAt: row.completed_at,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
exports.OutboxRepository = OutboxRepository;
|
|
187
|
+
//# sourceMappingURL=OutboxRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutboxRepository.js","sourceRoot":"","sources":["../../../src/storage/repositories/OutboxRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BaseRepository } from './BaseRepository';
|
|
2
2
|
export type SlotStatus = 'pending' | 'running' | 'success' | 'partial' | 'failed' | 'expired';
|
|
3
|
-
export type CellStatus = 'pending' | 'selected' | 'submitted' | 'no_candidate' | 'failed';
|
|
3
|
+
export type CellStatus = 'pending' | 'selected' | 'artifact_ready' | 'delivery_pending' | 'submitted' | 'no_candidate' | 'duplicate' | 'failed';
|
|
4
4
|
export interface SlotRecord {
|
|
5
5
|
id: string;
|
|
6
6
|
/** Schedule this occurrence belongs to (id is already schedule-scoped). */
|
|
@@ -22,6 +22,9 @@ export interface SlotRecord {
|
|
|
22
22
|
startedAt: string | null;
|
|
23
23
|
completedAt: string | null;
|
|
24
24
|
lastError: string | null;
|
|
25
|
+
leaseOwner: string | null;
|
|
26
|
+
leaseUntil: number | null;
|
|
27
|
+
heartbeatAt: number | null;
|
|
25
28
|
}
|
|
26
29
|
export interface SlotItemRecord {
|
|
27
30
|
id: number;
|
|
@@ -92,6 +95,28 @@ export declare class SlotRepository extends BaseRepository {
|
|
|
92
95
|
/** Explicit operator action: forget the locked work so a re-run picks another candidate. */
|
|
93
96
|
clearCellWork(slotId: string, targetId: string): void;
|
|
94
97
|
setCellStatus(slotId: string, targetId: string, status: CellStatus, error?: string): void;
|
|
98
|
+
/**
|
|
99
|
+
* Transition a cell with FSM validation. Never downgrades a confirmed cell;
|
|
100
|
+
* an illegal transition throws rather than silently corrupting state.
|
|
101
|
+
*/
|
|
102
|
+
transitionCell(slotId: string, targetId: string, next: CellStatus, error?: string): SlotItemRecord;
|
|
103
|
+
/**
|
|
104
|
+
* Claim execution ownership of a slot for `owner` until `leaseUntil`
|
|
105
|
+
* (epoch ms). Returns true when this caller now owns the lease. A second
|
|
106
|
+
* process/trigger sees an active lease and must converge (resume/observe),
|
|
107
|
+
* not start a parallel run. An expired lease is reclaimable.
|
|
108
|
+
*/
|
|
109
|
+
claimSlotLease(slotId: string, owner: string, leaseUntil: number, now?: number): boolean;
|
|
110
|
+
heartbeatSlotLease(slotId: string, owner: string, leaseUntil: number, now?: number): void;
|
|
111
|
+
releaseSlotLease(slotId: string, owner: string): void;
|
|
112
|
+
getSlotLease(slotId: string): {
|
|
113
|
+
owner: string | null;
|
|
114
|
+
until: number | null;
|
|
115
|
+
};
|
|
116
|
+
/** Slots whose lease expired while still non-terminal (crashed workers). */
|
|
117
|
+
slotsWithStaleLease(now?: number): string[];
|
|
118
|
+
/** Record an error without changing terminality (retryable failure keeps the cell resumable). */
|
|
119
|
+
setCellError(slotId: string, targetId: string, error: string): void;
|
|
95
120
|
/** Work ids already locked in THIS slot (to stop two cells taking the same work). */
|
|
96
121
|
getLockedWorkIds(slotId: string): Set<string>;
|
|
97
122
|
/** Roll up a slot's status from its cells. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SlotRepository.d.ts","sourceRoot":"","sources":["../../../src/storage/repositories/SlotRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC9F,MAAM,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"SlotRepository.d.ts","sourceRoot":"","sources":["../../../src/storage/repositories/SlotRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -147,7 +147,10 @@ class SlotRepository extends BaseRepository_1.BaseRepository {
|
|
|
147
147
|
.run({ slotId, targetId });
|
|
148
148
|
}
|
|
149
149
|
setCellStatus(slotId, targetId, status, error) {
|
|
150
|
-
const terminal = status === 'submitted' ||
|
|
150
|
+
const terminal = status === 'submitted' ||
|
|
151
|
+
status === 'no_candidate' ||
|
|
152
|
+
status === 'duplicate' ||
|
|
153
|
+
status === 'failed';
|
|
151
154
|
const sets = ['status = @status', 'last_error = @error', 'updated_at = CURRENT_TIMESTAMP'];
|
|
152
155
|
if (terminal)
|
|
153
156
|
sets.push('completed_at = CURRENT_TIMESTAMP');
|
|
@@ -155,6 +158,73 @@ class SlotRepository extends BaseRepository_1.BaseRepository {
|
|
|
155
158
|
.prepare(`UPDATE schedule_slot_items SET ${sets.join(', ')} WHERE slot_id = @slotId AND target_id = @targetId`)
|
|
156
159
|
.run({ slotId, targetId, status, error: error ?? null });
|
|
157
160
|
}
|
|
161
|
+
/**
|
|
162
|
+
* Transition a cell with FSM validation. Never downgrades a confirmed cell;
|
|
163
|
+
* an illegal transition throws rather than silently corrupting state.
|
|
164
|
+
*/
|
|
165
|
+
transitionCell(slotId, targetId, next, error) {
|
|
166
|
+
const cell = this.getCell(slotId, targetId);
|
|
167
|
+
if (!cell)
|
|
168
|
+
throw new Error(`cell not found: ${slotId}/${targetId}`);
|
|
169
|
+
if (cell.status === next)
|
|
170
|
+
return cell;
|
|
171
|
+
// Imported lazily to keep the repository free of a circular module graph.
|
|
172
|
+
// The FSM table is the single authority for legal moves.
|
|
173
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
174
|
+
const { assertTransition } = require('../../scheduler/SlotStateMachine');
|
|
175
|
+
assertTransition(cell.status, next);
|
|
176
|
+
this.setCellStatus(slotId, targetId, next, error);
|
|
177
|
+
return this.getCell(slotId, targetId);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Claim execution ownership of a slot for `owner` until `leaseUntil`
|
|
181
|
+
* (epoch ms). Returns true when this caller now owns the lease. A second
|
|
182
|
+
* process/trigger sees an active lease and must converge (resume/observe),
|
|
183
|
+
* not start a parallel run. An expired lease is reclaimable.
|
|
184
|
+
*/
|
|
185
|
+
claimSlotLease(slotId, owner, leaseUntil, now = Date.now()) {
|
|
186
|
+
const info = this.db
|
|
187
|
+
.prepare(`UPDATE schedule_slots
|
|
188
|
+
SET lease_owner = @owner, lease_until = @leaseUntil, heartbeat_at = @now
|
|
189
|
+
WHERE id = @id
|
|
190
|
+
AND (lease_until IS NULL OR lease_until <= @now OR lease_owner = @owner)`)
|
|
191
|
+
.run({ id: slotId, owner, leaseUntil, now });
|
|
192
|
+
return info.changes > 0;
|
|
193
|
+
}
|
|
194
|
+
heartbeatSlotLease(slotId, owner, leaseUntil, now = Date.now()) {
|
|
195
|
+
this.db
|
|
196
|
+
.prepare(`UPDATE schedule_slots SET lease_until = @leaseUntil, heartbeat_at = @now
|
|
197
|
+
WHERE id = @id AND lease_owner = @owner`)
|
|
198
|
+
.run({ id: slotId, owner, leaseUntil, now });
|
|
199
|
+
}
|
|
200
|
+
releaseSlotLease(slotId, owner) {
|
|
201
|
+
this.db
|
|
202
|
+
.prepare(`UPDATE schedule_slots SET lease_owner = NULL, lease_until = NULL
|
|
203
|
+
WHERE id = @id AND lease_owner = @owner`)
|
|
204
|
+
.run({ id: slotId, owner });
|
|
205
|
+
}
|
|
206
|
+
getSlotLease(slotId) {
|
|
207
|
+
const row = this.db
|
|
208
|
+
.prepare(`SELECT lease_owner, lease_until FROM schedule_slots WHERE id = ?`)
|
|
209
|
+
.get(slotId);
|
|
210
|
+
return { owner: row?.lease_owner ?? null, until: row?.lease_until ?? null };
|
|
211
|
+
}
|
|
212
|
+
/** Slots whose lease expired while still non-terminal (crashed workers). */
|
|
213
|
+
slotsWithStaleLease(now = Date.now()) {
|
|
214
|
+
const rows = this.db
|
|
215
|
+
.prepare(`SELECT id FROM schedule_slots
|
|
216
|
+
WHERE lease_until IS NOT NULL AND lease_until < @now
|
|
217
|
+
AND status IN ('pending','running')`)
|
|
218
|
+
.all({ now });
|
|
219
|
+
return rows.map((r) => r.id);
|
|
220
|
+
}
|
|
221
|
+
/** Record an error without changing terminality (retryable failure keeps the cell resumable). */
|
|
222
|
+
setCellError(slotId, targetId, error) {
|
|
223
|
+
this.db
|
|
224
|
+
.prepare(`UPDATE schedule_slot_items SET last_error = @error, updated_at = CURRENT_TIMESTAMP
|
|
225
|
+
WHERE slot_id = @slotId AND target_id = @targetId`)
|
|
226
|
+
.run({ slotId, targetId, error: error.slice(0, 1000) });
|
|
227
|
+
}
|
|
158
228
|
/** Work ids already locked in THIS slot (to stop two cells taking the same work). */
|
|
159
229
|
getLockedWorkIds(slotId) {
|
|
160
230
|
const rows = this.db
|
|
@@ -167,7 +237,8 @@ class SlotRepository extends BaseRepository_1.BaseRepository {
|
|
|
167
237
|
const cells = this.getCells(slotId);
|
|
168
238
|
if (cells.length === 0)
|
|
169
239
|
return 'pending';
|
|
170
|
-
const
|
|
240
|
+
const isTerminal = (s) => s === 'submitted' || s === 'no_candidate' || s === 'duplicate' || s === 'failed';
|
|
241
|
+
const terminal = cells.filter((c) => isTerminal(c.status));
|
|
171
242
|
if (terminal.length < cells.length)
|
|
172
243
|
return 'running';
|
|
173
244
|
if (cells.every((c) => c.status === 'submitted'))
|
|
@@ -202,6 +273,9 @@ class SlotRepository extends BaseRepository_1.BaseRepository {
|
|
|
202
273
|
startedAt: row.started_at,
|
|
203
274
|
completedAt: row.completed_at,
|
|
204
275
|
lastError: row.last_error,
|
|
276
|
+
leaseOwner: row.lease_owner ?? null,
|
|
277
|
+
leaseUntil: row.lease_until ?? null,
|
|
278
|
+
heartbeatAt: row.heartbeat_at ?? null,
|
|
205
279
|
};
|
|
206
280
|
}
|
|
207
281
|
toItem(row) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SlotRepository.js","sourceRoot":"","sources":["../../../src/storage/repositories/SlotRepository.ts"],"names":[],"mappings":";;;AAAA,qDAAkD;
|
|
1
|
+
{"version":3,"file":"SlotRepository.js","sourceRoot":"","sources":["../../../src/storage/repositories/SlotRepository.ts"],"names":[],"mappings":"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"}
|
package/dist/webui/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { TargetConfig } from '../config';
|
|
2
|
-
import { DeliveryDispatcher } from './DeliveryDispatcher';
|
|
3
|
-
import { DownloadedArtifact } from './types';
|
|
4
|
-
/** Resolve the ranking/list day (JST, YYYY-MM-DD) for a target. */
|
|
5
|
-
export declare function resolveRankingDate(target: TargetConfig): string;
|
|
6
|
-
export interface PendingRetryResult {
|
|
7
|
-
succeeded: number;
|
|
8
|
-
failed: number;
|
|
9
|
-
deferred: number;
|
|
10
|
-
}
|
|
11
|
-
export interface DeliveryOutboxOptions {
|
|
12
|
-
retryBaseDelayMs?: number;
|
|
13
|
-
retryMaxDelayMs?: number;
|
|
14
|
-
now?: () => number;
|
|
15
|
-
/**
|
|
16
|
-
* Called once a work's delivery has succeeded OR been durably queued for
|
|
17
|
-
* retry. Used by the Slot ledger to lock the selected work id for a cell.
|
|
18
|
-
* Fires for both fresh deliveries and outbox replays, always with the SAME
|
|
19
|
-
* artifact (the manifest freezes it), so it never reports a different work.
|
|
20
|
-
*/
|
|
21
|
-
onDeliver?: (artifact: DownloadedArtifact, target: TargetConfig) => void;
|
|
22
|
-
}
|
|
23
|
-
/** Durable, provider-independent delivery outbox for cache-mode downloads. */
|
|
24
|
-
export declare class DeliveryOutbox {
|
|
25
|
-
private readonly directory;
|
|
26
|
-
private readonly dispatcher;
|
|
27
|
-
private readonly deleteAfterDelivery;
|
|
28
|
-
private readonly options;
|
|
29
|
-
constructor(directory: string, dispatcher: DeliveryDispatcher, deleteAfterDelivery?: boolean, options?: DeliveryOutboxOptions);
|
|
30
|
-
deliver(artifact: DownloadedArtifact, target: TargetConfig): Promise<void>;
|
|
31
|
-
notifyNoMatch(target: TargetConfig, text: string, idempotencyKey: string): Promise<void>;
|
|
32
|
-
retryPending(): Promise<PendingRetryResult>;
|
|
33
|
-
private processManifest;
|
|
34
|
-
private assertFilesExist;
|
|
35
|
-
private deleteFiles;
|
|
36
|
-
private readManifest;
|
|
37
|
-
private now;
|
|
38
|
-
private shouldDefer;
|
|
39
|
-
private retryDelayMs;
|
|
40
|
-
private writeNewManifest;
|
|
41
|
-
private writeManifest;
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=DeliveryOutbox.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DeliveryOutbox.d.ts","sourceRoot":"","sources":["../../src/delivery/DeliveryOutbox.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAmC,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAI9E,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAK/D;AAgCD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;CAC1E;AAED,8EAA8E;AAC9E,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAHP,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,kBAAkB,EAC9B,mBAAmB,UAAO,EAC1B,OAAO,GAAE,qBAA0B;IAGhD,OAAO,CAAC,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAqF1E,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCxF,YAAY,IAAI,OAAO,CAAC,kBAAkB,CAAC;YAmCnC,eAAe;YA0Df,gBAAgB;YAUhB,WAAW;YAQX,YAAY;IAY1B,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,YAAY;YAMN,gBAAgB;YAIhB,aAAa;CAU5B"}
|