@on-par/factory-core 0.9.26 → 0.9.27-next.2
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/dist/config/index.d.ts +0 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -3
- package/dist/config/index.js.map +1 -1
- package/dist/config/run-section.d.ts +1 -1
- package/dist/config/run-section.js +1 -1
- package/dist/index.d.ts +6 -29
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -17
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
- package/dist/config/v2-models.d.ts +0 -75
- package/dist/config/v2-models.d.ts.map +0 -1
- package/dist/config/v2-models.js +0 -119
- package/dist/config/v2-models.js.map +0 -1
- package/dist/config/v2.d.ts +0 -252
- package/dist/config/v2.d.ts.map +0 -1
- package/dist/config/v2.js +0 -369
- package/dist/config/v2.js.map +0 -1
- package/dist/hosted/control-plane.d.ts +0 -40
- package/dist/hosted/control-plane.d.ts.map +0 -1
- package/dist/hosted/control-plane.js +0 -198
- package/dist/hosted/control-plane.js.map +0 -1
- package/dist/hosted/queue-client.d.ts +0 -51
- package/dist/hosted/queue-client.d.ts.map +0 -1
- package/dist/hosted/queue-client.js +0 -92
- package/dist/hosted/queue-client.js.map +0 -1
- package/dist/hosted/runner-client.d.ts +0 -78
- package/dist/hosted/runner-client.d.ts.map +0 -1
- package/dist/hosted/runner-client.js +0 -82
- package/dist/hosted/runner-client.js.map +0 -1
- package/dist/hosted/runner.d.ts +0 -74
- package/dist/hosted/runner.d.ts.map +0 -1
- package/dist/hosted/runner.js +0 -174
- package/dist/hosted/runner.js.map +0 -1
- package/dist/hosted/smoke.d.ts +0 -46
- package/dist/hosted/smoke.d.ts.map +0 -1
- package/dist/hosted/smoke.js +0 -56
- package/dist/hosted/smoke.js.map +0 -1
- package/dist/hosted/store-resolve.d.ts +0 -16
- package/dist/hosted/store-resolve.d.ts.map +0 -1
- package/dist/hosted/store-resolve.js +0 -13
- package/dist/hosted/store-resolve.js.map +0 -1
- package/dist/hosted/store-sqlite.d.ts +0 -10
- package/dist/hosted/store-sqlite.d.ts.map +0 -1
- package/dist/hosted/store-sqlite.js +0 -67
- package/dist/hosted/store-sqlite.js.map +0 -1
- package/dist/hosted/summary.d.ts +0 -26
- package/dist/hosted/summary.d.ts.map +0 -1
- package/dist/hosted/summary.js +0 -27
- package/dist/hosted/summary.js.map +0 -1
- package/dist/hosted/watchdog.d.ts +0 -38
- package/dist/hosted/watchdog.d.ts.map +0 -1
- package/dist/hosted/watchdog.js +0 -56
- package/dist/hosted/watchdog.js.map +0 -1
- package/dist/phases/board-queue-dispatch.d.ts +0 -21
- package/dist/phases/board-queue-dispatch.d.ts.map +0 -1
- package/dist/phases/board-queue-dispatch.js +0 -57
- package/dist/phases/board-queue-dispatch.js.map +0 -1
- package/dist/phases/board-queue-scheduler.d.ts +0 -19
- package/dist/phases/board-queue-scheduler.d.ts.map +0 -1
- package/dist/phases/board-queue-scheduler.js +0 -56
- package/dist/phases/board-queue-scheduler.js.map +0 -1
- package/dist/projects/project-queue-poller.d.ts +0 -25
- package/dist/projects/project-queue-poller.d.ts.map +0 -1
- package/dist/projects/project-queue-poller.js +0 -92
- package/dist/projects/project-queue-poller.js.map +0 -1
- package/dist/projects/project-queue-reader.d.ts +0 -40
- package/dist/projects/project-queue-reader.d.ts.map +0 -1
- package/dist/projects/project-queue-reader.js +0 -185
- package/dist/projects/project-queue-reader.js.map +0 -1
- package/dist/projects/project-status-writer.d.ts +0 -12
- package/dist/projects/project-status-writer.d.ts.map +0 -1
- package/dist/projects/project-status-writer.js +0 -42
- package/dist/projects/project-status-writer.js.map +0 -1
- package/dist/queue/project-board-poller.d.ts +0 -15
- package/dist/queue/project-board-poller.d.ts.map +0 -1
- package/dist/queue/project-board-poller.js +0 -3
- package/dist/queue/project-board-poller.js.map +0 -1
- package/dist/queue/project-board-status-writer.d.ts +0 -42
- package/dist/queue/project-board-status-writer.d.ts.map +0 -1
- package/dist/queue/project-board-status-writer.js +0 -83
- package/dist/queue/project-board-status-writer.js.map +0 -1
- package/dist/queue/reprioritization-audit.d.ts +0 -19
- package/dist/queue/reprioritization-audit.d.ts.map +0 -1
- package/dist/queue/reprioritization-audit.js +0 -77
- package/dist/queue/reprioritization-audit.js.map +0 -1
package/dist/hosted/watchdog.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
function leasedAtMs(job) {
|
|
2
|
-
const lastLeased = [...job.events].reverse().find((event) => event.type === 'leased');
|
|
3
|
-
return lastLeased ? Date.parse(lastLeased.ts) : Date.parse(job.updatedAt);
|
|
4
|
-
}
|
|
5
|
-
function leaseCount(job) {
|
|
6
|
-
return job.events.filter((event) => event.type === 'leased').length;
|
|
7
|
-
}
|
|
8
|
-
/** Runs one reliability sweep over every non-terminal job in the store,
|
|
9
|
-
* classifying each into reclaimed-expired / relaunched-dead-runner /
|
|
10
|
-
* timed-out / escalation. */
|
|
11
|
-
export function runWatchdogSweep(store, policy) {
|
|
12
|
-
const reclaimedExpired = store.reclaimExpired().map((job) => job.request.jobId);
|
|
13
|
-
const relaunchedDeadRunners = [];
|
|
14
|
-
const timedOut = [];
|
|
15
|
-
const escalations = [];
|
|
16
|
-
const recentEventLimit = policy.recentEventLimit ?? 5;
|
|
17
|
-
for (const job of store.list()) {
|
|
18
|
-
if (job.lease === null) {
|
|
19
|
-
continue;
|
|
20
|
-
}
|
|
21
|
-
const runtimeMs = policy.now() - leasedAtMs(job);
|
|
22
|
-
const runner = store.getRunner(job.lease.runnerId);
|
|
23
|
-
const runnerDead = !runner || policy.now() - Date.parse(runner.lastHeartbeatAt) > policy.runnerHeartbeatTimeoutMs;
|
|
24
|
-
if (runtimeMs > policy.maxJobRuntimeMs) {
|
|
25
|
-
store.fail(job.request.jobId, job.lease.leaseId, `watchdog: exceeded max runtime ${policy.maxJobRuntimeMs}ms`, {
|
|
26
|
-
failurePhase: 'run',
|
|
27
|
-
});
|
|
28
|
-
timedOut.push(job.request.jobId);
|
|
29
|
-
continue;
|
|
30
|
-
}
|
|
31
|
-
if (runnerDead) {
|
|
32
|
-
const count = leaseCount(job);
|
|
33
|
-
if (count < policy.maxRelaunches) {
|
|
34
|
-
store.reclaimJob(job.request.jobId, 'runner heartbeat stale');
|
|
35
|
-
relaunchedDeadRunners.push(job.request.jobId);
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
escalations.push({
|
|
39
|
-
jobId: job.request.jobId,
|
|
40
|
-
status: job.request.status,
|
|
41
|
-
reason: 'dead runner and relaunch budget exhausted',
|
|
42
|
-
recentEvents: job.events.slice(-recentEventLimit),
|
|
43
|
-
manualIntervention: `inspect .factory events for ${job.request.jobId}; cancel or manually re-lease`,
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return {
|
|
49
|
-
sweptAt: new Date(policy.now()).toISOString(),
|
|
50
|
-
reclaimedExpired,
|
|
51
|
-
relaunchedDeadRunners,
|
|
52
|
-
timedOut,
|
|
53
|
-
escalations,
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=watchdog.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"watchdog.js","sourceRoot":"","sources":["../../src/hosted/watchdog.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { QueueIntentSnapshot } from '../queue/project-board-poller.js';
|
|
2
|
-
/** The minimal locally-authoritative record that may be dispatched to a lane. */
|
|
3
|
-
export interface LocalLaneCandidate {
|
|
4
|
-
readonly issueNumber: number;
|
|
5
|
-
}
|
|
6
|
-
/** Supplies the latest successfully normalized board queue intent. */
|
|
7
|
-
export interface QueueIntentReader {
|
|
8
|
-
snapshot(): QueueIntentSnapshot | null;
|
|
9
|
-
}
|
|
10
|
-
/** Explicitly selects how eligible local candidates are ranked. */
|
|
11
|
-
export type BoardQueueOrdering = {
|
|
12
|
-
readonly kind: 'board';
|
|
13
|
-
} | {
|
|
14
|
-
readonly kind: 'priority';
|
|
15
|
-
readonly priorityValues: readonly (string | number)[];
|
|
16
|
-
};
|
|
17
|
-
export interface BoardQueueDispatcher {
|
|
18
|
-
next(lane: string, candidates: readonly LocalLaneCandidate[]): LocalLaneCandidate | null;
|
|
19
|
-
}
|
|
20
|
-
export declare function createBoardQueueDispatcher(intent: QueueIntentReader, ordering: BoardQueueOrdering): BoardQueueDispatcher;
|
|
21
|
-
//# sourceMappingURL=board-queue-dispatch.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"board-queue-dispatch.d.ts","sourceRoot":"","sources":["../../src/phases/board-queue-dispatch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,iFAAiF;AACjF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,sEAAsE;AACtE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,IAAI,mBAAmB,GAAG,IAAI,CAAC;CACxC;AAED,mEAAmE;AACnE,MAAM,MAAM,kBAAkB,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,CAAC;AAEpH,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,kBAAkB,EAAE,GAAG,kBAAkB,GAAG,IAAI,CAAC;CAC1F;AA0BD,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,kBAAkB,GAC3B,oBAAoB,CAyBtB"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
// packages/core/src/phases/board-queue-dispatch.ts — Apply read-only board intent to local lane candidates (#848).
|
|
2
|
-
function rankedIntentMembership(snapshot, lane) {
|
|
3
|
-
const membership = new Map();
|
|
4
|
-
snapshot.items.forEach((item, boardOrder) => {
|
|
5
|
-
if (item.issueNumber === null || item.status !== 'queued' || item.lane !== lane)
|
|
6
|
-
return;
|
|
7
|
-
if (!membership.has(item.issueNumber))
|
|
8
|
-
membership.set(item.issueNumber, { boardOrder, priority: item.priority });
|
|
9
|
-
});
|
|
10
|
-
return membership;
|
|
11
|
-
}
|
|
12
|
-
function priorityRanks(priorityValues) {
|
|
13
|
-
const ranks = new Map();
|
|
14
|
-
priorityValues.forEach((priority, rank) => {
|
|
15
|
-
if (!ranks.has(priority))
|
|
16
|
-
ranks.set(priority, rank);
|
|
17
|
-
});
|
|
18
|
-
return ranks;
|
|
19
|
-
}
|
|
20
|
-
export function createBoardQueueDispatcher(intent, ordering) {
|
|
21
|
-
const configuredPriorityRanks = ordering.kind === 'priority' ? priorityRanks(ordering.priorityValues) : undefined;
|
|
22
|
-
return {
|
|
23
|
-
next(lane, candidates) {
|
|
24
|
-
const snapshot = intent.snapshot();
|
|
25
|
-
if (snapshot === null)
|
|
26
|
-
return null;
|
|
27
|
-
const membership = rankedIntentMembership(snapshot, lane);
|
|
28
|
-
let selected = null;
|
|
29
|
-
let selectedIntent;
|
|
30
|
-
for (const candidate of candidates) {
|
|
31
|
-
const candidateIntent = membership.get(candidate.issueNumber);
|
|
32
|
-
if (candidateIntent === undefined)
|
|
33
|
-
continue;
|
|
34
|
-
if (selectedIntent === undefined || ranksBefore(candidateIntent, selectedIntent, configuredPriorityRanks)) {
|
|
35
|
-
selected = candidate;
|
|
36
|
-
selectedIntent = candidateIntent;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return selected;
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
function ranksBefore(candidate, selected, configuredPriorityRanks) {
|
|
44
|
-
if (configuredPriorityRanks !== undefined) {
|
|
45
|
-
const candidatePriorityRank = candidate.priority === null ? undefined : configuredPriorityRanks.get(candidate.priority);
|
|
46
|
-
const selectedPriorityRank = selected.priority === null ? undefined : configuredPriorityRanks.get(selected.priority);
|
|
47
|
-
const candidateConfigured = candidatePriorityRank !== undefined;
|
|
48
|
-
const selectedConfigured = selectedPriorityRank !== undefined;
|
|
49
|
-
if (candidateConfigured !== selectedConfigured)
|
|
50
|
-
return candidateConfigured;
|
|
51
|
-
if (candidateConfigured && selectedConfigured && candidatePriorityRank !== selectedPriorityRank) {
|
|
52
|
-
return candidatePriorityRank < selectedPriorityRank;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return candidate.boardOrder < selected.boardOrder;
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=board-queue-dispatch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"board-queue-dispatch.js","sourceRoot":"","sources":["../../src/phases/board-queue-dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { ProjectQueueProjection } from '../projects/project-queue-poller.js';
|
|
2
|
-
import type { ProjectQueueStatus } from '../projects/project-queue-reader.js';
|
|
3
|
-
import type { LocalLaneCandidate } from './board-queue-dispatch.js';
|
|
4
|
-
/** Supplies the latest successfully projected ProjectV2 queue intent. */
|
|
5
|
-
export interface ProjectQueueProjectionReader {
|
|
6
|
-
snapshot(): ProjectQueueProjection | null;
|
|
7
|
-
}
|
|
8
|
-
/** Daemon-owned policy and read-only board projection used for scheduling. */
|
|
9
|
-
export interface BoardQueueSchedulerOptions {
|
|
10
|
-
readonly projectionReader: ProjectQueueProjectionReader;
|
|
11
|
-
readonly dispatchableStatuses: readonly ProjectQueueStatus[];
|
|
12
|
-
}
|
|
13
|
-
/** Groups locally-authoritative candidates by their current projected lane. */
|
|
14
|
-
export interface BoardQueueScheduler {
|
|
15
|
-
snapshot(): ProjectQueueProjection | null;
|
|
16
|
-
select(candidates: readonly LocalLaneCandidate[]): ReadonlyMap<string, readonly LocalLaneCandidate[]>;
|
|
17
|
-
}
|
|
18
|
-
export declare function createBoardQueueScheduler(options: BoardQueueSchedulerOptions): BoardQueueScheduler;
|
|
19
|
-
//# sourceMappingURL=board-queue-scheduler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"board-queue-scheduler.d.ts","sourceRoot":"","sources":["../../src/phases/board-queue-scheduler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,yEAAyE;AACzE,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,IAAI,sBAAsB,GAAG,IAAI,CAAC;CAC3C;AAED,8EAA8E;AAC9E,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;IACxD,QAAQ,CAAC,oBAAoB,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAC9D;AAED,+EAA+E;AAC/E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,IAAI,sBAAsB,GAAG,IAAI,CAAC;IAC1C,MAAM,CAAC,UAAU,EAAE,SAAS,kBAAkB,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,CAAC,CAAC;CACvG;AA+BD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,GAAG,mBAAmB,CAsClG"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
// packages/core/src/phases/board-queue-scheduler.ts — Schedule local candidates from ProjectV2 queue intent (#867).
|
|
2
|
-
function compareOrder(first, second) {
|
|
3
|
-
if (first === second)
|
|
4
|
-
return 0;
|
|
5
|
-
if (typeof first === 'number' && typeof second === 'number')
|
|
6
|
-
return first < second ? -1 : 1;
|
|
7
|
-
const firstValue = String(first);
|
|
8
|
-
const secondValue = String(second);
|
|
9
|
-
if (firstValue === secondValue)
|
|
10
|
-
return 0;
|
|
11
|
-
return firstValue < secondValue ? -1 : 1;
|
|
12
|
-
}
|
|
13
|
-
function projectedCandidates(projection, dispatchableStatuses) {
|
|
14
|
-
const projected = new Map();
|
|
15
|
-
projection.items.forEach((item, projectionOrder) => {
|
|
16
|
-
if (!dispatchableStatuses.has(item.status) || projected.has(item.issue.number))
|
|
17
|
-
return;
|
|
18
|
-
projected.set(item.issue.number, { lane: item.lane, order: item.order, projectionOrder });
|
|
19
|
-
});
|
|
20
|
-
return projected;
|
|
21
|
-
}
|
|
22
|
-
export function createBoardQueueScheduler(options) {
|
|
23
|
-
const dispatchableStatuses = new Set(options.dispatchableStatuses);
|
|
24
|
-
return {
|
|
25
|
-
snapshot() {
|
|
26
|
-
return options.projectionReader.snapshot();
|
|
27
|
-
},
|
|
28
|
-
select(candidates) {
|
|
29
|
-
const projection = options.projectionReader.snapshot();
|
|
30
|
-
if (projection === null)
|
|
31
|
-
return new Map();
|
|
32
|
-
const projected = projectedCandidates(projection, dispatchableStatuses);
|
|
33
|
-
const grouped = new Map();
|
|
34
|
-
for (const candidate of candidates) {
|
|
35
|
-
const candidateProjection = projected.get(candidate.issueNumber);
|
|
36
|
-
if (candidateProjection === undefined)
|
|
37
|
-
continue;
|
|
38
|
-
const lane = grouped.get(candidateProjection.lane) ?? [];
|
|
39
|
-
lane.push({ candidate, projected: candidateProjection });
|
|
40
|
-
grouped.set(candidateProjection.lane, lane);
|
|
41
|
-
}
|
|
42
|
-
return new Map([...grouped].map(([lane, laneCandidates]) => [
|
|
43
|
-
lane,
|
|
44
|
-
laneCandidates
|
|
45
|
-
.sort((first, second) => {
|
|
46
|
-
const orderComparison = compareOrder(first.projected.order, second.projected.order);
|
|
47
|
-
return orderComparison === 0
|
|
48
|
-
? first.projected.projectionOrder - second.projected.projectionOrder
|
|
49
|
-
: orderComparison;
|
|
50
|
-
})
|
|
51
|
-
.map(({ candidate }) => candidate),
|
|
52
|
-
]));
|
|
53
|
-
},
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=board-queue-scheduler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"board-queue-scheduler.js","sourceRoot":"","sources":["../../src/phases/board-queue-scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { FactoryLogger } from '../logger/index.js';
|
|
2
|
-
import type { QueueReprioritizationRecord } from '../types/index.js';
|
|
3
|
-
import type { QueueRationaleCommentClient } from '../queue/reprioritization-audit.js';
|
|
4
|
-
import type { ProjectQueueIntentItem, ProjectQueueReadDiagnostic, ProjectQueueReader } from './project-queue-reader.js';
|
|
5
|
-
export declare const DEFAULT_PROJECT_QUEUE_POLL_MS = 30000;
|
|
6
|
-
export interface ProjectQueueProjection {
|
|
7
|
-
readonly refreshedAt: string;
|
|
8
|
-
readonly items: readonly ProjectQueueIntentItem[];
|
|
9
|
-
readonly diagnostics: readonly ProjectQueueReadDiagnostic[];
|
|
10
|
-
}
|
|
11
|
-
export interface ProjectQueuePollerOptions {
|
|
12
|
-
readonly reader: ProjectQueueReader;
|
|
13
|
-
readonly logger: FactoryLogger;
|
|
14
|
-
readonly pollMs?: number;
|
|
15
|
-
readonly commentClient?: QueueRationaleCommentClient;
|
|
16
|
-
}
|
|
17
|
-
export interface ProjectQueuePoller {
|
|
18
|
-
start(): Promise<void>;
|
|
19
|
-
stop(): void;
|
|
20
|
-
pollNow(): Promise<ProjectQueueProjection | null>;
|
|
21
|
-
snapshot(): ProjectQueueProjection | null;
|
|
22
|
-
recordDaemonReprioritization(input: Omit<QueueReprioritizationRecord, 'actorType'>): Promise<void>;
|
|
23
|
-
}
|
|
24
|
-
export declare function createProjectQueuePoller(options: ProjectQueuePollerOptions): ProjectQueuePoller;
|
|
25
|
-
//# sourceMappingURL=project-queue-poller.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project-queue-poller.d.ts","sourceRoot":"","sources":["../../src/projects/project-queue-poller.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,KAAK,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAExH,eAAO,MAAM,6BAA6B,QAAS,CAAC;AAEpD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,SAAS,0BAA0B,EAAE,CAAC;CAC7D;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,2BAA2B,CAAC;CACtD;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,IAAI,CAAC;IACb,OAAO,IAAI,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;IAClD,QAAQ,IAAI,sBAAsB,GAAG,IAAI,CAAC;IAC1C,4BAA4B,CAAC,KAAK,EAAE,IAAI,CAAC,2BAA2B,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpG;AAwCD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,kBAAkB,CA2D/F"}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
// packages/core/src/projects/project-queue-poller.ts — Daemon-ready ProjectV2 queue-intent projection (#866).
|
|
2
|
-
import { createQueueRationaleAuditor } from '../queue/reprioritization-audit.js';
|
|
3
|
-
export const DEFAULT_PROJECT_QUEUE_POLL_MS = 30_000;
|
|
4
|
-
function copyProjection(projection) {
|
|
5
|
-
if (projection === null)
|
|
6
|
-
return null;
|
|
7
|
-
return {
|
|
8
|
-
refreshedAt: projection.refreshedAt,
|
|
9
|
-
items: projection.items.map((item) => ({
|
|
10
|
-
membership: { ...item.membership },
|
|
11
|
-
issue: { ...item.issue },
|
|
12
|
-
lane: item.lane,
|
|
13
|
-
order: item.order,
|
|
14
|
-
status: item.status,
|
|
15
|
-
})),
|
|
16
|
-
diagnostics: projection.diagnostics.map((diagnostic) => ({ ...diagnostic })),
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
function projectionFromRead(result) {
|
|
20
|
-
return {
|
|
21
|
-
refreshedAt: new Date().toISOString(),
|
|
22
|
-
items: result.items.map((item) => ({
|
|
23
|
-
membership: { ...item.membership },
|
|
24
|
-
issue: { ...item.issue },
|
|
25
|
-
lane: item.lane,
|
|
26
|
-
order: item.order,
|
|
27
|
-
status: item.status,
|
|
28
|
-
})),
|
|
29
|
-
diagnostics: result.diagnostics.map((diagnostic) => ({ ...diagnostic })),
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
function validateOptions(options) {
|
|
33
|
-
const pollMs = options.pollMs ?? DEFAULT_PROJECT_QUEUE_POLL_MS;
|
|
34
|
-
if (!Number.isFinite(pollMs) || pollMs <= 0)
|
|
35
|
-
throw new RangeError('Project queue poll interval must be positive');
|
|
36
|
-
return pollMs;
|
|
37
|
-
}
|
|
38
|
-
export function createProjectQueuePoller(options) {
|
|
39
|
-
const pollMs = validateOptions(options);
|
|
40
|
-
const rationaleAuditor = createQueueRationaleAuditor(options.logger, { commentClient: options.commentClient });
|
|
41
|
-
let cachedProjection = null;
|
|
42
|
-
let interval;
|
|
43
|
-
let started = false;
|
|
44
|
-
let inFlight;
|
|
45
|
-
async function refresh() {
|
|
46
|
-
try {
|
|
47
|
-
const result = await options.reader.read();
|
|
48
|
-
cachedProjection = projectionFromRead(result);
|
|
49
|
-
await rationaleAuditor.observeAcceptedProjection(cachedProjection);
|
|
50
|
-
options.logger.info('project_queue_refresh_succeeded', `Project queue refresh succeeded: ${cachedProjection.items.length} items, ${cachedProjection.diagnostics.length} diagnostics`, { actor: 'daemon/project-queue-poller' });
|
|
51
|
-
return copyProjection(cachedProjection);
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
55
|
-
options.logger.warn('project_queue_refresh_failed', `Project queue refresh failed: ${message}`, {
|
|
56
|
-
actor: 'daemon/project-queue-poller',
|
|
57
|
-
});
|
|
58
|
-
return copyProjection(cachedProjection);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
function pollNow() {
|
|
62
|
-
if (inFlight !== undefined)
|
|
63
|
-
return inFlight;
|
|
64
|
-
inFlight = refresh().finally(() => {
|
|
65
|
-
inFlight = undefined;
|
|
66
|
-
});
|
|
67
|
-
return inFlight;
|
|
68
|
-
}
|
|
69
|
-
async function start() {
|
|
70
|
-
started = true;
|
|
71
|
-
await pollNow();
|
|
72
|
-
if (started && interval === undefined) {
|
|
73
|
-
interval = setInterval(() => {
|
|
74
|
-
void pollNow();
|
|
75
|
-
}, pollMs);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
function stop() {
|
|
79
|
-
started = false;
|
|
80
|
-
if (interval !== undefined)
|
|
81
|
-
clearInterval(interval);
|
|
82
|
-
interval = undefined;
|
|
83
|
-
}
|
|
84
|
-
return {
|
|
85
|
-
start,
|
|
86
|
-
stop,
|
|
87
|
-
pollNow,
|
|
88
|
-
snapshot: () => copyProjection(cachedProjection),
|
|
89
|
-
recordDaemonReprioritization: (input) => rationaleAuditor.recordDaemonReprioritization(input),
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
//# sourceMappingURL=project-queue-poller.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project-queue-poller.js","sourceRoot":"","sources":["../../src/projects/project-queue-poller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
export type ProjectQueueStatus = 'backlog' | 'ready' | 'in_progress' | 'blocked' | 'done';
|
|
2
|
-
export interface ProjectQueueIntentItem {
|
|
3
|
-
readonly membership: {
|
|
4
|
-
readonly projectId: string;
|
|
5
|
-
readonly itemId: string;
|
|
6
|
-
};
|
|
7
|
-
readonly issue: {
|
|
8
|
-
readonly id: string;
|
|
9
|
-
readonly number: number;
|
|
10
|
-
};
|
|
11
|
-
readonly lane: string;
|
|
12
|
-
readonly order: string | number;
|
|
13
|
-
readonly status: ProjectQueueStatus;
|
|
14
|
-
}
|
|
15
|
-
export type ProjectQueueReadDiagnosticReason = 'missing_issue' | 'missing_lane_field' | 'missing_order_field' | 'missing_status_field' | 'unmapped_status_value';
|
|
16
|
-
export interface ProjectQueueReadDiagnostic {
|
|
17
|
-
readonly projectId: string;
|
|
18
|
-
readonly itemId?: string;
|
|
19
|
-
readonly reason: ProjectQueueReadDiagnosticReason;
|
|
20
|
-
}
|
|
21
|
-
export interface ProjectQueueReadResult {
|
|
22
|
-
readonly items: readonly ProjectQueueIntentItem[];
|
|
23
|
-
readonly diagnostics: readonly ProjectQueueReadDiagnostic[];
|
|
24
|
-
}
|
|
25
|
-
export interface ProjectQueueReaderOptions {
|
|
26
|
-
readonly projectId: string;
|
|
27
|
-
readonly graphql: (query: string, variables: {
|
|
28
|
-
projectId: string;
|
|
29
|
-
cursor: string | null;
|
|
30
|
-
}) => Promise<unknown>;
|
|
31
|
-
readonly laneFieldName: string;
|
|
32
|
-
readonly orderFieldName: string;
|
|
33
|
-
readonly statusFieldName: string;
|
|
34
|
-
readonly statusValues: Readonly<Record<string, ProjectQueueStatus>>;
|
|
35
|
-
}
|
|
36
|
-
export interface ProjectQueueReader {
|
|
37
|
-
read(): Promise<ProjectQueueReadResult>;
|
|
38
|
-
}
|
|
39
|
-
export declare function createProjectQueueReader(options: ProjectQueueReaderOptions): ProjectQueueReader;
|
|
40
|
-
//# sourceMappingURL=project-queue-reader.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project-queue-reader.d.ts","sourceRoot":"","sources":["../../src/projects/project-queue-reader.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,CAAC;AAE1F,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7E,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;CACrC;AAED,MAAM,MAAM,gCAAgC,GAC1C,eAAe,GAAG,oBAAoB,GAAG,qBAAqB,GAAG,sBAAsB,GAAG,uBAAuB,CAAC;AAEpH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,gCAAgC,CAAC;CACnD;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,SAAS,0BAA0B,EAAE,CAAC;CAC7D;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/G,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;CACrE;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAAC;CACzC;AAgLD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,kBAAkB,CAiC/F"}
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
const PROJECT_QUEUE_ITEMS_QUERY = `
|
|
2
|
-
query ProjectQueueItems($projectId: ID!, $cursor: String) {
|
|
3
|
-
node(id: $projectId) {
|
|
4
|
-
... on ProjectV2 {
|
|
5
|
-
id
|
|
6
|
-
items(first: 100, after: $cursor) {
|
|
7
|
-
nodes {
|
|
8
|
-
id
|
|
9
|
-
content {
|
|
10
|
-
__typename
|
|
11
|
-
... on Issue {
|
|
12
|
-
id
|
|
13
|
-
number
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
fieldValues(first: 100) {
|
|
17
|
-
nodes {
|
|
18
|
-
field {
|
|
19
|
-
... on ProjectV2FieldCommon {
|
|
20
|
-
name
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
... on ProjectV2ItemFieldTextValue {
|
|
24
|
-
text
|
|
25
|
-
}
|
|
26
|
-
... on ProjectV2ItemFieldNumberValue {
|
|
27
|
-
number
|
|
28
|
-
}
|
|
29
|
-
... on ProjectV2ItemFieldSingleSelectValue {
|
|
30
|
-
name
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
pageInfo {
|
|
36
|
-
hasNextPage
|
|
37
|
-
endCursor
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
`;
|
|
44
|
-
function isRecord(value) {
|
|
45
|
-
return typeof value === 'object' && value !== null;
|
|
46
|
-
}
|
|
47
|
-
function requiredString(value, description) {
|
|
48
|
-
if (typeof value !== 'string' || value === '')
|
|
49
|
-
throw new Error(`Malformed ProjectV2 response: ${description}`);
|
|
50
|
-
return value;
|
|
51
|
-
}
|
|
52
|
-
function parsePage(value) {
|
|
53
|
-
if (!isRecord(value) || !isRecord(value.node)) {
|
|
54
|
-
throw new Error('Malformed ProjectV2 response: node is missing');
|
|
55
|
-
}
|
|
56
|
-
if (!isRecord(value.node.items)) {
|
|
57
|
-
throw new Error('Malformed ProjectV2 response: ProjectV2 items are missing');
|
|
58
|
-
}
|
|
59
|
-
const { items } = value.node;
|
|
60
|
-
if (!Array.isArray(items.nodes) || !isRecord(items.pageInfo)) {
|
|
61
|
-
throw new Error('Malformed ProjectV2 response: items page is invalid');
|
|
62
|
-
}
|
|
63
|
-
const { hasNextPage, endCursor } = items.pageInfo;
|
|
64
|
-
if (typeof hasNextPage !== 'boolean' || (endCursor !== null && typeof endCursor !== 'string')) {
|
|
65
|
-
throw new Error('Malformed ProjectV2 response: pageInfo is invalid');
|
|
66
|
-
}
|
|
67
|
-
if (hasNextPage && (typeof endCursor !== 'string' || endCursor === '')) {
|
|
68
|
-
throw new Error('Malformed ProjectV2 response: next page cursor is missing');
|
|
69
|
-
}
|
|
70
|
-
return {
|
|
71
|
-
projectId: requiredString(value.node.id, 'ProjectV2 ID is invalid'),
|
|
72
|
-
items: items.nodes,
|
|
73
|
-
hasNextPage,
|
|
74
|
-
endCursor,
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
function normalizedString(value) {
|
|
78
|
-
if (typeof value !== 'string')
|
|
79
|
-
return null;
|
|
80
|
-
const normalized = value.trim();
|
|
81
|
-
return normalized === '' ? null : normalized;
|
|
82
|
-
}
|
|
83
|
-
function itemId(item) {
|
|
84
|
-
if (!isRecord(item))
|
|
85
|
-
return undefined;
|
|
86
|
-
const id = normalizedString(item.id);
|
|
87
|
-
return id ?? undefined;
|
|
88
|
-
}
|
|
89
|
-
function issue(item) {
|
|
90
|
-
if (!isRecord(item) || !isRecord(item.content) || item.content.__typename !== 'Issue')
|
|
91
|
-
return null;
|
|
92
|
-
const id = normalizedString(item.content.id);
|
|
93
|
-
const number = item.content.number;
|
|
94
|
-
if (id === null || typeof number !== 'number' || !Number.isInteger(number))
|
|
95
|
-
return null;
|
|
96
|
-
return { id, number };
|
|
97
|
-
}
|
|
98
|
-
function fieldValue(item, fieldName) {
|
|
99
|
-
if (!isRecord(item) || !isRecord(item.fieldValues) || !Array.isArray(item.fieldValues.nodes))
|
|
100
|
-
return null;
|
|
101
|
-
for (const value of item.fieldValues.nodes) {
|
|
102
|
-
if (!isRecord(value) || !isRecord(value.field) || value.field.name !== fieldName)
|
|
103
|
-
continue;
|
|
104
|
-
const text = normalizedString(value.text);
|
|
105
|
-
if (text !== null)
|
|
106
|
-
return text;
|
|
107
|
-
if (typeof value.number === 'number' && Number.isFinite(value.number))
|
|
108
|
-
return value.number;
|
|
109
|
-
const selected = normalizedString(value.name);
|
|
110
|
-
if (selected !== null)
|
|
111
|
-
return selected;
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
return null;
|
|
115
|
-
}
|
|
116
|
-
function diagnostic(projectId, itemId, reason) {
|
|
117
|
-
return itemId === undefined ? { projectId, reason } : { projectId, itemId, reason };
|
|
118
|
-
}
|
|
119
|
-
function normalizeItem(projectId, item, options) {
|
|
120
|
-
const membershipItemId = itemId(item);
|
|
121
|
-
const issueIdentity = issue(item);
|
|
122
|
-
if (membershipItemId === undefined || issueIdentity === null) {
|
|
123
|
-
return diagnostic(projectId, membershipItemId, 'missing_issue');
|
|
124
|
-
}
|
|
125
|
-
const lane = fieldValue(item, options.laneFieldName);
|
|
126
|
-
if (typeof lane !== 'string')
|
|
127
|
-
return diagnostic(projectId, membershipItemId, 'missing_lane_field');
|
|
128
|
-
const order = fieldValue(item, options.orderFieldName);
|
|
129
|
-
if (order === null)
|
|
130
|
-
return diagnostic(projectId, membershipItemId, 'missing_order_field');
|
|
131
|
-
const statusValue = fieldValue(item, options.statusFieldName);
|
|
132
|
-
if (typeof statusValue !== 'string')
|
|
133
|
-
return diagnostic(projectId, membershipItemId, 'missing_status_field');
|
|
134
|
-
const status = options.statusValues[statusValue];
|
|
135
|
-
if (status === undefined)
|
|
136
|
-
return diagnostic(projectId, membershipItemId, 'unmapped_status_value');
|
|
137
|
-
return {
|
|
138
|
-
membership: { projectId, itemId: membershipItemId },
|
|
139
|
-
issue: issueIdentity,
|
|
140
|
-
lane,
|
|
141
|
-
order,
|
|
142
|
-
status,
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
function validateOptions(options) {
|
|
146
|
-
if (options.projectId === '' ||
|
|
147
|
-
options.laneFieldName === '' ||
|
|
148
|
-
options.orderFieldName === '' ||
|
|
149
|
-
options.statusFieldName === '') {
|
|
150
|
-
throw new RangeError('Project queue reader requires non-empty project ID and field names');
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
export function createProjectQueueReader(options) {
|
|
154
|
-
validateOptions(options);
|
|
155
|
-
return {
|
|
156
|
-
async read() {
|
|
157
|
-
const items = [];
|
|
158
|
-
const diagnostics = [];
|
|
159
|
-
const seenCursors = new Set();
|
|
160
|
-
let cursor = null;
|
|
161
|
-
do {
|
|
162
|
-
const response = await options.graphql(PROJECT_QUEUE_ITEMS_QUERY, { projectId: options.projectId, cursor });
|
|
163
|
-
const page = parsePage(response);
|
|
164
|
-
if (page.projectId !== options.projectId) {
|
|
165
|
-
throw new Error('Malformed ProjectV2 response: board ID does not match the configured project');
|
|
166
|
-
}
|
|
167
|
-
for (const rawItem of page.items) {
|
|
168
|
-
const normalized = normalizeItem(options.projectId, rawItem, options);
|
|
169
|
-
if ('reason' in normalized)
|
|
170
|
-
diagnostics.push(normalized);
|
|
171
|
-
else
|
|
172
|
-
items.push(normalized);
|
|
173
|
-
}
|
|
174
|
-
cursor = page.hasNextPage ? page.endCursor : null;
|
|
175
|
-
if (cursor !== null) {
|
|
176
|
-
if (seenCursors.has(cursor))
|
|
177
|
-
throw new Error('Malformed ProjectV2 response: repeated page cursor');
|
|
178
|
-
seenCursors.add(cursor);
|
|
179
|
-
}
|
|
180
|
-
} while (cursor !== null);
|
|
181
|
-
return { items, diagnostics };
|
|
182
|
-
},
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
//# sourceMappingURL=project-queue-reader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project-queue-reader.js","sourceRoot":"","sources":["../../src/projects/project-queue-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { LaneLifecycleEvent } from '@on-par/contracts';
|
|
2
|
-
import type { ProjectBoardStatusWriter } from '../queue/project-board-status-writer.js';
|
|
3
|
-
import type { ProjectQueuePoller } from './project-queue-poller.js';
|
|
4
|
-
export interface ProjectStatusWriterOptions {
|
|
5
|
-
readonly projectionSource: Pick<ProjectQueuePoller, 'snapshot'>;
|
|
6
|
-
readonly boardWriter: ProjectBoardStatusWriter;
|
|
7
|
-
}
|
|
8
|
-
export interface ProjectStatusWriter {
|
|
9
|
-
handle(event: LaneLifecycleEvent): Promise<void>;
|
|
10
|
-
}
|
|
11
|
-
export declare function createProjectStatusWriter(options: ProjectStatusWriterOptions): ProjectStatusWriter;
|
|
12
|
-
//# sourceMappingURL=project-status-writer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project-status-writer.d.ts","sourceRoot":"","sources":["../../src/projects/project-status-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,KAAK,EAA4B,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AAClH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;IAChE,QAAQ,CAAC,WAAW,EAAE,wBAAwB,CAAC;CAChD;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD;AAqBD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,GAAG,mBAAmB,CAsBlG"}
|