@groundnuty/macf-core 0.2.46 → 0.2.48

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,33 @@ 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 (`.claude/**`, `CLAUDE.md`, `claude.sh`, `env.local.*` — see
105
+ * `ROLL_TOUCHED_CONFIG_PATTERNS` in `fleet-upgrade.ts`). VM: `git status`
106
+ * in the agent's workspace, filtered to that path set. A DEAD/absent agent
107
+ * reads `false` (nothing to check; reconcile will launch it). Kept as a
108
+ * boolean convenience alongside `listDirtyConfig` below — `rollFleet`'s
109
+ * pre-flight gate itself calls `listDirtyConfig` (it needs the file list to
110
+ * OBJECT with, macf#725), so this predicate form is for OTHER callers that
111
+ * only need the yes/no answer.
112
+ */
113
+ readonly isConfigDirty: (agent: string) => Promise<boolean>;
114
+ /**
115
+ * The pre-flight config-dirty gate's LIST form (macf#725 — transactional
116
+ * object-with-message revision; this is what `rollFleet` actually calls).
117
+ * Same predicate surface as `isConfigDirty` (`ROLL_TOUCHED_CONFIG_PATTERNS`,
118
+ * tracked-only), but returns the actual uncommitted paths rather than a
119
+ * boolean, so the roll can OBJECT with a specific, actionable list instead
120
+ * of a bare skip — a dirty agent is SKIPPED before any mutation (never
121
+ * upgraded/restarted); `macf update` / restart-self would otherwise clobber
122
+ * or stash operator-authored config underneath it. 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
+ readonly listDirtyConfig: (agent: string) => Promise<readonly string[]>;
101
128
  /**
102
129
  * Read the agent's current pane content for stall-signature matching
103
130
  * (`macf fleet resume`, DR-037 / macf#686). VM: a single `tmux capture-pane`
@@ -113,8 +140,26 @@ export interface FleetDriver {
113
140
  /**
114
141
  * Restart the agent. VM: `macf restart-self` when ALIVE (graceful — stash +
115
142
  * detached relaunch), or `launch` when DEAD. K8s: cycle the pod.
143
+ *
144
+ * `opts.leaveConfigUncommitted` (macf#725 — transactional revision, replaces
145
+ * the earlier unconditional-`forceStashConfig` shape): set ONLY by `rollFleet`
146
+ * on the restart that immediately follows an `upgrade` in the SAME roll. The
147
+ * roll's pre-flight `listDirtyConfig` gate already guaranteed the config
148
+ * surface was clean BEFORE `upgrade` ran; the ONLY dirt an upgrade can leave
149
+ * behind is `macf update`'s OWN regeneration of the managed surface — which is
150
+ * supposed to change and must never be silently stashed away (the relaunched
151
+ * agent needs to SEE it via `git status`). So this tells `restart-self` to
152
+ * relaunch WITHOUT stashing AND WITHOUT refusing on its own post-upgrade
153
+ * config-dirty guard — it maps to `restart-self`'s `--leave-config-uncommitted`
154
+ * flag / `MACF_RESTART_LEAVE_CONFIG_UNCOMMITTED=1`. Omitted (default false,
155
+ * i.e. the STANDALONE guard stays fully active) for every OTHER caller (e.g. a
156
+ * direct operator `macf restart-self` invocation, or `fleet-reconcile`'s
157
+ * healing ladder), which never bypasses the config-dirty gate because it never
158
+ * checks it in the first place.
116
159
  */
117
- readonly restart: (agent: string) => Promise<void>;
160
+ readonly restart: (agent: string, opts?: {
161
+ readonly leaveConfigUncommitted?: boolean;
162
+ }) => Promise<void>;
118
163
  /**
119
164
  * The tier-1 gated nudge — deliver `text` into the agent's live turn loop.
120
165
  * VM: the canonical `tmux-send-to-claude` submit pattern. Runtime-specific.
@@ -122,6 +167,17 @@ export interface FleetDriver {
122
167
  readonly inject: (agent: string, text: string) => Promise<void>;
123
168
  /** Cold-start a desired-but-down agent. VM: spawn its `./claude.sh`. */
124
169
  readonly launch: (agent: string) => Promise<void>;
170
+ /**
171
+ * List the agent's currently-modified files (macf#725) — used AFTER a
172
+ * successful `upgrade` to report what `macf update` regenerated in the
173
+ * relaunched agent's workspace, so the roll's post-upgrade message can name
174
+ * them explicitly. VM: `git status --porcelain` (all tracked changes, not
175
+ * scoped to the config-surface patterns — `macf update` can also touch pins /
176
+ * other managed files outside that surface). Best-effort: an inspection
177
+ * failure returns an empty list rather than throwing (never blocks reporting
178
+ * on a diagnostic-only read).
179
+ */
180
+ readonly listModifiedFiles: (agent: string) => Promise<readonly string[]>;
125
181
  }
126
182
  /**
127
183
  * 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":"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;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAE5D;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAExE;;;;;;;;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;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzG;;;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;IAElD;;;;;;;;;OASG;IACH,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;CAC3E;AAED;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,SAAS;gBACjC,OAAO,EAAE,MAAM;CAI5B"}
@@ -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;AAmKxC;;;;;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"}