@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.
- package/README.md +5 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +20 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/mcp.d.ts +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +57 -23
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +200 -4
- package/dist/commands/setup.js.map +1 -1
- package/dist/lib/access-capability.d.ts +33 -0
- package/dist/lib/access-capability.d.ts.map +1 -0
- package/dist/lib/access-capability.js +41 -0
- package/dist/lib/access-capability.js.map +1 -0
- package/dist/lib/as-of.d.ts +80 -0
- package/dist/lib/as-of.d.ts.map +1 -0
- package/dist/lib/as-of.js +305 -0
- package/dist/lib/as-of.js.map +1 -0
- package/dist/lib/config.d.ts +32 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +64 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/decision-relations.d.ts +9 -7
- package/dist/lib/decision-relations.d.ts.map +1 -1
- package/dist/lib/decision-relations.js +9 -7
- package/dist/lib/decision-relations.js.map +1 -1
- package/dist/lib/gateway-client.d.ts +10 -1
- package/dist/lib/gateway-client.d.ts.map +1 -1
- package/dist/lib/gateway-client.js +9 -2
- package/dist/lib/gateway-client.js.map +1 -1
- package/dist/lib/local-db.d.ts +43 -0
- package/dist/lib/local-db.d.ts.map +1 -1
- package/dist/lib/local-db.js +46 -2
- package/dist/lib/local-db.js.map +1 -1
- package/dist/lib/local-gateway-client.d.ts +40 -4
- package/dist/lib/local-gateway-client.d.ts.map +1 -1
- package/dist/lib/local-gateway-client.js +151 -19
- package/dist/lib/local-gateway-client.js.map +1 -1
- package/dist/lib/local-llm.d.ts +9 -2
- package/dist/lib/local-llm.d.ts.map +1 -1
- package/dist/lib/local-llm.js +33 -5
- package/dist/lib/local-llm.js.map +1 -1
- package/dist/lib/value-rollup.d.ts.map +1 -1
- package/dist/lib/value-rollup.js +3 -1
- package/dist/lib/value-rollup.js.map +1 -1
- 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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"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -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
|
};
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/lib/config.js
CHANGED
|
@@ -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.
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAa7B;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,MAE9B;IACC,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC;IAC1E,mFAAmF;IACnF,sFAAsF;IACtF,mFAAmF;IACnF,gEAAgE;IAChE,MAAM,QAAQ,GAAc,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACnF,OAAO,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC;AAChC,CAAC;AAED,MAAM,QAAQ,GAAuC;IACnD,KAAK,EAAI,EAAE,UAAU,EAAE,uBAAuB,EAAW,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;IACxG,OAAO,EAAE,EAAE,UAAU,EAAE,gCAAgC,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;IACxG,IAAI,EAAK,EAAE,UAAU,EAAE,wBAAwB,EAAW,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;CAC1G,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;AAUnE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,MAAc;IACnE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACjD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO;IAC9D,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,KAAK,GAAG,IAAI,IAAI,
|
|
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
|
|
60
|
-
* runs on every search response including local-embedded ones,
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
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
|
|
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
|
|
67
|
-
* runs on every search response including local-embedded ones,
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
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
|
|
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
|
-
|
|
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
|
}>;
|