@usine/orchestrator 0.0.1 → 0.2.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 +146 -2
- package/dist/board/items.d.ts +18 -0
- package/dist/board/items.d.ts.map +1 -0
- package/dist/board/items.js +46 -0
- package/dist/board/items.js.map +1 -0
- package/dist/board/projection.d.ts +9 -0
- package/dist/board/projection.d.ts.map +1 -0
- package/dist/board/projection.js +111 -0
- package/dist/board/projection.js.map +1 -0
- package/dist/board/tasks.d.ts +8 -0
- package/dist/board/tasks.d.ts.map +1 -0
- package/dist/board/tasks.js +86 -0
- package/dist/board/tasks.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 +8 -0
- package/dist/exe-dev.d.ts.map +1 -0
- package/dist/exe-dev.js +17 -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 +31 -0
- package/dist/idle-triggers.js.map +1 -0
- package/dist/label-reconciler.d.ts +30 -0
- package/dist/label-reconciler.d.ts.map +1 -0
- package/dist/label-reconciler.js +119 -0
- package/dist/label-reconciler.js.map +1 -0
- package/dist/local.d.ts +25 -0
- package/dist/local.d.ts.map +1 -0
- package/dist/local.js +53 -0
- package/dist/local.js.map +1 -0
- package/dist/operator/attempt.d.ts +66 -0
- package/dist/operator/attempt.d.ts.map +1 -0
- package/dist/operator/attempt.js +58 -0
- package/dist/operator/attempt.js.map +1 -0
- package/dist/operator/board.d.ts +119 -0
- package/dist/operator/board.d.ts.map +1 -0
- package/dist/operator/board.js +101 -0
- package/dist/operator/board.js.map +1 -0
- package/dist/operator/http.d.ts +114 -0
- package/dist/operator/http.d.ts.map +1 -0
- package/dist/operator/http.js +139 -0
- package/dist/operator/http.js.map +1 -0
- package/dist/operator/need.d.ts +66 -0
- package/dist/operator/need.d.ts.map +1 -0
- package/dist/operator/need.js +70 -0
- package/dist/operator/need.js.map +1 -0
- package/dist/operator/operator.d.ts +64 -0
- package/dist/operator/operator.d.ts.map +1 -0
- package/dist/operator/operator.js +363 -0
- package/dist/operator/operator.js.map +1 -0
- package/dist/operator/overview.d.ts +51 -0
- package/dist/operator/overview.d.ts.map +1 -0
- package/dist/operator/overview.js +48 -0
- package/dist/operator/overview.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 +138 -0
- package/dist/operator/projection.js.map +1 -0
- package/dist/operator/run.d.ts +38 -0
- package/dist/operator/run.d.ts.map +1 -0
- package/dist/operator/run.js +41 -0
- package/dist/operator/run.js.map +1 -0
- package/dist/operator/transcript.d.ts +57 -0
- package/dist/operator/transcript.d.ts.map +1 -0
- package/dist/operator/transcript.js +59 -0
- package/dist/operator/transcript.js.map +1 -0
- package/dist/orchestrator.d.ts +14 -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/cycle.d.ts +51 -0
- package/dist/polling/cycle.d.ts.map +1 -0
- package/dist/polling/cycle.js +44 -0
- package/dist/polling/cycle.js.map +1 -0
- package/dist/polling/hints.d.ts +20 -0
- package/dist/polling/hints.d.ts.map +1 -0
- package/dist/polling/hints.js +54 -0
- package/dist/polling/hints.js.map +1 -0
- package/dist/polling/loop-evaluation.d.ts +21 -0
- package/dist/polling/loop-evaluation.d.ts.map +1 -0
- package/dist/polling/loop-evaluation.js +131 -0
- package/dist/polling/loop-evaluation.js.map +1 -0
- package/dist/polling/polling.d.ts +36 -0
- package/dist/polling/polling.d.ts.map +1 -0
- package/dist/polling/polling.js +296 -0
- package/dist/polling/polling.js.map +1 -0
- package/dist/polling/repository-sync.d.ts +45 -0
- package/dist/polling/repository-sync.d.ts.map +1 -0
- package/dist/polling/repository-sync.js +169 -0
- package/dist/polling/repository-sync.js.map +1 -0
- package/dist/polling-triggers.d.ts +4 -0
- package/dist/polling-triggers.d.ts.map +1 -0
- package/dist/polling-triggers.js +4 -0
- package/dist/polling-triggers.js.map +1 -0
- package/dist/schedule-triggers.d.ts +67 -0
- package/dist/schedule-triggers.d.ts.map +1 -0
- package/dist/schedule-triggers.js +401 -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 +107 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/trigger-submission.d.ts +69 -0
- package/dist/trigger-submission.d.ts.map +1 -0
- package/dist/trigger-submission.js +108 -0
- package/dist/trigger-submission.js.map +1 -0
- package/package.json +67 -5
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -8
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ManagedRepo } from "@usine/config/factory";
|
|
2
|
+
import { ConfigParser } from "@usine/config/parser";
|
|
3
|
+
import { RunEngine } from "@usine/engine/engine";
|
|
4
|
+
import type { ObservedItem } from "./repository-sync.ts";
|
|
5
|
+
import { ExpressionEngine } from "@usine/expression/expression-engine";
|
|
6
|
+
import { InvalidGitHubResponseError } from "@usine/github/github-app";
|
|
7
|
+
import { Effect } from "effect";
|
|
8
|
+
import { type ResolvedLoop } from "../trigger-submission.ts";
|
|
9
|
+
import { RepositoryPollFailure } from "./cycle.ts";
|
|
10
|
+
/**
|
|
11
|
+
* Evaluates an already projected Item against its repository's active Loops,
|
|
12
|
+
* renders matching prompts, and submits or revokes Runs. Prompt-render failures
|
|
13
|
+
* are reported per Loop; expression and Run failures stop the repository before
|
|
14
|
+
* its cursor commits. Schedule Ticks have separate evaluation semantics.
|
|
15
|
+
*/
|
|
16
|
+
export declare const evaluateItem: (repository: ManagedRepo, resolved: readonly ResolvedLoop[], observed: ObservedItem) => Effect.Effect<{
|
|
17
|
+
submissions: (import("@usine/engine/engine").Claimed | import("@usine/engine/engine").CycleBlocked | import("@usine/engine/engine").Ignored | import("@usine/engine/engine").Queued)[];
|
|
18
|
+
revokedRuns: number;
|
|
19
|
+
failures: RepositoryPollFailure[];
|
|
20
|
+
}, import("@usine/engine/engine").AttemptCancellationError | import("@usine/engine/engine").EnginePersistenceError | import("@usine/expression/expression-engine").ExpressionCheckError | import("@usine/expression/expression-engine").ExpressionEvaluationError | InvalidGitHubResponseError | import("@usine/engine/engine").RunNotFoundError | import("@usine/engine/engine").RunOperationRejectedError, ConfigParser | ExpressionEngine | RunEngine>;
|
|
21
|
+
//# sourceMappingURL=loop-evaluation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-evaluation.d.ts","sourceRoot":"","sources":["../../src/polling/loop-evaluation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAKpD,OAAO,EAAE,SAAS,EAAyB,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAY,MAAM,EAAkB,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAGL,KAAK,YAAY,EAGlB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AA0BnD;;;;;GAKG;AACH,eAAO,MAAM,YAAY;;;;ybA4HvB,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { ConfigParser } from "@usine/config/parser";
|
|
2
|
+
import { environmentFor, repositoryContext } from "@usine/config/payload-slices";
|
|
3
|
+
import { AttemptTask } from "@usine/core/attempt";
|
|
4
|
+
import { DedupKey } from "@usine/core/event";
|
|
5
|
+
import { CommitSha, RepositoryRevision, canonicalRepositoryName } from "@usine/core/repository";
|
|
6
|
+
import { RunEngine } from "@usine/engine/engine";
|
|
7
|
+
import { ExpressionEngine } from "@usine/expression/expression-engine";
|
|
8
|
+
import { InvalidGitHubResponseError } from "@usine/github/github-app";
|
|
9
|
+
import { DateTime, Effect, Result, Schema } from "effect";
|
|
10
|
+
import { configFileErrorLogFields, DEFAULT_BRANCH_REVISION, submissionLogFields, triggerSubmission, } from "../trigger-submission.js";
|
|
11
|
+
import { RepositoryPollFailure } from "./cycle.js";
|
|
12
|
+
const eventKey = (loop, repository, { projection: item, cycleGeneration }) => DedupKey.make(JSON.stringify([
|
|
13
|
+
loop.name,
|
|
14
|
+
canonicalRepositoryName(repository.name),
|
|
15
|
+
item.number,
|
|
16
|
+
item.contentHash,
|
|
17
|
+
// Preserve pre-budget identities while making every reset a fresh Event
|
|
18
|
+
// with the current rendered task, Agent and authored limit.
|
|
19
|
+
...(cycleGeneration === 0 ? [] : [cycleGeneration]),
|
|
20
|
+
]));
|
|
21
|
+
/**
|
|
22
|
+
* Evaluates an already projected Item against its repository's active Loops,
|
|
23
|
+
* renders matching prompts, and submits or revokes Runs. Prompt-render failures
|
|
24
|
+
* are reported per Loop; expression and Run failures stop the repository before
|
|
25
|
+
* its cursor commits. Schedule Ticks have separate evaluation semantics.
|
|
26
|
+
*/
|
|
27
|
+
export const evaluateItem = Effect.fn("PollingTriggers.evaluateItem")(function* (repository, resolved, observed) {
|
|
28
|
+
const { projection: item, cycleGeneration } = observed;
|
|
29
|
+
yield* Effect.annotateCurrentSpan({
|
|
30
|
+
repository: repository.name,
|
|
31
|
+
item: item.number,
|
|
32
|
+
});
|
|
33
|
+
const config = yield* ConfigParser;
|
|
34
|
+
const expressions = yield* ExpressionEngine;
|
|
35
|
+
const runs = yield* RunEngine;
|
|
36
|
+
const loops = resolved.filter(({ loop }) => loop.trigger.on === item.source);
|
|
37
|
+
const payload = item.payload;
|
|
38
|
+
const context = { repo: repositoryContext(repository), item: payload };
|
|
39
|
+
if (loops.length === 0) {
|
|
40
|
+
yield* Effect.logDebug("Item projected without any matching repository Loop", {
|
|
41
|
+
repository: repository.name,
|
|
42
|
+
item: item.number,
|
|
43
|
+
stream: item.source,
|
|
44
|
+
});
|
|
45
|
+
return { submissions: [], revokedRuns: 0, failures: [] };
|
|
46
|
+
}
|
|
47
|
+
const submissions = [];
|
|
48
|
+
// Projections store generic JSON; decode the GitHub PR revision at this boundary.
|
|
49
|
+
const revision = item.source === "pr"
|
|
50
|
+
? RepositoryRevision.make(yield* Schema.decodeUnknownEffect(CommitSha)(payload.headRefOid).pipe(Effect.mapError(() => new InvalidGitHubResponseError({
|
|
51
|
+
operation: "fetch-pull-request-snapshot",
|
|
52
|
+
message: "The pull request payload has no valid head commit",
|
|
53
|
+
detail: `PR ${item.number} requires a full headRefOid`,
|
|
54
|
+
}))))
|
|
55
|
+
: DEFAULT_BRANCH_REVISION;
|
|
56
|
+
const failures = [];
|
|
57
|
+
let revokedRuns = 0;
|
|
58
|
+
for (const { agent, loop, parentModel } of loops) {
|
|
59
|
+
yield* Effect.annotateCurrentSpan({ loop: loop.name, agent: agent.name });
|
|
60
|
+
const matches = yield* expressions.evaluateBoolean(loop.trigger.if, environmentFor(loop.trigger.on), context);
|
|
61
|
+
if (!matches) {
|
|
62
|
+
yield* Effect.logDebug("Item did not match its loop expression", {
|
|
63
|
+
repository: repository.name,
|
|
64
|
+
loop: loop.name,
|
|
65
|
+
agent: agent.name,
|
|
66
|
+
item: item.number,
|
|
67
|
+
});
|
|
68
|
+
const revoked = yield* runs.revoke(loop.name, item.itemKey);
|
|
69
|
+
revokedRuns += revoked.length;
|
|
70
|
+
if (revoked.length > 0) {
|
|
71
|
+
yield* Effect.logInfo("Item stopped matching; revoked its unstarted runs", {
|
|
72
|
+
repository: repository.name,
|
|
73
|
+
loop: loop.name,
|
|
74
|
+
agent: agent.name,
|
|
75
|
+
item: item.number,
|
|
76
|
+
runIds: revoked.join(", "),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const dedupKey = eventKey(loop, repository, observed);
|
|
82
|
+
const receivedAt = yield* DateTime.now;
|
|
83
|
+
// A render failure comes from the loop's authoring, not transport, so
|
|
84
|
+
// re-polling would fail the same way. It is scoped to this loop so the
|
|
85
|
+
// sibling loops and the cursor still advance.
|
|
86
|
+
const rendered = yield* Effect.result(config.renderPrompt(loop, context));
|
|
87
|
+
if (Result.isFailure(rendered)) {
|
|
88
|
+
yield* Effect.logError("Loop prompt rendering failed; sibling loops were unaffected", {
|
|
89
|
+
loop: loop.name,
|
|
90
|
+
repository: repository.name,
|
|
91
|
+
agent: agent.name,
|
|
92
|
+
item: item.number,
|
|
93
|
+
errorTag: rendered.failure._tag,
|
|
94
|
+
message: rendered.failure.message,
|
|
95
|
+
...configFileErrorLogFields(rendered.failure),
|
|
96
|
+
});
|
|
97
|
+
failures.push(new RepositoryPollFailure({
|
|
98
|
+
repository: repository.name,
|
|
99
|
+
errorTag: rendered.failure._tag,
|
|
100
|
+
message: rendered.failure.message,
|
|
101
|
+
}));
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const submitted = yield* runs.submit(triggerSubmission({
|
|
105
|
+
dedupKey,
|
|
106
|
+
cycleGeneration,
|
|
107
|
+
itemKey: item.itemKey,
|
|
108
|
+
loop,
|
|
109
|
+
payload,
|
|
110
|
+
receivedAt,
|
|
111
|
+
repository,
|
|
112
|
+
revision,
|
|
113
|
+
task: AttemptTask.make(rendered.success),
|
|
114
|
+
agent,
|
|
115
|
+
parentModel,
|
|
116
|
+
}));
|
|
117
|
+
yield* Effect.logInfo("Submitted matching item state", {
|
|
118
|
+
repository: repository.name,
|
|
119
|
+
loop: loop.name,
|
|
120
|
+
agent: agent.name,
|
|
121
|
+
item: item.number,
|
|
122
|
+
contentHash: item.contentHash,
|
|
123
|
+
revision,
|
|
124
|
+
result: submitted._tag,
|
|
125
|
+
...submissionLogFields(submitted),
|
|
126
|
+
});
|
|
127
|
+
submissions.push(submitted);
|
|
128
|
+
}
|
|
129
|
+
return { submissions, revokedRuns, failures };
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=loop-evaluation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-evaluation.js","sourceRoot":"","sources":["../../src/polling/loop-evaluation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { LoadedInstance } from "@usine/config/instance";
|
|
2
|
+
import { ConfigParser } from "@usine/config/parser";
|
|
3
|
+
import { type RepositoryName } from "@usine/core/repository";
|
|
4
|
+
import { CursorStore } from "@usine/engine/cursor";
|
|
5
|
+
import { CycleBudgets } from "@usine/engine/cycle-budget";
|
|
6
|
+
import { RunEngine, type EnginePersistenceError } from "@usine/engine/engine";
|
|
7
|
+
import { ItemProjectionWriter } from "@usine/engine/item-projection";
|
|
8
|
+
import { LoopControl } from "@usine/engine/loop-control";
|
|
9
|
+
import { RepositoryLabelProjectionReader, RepositoryLabelProjectionWriter } from "@usine/engine/repository-label-projection";
|
|
10
|
+
import { ExpressionEngine } from "@usine/expression/expression-engine";
|
|
11
|
+
import { type ChangedItem, GitHubPolling } from "@usine/github/polling";
|
|
12
|
+
import { Context, DateTime, Effect, Layer, Option } from "effect";
|
|
13
|
+
import { LabelReconciler } from "../label-reconciler.ts";
|
|
14
|
+
import { PollCycle } from "./cycle.ts";
|
|
15
|
+
declare const PollingTriggers_base: Context.ServiceClass<PollingTriggers, "@usine/orchestrator/PollingTriggers", {
|
|
16
|
+
/**
|
|
17
|
+
* Polls every managed repository, including those without active Loops.
|
|
18
|
+
* Label preflight precedes change detection; each changed Item is projected
|
|
19
|
+
* before its Run decisions. A repository commits its cursor only after all
|
|
20
|
+
* Items finish. Repository failures are reported while siblings continue;
|
|
21
|
+
* failure to read Loop runtime state fails the whole cycle.
|
|
22
|
+
*/
|
|
23
|
+
readonly poll: (instance: LoadedInstance) => Effect.Effect<PollCycle, EnginePersistenceError>;
|
|
24
|
+
/** Nudges an authoritative Item fetch after a self-write, retaining any request backoff from the writer. Pending duplicates coalesce; polling repairs loss. */
|
|
25
|
+
readonly hint: (repository: RepositoryName, item: ChangedItem, backoffUntil?: Option.Option<DateTime.Utc>) => Effect.Effect<void>;
|
|
26
|
+
/** Repeats cycles at the configured interval and processes self-write Hints, respecting GitHub request backoff. */
|
|
27
|
+
readonly run: (instance: LoadedInstance) => Effect.Effect<never>;
|
|
28
|
+
/** The last completed cycle, including its isolated failures; absent until the first cycle completes. */
|
|
29
|
+
readonly latest: Effect.Effect<Option.Option<PollCycle>>;
|
|
30
|
+
}>;
|
|
31
|
+
/** Keeps managed repositories' Boards current and evaluates their active Loops against changed Items. */
|
|
32
|
+
export declare class PollingTriggers extends PollingTriggers_base {
|
|
33
|
+
static readonly layer: Layer.Layer<PollingTriggers, never, ConfigParser | CursorStore | CycleBudgets | ExpressionEngine | GitHubPolling | ItemProjectionWriter | LabelReconciler | LoopControl | RepositoryLabelProjectionReader | RepositoryLabelProjectionWriter | RunEngine>;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=polling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polling.d.ts","sourceRoot":"","sources":["../../src/polling/polling.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAa,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EACL,SAAS,EACT,KAAK,sBAAsB,EAE5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EACL,+BAA+B,EAC/B,+BAA+B,EAChC,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,KAAK,WAAW,EAAyB,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EAEL,OAAO,EACP,QAAQ,EAER,MAAM,EACN,KAAK,EACL,MAAM,EAKP,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,eAAe,EAA8B,MAAM,wBAAwB,CAAC;AAErF,OAAO,EAGL,SAAS,EAIV,MAAM,YAAY,CAAC;;IAmEhB;;;;;;OAMG;mBACY,CAAC,QAAQ,EAAE,cAAc,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC7F,+JAA+J;mBAChJ,CACb,UAAU,EAAE,cAAc,EAC1B,IAAI,EAAE,WAAW,EACjB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KACvC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IACxB,mHAAmH;kBACrG,CAAC,QAAQ,EAAE,cAAc,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;IAChE,yGAAyG;qBACxF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;;AArB5D,yGAAyG;AACzG,qBAAa,eAAgB,SAAQ,oBAsBK;IACxC,MAAM,CAAC,QAAQ,CAAC,KAAK,2PAyVkB;CACxC"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { ConfigParser } from "@usine/config/parser";
|
|
2
|
+
import { matchesSelector } from "@usine/config/selector";
|
|
3
|
+
import { canonicalRepositoryName } from "@usine/core/repository";
|
|
4
|
+
import { CursorKey, CursorStore } from "@usine/engine/cursor";
|
|
5
|
+
import { CycleBudgets } from "@usine/engine/cycle-budget";
|
|
6
|
+
import { RunEngine, } from "@usine/engine/engine";
|
|
7
|
+
import { ItemProjectionWriter } from "@usine/engine/item-projection";
|
|
8
|
+
import { LoopControl } from "@usine/engine/loop-control";
|
|
9
|
+
import { RepositoryLabelProjectionReader, RepositoryLabelProjectionWriter, } from "@usine/engine/repository-label-projection";
|
|
10
|
+
import { ExpressionEngine } from "@usine/expression/expression-engine";
|
|
11
|
+
import { EntityTag, PollCursor, GitHubPolling } from "@usine/github/polling";
|
|
12
|
+
import { Clock, Context, DateTime, Duration, Effect, Layer, Option, Ref, Result, Schema, Semaphore, } from "effect";
|
|
13
|
+
import { LabelReconciler } from "../label-reconciler.js";
|
|
14
|
+
import { resolveTriggerLoops } from "../trigger-submission.js";
|
|
15
|
+
import { latestPollAt, PollCycle, RepositoryPollFailure, repositoryFailureLogFields, } from "./cycle.js";
|
|
16
|
+
import { evaluateItem } from "./loop-evaluation.js";
|
|
17
|
+
import { observeItem, synchronizeLabels } from "./repository-sync.js";
|
|
18
|
+
import { ItemHints } from "./hints.js";
|
|
19
|
+
/** GitHub tolerates a handful of parallel REST and GraphQL calls per token. */
|
|
20
|
+
const REPOSITORY_CONCURRENCY = 4;
|
|
21
|
+
const ITEM_CONCURRENCY = 4;
|
|
22
|
+
const WatchKey = Schema.NonEmptyString.pipe(Schema.brand("GitHubPollWatchKey"));
|
|
23
|
+
class StoredPollCursor extends Schema.Class("@usine/orchestrator/StoredPollCursor")({
|
|
24
|
+
boardVersion: Schema.Literal(4),
|
|
25
|
+
cursor: PollCursor,
|
|
26
|
+
labelEntityTag: Schema.OptionFromNullOr(EntityTag),
|
|
27
|
+
watches: Schema.Array(WatchKey).check(Schema.isUnique()),
|
|
28
|
+
}) {
|
|
29
|
+
}
|
|
30
|
+
const cursorKey = (repository) => CursorKey.make(`github-poll:${canonicalRepositoryName(repository.name)}`);
|
|
31
|
+
const watchKey = ({ loop }) => WatchKey.make(JSON.stringify([loop.name, loop.trigger.on, loop.trigger.if]));
|
|
32
|
+
const watchedRepositories = (instance, resolved) => instance.config.repos.map((repository) => {
|
|
33
|
+
const loops = resolved.filter(({ loop }) => loop.trigger.on !== "schedule" && matchesSelector(loop.selector, repository));
|
|
34
|
+
return {
|
|
35
|
+
repository,
|
|
36
|
+
declaredLabels: instance.config.labels,
|
|
37
|
+
loops,
|
|
38
|
+
watches: loops.map(watchKey).sort(),
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
const sameWatches = (left, right) => left.length === right.length && left.every((value, index) => value === right[index]);
|
|
42
|
+
/** Keeps managed repositories' Boards current and evaluates their active Loops against changed Items. */
|
|
43
|
+
export class PollingTriggers extends Context.Service()("@usine/orchestrator/PollingTriggers") {
|
|
44
|
+
static layer = Layer.effect(PollingTriggers, Effect.gen(function* () {
|
|
45
|
+
const cursors = yield* CursorStore;
|
|
46
|
+
const budgets = yield* CycleBudgets;
|
|
47
|
+
const github = yield* GitHubPolling;
|
|
48
|
+
const loops = yield* LoopControl;
|
|
49
|
+
const latest = yield* Ref.make(Option.none());
|
|
50
|
+
const hints = yield* ItemHints;
|
|
51
|
+
const ownership = yield* Semaphore.make(1);
|
|
52
|
+
const emptyCursor = (watches) => new StoredPollCursor({
|
|
53
|
+
boardVersion: 4,
|
|
54
|
+
cursor: PollCursor.empty,
|
|
55
|
+
labelEntityTag: Option.none(),
|
|
56
|
+
watches,
|
|
57
|
+
});
|
|
58
|
+
const readCursor = Effect.fn("PollingTriggers.readCursor")(function* (watched) {
|
|
59
|
+
yield* Effect.annotateCurrentSpan({ repository: watched.repository.name });
|
|
60
|
+
const stored = yield* cursors.read(cursorKey(watched.repository), StoredPollCursor);
|
|
61
|
+
if (Option.isNone(stored))
|
|
62
|
+
return emptyCursor(watched.watches);
|
|
63
|
+
if (!sameWatches(stored.value.watches, watched.watches)) {
|
|
64
|
+
yield* Effect.logInfo("Watched loops changed; re-polling the repository from scratch", {
|
|
65
|
+
repository: watched.repository.name,
|
|
66
|
+
previousWatches: stored.value.watches.length,
|
|
67
|
+
currentWatches: watched.watches.length,
|
|
68
|
+
});
|
|
69
|
+
return emptyCursor(watched.watches);
|
|
70
|
+
}
|
|
71
|
+
return stored.value;
|
|
72
|
+
});
|
|
73
|
+
const writeCursor = Effect.fn("PollingTriggers.writeCursor")(function* (watched, cursor) {
|
|
74
|
+
yield* Effect.annotateCurrentSpan({ repository: watched.repository.name });
|
|
75
|
+
yield* cursors.write(cursorKey(watched.repository), StoredPollCursor, cursor);
|
|
76
|
+
});
|
|
77
|
+
const pollRepository = Effect.fn("PollingTriggers.pollRepository")(function* (watched) {
|
|
78
|
+
yield* Effect.annotateCurrentSpan({ repository: watched.repository.name });
|
|
79
|
+
const resets = (yield* budgets.pendingResets()).filter(({ repository }) => canonicalRepositoryName(repository) ===
|
|
80
|
+
canonicalRepositoryName(watched.repository.name));
|
|
81
|
+
const stored = resets.length > 0 ? emptyCursor(watched.watches) : yield* readCursor(watched);
|
|
82
|
+
if (resets.length > 0)
|
|
83
|
+
yield* Effect.logInfo("Cycle budget reset requests fresh repository polling", {
|
|
84
|
+
repository: watched.repository.name,
|
|
85
|
+
items: resets.map(({ itemKey }) => itemKey),
|
|
86
|
+
});
|
|
87
|
+
const preflight = yield* synchronizeLabels(watched.repository.name, watched.declaredLabels, stored.labelEntityTag);
|
|
88
|
+
yield* hints.defer(preflight.nextPollAt);
|
|
89
|
+
return yield* Effect.gen(function* () {
|
|
90
|
+
// Label creation finishes before change detection and Item evaluation
|
|
91
|
+
// begin, including on the first cycle after `usine up`.
|
|
92
|
+
const detected = yield* github.changes(watched.repository.name, stored.cursor);
|
|
93
|
+
yield* hints.defer(detected.backoffUntil);
|
|
94
|
+
const nextCursor = new StoredPollCursor({
|
|
95
|
+
boardVersion: 4,
|
|
96
|
+
cursor: detected.cursor,
|
|
97
|
+
labelEntityTag: preflight.labelEntityTag,
|
|
98
|
+
watches: watched.watches,
|
|
99
|
+
});
|
|
100
|
+
const nextPollAt = latestPollAt([detected.nextPollAt, preflight.nextPollAt]);
|
|
101
|
+
if (detected._tag === "RepositoryNotModified") {
|
|
102
|
+
if (preflight.entityTagChanged) {
|
|
103
|
+
yield* writeCursor(watched, nextCursor);
|
|
104
|
+
}
|
|
105
|
+
yield* Effect.logDebug("Repository unchanged (304)", {
|
|
106
|
+
repository: watched.repository.name,
|
|
107
|
+
});
|
|
108
|
+
return {
|
|
109
|
+
changedItems: 0,
|
|
110
|
+
submissions: [],
|
|
111
|
+
revokedRuns: 0,
|
|
112
|
+
failures: preflight.failures,
|
|
113
|
+
preflightFindings: preflight.preflightFindings,
|
|
114
|
+
nextPollAt,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
yield* Effect.logInfo("Repository changed", {
|
|
118
|
+
repository: watched.repository.name,
|
|
119
|
+
changedItems: detected.items.length,
|
|
120
|
+
backlog: detected.backlog,
|
|
121
|
+
});
|
|
122
|
+
const itemCycles = yield* Effect.forEach(detected.items, (item) => observeItem(watched.repository.name, item).pipe(Effect.flatMap((projection) => evaluateItem(watched.repository, watched.loops, projection))), { concurrency: ITEM_CONCURRENCY });
|
|
123
|
+
// Advancing the cursor is the commit point: every changed item was
|
|
124
|
+
// fetched, evaluated, and submitted or revoked. After a failure the
|
|
125
|
+
// old cursor stays so the next cycle re-polls.
|
|
126
|
+
yield* writeCursor(watched, nextCursor);
|
|
127
|
+
yield* Effect.forEach(resets, budgets.acknowledgeReset, { discard: true });
|
|
128
|
+
return {
|
|
129
|
+
changedItems: detected.items.length,
|
|
130
|
+
submissions: itemCycles.flatMap(({ submissions }) => submissions),
|
|
131
|
+
revokedRuns: itemCycles.reduce((sum, cycle) => sum + cycle.revokedRuns, 0),
|
|
132
|
+
failures: [...preflight.failures, ...itemCycles.flatMap(({ failures }) => failures)],
|
|
133
|
+
preflightFindings: preflight.preflightFindings,
|
|
134
|
+
nextPollAt,
|
|
135
|
+
};
|
|
136
|
+
}).pipe(Effect.mapError((error) => ({
|
|
137
|
+
_tag: "InterruptedRepositoryCycle",
|
|
138
|
+
error,
|
|
139
|
+
failures: preflight.failures,
|
|
140
|
+
preflightFindings: preflight.preflightFindings,
|
|
141
|
+
nextPollAt: preflight.nextPollAt,
|
|
142
|
+
})));
|
|
143
|
+
});
|
|
144
|
+
// Bind only dependencies, preserving the caller's clock, logging and
|
|
145
|
+
// tracing context on each cycle instead of capturing them at layer build.
|
|
146
|
+
const repositoryServices = (yield* Effect.context()).pipe(Context.pick(ConfigParser, CycleBudgets, ExpressionEngine, GitHubPolling, ItemProjectionWriter, LabelReconciler, RepositoryLabelProjectionReader, RepositoryLabelProjectionWriter, RunEngine));
|
|
147
|
+
const poll = Effect.fn("PollingTriggers.poll")(function* (instance) {
|
|
148
|
+
yield* hints.awaitBackoff;
|
|
149
|
+
const paused = new Set((yield* loops.states).filter((state) => state.paused).map((state) => state.loop));
|
|
150
|
+
for (const loop of instance.loops) {
|
|
151
|
+
if (loop.trigger.on !== "schedule" && paused.has(loop.name)) {
|
|
152
|
+
yield* Effect.logDebug("Paused Loop skipped during repository polling", {
|
|
153
|
+
loop: loop.name,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const resolved = (yield* resolveTriggerLoops(instance)).filter(({ loop }) => !paused.has(loop.name));
|
|
158
|
+
const watched = watchedRepositories(instance, resolved);
|
|
159
|
+
const settled = yield* Effect.forEach(watched, (repository) => Effect.result(pollRepository(repository)).pipe(Effect.map((result) => ({ repository, result }))), { concurrency: REPOSITORY_CONCURRENCY });
|
|
160
|
+
const cycles = [];
|
|
161
|
+
const failures = [];
|
|
162
|
+
const backoffs = [];
|
|
163
|
+
const preflightFindings = [];
|
|
164
|
+
for (const { repository, result } of settled) {
|
|
165
|
+
if (Result.isSuccess(result)) {
|
|
166
|
+
cycles.push(result.success);
|
|
167
|
+
preflightFindings.push(...result.success.preflightFindings);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
const interrupted = result.failure._tag === "InterruptedRepositoryCycle";
|
|
171
|
+
const error = interrupted ? result.failure.error : result.failure;
|
|
172
|
+
if (interrupted) {
|
|
173
|
+
failures.push(...result.failure.failures);
|
|
174
|
+
preflightFindings.push(...result.failure.preflightFindings);
|
|
175
|
+
backoffs.push(result.failure.nextPollAt);
|
|
176
|
+
yield* hints.defer(result.failure.nextPollAt);
|
|
177
|
+
}
|
|
178
|
+
if (error._tag === "GitHubRateLimitError") {
|
|
179
|
+
// A rate-limit pause is scheduling input, not a repository failure.
|
|
180
|
+
yield* Effect.logWarning("GitHub rate limit reached; delaying the next cycle", {
|
|
181
|
+
repository: repository.repository.name,
|
|
182
|
+
operation: error.operation,
|
|
183
|
+
retryAt: DateTime.formatIso(error.retryAt),
|
|
184
|
+
});
|
|
185
|
+
backoffs.push(Option.some(error.retryAt));
|
|
186
|
+
yield* hints.defer(Option.some(error.retryAt));
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
yield* Effect.logError("Repository poll cycle failed; siblings were unaffected", {
|
|
190
|
+
repository: repository.repository.name,
|
|
191
|
+
...repositoryFailureLogFields(error),
|
|
192
|
+
});
|
|
193
|
+
failures.push(new RepositoryPollFailure({
|
|
194
|
+
repository: repository.repository.name,
|
|
195
|
+
errorTag: error._tag,
|
|
196
|
+
message: error.message,
|
|
197
|
+
}));
|
|
198
|
+
}
|
|
199
|
+
const cycle = new PollCycle({
|
|
200
|
+
repositories: watched.length,
|
|
201
|
+
changedItems: cycles.reduce((sum, cycle) => sum + cycle.changedItems, 0),
|
|
202
|
+
submissions: cycles.flatMap(({ submissions }) => submissions),
|
|
203
|
+
revokedRuns: cycles.reduce((sum, cycle) => sum + cycle.revokedRuns, 0),
|
|
204
|
+
failures: [...cycles.flatMap(({ failures: isolated }) => isolated), ...failures],
|
|
205
|
+
preflightFindings,
|
|
206
|
+
nextPollAt: latestPollAt([...cycles.map(({ nextPollAt }) => nextPollAt), ...backoffs]),
|
|
207
|
+
});
|
|
208
|
+
yield* Ref.set(latest, Option.some(cycle));
|
|
209
|
+
return cycle;
|
|
210
|
+
}, Effect.provideContext(repositoryServices), ownership.withPermits(1));
|
|
211
|
+
const refreshHint = Effect.fn("PollingTriggers.refreshHint")(function* (instance, hint) {
|
|
212
|
+
yield* Effect.annotateCurrentSpan({
|
|
213
|
+
repository: hint.repository,
|
|
214
|
+
item: hint.item.number,
|
|
215
|
+
});
|
|
216
|
+
yield* hints.awaitBackoff;
|
|
217
|
+
const paused = new Set((yield* loops.states).filter((state) => state.paused).map((state) => state.loop));
|
|
218
|
+
const resolved = (yield* resolveTriggerLoops(instance)).filter(({ loop }) => !paused.has(loop.name));
|
|
219
|
+
const watched = watchedRepositories(instance, resolved).find(({ repository }) => canonicalRepositoryName(repository.name) === canonicalRepositoryName(hint.repository));
|
|
220
|
+
if (watched === undefined) {
|
|
221
|
+
yield* Effect.logInfo("Self-write Hint ignored for an unmanaged repository", {
|
|
222
|
+
repository: hint.repository,
|
|
223
|
+
item: hint.item.number,
|
|
224
|
+
});
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
// Share the normal snapshot, projection and dedup path. Hints never
|
|
228
|
+
// advance a REST cursor or replace the latest complete cycle's findings.
|
|
229
|
+
const observed = yield* observeItem(watched.repository.name, hint.item);
|
|
230
|
+
const result = yield* evaluateItem(watched.repository, watched.loops, observed);
|
|
231
|
+
yield* Effect.logInfo("Self-write Hint refreshed the Item", {
|
|
232
|
+
repository: hint.repository,
|
|
233
|
+
item: hint.item.number,
|
|
234
|
+
submissions: result.submissions.length,
|
|
235
|
+
revokedRuns: result.revokedRuns,
|
|
236
|
+
failures: result.failures.length,
|
|
237
|
+
});
|
|
238
|
+
}, Effect.provideContext(repositoryServices), (effect, _instance, hint) => effect.pipe(Effect.catch((error) => Effect.gen(function* () {
|
|
239
|
+
if (error._tag === "GitHubRateLimitError")
|
|
240
|
+
yield* hints.defer(Option.some(error.retryAt));
|
|
241
|
+
yield* Effect.logWarning("Self-write Hint refresh failed; the normal poll will retry", {
|
|
242
|
+
repository: hint.repository,
|
|
243
|
+
item: hint.item.number,
|
|
244
|
+
...repositoryFailureLogFields(error),
|
|
245
|
+
});
|
|
246
|
+
})), ownership.withPermits(1)));
|
|
247
|
+
const waitForNextPoll = (instance, target) => Effect.gen(function* () {
|
|
248
|
+
while (true) {
|
|
249
|
+
const remaining = target - (yield* Clock.currentTimeMillis);
|
|
250
|
+
if (remaining <= 0)
|
|
251
|
+
return;
|
|
252
|
+
const hint = yield* Effect.raceFirst(hints.take.pipe(Effect.map(Option.some)), Effect.sleep(Duration.millis(remaining)).pipe(Effect.as(Option.none())));
|
|
253
|
+
if (Option.isNone(hint))
|
|
254
|
+
return;
|
|
255
|
+
yield* refreshHint(instance, hint.value);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
// `run` never returns, so wrapping it in Effect.fn would open a span that
|
|
259
|
+
// never closes; `poll` opens the span for each cycle.
|
|
260
|
+
const run = (instance) => Effect.gen(function* () {
|
|
261
|
+
const startedAt = yield* Clock.currentTimeMillis;
|
|
262
|
+
const result = yield* Effect.result(poll(instance));
|
|
263
|
+
if (Result.isFailure(result)) {
|
|
264
|
+
const sleepMs = instance.config.settings.pollInterval * 1_000;
|
|
265
|
+
yield* Effect.logError("Poll cycle could not read Loop runtime state; retrying", {
|
|
266
|
+
errorTag: result.failure._tag,
|
|
267
|
+
message: result.failure.message,
|
|
268
|
+
operation: result.failure.operation,
|
|
269
|
+
sleepMs,
|
|
270
|
+
});
|
|
271
|
+
yield* Effect.sleep(Duration.millis(sleepMs));
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
const cycle = result.success;
|
|
275
|
+
const intervalAt = startedAt + instance.config.settings.pollInterval * 1_000;
|
|
276
|
+
const target = Option.match(cycle.nextPollAt, {
|
|
277
|
+
onNone: () => intervalAt,
|
|
278
|
+
onSome: (value) => Math.max(intervalAt, DateTime.toEpochMillis(value)),
|
|
279
|
+
});
|
|
280
|
+
const now = yield* Clock.currentTimeMillis;
|
|
281
|
+
const sleepMs = Math.max(0, target - now);
|
|
282
|
+
yield* Effect.logInfo("Poll cycle complete", {
|
|
283
|
+
repositories: cycle.repositories,
|
|
284
|
+
changedItems: cycle.changedItems,
|
|
285
|
+
submissions: cycle.submissions.length,
|
|
286
|
+
revokedRuns: cycle.revokedRuns,
|
|
287
|
+
failures: cycle.failures.length,
|
|
288
|
+
preflightFindings: cycle.preflightFindings.length,
|
|
289
|
+
sleepMs,
|
|
290
|
+
});
|
|
291
|
+
yield* waitForNextPoll(instance, target);
|
|
292
|
+
}).pipe(Effect.forever);
|
|
293
|
+
return { latest: Ref.get(latest), poll, run, hint: hints.offer };
|
|
294
|
+
})).pipe(Layer.provide(ItemHints.layer));
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=polling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polling.js","sourceRoot":"","sources":["../../src/polling/polling.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { DeclaredLabel } from "@usine/config/label";
|
|
2
|
+
import { CycleGeneration } from "@usine/core/cycle-budget";
|
|
3
|
+
import { CycleBudgets } from "@usine/engine/cycle-budget";
|
|
4
|
+
import { ItemProjection, ItemProjectionWriter } from "@usine/engine/item-projection";
|
|
5
|
+
import { RepositoryLabelProjectionReader, RepositoryLabelProjectionWriter } from "@usine/engine/repository-label-projection";
|
|
6
|
+
import { GitHubPolling } from "@usine/github/polling";
|
|
7
|
+
import { DateTime, Effect, Option, Schema } from "effect";
|
|
8
|
+
import { LabelReconciler } from "../label-reconciler.ts";
|
|
9
|
+
import { type InterruptedRepositoryCycle, RepositoryPollFailure } from "./cycle.ts";
|
|
10
|
+
/**
|
|
11
|
+
* Identifies one GitHub issue or pull request across its changing snapshots.
|
|
12
|
+
* Encoding uses the canonical repository name and Item number; decoding lets
|
|
13
|
+
* Board consumers locate the Item associated with a Run. Schedule Runs identify
|
|
14
|
+
* the repository alone and do not decode as an Item.
|
|
15
|
+
*/
|
|
16
|
+
export declare const GitHubItemKey: Schema.compose<Schema.fromJsonString<Schema.Tuple<readonly [Schema.Literal<"github">, Schema.brand<Schema.String, "RepositoryName">, Schema.brand<Schema.Int, "ItemNumber">]>>, Schema.toType<Schema.brand<Schema.NonEmptyString, "ItemKey">>>;
|
|
17
|
+
/**
|
|
18
|
+
* Refreshes and reconciles one repository's Board label catalog before change
|
|
19
|
+
* detection. Pass the catalog ETag from its stored poll cursor; the result gives
|
|
20
|
+
* the ETag to persist after Item processing, plus preflight findings and backoff.
|
|
21
|
+
* Failed catalog requests retain the stored projection and defer provisioning;
|
|
22
|
+
* persistence failures stop the repository for retry.
|
|
23
|
+
*/
|
|
24
|
+
export declare const synchronizeLabels: (repository: string & import("effect/Brand").Brand<"RepositoryName">, declared: readonly DeclaredLabel[], entityTag: Option.Option<string & import("effect/Brand").Brand<"GitHubEntityTag">>) => Effect.Effect<{
|
|
25
|
+
labelEntityTag: Option.None<string & import("effect/Brand").Brand<"GitHubEntityTag">> | Option.Some<string & import("effect/Brand").Brand<"GitHubEntityTag">>;
|
|
26
|
+
entityTagChanged: boolean;
|
|
27
|
+
failures: never[] | RepositoryPollFailure[];
|
|
28
|
+
preflightFindings: readonly import("../label-reconciler.ts").LabelPreflightFinding[];
|
|
29
|
+
nextPollAt: Option.Option<DateTime.Utc>;
|
|
30
|
+
}, import("@usine/engine/engine").EnginePersistenceError | InterruptedRepositoryCycle, GitHubPolling | LabelReconciler | RepositoryLabelProjectionReader | RepositoryLabelProjectionWriter>;
|
|
31
|
+
/** A fetched snapshot paired with the allowance observed before its request began. */
|
|
32
|
+
export interface ObservedItem {
|
|
33
|
+
readonly projection: ItemProjection;
|
|
34
|
+
readonly cycleGeneration: CycleGeneration;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Fetches a detected Item and durably updates its Board projection regardless of
|
|
38
|
+
* whether any Loop applies. Evaluation uses the returned projection's snapshot,
|
|
39
|
+
* identity and content hash, so Board observation and Run decisions agree.
|
|
40
|
+
*/
|
|
41
|
+
export declare const observeItem: (repository: string & import("effect/Brand").Brand<"RepositoryName">, changed: import("@usine/github/polling").ChangedIssue | import("@usine/github/polling").ChangedPullRequest) => Effect.Effect<{
|
|
42
|
+
projection: ItemProjection;
|
|
43
|
+
cycleGeneration: number & import("effect/Brand").Brand<"CycleGeneration">;
|
|
44
|
+
}, import("@usine/github/github-app").AppPermissionError | import("@usine/engine/engine").EnginePersistenceError | import("@usine/github/github-app").GitHubApiError | import("@usine/github/github-app").GitHubRateLimitError | import("@usine/github/github-app").InstallationDiscoveryError | import("@usine/github/github-app").InvalidGitHubResponseError, CycleBudgets | GitHubPolling | ItemProjectionWriter>;
|
|
45
|
+
//# sourceMappingURL=repository-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository-sync.d.ts","sourceRoot":"","sources":["../../src/polling/repository-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D,OAAO,EAEL,cAAc,EAEd,oBAAoB,EACrB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAGL,+BAA+B,EAC/B,+BAA+B,EAChC,MAAM,2CAA2C,CAAC;AAEnD,OAAO,EAGL,aAAa,EAGd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAClE,OAAO,EAA4B,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EACL,KAAK,0BAA0B,EAE/B,qBAAqB,EAEtB,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,eAAO,MAAM,aAAa,gPAIzB,CAAC;AA8GF;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB;;;;;;2LAwC5B,CAAC;AAEH,sFAAsF;AACtF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;CAC3C;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW;;;oZA+BtB,CAAC"}
|