@telora/daemon 0.24.58 → 0.24.64
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/build-info.json +6 -3
- package/dist/ci/ci-run-spans.d.ts +140 -0
- package/dist/ci/ci-run-spans.d.ts.map +1 -0
- package/dist/ci/ci-run-spans.js +147 -0
- package/dist/ci/ci-run-spans.js.map +1 -0
- package/dist/ci/ci-sensor-loop.d.ts +8 -0
- package/dist/ci/ci-sensor-loop.d.ts.map +1 -1
- package/dist/ci/ci-sensor-loop.js +4 -0
- package/dist/ci/ci-sensor-loop.js.map +1 -1
- package/dist/ci/ci-status.d.ts +15 -0
- package/dist/ci/ci-status.d.ts.map +1 -1
- package/dist/ci/ci-status.js +43 -8
- package/dist/ci/ci-status.js.map +1 -1
- package/dist/composition/engine-start-context.d.ts.map +1 -1
- package/dist/composition/engine-start-context.js +8 -1
- package/dist/composition/engine-start-context.js.map +1 -1
- package/dist/composition/execution-ci-context.d.ts +3 -0
- package/dist/composition/execution-ci-context.d.ts.map +1 -1
- package/dist/composition/execution-ci-context.js +37 -1
- package/dist/composition/execution-ci-context.js.map +1 -1
- package/dist/composition/focus-activity-live-sources.d.ts.map +1 -1
- package/dist/composition/focus-activity-live-sources.js +5 -1
- package/dist/composition/focus-activity-live-sources.js.map +1 -1
- package/dist/composition/verification-context.d.ts.map +1 -1
- package/dist/composition/verification-context.js +5 -1
- package/dist/composition/verification-context.js.map +1 -1
- package/dist/delivery/delivery-reconciler-apply.d.ts.map +1 -1
- package/dist/delivery/delivery-reconciler-apply.js +7 -2
- package/dist/delivery/delivery-reconciler-apply.js.map +1 -1
- package/dist/delivery/delivery-reconciler.d.ts +8 -0
- package/dist/delivery/delivery-reconciler.d.ts.map +1 -1
- package/dist/delivery/delivery-reconciler.js +7 -5
- package/dist/delivery/delivery-reconciler.js.map +1 -1
- package/dist/focus/daemon-contexts.d.ts +6 -0
- package/dist/focus/daemon-contexts.d.ts.map +1 -1
- package/dist/focus/daemon-contexts.js.map +1 -1
- package/dist/focus/focus-activity-poll-facts.d.ts +13 -0
- package/dist/focus/focus-activity-poll-facts.d.ts.map +1 -1
- package/dist/focus/focus-activity-poll-facts.js +6 -0
- package/dist/focus/focus-activity-poll-facts.js.map +1 -1
- package/dist/focus/focus-activity-producers.d.ts +38 -1
- package/dist/focus/focus-activity-producers.d.ts.map +1 -1
- package/dist/focus/focus-activity-producers.js +52 -4
- package/dist/focus/focus-activity-producers.js.map +1 -1
- package/dist/focus/focus-activity-record.d.ts +2 -2
- package/dist/focus/focus-activity-record.d.ts.map +1 -1
- package/dist/focus/focus-activity-record.js +4 -3
- package/dist/focus/focus-activity-record.js.map +1 -1
- package/dist/focus/focus-activity-sources.d.ts +8 -0
- package/dist/focus/focus-activity-sources.d.ts.map +1 -1
- package/dist/focus/focus-activity-sources.js.map +1 -1
- package/dist/focus/focus-engine.d.ts.map +1 -1
- package/dist/focus/focus-engine.js +3 -1
- package/dist/focus/focus-engine.js.map +1 -1
- package/dist/merge/candidate-rework.d.ts +2 -0
- package/dist/merge/candidate-rework.d.ts.map +1 -1
- package/dist/merge/candidate-rework.js +2 -0
- package/dist/merge/candidate-rework.js.map +1 -1
- package/dist/queries/api-client/shared.d.ts +1 -0
- package/dist/queries/api-client/shared.d.ts.map +1 -1
- package/dist/queries/api-client/shared.js +30 -2
- package/dist/queries/api-client/shared.js.map +1 -1
- package/dist/queries/deliveries/deliveries.d.ts +14 -4
- package/dist/queries/deliveries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries/deliveries.js +12 -6
- package/dist/queries/deliveries/deliveries.js.map +1 -1
- package/dist/queries/deliveries/delivery-transition-cause.d.ts +39 -0
- package/dist/queries/deliveries/delivery-transition-cause.d.ts.map +1 -0
- package/dist/queries/deliveries/delivery-transition-cause.js +41 -0
- package/dist/queries/deliveries/delivery-transition-cause.js.map +1 -0
- package/dist/queries/phase-spans/phase-spans.d.ts +59 -0
- package/dist/queries/phase-spans/phase-spans.d.ts.map +1 -0
- package/dist/queries/phase-spans/phase-spans.js +90 -0
- package/dist/queries/phase-spans/phase-spans.js.map +1 -0
- package/dist/queries/verification/verification.js +1 -1
- package/dist/testing/fixtures/api-client.js +1 -1
- package/dist/testing/fixtures/recording-api-client.js +1 -1
- package/dist/testing/fixtures/verification-deps.d.ts +7 -0
- package/dist/testing/fixtures/verification-deps.d.ts.map +1 -1
- package/dist/testing/fixtures/verification-deps.js +12 -1
- package/dist/testing/fixtures/verification-deps.js.map +1 -1
- package/dist/tower/tower-admission.d.ts +3 -1
- package/dist/tower/tower-admission.d.ts.map +1 -1
- package/dist/tower/tower-admission.js +3 -1
- package/dist/tower/tower-admission.js.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/issue-status.d.ts.map +1 -1
- package/dist/types/issue-status.js +1 -0
- package/dist/types/issue-status.js.map +1 -1
- package/dist/verify/deterministic-gate/verification-deterministic.js +1 -1
- package/dist/verify/engine/verification-commit-sharing.d.ts +18 -3
- package/dist/verify/engine/verification-commit-sharing.d.ts.map +1 -1
- package/dist/verify/engine/verification-commit-sharing.js +73 -13
- package/dist/verify/engine/verification-commit-sharing.js.map +1 -1
- package/dist/verify/engine/verification-deps.d.ts +11 -0
- package/dist/verify/engine/verification-deps.d.ts.map +1 -1
- package/dist/verify/engine/verification-deps.js +1 -1
- package/dist/verify/engine/verification-engine.js +1 -1
- package/dist/verify/engine/verification-engine.js.map +1 -1
- package/dist/verify/gate-verdicts/gate-phase-span.d.ts +137 -0
- package/dist/verify/gate-verdicts/gate-phase-span.d.ts.map +1 -0
- package/dist/verify/gate-verdicts/gate-phase-span.js +190 -0
- package/dist/verify/gate-verdicts/gate-phase-span.js.map +1 -0
- package/dist/verify/outcome-routing/falsified-effect-reopen.d.ts.map +1 -1
- package/dist/verify/outcome-routing/falsified-effect-reopen.js +6 -1
- package/dist/verify/outcome-routing/falsified-effect-reopen.js.map +1 -1
- package/dist/verify/outcome-routing/gate-rework-reopen.d.ts +2 -0
- package/dist/verify/outcome-routing/gate-rework-reopen.d.ts.map +1 -1
- package/dist/verify/outcome-routing/gate-rework-reopen.js +5 -2
- package/dist/verify/outcome-routing/gate-rework-reopen.js.map +1 -1
- package/docs/runbook-tower.md +6 -6
- package/package.json +3 -3
package/build-info.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"commitSha": "
|
|
3
|
-
"builtAt": "2026-10-
|
|
2
|
+
"commitSha": "e666f250f",
|
|
3
|
+
"builtAt": "2026-10-30T00:54:05.536Z",
|
|
4
4
|
"expectedMigrations": [
|
|
5
5
|
"20250829113330_create_org_nodes_table.sql",
|
|
6
6
|
"20250829113402_fix_function_security_search_path.sql",
|
|
@@ -911,6 +911,9 @@
|
|
|
911
911
|
"20261026120918_qa_failed_overcome_clear_guard.sql",
|
|
912
912
|
"20261026120922_done_prd_play_role_recovered.sql",
|
|
913
913
|
"20261027121340_in_progress_request_answered_without_focus_is_delivered.sql",
|
|
914
|
-
"20261027125510_focus_tower_edges_refuse_same_prd_depends_on.sql"
|
|
914
|
+
"20261027125510_focus_tower_edges_refuse_same_prd_depends_on.sql",
|
|
915
|
+
"20261029133000_execution_phase_spans.sql",
|
|
916
|
+
"20261029225041_delivery_transition_cause.sql",
|
|
917
|
+
"20261029231532_closing_focus_settles_its_deliveries.sql"
|
|
915
918
|
]
|
|
916
919
|
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every CI run the CI sensor observes on the integration tip is recorded as one
|
|
3
|
+
* timed `ci` execution-phase span (product-api `daemon_upsert_ci_phase_span`,
|
|
4
|
+
* keyed by product + commit sha + run number), so the database holds when each
|
|
5
|
+
* run started and when it reached a terminal state -- not only the git ref
|
|
6
|
+
* `refs/ci-status/<sha>/<run>/<state>` and, on red, a ci_run_red escalation.
|
|
7
|
+
*
|
|
8
|
+
* WHICH RUNS. The run-ordered ci-status refs published for the integration tip
|
|
9
|
+
* sha (ciRunsFromRefNames, ci/ci-status.ts): one span per run number, the ref's
|
|
10
|
+
* run token as `external_run_id`. A product whose CI does not publish the
|
|
11
|
+
* ci-status contract has no such refs, so it records NOTHING (no API read, no
|
|
12
|
+
* write). Legacy refs carry no run number and name no run.
|
|
13
|
+
* A ref names a sha, not a branch, so when the CI host can say which branch a run
|
|
14
|
+
* ran on, only runs on the integration branch or an integration CANDIDATE branch
|
|
15
|
+
* (telora-candidate/<focusId>, ci/candidate-ref.ts -- the run that judged the
|
|
16
|
+
* commit integration fast-forwarded to, usually the only one with a verdict) are
|
|
17
|
+
* recorded; a run on main (the later integration->main promotion of the same sha)
|
|
18
|
+
* is not this team's time and is skipped. Without the CI host, every ref'd run of
|
|
19
|
+
* the tip is recorded.
|
|
20
|
+
*
|
|
21
|
+
* WHEN. A run is upserted the first tick it is seen -- pending or terminal --
|
|
22
|
+
* and again each tick until it is recorded green: green -> outcome 'passed',
|
|
23
|
+
* red -> 'failed', pending -> no end. A RED run is not final: a Gitea job rerun
|
|
24
|
+
* publishes a success ref under the same run number, and the CI status model
|
|
25
|
+
* lets that success win the run (ci/ci-status.ts runVerdictOf) -- which is what
|
|
26
|
+
* the merge gate reads -- so a red run stays open here and its red -> green is
|
|
27
|
+
* sent (the server lets a closed 'failed' span become 'passed', never the
|
|
28
|
+
* reverse). An unchanged red is not re-sent each tick (`runMemo` remembers it was
|
|
29
|
+
* recorded). A run is SETTLED -- never re-sent, nor the host re-read for it -- once
|
|
30
|
+
* it is recorded green, or skipped as a non-integration run. The server keeps the
|
|
31
|
+
* earliest start, never reopens a closed span and merges metadata, so a repeat
|
|
32
|
+
* (e.g. after a daemon restart) is harmless.
|
|
33
|
+
*
|
|
34
|
+
* TIME SOURCE (metadata.timeSource). 'ci_host' when the run's started_at (and,
|
|
35
|
+
* when terminal, completed_at) come from the Gitea Actions API -- the same
|
|
36
|
+
* read-only `ci-logs` reader credential the gate-job read uses
|
|
37
|
+
* (ci/gate-job-conclusion.ts giteaActionsReader; no new credential), matched by
|
|
38
|
+
* run_number + head_sha. 'observed' when there is no reader on this host, the
|
|
39
|
+
* product's CI repo is not derivable, or the API does not know the run: the
|
|
40
|
+
* start is the first poll that saw the run and the end the first poll that saw it
|
|
41
|
+
* terminal, at the sensor's poll resolution (5 min). Telora's ci.yml publishes
|
|
42
|
+
* only terminal refs, so an observed span of such a run has started_at ==
|
|
43
|
+
* ended_at -- its duration is not known, only its outcome and position.
|
|
44
|
+
* 'mixed' when the host gave the start but not the end of a terminal run.
|
|
45
|
+
*
|
|
46
|
+
* TIP COMMIT TIME (metadata.tipCommittedAt). The committer date of the
|
|
47
|
+
* integration tip commit (`git log -1 --format=%cI <sha>` in the product
|
|
48
|
+
* checkout). It is NOT the merge time: for the common fast-forward to a focus's
|
|
49
|
+
* merge-back (or candidate) commit it is when that commit was made, not when
|
|
50
|
+
* integration moved to it, which git does not record. The integration landing
|
|
51
|
+
* instant lives in `focus_merges.merged_at` (its `merge_commit_sha` is the
|
|
52
|
+
* integration HEAD after the merge); read that, not this, for when work landed.
|
|
53
|
+
* Absent when the commit is not in the local checkout; settlement never waits
|
|
54
|
+
* for it.
|
|
55
|
+
*
|
|
56
|
+
* ATTRIBUTION. The same anchor the ci_run_red filing uses
|
|
57
|
+
* (ci/ci-red-attribution.ts resolveRedRunAnchor): the focus -- and the delivery
|
|
58
|
+
* when it is the only one -- whose merge introduced the tip; no focus at all when
|
|
59
|
+
* that cannot be determined, never a guessed one.
|
|
60
|
+
*
|
|
61
|
+
* BEST-EFFORT. A measurement, not control: every failure is logged and the CI
|
|
62
|
+
* sensor tick proceeds untouched (recordCiRunSpans never throws).
|
|
63
|
+
*
|
|
64
|
+
* @module ci/ci-run-spans
|
|
65
|
+
*/
|
|
66
|
+
import type { DaemonConfig } from '../types/index.js';
|
|
67
|
+
import type { CiRunObservation } from './ci-status.js';
|
|
68
|
+
import type { CiRedRunAnchor } from './ci-red-attribution.js';
|
|
69
|
+
import type { UpsertCiPhaseSpanRequest } from '../queries/phase-spans/phase-spans.js';
|
|
70
|
+
/** One CI run as the CI host (Gitea Actions API) reports it. */
|
|
71
|
+
export interface HostCiRun {
|
|
72
|
+
/** The host's own run id (the API's `id`, not the run number). */
|
|
73
|
+
hostRunId: number | null;
|
|
74
|
+
headBranch: string | null;
|
|
75
|
+
/** ISO instant the run started; null when the host has none (not started, zero time). */
|
|
76
|
+
startedAt: string | null;
|
|
77
|
+
/** ISO instant the run completed; null while it runs. */
|
|
78
|
+
completedAt: string | null;
|
|
79
|
+
}
|
|
80
|
+
/** Injected IO for the span writes. Bound at the composition root (composition/execution-ci-context.ts). */
|
|
81
|
+
export interface CiRunSpanDeps {
|
|
82
|
+
/** The run-ordered CI runs the sha's ci-status refs publish ([] when none / unreadable). */
|
|
83
|
+
listRuns: (config: DaemonConfig, sha: string) => CiRunObservation[];
|
|
84
|
+
/** The CI host's runs at the sha, by run number; null when the host cannot be read. Never throws. */
|
|
85
|
+
readHostRuns: (config: DaemonConfig, sha: string) => Promise<ReadonlyMap<number, HostCiRun> | null>;
|
|
86
|
+
/** The ci_run_red attribution (ci-red-attribution.ts resolveRedRunAnchor). */
|
|
87
|
+
resolveAnchor: (config: DaemonConfig, sha: string) => Promise<CiRedRunAnchor>;
|
|
88
|
+
/** The tip commit's committer date (ISO; NOT the merge time), or null when not readable locally. */
|
|
89
|
+
readTipCommittedAt: (config: DaemonConfig, sha: string) => string | null;
|
|
90
|
+
/** The best-effort span write (queries/phase-spans upsertCiPhaseSpan): span id, or null when not recorded. */
|
|
91
|
+
upsert: (request: UpsertCiPhaseSpanRequest) => Promise<string | null>;
|
|
92
|
+
host: () => string;
|
|
93
|
+
now: () => Date;
|
|
94
|
+
}
|
|
95
|
+
/** Test-only: forget what was recorded. */
|
|
96
|
+
export declare function __resetCiRunSpanStateForTests(): void;
|
|
97
|
+
/**
|
|
98
|
+
* The runs of a Gitea `actions/runs` payload at `sha`, keyed by run_number. A
|
|
99
|
+
* payload that is not the expected shape yields an empty map. PURE.
|
|
100
|
+
*/
|
|
101
|
+
export declare function hostRunsFromPayload(payload: unknown, sha: string): Map<number, HostCiRun>;
|
|
102
|
+
/** The tip commit's committer date, ISO; null when git cannot read it. */
|
|
103
|
+
export declare function readCommitterDate(repoPath: string, sha: string): string | null;
|
|
104
|
+
/**
|
|
105
|
+
* Whether a run the CI host places on `headBranch` is a run on integration: the
|
|
106
|
+
* integration branch itself or an integration candidate branch. Unknown branch
|
|
107
|
+
* (no host data) counts. PURE.
|
|
108
|
+
*/
|
|
109
|
+
export declare function isIntegrationRun(headBranch: string | null, integrationBranch: string): boolean;
|
|
110
|
+
/** What one observed run is written as. */
|
|
111
|
+
export interface CiRunSpanPlan {
|
|
112
|
+
request: UpsertCiPhaseSpanRequest;
|
|
113
|
+
terminal: boolean;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* The span write for one observed run (module header: time source, outcome,
|
|
117
|
+
* attribution, metadata). PURE.
|
|
118
|
+
*/
|
|
119
|
+
export declare function planCiRunSpan(params: {
|
|
120
|
+
config: DaemonConfig;
|
|
121
|
+
sha: string;
|
|
122
|
+
run: CiRunObservation;
|
|
123
|
+
hostRun: HostCiRun | null;
|
|
124
|
+
anchor: CiRedRunAnchor;
|
|
125
|
+
tipCommittedAt: string | null;
|
|
126
|
+
host: string;
|
|
127
|
+
now: Date;
|
|
128
|
+
}): CiRunSpanPlan;
|
|
129
|
+
/** Counts of one product's span pass, for the tick log and tests. */
|
|
130
|
+
export interface CiRunSpanCounts {
|
|
131
|
+
written: number;
|
|
132
|
+
skipped: number;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Record the CI runs the integration tip `sha` has published as `ci` phase spans
|
|
136
|
+
* (module header). Never throws: a failure is logged and the CI sensor tick
|
|
137
|
+
* continues.
|
|
138
|
+
*/
|
|
139
|
+
export declare function recordCiRunSpans(config: DaemonConfig, sha: string, deps: CiRunSpanDeps): Promise<CiRunSpanCounts>;
|
|
140
|
+
//# sourceMappingURL=ci-run-spans.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-run-spans.d.ts","sourceRoot":"","sources":["../../src/ci/ci-run-spans.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/ci/ci-run-spans.test.ts
|
|
3
|
+
// PINNED-BY-END
|
|
4
|
+
import { isCandidateBranch } from './candidate-ref.js';
|
|
5
|
+
import { runGitSync } from '../git/types.js';
|
|
6
|
+
import { createLogger } from '../log/daemon-log.js';
|
|
7
|
+
const log = createLogger({ module: 'ci-run-spans' });
|
|
8
|
+
/**
|
|
9
|
+
* What this process has recorded per run (`${productId}:${sha}:${runNumber}`):
|
|
10
|
+
* 'settled' -- recorded green, or skipped as a non-integration run; never re-sent
|
|
11
|
+
* (or re-read from the host). 'red_recorded' -- recorded failed; not re-sent while
|
|
12
|
+
* it stays red, sent again the tick a rerun turns it green. Module-level so it
|
|
13
|
+
* persists across ticks; a daemon restart re-sends the tip's runs once
|
|
14
|
+
* (idempotent).
|
|
15
|
+
*/
|
|
16
|
+
const runMemo = new Map();
|
|
17
|
+
/** Test-only: forget what was recorded. */
|
|
18
|
+
export function __resetCiRunSpanStateForTests() {
|
|
19
|
+
runMemo.clear();
|
|
20
|
+
}
|
|
21
|
+
/** Whether this tick has nothing to send for `run`: settled, or a red already recorded. */
|
|
22
|
+
function alreadyRecorded(key, run) {
|
|
23
|
+
const memo = runMemo.get(key);
|
|
24
|
+
return memo === 'settled' || (memo === 'red_recorded' && run.state === 'red');
|
|
25
|
+
}
|
|
26
|
+
const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
27
|
+
/** A host timestamp as ISO, or null for absent / unparseable / Go zero time. PURE. */
|
|
28
|
+
function hostInstant(value) {
|
|
29
|
+
if (typeof value !== 'string')
|
|
30
|
+
return null;
|
|
31
|
+
const ms = Date.parse(value);
|
|
32
|
+
if (Number.isNaN(ms) || new Date(ms).getUTCFullYear() < 2000)
|
|
33
|
+
return null;
|
|
34
|
+
return new Date(ms).toISOString();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The runs of a Gitea `actions/runs` payload at `sha`, keyed by run_number. A
|
|
38
|
+
* payload that is not the expected shape yields an empty map. PURE.
|
|
39
|
+
*/
|
|
40
|
+
export function hostRunsFromPayload(payload, sha) {
|
|
41
|
+
const runs = new Map();
|
|
42
|
+
const list = isRecord(payload) && Array.isArray(payload.workflow_runs) ? payload.workflow_runs : [];
|
|
43
|
+
for (const r of list) {
|
|
44
|
+
if (!isRecord(r) || typeof r.run_number !== 'number')
|
|
45
|
+
continue;
|
|
46
|
+
if (String(r.head_sha ?? '').toLowerCase() !== sha.toLowerCase())
|
|
47
|
+
continue;
|
|
48
|
+
runs.set(r.run_number, {
|
|
49
|
+
hostRunId: typeof r.id === 'number' ? r.id : null,
|
|
50
|
+
headBranch: typeof r.head_branch === 'string' && r.head_branch !== '' ? r.head_branch : null,
|
|
51
|
+
startedAt: hostInstant(r.started_at),
|
|
52
|
+
completedAt: r.status === 'completed' ? hostInstant(r.completed_at) : null,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return runs;
|
|
56
|
+
}
|
|
57
|
+
/** The tip commit's committer date, ISO; null when git cannot read it. */
|
|
58
|
+
export function readCommitterDate(repoPath, sha) {
|
|
59
|
+
const result = runGitSync(['log', '-1', '--format=%cI', `${sha}^{commit}`], repoPath);
|
|
60
|
+
return result.success ? hostInstant(result.output.trim()) : null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Whether a run the CI host places on `headBranch` is a run on integration: the
|
|
64
|
+
* integration branch itself or an integration candidate branch. Unknown branch
|
|
65
|
+
* (no host data) counts. PURE.
|
|
66
|
+
*/
|
|
67
|
+
export function isIntegrationRun(headBranch, integrationBranch) {
|
|
68
|
+
return headBranch === null || headBranch === integrationBranch || isCandidateBranch(headBranch);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The span write for one observed run (module header: time source, outcome,
|
|
72
|
+
* attribution, metadata). PURE.
|
|
73
|
+
*/
|
|
74
|
+
export function planCiRunSpan(params) {
|
|
75
|
+
const { config, sha, run, hostRun, anchor, tipCommittedAt, host, now } = params;
|
|
76
|
+
const observed = now.toISOString();
|
|
77
|
+
const terminal = run.state !== 'pending';
|
|
78
|
+
const startedAt = hostRun?.startedAt ?? observed;
|
|
79
|
+
const endedAt = terminal ? (hostRun?.completedAt ?? observed) : undefined;
|
|
80
|
+
const startFromHost = hostRun?.startedAt != null;
|
|
81
|
+
const endFromHost = !terminal || hostRun?.completedAt != null;
|
|
82
|
+
const timeSource = startFromHost ? (endFromHost ? 'ci_host' : 'mixed') : 'observed';
|
|
83
|
+
const metadata = {
|
|
84
|
+
runNumber: run.runNumber,
|
|
85
|
+
state: run.state,
|
|
86
|
+
branch: config.integrationBranch,
|
|
87
|
+
timeSource,
|
|
88
|
+
// Omitted, not null, when unread: the server merges metadata with the poll's
|
|
89
|
+
// keys winning, so a null would erase a time an earlier poll recorded.
|
|
90
|
+
...(tipCommittedAt !== null ? { tipCommittedAt } : {}),
|
|
91
|
+
...(hostRun?.hostRunId != null ? { hostRunId: hostRun.hostRunId } : {}),
|
|
92
|
+
...(hostRun?.headBranch ? { headBranch: hostRun.headBranch } : {}),
|
|
93
|
+
};
|
|
94
|
+
const request = {
|
|
95
|
+
productId: config.productId,
|
|
96
|
+
commitSha: sha,
|
|
97
|
+
externalRunId: String(run.runNumber),
|
|
98
|
+
focusId: anchor.focusId,
|
|
99
|
+
deliveryId: anchor.focusId ? anchor.deliveryId : null,
|
|
100
|
+
startedAt,
|
|
101
|
+
recordedByHost: host,
|
|
102
|
+
metadata,
|
|
103
|
+
...(endedAt !== undefined ? { endedAt, outcome: run.state === 'green' ? 'passed' : 'failed' } : {}),
|
|
104
|
+
};
|
|
105
|
+
return { request, terminal };
|
|
106
|
+
}
|
|
107
|
+
const runKey = (productId, sha, runNumber) => `${productId}:${sha}:${runNumber}`;
|
|
108
|
+
/**
|
|
109
|
+
* Record the CI runs the integration tip `sha` has published as `ci` phase spans
|
|
110
|
+
* (module header). Never throws: a failure is logged and the CI sensor tick
|
|
111
|
+
* continues.
|
|
112
|
+
*/
|
|
113
|
+
export async function recordCiRunSpans(config, sha, deps) {
|
|
114
|
+
const counts = { written: 0, skipped: 0 };
|
|
115
|
+
try {
|
|
116
|
+
const open = deps.listRuns(config, sha).filter((r) => !alreadyRecorded(runKey(config.productId, sha, r.runNumber), r));
|
|
117
|
+
if (open.length === 0)
|
|
118
|
+
return counts;
|
|
119
|
+
const hostRuns = await deps.readHostRuns(config, sha);
|
|
120
|
+
const anchor = await deps.resolveAnchor(config, sha);
|
|
121
|
+
const tipCommittedAt = deps.readTipCommittedAt(config, sha);
|
|
122
|
+
for (const run of open) {
|
|
123
|
+
const key = runKey(config.productId, sha, run.runNumber);
|
|
124
|
+
const hostRun = hostRuns?.get(run.runNumber) ?? null;
|
|
125
|
+
if (!isIntegrationRun(hostRun?.headBranch ?? null, config.integrationBranch)) {
|
|
126
|
+
runMemo.set(key, 'settled');
|
|
127
|
+
counts.skipped++;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const plan = planCiRunSpan({ config, sha, run, hostRun, anchor, tipCommittedAt, host: deps.host(), now: deps.now() });
|
|
131
|
+
const spanId = await deps.upsert(plan.request);
|
|
132
|
+
if (spanId === null)
|
|
133
|
+
continue;
|
|
134
|
+
counts.written++;
|
|
135
|
+
// Green is final; red can still be superseded by a rerun's green (module header).
|
|
136
|
+
if (run.state === 'green')
|
|
137
|
+
runMemo.set(key, 'settled');
|
|
138
|
+
else if (run.state === 'red')
|
|
139
|
+
runMemo.set(key, 'red_recorded');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
log.warn(`CI run spans not recorded for product ${config.productId} @ ${sha.slice(0, 12)}: ${err.message}`);
|
|
144
|
+
}
|
|
145
|
+
return counts;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=ci-run-spans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-run-spans.js","sourceRoot":"","sources":["../../src/ci/ci-run-spans.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,9 @@
|
|
|
37
37
|
* red tips carrying the same unfixed breakage collapse onto ONE open filing
|
|
38
38
|
* instead of minting one per tip.
|
|
39
39
|
*
|
|
40
|
+
* Each tick also records the tip's observed CI runs as timed `ci` execution-phase
|
|
41
|
+
* spans (ci/ci-run-spans.ts), attributed with the same anchor as the filing.
|
|
42
|
+
*
|
|
40
43
|
* Registered in LOOP_REGISTRY under the opt-out guard TELORA_CI_SENSOR_LOOP.
|
|
41
44
|
* Consumes the same fail-closed CiStatusReader the green-wait uses.
|
|
42
45
|
*
|
|
@@ -213,6 +216,11 @@ export interface CiSensorDeps {
|
|
|
213
216
|
}) => Promise<boolean>;
|
|
214
217
|
fileCiRedEscalation: (params: CiRedFilingParams) => Promise<void>;
|
|
215
218
|
resolveCiRedEscalations: (productId: string) => Promise<number>;
|
|
219
|
+
/**
|
|
220
|
+
* Record the tip's observed CI runs as timed `ci` phase spans (ci/ci-run-spans.ts
|
|
221
|
+
* recordCiRunSpans). Best-effort, never throws.
|
|
222
|
+
*/
|
|
223
|
+
recordCiRunSpans: (config: DaemonConfig, sha: string) => Promise<unknown>;
|
|
216
224
|
}
|
|
217
225
|
export interface CiSensorTickCounts {
|
|
218
226
|
productsChecked: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ci-sensor-loop.d.ts","sourceRoot":"","sources":["../../src/ci/ci-sensor-loop.ts"],"names":[],"mappings":"AAQA
|
|
1
|
+
{"version":3,"file":"ci-sensor-loop.d.ts","sourceRoot":"","sources":["../../src/ci/ci-sensor-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -285,6 +285,10 @@ export async function runCiSensorTick(config, deps) {
|
|
|
285
285
|
if (!sha)
|
|
286
286
|
continue;
|
|
287
287
|
counts.productsChecked++;
|
|
288
|
+
// Measurement first, so an escalation failure below never skips it.
|
|
289
|
+
await deps.recordCiRunSpans(pc, sha).catch((err) => {
|
|
290
|
+
log.warn(`CI run spans not recorded for product ${pc.productId}: ${err.message}`);
|
|
291
|
+
});
|
|
288
292
|
const status = await deps.getCiStatus({ sha, integrationBranch: pc.integrationBranch, config: pc });
|
|
289
293
|
const hasOpen = await deps.hasOpenCiRedEscalation({ productId: pc.productId, sha, branch: pc.integrationBranch });
|
|
290
294
|
const action = decideCiSensorAction(status, hasOpen);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ci-sensor-loop.js","sourceRoot":"","sources":["../../src/ci/ci-sensor-loop.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,mEAAmE;AACnE,8GAA8G;AAC9G,mDAAmD;AACnD,uEAAuE;AACvE,iEAAiE;AACjE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"ci-sensor-loop.js","sourceRoot":"","sources":["../../src/ci/ci-sensor-loop.ts"],"names":[],"mappings":"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"}
|
package/dist/ci/ci-status.d.ts
CHANGED
|
@@ -99,6 +99,21 @@ export declare function resolveCiMergeGate(status: CiRunStatus): CiMergeGateDeci
|
|
|
99
99
|
* same vocabulary as every other wait.
|
|
100
100
|
*/
|
|
101
101
|
export declare function classifyCiMergeWait(status: CiRunStatus, sha: string): WaitReachability;
|
|
102
|
+
/** One run-ordered CI run of a sha, as its published ci-status refs state it. */
|
|
103
|
+
export interface CiRunObservation {
|
|
104
|
+
/** The run number the ref path carries (`refs/ci-status/<sha>/<run>/<state>`). */
|
|
105
|
+
runNumber: number;
|
|
106
|
+
/** The run's verdict (runVerdictOf): green, red or pending. */
|
|
107
|
+
state: Exclude<CiRunStatus, 'unknown'>;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The distinct run-ordered CI runs a sha's ci-status ref names publish, one per
|
|
111
|
+
* run number with that run's own verdict (a published success wins the run, as in
|
|
112
|
+
* classifyGitNativeCiStatus), sorted by run number. Legacy refs (no run number)
|
|
113
|
+
* and unrecognized suffixes name no run and are skipped. PURE; it does not change
|
|
114
|
+
* how the sha as a whole is classified.
|
|
115
|
+
*/
|
|
116
|
+
export declare function ciRunsFromRefNames(refNames: readonly string[]): CiRunObservation[];
|
|
102
117
|
/**
|
|
103
118
|
* Classify a git-native CI status from the set of ci-status ref names published
|
|
104
119
|
* for a SHA. The STATE is encoded in the ref NAME (immutable per-SHA), so no
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ci-status.d.ts","sourceRoot":"","sources":["../../src/ci/ci-status.ts"],"names":[],"mappings":"AAcA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,qCAAqC,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC;AAElE,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,MAAM,EAAE,WAAW,CAAC;IACpB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,mBAAmB,CAY3E;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAUtF;
|
|
1
|
+
{"version":3,"file":"ci-status.d.ts","sourceRoot":"","sources":["../../src/ci/ci-status.ts"],"names":[],"mappings":"AAcA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,qCAAqC,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC;AAElE,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,MAAM,EAAE,WAAW,CAAC;IACpB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,mBAAmB,CAY3E;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAUtF;AA0CD,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAC/B,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;CACxC;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAiBlF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,CAkDlF;AAED,+CAA+C;AAC/C,MAAM,WAAW,kBAAkB;IACjC,gFAAgF;IAChF,GAAG,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+EAA+E;IAC/E,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,kBAAkB,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAElF;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,MAAM,EAAE,CAAC;AAEhF;;;;GAIG;AACH,8EAA8E;AAC9E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAEzD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,oBAAoB,EAAE,OAAO,GAAG,cAAc,CAIvG;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,iBAAiB,GAAG,cAAc,CAWvF"}
|
package/dist/ci/ci-status.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
2
|
// Pinned by: packages/daemon/src/ci/candidate-ci-contract.test.ts,
|
|
3
3
|
// packages/daemon/src/ci/candidate-ref.test.ts, packages/daemon/src/ci/ci-merge-gate.test.ts,
|
|
4
|
-
// packages/daemon/src/ci/ci-sensor-loop.test.ts,
|
|
4
|
+
// packages/daemon/src/ci/ci-run-spans.test.ts, packages/daemon/src/ci/ci-sensor-loop.test.ts,
|
|
5
5
|
// packages/daemon/src/ci/ci-status-arbitration-parity.test.ts,
|
|
6
6
|
// packages/daemon/src/ci/ci-status-git-native.test.ts,
|
|
7
7
|
// packages/daemon/src/completion/team-exit/teardown-merge-gate.test.ts,
|
|
@@ -104,6 +104,47 @@ function ciRunOrderFromRef(ref) {
|
|
|
104
104
|
}
|
|
105
105
|
return null;
|
|
106
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* One run's verdict from the states it published: a published success wins the
|
|
109
|
+
* run (a passing rerun clears that run's earlier failure), then red, then
|
|
110
|
+
* pending. PURE.
|
|
111
|
+
*/
|
|
112
|
+
function runVerdictOf(states) {
|
|
113
|
+
if (states.has('green'))
|
|
114
|
+
return 'green';
|
|
115
|
+
if (states.has('red'))
|
|
116
|
+
return 'red';
|
|
117
|
+
if (states.has('pending'))
|
|
118
|
+
return 'pending';
|
|
119
|
+
return 'unknown';
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* The distinct run-ordered CI runs a sha's ci-status ref names publish, one per
|
|
123
|
+
* run number with that run's own verdict (a published success wins the run, as in
|
|
124
|
+
* classifyGitNativeCiStatus), sorted by run number. Legacy refs (no run number)
|
|
125
|
+
* and unrecognized suffixes name no run and are skipped. PURE; it does not change
|
|
126
|
+
* how the sha as a whole is classified.
|
|
127
|
+
*/
|
|
128
|
+
export function ciRunsFromRefNames(refNames) {
|
|
129
|
+
const statesByRun = new Map();
|
|
130
|
+
for (const raw of refNames) {
|
|
131
|
+
const ref = raw.trim();
|
|
132
|
+
const state = ciStateFromRefSuffix(ref);
|
|
133
|
+
const order = ciRunOrderFromRef(ref);
|
|
134
|
+
if (!state || order === null)
|
|
135
|
+
continue;
|
|
136
|
+
const set = statesByRun.get(order) ?? new Set();
|
|
137
|
+
set.add(state);
|
|
138
|
+
statesByRun.set(order, set);
|
|
139
|
+
}
|
|
140
|
+
const runs = [];
|
|
141
|
+
for (const [runNumber, set] of statesByRun) {
|
|
142
|
+
const state = runVerdictOf(set);
|
|
143
|
+
if (state !== 'unknown')
|
|
144
|
+
runs.push({ runNumber, state });
|
|
145
|
+
}
|
|
146
|
+
return runs.sort((a, b) => a.runNumber - b.runNumber);
|
|
147
|
+
}
|
|
107
148
|
/**
|
|
108
149
|
* Classify a git-native CI status from the set of ci-status ref names published
|
|
109
150
|
* for a SHA. The STATE is encoded in the ref NAME (immutable per-SHA), so no
|
|
@@ -188,13 +229,7 @@ export function classifyGitNativeCiStatus(refNames) {
|
|
|
188
229
|
let anyRed = false;
|
|
189
230
|
let anyPending = false;
|
|
190
231
|
for (const set of statesByRun.values()) {
|
|
191
|
-
const runVerdict = set
|
|
192
|
-
? 'green'
|
|
193
|
-
: set.has('red')
|
|
194
|
-
? 'red'
|
|
195
|
-
: set.has('pending')
|
|
196
|
-
? 'pending'
|
|
197
|
-
: 'unknown';
|
|
232
|
+
const runVerdict = runVerdictOf(set);
|
|
198
233
|
if (runVerdict === 'green')
|
|
199
234
|
anyGreen = true;
|
|
200
235
|
else if (runVerdict === 'red')
|
package/dist/ci/ci-status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ci-status.js","sourceRoot":"","sources":["../../src/ci/ci-status.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,mEAAmE;AACnE,gGAAgG;AAChG,
|
|
1
|
+
{"version":3,"file":"ci-status.js","sourceRoot":"","sources":["../../src/ci/ci-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-start-context.d.ts","sourceRoot":"","sources":["../../src/composition/engine-start-context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine-start-context.d.ts","sourceRoot":"","sources":["../../src/composition/engine-start-context.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAUpE,wBAAgB,qBAAqB,IAAI,gBAAgB,CAcxD"}
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
* The production binding of what FocusEngine.start() starts
|
|
6
6
|
* (focus/daemon-contexts.ts EngineStartSeams): the 30s focus poll, the
|
|
7
7
|
* heartbeat, the registry version check and the interval scheduler the
|
|
8
|
-
* engine's own timers run on,
|
|
8
|
+
* engine's own timers run on, the workstation's capacity record at start, and
|
|
9
|
+
* the close of the gate spans a crashed predecessor on this host left open.
|
|
9
10
|
* Part of the daemon composition root.
|
|
10
11
|
*
|
|
11
12
|
* @module composition/engine-start-context
|
|
@@ -16,6 +17,9 @@ import { startHeartbeat } from '../focus/heartbeat.js';
|
|
|
16
17
|
import { checkForUpdates } from '../update/version-check.js';
|
|
17
18
|
import { capacityOfConfig } from '../focus/workstation-intervals.js';
|
|
18
19
|
import { PRODUCTION_WORKSTATION_INTERVALS } from './workstation-intervals-context.js';
|
|
20
|
+
import { abandonCrashedGateSpans } from '../verify/gate-verdicts/gate-phase-span.js';
|
|
21
|
+
import { abandonOpenPhaseSpans } from '../queries/phase-spans/phase-spans.js';
|
|
22
|
+
import { daemonHostname } from '../queries/sessions/sessions.js';
|
|
19
23
|
export function buildEngineStartSeams() {
|
|
20
24
|
return {
|
|
21
25
|
startPolling: (contexts) => startFocusPoller(contexts.tickDeadline, contexts.focusPoller),
|
|
@@ -25,6 +29,9 @@ export function buildEngineStartSeams() {
|
|
|
25
29
|
if (capacity)
|
|
26
30
|
PRODUCTION_WORKSTATION_INTERVALS.capacityTookEffect('start', capacity);
|
|
27
31
|
},
|
|
32
|
+
abandonCrashedGateSpans: (startedBefore) => {
|
|
33
|
+
void abandonCrashedGateSpans({ abandon: abandonOpenPhaseSpans, host: daemonHostname }, startedBefore);
|
|
34
|
+
},
|
|
28
35
|
checkForUpdates: (currentVersion) => checkForUpdates(currentVersion, '@telora/daemon'),
|
|
29
36
|
schedule: safeInterval,
|
|
30
37
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-start-context.js","sourceRoot":"","sources":["../../src/composition/engine-start-context.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,0FAA0F;AAC1F,gBAAgB;AAEhB
|
|
1
|
+
{"version":3,"file":"engine-start-context.js","sourceRoot":"","sources":["../../src/composition/engine-start-context.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,0FAA0F;AAC1F,gBAAgB;AAEhB;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,YAAY,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,WAAW,CAAC;QACzF,cAAc,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC;QACxG,mBAAmB,EAAE,CAAC,MAAM,EAAE,EAAE;YAC9B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,QAAQ;gBAAE,gCAAgC,CAAC,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACvF,CAAC;QACD,uBAAuB,EAAE,CAAC,aAAa,EAAE,EAAE;YACzC,KAAK,uBAAuB,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,aAAa,CAAC,CAAC;QACxG,CAAC;QACD,eAAe,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,eAAe,CAAC,cAAc,EAAE,gBAAgB,CAAC;QACtF,QAAQ,EAAE,YAAY;KACvB,CAAC;AACJ,CAAC"}
|
|
@@ -9,8 +9,11 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { type CiSensorDeps } from '../ci/ci-sensor-loop.js';
|
|
11
11
|
import { type RedRunAttributionDeps } from '../ci/ci-red-attribution.js';
|
|
12
|
+
import { type CiRunSpanDeps } from '../ci/ci-run-spans.js';
|
|
12
13
|
/** The red-run attribution IO: git reads plus the delivery -> focus lookup. */
|
|
13
14
|
export declare function buildRedRunAttributionDeps(): RedRunAttributionDeps;
|
|
15
|
+
/** The CI run span writes' IO, sharing the ci_run_red attribution. */
|
|
16
|
+
export declare function buildCiRunSpanDeps(attribution?: RedRunAttributionDeps): CiRunSpanDeps;
|
|
14
17
|
/** The CI sensor tick's collaborators. */
|
|
15
18
|
export declare function buildCiSensorDeps(): CiSensorDeps;
|
|
16
19
|
//# sourceMappingURL=execution-ci-context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-ci-context.d.ts","sourceRoot":"","sources":["../../src/composition/execution-ci-context.ts"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AAEH,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"execution-ci-context.d.ts","sourceRoot":"","sources":["../../src/composition/execution-ci-context.ts"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AAEH,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,uBAAuB,CAAC;AAQ/B,+EAA+E;AAC/E,wBAAgB,0BAA0B,IAAI,qBAAqB,CAQlE;AAmBD,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,WAAW,GAAE,qBAAoD,GAAG,aAAa,CAUnH;AAED,0CAA0C;AAC1C,wBAAgB,iBAAiB,IAAI,YAAY,CAahD"}
|