@cotal-ai/delivery 0.56.0 → 0.57.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,kCAAkC,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,gCAAgC,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAChL,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA8CzD,OAAO,EAAE,kCAAkC,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,gCAAgC,EAAE,qBAAqB,EAAE,WAAW,EAAE,CAAC;AAC3J,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,kCAAkC,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,gCAAgC,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAChL,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAmDzD,OAAO,EAAE,kCAAkC,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,gCAAgC,EAAE,qBAAqB,EAAE,WAAW,EAAE,CAAC;AAC3J,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -8,23 +8,28 @@
8
8
  import { registry } from "@cotal-ai/core";
9
9
  import { assertUninjectedCredsSharesCwdRoot, DELIVERY_CREDS_KIND, deliveryCredsKey, reloadStoreIdentityFromCredsPath, reloadStoreIdentityOf, runDelivery } from "./delivery.js";
10
10
  import { runFeedbackIntake } from "./feedback-intake.js";
11
+ import { runPending } from "./pending.js";
11
12
  const deliveryCommands = [
12
13
  {
13
14
  kind: "command",
14
15
  name: "deliver",
15
16
  group: "Manager",
16
- summary: "run the delivery daemon — the server-side Plane-3 durable backstop [--space <s>] [--server <url>] [--creds <file>] (auth mode only; N=1)",
17
+ summary: "run the delivery daemon — the server-side Plane-3 durable backstop [--space <s>] [--server <url>] [--creds <file>] (auth mode only; N=1); or `deliver pending <name>` to inspect a recipient's held DMs",
18
+ positionals: "[pending <name> [--limit <n>] [--durable <name>]]",
17
19
  flags: [
18
20
  { name: "space", type: "string", value: "<s>", description: "space to serve (required; the scoped cred doesn't encode it)" },
19
21
  { name: "server", type: "string", value: "<url>", description: "broker URL (default: the broker recorded for --space, else the local mesh)" },
20
22
  { name: "tls", type: "boolean", description: "REQUIRE TLS to the broker - refuse to connect if it is not offered" },
21
- { name: "creds", type: "string", value: "<file>", description: "pre-minted scoped delivery cred" },
23
+ { name: "creds", type: "string", value: "<file>", description: "pre-minted scoped delivery cred, or (with `pending`) an admin cred" },
22
24
  { name: "shard", type: "string", value: "<n>", description: "shard index (N=1 only; non-zero is rejected)" },
23
25
  { name: "shards", type: "string", value: "<n>", description: "shard count (N=1 only; >1 is rejected)" },
24
26
  { name: "dev-mint", type: "boolean", description: "standalone dev: mint a scoped delivery cred from the local signer" },
27
+ { name: "limit", type: "string", value: "<n>", description: "pending: max recent candidate ids to print (default 20)" },
28
+ { name: "durable", type: "string", value: "<name>", description: "pending: read this exact DM durable (a live read's printed name) instead of resolving <name>" },
29
+ { name: "json", type: "boolean", description: "pending: print the facts as one JSON object" },
25
30
  ],
26
31
  prepareMeshTarget: false,
27
- run: (args) => runDelivery(args),
32
+ run: (args) => (args.positionals[0] === "pending" ? runPending(args) : runDelivery(args)),
28
33
  },
29
34
  {
30
35
  kind: "command",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `cotal deliver pending <name>` — an operator inspection read over one recipient's DM durable.
3
+ * Never starts the daemon. Answers exactly the question issue #417 asks after a suspected drop:
4
+ * what does the broker hold for this recipient right now. Reads only; never acks, never creates
5
+ * a durable, never claims delivery — the only truthful facts here are what JetStream reports about
6
+ * a consumer that already exists.
7
+ */
8
+ import { type ParsedArgs } from "@cotal-ai/core";
9
+ export declare function runPending(args: ParsedArgs): Promise<void>;
10
+ //# sourceMappingURL=pending.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending.d.ts","sourceRoot":"","sources":["../src/pending.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EASL,KAAK,UAAU,EAEhB,MAAM,gBAAgB,CAAC;AAyCxB,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiIhE"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * `cotal deliver pending <name>` — an operator inspection read over one recipient's DM durable.
3
+ * Never starts the daemon. Answers exactly the question issue #417 asks after a suspected drop:
4
+ * what does the broker hold for this recipient right now. Reads only; never acks, never creates
5
+ * a durable, never claims delivery — the only truthful facts here are what JetStream reports about
6
+ * a consumer that already exists.
7
+ */
8
+ import { CotalEndpoint, dialerFor, dmDurable, dmStream, parsePrincipalKey, resolvePeer, standaloneConnectOpts, unicastSubject, } from "@cotal-ai/core";
9
+ import { connectOrExit } from "@cotal-ai/workspace";
10
+ import { jetstream, jetstreamManager, JetStreamApiCodes, JetStreamApiError } from "@nats-io/jetstream";
11
+ /** A short presence watch, the shape `send.ts` polls: an `offline` card still counts as a resolved
12
+ * peer (the recipient may be dead, that is exactly what this verb exists to inspect). */
13
+ async function pollPresence(ep, target) {
14
+ let peer;
15
+ for (let i = 0; i < 20 && !peer; i++) {
16
+ peer = resolvePeer(ep.getRoster(), target);
17
+ if (!peer)
18
+ await new Promise((r) => setTimeout(r, 100));
19
+ }
20
+ return peer;
21
+ }
22
+ function notFound(name, space) {
23
+ console.error(`✗ not-found: no agent "${name}" and no DM durable for it in space ${space}`);
24
+ process.exit(1);
25
+ }
26
+ function notFoundDurable(durable, space) {
27
+ console.error(`✗ not-found: no DM durable "${durable}" in space ${space}`);
28
+ process.exit(1);
29
+ }
30
+ /** Inverse of {@link dmDurable} for the `dm_<owner>-<actor>-<lifecycleUid>` name form. Owner/actor
31
+ * tokens ban `-` ({@link assertValidOwnerToken}) and the lifecycleUid token is `[a-z0-9]{26,32}`
32
+ * (also `-`-free), so splitting the part after the well-known `dm_` prefix on `-` is unambiguous
33
+ * exactly when it yields three parts each matching its own token grammar; anything else (a name
34
+ * typed by hand, a different durable kind) is reported as unparseable rather than guessed at. */
35
+ function parseDmDurable(durable) {
36
+ if (!durable.startsWith("dm_"))
37
+ return null;
38
+ const parts = durable.slice(3).split("-");
39
+ if (parts.length !== 3)
40
+ return null;
41
+ const [owner, actor, uid] = parts;
42
+ if (!/^[A-Za-z0-9_]+$/.test(owner) || !/^[A-Za-z0-9_]+$/.test(actor) || !/^[a-z0-9]{26,32}$/.test(uid))
43
+ return null;
44
+ return { owner, actor };
45
+ }
46
+ export async function runPending(args) {
47
+ const values = args.values;
48
+ const name = args.positionals[1];
49
+ if (!name || args.positionals.length > 2) {
50
+ console.error('usage: cotal deliver pending <name> [--limit <n>] [--durable <name>] [--space <s>] [--server <url>] [--creds <file>]');
51
+ process.exit(1);
52
+ }
53
+ const limit = values.limit ? Number(values.limit) : 20;
54
+ if (!Number.isSafeInteger(limit) || limit <= 0) {
55
+ console.error(`✗ --limit must be a positive integer, got ${JSON.stringify(values.limit)}`);
56
+ process.exit(1);
57
+ }
58
+ // Admin-only, static-mesh route (the same route `cotal mint --profile admin` takes): this verb
59
+ // grants no new authority, it rides the existing admin profile's STREAM.INFO/CONSUMER.INFO rows.
60
+ // A user-mode mesh has no equivalent read authority yet (see brief "Maintainer's calls"); refuse
61
+ // naming that rather than widening any other profile.
62
+ const conn = await connectOrExit(values, "admin");
63
+ const { server, space, tls } = conn;
64
+ // `<name>` stays required and is only echoed in error text; `--durable` (the exact consumer
65
+ // name a live read prints, via dmDurable/lifecycleNameKey) skips the presence watch entirely so
66
+ // an old lifecycle's held DMs stay reachable once its card is gone from the roster (a same-name
67
+ // respawn's card can never be steered back to a dead lifecycle's owner/actor by name alone).
68
+ let durable;
69
+ let recip;
70
+ if (values.durable) {
71
+ durable = values.durable;
72
+ recip = parseDmDurable(durable) ?? undefined;
73
+ }
74
+ else {
75
+ const ep = new CotalEndpoint({
76
+ space,
77
+ servers: server,
78
+ creds: conn.creds,
79
+ channels: [],
80
+ consume: false,
81
+ registerPresence: false,
82
+ watchPresence: true,
83
+ card: { name: "deliver-pending", kind: "endpoint" },
84
+ });
85
+ let peer;
86
+ await ep.start();
87
+ try {
88
+ peer = await pollPresence(ep, name);
89
+ }
90
+ finally {
91
+ await ep.stop();
92
+ }
93
+ if (!peer?.lifecycleUid)
94
+ notFound(name, space);
95
+ recip = parsePrincipalKey(peer.card.id) ?? undefined;
96
+ durable = dmDurable(recip?.owner ?? name, recip?.actor ?? name, peer.lifecycleUid);
97
+ }
98
+ const stream = dmStream(space);
99
+ const nc = await dialerFor(server)({ servers: server, ...standaloneConnectOpts({ creds: conn.creds, tls }), maxReconnectAttempts: 0 });
100
+ try {
101
+ const jsm = await jetstreamManager(nc);
102
+ let info;
103
+ try {
104
+ info = await jsm.consumers.info(stream, durable);
105
+ }
106
+ catch (e) {
107
+ if (e instanceof JetStreamApiError && e.code === JetStreamApiCodes.ConsumerNotFound) {
108
+ if (values.durable)
109
+ notFoundDurable(durable, space);
110
+ notFound(name, space);
111
+ }
112
+ throw e;
113
+ }
114
+ const streamInfo = await jsm.streams.info(stream);
115
+ const frontier = Math.max(0, (info.config.opt_start_seq ?? 1) - 1);
116
+ const facts = {
117
+ durable,
118
+ pending: info.num_pending,
119
+ ackPending: info.num_ack_pending,
120
+ delivered: info.delivered.stream_seq,
121
+ ackFloor: info.ack_floor.stream_seq,
122
+ created: info.created,
123
+ frontier,
124
+ max_age: streamInfo.config.max_age,
125
+ max_msgs_per_subject: streamInfo.config.max_msgs_per_subject,
126
+ discard: streamInfo.config.discard,
127
+ };
128
+ if (values.json) {
129
+ console.log(JSON.stringify(facts));
130
+ }
131
+ else {
132
+ console.log(durable);
133
+ console.log(`pending ${facts.pending}`);
134
+ console.log(`ack-pending ${facts.ackPending}`);
135
+ console.log(`delivered ${facts.delivered}`);
136
+ console.log(`ack-floor ${facts.ackFloor}`);
137
+ console.log(`created ${facts.created}`);
138
+ console.log(`frontier ${facts.frontier}`);
139
+ console.log(`max_age ${facts.max_age} max_msgs_per_subject ${facts.max_msgs_per_subject} discard ${facts.discard}`);
140
+ }
141
+ // Bounded read of recent candidate ids from the ack floor - an ephemeral ordered consumer,
142
+ // never acked, never durable. Not proof of a hole: it names what is there, nothing more.
143
+ // Needs owner/actor to filter subjects; skipped (and said so) when neither a resolved card
144
+ // nor an unambiguous --durable parse supplied them.
145
+ if (!recip) {
146
+ console.log("recent candidate ids: not read (no resolved card)");
147
+ }
148
+ else {
149
+ const js = jetstream(nc);
150
+ const subjects = [unicastSubject(space, recip.owner, recip.actor, "*", "*")];
151
+ const start = facts.ackFloor + 1;
152
+ const consumer = await js.consumers.get(stream, { filter_subjects: subjects, opt_start_seq: start });
153
+ try {
154
+ const cinfo = await consumer.info(true);
155
+ const pendingCandidates = Math.min(cinfo.num_pending, limit);
156
+ console.log("recent candidate ids (from the ack floor; not proof of a hole)");
157
+ if (pendingCandidates > 0) {
158
+ const iter = await consumer.consume({ max_messages: pendingCandidates });
159
+ let seen = 0;
160
+ try {
161
+ for await (const m of iter) {
162
+ const body = JSON.parse(new TextDecoder().decode(m.data));
163
+ console.log(` ${body.id} from=${body.from} ts=${body.ts}`);
164
+ seen++;
165
+ if (seen >= pendingCandidates)
166
+ break;
167
+ }
168
+ }
169
+ finally {
170
+ iter.stop();
171
+ }
172
+ }
173
+ }
174
+ finally {
175
+ try {
176
+ await consumer.delete();
177
+ }
178
+ catch { /* ephemeral, best-effort cleanup */ }
179
+ }
180
+ }
181
+ }
182
+ finally {
183
+ await nc.drain();
184
+ }
185
+ }
186
+ //# sourceMappingURL=pending.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending.js","sourceRoot":"","sources":["../src/pending.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,aAAa,EACb,SAAS,EACT,SAAS,EACT,QAAQ,EACR,iBAAiB,EACjB,WAAW,EACX,qBAAqB,EACrB,cAAc,GAGf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAIvG;0FAC0F;AAC1F,KAAK,UAAU,YAAY,CAAC,EAAiB,EAAE,MAAc;IAC3D,IAAI,IAA0B,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa;IAC3C,OAAO,CAAC,KAAK,CAAC,0BAA0B,IAAI,uCAAuC,KAAK,EAAE,CAAC,CAAC;IAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,KAAa;IACrD,OAAO,CAAC,KAAK,CAAC,+BAA+B,OAAO,cAAc,KAAK,EAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;;;kGAIkG;AAClG,SAAS,cAAc,CAAC,OAAe;IACrC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;IAClC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACpH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAgB;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAgB,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,sHAAsH,CAAC,CAAC;QACtI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,6CAA6C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,+FAA+F;IAC/F,iGAAiG;IACjG,iGAAiG;IACjG,sDAAsD;IACtD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAEpC,4FAA4F;IAC5F,gGAAgG;IAChG,gGAAgG;IAChG,6FAA6F;IAC7F,IAAI,OAAe,CAAC;IACpB,IAAI,KAAmD,CAAC;IACxD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QACzB,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,GAAG,IAAI,aAAa,CAAC;YAC3B,KAAK;YACL,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,KAAK;YACd,gBAAgB,EAAE,KAAK;YACvB,aAAa,EAAE,IAAI;YACnB,IAAI,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAE;SACpD,CAAC,CAAC;QACH,IAAI,IAA0B,CAAC;QAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,YAAY;YAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC/C,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC;QACrD,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE/B,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,qBAAqB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,CAAC,CAAC;IACvI,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,iBAAiB,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;gBACpF,IAAI,MAAM,CAAC,OAAO;oBAAE,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACpD,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACxB,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG;YACZ,OAAO;YACP,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,UAAU,EAAE,IAAI,CAAC,eAAe;YAChC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU;YACpC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU;YACnC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ;YACR,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO;YAClC,oBAAoB,EAAE,UAAU,CAAC,MAAM,CAAC,oBAAoB;YAC5D,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO;SACnC,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,OAAO,yBAAyB,KAAK,CAAC,oBAAoB,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtH,CAAC;QAED,2FAA2F;QAC3F,yFAAyF;QACzF,2FAA2F;QAC3F,oDAAoD;QACpD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;YACzB,MAAM,QAAQ,GAAG,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;YACrG,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxC,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;gBAC7D,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;gBAC9E,IAAI,iBAAiB,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,iBAAiB,EAAE,CAAC,CAAC;oBACzE,IAAI,IAAI,GAAG,CAAC,CAAC;oBACb,IAAI,CAAC;wBACH,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;4BAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAA6C,CAAC;4BACtG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,EAAE,UAAU,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;4BAC9D,IAAI,EAAE,CAAC;4BACP,IAAI,IAAI,IAAI,iBAAiB;gCAAE,MAAM;wBACvC,CAAC;oBACH,CAAC;4BAAS,CAAC;wBACT,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC;oBAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,oCAAoC,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cotal-ai/delivery",
3
3
  "description": "Cotal delivery daemon: the server-side Plane-3 durable backstop (fan-out writer + trusted reader + membership/ACL authority), a scoped least-privilege NATS client co-located with the broker.",
4
- "version": "0.56.0",
4
+ "version": "0.57.0",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
@@ -18,8 +18,9 @@
18
18
  }
19
19
  },
20
20
  "dependencies": {
21
- "@cotal-ai/core": "0.56.0",
22
- "@cotal-ai/workspace": "0.56.0"
21
+ "@nats-io/jetstream": "^3.4.0",
22
+ "@cotal-ai/core": "0.57.0",
23
+ "@cotal-ai/workspace": "0.57.0"
23
24
  },
24
25
  "files": [
25
26
  "dist"
@@ -28,7 +29,6 @@
28
29
  "access": "public"
29
30
  },
30
31
  "devDependencies": {
31
- "@nats-io/jetstream": "^3.4.0",
32
32
  "@nats-io/kv": "^3.4.0",
33
33
  "@nats-io/transport-node": "^3.4.0",
34
34
  "@cotal-ai/smoke-kit": "0.0.0"