@signal4/s4 2.6.0 → 2.7.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 (75) hide show
  1. package/README.md +33 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +317 -175
  4. package/dist/cli.js.map +1 -1
  5. package/dist/cli_args.d.ts +24 -0
  6. package/dist/cli_args.d.ts.map +1 -0
  7. package/dist/cli_args.js +130 -0
  8. package/dist/cli_args.js.map +1 -0
  9. package/dist/client.d.ts +80 -3
  10. package/dist/client.d.ts.map +1 -1
  11. package/dist/client.js +128 -24
  12. package/dist/client.js.map +1 -1
  13. package/dist/format.d.ts +81 -2
  14. package/dist/format.d.ts.map +1 -1
  15. package/dist/format.js +209 -47
  16. package/dist/format.js.map +1 -1
  17. package/dist/handler_types.d.ts +10 -0
  18. package/dist/handler_types.d.ts.map +1 -1
  19. package/dist/handler_types.js +25 -0
  20. package/dist/handler_types.js.map +1 -1
  21. package/dist/handlers/ads.js +4 -4
  22. package/dist/handlers/ads.js.map +1 -1
  23. package/dist/handlers/analyze.d.ts.map +1 -1
  24. package/dist/handlers/analyze.js +22 -6
  25. package/dist/handlers/analyze.js.map +1 -1
  26. package/dist/handlers/bookmarks.js +2 -2
  27. package/dist/handlers/bookmarks.js.map +1 -1
  28. package/dist/handlers/claim_detail.js +2 -2
  29. package/dist/handlers/claim_detail.js.map +1 -1
  30. package/dist/handlers/claims.d.ts.map +1 -1
  31. package/dist/handlers/claims.js +81 -26
  32. package/dist/handlers/claims.js.map +1 -1
  33. package/dist/handlers/count.d.ts +7 -0
  34. package/dist/handlers/count.d.ts.map +1 -0
  35. package/dist/handlers/count.js +146 -0
  36. package/dist/handlers/count.js.map +1 -0
  37. package/dist/handlers/explore.d.ts.map +1 -1
  38. package/dist/handlers/explore.js +53 -14
  39. package/dist/handlers/explore.js.map +1 -1
  40. package/dist/handlers/registry.d.ts.map +1 -1
  41. package/dist/handlers/registry.js +5 -1
  42. package/dist/handlers/registry.js.map +1 -1
  43. package/dist/handlers/reports.d.ts +1 -0
  44. package/dist/handlers/reports.d.ts.map +1 -1
  45. package/dist/handlers/reports.js +47 -11
  46. package/dist/handlers/reports.js.map +1 -1
  47. package/dist/handlers/search.d.ts.map +1 -1
  48. package/dist/handlers/search.js +70 -22
  49. package/dist/handlers/search.js.map +1 -1
  50. package/dist/handlers/timeline.d.ts.map +1 -1
  51. package/dist/handlers/timeline.js +14 -8
  52. package/dist/handlers/timeline.js.map +1 -1
  53. package/dist/http.js +25 -3
  54. package/dist/http.js.map +1 -1
  55. package/dist/index.js +2 -2
  56. package/dist/index.js.map +1 -1
  57. package/dist/provenance.d.ts +29 -2
  58. package/dist/provenance.d.ts.map +1 -1
  59. package/dist/provenance.js +63 -4
  60. package/dist/provenance.js.map +1 -1
  61. package/dist/server_core.d.ts +8 -1
  62. package/dist/server_core.d.ts.map +1 -1
  63. package/dist/server_core.js +90 -8
  64. package/dist/server_core.js.map +1 -1
  65. package/dist/speed.d.ts +40 -0
  66. package/dist/speed.d.ts.map +1 -0
  67. package/dist/speed.js +196 -0
  68. package/dist/speed.js.map +1 -0
  69. package/dist/surface.d.ts +7 -0
  70. package/dist/surface.d.ts.map +1 -0
  71. package/dist/surface.js +18 -0
  72. package/dist/surface.js.map +1 -0
  73. package/dist/types.d.ts +155 -8
  74. package/dist/types.d.ts.map +1 -1
  75. package/package.json +3 -2
@@ -1,8 +1,9 @@
1
1
  /** Search handlers: search_quotes, detect_trend */
2
2
  import * as client from "../client.js";
3
3
  import { formatQuotes, emptyStateSuggestions, fmtDate, trendToken, truncateWithPointer, nextCallHint, } from "../format.js";
4
- import { mcpWindowFooter, speakerEmptyStateNote } from "../provenance.js";
5
- import { wantsJson, jsonResult } from "../handler_types.js";
4
+ import { mcpWindowFooter, scopeFooter, speakerEmptyStateNote } from "../provenance.js";
5
+ import { hint as surfaceHint } from "../surface.js";
6
+ import { wantsJson, jsonResult, collectionOf } from "../handler_types.js";
6
7
  export async function handleSearchQuotes(params) {
7
8
  const topic = params.topic;
8
9
  const speakerName = (params.speaker ?? params.speaker_name);
@@ -16,7 +17,7 @@ export async function handleSearchQuotes(params) {
16
17
  const startDate = params.start_date ?? new Date(Date.now() - days * 86400000).toISOString().slice(0, 10);
17
18
  const endDate = params.end_date ?? new Date().toISOString().slice(0, 10);
18
19
  const minSimilarity = params.min_similarity;
19
- const limit = params.limit ?? 20;
20
+ const limit = params.limit ?? 10;
20
21
  const offset = params.offset ?? 0;
21
22
  const language = params.language;
22
23
  const country = params.country;
@@ -26,16 +27,30 @@ export async function handleSearchQuotes(params) {
26
27
  const sort = params.sort ?? "relevance";
27
28
  const mode = params.mode ?? "semantic";
28
29
  const fullHistory = params.full_history ?? false;
30
+ // No default. Unset means the whole corpus (signal4-core#563).
31
+ const project = collectionOf(params);
32
+ // Explicit dates own the window; forwarding the defaulted `days` alongside
33
+ // them is what printed "(30 days)" under twenty-month searches (#554).
34
+ const explicitRange = explicitStart || params.end_date != null;
29
35
  const footer = mcpWindowFooter({
30
- startDate, endDate, days,
31
- defaultWindow: !explicitStart && params.days == null,
36
+ startDate, endDate,
37
+ days: explicitRange ? undefined : days,
38
+ defaultWindow: !explicitRange && params.days == null,
32
39
  fullHistory,
33
40
  });
41
+ // The two speaker shortcuts below call /speakers/* endpoints that take a speaker,
42
+ // a topic and `days` — nothing else. Routing a call that also carries country,
43
+ // collection, language, lean, a channel or explicit dates through them silently
44
+ // dropped those filters: `speaker_id + topic + country:us` searched every
45
+ // country (signal4#84, #226). Only a bare speaker query may take a shortcut; the
46
+ // standard search below honours every filter, speaker_id included.
47
+ const onlySpeakerFilters = !channelName && !channelId && !language && !country && !project
48
+ && politicalLeanMin == null && politicalLeanMax == null && !explicitStart && params.end_date == null;
34
49
  if (!topic && !speakerName && !speakerId && !channelName && !channelId) {
35
- return { content: [{ type: "text", text: "Error: provide at least one of topic (semantic search query), speaker (filter by speaker), speaker_id (from find_speakers), channel (filter by channel), or channel_id. Combine topic + speaker to find what someone said about a topic." }] };
50
+ return { content: [{ type: "text", text: "Error: provide at least one of topic (semantic search query), speaker (filter by speaker), speaker_id (from find_speakers), channel (filter by channel), or channel_id. Combine topic + speaker to find what someone said about a topic." }], isError: true };
36
51
  }
37
52
  // Chronological speaker timeline
38
- if (sort === "chronological" && (speakerId || speakerName) && !topic) {
53
+ if (sort === "chronological" && (speakerId || speakerName) && !topic && onlySpeakerFilters) {
39
54
  let sid = speakerId;
40
55
  if (!sid && speakerName) {
41
56
  let byName;
@@ -44,13 +59,13 @@ export async function handleSearchQuotes(params) {
44
59
  }
45
60
  catch (err) {
46
61
  if (err instanceof Error && err.message.includes("404")) {
47
- return { content: [{ type: "text", text: `Error: Speaker "${speakerName}" not found. Try find_speakers to search by name fragment.` }] };
62
+ return { content: [{ type: "text", text: `Error: Speaker "${speakerName}" not found. Try find_speakers to search by name fragment.` }], isError: true };
48
63
  }
49
64
  throw err;
50
65
  }
51
66
  sid = byName.speaker_id ?? byName.id;
52
67
  if (!sid)
53
- return { content: [{ type: "text", text: `Error: Speaker "${speakerName}" not found. Try find_speakers to search by name fragment.` }] };
68
+ return { content: [{ type: "text", text: `Error: Speaker "${speakerName}" not found. Try find_speakers to search by name fragment.` }], isError: true };
54
69
  }
55
70
  const data = await client.getSpeakerSegments({
56
71
  identity_id: sid,
@@ -73,12 +88,14 @@ export async function handleSearchQuotes(params) {
73
88
  lines.push(`${i + 1}. date:${fmtDate(seg.publish_date)} ${seg.channel_name ?? "n/a"} — seg:${seg.segment_id ?? "n/a"}`);
74
89
  lines.push(` ${truncateWithPointer(seg.text, pointer)}\n`);
75
90
  }
76
- const paging = data.has_more ? `\nmore available — offset:${offset + segs.length} for more` : "";
91
+ const paging = data.has_more ? surfaceHint(`\nmore available — offset:${offset + segs.length} for more`) : "";
77
92
  const hint = nextCallHint(segs[0]?.segment_id != null ? `get_segment seg:${segs[0].segment_id}` : undefined, `get_speaker speaker_id:${sid}`);
78
93
  return { content: [{ type: "text", text: lines.join("\n") + daysFooter + paging + hint }] };
79
94
  }
80
- // Semantic search within a speaker
81
- if (sort === "relevance" && speakerId && topic) {
95
+ // Semantic search within a speaker. This endpoint only understands `days`,
96
+ // so full_history requests fall through to the standard quote search below,
97
+ // which forwards speaker_identity_id + full_history correctly.
98
+ if (sort === "relevance" && speakerId && topic && !fullHistory && onlySpeakerFilters) {
82
99
  const data = await client.searchSpeakerSegments({
83
100
  identity_id: speakerId,
84
101
  query: topic,
@@ -124,19 +141,30 @@ export async function handleSearchQuotes(params) {
124
141
  mode: mode !== "semantic" ? mode : undefined,
125
142
  full_history: fullHistory || undefined,
126
143
  count_only: countOnly || undefined,
144
+ project,
127
145
  });
128
146
  if (wantsJson(params))
129
147
  return jsonResult(data);
148
+ const scope = scopeFooter(data.scope, project);
130
149
  if (countOnly) {
131
- const total = data.total_results ?? 0;
132
150
  const label = topic ?? speakerName ?? "query";
133
- // A capped count is a floor: the shortlist ran out before the matches did.
134
- const suffix = data.count_capped ? "+ (count_capped — true total unknown; narrow the window for an exact total)" : "";
135
- return { content: [{ type: "text", text: `${total}${suffix} segments matching "${label}"${footer}` }] };
151
+ if (data.total_results == null) {
152
+ return { content: [{ type: "text", text: `Count for "${label}" ran past its time limit — narrow the window, or add a collection, channel or speaker.${footer}${scope}` }] };
153
+ }
154
+ const parts = [`${data.total_results.toLocaleString("en-US")} segments`];
155
+ if (data.count_episodes != null)
156
+ parts.push(`${data.count_episodes.toLocaleString("en-US")} episodes`);
157
+ if (data.count_channels != null)
158
+ parts.push(`${data.count_channels.toLocaleString("en-US")} channels`);
159
+ const how = data.count_exact === false
160
+ ? ` (semantic estimate at similarity ≥${data.min_similarity ?? 0.35})`
161
+ : data.count_exact ? " (exact)" : "";
162
+ const more = nextCallHint(topic ? `count_mentions topic:"${topic}" group_by:month — series, channels or episodes` : undefined);
163
+ return { content: [{ type: "text", text: `${parts.join(" · ")} matching "${label}"${how}${footer}${scope}${more}` }] };
136
164
  }
137
165
  let text;
138
166
  if (data.quotes?.length) {
139
- text = formatQuotes(data, footer, offset);
167
+ text = formatQuotes(data, footer + scope, offset);
140
168
  }
141
169
  else {
142
170
  // A speaker filter that matches nobody looks identical to a speaker who
@@ -147,7 +175,11 @@ export async function handleSearchQuotes(params) {
147
175
  if (n)
148
176
  note = n + "\n\n";
149
177
  }
150
- text = note + emptyStateSuggestions({ topic, speaker_name: speakerName, channel_name: channelName, mode, days, fullHistory }) + footer;
178
+ text = note + emptyStateSuggestions({
179
+ topic, speaker_name: speakerName, channel_name: channelName, mode, fullHistory,
180
+ days: explicitRange ? undefined : days,
181
+ startDate, endDate, explicitRange,
182
+ }) + footer + scope;
151
183
  }
152
184
  return { content: [{ type: "text", text }] };
153
185
  }
@@ -163,6 +195,9 @@ export async function handleDetectTrend(params) {
163
195
  const country = params.country;
164
196
  const politicalLeanMin = params.political_lean_min;
165
197
  const politicalLeanMax = params.political_lean_max;
198
+ const project = collectionOf(params);
199
+ const startDate = params.start_date;
200
+ const endDate = params.end_date;
166
201
  if (recentDays > baselineDays)
167
202
  recentDays = Math.max(1, Math.floor(baselineDays / 2));
168
203
  const data = await client.detectTrend({
@@ -176,16 +211,29 @@ export async function handleDetectTrend(params) {
176
211
  country,
177
212
  political_lean_min: politicalLeanMin,
178
213
  political_lean_max: politicalLeanMax,
214
+ project,
215
+ start_date: startDate,
216
+ end_date: endDate,
179
217
  });
180
218
  if (wantsJson(params))
181
219
  return jsonResult(data);
182
220
  const recent = data.recent ?? {};
183
221
  const baseline = data.baseline ?? {};
184
- const text = [
185
- `**"${topic}"** — ${trendToken(data.direction, data.change_pct)}`,
186
- `recent (${recent.days ?? "n/a"}d): ${recent.segments ?? 0} segments (${(recent.per_day ?? 0).toFixed(1)}/day)`,
222
+ const reach = recent.episodes != null ? ` · ${recent.episodes} episodes · ${recent.channels ?? 0} channels` : "";
223
+ const lines = [
224
+ `**"${topic}"** — ${trendToken(data.direction, typeof data.change_pct === "number" ? data.change_pct : undefined)}`,
225
+ `recent (${recent.days ?? "n/a"}d): ${recent.segments ?? 0} segments (${(recent.per_day ?? 0).toFixed(1)}/day)${reach}`,
187
226
  `baseline (${baseline.days ?? "n/a"}d): ${baseline.segments ?? 0} segments (${(baseline.per_day ?? 0).toFixed(1)}/day)`,
188
- ].join("\n") + nextCallHint(`get_timeline topic:"${topic}"`, `search_quotes topic:"${topic}"`);
227
+ ];
228
+ if (data.total_segments != null) {
229
+ lines.push(`whole window: ${data.total_segments} segments · ${data.episodes ?? 0} episodes · ${data.shows ?? 0} channels (semantic estimate at ≥${data.min_similarity ?? 0.35})`);
230
+ }
231
+ for (const note of data.notes ?? [])
232
+ lines.push(`_Note: ${note}._`);
233
+ const text = lines.join("\n")
234
+ + (data.window ? `\n_Window: ${data.window.start_date} → ${data.window.end_date}; recent = its last ${recent.days ?? recentDays} days._` : "")
235
+ + scopeFooter(data.scope, project)
236
+ + nextCallHint(`get_timeline topic:"${topic}"`, `search_quotes topic:"${topic}"`);
189
237
  return { content: [{ type: "text", text }] };
190
238
  }
191
239
  //# sourceMappingURL=search.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/handlers/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/handlers/search.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../src/handlers/timeline.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAMrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAmChG"}
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../src/handlers/timeline.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAMrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAyChG"}
@@ -1,22 +1,25 @@
1
1
  /** Timeline handler: get_timeline */
2
2
  import * as client from "../client.js";
3
3
  import { formatTimeline } from "../format.js";
4
- import { mcpWindowFooter } from "../provenance.js";
5
- import { wantsJson, jsonResult } from "../handler_types.js";
4
+ import { mcpWindowFooter, scopeFooter } from "../provenance.js";
5
+ import { wantsJson, jsonResult, collectionOf } from "../handler_types.js";
6
6
  export async function handleGetTimeline(params) {
7
7
  const topic = params.topic;
8
8
  if (!topic) {
9
- return { content: [{ type: "text", text: "Error: topic is required." }] };
9
+ return { content: [{ type: "text", text: "Error: topic is required." }], isError: true };
10
10
  }
11
11
  const days = params.days ?? 30;
12
- const startDate = params.start_date ?? new Date(Date.now() - days * 86400000).toISOString().slice(0, 10);
13
12
  const endDate = params.end_date ?? new Date().toISOString().slice(0, 10);
13
+ const endMs = Date.parse(endDate);
14
+ const startDate = params.start_date
15
+ ?? new Date((Number.isNaN(endMs) ? Date.now() : endMs) - days * 86400000).toISOString().slice(0, 10);
14
16
  const speakerName = (params.speaker ?? params.speaker_name);
15
17
  const channelName = (params.channel ?? params.channel_name);
16
18
  const channelNames = channelName?.split(",").map(s => s.trim()).filter(Boolean);
17
19
  const language = params.language;
18
20
  const granularity = params.granularity ?? "day";
19
21
  const minSimilarity = params.min_similarity;
22
+ const project = collectionOf(params);
20
23
  const data = await client.getTimeline({
21
24
  topic,
22
25
  speaker_name: speakerName,
@@ -26,14 +29,17 @@ export async function handleGetTimeline(params) {
26
29
  language,
27
30
  granularity,
28
31
  min_similarity: minSimilarity,
32
+ project,
29
33
  });
30
34
  if (wantsJson(params))
31
35
  return jsonResult(data);
36
+ const explicit = params.start_date != null || params.end_date != null;
32
37
  const footer = mcpWindowFooter({
33
- startDate, endDate,
34
- days: params.start_date == null ? days : undefined,
35
- defaultWindow: params.start_date == null && params.days == null,
38
+ startDate: data.window?.start_date ?? startDate,
39
+ endDate: data.window?.end_date ?? endDate,
40
+ days: explicit ? undefined : days,
41
+ defaultWindow: !explicit && params.days == null,
36
42
  });
37
- return { content: [{ type: "text", text: formatTimeline(data, footer) }] };
43
+ return { content: [{ type: "text", text: formatTimeline(data, footer + scopeFooter(data.scope, project)) }] };
38
44
  }
39
45
  //# sourceMappingURL=timeline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../src/handlers/timeline.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAG5D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAA+B;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAe,CAAC;IACrC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC,EAAE,CAAC;IAC5E,CAAC;IAED,MAAM,IAAI,GAAI,MAAM,CAAC,IAAe,IAAI,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAI,MAAM,CAAC,UAAqB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrH,MAAM,OAAO,GAAI,MAAM,CAAC,QAAmB,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrF,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,YAAY,CAAuB,CAAC;IAClF,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,YAAY,CAAuB,CAAC;IAClF,MAAM,YAAY,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAA8B,CAAC;IACvD,MAAM,WAAW,GAAI,MAAM,CAAC,WAAsB,IAAI,KAAK,CAAC;IAC5D,MAAM,aAAa,GAAG,MAAM,CAAC,cAAoC,CAAC;IAElE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;QACpC,KAAK;QACL,YAAY,EAAE,WAAW;QACzB,aAAa,EAAE,YAAY;QAC3B,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,OAAO;QACjB,QAAQ;QACR,WAAW;QACX,cAAc,EAAE,aAAa;KAC9B,CAAC,CAAC;IAEH,IAAI,SAAS,CAAC,MAAM,CAAC;QAAE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAE/C,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,SAAS,EAAE,OAAO;QAClB,IAAI,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QAClD,aAAa,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI;KAChE,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7E,CAAC"}
1
+ {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../src/handlers/timeline.ts"],"names":[],"mappings":"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"}
package/dist/http.js CHANGED
@@ -17,7 +17,7 @@ import { createServer } from "node:http";
17
17
  import { parseArgs } from "node:util";
18
18
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
19
19
  import { withApiKey } from "./client.js";
20
- import { buildServer, CachedManifest } from "./server_core.js";
20
+ import { buildServer, CachedManifest, loadInstructions } from "./server_core.js";
21
21
  // ---------------------------------------------------------------------------
22
22
  // Per-key manifest cache
23
23
  //
@@ -80,17 +80,19 @@ async function handleMcpRequest(req, res) {
80
80
  sendJson(res, 401, { detail: "Invalid API key format. Signal4 keys start with 'sk_'." });
81
81
  return;
82
82
  }
83
- const server = buildServer(manifestFor(key));
83
+ const provider = manifestFor(key);
84
84
  const transport = new StreamableHTTPServerTransport({
85
85
  sessionIdGenerator: undefined, // stateless mode
86
86
  });
87
+ let server;
87
88
  res.on("close", () => {
88
89
  void transport.close();
89
- void server.close();
90
+ void server?.close();
90
91
  });
91
92
  // Everything the MCP handlers do — manifest fetch, tool handler backend
92
93
  // calls — runs inside this key's context, so client.ts sends THIS key.
93
94
  await withApiKey(key, async () => {
95
+ server = buildServer(provider, await loadInstructions(provider));
94
96
  await server.connect(transport);
95
97
  await transport.handleRequest(req, res);
96
98
  });
@@ -129,4 +131,24 @@ httpServer.listen(port, args.host, () => {
129
131
  console.log(`Signal4 MCP (streamable-http) listening on http://${args.host}:${port}/mcp ` +
130
132
  `(backend: ${process.env.SIGNAL4_API_URL ?? "https://api.signal4.ca"})`);
131
133
  });
134
+ // ---------------------------------------------------------------------------
135
+ // Graceful stop
136
+ // ---------------------------------------------------------------------------
137
+ // Deploys restart one MCP instance at a time behind Caddy (signal4#306). On
138
+ // SIGINT/SIGTERM stop accepting — Caddy sends new requests to the other
139
+ // instance — and let in-flight tool calls finish (a paid analysis can run for
140
+ // minutes) before exiting. Node's default was to die mid-response. PM2's
141
+ // kill_timeout (160s) is the backstop above this 150s cap.
142
+ let stopping = false;
143
+ function shutdown(signal) {
144
+ if (stopping)
145
+ return;
146
+ stopping = true;
147
+ console.log(`Received ${signal}: finishing in-flight requests, then exiting`);
148
+ httpServer.close(() => process.exit(0));
149
+ httpServer.closeIdleConnections();
150
+ setTimeout(() => process.exit(0), 150_000).unref();
151
+ }
152
+ process.on("SIGINT", shutdown);
153
+ process.on("SIGTERM", shutdown);
132
154
  //# sourceMappingURL=http.js.map
package/dist/http.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@
8
8
  */
9
9
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
10
10
  import { applyConfig } from "./config.js";
11
- import { buildServer, CachedManifest } from "./server_core.js";
11
+ import { buildServer, CachedManifest, loadInstructions } from "./server_core.js";
12
12
  applyConfig();
13
13
  // Single global manifest cache keyed by the env key, cached for the session.
14
14
  const manifest = new CachedManifest({
@@ -17,8 +17,8 @@ const manifest = new CachedManifest({
17
17
  : "SIGNAL4_API_KEY environment variable is not set. " +
18
18
  "Get your API key from Signal4 and set it in your MCP server config.",
19
19
  });
20
- const server = buildServer(manifest);
21
20
  async function main() {
21
+ const server = buildServer(manifest, await loadInstructions(manifest));
22
22
  const transport = new StdioServerTransport();
23
23
  await server.connect(transport);
24
24
  // Eagerly fetch manifest so tools/list is populated on first call.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE/D,WAAW,EAAE,CAAC;AAEd,6EAA6E;AAC7E,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC;IAClC,iBAAiB,EAAE,GAAG,EAAE,CACtB,OAAO,CAAC,GAAG,CAAC,eAAe;QACzB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,mDAAmD;YACnD,qEAAqE;CAC5E,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;AAErC,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,mEAAmE;IACnE,qEAAqE;IACrE,kCAAkC;IAClC,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEjF,WAAW,EAAE,CAAC;AAEd,6EAA6E;AAC7E,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC;IAClC,iBAAiB,EAAE,GAAG,EAAE,CACtB,OAAO,CAAC,GAAG,CAAC,eAAe;QACzB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,mDAAmD;YACnD,qEAAqE;CAC5E,CAAC,CAAC;AAEH,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,mEAAmE;IACnE,qEAAqE;IACrE,kCAAkC;IAClC,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -7,6 +7,7 @@
7
7
  * thin results inside a default window are indistinguishable from a thin
8
8
  * corpus otherwise.
9
9
  */
10
+ import type { DateWindowEcho, SearchScope } from "./types.js";
10
11
  /** The concrete calendar window a days-based endpoint actually covered. */
11
12
  export declare function windowFromDays(days: number): {
12
13
  startDate: string;
@@ -14,8 +15,7 @@ export declare function windowFromDays(days: number): {
14
15
  };
15
16
  /**
16
17
  * One-line footer stating the date range a tool actually searched, in MCP
17
- * parameter vocabulary (`days` / `start_date`), matching the style of
18
- * format.ts's windowFooter.
18
+ * parameter vocabulary (`days` / `start_date`).
19
19
  */
20
20
  export declare function mcpWindowFooter(opts: {
21
21
  startDate?: string;
@@ -29,6 +29,16 @@ export declare function mcpWindowFooter(opts: {
29
29
  /** True for endpoints that only take `days` (no start_date parameter). */
30
30
  daysOnly?: boolean;
31
31
  }): string;
32
+ /**
33
+ * Footer for a tool that takes `days` OR `start_date`/`end_date` (signal4#226).
34
+ * Explicit dates win and are stated as the backend echoed them (`echo`, inclusive
35
+ * end) when it did; otherwise the rolling `days` window is stated.
36
+ */
37
+ export declare function dateWindowFooter(params: Record<string, unknown>, opts: {
38
+ days: number;
39
+ echo?: DateWindowEcho;
40
+ maxDays?: number;
41
+ }): string;
32
42
  /** For endpoints with no time filter at all (e.g. entity_claims). */
33
43
  export declare function allTimeFooter(): string;
34
44
  /**
@@ -38,4 +48,21 @@ export declare function allTimeFooter(): string;
38
48
  * (i.e. the emptiness is about the topic/window, not the name).
39
49
  */
40
50
  export declare function speakerEmptyStateNote(name: string): Promise<string | undefined>;
51
+ /**
52
+ * One-line footer stating the CORPUS SCOPE a tool actually searched.
53
+ *
54
+ * Sibling of `mcpWindowFooter`: that one bounds the search in time, this one
55
+ * bounds it in corpus. Both exist for the same reason — a thin result set is
56
+ * indistinguishable from a thin corpus unless the response says what it looked
57
+ * at. Until signal4-core#563 the MCP client sent `project="Big_Channels"` on
58
+ * nearly every search and said nothing about it, so a caller asking "who in
59
+ * American media discussed X" searched a curated subset of American media and
60
+ * had no way to find that out. Roughly three quarters of a recall gap an
61
+ * external client reported as a keyword-mode bug was this default.
62
+ *
63
+ * Prefer the API's own `scope` — it knows about dashboard aliases and API-key
64
+ * restrictions, which the client cannot see. `sentProject` is the fallback for
65
+ * a backend that predates the `scope` field.
66
+ */
67
+ export declare function scopeFooter(scope?: SearchScope, sentProject?: string): string;
41
68
  //# sourceMappingURL=provenance.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../src/provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAKnF;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,MAAM,CAUT;AAED,qEAAqE;AACrE,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgBrF"}
1
+ {"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../src/provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAKnF;AAgBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,MAAM,CAgBT;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,cAAc,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,MAAM,CASR;AAED,qEAAqE;AACrE,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgBrF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAI7E"}
@@ -15,10 +15,25 @@ export function windowFromDays(days) {
15
15
  endDate: new Date().toISOString().slice(0, 10),
16
16
  };
17
17
  }
18
+ /**
19
+ * True when `days` genuinely describes the [startDate, endDate] span, so the
20
+ * footer may say "(N days)". One day of slack absorbs the caller's own
21
+ * `Date.now() - days * 86400000` rounding and any UTC-vs-local date boundary.
22
+ */
23
+ function spanMatchesDays(startDate, endDate, days) {
24
+ if (days == null)
25
+ return false;
26
+ if (!startDate)
27
+ return true; // days is all we have; the span IS the days
28
+ const start = Date.parse(startDate);
29
+ const end = endDate ? Date.parse(endDate) : Date.now();
30
+ if (Number.isNaN(start) || Number.isNaN(end))
31
+ return false;
32
+ return Math.abs(Math.round((end - start) / 86400000) - days) <= 1;
33
+ }
18
34
  /**
19
35
  * One-line footer stating the date range a tool actually searched, in MCP
20
- * parameter vocabulary (`days` / `start_date`), matching the style of
21
- * format.ts's windowFooter.
36
+ * parameter vocabulary (`days` / `start_date`).
22
37
  */
23
38
  export function mcpWindowFooter(opts) {
24
39
  if (opts.fullHistory)
@@ -26,13 +41,34 @@ export function mcpWindowFooter(opts) {
26
41
  let { startDate, endDate } = opts;
27
42
  if (!startDate && opts.days != null)
28
43
  ({ startDate, endDate } = windowFromDays(opts.days));
29
- const daysStr = opts.days != null ? ` (${opts.days} days)` : "";
44
+ // "(N days)" is a claim about the window we searched, so only make it when N
45
+ // really is that window. Callers default `days` to 30 and then override the
46
+ // window with an explicit start_date; printing the default anyway put
47
+ // "(30 days)" under results spanning twenty months, which reads as "your
48
+ // dates were ignored" and cost a client re-runs of correct searches (#554).
49
+ // Checked here rather than in each caller so no future caller can lie either.
50
+ const daysStr = spanMatchesDays(startDate, endDate, opts.days) ? ` (${opts.days} days)` : "";
30
51
  const span = startDate ? `${startDate} → ${endDate ?? "today"}${daysStr}` : `last ${opts.days ?? 30} days`;
31
- const hint = opts.defaultWindow ? ` (default ${opts.days ?? 30}d window)` : "";
52
+ const hint = opts.defaultWindow && daysStr ? ` (default ${opts.days ?? 30}d window)` : "";
32
53
  const max = opts.maxDays ?? 365;
33
54
  const widen = opts.daysOnly ? `widen with days (≤${max})` : `widen with days (≤${max}) or start_date YYYY-MM-DD`;
34
55
  return `\n_Searched ${span}${hint} — older content may exist; ${widen}._`;
35
56
  }
57
+ /**
58
+ * Footer for a tool that takes `days` OR `start_date`/`end_date` (signal4#226).
59
+ * Explicit dates win and are stated as the backend echoed them (`echo`, inclusive
60
+ * end) when it did; otherwise the rolling `days` window is stated.
61
+ */
62
+ export function dateWindowFooter(params, opts) {
63
+ if (params.start_date != null || params.end_date != null) {
64
+ return mcpWindowFooter({
65
+ startDate: opts.echo?.start_date ?? params.start_date,
66
+ endDate: opts.echo?.end_date ?? params.end_date,
67
+ maxDays: opts.maxDays,
68
+ });
69
+ }
70
+ return mcpWindowFooter({ days: opts.days, defaultWindow: params.days == null, maxDays: opts.maxDays });
71
+ }
36
72
  /** For endpoints with no time filter at all (e.g. entity_claims). */
37
73
  export function allTimeFooter() {
38
74
  return "\n_Searched the full claim history — this tool has no time window._";
@@ -62,4 +98,27 @@ export async function speakerEmptyStateNote(name) {
62
98
  return undefined;
63
99
  return `No speaker matching "${name}" found in the corpus. Closest names: ${names.join(", ")}. Did you mean one of these? (Pass the canonical spelling as speaker.)`;
64
100
  }
101
+ /**
102
+ * One-line footer stating the CORPUS SCOPE a tool actually searched.
103
+ *
104
+ * Sibling of `mcpWindowFooter`: that one bounds the search in time, this one
105
+ * bounds it in corpus. Both exist for the same reason — a thin result set is
106
+ * indistinguishable from a thin corpus unless the response says what it looked
107
+ * at. Until signal4-core#563 the MCP client sent `project="Big_Channels"` on
108
+ * nearly every search and said nothing about it, so a caller asking "who in
109
+ * American media discussed X" searched a curated subset of American media and
110
+ * had no way to find that out. Roughly three quarters of a recall gap an
111
+ * external client reported as a keyword-mode bug was this default.
112
+ *
113
+ * Prefer the API's own `scope` — it knows about dashboard aliases and API-key
114
+ * restrictions, which the client cannot see. `sentProject` is the fallback for
115
+ * a backend that predates the `scope` field.
116
+ */
117
+ export function scopeFooter(scope, sentProject) {
118
+ if (scope?.description)
119
+ return `\n_Scope: ${scope.description}._`;
120
+ if (sentProject)
121
+ return `\n_Scope: collection ${sentProject} — the rest of the corpus was not searched._`;
122
+ return "\n_Scope: full corpus (no collection filter)._";
123
+ }
65
124
  //# sourceMappingURL=provenance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provenance.js","sourceRoot":"","sources":["../src/provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,2EAA2E;AAC3E,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO;QACL,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC5E,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAW/B;IACC,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,uCAAuC,CAAC;IACrE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAClC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI;QAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,MAAM,OAAO,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,IAAI,EAAE,OAAO,CAAC;IAC3G,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,IAAI,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,qBAAqB,GAAG,GAAG,CAAC,CAAC,CAAC,qBAAqB,GAAG,4BAA4B,CAAC;IACjH,OAAO,eAAe,IAAI,GAAG,IAAI,+BAA+B,KAAK,IAAI,CAAC;AAC5E,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,aAAa;IAC3B,OAAO,qEAAqE,CAAC;AAC/E,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAY;IACtD,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC,CAAC,sDAAsD;IAC1E,CAAC;IACD,MAAM,KAAK,GAAG,OAAO;SAClB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC;SACpC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,wBAAwB,IAAI,2EAA2E,CAAC;IACjH,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/E,IAAI,KAAK;QAAE,OAAO,SAAS,CAAC;IAC5B,OAAO,wBAAwB,IAAI,yCAAyC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wEAAwE,CAAC;AACvK,CAAC"}
1
+ {"version":3,"file":"provenance.js","sourceRoot":"","sources":["../src/provenance.ts"],"names":[],"mappings":"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"}
@@ -36,5 +36,12 @@ export declare class CachedManifest implements ManifestProvider {
36
36
  authError(): string | null;
37
37
  fetch(): Promise<ManifestResponse>;
38
38
  }
39
- export declare function buildServer(provider: ManifestProvider): McpServer;
39
+ /** Appended to the server instructions, so an agent knows how to read the speed tags. */
40
+ export declare const SPEED_NOTE: string;
41
+ export declare const FALLBACK_INSTRUCTIONS: string;
42
+ /** Fetch the manifest's instructions, giving up after `ms` so startup never hangs. */
43
+ export declare function loadInstructions(provider: ManifestProvider, ms?: number): Promise<string | undefined>;
44
+ /** Turn a FastAPI 422 body into "parameter <loc>: <msg>". */
45
+ export declare function translate422(raw: string): string;
46
+ export declare function buildServer(provider: ManifestProvider, instructions?: string): McpServer;
40
47
  //# sourceMappingURL=server_core.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server_core.d.ts","sourceRoot":"","sources":["../src/server_core.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,eAAO,MAAM,iBAAiB,QAAS,CAAC;AAExC,MAAM,WAAW,gBAAgB;IAC/B,gEAAgE;IAChE,KAAK,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACnC,sDAAsD;IACtD,SAAS,IAAI,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;GAIG;AACH,qBAAa,cAAe,YAAW,gBAAgB;IAOnD,OAAO,CAAC,QAAQ,CAAC,IAAI;IANvB,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,YAAY,CAAK;gBAGN,IAAI,GAAE;QACrB,8DAA8D;QAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,wEAAwE;QACxE,iBAAiB,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;KACpC;IAGR,SAAS,IAAI,MAAM,GAAG,IAAI;IAIpB,KAAK,IAAI,OAAO,CAAC,gBAAgB,CAAC;CA6BzC;AAkDD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,SAAS,CA6EjE"}
1
+ {"version":3,"file":"server_core.d.ts","sourceRoot":"","sources":["../src/server_core.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,eAAO,MAAM,iBAAiB,QAAS,CAAC;AAExC,MAAM,WAAW,gBAAgB;IAC/B,gEAAgE;IAChE,KAAK,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACnC,sDAAsD;IACtD,SAAS,IAAI,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;GAIG;AACH,qBAAa,cAAe,YAAW,gBAAgB;IAOnD,OAAO,CAAC,QAAQ,CAAC,IAAI;IANvB,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,YAAY,CAAK;gBAGN,IAAI,GAAE;QACrB,8DAA8D;QAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,wEAAwE;QACxE,iBAAiB,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;KACpC;IAGR,SAAS,IAAI,MAAM,GAAG,IAAI;IAIpB,KAAK,IAAI,OAAO,CAAC,gBAAgB,CAAC;CA6BzC;AA6CD,yFAAyF;AACzF,eAAO,MAAM,UAAU,QAK4C,CAAC;AAEpE,eAAO,MAAM,qBAAqB,QAI+E,CAAC;AAElH,sFAAsF;AACtF,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,EAAE,SAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAazG;AAID,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAkBhD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,gBAAgB,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAuGxF"}