@aligndottech/cli 0.41.0 → 0.43.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.
Files changed (47) hide show
  1. package/README.md +5 -3
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +20 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/mcp.d.ts +1 -1
  6. package/dist/commands/mcp.d.ts.map +1 -1
  7. package/dist/commands/mcp.js +57 -23
  8. package/dist/commands/mcp.js.map +1 -1
  9. package/dist/commands/setup.d.ts.map +1 -1
  10. package/dist/commands/setup.js +200 -4
  11. package/dist/commands/setup.js.map +1 -1
  12. package/dist/lib/access-capability.d.ts +33 -0
  13. package/dist/lib/access-capability.d.ts.map +1 -0
  14. package/dist/lib/access-capability.js +41 -0
  15. package/dist/lib/access-capability.js.map +1 -0
  16. package/dist/lib/as-of.d.ts +80 -0
  17. package/dist/lib/as-of.d.ts.map +1 -0
  18. package/dist/lib/as-of.js +305 -0
  19. package/dist/lib/as-of.js.map +1 -0
  20. package/dist/lib/config.d.ts +32 -0
  21. package/dist/lib/config.d.ts.map +1 -1
  22. package/dist/lib/config.js +64 -0
  23. package/dist/lib/config.js.map +1 -1
  24. package/dist/lib/decision-relations.d.ts +9 -7
  25. package/dist/lib/decision-relations.d.ts.map +1 -1
  26. package/dist/lib/decision-relations.js +9 -7
  27. package/dist/lib/decision-relations.js.map +1 -1
  28. package/dist/lib/gateway-client.d.ts +10 -1
  29. package/dist/lib/gateway-client.d.ts.map +1 -1
  30. package/dist/lib/gateway-client.js +9 -2
  31. package/dist/lib/gateway-client.js.map +1 -1
  32. package/dist/lib/local-db.d.ts +43 -0
  33. package/dist/lib/local-db.d.ts.map +1 -1
  34. package/dist/lib/local-db.js +46 -2
  35. package/dist/lib/local-db.js.map +1 -1
  36. package/dist/lib/local-gateway-client.d.ts +40 -4
  37. package/dist/lib/local-gateway-client.d.ts.map +1 -1
  38. package/dist/lib/local-gateway-client.js +151 -19
  39. package/dist/lib/local-gateway-client.js.map +1 -1
  40. package/dist/lib/local-llm.d.ts +9 -2
  41. package/dist/lib/local-llm.d.ts.map +1 -1
  42. package/dist/lib/local-llm.js +33 -5
  43. package/dist/lib/local-llm.js.map +1 -1
  44. package/dist/lib/value-rollup.d.ts.map +1 -1
  45. package/dist/lib/value-rollup.js +3 -1
  46. package/dist/lib/value-rollup.js.map +1 -1
  47. package/package.json +1 -1
@@ -0,0 +1,305 @@
1
+ /**
2
+ * ALI-1411: the as-of cutoff (`align mcp --created-before`) applied to every read tool.
3
+ *
4
+ * ALI-1082 bounded only the three tools built on `searchDecisions`, because smart-search is the
5
+ * one gateway route that accepts `created_before`. Every other read tool answered from the whole
6
+ * graph, so a frozen AlignBench run could cite a decision captured after its cutoff - v7 Jira
7
+ * rep 3 failed by citing ALI-391 exactly that way.
8
+ *
9
+ * Where the backend can bound the query it does (conflicts ride the decision-links timestamp
10
+ * cursor). Everything else is filtered HERE, by each row's own `created_at`, because the gateway
11
+ * routes behind them take no as-of parameter. Three rules hold throughout:
12
+ *
13
+ * - **Fail closed.** A row with no timestamp, or one that does not parse, is dropped: an unknown
14
+ * age is not provably before the cutoff, and a benchmark leak is the failure this exists for.
15
+ * A response shape this module does not recognise is refused, never passed through.
16
+ * - **Never leak through a summary.** Counts, totals, platform lists and messages computed over
17
+ * the whole graph are recomputed from the surviving rows or removed. A count that includes a
18
+ * post-cutoff decision tells the agent it exists.
19
+ * - **No cutoff, no change.** Callers only reach this module when a cutoff is set.
20
+ *
21
+ * What client-side filtering cannot see, and so is NOT covered (each needs gateway support):
22
+ * a row's `status` is its status today (a decision superseded after the cutoff still reads
23
+ * `superseded`); an impact-graph EDGE recorded after the cutoff between two older decisions is
24
+ * invisible in that response; `/alignment/check`'s verdict was reached by a judge that saw
25
+ * post-cutoff candidates, so a kept conflict's `reason` prose can still mention one; a kept
26
+ * history event can carry an `acknowledged_at` after the cutoff; and server-side limits (topic timeline 50, conflicts 50) are spent
27
+ * before the filter, so an as-of answer can be shorter than the true as-of graph.
28
+ */
29
+ import { GatewayError } from './gateway-client.js';
30
+ /** An offset or `Z` at the end of the string - a timestamp that already names its zone. */
31
+ const HAS_ZONE = /(?:Z|[+-]\d{2}(?::?\d{2})?)$/;
32
+ /**
33
+ * Is `stored` strictly before `cutoff`? False for anything absent or unparseable (fail closed).
34
+ *
35
+ * The local graph stores SQLite's `YYYY-MM-DD HH:MM:SS`, which is UTC with no zone marker, so a
36
+ * zone-less value is read as UTC - the same normalisation local-gateway-client.ts applies.
37
+ * `Date.parse` returns NaN for garbage, and NaN compares false both ways, so it is checked
38
+ * explicitly rather than trusted to fall out of the `<`.
39
+ */
40
+ export function isCreatedBefore(stored, cutoff) {
41
+ if (typeof stored !== 'string' || stored.trim() === '')
42
+ return false;
43
+ let normalised = stored.trim();
44
+ if (!normalised.includes('T'))
45
+ normalised = normalised.replace(' ', 'T');
46
+ if (!HAS_ZONE.test(normalised))
47
+ normalised = `${normalised}Z`;
48
+ const at = Date.parse(normalised);
49
+ const bound = Date.parse(cutoff);
50
+ if (Number.isNaN(at) || Number.isNaN(bound))
51
+ return false;
52
+ return at < bound;
53
+ }
54
+ /** The refusal for a decision the as-of graph does not contain. Names no detail of it. */
55
+ export function notInGraphAsOf(id, cutoff) {
56
+ return new Error(`No decision ${id} in the graph as of ${cutoff}.`);
57
+ }
58
+ /**
59
+ * A lookup that says the decision does not exist (cloud 404, or the local client's "No decision
60
+ * <id> in your local graph"). Such a decision is not in the as-of graph either, so it reads as
61
+ * "not before" - one dangling link endpoint must not fail a whole tool call.
62
+ */
63
+ function isNotFound(err) {
64
+ if (err instanceof GatewayError)
65
+ return err.statusCode === 404;
66
+ return err instanceof Error && /^No decision \S+ in your local graph/.test(err.message);
67
+ }
68
+ /**
69
+ * One guard per tool call. Other `getDecision` errors propagate: a failed lookup is not evidence
70
+ * the decision is old OR new, and dropping it silently would change the answer on a network blip.
71
+ */
72
+ export function createAsOfGuard(cutoff, getDecision) {
73
+ const seen = new Map();
74
+ const isBefore = (stored) => isCreatedBefore(stored, cutoff);
75
+ const decisionBefore = (id) => {
76
+ let known = seen.get(id);
77
+ if (!known) {
78
+ known = getDecision(id).then((row) => isBefore(row?.created_at), (err) => {
79
+ if (isNotFound(err))
80
+ return false;
81
+ throw err;
82
+ });
83
+ seen.set(id, known);
84
+ }
85
+ return known;
86
+ };
87
+ return {
88
+ cutoff,
89
+ isBefore,
90
+ decisionBefore,
91
+ async assertDecision(id) {
92
+ if (!(await decisionBefore(id)))
93
+ throw notInGraphAsOf(id, cutoff);
94
+ },
95
+ };
96
+ }
97
+ function cannotFilter(what) {
98
+ return new Error(`Cannot apply the as-of cutoff to an unrecognised ${what} response, so it is not returned. ` +
99
+ 'A result that might include decisions captured after the cutoff is worse than none.');
100
+ }
101
+ const asRecord = (v) => v !== null && typeof v === 'object' && !Array.isArray(v) ? v : undefined;
102
+ /**
103
+ * `/alignment/check` takes no as-of parameter. The cited decisions carry no timestamp, so each is
104
+ * looked up. A conflict resting only on a dropped decision is dropped with it, and a verdict that
105
+ * no longer has a surviving conflict is downgraded to retrieval, which claims nothing.
106
+ */
107
+ export async function filterAlignmentAsOf(result, guard) {
108
+ const relevant = Array.isArray(result?.relevant_decisions) ? result.relevant_decisions : [];
109
+ const conflicts = Array.isArray(result?.conflicts) ? result.conflicts : [];
110
+ const ids = [...new Set([...relevant.map((d) => d.id), ...conflicts.map((c) => c.decision_id)])];
111
+ const verdicts = new Map(await Promise.all(ids.map(async (id) => [id, typeof id === 'string' && (await guard.decisionBefore(id))])));
112
+ const keptRelevant = relevant.filter((d) => verdicts.get(d.id) === true);
113
+ const keptConflicts = conflicts.filter((c) => verdicts.get(c.decision_id) === true);
114
+ if (keptRelevant.length === relevant.length && keptConflicts.length === conflicts.length)
115
+ return result;
116
+ let status = result.status;
117
+ if (status !== 'unknown') {
118
+ if (keptConflicts.length > 0) {
119
+ // A conflict against a decision that predates the cutoff is still a finding.
120
+ }
121
+ else if (status === 'conflicting') {
122
+ status = keptRelevant.length > 0 ? 'retrieved' : 'no-context';
123
+ }
124
+ else if (keptRelevant.length === 0) {
125
+ status = 'no-context';
126
+ }
127
+ }
128
+ // The gateway's message can name a dropped decision, or count it (local 'unknown' says "Could
129
+ // not check N related decision(s)"), so it is rebuilt from what survived - 'unknown' included.
130
+ const message = status === 'unknown'
131
+ ? `Could not check ${keptRelevant.length} related decision(s) recorded before ${guard.cutoff}. ` +
132
+ 'This is NOT a pass: treat it as unchecked and review these decisions before proceeding.'
133
+ : status === 'conflicting'
134
+ ? `Potential conflict with ${keptConflicts.length} decision(s).`
135
+ : status === 'no-context'
136
+ ? 'No related decisions found.'
137
+ : status === 'aligned'
138
+ ? `No conflicts with ${keptRelevant.length} related decision(s).`
139
+ : `Found ${keptRelevant.length} related decision(s) to review.`;
140
+ const out = {
141
+ ...result,
142
+ status,
143
+ relevant_decisions: keptRelevant,
144
+ ...(result.conflicts !== undefined ? { conflicts: keptConflicts } : {}),
145
+ // The gateway's confidence is a max over candidates that included a dropped decision, so it
146
+ // is recomputed from the survivors' similarity ('unknown' already reports no confidence).
147
+ ...(status !== 'unknown'
148
+ ? { confidence: Math.max(0, ...keptRelevant.map((d) => (typeof d.similarity === 'number' ? d.similarity : 0))) }
149
+ : {}),
150
+ message,
151
+ };
152
+ // The event id and any prior sign-off belong to the verdict the gateway reached. Once that
153
+ // verdict is withdrawn, carrying them would let a person adjudicate a result nobody returned.
154
+ // An 'unknown' result left the dropped decision in its unchecked set, so the same applies.
155
+ if (status !== result.status || status === 'unknown') {
156
+ delete out.check_event_id;
157
+ delete out.prior_adjudication;
158
+ }
159
+ return out;
160
+ }
161
+ /**
162
+ * Both link shapes: cloud (`created_at` plus embedded `from_decision`/`to_decision`) and local
163
+ * (`createdAt` plus `sourceId`/`targetId`). The EDGE and BOTH endpoints are bounded separately -
164
+ * an edge recorded after the cutoff between two older decisions asserts a relation the as-of
165
+ * graph did not hold, and a backdated edge can still point at a newer decision.
166
+ */
167
+ async function linkBefore(link, guard) {
168
+ const l = asRecord(link);
169
+ if (!l)
170
+ return false;
171
+ if (!guard.isBefore(l['created_at'] ?? l['createdAt']))
172
+ return false;
173
+ const from = asRecord(l['from_decision']);
174
+ const to = asRecord(l['to_decision']);
175
+ if (from && to)
176
+ return guard.isBefore(from['created_at']) && guard.isBefore(to['created_at']);
177
+ const a = l['sourceId'] ?? l['from_snapshot'];
178
+ const b = l['targetId'] ?? l['to_snapshot'];
179
+ if (typeof a !== 'string' || typeof b !== 'string')
180
+ return false;
181
+ const [okA, okB] = await Promise.all([guard.decisionBefore(a), guard.decisionBefore(b)]);
182
+ return okA && okB;
183
+ }
184
+ async function keepLinks(links, guard) {
185
+ const keep = await Promise.all(links.map((l) => linkBefore(l, guard)));
186
+ return links.filter((_, i) => keep[i]);
187
+ }
188
+ /**
189
+ * `conflict_count` is recounted from the surviving links. The gateway returns its count fields as
190
+ * null whenever a cursor is sent, and none of them could be trusted as-of anyway, so no gateway
191
+ * count is reported under a cutoff. `next_cursor` is dropped too: it encodes the last RAW row's
192
+ * timestamp and id, which may be a link this filter removed, and no tool takes a cursor.
193
+ */
194
+ export async function filterConflictsAsOf(result, guard) {
195
+ if (!Array.isArray(result?.links))
196
+ throw cannotFilter('conflicts');
197
+ const links = await keepLinks(result.links, guard);
198
+ const hasMore = result.pagination?.['has_more'] === true;
199
+ return {
200
+ links,
201
+ ...(result.pagination
202
+ ? { pagination: { has_more: hasMore } }
203
+ : {}),
204
+ conflict_count: links.length,
205
+ ...(hasMore
206
+ ? {
207
+ showing: links.length,
208
+ message: `Showing ${links.length} conflict links recorded before ${guard.cutoff}; more exist, and their total is not available under an as-of cutoff.`,
209
+ }
210
+ : {}),
211
+ };
212
+ }
213
+ /**
214
+ * Cloud rows carry `created_at` and the traversal `path` from the root. A row reached only
215
+ * through a dropped decision goes too: that route did not exist as of the cutoff. (If the
216
+ * traversal reached it by a second, older route the gateway only reports one path, so this can
217
+ * over-prune - the safe direction.)
218
+ */
219
+ function pruneTraversal(rows, guard) {
220
+ const records = rows.map(asRecord);
221
+ const dropped = new Set(records.filter((r) => !r || !guard.isBefore(r['created_at'])).map((r) => r?.['id']));
222
+ return rows.filter((_, i) => {
223
+ const r = records[i];
224
+ if (!r || dropped.has(r['id']))
225
+ return false;
226
+ const path = Array.isArray(r['path']) ? r['path'] : [];
227
+ return !path.some((id) => dropped.has(id));
228
+ });
229
+ }
230
+ /** `decision`-rooted cloud shape, or local `{ upstream, downstream }` link rows. */
231
+ export async function filterImpactAsOf(result, guard) {
232
+ const r = asRecord(result);
233
+ if (r && ('impact' in r || 'dependencies' in r)) {
234
+ const side = (key, some, none) => {
235
+ const block = asRecord(r[key]);
236
+ if (!block)
237
+ return {};
238
+ if (!Array.isArray(block['decisions']))
239
+ throw cannotFilter('impact');
240
+ const decisions = pruneTraversal(block['decisions'], guard);
241
+ return {
242
+ [key]: { ...block, count: decisions.length, decisions, summary: decisions.length > 0 ? some(decisions.length) : none },
243
+ };
244
+ };
245
+ return {
246
+ ...r,
247
+ ...side('impact', (n) => `${n} decision(s) depend on this`, 'No downstream dependencies'),
248
+ ...side('dependencies', (n) => `Built on ${n} other decision(s)`, 'No upstream dependencies'),
249
+ };
250
+ }
251
+ if (r && Array.isArray(r['upstream']) && Array.isArray(r['downstream'])) {
252
+ const [upstream, downstream] = await Promise.all([
253
+ keepLinks(r['upstream'], guard),
254
+ keepLinks(r['downstream'], guard),
255
+ ]);
256
+ return { ...r, upstream, downstream };
257
+ }
258
+ throw cannotFilter('impact');
259
+ }
260
+ /**
261
+ * Filtered BEFORE shapeTopicTimeline, so the shaping contract runs over the as-of rows. Every
262
+ * field that refers to a row is filtered by membership, and every whole-retrieval figure is
263
+ * recomputed. `background_platforms` is deleted so the shaper re-derives it from the survivors;
264
+ * `activity` month buckets are deleted because they cannot be re-derived honestly from rows.
265
+ */
266
+ export function filterTopicTimelineAsOf(result, guard) {
267
+ if (!Array.isArray(result?.decisions))
268
+ throw cannotFilter('topic timeline');
269
+ const decisions = result.decisions.filter((d) => guard.isBefore(d?.created_at));
270
+ const kept = new Set(decisions.map((d) => d.id));
271
+ const has = (id) => typeof id === 'string' && kept.has(id);
272
+ const platforms = [...new Set(decisions.map((d) => d.platform).filter((p) => Boolean(p)))].sort();
273
+ const out = {
274
+ ...result,
275
+ decisions,
276
+ count: decisions.length,
277
+ superseded_count: decisions.filter((d) => d.status === 'superseded' || d.status === 'archived').length,
278
+ platforms,
279
+ spans_platforms: platforms.length > 1,
280
+ // An emptied chain would put every survivor in background and narrate nothing; omitting it
281
+ // takes the shaper's older-gateway path, which narrates all rows.
282
+ ...(Array.isArray(result.chain_ids) && result.chain_ids.some(has)
283
+ ? { chain_ids: result.chain_ids.filter(has) }
284
+ : {}),
285
+ ...(Array.isArray(result.disagreements)
286
+ ? { disagreements: result.disagreements.filter((d) => has(d?.from?.id) && has(d?.to?.id)) }
287
+ : {}),
288
+ ...(Array.isArray(result.why) ? { why: result.why.filter((w) => has(w?.id)) } : {}),
289
+ ...(Array.isArray(result.still_open) ? { still_open: result.still_open.filter((s) => has(s?.id)) } : {}),
290
+ };
291
+ if (!result.chain_ids?.some(has))
292
+ delete out.chain_ids;
293
+ delete out.background_platforms;
294
+ delete out.activity;
295
+ return out;
296
+ }
297
+ /** `GET /decisions/:id/history`: events after the cutoff had not happened yet. */
298
+ export function filterDecisionTimelineAsOf(result, guard) {
299
+ const r = asRecord(result);
300
+ if (!r || !Array.isArray(r['events']))
301
+ throw cannotFilter('decision timeline');
302
+ const events = r['events'].filter((e) => guard.isBefore(asRecord(e)?.['occurred_at']));
303
+ return { ...r, events, event_count: events.length };
304
+ }
305
+ //# sourceMappingURL=as-of.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"as-of.js","sourceRoot":"","sources":["../../src/lib/as-of.ts"],"names":[],"mappings":"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"}
@@ -58,6 +58,35 @@ export type TelemetryConsent = 'granted' | 'declined' | 'off';
58
58
  * exactly once, from src/index.ts, before any command runs.
59
59
  */
60
60
  export declare function migrateConfigDirectory(oldDir: string, newDir: string): void;
61
+ /**
62
+ * The two free-tier providers `align setup` guides a user through (ALI-1284). Not the
63
+ * full `AiProvider` union from local-llm.ts: this is specifically the pair the guided
64
+ * setup step offers and persists, not a general secret store for every provider local-llm
65
+ * already resolves from a plain env var.
66
+ */
67
+ export type GuidedProviderKey = 'groq' | 'gemini';
68
+ /**
69
+ * ALI-1284: fills `process.env` from a previously-saved provider key, so `align ask`
70
+ * keeps working on every invocation after the one where `align setup` collected it -
71
+ * without local-llm.ts (which resolves providers from plain env vars, and stays a
72
+ * dependency-free pure module on purpose) ever knowing a config store exists.
73
+ *
74
+ * A real env var always wins and is never overwritten: this is a convenience default,
75
+ * not a second source of truth, the same precedence `getEnvironment` already gives
76
+ * ALIGN_TOKEN/ALIGN_TENANT_ID/ALIGN_GATEWAY_URL above. Checks every alias `keyForProvider`
77
+ * itself accepts (not just the primary name), or hydrating the primary name from storage
78
+ * would outrank a real credential the user set under an alias - see PROVIDER_ENV_ALIASES.
79
+ * Called from the `preAction` Commander hook in cli.ts, before a command's own action runs
80
+ * - never from module scope in index.ts, or a Conf store would be constructed (and its
81
+ * defaults written to disk) for `align --version`, which startup-migration.test.ts pins as
82
+ * untouched on a fresh machine. Never from inside createConfigStore() itself either, for the
83
+ * same reason migrateConfigDirectory is split out (Copilot review, PR #231): a pure
84
+ * constructor stays mockable without needing to stub `process.env` in every test that
85
+ * merely constructs a store.
86
+ */
87
+ export declare function hydrateProviderKeyEnv(config: {
88
+ getProviderKey(provider: GuidedProviderKey): string | null;
89
+ }, env?: Record<string, string | undefined>): void;
61
90
  export declare function createConfigStore(): {
62
91
  getEnvironment(env: EnvName): EnvironmentConfig;
63
92
  setAuthToken(env: EnvName, token: string): void;
@@ -89,6 +118,9 @@ export declare function createConfigStore(): {
89
118
  getInstallId(): string;
90
119
  getTelemetryConsent(): TelemetryConsent | undefined;
91
120
  setTelemetryConsent(value: TelemetryConsent): void;
121
+ getProviderKey(provider: GuidedProviderKey): string | null;
122
+ setProviderKey(provider: GuidedProviderKey, key: string): void;
123
+ clearProviderKey(provider: GuidedProviderKey): void;
92
124
  wasFunnelStageRecorded(stage: string): boolean;
93
125
  markFunnelStageRecorded(stage: string): void;
94
126
  };
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,gBAAgB,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,CAAC;CACjD,GAAG,OAAO,CASV;AAQD;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,QAA2B,CAAC;AAEjE;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,QAA4B,CAAC;AAEnE;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;AAE9D;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAM3E;AAED,wBAAgB,iBAAiB;wBAiCT,OAAO,GAAG,iBAAiB;sBAc7B,OAAO,SAAS,MAAM;qBAIvB,OAAO,YAAY,MAAM;qBAIzB,MAAM;uBAIJ,OAAO;qBACT,OAAO;2BACD,OAAO,gBAAgB,MAAM,GAAG,MAAM,GAAG,IAAI;2BAI7C,OAAO,gBAAgB,MAAM,SAAS,MAAM;IAInE;;;;;OAKG;4BACqB,OAAO,gBAAgB,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;6BAY5D,OAAO,gBAAgB,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAYtF,iGAAiG;yBAC5E,OAAO,gBAAgB,MAAM;IAOlD,6FAA6F;6BACpE,OAAO;6BAMP,OAAO,gBAAgB,MAAM,GAAG,MAAM,GAAG,IAAI;6BAI7C,OAAO,gBAAgB,MAAM,WAAW,MAAM;8BAI7C,OAAO,gBAAgB,MAAM,GAAG,MAAM,GAAG,IAAI;8BAI7C,OAAO,gBAAgB,MAAM,YAAY,MAAM;yBAIpD,MAAM;;eAWhB,OAAO;oBAQF,MAAM;2BAOC,gBAAgB,GAAG,SAAS;+BAGxB,gBAAgB;kCAMb,MAAM,GAAG,OAAO;mCAGf,MAAM,GAAG,IAAI;EAK/C"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,gBAAgB,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,CAAC;CACjD,GAAG,OAAO,CASV;AAQD;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,QAA2B,CAAC;AAEjE;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,QAA4B,CAAC;AAEnE;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;AAE9D;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAM3E;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAoBlD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE;IAAE,cAAc,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAAA;CAAE,EACtE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,IAAI,CAMN;AAED,wBAAgB,iBAAiB;wBAkCT,OAAO,GAAG,iBAAiB;sBAc7B,OAAO,SAAS,MAAM;qBAIvB,OAAO,YAAY,MAAM;qBAIzB,MAAM;uBAIJ,OAAO;qBACT,OAAO;2BACD,OAAO,gBAAgB,MAAM,GAAG,MAAM,GAAG,IAAI;2BAI7C,OAAO,gBAAgB,MAAM,SAAS,MAAM;IAInE;;;;;OAKG;4BACqB,OAAO,gBAAgB,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;6BAY5D,OAAO,gBAAgB,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAYtF,iGAAiG;yBAC5E,OAAO,gBAAgB,MAAM;IAOlD,6FAA6F;6BACpE,OAAO;6BAMP,OAAO,gBAAgB,MAAM,GAAG,MAAM,GAAG,IAAI;6BAI7C,OAAO,gBAAgB,MAAM,WAAW,MAAM;8BAI7C,OAAO,gBAAgB,MAAM,GAAG,MAAM,GAAG,IAAI;8BAI7C,OAAO,gBAAgB,MAAM,YAAY,MAAM;yBAIpD,MAAM;;eAWhB,OAAO;oBAQF,MAAM;2BAOC,gBAAgB,GAAG,SAAS;+BAGxB,gBAAgB;6BAOlB,iBAAiB,GAAG,MAAM,GAAG,IAAI;6BAGjC,iBAAiB,OAAO,MAAM;+BAQ5B,iBAAiB;kCAQd,MAAM,GAAG,OAAO;mCAGf,MAAM,GAAG,IAAI;EAK/C"}
@@ -65,6 +65,50 @@ export function migrateConfigDirectory(oldDir, newDir) {
65
65
  fs.mkdirSync(newDir, { recursive: true });
66
66
  fs.copyFileSync(oldFile, newFile);
67
67
  }
68
+ const PROVIDER_ENV_VAR = {
69
+ groq: 'GROQ_API_KEY',
70
+ gemini: 'GEMINI_API_KEY',
71
+ };
72
+ /**
73
+ * Every real env var `local-llm.ts`'s `keyForProvider` accepts for this provider - not just
74
+ * the primary name hydration writes to. Gemini has a second, equally real alias
75
+ * (`GOOGLE_API_KEY`), checked there with `||` ahead of a stored value. Missing this (Copilot
76
+ * review, PR #322) meant a user who exported only `GOOGLE_API_KEY` still got the STORED
77
+ * Gemini key hydrated into `GEMINI_API_KEY`, which then won `keyForProvider`'s own `||` -
78
+ * silently shadowing a real, deliberately-set credential with a possibly-stale stored one.
79
+ */
80
+ const PROVIDER_ENV_ALIASES = {
81
+ groq: ['GROQ_API_KEY'],
82
+ gemini: ['GEMINI_API_KEY', 'GOOGLE_API_KEY'],
83
+ };
84
+ /**
85
+ * ALI-1284: fills `process.env` from a previously-saved provider key, so `align ask`
86
+ * keeps working on every invocation after the one where `align setup` collected it -
87
+ * without local-llm.ts (which resolves providers from plain env vars, and stays a
88
+ * dependency-free pure module on purpose) ever knowing a config store exists.
89
+ *
90
+ * A real env var always wins and is never overwritten: this is a convenience default,
91
+ * not a second source of truth, the same precedence `getEnvironment` already gives
92
+ * ALIGN_TOKEN/ALIGN_TENANT_ID/ALIGN_GATEWAY_URL above. Checks every alias `keyForProvider`
93
+ * itself accepts (not just the primary name), or hydrating the primary name from storage
94
+ * would outrank a real credential the user set under an alias - see PROVIDER_ENV_ALIASES.
95
+ * Called from the `preAction` Commander hook in cli.ts, before a command's own action runs
96
+ * - never from module scope in index.ts, or a Conf store would be constructed (and its
97
+ * defaults written to disk) for `align --version`, which startup-migration.test.ts pins as
98
+ * untouched on a fresh machine. Never from inside createConfigStore() itself either, for the
99
+ * same reason migrateConfigDirectory is split out (Copilot review, PR #231): a pure
100
+ * constructor stays mockable without needing to stub `process.env` in every test that
101
+ * merely constructs a store.
102
+ */
103
+ export function hydrateProviderKeyEnv(config, env = process.env) {
104
+ for (const [provider, varName] of Object.entries(PROVIDER_ENV_VAR)) {
105
+ if (PROVIDER_ENV_ALIASES[provider].some((alias) => env[alias]))
106
+ continue;
107
+ const stored = config.getProviderKey(provider);
108
+ if (stored)
109
+ env[varName] = stored;
110
+ }
111
+ }
68
112
  export function createConfigStore() {
69
113
  const store = new Conf({
70
114
  projectName: 'align-cli',
@@ -217,6 +261,26 @@ export function createConfigStore() {
217
261
  setTelemetryConsent(value) {
218
262
  store.set('telemetryConsent', value);
219
263
  },
264
+ // ALI-1284: the key `align setup`'s guided free-tier path collected, persisted the same
265
+ // way a local connector's read-only token already is (saveConnectorFields above) - one
266
+ // paste, reused on every later invocation. hydrateProviderKeyEnv is what reads this back
267
+ // into process.env at startup; local-llm.ts itself stays a pure env-reader.
268
+ getProviderKey(provider) {
269
+ return store.get('providerKeys')?.[provider] ?? null;
270
+ },
271
+ setProviderKey(provider, key) {
272
+ const existing = store.get('providerKeys') ?? {};
273
+ store.set('providerKeys', { ...existing, [provider]: key });
274
+ },
275
+ // ALI-1284 (Copilot review, PR #322): `align setup --reset` needs a real way to stop a
276
+ // previously-stored key from coming back - hydrateProviderKeyEnv re-applies whatever is
277
+ // stored on every invocation, so declining a re-offered key has to clear it, not just
278
+ // skip re-asking for it.
279
+ clearProviderKey(provider) {
280
+ const existing = store.get('providerKeys') ?? {};
281
+ const { [provider]: _removed, ...rest } = existing;
282
+ store.set('providerKeys', rest);
283
+ },
220
284
  // ALI-795: which one-shot funnel stages this install has already emitted. Per-install
221
285
  // like installId (a funnel counts an install once); the emitter consults it so the
222
286
  // guard has exactly one enforcement point rather than one per call site.
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -56,13 +56,15 @@ export declare function normaliseDecisionRelation(raw: unknown): DecisionRelatio
56
56
  /**
57
57
  * Apply the contract to a search payload, leaving everything else exactly as the gateway sent it.
58
58
  *
59
- * Non-array `results`, a non-object row, or a row with neither field are all pass-throughs: this
60
- * runs on every search response including local-embedded ones, where local `searchDecisions`
61
- * builds its row literal from the `decisions` table and never reads `decision_links`, so there is
62
- * nothing here for it to shape. Note the reason is the READ path, not the data: a local graph can
63
- * hold a `conflicts_with` edge perfectly well, because ALI-503's relabel is a one-time
64
- * `user_version < 1` repair rather than a rule on insert. Pinned by
65
- * `__tests__/mcp-relation-fields-local.test.ts`, which puts such an edge on disk first.
59
+ * Non-array `results`, a non-object row, or a row with neither field are all pass-throughs.
60
+ * This runs on every search response including local-embedded ones - as of ALI-1065, local
61
+ * `searchDecisions`/`listDecisions` DO read `decision_links` (via `relationFieldsFor` in
62
+ * local-gateway-client.ts) and can emit a real `successor`/`conflicts_with`, written at
63
+ * capture time by `classifyRelationship` or left as a plain `relates` cosine edge that emits
64
+ * neither field. This function only shapes the two named fields - it never invents one, so a
65
+ * row with no typed edge on disk still passes through with neither key present. Pinned by
66
+ * `__tests__/mcp-relation-fields-local.test.ts`, which puts a real edge on disk first and
67
+ * asserts it surfaces through the real MCP `align_ask` dispatch.
66
68
  */
67
69
  export declare function withDecisionRelationContract<T extends {
68
70
  results?: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"decision-relations.d.ts","sourceRoot":"","sources":["../../src/lib/decision-relations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,8FAA8F;AAC9F,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,0CAA2C,CAAC;AAEjF;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,GAAG,SAAS,CAcpF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,SAAS;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAkB3F"}
1
+ {"version":3,"file":"decision-relations.d.ts","sourceRoot":"","sources":["../../src/lib/decision-relations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,8FAA8F;AAC9F,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,0CAA2C,CAAC;AAEjF;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,GAAG,SAAS,CAcpF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,SAAS;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAkB3F"}
@@ -63,13 +63,15 @@ export function normaliseDecisionRelation(raw) {
63
63
  /**
64
64
  * Apply the contract to a search payload, leaving everything else exactly as the gateway sent it.
65
65
  *
66
- * Non-array `results`, a non-object row, or a row with neither field are all pass-throughs: this
67
- * runs on every search response including local-embedded ones, where local `searchDecisions`
68
- * builds its row literal from the `decisions` table and never reads `decision_links`, so there is
69
- * nothing here for it to shape. Note the reason is the READ path, not the data: a local graph can
70
- * hold a `conflicts_with` edge perfectly well, because ALI-503's relabel is a one-time
71
- * `user_version < 1` repair rather than a rule on insert. Pinned by
72
- * `__tests__/mcp-relation-fields-local.test.ts`, which puts such an edge on disk first.
66
+ * Non-array `results`, a non-object row, or a row with neither field are all pass-throughs.
67
+ * This runs on every search response including local-embedded ones - as of ALI-1065, local
68
+ * `searchDecisions`/`listDecisions` DO read `decision_links` (via `relationFieldsFor` in
69
+ * local-gateway-client.ts) and can emit a real `successor`/`conflicts_with`, written at
70
+ * capture time by `classifyRelationship` or left as a plain `relates` cosine edge that emits
71
+ * neither field. This function only shapes the two named fields - it never invents one, so a
72
+ * row with no typed edge on disk still passes through with neither key present. Pinned by
73
+ * `__tests__/mcp-relation-fields-local.test.ts`, which puts a real edge on disk first and
74
+ * asserts it surfaces through the real MCP `align_ask` dispatch.
73
75
  */
74
76
  export function withDecisionRelationContract(payload) {
75
77
  const rows = payload?.results;
@@ -1 +1 @@
1
- {"version":3,"file":"decision-relations.js","sourceRoot":"","sources":["../../src/lib/decision-relations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAYH;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAU,CAAC;AAEjF;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAY;IACpD,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACpF,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAEjE,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,2FAA2F;QAC3F,6EAA6E;QAC7E,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QACpD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnB,CAAC;IACD,OAAO,GAAuB,CAAC;AACjC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,4BAA4B,CAAkC,OAAU;IACtF,MAAM,IAAI,GAAI,OAAiC,EAAE,OAAO,CAAC;IACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAEzC,OAAO;QACL,GAAG,OAAO;QACV,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACxB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAC;YAC9E,MAAM,GAAG,GAA4B,EAAE,GAAI,GAA+B,EAAE,CAAC;YAC7E,KAAK,MAAM,KAAK,IAAI,wBAAwB,EAAE,CAAC;gBAC7C,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC;oBAAE,SAAS;gBAC9B,MAAM,MAAM,GAAG,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrD,IAAI,MAAM;oBAAE,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;;oBAC3B,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;KACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"decision-relations.js","sourceRoot":"","sources":["../../src/lib/decision-relations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAYH;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAU,CAAC;AAEjF;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAY;IACpD,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACpF,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAEjE,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,2FAA2F;QAC3F,6EAA6E;QAC7E,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QACpD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnB,CAAC;IACD,OAAO,GAAuB,CAAC;AACjC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,4BAA4B,CAAkC,OAAU;IACtF,MAAM,IAAI,GAAI,OAAiC,EAAE,OAAO,CAAC;IACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAEzC,OAAO;QACL,GAAG,OAAO;QACV,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACxB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAC;YAC9E,MAAM,GAAG,GAA4B,EAAE,GAAI,GAA+B,EAAE,CAAC;YAC7E,KAAK,MAAM,KAAK,IAAI,wBAAwB,EAAE,CAAC;gBAC7C,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC;oBAAE,SAAS;gBAC9B,MAAM,MAAM,GAAG,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrD,IAAI,MAAM;oBAAE,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;;oBAC3B,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -430,7 +430,16 @@ declare function buildHttpGatewayClient(env: EnvironmentConfig): {
430
430
  getTopicTimeline(topic: string, limit?: number): Promise<TopicTimelineResult>;
431
431
  /** ALI-1070: ONE decision's change history - GET /decisions/:id/history, authMiddleware only. */
432
432
  getDecisionTimeline(decisionId: string): Promise<unknown>;
433
- getConflicts(): Promise<ConflictsResult>;
433
+ /**
434
+ * ALI-1411: `createdBefore` rides the endpoint's legacy TIMESTAMP cursor, which bounds the
435
+ * data query to `dl.created_at < cursor` server-side - the one as-of bound this route has.
436
+ * Any cursor makes the gateway skip its count query, so every count field comes back null
437
+ * and the total below falls back to the page; the MCP layer (lib/as-of.ts) recounts from
438
+ * the delivered links and never reports a gateway count under a cutoff.
439
+ */
440
+ getConflicts(opts?: {
441
+ createdBefore?: string;
442
+ }): Promise<ConflictsResult>;
434
443
  getStats(): Promise<{
435
444
  snapshots?: number;
436
445
  }>;