@groundnuty/macf-core 0.2.47 → 0.2.49

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.
@@ -0,0 +1,3 @@
1
+ export { OutboxEntrySchema, InboxEntrySchema } from './store.js';
2
+ export type { OutboxEntry, InboxEntry, OutboxStore, InboxStore } from './store.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/delivery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { OutboxEntrySchema, InboxEntrySchema } from './store.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/delivery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * DR-038 Decision 6 — the pluggable store INTERFACE for the effectively-once
3
+ * delivery layer. This is the BINDING contract: a driver (in-memory here for
4
+ * tests/reference, a VM disk-spool driver + a K8s PVC/broker driver owned by
5
+ * devops per DR-008) implements `OutboxStore` / `InboxStore` against whatever
6
+ * durable substrate it has. The concrete on-disk layout (filenames, jsonl vs.
7
+ * broker topic, etc.) is explicitly NOT part of this contract — DR-038
8
+ * Decision 6 is emphatic that the interface, not the file shape, is binding.
9
+ *
10
+ * HOISTED HERE (macf#741 follow-up to #738/#742) from
11
+ * `packages/macf-channel-server/src/delivery/store.ts` so ONE definition
12
+ * serves all three consumers that need it: `macf-channel-server` (the
13
+ * sender/receiver runtime, `outbox.ts` / `inbox.ts` / `in-memory-store.ts`),
14
+ * `macf` (the plugin's on-startup inbox drain, `plugin/lib/inbox-store.ts`),
15
+ * and devops's disk-spool driver (DR-008), which lives in a THIRD repo
16
+ * (`macf-devops-toolkit`) that cannot depend on either monorepo package
17
+ * directly — `@groundnuty/macf-core` (npm-published, already a dependency of
18
+ * both `macf` and `macf-channel-server`) is the one home reachable by all
19
+ * three. `macf-channel-server`'s local `delivery/store.ts` (the prior home
20
+ * of this contract) is removed; every consumer there now imports these
21
+ * types directly from `@groundnuty/macf-core`.
22
+ *
23
+ * Both interfaces are `Promise`-returning uniformly, even though the
24
+ * reference in-memory driver (`in-memory-store.ts`) and a likely disk-spool
25
+ * driver could be synchronous under the hood (comms-ledger.ts's
26
+ * `appendFileSync` precedent). This is a DELIBERATE GUESS beyond what
27
+ * DR-038's Decision 6 sketch pins (which shows bare `void` / `Message[]`
28
+ * returns) — flagged for science's review: the devops K8s PVC/broker driver
29
+ * (DR-008) is plausibly async (network I/O), and a uniform async contract
30
+ * means the runtime-agnostic `outbox.ts` / `inbox.ts` logic in this slice
31
+ * never needs to special-case a driver's sync-vs-async shape. If the review
32
+ * decides all drivers are sync-capable, this can be narrowed later without
33
+ * changing call sites (an async fn can always wrap a sync value).
34
+ *
35
+ * `payload` is intentionally `unknown` at the store layer — the store's job
36
+ * is durable persistence + dedup, not payload semantics. The effectively-once
37
+ * logic (`outbox.ts` / `inbox.ts`) is equally payload-agnostic; only the
38
+ * eventual wiring slice (notify_peer / `/notify`) will narrow `payload` to a
39
+ * concrete `NotifyPayload`-shaped type.
40
+ */
41
+ import { z } from 'zod';
42
+ export declare const OutboxEntrySchema: z.ZodObject<{
43
+ id: z.ZodString;
44
+ target: z.ZodString;
45
+ payload: z.ZodUnknown;
46
+ enqueuedAt: z.ZodNumber;
47
+ nextAttemptAt: z.ZodNumber;
48
+ attemptCount: z.ZodNumber;
49
+ }, z.core.$strip>;
50
+ export type OutboxEntry = z.infer<typeof OutboxEntrySchema>;
51
+ export declare const InboxEntrySchema: z.ZodObject<{
52
+ id: z.ZodString;
53
+ payload: z.ZodUnknown;
54
+ receivedAt: z.ZodNumber;
55
+ processed: z.ZodBoolean;
56
+ }, z.core.$strip>;
57
+ export type InboxEntry = z.infer<typeof InboxEntrySchema>;
58
+ export interface OutboxStore {
59
+ /**
60
+ * Persist a NEW entry BEFORE the first send attempt (persist-then-send,
61
+ * DR-038 Decision 1). Callers mint the id via `mintMessageId()` and set
62
+ * `attemptCount: 0` before calling this — `enqueue` is insert-only, not an
63
+ * upsert; retry-state mutations go through `reschedule` (below).
64
+ */
65
+ enqueue(entry: OutboxEntry): Promise<void>;
66
+ /**
67
+ * All entries not yet acked or dead-lettered — i.e. everything still
68
+ * awaiting delivery, regardless of whether they're currently due. This is
69
+ * what gets re-read on sender startup (Decision 4's restart-survival) — a
70
+ * fresh `outbox.ts` instance over the SAME store sees every entry a prior
71
+ * process instance hadn't finished with. The retry loop (`outbox.ts`)
72
+ * filters this list by `nextAttemptAt <= now` itself; the store does not
73
+ * do due-filtering (mirrors DR-038 Decision 6's `pending(): Message[]`
74
+ * sketch, which returns the undelivered set, not just the due subset).
75
+ */
76
+ listPending(): Promise<OutboxEntry[]>;
77
+ /**
78
+ * Reschedule an entry after a failed/timed-out send attempt: bump
79
+ * `nextAttemptAt` (per the backoff schedule) and `attemptCount`. This is
80
+ * an ADDITION beyond DR-038 Decision 6's sketch (which shows only
81
+ * `enqueue` / `pending` / `markAcked` / `deadLetter`) — flagged for
82
+ * review: the retry loop needs SOME way to durably persist backoff state
83
+ * so a restart resumes the correct schedule rather than restarting
84
+ * backoff from attempt 0 (which would race through TTL faster than
85
+ * intended after a crash-loop). `reschedule` is the minimal mutate-in-
86
+ * place primitive for that; it does not change the entry's identity, so
87
+ * a driver can implement it as "load, patch two fields, re-persist"
88
+ * against any single-entry-addressable substrate.
89
+ */
90
+ reschedule(id: string, nextAttemptAt: number, attemptCount: number): Promise<void>;
91
+ /** Durable-ACK path (HTTP 200 received) → remove the entry (Decision 3). */
92
+ markAcked(id: string): Promise<void>;
93
+ /**
94
+ * TTL-expiry path → remove from the live pending set (Decision 4). The
95
+ * GitHub-issue escalation itself is explicitly NOT a store concern (DR-038
96
+ * Decision 4: "a decision-layer action... NOT a store-driver method") —
97
+ * this method only handles the store-side bookkeeping; the caller
98
+ * (`outbox.ts`) separately invokes an `onDeadLetter` callback for the
99
+ * decision-layer escalation, wired by a later slice.
100
+ */
101
+ deadLetter(id: string): Promise<void>;
102
+ }
103
+ export interface InboxStore {
104
+ /**
105
+ * Atomically dedup-and-persist. Returns `wasNew: true` when this `id`
106
+ * wasn't already present (a genuinely new message, now durably persisted);
107
+ * `false` when it was already present (a redelivery — no-op, existing
108
+ * entry left untouched). MUST be a single atomic operation — DR-038
109
+ * Decision 6 is explicit that a separate `has()` + `persist()` would
110
+ * reopen the check-then-act TOCTOU this primitive exists to close.
111
+ */
112
+ persist(entry: InboxEntry): Promise<boolean>;
113
+ /** Existence check by id (task-specified addition beyond the DR-038 sketch). */
114
+ has(id: string): Promise<boolean>;
115
+ /** Fetch by id, or `undefined` if absent (task-specified addition). */
116
+ get(id: string): Promise<InboxEntry | undefined>;
117
+ /**
118
+ * Persisted-but-not-yet-processed entries — drained on-receipt AND
119
+ * on-startup (DR-038 Decision 5). Dedup-by-id makes the two triggers
120
+ * safe to overlap.
121
+ */
122
+ listUndrained(): Promise<InboxEntry[]>;
123
+ /**
124
+ * Mark an entry processed — it won't be re-drained.
125
+ *
126
+ * Forward-note (DR-038 / macf#741): today's plugin drain calls this
127
+ * BEFORE surfacing the entry to the operator/agent (mark-then-surface),
128
+ * against an in-memory reference store where the distinction is moot. Once
129
+ * a durable driver lands, revisit the ordering to surface-then-mark
130
+ * instead, so a crash between the two steps can't silently drop a message
131
+ * that was marked processed but never actually surfaced.
132
+ */
133
+ markProcessed(id: string): Promise<void>;
134
+ }
135
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/delivery/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,iBAAiB;;;;;;;iBAsB5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAM5D,eAAO,MAAM,gBAAgB;;;;;iBAS3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAM1D,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C;;;;;;;;;OASG;IACH,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAEtC;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnF,4EAA4E;IAC5E,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAMD,MAAM,WAAW,UAAU;IACzB;;;;;;;OAOG;IACH,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7C,gFAAgF;IAChF,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAElC,uEAAuE;IACvE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IAEjD;;;;OAIG;IACH,aAAa,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAEvC;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * DR-038 Decision 6 — the pluggable store INTERFACE for the effectively-once
3
+ * delivery layer. This is the BINDING contract: a driver (in-memory here for
4
+ * tests/reference, a VM disk-spool driver + a K8s PVC/broker driver owned by
5
+ * devops per DR-008) implements `OutboxStore` / `InboxStore` against whatever
6
+ * durable substrate it has. The concrete on-disk layout (filenames, jsonl vs.
7
+ * broker topic, etc.) is explicitly NOT part of this contract — DR-038
8
+ * Decision 6 is emphatic that the interface, not the file shape, is binding.
9
+ *
10
+ * HOISTED HERE (macf#741 follow-up to #738/#742) from
11
+ * `packages/macf-channel-server/src/delivery/store.ts` so ONE definition
12
+ * serves all three consumers that need it: `macf-channel-server` (the
13
+ * sender/receiver runtime, `outbox.ts` / `inbox.ts` / `in-memory-store.ts`),
14
+ * `macf` (the plugin's on-startup inbox drain, `plugin/lib/inbox-store.ts`),
15
+ * and devops's disk-spool driver (DR-008), which lives in a THIRD repo
16
+ * (`macf-devops-toolkit`) that cannot depend on either monorepo package
17
+ * directly — `@groundnuty/macf-core` (npm-published, already a dependency of
18
+ * both `macf` and `macf-channel-server`) is the one home reachable by all
19
+ * three. `macf-channel-server`'s local `delivery/store.ts` (the prior home
20
+ * of this contract) is removed; every consumer there now imports these
21
+ * types directly from `@groundnuty/macf-core`.
22
+ *
23
+ * Both interfaces are `Promise`-returning uniformly, even though the
24
+ * reference in-memory driver (`in-memory-store.ts`) and a likely disk-spool
25
+ * driver could be synchronous under the hood (comms-ledger.ts's
26
+ * `appendFileSync` precedent). This is a DELIBERATE GUESS beyond what
27
+ * DR-038's Decision 6 sketch pins (which shows bare `void` / `Message[]`
28
+ * returns) — flagged for science's review: the devops K8s PVC/broker driver
29
+ * (DR-008) is plausibly async (network I/O), and a uniform async contract
30
+ * means the runtime-agnostic `outbox.ts` / `inbox.ts` logic in this slice
31
+ * never needs to special-case a driver's sync-vs-async shape. If the review
32
+ * decides all drivers are sync-capable, this can be narrowed later without
33
+ * changing call sites (an async fn can always wrap a sync value).
34
+ *
35
+ * `payload` is intentionally `unknown` at the store layer — the store's job
36
+ * is durable persistence + dedup, not payload semantics. The effectively-once
37
+ * logic (`outbox.ts` / `inbox.ts`) is equally payload-agnostic; only the
38
+ * eventual wiring slice (notify_peer / `/notify`) will narrow `payload` to a
39
+ * concrete `NotifyPayload`-shaped type.
40
+ */
41
+ import { z } from 'zod';
42
+ // ---------------------------------------------------------------------------
43
+ // Outbox entry — the sender-side persisted record (DR-038 Decisions 1, 2, 4).
44
+ // ---------------------------------------------------------------------------
45
+ export const OutboxEntrySchema = z.object({
46
+ /**
47
+ * UUIDv4 message-id, minted ONCE at enqueue (DR-038 Decision 2) via
48
+ * `mintMessageId()` (`message-id.ts`). Persisted verbatim; NEVER
49
+ * regenerated on retry — that stability is the whole receiver-side dedup
50
+ * key (Decision 1).
51
+ */
52
+ id: z.string().min(1),
53
+ /**
54
+ * Driver-agnostic routing target identifier (e.g. an agent/routing-label,
55
+ * or a target URL — whatever the caller's `send` seam expects as its
56
+ * first argument). Opaque to the store.
57
+ */
58
+ target: z.string().min(1),
59
+ /** Opaque message payload. JSON-serializable is assumed but not enforced here. */
60
+ payload: z.unknown(),
61
+ /** Epoch-ms at first enqueue. Used for wall-clock TTL expiry (Decision 4). */
62
+ enqueuedAt: z.number(),
63
+ /** Epoch-ms of the next scheduled attempt (immediate on first enqueue). */
64
+ nextAttemptAt: z.number(),
65
+ /** Count of send attempts made so far (0 before the first attempt). */
66
+ attemptCount: z.number().int().nonnegative(),
67
+ });
68
+ // ---------------------------------------------------------------------------
69
+ // Inbox entry — the receiver-side persisted record (DR-038 Decisions 1, 3).
70
+ // ---------------------------------------------------------------------------
71
+ export const InboxEntrySchema = z.object({
72
+ /** The sender's message-id — the dedup key (DR-038 Decisions 1, 2). */
73
+ id: z.string().min(1),
74
+ /** Opaque message payload, as durably received. */
75
+ payload: z.unknown(),
76
+ /** Epoch-ms at receipt (persist time, i.e. before ACK — Decision 3). */
77
+ receivedAt: z.number(),
78
+ /** Has the drain processed this entry yet? (Decision 5). */
79
+ processed: z.boolean(),
80
+ });
81
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/delivery/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,8EAA8E;AAC9E,8EAA8E;AAC9E,8EAA8E;AAE9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC;;;;;OAKG;IACH,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB;;;;OAIG;IACH,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,kFAAkF;IAClF,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,8EAA8E;IAC9E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,2EAA2E;IAC3E,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,uEAAuE;IACvE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;CAC7C,CAAC,CAAC;AAGH,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAE9E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,uEAAuE;IACvE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,mDAAmD;IACnD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,wEAAwE;IACxE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,4DAA4D;IAC5D,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;CACvB,CAAC,CAAC"}
@@ -2,8 +2,10 @@
2
2
  * The workspace-discovery record + its pure helpers (DR-037 Decision 4).
3
3
  *
4
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.
5
+ * `macf ps` (alive∪dead enumeration), `macf fleet upgrade` (group-by-PROJECT →
6
+ * fleets — macf#710; a project owns its own CA + registry namespace, so it is
7
+ * the correct grouping key, NOT the coarser `registry` scope), and the watchdog
8
+ * (desired-set reconcile) all read the same primitive.
7
9
  *
8
10
  * The record shape + the RUNTIME-and-CLI-independent helpers live HERE in
9
11
  * macf-core (DR-037 OQ2 — pure/portable logic in macf-core); the VM-filesystem
@@ -25,22 +27,31 @@ export declare const WorkspaceRecordSchema: z.ZodObject<{
25
27
  agent: z.ZodString;
26
28
  workspace: z.ZodString;
27
29
  registry: z.ZodString;
30
+ project: z.ZodString;
28
31
  versionPin: z.ZodNullable<z.ZodString>;
29
32
  }, z.core.$strip>;
30
33
  export type WorkspaceRecord = z.infer<typeof WorkspaceRecordSchema>;
31
34
  /**
32
- * Render a `RegistryConfig` as its stable fleet-grouping identifier (a "fleet"
33
- * == a registry — DR-037 Decision 1). Pure.
35
+ * Render a `RegistryConfig` as its stable, human-legible identifier. Pure.
34
36
  *
35
37
  * - `repo` → `owner/repo`
36
38
  * - `org` → the org name
37
- * - `profile` → the profile user name (the substrate case: every `groundnuty`
38
- * profile-registry workspace groups into one fleet)
39
+ * - `profile` → the profile user name (e.g. every `groundnuty` profile-registry
40
+ * workspace, REGARDLESS of which project it belongs to, renders
41
+ * the same identifier here — it names the shared NETWORK ENDPOINT,
42
+ * not a fleet)
39
43
  * - `local` → `local` (DR-024)
40
44
  *
45
+ * NOTE (macf#710): this identifier is NOT the fleet-grouping key — see
46
+ * `WorkspaceRecord.project` for that. Prior to #710, `fleet upgrade` grouped by
47
+ * this identifier (DR-037 Decision 1's original framing), which collapsed
48
+ * distinct projects sharing one profile/org registry scope into a single fleet.
49
+ * `registryIdentifier` remains useful for display + for resolving a genuinely
50
+ * registry-scoped target (e.g. `fleet-resume`'s repo-scoped alert-repo lookup).
51
+ *
41
52
  * 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.
53
+ * `profile foo` collision is accepted for this heuristic (they are not both
54
+ * used by one host in practice) and keeps the identifier human-legible.
44
55
  */
45
56
  export declare function registryIdentifier(config: RegistryConfig): string;
46
57
  /**
@@ -1 +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"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;iBA2ChC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;GAqBG;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"}
package/dist/discovery.js CHANGED
@@ -2,8 +2,10 @@
2
2
  * The workspace-discovery record + its pure helpers (DR-037 Decision 4).
3
3
  *
4
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.
5
+ * `macf ps` (alive∪dead enumeration), `macf fleet upgrade` (group-by-PROJECT →
6
+ * fleets — macf#710; a project owns its own CA + registry namespace, so it is
7
+ * the correct grouping key, NOT the coarser `registry` scope), and the watchdog
8
+ * (desired-set reconcile) all read the same primitive.
7
9
  *
8
10
  * The record shape + the RUNTIME-and-CLI-independent helpers live HERE in
9
11
  * macf-core (DR-037 OQ2 — pure/portable logic in macf-core); the VM-filesystem
@@ -30,12 +32,32 @@ export const WorkspaceRecordSchema = z.object({
30
32
  */
31
33
  workspace: z.string(),
32
34
  /**
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`.
35
+ * The registry this workspace belongs to, as a stable identifier — `owner/repo`
36
+ * (repo scope), the org / profile-user name (org / profile scope), or `local`
37
+ * (DR-024 local-registry mode). Derive via `registryIdentifier`.
38
+ *
39
+ * NOT the fleet-grouping key (macf#710) — a profile/org registry scope is the
40
+ * NETWORK ENDPOINT (e.g. the `groundnuty/groundnuty` GitHub repo backing a
41
+ * profile registry), which multiple DISTINCT projects can share. Each project
42
+ * has its own registry NAMESPACE (`MACF_AGENT_*` vs `ICSOC_2026_AGENT_*`) and
43
+ * its own CA (`MACF_CA_CERT` vs `ICSOC_2026_CA_CERT` — see
44
+ * `createVmDriverFromConfig`'s `${toVariableSegment(config.project)}_CA_CERT`
45
+ * lookup). Grouping by `registry` collapsed distinct projects sharing one
46
+ * profile/org scope into a single fleet, so a driver built from one project's
47
+ * workspace (its CA) was used to probe the other project's agents — wrong CA,
48
+ * false-negative UNREACHABLE. See `project` below for the correct grouping key.
37
49
  */
38
50
  registry: z.string(),
51
+ /**
52
+ * The project this workspace belongs to (`.macf/macf-agent.json` `project`) —
53
+ * its own CA + registry namespace + version cadence. THE fleet-grouping key
54
+ * (macf#710, superseding the pre-#710 `registry`-based grouping): `fleet
55
+ * upgrade` groups discovered workspaces by this field, so a `groundnuty`
56
+ * profile-registry host running BOTH `macf` and `icsoc_2026` projects
57
+ * discovers as TWO fleets, each rolled with a driver bound to that project's
58
+ * own CA — no cross-project probe mismatch.
59
+ */
60
+ project: z.string(),
39
61
  /**
40
62
  * The workspace's pinned framework version (`.macf/macf-agent.json`
41
63
  * `versions.cli`), or `null` when the config carries no pin (legacy / pre-P6).
@@ -45,18 +67,26 @@ export const WorkspaceRecordSchema = z.object({
45
67
  versionPin: z.string().nullable(),
46
68
  });
47
69
  /**
48
- * Render a `RegistryConfig` as its stable fleet-grouping identifier (a "fleet"
49
- * == a registry — DR-037 Decision 1). Pure.
70
+ * Render a `RegistryConfig` as its stable, human-legible identifier. Pure.
50
71
  *
51
72
  * - `repo` → `owner/repo`
52
73
  * - `org` → the org name
53
- * - `profile` → the profile user name (the substrate case: every `groundnuty`
54
- * profile-registry workspace groups into one fleet)
74
+ * - `profile` → the profile user name (e.g. every `groundnuty` profile-registry
75
+ * workspace, REGARDLESS of which project it belongs to, renders
76
+ * the same identifier here — it names the shared NETWORK ENDPOINT,
77
+ * not a fleet)
55
78
  * - `local` → `local` (DR-024)
56
79
  *
80
+ * NOTE (macf#710): this identifier is NOT the fleet-grouping key — see
81
+ * `WorkspaceRecord.project` for that. Prior to #710, `fleet upgrade` grouped by
82
+ * this identifier (DR-037 Decision 1's original framing), which collapsed
83
+ * distinct projects sharing one profile/org registry scope into a single fleet.
84
+ * `registryIdentifier` remains useful for display + for resolving a genuinely
85
+ * registry-scoped target (e.g. `fleet-resume`'s repo-scoped alert-repo lookup).
86
+ *
57
87
  * 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.
88
+ * `profile foo` collision is accepted for this heuristic (they are not both
89
+ * used by one host in practice) and keeps the identifier human-legible.
60
90
  */
61
91
  export function registryIdentifier(config) {
62
92
  switch (config.type) {
@@ -1 +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"}
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;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;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB;;;;;;;;OAQG;IACH,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB;;;;;OAKG;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAIH;;;;;;;;;;;;;;;;;;;;;GAqBG;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"}
@@ -98,6 +98,78 @@ export interface FleetDriver {
98
98
  * DEAD/absent agent is not busy (safe to `launch`).
99
99
  */
100
100
  readonly isBusy: (agent: string) => Promise<boolean>;
101
+ /**
102
+ * The pre-flight config-dirty predicate (macf#722 Fix B) — `true` when the
103
+ * agent's workspace has UNCOMMITTED changes on the roll's touched-config
104
+ * surface (the macf#725 UNION: the macf-update overwrite set ∪ the
105
+ * operator-evolution files — `claude.sh`, `.claude/rules/**`,
106
+ * `.claude/scripts/**`, `.claude/settings.json`, the managed
107
+ * `.claude/.macf/env.*` + `host-prelude.sh`, `CLAUDE.md`, `env.local.*` —
108
+ * see `ROLL_TOUCHED_CONFIG_PATTERNS` in `fleet-upgrade.ts`, narrowed off a
109
+ * `.claude/**` wildcard by DR-040 Decision 6 / macf#698). VM: `git status`
110
+ * in the agent's workspace, filtered to that path set. A DEAD/absent agent
111
+ * reads `false` (nothing to check; reconcile will launch it). Kept as a
112
+ * boolean convenience alongside `listDirtyConfig` below — `rollFleet`'s
113
+ * pre-flight gate itself calls `listDirtyConfig` (it needs the file list to
114
+ * OBJECT with, macf#725), so this predicate form is for OTHER callers that
115
+ * only need the yes/no answer.
116
+ */
117
+ readonly isConfigDirty: (agent: string) => Promise<boolean>;
118
+ /**
119
+ * The pre-flight config-dirty gate's LIST form (macf#725 — transactional
120
+ * object-with-message revision). Same predicate surface as `isConfigDirty`
121
+ * (`ROLL_TOUCHED_CONFIG_PATTERNS`, tracked-only), but returns the actual
122
+ * uncommitted paths rather than a boolean. Empty array == clean
123
+ * (equivalent to `isConfigDirty` reading `false`). VM: `git status
124
+ * --porcelain` in the agent's workspace, filtered to that path set, one
125
+ * path per line.
126
+ *
127
+ * **Superseded as `rollFleet`'s pre-flight call site by `classifyDirtyConfig`
128
+ * below (DR-040 Decision 3 / macf#698 R1)** — the roll no longer treats
129
+ * every dirty file as an OBJECT-worthy delta; it tiers them first. This
130
+ * verb remains on the interface (still used internally by
131
+ * `classifyDirtyConfig`'s real implementation, and by other callers that
132
+ * only need the raw uncommitted-path list without tier classification).
133
+ */
134
+ readonly listDirtyConfig: (agent: string) => Promise<readonly string[]>;
135
+ /**
136
+ * The pre-flight config-dirty gate's TIERED form (DR-040 Decision 3 /
137
+ * macf#698 R1 — this is what `rollFleet` actually calls now). Splits
138
+ * `listDirtyConfig`'s raw uncommitted-path list into two tiers by
139
+ * comparing each file's CURRENT (dirty) content against what `macf
140
+ * update` would write for it right now (the canonical-compute primitive,
141
+ * `packages/macf/src/cli/fleet/canonical-compute.ts`):
142
+ *
143
+ * - `alreadyCanonical` — the file's content already IS the canonical
144
+ * regen (the common case: a stale-branch workspace whose "dirty" files
145
+ * are exactly what a fresh `macf update` would produce — both code-agent
146
+ * AND science hit only this tier on the v0.2.48 roll). Safe to commit
147
+ * as-is; NEVER a genuine conflict.
148
+ * - `genuineDelta` — a real local difference from canonical. Still
149
+ * requires the OBJECT-and-halt treatment `listDirtyConfig`'s callers
150
+ * used to apply to the WHOLE dirty list.
151
+ *
152
+ * Both arrays are empty when the agent has no dirty config surface at all
153
+ * (mirrors `listDirtyConfig`'s empty-array-== -clean contract). VM: reuses
154
+ * `listDirtyConfig` for the raw list, then classifies each path via
155
+ * `classifyDirtyFile`.
156
+ */
157
+ readonly classifyDirtyConfig: (agent: string) => Promise<{
158
+ readonly alreadyCanonical: readonly string[];
159
+ readonly genuineDelta: readonly string[];
160
+ }>;
161
+ /**
162
+ * Commit exactly `files` in the agent's workspace (DR-040 Decision 3 /
163
+ * macf#698 R1) — the auto-resolve half of the tier-first gate. Called ONLY
164
+ * with `classifyDirtyConfig`'s `alreadyCanonical` subset: those files are,
165
+ * by construction, deterministic canonical content (not an arbitrary
166
+ * commit), so committing them clears the false config-dirty signal
167
+ * without any agent/operator involvement. A no-op when `files` is empty.
168
+ * VM: `git add -- <files>` + `git commit` in the agent's workspace (a
169
+ * no-op commit, i.e. nothing actually staged after `add`, is tolerated —
170
+ * never throws on "nothing to commit").
171
+ */
172
+ readonly autoResolveCanonical: (agent: string, files: readonly string[]) => Promise<void>;
101
173
  /**
102
174
  * Read the agent's current pane content for stall-signature matching
103
175
  * (`macf fleet resume`, DR-037 / macf#686). VM: a single `tmux capture-pane`
@@ -113,8 +185,26 @@ export interface FleetDriver {
113
185
  /**
114
186
  * Restart the agent. VM: `macf restart-self` when ALIVE (graceful — stash +
115
187
  * detached relaunch), or `launch` when DEAD. K8s: cycle the pod.
188
+ *
189
+ * `opts.leaveConfigUncommitted` (macf#725 — transactional revision, replaces
190
+ * the earlier unconditional-`forceStashConfig` shape): set ONLY by `rollFleet`
191
+ * on the restart that immediately follows an `upgrade` in the SAME roll. The
192
+ * roll's pre-flight `listDirtyConfig` gate already guaranteed the config
193
+ * surface was clean BEFORE `upgrade` ran; the ONLY dirt an upgrade can leave
194
+ * behind is `macf update`'s OWN regeneration of the managed surface — which is
195
+ * supposed to change and must never be silently stashed away (the relaunched
196
+ * agent needs to SEE it via `git status`). So this tells `restart-self` to
197
+ * relaunch WITHOUT stashing AND WITHOUT refusing on its own post-upgrade
198
+ * config-dirty guard — it maps to `restart-self`'s `--leave-config-uncommitted`
199
+ * flag / `MACF_RESTART_LEAVE_CONFIG_UNCOMMITTED=1`. Omitted (default false,
200
+ * i.e. the STANDALONE guard stays fully active) for every OTHER caller (e.g. a
201
+ * direct operator `macf restart-self` invocation, or `fleet-reconcile`'s
202
+ * healing ladder), which never bypasses the config-dirty gate because it never
203
+ * checks it in the first place.
116
204
  */
117
- readonly restart: (agent: string) => Promise<void>;
205
+ readonly restart: (agent: string, opts?: {
206
+ readonly leaveConfigUncommitted?: boolean;
207
+ }) => Promise<void>;
118
208
  /**
119
209
  * The tier-1 gated nudge — deliver `text` into the agent's live turn loop.
120
210
  * VM: the canonical `tmux-send-to-claude` submit pattern. Runtime-specific.
@@ -122,6 +212,56 @@ export interface FleetDriver {
122
212
  readonly inject: (agent: string, text: string) => Promise<void>;
123
213
  /** Cold-start a desired-but-down agent. VM: spawn its `./claude.sh`. */
124
214
  readonly launch: (agent: string) => Promise<void>;
215
+ /**
216
+ * List the agent's currently-modified files (macf#725) — used AFTER a
217
+ * successful `upgrade` to report what `macf update` regenerated in the
218
+ * relaunched agent's workspace, so the roll's post-upgrade message can name
219
+ * them explicitly. VM: `git status --porcelain` (all tracked changes, not
220
+ * scoped to the config-surface patterns — `macf update` can also touch pins /
221
+ * other managed files outside that surface). Best-effort: an inspection
222
+ * failure returns an empty list rather than throwing (never blocks reporting
223
+ * on a diagnostic-only read).
224
+ */
225
+ readonly listModifiedFiles: (agent: string) => Promise<readonly string[]>;
226
+ /**
227
+ * SET the maintenance lock for `agent` (DR-040 Decision 4,
228
+ * macf-devops-toolkit#158/#159 — the canonical "upgrade ≠ outage" contract).
229
+ * Create/overwrite (atomic write; `started_at`/`heartbeat_at` both = now).
230
+ * `rollFleet` calls this at the TOP of its per-agent transaction, BEFORE
231
+ * `upgrade`/`restart` touch the agent's process, so a watchdog sweep racing
232
+ * the very first SIGTERM already reads "planned maintenance," never
233
+ * "unplanned outage." VM: a lock FILE under
234
+ * `$MACF_MAINT_LOCK_DIR/<agent>.lock` (same-directory tempfile + `rename`,
235
+ * atomic); K8s (future): a pod annotation / ConfigMap patch — same
236
+ * four-verb contract, different storage (the MAINTENANCE-LOCK.md
237
+ * decision/driver split).
238
+ */
239
+ readonly acquireLock: (agent: string, targetVersion: string) => Promise<void>;
240
+ /**
241
+ * RELEASE the maintenance lock for `agent` (idempotent — a no-op if none
242
+ * exists). `rollFleet` calls this ONLY on a confirmed clean GREEN roll — a
243
+ * HALTed roll deliberately LEAVES the lock in place (DR-040 Decision 3:
244
+ * the stale heartbeat is the crash-safety backstop, not an immediate
245
+ * release — see macf-devops-toolkit#158's "release ONLY on confirmed clean
246
+ * success"). Releasing on failure would hand a possibly-broken, mid-
247
+ * transition agent straight back to the watchdog's healing ladder the
248
+ * instant the roll fails — exactly the uncoordinated intervention the
249
+ * transactional halt exists to avoid.
250
+ */
251
+ readonly releaseLock: (agent: string) => Promise<void>;
252
+ /**
253
+ * Start a BACKGROUND heartbeat loop refreshing `agent`'s maintenance lock —
254
+ * decoupled from `rollFleet`'s foreground awaits, because `upgrade` /
255
+ * `restart` / `verifyGreen` can each individually take a while and the
256
+ * heartbeat must not stall behind whichever step is currently running.
257
+ * Returns a synchronous STOP handle the caller invokes exactly once, on
258
+ * EITHER terminal branch (green or halt) — never both, and never omitted.
259
+ * VM: a bounded interval (period well under `MAINT_LOCK_TTL`), itself
260
+ * dead-man's-switch-bounded by `MAINT_LOCK_HEARTBEAT_MAX_S` so an orphaned
261
+ * loop (e.g. its parent process killed before the stop handle ever runs)
262
+ * cannot refresh the lock forever.
263
+ */
264
+ readonly startHeartbeat: (agent: string) => () => void;
125
265
  }
126
266
  /**
127
267
  * A fleet-driver operation failed against a resolvable target — most commonly an
@@ -1 +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"}
1
+ {"version":3,"file":"fleet-driver.d.ts","sourceRoot":"","sources":["../src/fleet-driver.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
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;AA4PxC;;;;;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"}