@groundnuty/macf-core 0.2.44 → 0.2.46
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/discovery.d.ts +59 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +103 -0
- package/dist/discovery.js.map +1 -0
- package/dist/fleet-driver.d.ts +135 -0
- package/dist/fleet-driver.d.ts.map +1 -0
- package/dist/fleet-driver.js +44 -0
- package/dist/fleet-driver.js.map +1 -0
- package/dist/fleet-reconcile.d.ts +180 -0
- package/dist/fleet-reconcile.d.ts.map +1 -0
- package/dist/fleet-reconcile.js +249 -0
- package/dist/fleet-reconcile.js.map +1 -0
- package/dist/fleet-upgrade.d.ts +171 -0
- package/dist/fleet-upgrade.d.ts.map +1 -0
- package/dist/fleet-upgrade.js +177 -0
- package/dist/fleet-upgrade.js.map +1 -0
- package/dist/guest.d.ts +100 -0
- package/dist/guest.d.ts.map +1 -0
- package/dist/guest.js +120 -0
- package/dist/guest.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/norm.d.ts +2 -2
- package/dist/prompt-responses.d.ts +208 -0
- package/dist/prompt-responses.d.ts.map +1 -0
- package/dist/prompt-responses.js +274 -0
- package/dist/prompt-responses.js.map +1 -0
- package/dist/registry/local-client.d.ts.map +1 -1
- package/dist/registry/local-client.js +15 -9
- package/dist/registry/local-client.js.map +1 -1
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/registry.js +91 -27
- package/dist/registry/registry.js.map +1 -1
- package/dist/registry/types.d.ts +57 -12
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/registry/types.js.map +1 -1
- package/dist/stall-signatures.d.ts +139 -0
- package/dist/stall-signatures.d.ts.map +1 -0
- package/dist/stall-signatures.js +219 -0
- package/dist/stall-signatures.js.map +1 -0
- package/dist/verify-green.d.ts +62 -0
- package/dist/verify-green.d.ts.map +1 -0
- package/dist/verify-green.js +53 -0
- package/dist/verify-green.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The workspace-discovery record + its pure helpers (DR-037 Decision 4).
|
|
3
|
+
*
|
|
4
|
+
* This is the shared substrate the fleet operational-layer subcommands consume:
|
|
5
|
+
* `macf ps` (alive∪dead enumeration), `macf fleet upgrade` (group-by-registry →
|
|
6
|
+
* fleets), and the watchdog (desired-set reconcile) all read the same primitive.
|
|
7
|
+
*
|
|
8
|
+
* The record shape + the RUNTIME-and-CLI-independent helpers live HERE in
|
|
9
|
+
* macf-core (DR-037 OQ2 — pure/portable logic in macf-core); the VM-filesystem
|
|
10
|
+
* scan that PRODUCES the records is `discoverWorkspaces()` in `packages/macf`
|
|
11
|
+
* (it's `/proc`- and FS-topology-specific, so it stays driver-side).
|
|
12
|
+
*
|
|
13
|
+
* The host-operational plane is registry-FREE (DR-037 Decision 1/4): records are
|
|
14
|
+
* sourced by scanning the filesystem for the `.macf/` marker, NOT by querying any
|
|
15
|
+
* registry. This is a search-path *discovery*, not a fourth drift-prone source of
|
|
16
|
+
* truth (`check-before-propose §4`).
|
|
17
|
+
*/
|
|
18
|
+
import { z } from 'zod';
|
|
19
|
+
import type { RegistryConfig } from './registry/types.js';
|
|
20
|
+
/**
|
|
21
|
+
* One discovered agent workspace on a host — the unit of the host-operational
|
|
22
|
+
* plane. Registry-free; produced by the `.macf/`-marker filesystem scan.
|
|
23
|
+
*/
|
|
24
|
+
export declare const WorkspaceRecordSchema: z.ZodObject<{
|
|
25
|
+
agent: z.ZodString;
|
|
26
|
+
workspace: z.ZodString;
|
|
27
|
+
registry: z.ZodString;
|
|
28
|
+
versionPin: z.ZodNullable<z.ZodString>;
|
|
29
|
+
}, z.core.$strip>;
|
|
30
|
+
export type WorkspaceRecord = z.infer<typeof WorkspaceRecordSchema>;
|
|
31
|
+
/**
|
|
32
|
+
* Render a `RegistryConfig` as its stable fleet-grouping identifier (a "fleet"
|
|
33
|
+
* == a registry — DR-037 Decision 1). Pure.
|
|
34
|
+
*
|
|
35
|
+
* - `repo` → `owner/repo`
|
|
36
|
+
* - `org` → the org name
|
|
37
|
+
* - `profile` → the profile user name (the substrate case: every `groundnuty`
|
|
38
|
+
* profile-registry workspace groups into one fleet)
|
|
39
|
+
* - `local` → `local` (DR-024)
|
|
40
|
+
*
|
|
41
|
+
* Org and profile scopes collapse to a bare name; a theoretical `org foo` vs
|
|
42
|
+
* `profile foo` collision is accepted for this grouping heuristic (they are not
|
|
43
|
+
* both used by one host in practice) and keeps the identifier human-legible.
|
|
44
|
+
*/
|
|
45
|
+
export declare function registryIdentifier(config: RegistryConfig): string;
|
|
46
|
+
/**
|
|
47
|
+
* Split a `MACF_WORKSPACE_ROOT` env value into individual root paths. Pure.
|
|
48
|
+
* Colon-separated (PATH-style), trimmed, empties dropped. An unset / empty
|
|
49
|
+
* value yields `[]` so the caller can fall back to its sensible default.
|
|
50
|
+
*/
|
|
51
|
+
export declare function splitWorkspaceRoots(envValue: string | undefined | null): readonly string[];
|
|
52
|
+
/**
|
|
53
|
+
* De-duplicate workspace records by their canonical `workspace` path, keeping
|
|
54
|
+
* first occurrence. Pure. Overlapping discovery roots (e.g. `$HOME/repos` and
|
|
55
|
+
* the parent-of-the-current-workspace) surface the same workspace twice; the
|
|
56
|
+
* records carry canonical paths so string-equality dedup is exact.
|
|
57
|
+
*/
|
|
58
|
+
export declare function dedupeWorkspaces(records: readonly WorkspaceRecord[]): readonly WorkspaceRecord[];
|
|
59
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;iBAuBhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAWjE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,MAAM,EAAE,CAM1F;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,SAAS,eAAe,EAAE,GAClC,SAAS,eAAe,EAAE,CAS5B"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The workspace-discovery record + its pure helpers (DR-037 Decision 4).
|
|
3
|
+
*
|
|
4
|
+
* This is the shared substrate the fleet operational-layer subcommands consume:
|
|
5
|
+
* `macf ps` (alive∪dead enumeration), `macf fleet upgrade` (group-by-registry →
|
|
6
|
+
* fleets), and the watchdog (desired-set reconcile) all read the same primitive.
|
|
7
|
+
*
|
|
8
|
+
* The record shape + the RUNTIME-and-CLI-independent helpers live HERE in
|
|
9
|
+
* macf-core (DR-037 OQ2 — pure/portable logic in macf-core); the VM-filesystem
|
|
10
|
+
* scan that PRODUCES the records is `discoverWorkspaces()` in `packages/macf`
|
|
11
|
+
* (it's `/proc`- and FS-topology-specific, so it stays driver-side).
|
|
12
|
+
*
|
|
13
|
+
* The host-operational plane is registry-FREE (DR-037 Decision 1/4): records are
|
|
14
|
+
* sourced by scanning the filesystem for the `.macf/` marker, NOT by querying any
|
|
15
|
+
* registry. This is a search-path *discovery*, not a fourth drift-prone source of
|
|
16
|
+
* truth (`check-before-propose §4`).
|
|
17
|
+
*/
|
|
18
|
+
import { z } from 'zod';
|
|
19
|
+
/**
|
|
20
|
+
* One discovered agent workspace on a host — the unit of the host-operational
|
|
21
|
+
* plane. Registry-free; produced by the `.macf/`-marker filesystem scan.
|
|
22
|
+
*/
|
|
23
|
+
export const WorkspaceRecordSchema = z.object({
|
|
24
|
+
/** The agent's ROUTING label (registry key), e.g. `code-agent` (macf#545). */
|
|
25
|
+
agent: z.string(),
|
|
26
|
+
/**
|
|
27
|
+
* Absolute, symlink-CANONICAL path to the workspace directory (the dir that
|
|
28
|
+
* contains `.macf/`). Canonical so it can be matched against a running
|
|
29
|
+
* process's `readlink /proc/<pid>/cwd` even across a symlinked repo root.
|
|
30
|
+
*/
|
|
31
|
+
workspace: z.string(),
|
|
32
|
+
/**
|
|
33
|
+
* The registry this workspace belongs to, as a stable GROUPING identifier —
|
|
34
|
+
* `owner/repo` (repo scope), the org / profile-user name (org / profile
|
|
35
|
+
* scope), or `local` (DR-024 local-registry mode). A "fleet" == a registry,
|
|
36
|
+
* so `fleet upgrade` groups by this field. Derive via `registryIdentifier`.
|
|
37
|
+
*/
|
|
38
|
+
registry: z.string(),
|
|
39
|
+
/**
|
|
40
|
+
* The workspace's pinned framework version (`.macf/macf-agent.json`
|
|
41
|
+
* `versions.cli`), or `null` when the config carries no pin (legacy / pre-P6).
|
|
42
|
+
* This is the ON-DISK pin — legible with NO process running, so a DEAD agent
|
|
43
|
+
* still reports a version (DR-037 Decision 5, the pinned-vs-running split).
|
|
44
|
+
*/
|
|
45
|
+
versionPin: z.string().nullable(),
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* Render a `RegistryConfig` as its stable fleet-grouping identifier (a "fleet"
|
|
49
|
+
* == a registry — DR-037 Decision 1). Pure.
|
|
50
|
+
*
|
|
51
|
+
* - `repo` → `owner/repo`
|
|
52
|
+
* - `org` → the org name
|
|
53
|
+
* - `profile` → the profile user name (the substrate case: every `groundnuty`
|
|
54
|
+
* profile-registry workspace groups into one fleet)
|
|
55
|
+
* - `local` → `local` (DR-024)
|
|
56
|
+
*
|
|
57
|
+
* Org and profile scopes collapse to a bare name; a theoretical `org foo` vs
|
|
58
|
+
* `profile foo` collision is accepted for this grouping heuristic (they are not
|
|
59
|
+
* both used by one host in practice) and keeps the identifier human-legible.
|
|
60
|
+
*/
|
|
61
|
+
export function registryIdentifier(config) {
|
|
62
|
+
switch (config.type) {
|
|
63
|
+
case 'repo':
|
|
64
|
+
return `${config.owner}/${config.repo}`;
|
|
65
|
+
case 'org':
|
|
66
|
+
return config.org;
|
|
67
|
+
case 'profile':
|
|
68
|
+
return config.user;
|
|
69
|
+
case 'local':
|
|
70
|
+
return 'local';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Split a `MACF_WORKSPACE_ROOT` env value into individual root paths. Pure.
|
|
75
|
+
* Colon-separated (PATH-style), trimmed, empties dropped. An unset / empty
|
|
76
|
+
* value yields `[]` so the caller can fall back to its sensible default.
|
|
77
|
+
*/
|
|
78
|
+
export function splitWorkspaceRoots(envValue) {
|
|
79
|
+
if (!envValue)
|
|
80
|
+
return [];
|
|
81
|
+
return envValue
|
|
82
|
+
.split(':')
|
|
83
|
+
.map((s) => s.trim())
|
|
84
|
+
.filter((s) => s.length > 0);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* De-duplicate workspace records by their canonical `workspace` path, keeping
|
|
88
|
+
* first occurrence. Pure. Overlapping discovery roots (e.g. `$HOME/repos` and
|
|
89
|
+
* the parent-of-the-current-workspace) surface the same workspace twice; the
|
|
90
|
+
* records carry canonical paths so string-equality dedup is exact.
|
|
91
|
+
*/
|
|
92
|
+
export function dedupeWorkspaces(records) {
|
|
93
|
+
const seen = new Set();
|
|
94
|
+
const out = [];
|
|
95
|
+
for (const r of records) {
|
|
96
|
+
if (seen.has(r.workspace))
|
|
97
|
+
continue;
|
|
98
|
+
seen.add(r.workspace);
|
|
99
|
+
out.push(r);
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,8EAA8E;IAC9E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB;;;;OAIG;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB;;;;;OAKG;IACH,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB;;;;;OAKG;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAIH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAsB;IACvD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1C,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,GAAG,CAAC;QACpB,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAmC;IACrE,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,OAAO,QAAQ;SACZ,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAmC;IAEnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YAAE,SAAS;QACpC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACtB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `FleetDriver` interface — the decision/driver boundary (DR-037 Decision 3).
|
|
3
|
+
*
|
|
4
|
+
* The fleet operational-layer has TWO layers and ONLY the bottom is
|
|
5
|
+
* runtime-specific:
|
|
6
|
+
*
|
|
7
|
+
* - **Decision layer** (runtime-agnostic): the reconcile HEAL ladder, the
|
|
8
|
+
* rolling-upgrade sequencer + verify-green, the busy-gate DECISION, the
|
|
9
|
+
* tier-3 `alert` (a `gh issue create` — runtime-agnostic, so it stays in the
|
|
10
|
+
* decision layer, NOT on the driver). It NEVER touches `/proc`, tmux,
|
|
11
|
+
* `capture-pane`, or the K8s API — it drives off `probe()` (the `/health`
|
|
12
|
+
* self-report) and `discoverWorkspaces()`.
|
|
13
|
+
* - **Driver layer** (this interface): the ONLY place a runtime leaks. The
|
|
14
|
+
* decision layer branches on the reconcile tier and calls a driver verb —
|
|
15
|
+
* gated-inject → `inject`; graceful-restart → `restart`; cold-start →
|
|
16
|
+
* `launch`; roll → `upgrade`.
|
|
17
|
+
*
|
|
18
|
+
* **Hard rule (DR-037):** nothing runtime-specific leaks ABOVE the driver line.
|
|
19
|
+
* The `agent` argument is the portable identity — the agent's ROUTING LABEL
|
|
20
|
+
* (the registry key), stable across a VM tmux session, a macOS host, and a
|
|
21
|
+
* far-future K8s pod. A VM driver resolves that name → workspace + tmux session
|
|
22
|
+
* INTERNALLY (via `discoverWorkspaces()` + the workspace config); a K8s driver
|
|
23
|
+
* resolves it → pod. That resolution is the driver's job, never the decision
|
|
24
|
+
* layer's.
|
|
25
|
+
*
|
|
26
|
+
* The interface TYPE lives HERE in macf-core (DR-037 OQ2 — the runtime-and-CLI-
|
|
27
|
+
* independent contract; it references `WorkspaceRecord`, already here). The
|
|
28
|
+
* per-runtime driver BODIES live in `packages/macf` (the VM driver) or a future
|
|
29
|
+
* package (the K8s macf-operator).
|
|
30
|
+
*/
|
|
31
|
+
import { MacfError } from './errors.js';
|
|
32
|
+
import type { WorkspaceRecord } from './discovery.js';
|
|
33
|
+
import type { HealthResponse } from './types.js';
|
|
34
|
+
/**
|
|
35
|
+
* One agent's routing-plane state as `probe()` sees it: its registry endpoint,
|
|
36
|
+
* reachability, self-reported framework version, and the raw `/health` body
|
|
37
|
+
* (which carries `state` idle/busy, `instance_id`, `cert_expiry`, …). Portable —
|
|
38
|
+
* a VM pin and a K8s pod image self-report identically through `/health`.
|
|
39
|
+
*/
|
|
40
|
+
export interface FleetAgentState {
|
|
41
|
+
/** The agent's routing label (registry key). */
|
|
42
|
+
readonly name: string;
|
|
43
|
+
/** Registry-advertised host. */
|
|
44
|
+
readonly host: string;
|
|
45
|
+
/** Registry-advertised port. */
|
|
46
|
+
readonly port: number;
|
|
47
|
+
/** `/health` reachable (mTLS 2xx JSON) at the registry endpoint. */
|
|
48
|
+
readonly online: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* The agent's self-reported framework version (`/health.version`, macf#682),
|
|
51
|
+
* or `null` when offline or reporting a body that predates the field. The
|
|
52
|
+
* runtime-portable version source (DR-037 Decision 5) — NOT the VM-only pin.
|
|
53
|
+
*/
|
|
54
|
+
readonly version: string | null;
|
|
55
|
+
/** Raw `/health` body (incl. `state`/`otel`/`last_processed`), or null when offline. */
|
|
56
|
+
readonly health: HealthResponse | null;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The fleet's routing-plane snapshot — the roster plus each member's `/health`
|
|
60
|
+
* self-report. Built by `FleetDriver.probe()`; consumed by the decision layer's
|
|
61
|
+
* reconcile ladder + rolling-upgrade sequencer. A plain aggregate (computed from
|
|
62
|
+
* live probes, not parsed from a wire), so it's a plain interface — not a Zod
|
|
63
|
+
* schema — mirroring `FleetAgentStatus` in the VM `fleet status` command.
|
|
64
|
+
*/
|
|
65
|
+
export interface FleetState {
|
|
66
|
+
readonly agents: readonly FleetAgentState[];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* A pluggable fleet driver (DR-037 Decision 3). The runtime-agnostic decision
|
|
70
|
+
* layer calls these verbs; each concrete driver (VM, macOS, K8s) implements them
|
|
71
|
+
* with runtime primitives WITHOUT leaking any of that runtime above this line.
|
|
72
|
+
*
|
|
73
|
+
* `probe` + `discoverWorkspaces` are the two READ views (routing plane +
|
|
74
|
+
* host-operational plane, DR-037 Decision 1). The remaining verbs are the
|
|
75
|
+
* MUTATIONS the reconcile/upgrade decision layer drives; the tier-3 `alert`
|
|
76
|
+
* (a GH issue) is deliberately NOT here — it is runtime-agnostic and stays in
|
|
77
|
+
* the decision layer so no GitHub concern leaks into the driver.
|
|
78
|
+
*/
|
|
79
|
+
export interface FleetDriver {
|
|
80
|
+
/**
|
|
81
|
+
* The routing-plane snapshot: the registry roster + each agent's mTLS
|
|
82
|
+
* `/health` (version, idle/busy). Per-agent probe failures are isolated — a
|
|
83
|
+
* single unreachable peer degrades to `online: false`, never aborts the probe.
|
|
84
|
+
*/
|
|
85
|
+
readonly probe: () => Promise<FleetState>;
|
|
86
|
+
/**
|
|
87
|
+
* The host-operational plane's source (DR-037 Decision 4): the host's agent
|
|
88
|
+
* workspaces, ALIVE ∪ DEAD, from the registry-free `.macf/`-marker filesystem
|
|
89
|
+
* scan. VM-filesystem-specific (a K8s driver reads namespaces/labels), so it's
|
|
90
|
+
* a driver method. Synchronous — a pure FS scan.
|
|
91
|
+
*/
|
|
92
|
+
readonly discoverWorkspaces: () => readonly WorkspaceRecord[];
|
|
93
|
+
/**
|
|
94
|
+
* The aliveness/busy gate — `true` when the agent is actively working and MUST
|
|
95
|
+
* NOT be restarted. VM: a `capture-pane` content-diff over a short window
|
|
96
|
+
* (macf#128/#130; NOT `#{session_activity}`, which does not reliably advance on
|
|
97
|
+
* a busy agent — the 2026-06-28 silent-fallback Pattern-C correction). A
|
|
98
|
+
* DEAD/absent agent is not busy (safe to `launch`).
|
|
99
|
+
*/
|
|
100
|
+
readonly isBusy: (agent: string) => Promise<boolean>;
|
|
101
|
+
/**
|
|
102
|
+
* Read the agent's current pane content for stall-signature matching
|
|
103
|
+
* (`macf fleet resume`, DR-037 / macf#686). VM: a single `tmux capture-pane`
|
|
104
|
+
* of the live session; K8s: recent pod logs. Returns `null` when the agent has
|
|
105
|
+
* NO live session / is unreadable (DEAD / gone — resume can't help it, so the
|
|
106
|
+
* caller skips it and leaves it to `reconcile`'s launch). Runtime-specific (a
|
|
107
|
+
* pane read), so it belongs on the driver — the decision layer stays pure by
|
|
108
|
+
* matching the returned string against the allowlist.
|
|
109
|
+
*/
|
|
110
|
+
readonly capturePane: (agent: string) => Promise<string | null>;
|
|
111
|
+
/** Roll the agent's framework version. VM: `macf update` in its workspace. */
|
|
112
|
+
readonly upgrade: (agent: string) => Promise<void>;
|
|
113
|
+
/**
|
|
114
|
+
* Restart the agent. VM: `macf restart-self` when ALIVE (graceful — stash +
|
|
115
|
+
* detached relaunch), or `launch` when DEAD. K8s: cycle the pod.
|
|
116
|
+
*/
|
|
117
|
+
readonly restart: (agent: string) => Promise<void>;
|
|
118
|
+
/**
|
|
119
|
+
* The tier-1 gated nudge — deliver `text` into the agent's live turn loop.
|
|
120
|
+
* VM: the canonical `tmux-send-to-claude` submit pattern. Runtime-specific.
|
|
121
|
+
*/
|
|
122
|
+
readonly inject: (agent: string, text: string) => Promise<void>;
|
|
123
|
+
/** Cold-start a desired-but-down agent. VM: spawn its `./claude.sh`. */
|
|
124
|
+
readonly launch: (agent: string) => Promise<void>;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* A fleet-driver operation failed against a resolvable target — most commonly an
|
|
128
|
+
* `agent` name that matches no discovered workspace on this host (so the driver
|
|
129
|
+
* cannot resolve its workspace / session). Runtime-agnostic (every driver shares
|
|
130
|
+
* it), so it lives in macf-core beside the interface.
|
|
131
|
+
*/
|
|
132
|
+
export declare class FleetDriverError extends MacfError {
|
|
133
|
+
constructor(message: string);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=fleet-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet-driver.d.ts","sourceRoot":"","sources":["../src/fleet-driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,wFAAwF;IACxF,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;CACxC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;CAC7C;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IAE1C;;;;;OAKG;IACH,QAAQ,CAAC,kBAAkB,EAAE,MAAM,SAAS,eAAe,EAAE,CAAC;IAE9D;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAErD;;;;;;;;OAQG;IACH,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEhE,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhE,wEAAwE;IACxE,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,SAAS;gBACjC,OAAO,EAAE,MAAM;CAI5B"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `FleetDriver` interface — the decision/driver boundary (DR-037 Decision 3).
|
|
3
|
+
*
|
|
4
|
+
* The fleet operational-layer has TWO layers and ONLY the bottom is
|
|
5
|
+
* runtime-specific:
|
|
6
|
+
*
|
|
7
|
+
* - **Decision layer** (runtime-agnostic): the reconcile HEAL ladder, the
|
|
8
|
+
* rolling-upgrade sequencer + verify-green, the busy-gate DECISION, the
|
|
9
|
+
* tier-3 `alert` (a `gh issue create` — runtime-agnostic, so it stays in the
|
|
10
|
+
* decision layer, NOT on the driver). It NEVER touches `/proc`, tmux,
|
|
11
|
+
* `capture-pane`, or the K8s API — it drives off `probe()` (the `/health`
|
|
12
|
+
* self-report) and `discoverWorkspaces()`.
|
|
13
|
+
* - **Driver layer** (this interface): the ONLY place a runtime leaks. The
|
|
14
|
+
* decision layer branches on the reconcile tier and calls a driver verb —
|
|
15
|
+
* gated-inject → `inject`; graceful-restart → `restart`; cold-start →
|
|
16
|
+
* `launch`; roll → `upgrade`.
|
|
17
|
+
*
|
|
18
|
+
* **Hard rule (DR-037):** nothing runtime-specific leaks ABOVE the driver line.
|
|
19
|
+
* The `agent` argument is the portable identity — the agent's ROUTING LABEL
|
|
20
|
+
* (the registry key), stable across a VM tmux session, a macOS host, and a
|
|
21
|
+
* far-future K8s pod. A VM driver resolves that name → workspace + tmux session
|
|
22
|
+
* INTERNALLY (via `discoverWorkspaces()` + the workspace config); a K8s driver
|
|
23
|
+
* resolves it → pod. That resolution is the driver's job, never the decision
|
|
24
|
+
* layer's.
|
|
25
|
+
*
|
|
26
|
+
* The interface TYPE lives HERE in macf-core (DR-037 OQ2 — the runtime-and-CLI-
|
|
27
|
+
* independent contract; it references `WorkspaceRecord`, already here). The
|
|
28
|
+
* per-runtime driver BODIES live in `packages/macf` (the VM driver) or a future
|
|
29
|
+
* package (the K8s macf-operator).
|
|
30
|
+
*/
|
|
31
|
+
import { MacfError } from './errors.js';
|
|
32
|
+
/**
|
|
33
|
+
* A fleet-driver operation failed against a resolvable target — most commonly an
|
|
34
|
+
* `agent` name that matches no discovered workspace on this host (so the driver
|
|
35
|
+
* cannot resolve its workspace / session). Runtime-agnostic (every driver shares
|
|
36
|
+
* it), so it lives in macf-core beside the interface.
|
|
37
|
+
*/
|
|
38
|
+
export class FleetDriverError extends MacfError {
|
|
39
|
+
constructor(message) {
|
|
40
|
+
super('FLEET_DRIVER_ERROR', message);
|
|
41
|
+
this.name = 'FleetDriverError';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=fleet-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet-driver.js","sourceRoot":"","sources":["../src/fleet-driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA0GxC;;;;;GAKG;AACH,MAAM,OAAO,gBAAiB,SAAQ,SAAS;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The fleet desired-state reconciler — the DR-006 watchdog decision layer,
|
|
3
|
+
* runtime-agnostic (DR-037 Decision 3 / OQ2). Ports the behavior of the devops
|
|
4
|
+
* reference `fleet/reconcile.sh` (its 52-case test suite is the acceptance
|
|
5
|
+
* oracle), but drives everything through the injectable `FleetDriver` + a state
|
|
6
|
+
* store + a clock, so NOTHING runtime-specific (`/proc`, tmux, `capture-pane`,
|
|
7
|
+
* the K8s API) leaks above this line.
|
|
8
|
+
*
|
|
9
|
+
* The model is Kubernetes-on-a-VM: reconcile ACTUAL (`driver.probe()` +
|
|
10
|
+
* `driver.discoverWorkspaces()`) toward the operator-owned DESIRED set:
|
|
11
|
+
* - desired & not-running → LAUNCH (cold-start / reboot-recovery)
|
|
12
|
+
* - desired & running-but-deaf → HEAL (the tiered ladder)
|
|
13
|
+
* - desired-down → SKIP (never resurrect — don't-fight-the-operator)
|
|
14
|
+
* desired-down = an explicit `paused` sentinel OR `last-exit == 0` (the
|
|
15
|
+
* operator typed `/exit`) — the two compose (DR-031 §A.3 unification).
|
|
16
|
+
* - desired & reachable → OK
|
|
17
|
+
*
|
|
18
|
+
* The HEAL ladder, per deaf agent, across sweeps (the cron gives the cross-sweep
|
|
19
|
+
* memory):
|
|
20
|
+
* - sweep 1 → Tier-1 gated inject (`driver.inject` — the agent self-heals)
|
|
21
|
+
* - sweep 2+ → escalate, under two GATES that both hold before any restart:
|
|
22
|
+
* * aliveness-gate — NEVER restart a busy agent (`driver.isBusy`; the #642
|
|
23
|
+
* mode: channel-server dead while the TUI is alive + working).
|
|
24
|
+
* * restart-backoff — NEVER restart-storm a repeatedly-failing agent: after a
|
|
25
|
+
* Tier-2 restart, an EXPONENTIAL backoff window must elapse before the next
|
|
26
|
+
* one; a persistently-stuck agent (restarts exhausted) escalates to Tier-3.
|
|
27
|
+
* Tier-2 graceful-restart (`driver.restart`) is held behind `allowRestart`;
|
|
28
|
+
* Tier-3 `alert` (a `gh issue create`) is a DECISION-LAYER seam — deliberately
|
|
29
|
+
* NOT a `FleetDriver` method, so no GitHub concern leaks into the driver.
|
|
30
|
+
*
|
|
31
|
+
* Plus launch-stagger (space cold-starts so N dead agents don't thundering-herd)
|
|
32
|
+
* and a self-heartbeat (the who-watches-the-watchdog signal). DRY-RUN BY DEFAULT
|
|
33
|
+
* — the report is built + printed and NOTHING is acted on or persisted unless
|
|
34
|
+
* `execute` is set.
|
|
35
|
+
*/
|
|
36
|
+
import type { FleetDriver, FleetState } from './fleet-driver.js';
|
|
37
|
+
/** One agent the operator declares SHOULD run on this host (DR-006 §A.2). */
|
|
38
|
+
export interface DesiredAgent {
|
|
39
|
+
/** The routing-label identity (matches `FleetState.agents[].name`). */
|
|
40
|
+
readonly agent: string;
|
|
41
|
+
/** Absolute workspace dir — surfaced in the LAUNCH detail (driver resolves it). */
|
|
42
|
+
readonly workspace: string;
|
|
43
|
+
}
|
|
44
|
+
/** The four reconcile verdicts (the report's DECISION column). */
|
|
45
|
+
export type ReconcileDecision = 'OK' | 'LAUNCH' | 'SKIP' | 'HEAL';
|
|
46
|
+
/**
|
|
47
|
+
* Per-agent state that persists ACROSS sweeps (the cron's cross-sweep memory).
|
|
48
|
+
* Read at the start of each agent's reconcile, written back only on `execute`.
|
|
49
|
+
*/
|
|
50
|
+
export interface ReconcileAgentState {
|
|
51
|
+
/** Consecutive HEAL (deaf) sweeps — drives Tier-1 → escalation. */
|
|
52
|
+
readonly deafSweeps: number;
|
|
53
|
+
/** Consecutive Tier-2 restarts — the EXPONENTIAL-backoff exponent + stuck gauge. */
|
|
54
|
+
readonly restartAttempts: number;
|
|
55
|
+
/** Epoch-ms before which a Tier-2 restart is suppressed (the backoff window). */
|
|
56
|
+
readonly backoffUntil: number;
|
|
57
|
+
/** Tier-3 alert dedup sentinel (one alert per failure episode). */
|
|
58
|
+
readonly alertOpen: boolean;
|
|
59
|
+
/** Last observed process exit code (exit-code intent; `null` = absent/never-ran). */
|
|
60
|
+
readonly lastExit: number | null;
|
|
61
|
+
/** Explicit operator `paused` sentinel → desired-down. */
|
|
62
|
+
readonly paused: boolean;
|
|
63
|
+
}
|
|
64
|
+
/** The zero state for an agent with no persisted history. */
|
|
65
|
+
export declare const EMPTY_RECONCILE_STATE: ReconcileAgentState;
|
|
66
|
+
/**
|
|
67
|
+
* Cross-sweep persisted state. Reads are pure lookups (defaulting to
|
|
68
|
+
* `EMPTY_RECONCILE_STATE`); writes/resets happen only when the engine is in
|
|
69
|
+
* `execute` mode (the caller gates them), so a dry-run is side-effect-free.
|
|
70
|
+
*/
|
|
71
|
+
export interface ReconcileStateStore {
|
|
72
|
+
/** Current persisted state for `agent` (never throws — unknown → empty). */
|
|
73
|
+
readonly read: (agent: string) => ReconcileAgentState;
|
|
74
|
+
/** Persist `state` for `agent`. Only called on `execute`. */
|
|
75
|
+
readonly write: (agent: string, state: ReconcileAgentState) => void;
|
|
76
|
+
/**
|
|
77
|
+
* Recovery reset — clear the escalation/backoff/alert counters (KEEP
|
|
78
|
+
* `lastExit`/`paused`), so a future deaf episode starts a fresh ladder. Only
|
|
79
|
+
* called on `execute`.
|
|
80
|
+
*/
|
|
81
|
+
readonly reset: (agent: string) => void;
|
|
82
|
+
}
|
|
83
|
+
/** Tuning knobs for the ladder / backoff / stagger. */
|
|
84
|
+
export interface ReconcileConfig {
|
|
85
|
+
/** Act (launch/inject/restart/alert/heartbeat/persist). `false` = dry-run (default). */
|
|
86
|
+
readonly execute: boolean;
|
|
87
|
+
/** Enable Tier-2 graceful-restart (operator sign-off). `false` → held. */
|
|
88
|
+
readonly allowRestart: boolean;
|
|
89
|
+
/** Deaf sweeps that stay on Tier-1 before escalating (default 1). */
|
|
90
|
+
readonly escalateAfterSweeps: number;
|
|
91
|
+
/** Base backoff (ms) — the first restart window (default 60_000). */
|
|
92
|
+
readonly backoffBaseMs: number;
|
|
93
|
+
/** Backoff ceiling (ms) — the exponential is clamped here (default 3_600_000). */
|
|
94
|
+
readonly backoffMaxMs: number;
|
|
95
|
+
/** Restart attempts beyond which a still-deaf agent is STUCK → Tier-3 (default 3). */
|
|
96
|
+
readonly stuckMax: number;
|
|
97
|
+
/** Delay (ms) inserted BETWEEN cold-start launches to avoid a thundering herd (default 15_000). */
|
|
98
|
+
readonly launchStaggerMs: number;
|
|
99
|
+
/** The Tier-1 self-diagnose nudge text delivered by `driver.inject`. */
|
|
100
|
+
readonly injectMessage: string;
|
|
101
|
+
}
|
|
102
|
+
/** Sensible defaults; a caller overrides selectively via `resolveConfig`. */
|
|
103
|
+
export declare const DEFAULT_RECONCILE_CONFIG: ReconcileConfig;
|
|
104
|
+
/** Merge partial overrides onto the defaults. */
|
|
105
|
+
export declare function resolveReconcileConfig(overrides?: Partial<ReconcileConfig>): ReconcileConfig;
|
|
106
|
+
/** Info recorded by the self-heartbeat (execute-only). */
|
|
107
|
+
export interface ReconcileHeartbeat {
|
|
108
|
+
/** The sweep's exit code. */
|
|
109
|
+
readonly rc: number;
|
|
110
|
+
/** Wall-clock (epoch ms) the sweep completed. */
|
|
111
|
+
readonly at: number;
|
|
112
|
+
/** Whether Tier-2 restart was enabled this sweep. */
|
|
113
|
+
readonly restartEnabled: boolean;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* The injectable seams the reconcile orchestrator drives — all runtime-agnostic.
|
|
117
|
+
* The tier-3 `alert` is HERE (a decision-layer seam), NOT on `driver`: it is a
|
|
118
|
+
* GitHub concern, runtime-agnostic, so per DR-037 it must never leak into a
|
|
119
|
+
* per-runtime driver.
|
|
120
|
+
*/
|
|
121
|
+
export interface ReconcileDeps {
|
|
122
|
+
/** The pluggable fleet driver (probe + the mutation verbs). */
|
|
123
|
+
readonly driver: FleetDriver;
|
|
124
|
+
/** Cross-sweep persisted state. */
|
|
125
|
+
readonly store: ReconcileStateStore;
|
|
126
|
+
/** Monotonic-ish clock (ms) — injected so tests drive backoff/stagger timing. */
|
|
127
|
+
readonly now: () => number;
|
|
128
|
+
/** Sleep `ms` — injected so tests don't wait on the launch-stagger. */
|
|
129
|
+
readonly sleep: (ms: number) => Promise<void>;
|
|
130
|
+
/** Tier-3 alert (a `gh issue create`) — decision-layer, dedup'd by the caller. */
|
|
131
|
+
readonly alert: (agent: string, reason: string) => Promise<void>;
|
|
132
|
+
/** Self-heartbeat — the who-watches-the-watchdog stamp (execute-only). */
|
|
133
|
+
readonly heartbeat: (info: ReconcileHeartbeat) => Promise<void>;
|
|
134
|
+
/** Emit one report line (the command wires it to stdout). */
|
|
135
|
+
readonly log: (line: string) => void;
|
|
136
|
+
}
|
|
137
|
+
/** One row of the reconcile report. */
|
|
138
|
+
export interface ReconcileRow {
|
|
139
|
+
readonly agent: string;
|
|
140
|
+
readonly decision: ReconcileDecision;
|
|
141
|
+
readonly detail: string;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* The sweep outcome. `rc` mirrors the reference exit contract:
|
|
145
|
+
* - 0 = every desired agent OK / down (no action)
|
|
146
|
+
* - 1 = action(s) taken or needed
|
|
147
|
+
* - 2 = precondition/probe failure (bad manifest, probe threw)
|
|
148
|
+
*/
|
|
149
|
+
export interface ReconcileResult {
|
|
150
|
+
readonly rc: number;
|
|
151
|
+
readonly rows: readonly ReconcileRow[];
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* How the probe sees a desired agent (three-valued, mirroring the reference's
|
|
155
|
+
* empty/`true`/`false` `reachable` field):
|
|
156
|
+
* - `absent` — not in the registry roster at all (not running / never registered)
|
|
157
|
+
* - `deaf` — in the roster but `/health` did NOT answer (registered, channel down)
|
|
158
|
+
* - `reachable` — in the roster + `/health` answered (mTLS 2xx)
|
|
159
|
+
*/
|
|
160
|
+
export declare function classifyReachability(state: FleetState, agent: string): 'absent' | 'deaf' | 'reachable';
|
|
161
|
+
/**
|
|
162
|
+
* The EXPONENTIAL restart-backoff window after `attempts` consecutive restarts:
|
|
163
|
+
* `base * 2^(attempts-1)`, clamped to `maxMs`. `attempts <= 0` → no window (0).
|
|
164
|
+
*/
|
|
165
|
+
export declare function nextBackoffMs(attempts: number, config: ReconcileConfig): number;
|
|
166
|
+
/**
|
|
167
|
+
* Minimal parser for the fixed `desired-agents.yaml` shape (no yaml dep — the
|
|
168
|
+
* cron-light awk parse's TS twin). Pairs each `- agent: <x>` with the FOLLOWING
|
|
169
|
+
* `workspace: <y>`; strips inline `# comments` + surrounding quotes; ignores the
|
|
170
|
+
* `agents:` header, blank lines, and standalone comments.
|
|
171
|
+
*/
|
|
172
|
+
export declare function parseDesiredAgents(text: string): DesiredAgent[];
|
|
173
|
+
/**
|
|
174
|
+
* Run one reconcile sweep over the `desired` set. Probes ACTUAL state, decides +
|
|
175
|
+
* (on `execute`) acts per agent through the injected driver + seams, and returns
|
|
176
|
+
* the report + exit code. Dry-run (the default) prints the report and touches
|
|
177
|
+
* nothing (no driver mutations, no state writes, no heartbeat).
|
|
178
|
+
*/
|
|
179
|
+
export declare function reconcileFleet(desired: readonly DesiredAgent[], deps: ReconcileDeps, config: ReconcileConfig): Promise<ReconcileResult>;
|
|
180
|
+
//# sourceMappingURL=fleet-reconcile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet-reconcile.d.ts","sourceRoot":"","sources":["../src/fleet-reconcile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEjE,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,kEAAkE;AAClE,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAElE;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,oFAAoF;IACpF,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,iFAAiF;IACjF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,qFAAqF;IACrF,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,6DAA6D;AAC7D,eAAO,MAAM,qBAAqB,EAAE,mBAOnC,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,mBAAmB,CAAC;IACtD,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACpE;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,wFAAwF;IACxF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,qEAAqE;IACrE,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,qEAAqE;IACrE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,kFAAkF;IAClF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,sFAAsF;IACtF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mGAAmG;IACnG,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,wEAAwE;IACxE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,6EAA6E;AAC7E,eAAO,MAAM,wBAAwB,EAAE,eAWtC,CAAC;AAEF,iDAAiD;AACjD,wBAAgB,sBAAsB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAE5F;AAED,0DAA0D;AAC1D,MAAM,WAAW,kBAAkB;IACjC,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,mCAAmC;IACnC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,iFAAiF;IACjF,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAC3B,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,kFAAkF;IAClF,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC;CACxC;AAID;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,MAAM,GACZ,QAAQ,GAAG,MAAM,GAAG,WAAW,CAIjC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAI/E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAgB/D;AAuBD;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,eAAe,CAAC,CAqC1B"}
|