@juspay/neurolink 12.17.1 → 12.17.3

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 (73) hide show
  1. package/CHANGELOG.md +6 -2
  2. package/dist/browser/neurolink.min.js +430 -421
  3. package/dist/cli/commands/proxy.js +455 -259
  4. package/dist/constants/contextWindows.d.ts +2 -0
  5. package/dist/constants/contextWindows.js +4 -0
  6. package/dist/neurolink.js +8 -3
  7. package/dist/providers/openaiChatCompletionsBase.js +60 -51
  8. package/dist/proxy/anthropicBudgetResponse.d.ts +3 -0
  9. package/dist/proxy/anthropicBudgetResponse.js +153 -0
  10. package/dist/proxy/bodyCaptureProcessing.d.ts +1 -0
  11. package/dist/proxy/bodyCaptureProcessing.js +23 -4
  12. package/dist/proxy/bodyCaptureWorker.js +20 -2
  13. package/dist/proxy/codexFallback.d.ts +10 -0
  14. package/dist/proxy/codexFallback.js +108 -24
  15. package/dist/proxy/codexUsage.js +2 -0
  16. package/dist/proxy/globalInstaller.d.ts +32 -1
  17. package/dist/proxy/globalInstaller.js +386 -3
  18. package/dist/proxy/otelLogSink.d.ts +3 -3
  19. package/dist/proxy/otelLogSink.js +137 -144
  20. package/dist/proxy/otlpLogTransport.d.ts +3 -0
  21. package/dist/proxy/otlpLogTransport.js +334 -0
  22. package/dist/proxy/proxyActivity.d.ts +22 -2
  23. package/dist/proxy/proxyActivity.js +114 -9
  24. package/dist/proxy/proxyAnalysis.js +82 -52
  25. package/dist/proxy/proxyClientCancellation.d.ts +7 -0
  26. package/dist/proxy/proxyClientCancellation.js +23 -0
  27. package/dist/proxy/proxyContextPreflight.d.ts +25 -0
  28. package/dist/proxy/proxyContextPreflight.js +337 -0
  29. package/dist/proxy/proxyFailureDetails.d.ts +19 -0
  30. package/dist/proxy/proxyFailureDetails.js +96 -0
  31. package/dist/proxy/proxyLifecycle.js +7 -0
  32. package/dist/proxy/proxyRouteBodyCapture.d.ts +13 -0
  33. package/dist/proxy/proxyRouteBodyCapture.js +112 -0
  34. package/dist/proxy/proxyTokenBudget.d.ts +40 -0
  35. package/dist/proxy/proxyTokenBudget.js +523 -0
  36. package/dist/proxy/proxyTracer.d.ts +3 -2
  37. package/dist/proxy/proxyTracer.js +46 -20
  38. package/dist/proxy/proxyTranslationEngine.d.ts +8 -10
  39. package/dist/proxy/proxyTranslationEngine.js +736 -376
  40. package/dist/proxy/requestLogger.d.ts +1 -0
  41. package/dist/proxy/requestLogger.js +107 -5
  42. package/dist/proxy/restartControl.js +9 -4
  43. package/dist/proxy/rollingWorkerProcess.js +65 -0
  44. package/dist/proxy/rollingWorkerSupervisor.js +7 -0
  45. package/dist/proxy/updateCoordinator.d.ts +14 -1
  46. package/dist/proxy/updateCoordinator.js +57 -2
  47. package/dist/server/routes/claudeProxyRoutes.d.ts +4 -5
  48. package/dist/server/routes/claudeProxyRoutes.js +809 -577
  49. package/dist/server/routes/codexProxyRoutes.js +191 -9
  50. package/dist/server/routes/openaiProxyRoutes.d.ts +1 -1
  51. package/dist/server/routes/openaiProxyRoutes.js +261 -69
  52. package/dist/types/cli.d.ts +3 -0
  53. package/dist/types/codex.d.ts +5 -1
  54. package/dist/types/index.d.ts +2 -0
  55. package/dist/types/index.js +2 -0
  56. package/dist/types/proxy.d.ts +148 -3
  57. package/dist/types/proxy.js +0 -15
  58. package/dist/types/proxyBudget.d.ts +74 -0
  59. package/dist/types/proxyBudget.js +1 -0
  60. package/dist/types/proxyContext.d.ts +35 -0
  61. package/dist/types/proxyContext.js +1 -0
  62. package/dist/utils/fileDetector.js +28 -7
  63. package/dist/utils/messageBuilder.js +51 -26
  64. package/dist/utils/pdfProcessor.js +26 -4
  65. package/docs/assets/dashboards/README.md +37 -0
  66. package/docs/assets/dashboards/neurolink-proxy-observability-dashboard.json +197 -89
  67. package/docs-site/static/search-index.json +1 -1
  68. package/package.json +7 -2
  69. package/scripts/observability/NATIVE-DURABLE.md +63 -0
  70. package/scripts/observability/otel-collector.proxy-native-durable.yaml +93 -0
  71. package/scripts/observability/proxy-telemetry-backend.mjs +32 -5
  72. package/scripts/observability/proxy-telemetry-check.mjs +396 -61
  73. package/scripts/observability/query-proxy-history.mjs +34 -5
@@ -19,7 +19,7 @@ const KINDS = new Set([
19
19
 
20
20
  /**
21
21
  * Query metadata in small windows; body chunks require a targeted lookup.
22
- * @param {{ baseUrl: string, organization?: string, stream?: string, authorization?: string, startTime: number, endTime: number, kind?: string, maxRows?: number, budget?: import("../../src/lib/types/index.js").ProxyTelemetryQueryBudget, fetchImpl?: typeof fetch }} options
22
+ * @param {{ baseUrl: string, organization?: string, stream?: string, authorization?: string, startTime: number, endTime: number, kind?: string, lifecycleEvents?: string[], maxRows?: number, budget?: import("../../src/lib/types/index.js").ProxyTelemetryQueryBudget, fetchImpl?: typeof fetch }} options
23
23
  */
24
24
  export async function queryProxyHistory({
25
25
  baseUrl,
@@ -29,6 +29,7 @@ export async function queryProxyHistory({
29
29
  startTime,
30
30
  endTime,
31
31
  kind = "request_final",
32
+ lifecycleEvents,
32
33
  maxRows = 10_000,
33
34
  fetchImpl = fetch,
34
35
  budget = { used: 0, limit: 512 },
@@ -36,7 +37,12 @@ export async function queryProxyHistory({
36
37
  if (
37
38
  !/^[a-zA-Z0-9_-]+$/.test(organization) ||
38
39
  !/^[a-zA-Z0-9_]+$/.test(stream) ||
39
- !KINDS.has(kind)
40
+ !KINDS.has(kind) ||
41
+ (lifecycleEvents !== undefined &&
42
+ (kind !== "lifecycle" ||
43
+ lifecycleEvents.some(
44
+ (event) => !["request_accepted", "request_terminal"].includes(event),
45
+ )))
40
46
  ) {
41
47
  throw new Error("Invalid organization, stream or metadata record kind");
42
48
  }
@@ -96,7 +102,7 @@ export async function queryProxyHistory({
96
102
  query: {
97
103
  // The body is small metadata, not arbitrary request/response chunks.
98
104
  // Include a secondary key: timestamp-only paging loses equal-time events.
99
- sql: `SELECT _timestamp, proxy_event_id, service_instance_id, request_id, body FROM "${stream}" WHERE proxy_record_kind='${kind}' ORDER BY _timestamp ASC, proxy_event_id ASC, service_instance_id ASC, request_id ASC, body ASC`,
105
+ sql: `SELECT _timestamp, proxy_event_id, service_instance_id, request_id, body FROM "${stream}" WHERE proxy_record_kind='${kind}'${lifecycleEvents?.length ? ` AND proxy_lifecycle_event IN (${lifecycleEvents.map((event) => `'${event}'`).join(",")})` : ""} ORDER BY _timestamp ASC, proxy_event_id ASC, service_instance_id ASC, request_id ASC, body ASC`,
100
106
  start_time: start,
101
107
  end_time: end - 1,
102
108
  from: offset,
@@ -150,19 +156,42 @@ export async function queryProxyHistory({
150
156
  }
151
157
  }
152
158
  const records = [];
159
+ const queriedAt = Date.now() * 1000;
153
160
  for (let start = startTime; start < endTime; start += 600_000_000) {
154
161
  records.push(
155
162
  ...(await readWindow(start, Math.min(start + 600_000_000, endTime))),
156
163
  );
157
164
  }
165
+ const unique = new Map();
166
+ let exactRetryDuplicates = 0;
167
+ const deduplicated = [];
168
+ for (const record of records) {
169
+ const key =
170
+ typeof record.proxy_event_id === "string" && record.proxy_event_id
171
+ ? JSON.stringify([record.service_instance_id, record.proxy_event_id])
172
+ : undefined;
173
+ // Ingestion may move _timestamp; event payload is the producer identity.
174
+ const payload = JSON.stringify([record.request_id, record.body]);
175
+ if (key && unique.get(key) === payload) {
176
+ exactRetryDuplicates++;
177
+ continue;
178
+ }
179
+ if (key && !unique.has(key)) {unique.set(key, payload);}
180
+ deduplicated.push(record); // Keep identity conflicts for the doctor to fail.
181
+ }
158
182
  return {
159
183
  startTime,
160
184
  endTimeExclusive: endTime,
161
185
  kind,
162
186
  complete: true,
163
- recordCount: records.length,
187
+ recordCount: deduplicated.length,
188
+ rawRecordCount: records.length,
189
+ exactRetryDuplicates,
190
+ queriedAtMicroseconds: queriedAt,
191
+ lateIngestionBoundary:
192
+ "Pagination is complete at query time; later ingestion can change this event-time interval",
164
193
  queries,
165
- records,
194
+ records: deduplicated,
166
195
  };
167
196
  }
168
197