@kici-dev/orchestrator 0.1.20 → 0.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/dispatcher.d.ts +44 -0
- package/dist/agent/host-roster-reaper.d.ts +2 -1
- package/dist/agent/host-roster.d.ts +54 -1
- package/dist/agent/registry.d.ts +22 -0
- package/dist/app.d.ts +5 -0
- package/dist/approvals/step-approval-bridge.d.ts +5 -0
- package/dist/cli/commands/source-manifest.d.ts +42 -0
- package/dist/cli/loopback-callback.d.ts +24 -0
- package/dist/cli/open-browser.d.ts +12 -0
- package/dist/cli/service/compose.d.ts +13 -0
- package/dist/cli/service/deploy-env.d.ts +31 -0
- package/dist/cli.js +1204 -256
- package/dist/cluster/coordinator.d.ts +5 -3
- package/dist/cluster/index.d.ts +2 -0
- package/dist/cluster/join-token.d.ts +27 -5
- package/dist/cluster/peer-auth-coordinator.d.ts +36 -0
- package/dist/cluster/peer-client.d.ts +34 -14
- package/dist/cluster/peer-credentials.d.ts +14 -2
- package/dist/cluster/peer-handler.d.ts +2 -2
- package/dist/cluster/rerouted-job-guard.d.ts +39 -0
- package/dist/config.d.ts +6 -0
- package/dist/dashboard/needs-edges.d.ts +4 -3
- package/dist/db/migrations/043_rerouted_to_peer.d.ts +4 -0
- package/dist/db/migrations/044_check_mode.d.ts +4 -0
- package/dist/db/migrations/045_host_properties.d.ts +16 -0
- package/dist/db/migrations/046_join_token_consumed_by_instance.d.ts +17 -0
- package/dist/db/migrations/047_needs_run_on.d.ts +4 -0
- package/dist/db/migrations/048_host_reboot_pending.d.ts +19 -0
- package/dist/db/migrations/049_held_runs_payload.d.ts +14 -0
- package/dist/db/migrations/050_sources_slug.d.ts +17 -0
- package/dist/db/types.d.ts +60 -5
- package/dist/deployment/deployment-identity.d.ts +9 -0
- package/dist/entry-helpers.d.ts +7 -0
- package/dist/environments/held-runs.d.ts +7 -1
- package/dist/github-app-name-refresher/github-app-name-refresher.d.ts +77 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.js +1187 -33
- package/dist/lockfile-validate.d.ts +24 -0
- package/dist/orchestrator-core.d.ts +13 -1
- package/dist/pipeline/decorating-secret-resolver.d.ts +32 -0
- package/dist/pipeline/dispatch-matched-workflow.d.ts +127 -3
- package/dist/pipeline/install-secrets-resolver.d.ts +2 -2
- package/dist/pipeline/needs-scheduler.d.ts +22 -13
- package/dist/pipeline/processor.d.ts +2 -2
- package/dist/pipeline/test-pipeline.d.ts +37 -58
- package/dist/providers/github/manifest-form.d.ts +15 -0
- package/dist/providers/github/manifest.d.ts +103 -0
- package/dist/reporting/execution-tracker.d.ts +10 -1
- package/dist/routes/admin-sources.d.ts +18 -0
- package/dist/routes/admin.d.ts +8 -0
- package/dist/secrets/pg-secret-store.d.ts +9 -0
- package/dist/secrets/secret-resolver.d.ts +16 -1
- package/dist/server.js +4373 -2322
- package/dist/sources/source-store.d.ts +4 -0
- package/dist/sources/source-validator.d.ts +2 -0
- package/dist/stale-detector/reboot-deadline-sweep.d.ts +29 -0
- package/dist/stale-detector/stale-run-detector.d.ts +8 -0
- package/dist/standalone.js +3582 -1932
- package/dist/worker/in-memory-job-queue.d.ts +17 -0
- package/dist/worker/peer-outbox.d.ts +36 -0
- package/dist/worker/worker-outbox-relay.d.ts +13 -0
- package/dist/ws/agent-handler.d.ts +11 -6
- package/dist/ws/dashboard-fleet-handler.d.ts +33 -0
- package/dist/ws/dashboard-fleet-write-handler.d.ts +60 -0
- package/dist/ws/fleet-runs-on-all.d.ts +16 -0
- package/dist/ws/inventory-api.d.ts +17 -0
- package/dist/ws/platform-client.d.ts +13 -1
- package/dist/ws/test-relay-handlers.d.ts +4 -2
- package/installer-image-digests.json +3 -3
- package/package.json +4 -4
- package/sbom.spdx.json +77 -128
|
@@ -42,6 +42,23 @@ export declare class InMemoryJobQueue {
|
|
|
42
42
|
* labels no longer match, or the agent's gate is not satisfied.
|
|
43
43
|
*/
|
|
44
44
|
dequeueById(jobId: string, agentLabels: string[], agentMandatoryLabels?: string[]): Promise<QueuedJob | null>;
|
|
45
|
+
/**
|
|
46
|
+
* Dequeue the oldest pending job pinned to a specific agent. Mirrors the
|
|
47
|
+
* DB-backed `JobQueue.dequeueByPinnedAgent` that `Dispatcher.onAgentAvailable`
|
|
48
|
+
* calls — host-fanout children pinned to THIS agent drain before the generic
|
|
49
|
+
* label drain. Like the DB version, a pinned job relaxes the label-subset
|
|
50
|
+
* gate (the agent is its designated runner) and only the JS regex
|
|
51
|
+
* post-filter is applied.
|
|
52
|
+
*
|
|
53
|
+
* The worker receives jobs via direct P2P dispatch and does not currently
|
|
54
|
+
* pin jobs to agents, so in practice no in-memory job carries a
|
|
55
|
+
* `pinnedAgentId` and this returns null — `onAgentAvailable` then falls back
|
|
56
|
+
* to `dequeueForLabels`. Implementing it (rather than leaving it undefined)
|
|
57
|
+
* is mandatory: `Dispatcher.onAgentAvailable` invokes it unconditionally, so
|
|
58
|
+
* its absence threw `TypeError: this.queue.dequeueByPinnedAgent is not a
|
|
59
|
+
* function` as an unhandled rejection that crashed the worker.
|
|
60
|
+
*/
|
|
61
|
+
dequeueByPinnedAgent(agentId: string, agentLabels?: string[]): Promise<QueuedJob | null>;
|
|
45
62
|
/** Return count of pending jobs. */
|
|
46
63
|
getDepth(): Promise<number>;
|
|
47
64
|
/** No-op — the job is already tracked in `dispatched` from dequeue. */
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { JobProgress } from '@kici-dev/engine';
|
|
2
|
+
export interface OutboxRecord {
|
|
3
|
+
coordUrl: string;
|
|
4
|
+
message: JobProgress;
|
|
5
|
+
persistedAt: number;
|
|
6
|
+
}
|
|
7
|
+
/** Durable, at-least-once store of terminal job.progress awaiting coordinator ACK. */
|
|
8
|
+
export declare class PeerOutbox {
|
|
9
|
+
private readonly dir;
|
|
10
|
+
private readonly now;
|
|
11
|
+
private readonly records;
|
|
12
|
+
constructor(dir: string, now?: () => number);
|
|
13
|
+
private static coordKey;
|
|
14
|
+
private static recordKey;
|
|
15
|
+
private fileFor;
|
|
16
|
+
loadFromDisk(): Promise<void>;
|
|
17
|
+
enqueue(coordUrl: string, message: JobProgress): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Synchronous, durably-fsynced enqueue. The terminal job status is on disk
|
|
20
|
+
* before this method returns — there is no async window in which an
|
|
21
|
+
* un-flushed write can be lost if the worker process is killed moments
|
|
22
|
+
* later (e.g. a worker orchestrator that crashes during microVM teardown
|
|
23
|
+
* right after the job completes). The asynchronous {@link enqueue} is
|
|
24
|
+
* fire-and-forget at its call site, so its fsync can be dropped when the
|
|
25
|
+
* event loop never runs again; this variant blocks the (infrequent,
|
|
26
|
+
* once-per-job-terminal) call path until the bytes are durable instead.
|
|
27
|
+
*/
|
|
28
|
+
enqueueSync(coordUrl: string, message: JobProgress): void;
|
|
29
|
+
ack(coordUrl: string, runId: string, jobId: string): Promise<void>;
|
|
30
|
+
pendingFor(coordUrl: string): OutboxRecord[];
|
|
31
|
+
prune(ttlMs: number, now?: number): Promise<number>;
|
|
32
|
+
private fsync;
|
|
33
|
+
private fsyncDir;
|
|
34
|
+
private fsyncDirSync;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=peer-outbox.d.ts.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Relay glue between the worker's in-memory execution tracker and the durable
|
|
3
|
+
* peer outbox. Extracted so the mapping/replay logic is unit-testable and so
|
|
4
|
+
* the worker bootstrap stays under the function-length cap.
|
|
5
|
+
*/
|
|
6
|
+
import { type JobProgress } from '@kici-dev/engine';
|
|
7
|
+
import type { StatusUpdate } from './in-memory-execution-tracker.js';
|
|
8
|
+
import type { PeerOutbox } from './peer-outbox.js';
|
|
9
|
+
/** Map a terminal job-level StatusUpdate to the JobProgress to durably relay; null otherwise. */
|
|
10
|
+
export declare function buildTerminalJobProgress(update: StatusUpdate): JobProgress | null;
|
|
11
|
+
/** Re-send every outbox record destined for `url`. Send failures are retried on the next connect. */
|
|
12
|
+
export declare function replayPending(outbox: PeerOutbox, send: (m: JobProgress) => boolean, url: string): void;
|
|
13
|
+
//# sourceMappingURL=worker-outbox-relay.d.ts.map
|
|
@@ -227,12 +227,13 @@ export interface AgentWsHandlerDeps {
|
|
|
227
227
|
reason?: string;
|
|
228
228
|
}>;
|
|
229
229
|
/**
|
|
230
|
-
* Optional callback when an agent blocks
|
|
231
|
-
* creates a step-scoped hold from the carried clauses and
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
* pending resolver when the
|
|
230
|
+
* Optional callback when an agent blocks an `approval` step. The server
|
|
231
|
+
* creates a step-scoped hold from the carried clauses (and the drift
|
|
232
|
+
* `payload` for a `when: 'drift'` gate) and returns a promise that resolves
|
|
233
|
+
* when the hold is approved, rejected, or expired. The handler relays the
|
|
234
|
+
* resolution back to the originating agent as a `step.approval-resolved`
|
|
235
|
+
* message. The `agentId` lets the server drop the pending resolver when the
|
|
236
|
+
* agent disconnects.
|
|
236
237
|
*/
|
|
237
238
|
onStepApproval?: (agentId: string, msg: {
|
|
238
239
|
runId: string;
|
|
@@ -246,6 +247,10 @@ export interface AgentWsHandlerDeps {
|
|
|
246
247
|
}>;
|
|
247
248
|
reason: string;
|
|
248
249
|
timeoutSeconds?: number;
|
|
250
|
+
payload?: {
|
|
251
|
+
summaryMarkdown: string;
|
|
252
|
+
drift: unknown;
|
|
253
|
+
};
|
|
249
254
|
}) => Promise<{
|
|
250
255
|
outcome: 'approved' | 'rejected' | 'expired';
|
|
251
256
|
reason?: string;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator-side handlers for the fleet-management read path (P2).
|
|
3
|
+
*
|
|
4
|
+
* Each handler answers one Platform->orchestrator read-relay request from
|
|
5
|
+
* `HostRosterStore`, returning the canonical `HostInventoryEntry` shape on the
|
|
6
|
+
* wire. The handlers are pure (they take their dependencies as arguments) so
|
|
7
|
+
* the WS wiring in `server.ts` stays a thin adapter and the logic is unit
|
|
8
|
+
* testable without a live DB / Platform connection.
|
|
9
|
+
*/
|
|
10
|
+
import type { Kysely } from 'kysely';
|
|
11
|
+
import type { Database } from '../db/types.js';
|
|
12
|
+
import { HostRosterStore } from '../agent/host-roster.js';
|
|
13
|
+
import type { DashboardFleetHostsResponse, DashboardFleetHostResponse, DashboardFleetPreviewResponse, LabelMatcher, OnUnreachableMode } from '@kici-dev/engine';
|
|
14
|
+
/** A workflow's resolved runsOnAll predicate, or null when it has none. */
|
|
15
|
+
export interface ResolvedRunsOnAll {
|
|
16
|
+
include: readonly (readonly LabelMatcher[])[];
|
|
17
|
+
exclude: readonly LabelMatcher[];
|
|
18
|
+
onUnreachable: OnUnreachableMode;
|
|
19
|
+
}
|
|
20
|
+
export interface FleetHandlerDeps {
|
|
21
|
+
db: Kysely<Database>;
|
|
22
|
+
rosterStore: HostRosterStore;
|
|
23
|
+
rosterGraceMs: number;
|
|
24
|
+
/** Resolve a workflow's runsOnAll predicate + onUnreachable, or null. */
|
|
25
|
+
resolveRunsOnAll: (workflowName: string) => Promise<ResolvedRunsOnAll | null>;
|
|
26
|
+
}
|
|
27
|
+
/** Roster: every declared/live host as a `HostInventoryEntry`. */
|
|
28
|
+
export declare function handleFleetHostsRequest(deps: FleetHandlerDeps, requestId: string): Promise<DashboardFleetHostsResponse>;
|
|
29
|
+
/** Host detail: one host (or null) plus its most-recent pinned runs. */
|
|
30
|
+
export declare function handleFleetHostRequest(deps: FleetHandlerDeps, requestId: string, agentId: string): Promise<DashboardFleetHostResponse>;
|
|
31
|
+
/** runsOnAll preview: matched hosts + the fan-out policy + estimated child count. */
|
|
32
|
+
export declare function handleFleetPreviewRequest(deps: FleetHandlerDeps, requestId: string, workflowName: string): Promise<DashboardFleetPreviewResponse>;
|
|
33
|
+
//# sourceMappingURL=dashboard-fleet-handler.d.ts.map
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { FleetHostDeclareRequest, FleetHostRemoveRequest } from '@kici-dev/engine';
|
|
2
|
+
import type { Kysely } from 'kysely';
|
|
3
|
+
import type { Database } from '../db/types.js';
|
|
4
|
+
import type { HostRosterStore } from '../agent/host-roster.js';
|
|
5
|
+
import type { AccessLogWriter } from '../audit/access-log.js';
|
|
6
|
+
interface DashboardFleetWriteHandlerDeps {
|
|
7
|
+
/** Send a response message back to Platform over the WS connection. */
|
|
8
|
+
send: (msg: unknown) => void;
|
|
9
|
+
/** The orchestrator host roster store (declare / remove). */
|
|
10
|
+
rosterStore: HostRosterStore;
|
|
11
|
+
/** Database — required for dashboard-write policy lookups. */
|
|
12
|
+
db: Kysely<Database>;
|
|
13
|
+
/** Access log writer — records one row per mutation with actor attribution. */
|
|
14
|
+
accessLog?: AccessLogWriter;
|
|
15
|
+
/** Org ID for access_log rows (null when the orchestrator isn't org-scoped). */
|
|
16
|
+
orgId?: string | null;
|
|
17
|
+
/** Routing key for access_log rows (null when not run-scoped). */
|
|
18
|
+
routingKey?: string | null;
|
|
19
|
+
}
|
|
20
|
+
/** Messages this handler owns. */
|
|
21
|
+
type FleetWriteMessage = FleetHostDeclareRequest | FleetHostRemoveRequest;
|
|
22
|
+
/**
|
|
23
|
+
* Handler for the fleet host-write WS messages. Dispatches by type and calls
|
|
24
|
+
* the host roster store behind the dashboard-write policy gate.
|
|
25
|
+
*/
|
|
26
|
+
export declare class DashboardFleetWriteHandler {
|
|
27
|
+
private readonly deps;
|
|
28
|
+
private orgId;
|
|
29
|
+
private routingKey;
|
|
30
|
+
private readonly accessLog;
|
|
31
|
+
constructor(deps: DashboardFleetWriteHandlerDeps);
|
|
32
|
+
/**
|
|
33
|
+
* Update the bound orgId + routingKey. Called from server.ts after resolving
|
|
34
|
+
* the single tenant org from the `sources` / `generic_webhook_sources` table.
|
|
35
|
+
*/
|
|
36
|
+
setOrgContext(orgId: string | null, routingKey: string | null): void;
|
|
37
|
+
/**
|
|
38
|
+
* Defense-in-depth dashboard-write policy gate. Returns true when the
|
|
39
|
+
* operation is allowed and the caller should proceed. Returns false when the
|
|
40
|
+
* policy is disabled — also records a `denied` access_log row and emits a
|
|
41
|
+
* structured `operation_disabled` envelope on the WS.
|
|
42
|
+
*
|
|
43
|
+
* Fails open when no org is bound — the orch hasn't resolved a customer yet.
|
|
44
|
+
*/
|
|
45
|
+
private enforcePolicy;
|
|
46
|
+
/**
|
|
47
|
+
* Write an access_log row for a handler invocation. Best-effort; the writer
|
|
48
|
+
* swallows failures.
|
|
49
|
+
*/
|
|
50
|
+
private recordAccess;
|
|
51
|
+
/**
|
|
52
|
+
* Route a fleet host-write message to the appropriate handler. Returns true
|
|
53
|
+
* if the message was handled, false otherwise.
|
|
54
|
+
*/
|
|
55
|
+
handleMessage(msg: FleetWriteMessage): Promise<boolean>;
|
|
56
|
+
private handleDeclare;
|
|
57
|
+
private handleRemove;
|
|
58
|
+
}
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=dashboard-fleet-write-handler.d.ts.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a workflow's `runsOnAll` host-fan-out predicate from the orchestrator's
|
|
3
|
+
* persisted registrations, for the fleet runsOnAll-preview read path.
|
|
4
|
+
*
|
|
5
|
+
* The orchestrator stores each registered workflow's full lock entry in
|
|
6
|
+
* `workflow_registrations.lock_entry` (JSON). This reader parses that entry,
|
|
7
|
+
* finds the first static job carrying a `runsOnAll` predicate, and returns its
|
|
8
|
+
* `{ include, exclude, onUnreachable }` — or null when no registered workflow of
|
|
9
|
+
* that name declares a host fan-out.
|
|
10
|
+
*/
|
|
11
|
+
import type { Kysely } from 'kysely';
|
|
12
|
+
import type { Database } from '../db/types.js';
|
|
13
|
+
import type { ResolvedRunsOnAll } from './dashboard-fleet-handler.js';
|
|
14
|
+
/** Find the resolved runsOnAll predicate for a workflow by name, or null. */
|
|
15
|
+
export declare function resolveWorkflowRunsOnAll(db: Kysely<Database>, workflowName: string): Promise<ResolvedRunsOnAll | null>;
|
|
16
|
+
//# sourceMappingURL=fleet-runs-on-all.d.ts.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type HostInventoryEntry } from '@kici-dev/engine';
|
|
2
|
+
import type { HostRosterStore } from '../agent/host-roster.js';
|
|
3
|
+
/** Store surface the inventory handlers need (kept narrow for testability). */
|
|
4
|
+
export interface InventoryApiDeps {
|
|
5
|
+
rosterStore: Pick<HostRosterStore, 'queryInventory' | 'getInventory'>;
|
|
6
|
+
/** Roster grace window (ms) — the same value runsOnAll's `findMatching` uses. */
|
|
7
|
+
graceMs: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Build the `inventory.query` handler. Validates the optional label selector
|
|
11
|
+
* (`include` OR-of-AND groups + `exclude`); an empty selector ⇒ all hosts.
|
|
12
|
+
* Property filtering is done client-side in the workflow.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createInventoryQueryHandler(deps: InventoryApiDeps): (agentId: string, params: Record<string, unknown>) => Promise<HostInventoryEntry[]>;
|
|
15
|
+
/** Build the `inventory.get` handler — single-host lookup, null when absent. */
|
|
16
|
+
export declare function createInventoryGetHandler(deps: InventoryApiDeps): (agentId: string, params: Record<string, unknown>) => Promise<HostInventoryEntry | null>;
|
|
17
|
+
//# sourceMappingURL=inventory-api.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type OrchestratorToPlatformMessage, type WebhookRelay, type WebhookRelayResult, type TrustPolicyUpdate, type StaleCheckrunCleanup, type DashboardRunDetailRequest, type DashboardRunsListRequest, type DashboardRunsFiltersRequest, type DashboardSourcesListRequest, type DashboardStepLogsRequest, type DashboardAttestationsListRequest, type DashboardOrchLogsRequest, type RunRerunRequest, type ManualScheduleRequest, type RunCancelRequest, type DashboardPayloadRequest, type DashboardPlatformToOrchMessage, type TestRelayRequest, type DashboardDiagnosticsRequest, type DashboardScalerCapacityRequest, type DashboardScalerAgentsRequest, type JoinRequest, type JoinResponse, type OrchCapabilities, type OrchRole } from '@kici-dev/engine';
|
|
1
|
+
import { type OrchestratorToPlatformMessage, type WebhookRelay, type WebhookRelayResult, type TrustPolicyUpdate, type StaleCheckrunCleanup, type DashboardRunDetailRequest, type DashboardRunsListRequest, type DashboardRunsFiltersRequest, type DashboardSourcesListRequest, type DashboardStepLogsRequest, type DashboardAttestationsListRequest, type DashboardOrchLogsRequest, type RunRerunRequest, type ManualScheduleRequest, type RunCancelRequest, type DashboardPayloadRequest, type DashboardPlatformToOrchMessage, type TestRelayRequest, type DashboardDiagnosticsRequest, type DashboardScalerCapacityRequest, type DashboardScalerAgentsRequest, type DashboardFleetHostsRequest, type DashboardFleetHostRequest, type DashboardFleetPreviewRequest, type JoinRequest, type JoinResponse, type DeploymentIdentity, type OrchCapabilities, type OrchRole } from '@kici-dev/engine';
|
|
2
2
|
import { RelayBufferRegistry, type RelayStartMeta } from '../webhook/relay-buffer.js';
|
|
3
3
|
/**
|
|
4
4
|
* Verification + processing outcome returned by the chunked relay path's
|
|
@@ -58,6 +58,8 @@ export interface PlatformClientOptions {
|
|
|
58
58
|
mode?: string;
|
|
59
59
|
/** Scaler backends configured (e.g. ["container", "firecracker"]). Sent in source.register for diagnostics. */
|
|
60
60
|
scalerBackends?: string[];
|
|
61
|
+
/** How the orchestrator process was deployed. Sent in source.register so the dashboard can build the correct kici-admin invocation. */
|
|
62
|
+
deployment?: DeploymentIdentity;
|
|
61
63
|
/** Whether this orchestrator has S3 log storage configured. Sent in source.register for pool validation. */
|
|
62
64
|
s3LogAccess?: boolean;
|
|
63
65
|
/** Queue timeout in ms. Sent in source.register for Platform safety-net GC. */
|
|
@@ -134,6 +136,12 @@ export interface PlatformClientOptions {
|
|
|
134
136
|
onDashboardScalerCapacity?: (msg: DashboardScalerCapacityRequest) => void;
|
|
135
137
|
/** Optional callback for dashboard scaler agents requests from Platform. */
|
|
136
138
|
onDashboardScalerAgents?: (msg: DashboardScalerAgentsRequest) => void;
|
|
139
|
+
/** Optional callback for fleet roster requests from Platform. */
|
|
140
|
+
onFleetHosts?: (msg: DashboardFleetHostsRequest) => void;
|
|
141
|
+
/** Optional callback for fleet host-detail requests from Platform. */
|
|
142
|
+
onFleetHost?: (msg: DashboardFleetHostRequest) => void;
|
|
143
|
+
/** Optional callback for fleet runsOnAll-preview requests from Platform. */
|
|
144
|
+
onFleetPreview?: (msg: DashboardFleetPreviewRequest) => void;
|
|
137
145
|
/** Optional callback for trust policy updates pushed from Platform. */
|
|
138
146
|
onTrustPolicyUpdate?: (msg: TrustPolicyUpdate) => void;
|
|
139
147
|
/** Optional callback for stale check run cleanup requests from Platform. */
|
|
@@ -192,6 +200,7 @@ export declare class PlatformClient {
|
|
|
192
200
|
private readonly version?;
|
|
193
201
|
private readonly mode?;
|
|
194
202
|
private readonly scalerBackends?;
|
|
203
|
+
private readonly deployment?;
|
|
195
204
|
private readonly s3LogAccess?;
|
|
196
205
|
private readonly queueTimeoutMs?;
|
|
197
206
|
private readonly heartbeatIntervalMs;
|
|
@@ -216,6 +225,9 @@ export declare class PlatformClient {
|
|
|
216
225
|
private readonly onDashboardDiagnostics?;
|
|
217
226
|
private readonly onDashboardScalerCapacity?;
|
|
218
227
|
private readonly onDashboardScalerAgents?;
|
|
228
|
+
private readonly onFleetHosts?;
|
|
229
|
+
private readonly onFleetHost?;
|
|
230
|
+
private readonly onFleetPreview?;
|
|
219
231
|
private readonly onTrustPolicyUpdate?;
|
|
220
232
|
private readonly onStaleCheckrunCleanup?;
|
|
221
233
|
private readonly onJoinRequest?;
|
|
@@ -16,10 +16,12 @@ import type { Database } from '../db/types.js';
|
|
|
16
16
|
import type { CacheStorage } from '../storage/types.js';
|
|
17
17
|
import type { LogStorage } from '../reporting/log-storage.js';
|
|
18
18
|
import type { AccessLogWriter } from '../audit/access-log.js';
|
|
19
|
-
import {
|
|
19
|
+
import type { ProcessingDeps } from '../pipeline/processor.js';
|
|
20
20
|
/** Dependencies shared by all five test-relay handlers. */
|
|
21
|
-
export interface TestRelayHandlerDeps extends
|
|
21
|
+
export interface TestRelayHandlerDeps extends ProcessingDeps {
|
|
22
22
|
db: Kysely<Database>;
|
|
23
|
+
/** Agent registry — required here: the cancel handler resolves the job's agent. */
|
|
24
|
+
agentRegistry: NonNullable<ProcessingDeps['agentRegistry']>;
|
|
23
25
|
cacheStorage?: CacheStorage;
|
|
24
26
|
logStorage?: LogStorage;
|
|
25
27
|
accessLog?: AccessLogWriter;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.1.
|
|
2
|
+
"version": "0.1.22",
|
|
3
3
|
"images": {
|
|
4
|
-
"kici-agent": "sha256:
|
|
5
|
-
"kici-orchestrator": "sha256:
|
|
4
|
+
"kici-agent": "sha256:7d3b048a45f46f51b843944ce106514094f2aac428ffe3aa35d8a97b174b553f",
|
|
5
|
+
"kici-orchestrator": "sha256:98e3b1ef13a3d28844b48ecbfbf26b982fc6fe12292cf138959721c08b48eabe"
|
|
6
6
|
}
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kici-dev/orchestrator",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.22",
|
|
4
4
|
"description": "Customer-deployable orchestrator for the KiCI CI/CD stack. Receives webhook events (direct or via Platform relay), matches triggers against the lock file, and dispatches jobs to connected agents.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ci",
|
|
@@ -86,8 +86,8 @@
|
|
|
86
86
|
"ws": "^8.21.0",
|
|
87
87
|
"yaml": "^2.9.0",
|
|
88
88
|
"zod": "^4.4.3",
|
|
89
|
-
"@kici-dev/
|
|
90
|
-
"@kici-dev/
|
|
89
|
+
"@kici-dev/engine": "0.1.22",
|
|
90
|
+
"@kici-dev/shared": "0.1.22"
|
|
91
91
|
},
|
|
92
92
|
"kici": {
|
|
93
93
|
"metrics": {
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
"@types/archiver": "^8.0.0",
|
|
102
102
|
"@types/dockerode": "^4.0.1",
|
|
103
103
|
"kysely-ctl": "^0.21.0",
|
|
104
|
-
"@kici-dev/agent": "0.1.
|
|
104
|
+
"@kici-dev/agent": "0.1.22"
|
|
105
105
|
},
|
|
106
106
|
"scripts": {
|
|
107
107
|
"build": "node ../../scripts/build-service.mjs && tsc --emitDeclarationOnly",
|