@usine/orchestrator 0.0.1 → 0.1.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 +123 -2
- package/dist/board/projection.d.ts +8 -0
- package/dist/board/projection.d.ts.map +1 -0
- package/dist/board/projection.js +151 -0
- package/dist/board/projection.js.map +1 -0
- package/dist/credentials.d.ts +12 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +62 -0
- package/dist/credentials.js.map +1 -0
- package/dist/exe-dev.d.ts +7 -0
- package/dist/exe-dev.d.ts.map +1 -0
- package/dist/exe-dev.js +16 -0
- package/dist/exe-dev.js.map +1 -0
- package/dist/idle-triggers.d.ts +6 -0
- package/dist/idle-triggers.d.ts.map +1 -0
- package/dist/idle-triggers.js +29 -0
- package/dist/idle-triggers.js.map +1 -0
- package/dist/index.d.ts +10 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -7
- package/dist/index.js.map +1 -1
- package/dist/local.d.ts +20 -0
- package/dist/local.d.ts.map +1 -0
- package/dist/local.js +46 -0
- package/dist/local.js.map +1 -0
- package/dist/operator/model.d.ts +280 -0
- package/dist/operator/model.d.ts.map +1 -0
- package/dist/operator/model.js +242 -0
- package/dist/operator/model.js.map +1 -0
- package/dist/operator/projection.d.ts +17 -0
- package/dist/operator/projection.d.ts.map +1 -0
- package/dist/operator/projection.js +130 -0
- package/dist/operator/projection.js.map +1 -0
- package/dist/operator/service.d.ts +36 -0
- package/dist/operator/service.d.ts.map +1 -0
- package/dist/operator/service.js +248 -0
- package/dist/operator/service.js.map +1 -0
- package/dist/orchestrator.d.ts +13 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +14 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/polling-triggers.d.ts +40 -0
- package/dist/polling-triggers.d.ts.map +1 -0
- package/dist/polling-triggers.js +394 -0
- package/dist/polling-triggers.js.map +1 -0
- package/dist/schedule-triggers.d.ts +65 -0
- package/dist/schedule-triggers.d.ts.map +1 -0
- package/dist/schedule-triggers.js +391 -0
- package/dist/schedule-triggers.js.map +1 -0
- package/dist/scheduler.d.ts +15 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +122 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/trigger-submission.d.ts +60 -0
- package/dist/trigger-submission.d.ts.map +1 -0
- package/dist/trigger-submission.js +105 -0
- package/dist/trigger-submission.js.map +1 -0
- package/package.json +28 -2
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Attempt, AttemptChannel, AttemptFailure, Loop, RunState, StepResult } from "@usine/core";
|
|
2
|
+
import { RunReader, TranscriptPageQuery, TranscriptTailQuery, } from "@usine/engine";
|
|
3
|
+
import { DateTime, Effect, Match, Option } from "effect";
|
|
4
|
+
import { AgentFailureView, AttemptView, CanceledAttemptView, FailedAttemptView, FailedTranscriptView, InfraFailureView, RunawayFailureView, SucceededAttemptView, TranscriptAttemptNotFoundError, RunView, TranscriptPageCursor, TranscriptEventView, } from "./model.js";
|
|
5
|
+
/** Newest rows returned by one cold drawer open per Attempt. */
|
|
6
|
+
export const COLD_TRANSCRIPT_LIMIT = 500;
|
|
7
|
+
/** Maximum rows returned by one live catch-up response across all Attempts. */
|
|
8
|
+
export const TAIL_TRANSCRIPT_LIMIT = 500;
|
|
9
|
+
export const failureView = (failure) => Match.valueTags(failure, {
|
|
10
|
+
InfraFailure: ({ message }) => new InfraFailureView({ message }),
|
|
11
|
+
AgentFailure: ({ message }) => new AgentFailureView({ message }),
|
|
12
|
+
RunawayFailure: ({ ceiling }) => new RunawayFailureView({ ceiling }),
|
|
13
|
+
});
|
|
14
|
+
const attemptOutcomeView = (outcome) => Match.valueTags(outcome, {
|
|
15
|
+
Succeeded: () => new SucceededAttemptView(),
|
|
16
|
+
Failed: ({ failure }) => new FailedAttemptView({ failure: failureView(failure) }),
|
|
17
|
+
Canceled: () => new CanceledAttemptView(),
|
|
18
|
+
});
|
|
19
|
+
const attemptView = (attempt) => {
|
|
20
|
+
return new AttemptView({
|
|
21
|
+
id: attempt.id,
|
|
22
|
+
number: attempt.number,
|
|
23
|
+
worker: attempt.worker,
|
|
24
|
+
brain: attempt.brain,
|
|
25
|
+
startedAt: DateTime.formatIso(attempt.startedAt),
|
|
26
|
+
outcome: Option.match(attempt.outcome, {
|
|
27
|
+
onNone: () => null,
|
|
28
|
+
onSome: attemptOutcomeView,
|
|
29
|
+
}),
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
export const runView = (snapshot, pausedLoops) => {
|
|
33
|
+
const result = Option.getOrNull(snapshot.step.result);
|
|
34
|
+
const pullRequest = result?.facts.find((fact) => fact._tag === "PullRequest");
|
|
35
|
+
return new RunView({
|
|
36
|
+
id: snapshot.run.id,
|
|
37
|
+
itemKey: snapshot.itemKey,
|
|
38
|
+
loop: snapshot.run.loop,
|
|
39
|
+
repository: snapshot.repository,
|
|
40
|
+
agent: snapshot.agent.name,
|
|
41
|
+
state: snapshot.run.state._tag,
|
|
42
|
+
loopPaused: pausedLoops.has(snapshot.run.loop),
|
|
43
|
+
openedAt: DateTime.formatIso(snapshot.run.openedAt),
|
|
44
|
+
task: snapshot.task,
|
|
45
|
+
attempts: snapshot.attempts.map(attemptView),
|
|
46
|
+
resultMessage: result?.message ?? null,
|
|
47
|
+
pullRequestUrl: pullRequest?.url.toString() ?? null,
|
|
48
|
+
canApprove: snapshot.run.state._tag === "Waiting",
|
|
49
|
+
canRetry: snapshot.run.state._tag === "Failed",
|
|
50
|
+
canCancel: RunState.isOpen(snapshot.run.state),
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
const transcriptPayload = (payload) => Match.valueTags(payload, {
|
|
54
|
+
Started: (value) => value,
|
|
55
|
+
SessionEvent: (value) => value,
|
|
56
|
+
Final: (value) => value,
|
|
57
|
+
Failed: ({ failure }) => new FailedTranscriptView({ failure: failureView(failure) }),
|
|
58
|
+
Interrupted: (value) => value,
|
|
59
|
+
Steer: (value) => value,
|
|
60
|
+
Interrupt: (value) => value,
|
|
61
|
+
});
|
|
62
|
+
const transcriptEvent = (entry) => new TranscriptEventView({
|
|
63
|
+
sequence: entry.sequence,
|
|
64
|
+
attemptId: entry.attemptId,
|
|
65
|
+
receivedAt: DateTime.formatIso(entry.receivedAt),
|
|
66
|
+
direction: entry.direction,
|
|
67
|
+
payload: transcriptPayload(entry.envelope.payload),
|
|
68
|
+
});
|
|
69
|
+
const sortedEvents = (entries) => [...entries].sort((left, right) => left.sequence - right.sequence).map(transcriptEvent);
|
|
70
|
+
const readPage = Effect.fn("Operator.readTranscriptPage")(function* (runs, attemptId, before) {
|
|
71
|
+
yield* Effect.annotateCurrentSpan({
|
|
72
|
+
attemptId,
|
|
73
|
+
before: Option.getOrNull(before),
|
|
74
|
+
});
|
|
75
|
+
const entries = yield* runs.transcript(new TranscriptPageQuery({
|
|
76
|
+
attemptId,
|
|
77
|
+
before,
|
|
78
|
+
limit: COLD_TRANSCRIPT_LIMIT + 1,
|
|
79
|
+
}));
|
|
80
|
+
const hasEarlier = entries.length > COLD_TRANSCRIPT_LIMIT;
|
|
81
|
+
const visible = hasEarlier ? entries.slice(1) : entries;
|
|
82
|
+
const first = visible[0];
|
|
83
|
+
yield* Effect.logDebug("Read operator transcript page", {
|
|
84
|
+
attemptId,
|
|
85
|
+
before: Option.getOrNull(before),
|
|
86
|
+
returned: visible.length,
|
|
87
|
+
hasEarlier,
|
|
88
|
+
});
|
|
89
|
+
return {
|
|
90
|
+
events: sortedEvents(visible),
|
|
91
|
+
earlier: hasEarlier && first !== undefined
|
|
92
|
+
? [new TranscriptPageCursor({ attemptId, before: first.sequence })]
|
|
93
|
+
: [],
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
export const readTranscript = Effect.fn("Operator.readTranscript")(function* (runs, snapshot, request) {
|
|
97
|
+
yield* Effect.annotateCurrentSpan({ runId: snapshot.run.id, request: request._tag });
|
|
98
|
+
const read = yield* Match.valueTags(request, {
|
|
99
|
+
ColdTranscriptRequest: () => Effect.forEach(snapshot.attempts, (attempt) => readPage(runs, attempt.id, Option.none()), {
|
|
100
|
+
concurrency: 4,
|
|
101
|
+
}).pipe(Effect.map((pages) => ({
|
|
102
|
+
events: pages
|
|
103
|
+
.flatMap(({ events }) => events)
|
|
104
|
+
.sort((left, right) => left.sequence - right.sequence),
|
|
105
|
+
earlier: pages.flatMap(({ earlier }) => earlier),
|
|
106
|
+
}))),
|
|
107
|
+
TailTranscriptRequest: ({ after }) => Effect.forEach(snapshot.attempts, (attempt) => runs.transcript(new TranscriptTailQuery({
|
|
108
|
+
attemptId: attempt.id,
|
|
109
|
+
after,
|
|
110
|
+
limit: TAIL_TRANSCRIPT_LIMIT,
|
|
111
|
+
})), { concurrency: 4 }).pipe(Effect.map((entries) => ({
|
|
112
|
+
events: sortedEvents(entries.flat()).slice(0, TAIL_TRANSCRIPT_LIMIT),
|
|
113
|
+
earlier: [],
|
|
114
|
+
}))),
|
|
115
|
+
EarlierTranscriptRequest: ({ attemptId, before }) => {
|
|
116
|
+
if (!snapshot.attempts.some((attempt) => attempt.id === attemptId)) {
|
|
117
|
+
return new TranscriptAttemptNotFoundError({ runId: snapshot.run.id, attemptId });
|
|
118
|
+
}
|
|
119
|
+
return readPage(runs, attemptId, Option.some(before));
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
yield* Effect.logDebug("Read operator transcript", {
|
|
123
|
+
runId: snapshot.run.id,
|
|
124
|
+
request: request._tag,
|
|
125
|
+
events: read.events.length,
|
|
126
|
+
earlier: read.earlier.length,
|
|
127
|
+
});
|
|
128
|
+
return read;
|
|
129
|
+
});
|
|
130
|
+
//# sourceMappingURL=projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../../src/operator/projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { LoadedInstance } from "@usine/config";
|
|
2
|
+
import { Loop, Run } from "@usine/core";
|
|
3
|
+
import { ItemProjectionReader, LoopControl, RepositoryLabelProjectionReader, RunEngine, RunReader, type EnginePersistenceError, type LoopRuntimeState, type RunEngineError, type RunStoreError } from "@usine/engine";
|
|
4
|
+
import { GitHubItemWriter, type GitHubAppError } from "@usine/github";
|
|
5
|
+
import { Context, Effect, Layer } from "effect";
|
|
6
|
+
import { PollingTriggers } from "../polling-triggers.ts";
|
|
7
|
+
import { ScheduleTriggers } from "../schedule-triggers.ts";
|
|
8
|
+
import { type BoardItemNotFoundError, type BoardLaneNotFoundError, type BoardLaneReadOnlyError, type BoardMove, type BoardProjectNotFoundError, ReadyOverview, RunDetailView, type TranscriptAttemptNotFoundError, type TranscriptRequest } from "./model.ts";
|
|
9
|
+
export type BoardMoveError = BoardItemNotFoundError | BoardLaneNotFoundError | BoardLaneReadOnlyError | BoardProjectNotFoundError | EnginePersistenceError | GitHubAppError;
|
|
10
|
+
export type OperatorError = RunEngineError | TranscriptAttemptNotFoundError | BoardMoveError;
|
|
11
|
+
export type OperatorObservationError = RunStoreError | TranscriptAttemptNotFoundError;
|
|
12
|
+
declare const OperatorObservation_base: Context.ServiceClass<OperatorObservation, "@usine/orchestrator/OperatorObservation", {
|
|
13
|
+
readonly overview: (instance: LoadedInstance) => Effect.Effect<ReadyOverview, OperatorObservationError>;
|
|
14
|
+
readonly detail: (runId: Run.RunId, request?: TranscriptRequest) => Effect.Effect<RunDetailView, OperatorObservationError>;
|
|
15
|
+
}>;
|
|
16
|
+
/** Read-only operator surface; safe to build without trigger execution. */
|
|
17
|
+
export declare class OperatorObservation extends OperatorObservation_base {
|
|
18
|
+
static readonly layer: Layer.Layer<OperatorObservation, never, ItemProjectionReader | LoopControl | PollingTriggers | RepositoryLabelProjectionReader | RunReader | ScheduleTriggers>;
|
|
19
|
+
}
|
|
20
|
+
declare const Operator_base: Context.ServiceClass<Operator, "@usine/orchestrator/Operator", {
|
|
21
|
+
readonly overview: (instance: LoadedInstance) => Effect.Effect<ReadyOverview, OperatorObservationError>;
|
|
22
|
+
readonly detail: (runId: Run.RunId, request?: TranscriptRequest) => Effect.Effect<RunDetailView, OperatorObservationError>;
|
|
23
|
+
} & {
|
|
24
|
+
readonly approve: (runId: Run.RunId) => Effect.Effect<void, OperatorError>;
|
|
25
|
+
readonly retry: (runId: Run.RunId) => Effect.Effect<void, OperatorError>;
|
|
26
|
+
readonly cancel: (runId: Run.RunId) => Effect.Effect<void, OperatorError>;
|
|
27
|
+
readonly moveBoardItem: (instance: LoadedInstance, move: BoardMove) => Effect.Effect<void, BoardMoveError>;
|
|
28
|
+
readonly pause: (loop: Loop.LoopName) => Effect.Effect<LoopRuntimeState, EnginePersistenceError>;
|
|
29
|
+
readonly unpause: (loop: Loop.LoopName) => Effect.Effect<LoopRuntimeState, EnginePersistenceError>;
|
|
30
|
+
}>;
|
|
31
|
+
/** Observe-and-intervene application service; transports only translate this API. */
|
|
32
|
+
export declare class Operator extends Operator_base {
|
|
33
|
+
static readonly layer: Layer.Layer<Operator, never, GitHubItemWriter | ItemProjectionReader | LoopControl | PollingTriggers | RepositoryLabelProjectionReader | RunEngine | RunReader | ScheduleTriggers>;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/operator/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAS,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,+BAA+B,EAC/B,SAAS,EACT,SAAS,EACT,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EAErB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,OAAO,EAAY,MAAM,EAAE,KAAK,EAA2B,MAAM,QAAQ,CAAC;AAEnF,OAAO,EAAE,eAAe,EAA8B,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAwB,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAEL,KAAK,sBAAsB,EAE3B,KAAK,sBAAsB,EAE3B,KAAK,sBAAsB,EAE3B,KAAK,SAAS,EAEd,KAAK,yBAAyB,EAM9B,aAAa,EACb,aAAa,EAGb,KAAK,8BAA8B,EACnC,KAAK,iBAAiB,EAGvB,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,cAAc,GACtB,sBAAsB,GACtB,sBAAsB,GACtB,sBAAsB,GACtB,yBAAyB,GACzB,sBAAsB,GACtB,cAAc,CAAC;AACnB,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,8BAA8B,GAAG,cAAc,CAAC;AAC7F,MAAM,MAAM,wBAAwB,GAAG,aAAa,GAAG,8BAA8B,CAAC;;uBAkO/D,CACjB,QAAQ,EAAE,cAAc,KACrB,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,wBAAwB,CAAC;qBAC1C,CACf,KAAK,EAAE,GAAG,CAAC,KAAK,EAChB,OAAO,CAAC,EAAE,iBAAiB,KACxB,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,wBAAwB,CAAC;;AAV/D,2EAA2E;AAC3E,qBAAa,mBAAoB,SAAQ,wBAWK;IAC5C,MAAM,CAAC,QAAQ,CAAC,KAAK,iKAA8D;CACpF;;uBAVsB,CACjB,QAAQ,EAAE,cAAc,KACrB,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,wBAAwB,CAAC;qBAC1C,CACf,KAAK,EAAE,GAAG,CAAC,KAAK,EAChB,OAAO,CAAC,EAAE,iBAAiB,KACxB,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,wBAAwB,CAAC;;sBAsHzC,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;oBAC1D,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;qBACvD,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;4BACjD,CACtB,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,SAAS,KACZ,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC;oBACxB,CACd,IAAI,EAAE,IAAI,CAAC,QAAQ,KAChB,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;sBAC1C,CAChB,IAAI,EAAE,IAAI,CAAC,QAAQ,KAChB,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;;AAhBhE,qFAAqF;AACrF,qBAAa,QAAS,SAAQ,aAiBK;IACjC,MAAM,CAAC,QAAQ,CAAC,KAAK,qLAEnB;CACH"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { Event, Loop, Run } from "@usine/core";
|
|
2
|
+
import { ItemProjectionReader, LoopControl, RepositoryLabelProjectionReader, RunEngine, RunReader, } from "@usine/engine";
|
|
3
|
+
import { GitHubItemWriter } from "@usine/github";
|
|
4
|
+
import { Context, DateTime, Effect, Layer, Option, SynchronizedRef } from "effect";
|
|
5
|
+
import { labelMutationForBoardMove, projectBoard } from "../board/projection.js";
|
|
6
|
+
import { PollingTriggers } from "../polling-triggers.js";
|
|
7
|
+
import { ScheduleTriggers } from "../schedule-triggers.js";
|
|
8
|
+
import { ApprovalNeed, BoardItemNotFoundError as BoardItemNotFound, BoardLaneNotFoundError as BoardLaneNotFound, BoardLaneReadOnlyError as BoardLaneReadOnly, BoardProjectionNeed, BoardProjectNotFoundError as BoardProjectNotFound, ColdTranscriptRequest, LoopView, PollFailureNeed, ProjectView, ReadyOverview, RunDetailView, RunFailureNeed, ScheduleFailureNeed, } from "./model.js";
|
|
9
|
+
import { readTranscript, runView } from "./projection.js";
|
|
10
|
+
/** Settled Runs kept in the overview beside every open one; history stays bounded. */
|
|
11
|
+
const OVERVIEW_CLOSED_RUNS = 100;
|
|
12
|
+
/** Newest Items projected onto a Board; older ones fall off instead of growing the overview. */
|
|
13
|
+
const OVERVIEW_BOARD_ITEMS = 500;
|
|
14
|
+
const makeOperatorObservation = Effect.gen(function* () {
|
|
15
|
+
const reader = yield* RunReader;
|
|
16
|
+
const controls = yield* LoopControl;
|
|
17
|
+
const itemReader = yield* ItemProjectionReader;
|
|
18
|
+
const repositoryLabels = yield* RepositoryLabelProjectionReader;
|
|
19
|
+
const polling = yield* PollingTriggers;
|
|
20
|
+
const schedules = yield* ScheduleTriggers;
|
|
21
|
+
const cache = yield* SynchronizedRef.make(Option.none());
|
|
22
|
+
const projectOverview = Effect.fn("Operator.projectOverview")(function* (instance, pollFailures, scheduleFailures, revision) {
|
|
23
|
+
const [snapshots, states] = yield* Effect.all([reader.list({ closedLimit: OVERVIEW_CLOSED_RUNS }), controls.states], { concurrency: "unbounded" });
|
|
24
|
+
const paused = new Set(states.filter((state) => state.paused).map((state) => state.loop));
|
|
25
|
+
const views = snapshots.map((snapshot) => runView(snapshot, paused));
|
|
26
|
+
const runsByRepository = new Map();
|
|
27
|
+
for (const view of views) {
|
|
28
|
+
const projectRuns = runsByRepository.get(view.repository) ?? [];
|
|
29
|
+
projectRuns.push(view);
|
|
30
|
+
runsByRepository.set(view.repository, projectRuns);
|
|
31
|
+
}
|
|
32
|
+
const projects = yield* Effect.forEach(instance.config.repos, (repository) => Effect.gen(function* () {
|
|
33
|
+
const { name } = repository;
|
|
34
|
+
const projectRuns = runsByRepository.get(name) ?? [];
|
|
35
|
+
const [boardItems, labelProjection] = yield* Effect.all([
|
|
36
|
+
itemReader.list(name, { limit: OVERVIEW_BOARD_ITEMS }),
|
|
37
|
+
repositoryLabels.get(name),
|
|
38
|
+
], { concurrency: "unbounded" });
|
|
39
|
+
const board = yield* projectBoard(repository, Option.match(labelProjection, {
|
|
40
|
+
onNone: () => [],
|
|
41
|
+
onSome: ({ labels }) => labels,
|
|
42
|
+
}), boardItems, projectRuns);
|
|
43
|
+
const status = board.failures.length > 0 ||
|
|
44
|
+
projectRuns.some((run) => run.state === "Waiting" || run.state === "Failed")
|
|
45
|
+
? "needs-you"
|
|
46
|
+
: projectRuns.some((run) => run.canCancel)
|
|
47
|
+
? "active"
|
|
48
|
+
: "clear";
|
|
49
|
+
return new ProjectView({ repository: name, status, runs: projectRuns, board });
|
|
50
|
+
}), { concurrency: 4 });
|
|
51
|
+
const loops = instance.loops.map((loop) => new LoopView({
|
|
52
|
+
name: loop.name,
|
|
53
|
+
trigger: loop.trigger.on,
|
|
54
|
+
agent: loop.agent,
|
|
55
|
+
paused: paused.has(loop.name),
|
|
56
|
+
}));
|
|
57
|
+
const needsYou = [];
|
|
58
|
+
for (const run of views) {
|
|
59
|
+
if (run.state === "Waiting") {
|
|
60
|
+
needsYou.push(new ApprovalNeed({
|
|
61
|
+
id: `approval:${run.id}`,
|
|
62
|
+
repository: run.repository,
|
|
63
|
+
runId: run.id,
|
|
64
|
+
loop: run.loop,
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
else if (run.state === "Failed") {
|
|
68
|
+
const attempt = run.attempts.at(-1);
|
|
69
|
+
if (attempt?.outcome?._tag !== "Failed") {
|
|
70
|
+
return yield* Effect.die(new Error(`Failed Run ${run.id} has no failed Attempt`));
|
|
71
|
+
}
|
|
72
|
+
needsYou.push(new RunFailureNeed({
|
|
73
|
+
id: `run-failure:${run.id}`,
|
|
74
|
+
repository: run.repository,
|
|
75
|
+
runId: run.id,
|
|
76
|
+
loop: run.loop,
|
|
77
|
+
failure: attempt.outcome.failure,
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
for (const project of projects) {
|
|
82
|
+
for (const failure of project.board.failures) {
|
|
83
|
+
needsYou.push(new BoardProjectionNeed({
|
|
84
|
+
id: `board-projection:${failure.repository}:${failure.itemKey}`,
|
|
85
|
+
failure,
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
pollFailures.forEach((failure, index) => {
|
|
90
|
+
needsYou.push(new PollFailureNeed({
|
|
91
|
+
id: `poll-failure:${failure.repository}:${failure.errorTag}:${index}`,
|
|
92
|
+
failure,
|
|
93
|
+
}));
|
|
94
|
+
});
|
|
95
|
+
scheduleFailures.forEach((failure, index) => {
|
|
96
|
+
needsYou.push(new ScheduleFailureNeed({
|
|
97
|
+
id: `schedule-failure:${failure.loop}:${failure._tag}:${index}`,
|
|
98
|
+
failure,
|
|
99
|
+
}));
|
|
100
|
+
});
|
|
101
|
+
const projected = new ReadyOverview({ projects, loops, needsYou });
|
|
102
|
+
yield* Effect.logDebug("Refreshed operator overview", {
|
|
103
|
+
revision,
|
|
104
|
+
runs: views.length,
|
|
105
|
+
needsYou: needsYou.length,
|
|
106
|
+
});
|
|
107
|
+
return projected;
|
|
108
|
+
});
|
|
109
|
+
const overview = Effect.fn("Operator.overview")((instance) => SynchronizedRef.modifyEffect(cache, (cached) => Effect.gen(function* () {
|
|
110
|
+
const [revision, latestPoll, latestSchedule] = yield* Effect.all([reader.revision(), polling.latest, schedules.latest], { concurrency: "unbounded" });
|
|
111
|
+
const pollFailures = Option.match(latestPoll, {
|
|
112
|
+
onNone: () => [],
|
|
113
|
+
onSome: ({ failures }) => failures,
|
|
114
|
+
});
|
|
115
|
+
const scheduleFailures = Option.match(latestSchedule, {
|
|
116
|
+
onNone: () => [],
|
|
117
|
+
onSome: ({ failures }) => failures,
|
|
118
|
+
});
|
|
119
|
+
// A missing invalidation singleton means staleness is undetectable, so the
|
|
120
|
+
// cache is bypassed entirely rather than trusted.
|
|
121
|
+
const token = Option.map(revision, (value) => JSON.stringify([
|
|
122
|
+
value,
|
|
123
|
+
instance.config.repos.map(({ name, lanes }) => [name, lanes]),
|
|
124
|
+
instance.loops.map(({ name, agent, trigger }) => [name, agent, trigger.on]),
|
|
125
|
+
pollFailures,
|
|
126
|
+
scheduleFailures,
|
|
127
|
+
]));
|
|
128
|
+
if (Option.isNone(token)) {
|
|
129
|
+
yield* Effect.logWarning("Projection revision singleton is missing; the overview cache is bypassed");
|
|
130
|
+
const projected = yield* projectOverview(instance, pollFailures, scheduleFailures, revision);
|
|
131
|
+
return [projected, Option.none()];
|
|
132
|
+
}
|
|
133
|
+
if (Option.isSome(cached) && cached.value.token === token.value) {
|
|
134
|
+
yield* Effect.logDebug("Reusing unchanged operator overview", {
|
|
135
|
+
revision,
|
|
136
|
+
});
|
|
137
|
+
return [cached.value.overview, cached];
|
|
138
|
+
}
|
|
139
|
+
const projected = yield* projectOverview(instance, pollFailures, scheduleFailures, revision);
|
|
140
|
+
return [projected, Option.some({ token: token.value, overview: projected })];
|
|
141
|
+
})));
|
|
142
|
+
const detail = Effect.fn("Operator.detail")(function* (runId, request = new ColdTranscriptRequest()) {
|
|
143
|
+
yield* Effect.annotateCurrentSpan({ runId });
|
|
144
|
+
const [snapshot, states] = yield* Effect.all([reader.inspect(runId), controls.states], { concurrency: "unbounded" });
|
|
145
|
+
const paused = new Set(states.filter((state) => state.paused).map((state) => state.loop));
|
|
146
|
+
const transcript = yield* readTranscript(reader, snapshot, request);
|
|
147
|
+
return new RunDetailView({
|
|
148
|
+
run: runView(snapshot, paused),
|
|
149
|
+
eventDedupKey: snapshot.event.dedupKey,
|
|
150
|
+
eventPayload: snapshot.event.payload,
|
|
151
|
+
transcript: transcript.events,
|
|
152
|
+
earlierTranscript: transcript.earlier,
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
return { detail, overview };
|
|
156
|
+
});
|
|
157
|
+
/** Read-only operator surface; safe to build without trigger execution. */
|
|
158
|
+
export class OperatorObservation extends Context.Service()("@usine/orchestrator/OperatorObservation") {
|
|
159
|
+
static layer = Layer.effect(OperatorObservation, makeOperatorObservation);
|
|
160
|
+
}
|
|
161
|
+
const makeOperator = Effect.gen(function* () {
|
|
162
|
+
const observation = yield* OperatorObservation;
|
|
163
|
+
const runs = yield* RunEngine;
|
|
164
|
+
const controls = yield* LoopControl;
|
|
165
|
+
const items = yield* ItemProjectionReader;
|
|
166
|
+
const repositoryLabels = yield* RepositoryLabelProjectionReader;
|
|
167
|
+
const github = yield* GitHubItemWriter;
|
|
168
|
+
const approve = Effect.fn("Operator.approve")(function* (runId) {
|
|
169
|
+
yield* Effect.annotateCurrentSpan({ runId });
|
|
170
|
+
const receivedAt = yield* DateTime.now;
|
|
171
|
+
const dedupKey = Event.DedupKey.make(JSON.stringify(["operator-approval", runId]));
|
|
172
|
+
yield* runs.approve(runId, new Event.Event({
|
|
173
|
+
id: Event.EventId.make(dedupKey),
|
|
174
|
+
dedupKey,
|
|
175
|
+
payload: { runId, decision: "approved" },
|
|
176
|
+
receivedAt,
|
|
177
|
+
}));
|
|
178
|
+
yield* Effect.logInfo("Operator approved Run", { runId });
|
|
179
|
+
});
|
|
180
|
+
const retry = Effect.fn("Operator.retry")(function* (runId) {
|
|
181
|
+
yield* Effect.annotateCurrentSpan({ runId });
|
|
182
|
+
yield* runs.retry(runId);
|
|
183
|
+
yield* Effect.logInfo("Operator retried Run", { runId });
|
|
184
|
+
});
|
|
185
|
+
const cancel = Effect.fn("Operator.cancel")(function* (runId) {
|
|
186
|
+
yield* Effect.annotateCurrentSpan({ runId });
|
|
187
|
+
yield* runs.cancel(runId);
|
|
188
|
+
yield* Effect.logInfo("Operator canceled Run", { runId });
|
|
189
|
+
});
|
|
190
|
+
const pause = Effect.fn("Operator.pause")(function* (loop) {
|
|
191
|
+
yield* Effect.annotateCurrentSpan({ loop });
|
|
192
|
+
return yield* controls.pause(loop);
|
|
193
|
+
});
|
|
194
|
+
const unpause = Effect.fn("Operator.unpause")(function* (loop) {
|
|
195
|
+
yield* Effect.annotateCurrentSpan({ loop });
|
|
196
|
+
return yield* controls.unpause(loop);
|
|
197
|
+
});
|
|
198
|
+
const moveBoardItem = Effect.fn("Operator.moveBoardItem")(function* (instance, move) {
|
|
199
|
+
yield* Effect.annotateCurrentSpan({
|
|
200
|
+
repository: move.repository,
|
|
201
|
+
item: move.item,
|
|
202
|
+
lane: move.toLane,
|
|
203
|
+
});
|
|
204
|
+
const repository = instance.config.repos.find(({ name }) => name === move.repository);
|
|
205
|
+
if (repository === undefined) {
|
|
206
|
+
return yield* new BoardProjectNotFound({ repository: move.repository });
|
|
207
|
+
}
|
|
208
|
+
const [storedItems, labelProjection] = yield* Effect.all([
|
|
209
|
+
items.list(move.repository, { limit: OVERVIEW_BOARD_ITEMS }),
|
|
210
|
+
repositoryLabels.get(move.repository),
|
|
211
|
+
], { concurrency: "unbounded" });
|
|
212
|
+
const board = yield* projectBoard(repository, Option.match(labelProjection, {
|
|
213
|
+
onNone: () => [],
|
|
214
|
+
onSome: ({ labels }) => labels,
|
|
215
|
+
}), storedItems, []);
|
|
216
|
+
const source = board.lanes.find(({ items: laneItems }) => laneItems.some(({ number }) => number === move.item));
|
|
217
|
+
if (source === undefined) {
|
|
218
|
+
return yield* new BoardItemNotFound({ repository: move.repository, item: move.item });
|
|
219
|
+
}
|
|
220
|
+
const target = board.lanes.find(({ id }) => id === move.toLane);
|
|
221
|
+
if (target === undefined) {
|
|
222
|
+
return yield* new BoardLaneNotFound({ repository: move.repository, lane: move.toLane });
|
|
223
|
+
}
|
|
224
|
+
if (target._tag === "ReadOnlyBoardLane") {
|
|
225
|
+
return yield* new BoardLaneReadOnly({ repository: move.repository, lane: move.toLane });
|
|
226
|
+
}
|
|
227
|
+
const mutation = labelMutationForBoardMove(board, target);
|
|
228
|
+
const applied = yield* github.updateLabels(move.repository, move.item, mutation);
|
|
229
|
+
yield* Effect.logInfo("Operator moved a Board card; the next poll projects the new lane", {
|
|
230
|
+
repository: move.repository,
|
|
231
|
+
item: move.item,
|
|
232
|
+
fromLane: source.id,
|
|
233
|
+
toLane: target.id,
|
|
234
|
+
addedLabels: mutation.add.join(", "),
|
|
235
|
+
removedLabels: mutation.remove.join(", "),
|
|
236
|
+
labels: applied.join(", "),
|
|
237
|
+
});
|
|
238
|
+
}, Effect.tapError((error) => Effect.logWarning("Board move rejected", {
|
|
239
|
+
errorTag: error._tag,
|
|
240
|
+
message: error.message,
|
|
241
|
+
})));
|
|
242
|
+
return { ...observation, approve, cancel, moveBoardItem, pause, retry, unpause };
|
|
243
|
+
});
|
|
244
|
+
/** Observe-and-intervene application service; transports only translate this API. */
|
|
245
|
+
export class Operator extends Context.Service()("@usine/orchestrator/Operator") {
|
|
246
|
+
static layer = Layer.effect(Operator, makeOperator).pipe(Layer.provide(OperatorObservation.layer));
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/operator/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { LoadedInstance } from "@usine/config";
|
|
2
|
+
import { Context, Effect, Layer } from "effect";
|
|
3
|
+
import { PollingTriggers } from "./polling-triggers.ts";
|
|
4
|
+
import { ScheduleTriggers } from "./schedule-triggers.ts";
|
|
5
|
+
declare const Orchestrator_base: Context.ServiceClass<Orchestrator, "@usine/orchestrator/Orchestrator", {
|
|
6
|
+
readonly run: (instance: LoadedInstance) => Effect.Effect<never>;
|
|
7
|
+
}>;
|
|
8
|
+
/** The embeddable full runtime: polling, schedules, engine-facing operator acts. */
|
|
9
|
+
export declare class Orchestrator extends Orchestrator_base {
|
|
10
|
+
static readonly layer: Layer.Layer<Orchestrator, never, PollingTriggers | ScheduleTriggers>;
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;;kBAgBxC,CAAC,QAAQ,EAAE,cAAc,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;;AAJpE,oFAAoF;AACpF,qBAAa,YAAa,SAAQ,iBAKK;IACrC,MAAM,CAAC,QAAQ,CAAC,KAAK,uEAAgD;CACtE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { PollingTriggers } from "./polling-triggers.js";
|
|
3
|
+
import { ScheduleTriggers } from "./schedule-triggers.js";
|
|
4
|
+
const makeOrchestrator = Effect.gen(function* () {
|
|
5
|
+
const polling = yield* PollingTriggers;
|
|
6
|
+
const schedules = yield* ScheduleTriggers;
|
|
7
|
+
const run = (instance) => Effect.raceFirst(polling.run(instance), schedules.run(instance));
|
|
8
|
+
return { run };
|
|
9
|
+
});
|
|
10
|
+
/** The embeddable full runtime: polling, schedules, engine-facing operator acts. */
|
|
11
|
+
export class Orchestrator extends Context.Service()("@usine/orchestrator/Orchestrator") {
|
|
12
|
+
static layer = Layer.effect(Orchestrator, makeOrchestrator);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC;IAE1C,MAAM,GAAG,GAAG,CAAC,QAAwB,EAAwB,EAAE,CAC7D,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEnE,OAAO,EAAE,GAAG,EAAW,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,oFAAoF;AACpF,MAAM,OAAO,YAAa,SAAQ,OAAO,CAAC,OAAO,EAK9C,CAAC,kCAAkC,CAAC;IACrC,MAAM,CAAU,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;CACtE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ConfigParser, type LoadedInstance } from "@usine/config";
|
|
2
|
+
import { CursorStore, type EnginePersistenceError, ItemProjectionWriter, LoopControl, RepositoryLabelProjectionWriter, RunEngine } from "@usine/engine";
|
|
3
|
+
import { ExpressionEngine } from "@usine/expression";
|
|
4
|
+
import { GitHubPolling } from "@usine/github";
|
|
5
|
+
import { Context, Effect, Layer, Option, Schema } from "effect";
|
|
6
|
+
declare const RepositoryPollFailure_base: Schema.Class<RepositoryPollFailure, Schema.Struct<{
|
|
7
|
+
readonly repository: Schema.brand<Schema.String, "RepoName">;
|
|
8
|
+
readonly errorTag: Schema.NonEmptyString;
|
|
9
|
+
readonly message: Schema.String;
|
|
10
|
+
}>, {}>;
|
|
11
|
+
/** One repository whose cycle ended in a typed error; siblings were unaffected. */
|
|
12
|
+
export declare class RepositoryPollFailure extends RepositoryPollFailure_base {
|
|
13
|
+
}
|
|
14
|
+
declare const PollCycle_base: Schema.Class<PollCycle, Schema.Struct<{
|
|
15
|
+
readonly repositories: Schema.Int;
|
|
16
|
+
readonly changedItems: Schema.Int;
|
|
17
|
+
readonly submissions: Schema.$Array<Schema.Union<readonly [typeof import("@usine/engine").Claimed, typeof import("@usine/engine").Queued, typeof import("@usine/engine").Ignored]>>;
|
|
18
|
+
/** Run ids actually revoked because their item stopped matching. */
|
|
19
|
+
readonly revokedRuns: Schema.Int;
|
|
20
|
+
readonly failures: Schema.$Array<typeof RepositoryPollFailure>;
|
|
21
|
+
readonly nextPollAt: Schema.Option<Schema.DateTimeUtc>;
|
|
22
|
+
}>, {}>;
|
|
23
|
+
export declare class PollCycle extends PollCycle_base {
|
|
24
|
+
}
|
|
25
|
+
declare const PollingTriggers_base: Context.ServiceClass<PollingTriggers, "@usine/orchestrator/PollingTriggers", {
|
|
26
|
+
/**
|
|
27
|
+
* One cycle over every watched repository. Per-repository failures are
|
|
28
|
+
* isolated, logged, and reported on the cycle — one bad repository never
|
|
29
|
+
* stops its siblings, and only a defect stops the loop.
|
|
30
|
+
*/
|
|
31
|
+
readonly poll: (instance: LoadedInstance) => Effect.Effect<PollCycle, EnginePersistenceError>;
|
|
32
|
+
readonly run: (instance: LoadedInstance) => Effect.Effect<never>;
|
|
33
|
+
readonly latest: Effect.Effect<Option.Option<PollCycle>>;
|
|
34
|
+
}>;
|
|
35
|
+
/** Full selector-pruned GitHub change → snapshot → CEL → Event composition. */
|
|
36
|
+
export declare class PollingTriggers extends PollingTriggers_base {
|
|
37
|
+
static readonly layer: Layer.Layer<PollingTriggers, never, ConfigParser | CursorStore | ExpressionEngine | GitHubPolling | ItemProjectionWriter | LoopControl | RepositoryLabelProjectionWriter | RunEngine>;
|
|
38
|
+
}
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=polling-triggers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polling-triggers.d.ts","sourceRoot":"","sources":["../src/polling-triggers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAGZ,KAAK,cAAc,EAKpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAEL,WAAW,EACX,KAAK,sBAAsB,EAK3B,oBAAoB,EACpB,WAAW,EAEX,+BAA+B,EAC/B,SAAS,EAGV,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAwB,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EACL,aAAa,EAQd,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,OAAO,EAGP,MAAM,EACN,KAAK,EACL,MAAM,EAGN,MAAM,EACP,MAAM,QAAQ,CAAC;;;;;;AA0BhB,mFAAmF;AACnF,qBAAa,qBAAsB,SAAQ,0BAMzC;CAAG;;;;;IAMH,oEAAoE;;;;;AAJtE,qBAAa,SAAU,SAAQ,cAQ7B;CAAG;;IAsGD;;;;OAIG;mBACY,CAAC,QAAQ,EAAE,cAAc,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,sBAAsB,CAAC;kBAC/E,CAAC,QAAQ,EAAE,cAAc,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;;AAX5D,+EAA+E;AAC/E,qBAAa,eAAgB,SAAQ,oBAYK;IACxC,MAAM,CAAC,QAAQ,CAAC,KAAK,wLAmYnB;CACH"}
|