@maximem/synap-js-sdk 0.5.1 → 0.5.4

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.
@@ -4,7 +4,7 @@ import {
4
4
  GrpcStreamClient,
5
5
  creditErrorFromRpc,
6
6
  isCreditStop
7
- } from "./chunk-ASM2OIIG.js";
7
+ } from "./chunk-DJPYUPSV.js";
8
8
  import "./chunk-BWMPKLFG.js";
9
9
  export {
10
10
  CREDIT_ABORT_DETAILS,
@@ -13,4 +13,4 @@ export {
13
13
  creditErrorFromRpc,
14
14
  isCreditStop
15
15
  };
16
- //# sourceMappingURL=stream-client-6OWRYOA4.js.map
16
+ //# sourceMappingURL=stream-client-5CGJNTH4.js.map
@@ -0,0 +1,16 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+
5
+
6
+
7
+ var _chunkWWTGJZA7cjs = require('./chunk-WWTGJZA7.cjs');
8
+ require('./chunk-T372OL3Q.cjs');
9
+
10
+
11
+
12
+
13
+
14
+
15
+ exports.CREDIT_ABORT_DETAILS = _chunkWWTGJZA7cjs.CREDIT_ABORT_DETAILS; exports.CREDIT_STOP_REASONS = _chunkWWTGJZA7cjs.CREDIT_STOP_REASONS; exports.GrpcStreamClient = _chunkWWTGJZA7cjs.GrpcStreamClient; exports.creditErrorFromRpc = _chunkWWTGJZA7cjs.creditErrorFromRpc; exports.isCreditStop = _chunkWWTGJZA7cjs.isCreditStop;
16
+ //# sourceMappingURL=stream-client-GJM4YSXW.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/scaler/maximem_synap/synap/sdk/js/dist/stream-client-Y5JGSF2R.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,oUAAC","file":"/Users/scaler/maximem_synap/synap/sdk/js/dist/stream-client-Y5JGSF2R.cjs"}
1
+ {"version":3,"sources":["/Users/scaler/maximem_synap/synap/sdk/js/dist/stream-client-GJM4YSXW.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,oUAAC","file":"/Users/scaler/maximem_synap/synap/sdk/js/dist/stream-client-GJM4YSXW.cjs"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maximem/synap-js-sdk",
3
- "version": "0.5.1",
3
+ "version": "0.5.4",
4
4
  "description": "Native TypeScript SDK for Synap context and memory management",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/grpc/descriptor.ts","../src/grpc/stream-client.ts"],"sourcesContent":["/**\n * GENERATED FILE. Do not edit by hand.\n *\n * Source: synap/proto/synap_service.proto\n * Generator: synap/sdk/scripts/gen_proto_descriptor.mjs\n * Proto SHA: c1d834043608ad4f\n *\n * The proto is inlined as a JSON descriptor rather than loaded from disk so\n * that bundlers and Vercel file tracing cannot lose it. Regenerate with\n * `npm run sync-behavior` in synap/sdk/js.\n */\n\n/** sha256 (first 16 hex chars) of the proto this descriptor was built from. */\nexport const PROTO_SHA = 'c1d834043608ad4f';\n\nexport const SYNAP_PROTO_DESCRIPTOR = {\n \"nested\": {\n \"synap\": {\n \"nested\": {\n \"v1\": {\n \"nested\": {\n \"SynapService\": {\n \"methods\": {\n \"Listen\": {\n \"requestType\": \"StreamEvent\",\n \"requestStream\": true,\n \"responseType\": \"StreamResponse\",\n \"responseStream\": true\n },\n \"IngestTelemetry\": {\n \"requestType\": \"TelemetryEvent\",\n \"requestStream\": true,\n \"responseType\": \"TelemetryAck\"\n }\n }\n },\n \"StreamEvent\": {\n \"oneofs\": {\n \"payload\": {\n \"oneof\": [\n \"conversation_event\",\n \"heartbeat_ping\",\n \"session_control\",\n \"context_used\",\n \"context_assembled\"\n ]\n }\n },\n \"fields\": {\n \"conversation_event\": {\n \"type\": \"ConversationEvent\",\n \"id\": 1\n },\n \"heartbeat_ping\": {\n \"type\": \"HeartbeatPing\",\n \"id\": 2\n },\n \"session_control\": {\n \"type\": \"SessionControl\",\n \"id\": 3\n },\n \"context_used\": {\n \"type\": \"ContextUsedEvent\",\n \"id\": 4\n },\n \"context_assembled\": {\n \"type\": \"ContextAssembledEvent\",\n \"id\": 5\n }\n }\n },\n \"ContextUsedEvent\": {\n \"fields\": {\n \"bundle_id\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"conversation_id\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"user_id\": {\n \"type\": \"string\",\n \"id\": 3\n },\n \"customer_id\": {\n \"type\": \"string\",\n \"id\": 4\n },\n \"served_item_ids\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 5\n },\n \"timestamp_ms\": {\n \"type\": \"int64\",\n \"id\": 6\n },\n \"scope\": {\n \"type\": \"string\",\n \"id\": 7\n },\n \"source_bundle_ids\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 8\n }\n }\n },\n \"ContextAssembledEvent\": {\n \"fields\": {\n \"correlation_id\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"conversation_id\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"user_id\": {\n \"type\": \"string\",\n \"id\": 3\n },\n \"customer_id\": {\n \"type\": \"string\",\n \"id\": 4\n },\n \"final_item_ids\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 5\n },\n \"final_total_tokens\": {\n \"type\": \"int32\",\n \"id\": 6\n },\n \"compaction_id\": {\n \"type\": \"string\",\n \"id\": 7\n },\n \"recent_turn_count\": {\n \"type\": \"int32\",\n \"id\": 8\n },\n \"compaction_end_timestamp\": {\n \"type\": \"string\",\n \"id\": 9\n },\n \"assembly_source\": {\n \"type\": \"string\",\n \"id\": 10\n },\n \"assembly_duration_ms\": {\n \"type\": \"int32\",\n \"id\": 11\n },\n \"cache_hit\": {\n \"type\": \"bool\",\n \"id\": 12\n },\n \"timestamp_ms\": {\n \"type\": \"int64\",\n \"id\": 13\n },\n \"sdk_version\": {\n \"type\": \"string\",\n \"id\": 14\n }\n }\n },\n \"ConversationEvent\": {\n \"fields\": {\n \"event_type\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"conversation_id\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"user_id\": {\n \"type\": \"string\",\n \"id\": 3\n },\n \"role\": {\n \"type\": \"string\",\n \"id\": 4\n },\n \"content\": {\n \"type\": \"string\",\n \"id\": 5\n },\n \"customer_id\": {\n \"type\": \"string\",\n \"id\": 6\n },\n \"session_id\": {\n \"type\": \"string\",\n \"id\": 7\n },\n \"metadata\": {\n \"keyType\": \"string\",\n \"type\": \"string\",\n \"id\": 8\n },\n \"timestamp_ms\": {\n \"type\": \"int64\",\n \"id\": 9\n },\n \"tool_name\": {\n \"type\": \"string\",\n \"id\": 10\n },\n \"tool_args_json\": {\n \"type\": \"string\",\n \"id\": 11\n },\n \"tool_result_json\": {\n \"type\": \"string\",\n \"id\": 15\n },\n \"tool_call_id\": {\n \"type\": \"string\",\n \"id\": 16\n },\n \"search_queries\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 12\n },\n \"context_types\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 13\n },\n \"scope\": {\n \"keyType\": \"string\",\n \"type\": \"string\",\n \"id\": 14\n },\n \"event_id\": {\n \"type\": \"string\",\n \"id\": 17\n },\n \"sent_at_ms\": {\n \"type\": \"int64\",\n \"id\": 18\n }\n }\n },\n \"HeartbeatPing\": {\n \"fields\": {\n \"timestamp_ms\": {\n \"type\": \"int64\",\n \"id\": 1\n }\n }\n },\n \"SessionControl\": {\n \"fields\": {\n \"action\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"session_id\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"conversation_id\": {\n \"type\": \"string\",\n \"id\": 3\n },\n \"user_id\": {\n \"type\": \"string\",\n \"id\": 4\n },\n \"customer_id\": {\n \"type\": \"string\",\n \"id\": 5\n }\n }\n },\n \"StreamResponse\": {\n \"oneofs\": {\n \"payload\": {\n \"oneof\": [\n \"context_bundle\",\n \"heartbeat_pong\",\n \"signal\",\n \"event_ack\"\n ]\n }\n },\n \"fields\": {\n \"context_bundle\": {\n \"type\": \"ContextBundleProto\",\n \"id\": 1\n },\n \"heartbeat_pong\": {\n \"type\": \"HeartbeatPong\",\n \"id\": 2\n },\n \"signal\": {\n \"type\": \"StreamSignal\",\n \"id\": 3\n },\n \"event_ack\": {\n \"type\": \"EventAck\",\n \"id\": 4\n }\n }\n },\n \"EventAck\": {\n \"fields\": {\n \"event_ids\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 1\n },\n \"timestamp_ms\": {\n \"type\": \"int64\",\n \"id\": 2\n }\n }\n },\n \"HeartbeatPong\": {\n \"fields\": {\n \"timestamp_ms\": {\n \"type\": \"int64\",\n \"id\": 1\n }\n }\n },\n \"StreamSignal\": {\n \"fields\": {\n \"signal_type\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"reason\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"metadata\": {\n \"keyType\": \"string\",\n \"type\": \"string\",\n \"id\": 3\n }\n }\n },\n \"ContextBundleProto\": {\n \"fields\": {\n \"bundle_id\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"decision_id\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"items_by_type\": {\n \"keyType\": \"string\",\n \"type\": \"ContextItemList\",\n \"id\": 3\n },\n \"total_tokens\": {\n \"type\": \"int32\",\n \"id\": 4\n },\n \"token_budget\": {\n \"type\": \"int32\",\n \"id\": 5\n },\n \"budget_exceeded\": {\n \"type\": \"bool\",\n \"id\": 6\n },\n \"retrieval_mode\": {\n \"type\": \"string\",\n \"id\": 7\n },\n \"sources_queried\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 8\n },\n \"degradation_level\": {\n \"type\": \"string\",\n \"id\": 9\n },\n \"warnings\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 10\n },\n \"created_at\": {\n \"type\": \"string\",\n \"id\": 11\n },\n \"retrieval_time_ms\": {\n \"type\": \"int32\",\n \"id\": 12\n },\n \"cache_hit\": {\n \"type\": \"bool\",\n \"id\": 13\n },\n \"search_queries\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 14\n },\n \"anticipation_user_id\": {\n \"type\": \"string\",\n \"id\": 15\n },\n \"anticipation_customer_id\": {\n \"type\": \"string\",\n \"id\": 16\n },\n \"anticipation_conversation_id\": {\n \"type\": \"string\",\n \"id\": 17\n },\n \"search_keywords\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 18\n },\n \"bundle_type\": {\n \"type\": \"string\",\n \"id\": 19\n },\n \"conversation_context\": {\n \"type\": \"ConversationContextProto\",\n \"id\": 20\n },\n \"bundle_confidence\": {\n \"type\": \"float\",\n \"id\": 21\n },\n \"origin_pattern_id\": {\n \"type\": \"string\",\n \"id\": 22\n },\n \"ttl_hint_seconds\": {\n \"type\": \"int32\",\n \"id\": 23\n },\n \"anticipation_scope_rung\": {\n \"type\": \"string\",\n \"id\": 24\n }\n }\n },\n \"ConversationContextProto\": {\n \"fields\": {\n \"summary\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"current_state_json\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"key_extractions_json\": {\n \"type\": \"string\",\n \"id\": 3\n },\n \"recent_turns\": {\n \"rule\": \"repeated\",\n \"type\": \"RecentTurnProto\",\n \"id\": 4\n },\n \"compaction_id\": {\n \"type\": \"string\",\n \"id\": 5\n },\n \"compacted_at\": {\n \"type\": \"string\",\n \"id\": 6\n },\n \"conversation_id\": {\n \"type\": \"string\",\n \"id\": 7\n }\n }\n },\n \"RecentTurnProto\": {\n \"fields\": {\n \"role\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"content\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"timestamp\": {\n \"type\": \"string\",\n \"id\": 3\n }\n }\n },\n \"ContextItemList\": {\n \"fields\": {\n \"items\": {\n \"rule\": \"repeated\",\n \"type\": \"ContextItemProto\",\n \"id\": 1\n }\n }\n },\n \"ContextItemProto\": {\n \"fields\": {\n \"item_id\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"content\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"context_type\": {\n \"type\": \"string\",\n \"id\": 3\n },\n \"source\": {\n \"type\": \"string\",\n \"id\": 4\n },\n \"similarity_score\": {\n \"type\": \"float\",\n \"id\": 5\n },\n \"relevance_score\": {\n \"type\": \"float\",\n \"id\": 6\n },\n \"confidence\": {\n \"type\": \"float\",\n \"id\": 7\n },\n \"scope\": {\n \"type\": \"string\",\n \"id\": 8\n },\n \"entity_id\": {\n \"type\": \"string\",\n \"id\": 9\n },\n \"created_at\": {\n \"type\": \"string\",\n \"id\": 10\n },\n \"event_date\": {\n \"type\": \"string\",\n \"id\": 11\n },\n \"valid_until\": {\n \"type\": \"string\",\n \"id\": 12\n },\n \"temporal_category\": {\n \"type\": \"string\",\n \"id\": 13\n },\n \"temporal_confidence\": {\n \"type\": \"float\",\n \"id\": 14\n }\n }\n },\n \"TelemetryEvent\": {\n \"fields\": {\n \"event_type\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"instance_id\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"client_id\": {\n \"type\": \"string\",\n \"id\": 3\n },\n \"correlation_id\": {\n \"type\": \"string\",\n \"id\": 4\n },\n \"timestamp_ms\": {\n \"type\": \"int64\",\n \"id\": 5\n },\n \"latency_ms\": {\n \"type\": \"int32\",\n \"id\": 6\n },\n \"status\": {\n \"type\": \"string\",\n \"id\": 7\n },\n \"error_code\": {\n \"type\": \"string\",\n \"id\": 8\n },\n \"scope\": {\n \"type\": \"string\",\n \"id\": 9\n },\n \"cache_status\": {\n \"type\": \"string\",\n \"id\": 10\n },\n \"attempt\": {\n \"type\": \"int32\",\n \"id\": 11\n },\n \"http_method\": {\n \"type\": \"string\",\n \"id\": 12\n },\n \"http_path\": {\n \"type\": \"string\",\n \"id\": 13\n },\n \"http_status_code\": {\n \"type\": \"int32\",\n \"id\": 14\n },\n \"metadata\": {\n \"keyType\": \"string\",\n \"type\": \"string\",\n \"id\": 15\n },\n \"sdk_version\": {\n \"type\": \"string\",\n \"id\": 16\n },\n \"batch_id\": {\n \"type\": \"string\",\n \"id\": 17\n }\n }\n },\n \"TelemetryAck\": {\n \"fields\": {\n \"status\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"events_received\": {\n \"type\": \"int32\",\n \"id\": 2\n }\n }\n }\n }\n }\n }\n }\n }\n} as const;\n","/**\n * Bidirectional gRPC stream client for the Synap anticipation channel.\n *\n * Mirrors Python's `GRPCTransport` and the synap-vercel-adk client:\n * - `/synap.v1.SynapService/Listen`, StreamEvent in, StreamResponse out\n * - Auth via `authorization: Bearer <key>` plus `x-client-id` / `x-instance-id`\n * - 30s heartbeat, exponential-backoff reconnect\n * - Server pushes ContextBundleProto, which lands in the AnticipationCache\n *\n * Node-only, and reached exclusively through a lazy `import()` so that merely\n * importing the SDK on Edge or in a Worker stays safe. grpc-js is built on\n * `node:http2`/`node:net`/`node:tls`; a static import fails the BUILD there.\n *\n * The proto arrives as an inlined descriptor (see ./descriptor.ts) rather than\n * being read from disk, so bundlers and Vercel file tracing cannot lose it.\n */\n\nimport type { AnticipationCache } from '../context/anticipation-cache.js';\nimport { SYNAP_PROTO_DESCRIPTOR } from './descriptor.js';\nimport { newCorrelationId } from '../util/correlation.js';\nimport { InsufficientCreditsError, RateLimitError, type SynapError } from '../errors.js';\n\nexport type StreamState =\n | 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'closed';\n\n/**\n * The ONLY bundle type the cache refuses.\n *\n * NOTE: this deliberately differs from the synap-vercel-adk stream client,\n * which caches an allowlist of `anticipation` and `user_summary` and drops\n * compaction updates. Python's `_handle_anticipated_bundle` stores everything\n * except `reactive`, and Python is the reference implementation, so an\n * allowlist here would silently cache less than the pip SDK does.\n *\n * Reactive bundles are excluded because they answer a fetch that already\n * happened; caching one serves a stale answer to a different question.\n */\nconst UNCACHEABLE_BUNDLE_TYPE = 'reactive';\n\n// Mirrors the Python GRPCTransport constants.\nconst MAX_RECONNECT_ATTEMPTS = 10;\nconst BACKOFF_BASE_MS = 1_000;\nconst BACKOFF_MAX_MS = 30_000;\nconst HEARTBEAT_INTERVAL_MS = 30_000;\nconst HEARTBEAT_TIMEOUT_MS = 10_000;\nconst MAX_MISSED_HEARTBEATS = 3;\n\n// The outbound buffer, same shape and same numbers as Python's transport\n// (SEND_QUEUE_MAX_DEPTH / SEND_QUEUE_MAX_AGE). Events written while the stream\n// is down were silently dropped here: `#write` returned early and said nothing,\n// so a reconnect lost every turn that happened during it.\nconst SEND_QUEUE_MAX_DEPTH = 100;\n// How long disconnect() waits for the server to finish reading after the\n// half-close. Matches Python's CLOSE_GRACE.\nconst CLOSE_GRACE_MS = 2_000;\nconst SEND_QUEUE_MAX_AGE_MS = 5 * 60 * 1_000;\n// How long disconnect() waits for the buffer to go out. Short: a shutdown path\n// that blocks is worse than a lost event.\nconst CLOSE_FLUSH_TIMEOUT_MS = 2_000;\n/** The server may only SHORTEN the SDK default, never extend it past this floor. */\nconst MIN_TTL_SECONDS = 60;\n\nexport interface StreamCredentials {\n apiKey: string;\n clientId: string;\n instanceId: string;\n}\n\nexport interface StreamClientOptions {\n host?: string;\n port?: number;\n useTls?: boolean;\n /** Injected in tests so reconnect backoff does not make the suite slow. */\n sleep?: (ms: number) => Promise<void>;\n /** How long to wait for the channel to become ready. Default 10s. */\n connectTimeoutMs?: number;\n onStateChange?: (state: StreamState) => void;\n /** Fires for every bundle, before the cache filter. Backs `listen({onContext})`. */\n onContext?: (bundle: Record<string, unknown>) => void;\n /** Fires only for `compaction_update` bundles. Backs the compaction subscriptions. */\n onCompactionUpdate?: (conversationId: string, bundle: Record<string, unknown>) => void;\n}\n\n/**\n * grpc-js status code for RESOURCE_EXHAUSTED. Hard-coded rather than read from\n * `grpc.status`, because this module is loaded before grpc-js on some paths and\n * the numbers are fixed by the gRPC spec.\n */\nconst GRPC_RESOURCE_EXHAUSTED = 8;\n\n/**\n * The credit gate refuses a call with RESOURCE_EXHAUSTED, these details, and\n * the balance and reason in trailing metadata. See\n * synap/cloud/application/credits/grpc_gate.py.\n */\nexport const CREDIT_ABORT_DETAILS = 'insufficient_credits';\n\n/**\n * Reasons that end the stream. A reconnect re-runs the same gate with the same\n * balance, so retrying only delays the answer the caller needs. Mirrors\n * `CREDIT_STOP_REASONS` in `transport/grpc_client.py`.\n */\nexport const CREDIT_STOP_REASONS = new Set([\n 'overages_disabled',\n 'trial_limit_reached',\n 'subscription_inactive',\n]);\n\nfunction metadataValue(metadata: unknown, key: string): string | null {\n if (metadata === null || typeof metadata !== 'object') return null;\n const getter = (metadata as { get?: (k: string) => unknown }).get;\n const raw = typeof getter === 'function'\n ? getter.call(metadata, key)\n : (metadata as Record<string, unknown>)[key];\n const value = Array.isArray(raw) ? raw[0] : raw;\n if (value === undefined || value === null) return null;\n const text = typeof value === 'string' ? value : String(value);\n return text === '' ? null : text;\n}\n\nfunction numberOrNull(value: string | null): number | null {\n if (value === null) return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\n/**\n * Translate a credit refusal into the same error HTTP would have raised.\n *\n * RESOURCE_EXHAUSTED on its own is indistinguishable from server overload, so\n * this keys on `credit-reason`: `overages_disabled` is an\n * `InsufficientCreditsError` (permanent, a paid plan at zero that has not\n * allowed usage past zero), while `trial_limit_reached` and\n * `subscription_inactive` are a `RateLimitError`. Returns null for anything\n * else, including a RESOURCE_EXHAUSTED that is not a credit refusal and a\n * reason this SDK does not know: the caller then keeps its existing behaviour\n * of treating the abort as transient. Mirrors `credit_error_from_rpc`.\n */\nexport function creditErrorFromRpc(\n error: unknown,\n correlationId: string | null = null,\n): SynapError | null {\n if (error === null || typeof error !== 'object') return null;\n if ((error as { code?: unknown }).code !== GRPC_RESOURCE_EXHAUSTED) return null;\n\n const metadata = (error as { metadata?: unknown }).metadata;\n const reason = metadataValue(metadata, 'credit-reason');\n if (reason === null || !CREDIT_STOP_REASONS.has(reason)) return null;\n\n const rawDetails = (error as { details?: unknown }).details;\n const details = typeof rawDetails === 'string' && rawDetails !== ''\n ? rawDetails\n : CREDIT_ABORT_DETAILS;\n const requestId = metadataValue(metadata, 'request-id') ?? correlationId;\n const manageUrl = metadataValue(metadata, 'credit-manage-url');\n\n if (reason === 'overages_disabled') {\n return new InsufficientCreditsError(details, {\n correlationId: requestId,\n balanceCredits: numberOrNull(metadataValue(metadata, 'credit-balance')),\n requiredCredits: numberOrNull(metadataValue(metadata, 'credit-minimum-required')),\n recoveryUrl: metadataValue(metadata, 'credit-recovery-url'),\n redeemUrl: metadataValue(metadata, 'credit-redeem-url'),\n reason,\n manageUrl,\n });\n }\n\n return new RateLimitError(details, {\n correlationId: requestId,\n reason,\n upgradeUrl: metadataValue(metadata, 'credit-upgrade-url'),\n manageUrl,\n });\n}\n\n/** True for an error this module raised from a credit refusal. */\nexport function isCreditStop(error: unknown): boolean {\n if (!(error instanceof InsufficientCreditsError) && !(error instanceof RateLimitError)) {\n return false;\n }\n const reason = (error as { reason?: unknown }).reason;\n return typeof reason === 'string' && CREDIT_STOP_REASONS.has(reason);\n}\n\ninterface DuplexCall {\n write: (msg: unknown) => void;\n on: (event: string, handler: (arg?: unknown) => void) => void;\n end: () => void;\n}\n\nexport interface ConversationEventInput {\n event_type: string;\n conversation_id?: string;\n user_id?: string;\n customer_id?: string;\n role?: string;\n content?: string;\n session_id?: string;\n metadata?: Record<string, string>;\n timestamp_ms?: number;\n /** proto: ConversationEvent.tool_name */\n tool_name?: string;\n /** proto: ConversationEvent.tool_args_json. Python sends json.dumps(tool_args). */\n tool_args_json?: string;\n /**\n * proto: ConversationEvent.tool_result_json. A result is not a message, so\n * it does not ride in `content`; a string is sent as itself rather than as a\n * quoted JSON string, matching Python.\n */\n tool_result_json?: string;\n /** proto: ConversationEvent.tool_call_id. Ties a result to its call. */\n tool_call_id?: string;\n search_queries?: string[];\n context_types?: string[];\n /**\n * proto: ConversationEvent.event_id. Minted here when absent, and the SAME\n * id travels on every replay — that is what the server's dedupe matches, so\n * a retry cannot double a turn.\n */\n event_id?: string;\n /** proto: ConversationEvent.sent_at_ms. When we FIRST tried, not when it happened. */\n sent_at_ms?: number;\n}\n\nexport class GrpcStreamClient {\n readonly host: string;\n readonly port: number;\n readonly useTls: boolean;\n\n #state: StreamState = 'disconnected';\n #call: DuplexCall | null = null;\n #reconnectAttempts = 0;\n #lastPongAt = 0;\n #missedHeartbeats = 0;\n #heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n #shutdownRequested = false;\n // Events that could not be written because there was no stream.\n #sendQueue: Array<{ queuedAt: number; event: ConversationEventInput }> = [];\n // Events written to a live stream that the server has not acknowledged. The\n // queue above covers \"the stream was down\"; this covers the half that\n // actually loses sessions — the write succeeded, the stream broke before the\n // server processed it, and nobody knows.\n #unacked = new Map<string, { queuedAt: number; event: ConversationEventInput }>();\n // Why the stream stopped, when it stopped for a reason the caller can act on\n // (today: a credit refusal). Mirrors Python's `last_error`.\n #lastError: SynapError | null = null;\n\n #grpc: typeof import('@grpc/grpc-js') | null = null;\n #ServiceStub: (new (target: string, creds: unknown, opts: unknown) => Record<string, unknown>) | null = null;\n\n readonly #credentials: StreamCredentials;\n readonly #cache: AnticipationCache;\n readonly #options: StreamClientOptions;\n readonly #sleep: (ms: number) => Promise<void>;\n readonly #connectTimeoutMs: number;\n\n constructor(\n credentials: StreamCredentials,\n cache: AnticipationCache,\n options: StreamClientOptions = {},\n ) {\n this.#credentials = credentials;\n this.#cache = cache;\n this.#options = options;\n this.host = options.host ?? 'synap-cloud-prod.maximem.ai';\n this.port = options.port ?? 443;\n this.useTls = options.useTls ?? true;\n this.#sleep = options.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));\n this.#connectTimeoutMs = options.connectTimeoutMs ?? 10_000;\n }\n\n get currentState(): StreamState { return this.#state; }\n get isConnected(): boolean { return this.#state === 'connected'; }\n\n /**\n * The error that ended the stream, if one did.\n *\n * Set when the server refused the stream for credits, so an `onDisconnect`\n * handler can read the balance, the reason and the URL to fix it. Null for an\n * ordinary disconnect.\n */\n get lastError(): SynapError | null { return this.#lastError; }\n\n async connect(): Promise<void> {\n await this.#loadGrpc();\n this.#shutdownRequested = false;\n this.#lastError = null;\n await this.#establish();\n this.#startHeartbeat();\n }\n\n async disconnect(): Promise<void> {\n // Stop the heartbeat first: it writes, and a write after the half-close\n // below is an error.\n this.#shutdownRequested = true;\n this.#stopHeartbeat();\n\n // What is still buffered goes out before the half-close.\n this.#flushBeforeClose();\n\n // ⚠ `end()` half-closes the write side, which is right, but on its own it\n // is not enough. It used to return immediately and the process would exit\n // while the server was still reading, so the events were written and never\n // processed. Waiting for the server to finish its side is what makes the\n // half-close mean anything.\n //\n // Bounded, because a shutdown that hangs on a dead network is its own kind\n // of broken, and whatever misses the deadline is reported rather than lost\n // silently. See `undelivered()`.\n const call = this.#call;\n if (call !== null) {\n try { call.end(); } catch { /* already torn down */ }\n await new Promise<void>((resolve) => {\n let settled = false;\n const done = () => { if (!settled) { settled = true; resolve(); } };\n const timer = setTimeout(() => {\n const left = this.undelivered();\n if (left.unacknowledged > 0 || left.queued > 0) {\n console.warn(\n `[synap] closing with ${left.queued} queued and `\n + `${left.unacknowledged} unacknowledged event(s) the server did `\n + `not confirm within ${CLOSE_GRACE_MS}ms`,\n );\n }\n done();\n }, CLOSE_GRACE_MS);\n if (typeof timer.unref === 'function') timer.unref();\n call.on('end', () => { clearTimeout(timer); done(); });\n call.on('status', () => { clearTimeout(timer); done(); });\n call.on('error', () => { clearTimeout(timer); done(); });\n });\n }\n\n this.#call = null;\n this.#setState('closed');\n }\n\n /**\n * What this client could not get to the server.\n *\n * Every send path returns void, so a caller had no way to tell a delivered\n * turn from a lost one. Mirrors Python's `undelivered()`.\n */\n undelivered(): { queued: number; unacknowledged: number } {\n return { queued: this.#sendQueue.length, unacknowledged: this.#unacked.size };\n }\n\n /**\n * Never fails the caller's turn, and no longer loses it either.\n *\n * A write that cannot go out is buffered and replayed on reconnect, and a\n * write that does go out is held until the server acknowledges it. Before\n * this, both cases ended at a silent `return`.\n */\n sendConversationEvent(event: ConversationEventInput): void {\n const stamped: ConversationEventInput = {\n ...event,\n event_id: event.event_id && event.event_id !== '' ? event.event_id : newCorrelationId(),\n sent_at_ms: event.sent_at_ms ?? Date.now(),\n };\n if (!this.isConnected || this.#call === null) {\n this.#enqueue(stamped);\n return;\n }\n this.#write({ conversation_event: { ...stamped } });\n this.#trackUnacked(stamped);\n }\n\n #enqueue(event: ConversationEventInput): void {\n this.#pruneQueue();\n if (this.#sendQueue.length >= SEND_QUEUE_MAX_DEPTH) {\n const evicted = this.#sendQueue.shift();\n console.warn(\n `[synap] send queue full (max=${SEND_QUEUE_MAX_DEPTH}); dropping oldest `\n + `event (event_type=${evicted?.event.event_type})`,\n );\n }\n this.#sendQueue.push({ queuedAt: Date.now(), event });\n }\n\n #pruneQueue(): void {\n const cutoff = Date.now() - SEND_QUEUE_MAX_AGE_MS;\n while (this.#sendQueue.length > 0 && (this.#sendQueue[0]?.queuedAt ?? 0) < cutoff) {\n const expired = this.#sendQueue.shift();\n console.warn(\n `[synap] queued event expired (age>${SEND_QUEUE_MAX_AGE_MS}ms); dropping `\n + `(event_type=${expired?.event.event_type})`,\n );\n }\n }\n\n #trackUnacked(event: ConversationEventInput): void {\n const id = event.event_id;\n if (id === undefined || id === '') return;\n const cutoff = Date.now() - SEND_QUEUE_MAX_AGE_MS;\n for (const [oldestId, held] of this.#unacked) {\n if (held.queuedAt >= cutoff && this.#unacked.size < SEND_QUEUE_MAX_DEPTH) break;\n this.#unacked.delete(oldestId);\n console.warn(\n '[synap] unacknowledged event dropped: the server never confirmed it '\n + `(event_type=${held.event.event_type})`,\n );\n }\n this.#unacked.set(id, { queuedAt: Date.now(), event });\n }\n\n /**\n * Replay what the server never confirmed, then what never went out.\n *\n * That order is the order things happened in: an unacked event was written\n * to the previous stream, so it is older than anything that piled up while\n * there was no stream at all. Safe to repeat — every event carries the id it\n * was first sent with and the server drops a second sighting of it.\n */\n #replayBuffered(): void {\n const unacked = [...this.#unacked.values()];\n const queued = this.#sendQueue;\n this.#sendQueue = [];\n for (const held of [...unacked, ...queued]) {\n this.#write({ conversation_event: { ...held.event } });\n }\n if (unacked.length > 0 || queued.length > 0) {\n console.warn(\n `[synap] replayed ${unacked.length} unacknowledged and ${queued.length} `\n + 'queued event(s) after reconnect',\n );\n }\n }\n\n sendSessionControl(input: {\n action: string;\n session_id?: string;\n conversation_id?: string;\n user_id?: string;\n customer_id?: string;\n }): void {\n this.#write({ session_control: { ...input } });\n }\n\n sendContextUsed(event: Record<string, unknown>): void {\n this.#write({ context_used: { ...event } });\n }\n\n sendContextAssembled(event: Record<string, unknown>): void {\n this.#write({ context_assembled: { ...event } });\n }\n\n #flushBeforeClose(): void {\n if (!this.isConnected || this.#call === null) {\n if (this.#sendQueue.length > 0 || this.#unacked.size > 0) {\n console.warn(\n `[synap] closing with ${this.#sendQueue.length} queued and `\n + `${this.#unacked.size} unacknowledged event(s) and no stream to send `\n + 'them on; they are lost',\n );\n }\n return;\n }\n const queued = this.#sendQueue;\n this.#sendQueue = [];\n for (const held of queued) {\n this.#write({ conversation_event: { ...held.event } });\n }\n }\n\n #write(msg: unknown): void {\n if (!this.isConnected || this.#call === null) return;\n try {\n this.#call.write(msg);\n } catch {\n // Non-fatal. These are telemetry and control events; losing one is\n // strictly better than surfacing a stream hiccup to the caller.\n }\n }\n\n async #loadGrpc(): Promise<void> {\n if (this.#grpc !== null) return;\n const [grpcMod, protoMod] = await Promise.all([\n import(/* @vite-ignore */ '@grpc/grpc-js'),\n import(/* @vite-ignore */ '@grpc/proto-loader'),\n ]);\n this.#grpc = grpcMod;\n\n // `fromJSON`, not `loadSync`: no path, no disk read, nothing for a bundler\n // to fail to trace. `keepCase` keeps the snake_case field names the server\n // and the Python SDK both use.\n const pkgDef = protoMod.fromJSON(\n SYNAP_PROTO_DESCRIPTOR as unknown as Parameters<typeof protoMod.fromJSON>[0],\n { keepCase: true, longs: Number, enums: String, defaults: true, oneofs: true },\n );\n const pkg = grpcMod.loadPackageDefinition(pkgDef) as unknown as {\n synap: { v1: { SynapService: new (t: string, c: unknown, o: unknown) => Record<string, unknown> } };\n };\n this.#ServiceStub = pkg.synap.v1.SynapService;\n }\n\n async #establish(): Promise<void> {\n this.#setState('connecting');\n const grpc = this.#grpc;\n const Stub = this.#ServiceStub;\n if (grpc === null || Stub === null) throw new Error('gRPC not loaded');\n\n const channelCreds = this.useTls\n ? grpc.credentials.createSsl()\n : grpc.credentials.createInsecure();\n\n const stub = new Stub(`${this.host}:${this.port}`, channelCreds, {\n 'grpc.keepalive_time_ms': 30_000,\n 'grpc.keepalive_timeout_ms': 10_000,\n 'grpc.keepalive_permit_without_calls': 1,\n });\n\n // Wait for the channel before reporting success.\n //\n // grpc-js connects LAZILY: constructing the stub and creating the call both\n // return immediately, and a bad host surfaces later through the call's\n // 'error' event. Without this, `await listen()` resolved against an\n // unreachable port, `is_listening` read true for a stream that never\n // connected, and `send_message()` then dropped every event silently,\n // because sends are deliberately fire-and-forget. Failing loudly here is\n // the difference between a clear error and an agent that looks like it has\n // no memory.\n await new Promise<void>((resolve, reject) => {\n const deadline = new Date(Date.now() + this.#connectTimeoutMs);\n const waitForReady = (stub as unknown as {\n waitForReady?: (d: Date, cb: (e?: Error) => void) => void;\n }).waitForReady;\n if (typeof waitForReady !== 'function') {\n // Older grpc-js, or a stub that does not expose it. Fall back to the\n // lazy behaviour rather than failing outright.\n resolve();\n return;\n }\n waitForReady.call(stub, deadline, (error?: Error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n\n const metadata = new grpc.Metadata();\n metadata.add('authorization', `Bearer ${this.#credentials.apiKey}`);\n metadata.add('x-client-id', this.#credentials.clientId);\n metadata.add('x-instance-id', this.#credentials.instanceId);\n\n const call = (stub['Listen'] as (m: unknown) => DuplexCall)(metadata);\n call.on('data', (msg) => this.#handleMessage(msg as Record<string, unknown>));\n call.on('error', (err) => {\n // A credit refusal arrives here, not from waitForReady: the channel is\n // healthy and the gate aborts the call itself.\n const creditError = creditErrorFromRpc(err);\n if (creditError !== null) {\n this.#handleCreditStop(creditError);\n return;\n }\n void this.#handleDisconnect(`error: ${String(err)}`);\n });\n call.on('end', () => { void this.#handleDisconnect('server_close'); });\n\n // NOTE, and this is where JS and Python legitimately differ.\n //\n // Python waits on `call.wait_for_connection()` here, because grpc.aio\n // reports CONNECTED off a call object the server has not accepted and\n // events written in that window were written into a buffer that the close\n // then discarded.\n //\n // grpc-js has no equivalent, and the obvious stand-in does not work: a\n // grpc-js server sends no initial metadata until it writes, so waiting on\n // the 'metadata' event stalls for the whole connect timeout on a server\n // that is perfectly healthy. Measured: it made every test here time out.\n //\n // It is also not needed. grpc-js buffers writes on the call and flushes\n // them once the call is established, so an event written this early is not\n // lost by the write. It is lost by the TEARDOWN, which is what\n // `disconnect()` now fixes: half-close, then wait for the server to finish\n // reading. The parity is in the outcome the tests assert, a whole turn\n // reaching the server with no pause anywhere, not in the mechanism.\n this.#call = call;\n this.#setState('connected');\n this.#reconnectAttempts = 0;\n this.#lastPongAt = Date.now();\n // Before anything else on the new stream: the turns that happened while\n // there was not one.\n this.#replayBuffered();\n }\n\n #handleMessage(msg: Record<string, unknown>): void {\n const ack = msg['event_ack'] as { event_ids?: string[] } | undefined;\n if (ack) {\n for (const id of ack.event_ids ?? []) this.#unacked.delete(id);\n return;\n }\n if (msg['context_bundle']) {\n this.#handleBundle(msg['context_bundle'] as Record<string, unknown>);\n return;\n }\n if (msg['heartbeat_pong']) {\n this.#lastPongAt = Date.now();\n this.#missedHeartbeats = 0;\n return;\n }\n const signal = msg['signal'] as { signal_type?: string } | undefined;\n if (signal?.signal_type === 'closing') {\n void this.#handleDisconnect('server_signal_closing');\n }\n }\n\n #handleBundle(bundle: Record<string, unknown>): void {\n const bundleType = String(bundle['bundle_type'] ?? '') || 'anticipation';\n const conversationId = String(bundle['anticipation_conversation_id'] ?? '');\n\n if (bundleType !== UNCACHEABLE_BUNDLE_TYPE) this.#store(bundle, bundleType, conversationId);\n\n if (bundleType === 'compaction_update' && conversationId !== '') {\n // Python also deletes this conversation's `compacted_full` /\n // `compacted_context` entries from its separate CacheManager. This SDK\n // has no such cache, and calling dropConversation() here would delete\n // the bundle just stored above, so there is nothing to invalidate.\n this.#options.onCompactionUpdate?.(conversationId, bundle);\n }\n\n // Fires for every type, after storing, matching Python's ordering.\n this.#options.onContext?.(bundle);\n }\n\n #store(bundle: Record<string, unknown>, bundleType: string, conversationId: string): void {\n const itemsByType: Record<string, Array<Record<string, unknown>>> = {};\n for (const [type, list] of Object.entries(bundle['items_by_type'] ?? {})) {\n const items = (list as { items?: Array<Record<string, unknown>> })?.items;\n itemsByType[type] = items ?? [];\n }\n\n const ttlHint = Number(bundle['ttl_hint_seconds'] ?? 0);\n this.#cache.store({\n bundleId: String(bundle['bundle_id'] ?? ''),\n // The cache keys on ONE entity. User id wins when present, so a bundle\n // pushed for a user cannot be served to a different user in the same\n // customer; falling back to customer id keeps org-scope bundles usable.\n entityId:\n String(bundle['anticipation_user_id'] ?? '') ||\n String(bundle['anticipation_customer_id'] ?? '') ||\n null,\n conversationId: conversationId || null,\n // The rung the server retrieved this bundle at. Absent from anything an\n // older server sent, and absent reads as \"named no rung\" rather than as\n // \"matches anything\".\n scopeRung: String(bundle['anticipation_scope_rung'] ?? '') || null,\n itemsByType,\n // 0 means \"use the SDK default\"; anything else is floored at 60s.\n ttlHintSeconds: ttlHint > 0 ? Math.max(ttlHint, MIN_TTL_SECONDS) : null,\n bundleType,\n searchQueries: [\n ...((bundle['search_queries'] as string[] | undefined) ?? []),\n ...((bundle['search_keywords'] as string[] | undefined) ?? []),\n ],\n });\n }\n\n /**\n * End the stream because the server refused it for credits.\n *\n * Reconnecting cannot clear a credit refusal, so the stream closes and the\n * typed error is kept on `lastError` for the application to read. Mirrors\n * Python's `_handle_credit_stop`.\n */\n #handleCreditStop(error: SynapError): void {\n this.#lastError = error;\n this.#shutdownRequested = true;\n this.#stopHeartbeat();\n this.#closeCall();\n this.#setState('disconnected');\n }\n\n async #handleDisconnect(_reason: string): Promise<void> {\n if (this.#shutdownRequested) return;\n\n this.#closeCall();\n this.#setState('reconnecting');\n\n if (this.#reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {\n this.#setState('disconnected');\n return;\n }\n\n // Jittered exponential backoff. The jitter matters with many SDK instances\n // behind one deploy: without it they all retry in lockstep.\n const delay = Math.min(\n BACKOFF_BASE_MS * 2 ** this.#reconnectAttempts + Math.random() * 1_000,\n BACKOFF_MAX_MS,\n );\n this.#reconnectAttempts += 1;\n\n await this.#sleep(delay);\n if (this.#shutdownRequested) return;\n try {\n await this.#establish();\n } catch (error) {\n if (isCreditStop(error)) {\n this.#handleCreditStop(error as SynapError);\n return;\n }\n void this.#handleDisconnect('reconnect_failed');\n }\n }\n\n #startHeartbeat(): void {\n this.#heartbeatTimer = setInterval(() => {\n if (!this.isConnected || this.#call === null) return;\n const now = Date.now();\n\n if (now - this.#lastPongAt > HEARTBEAT_TIMEOUT_MS) {\n this.#missedHeartbeats += 1;\n if (this.#missedHeartbeats >= MAX_MISSED_HEARTBEATS) {\n void this.#handleDisconnect('heartbeat_timeout');\n return;\n }\n }\n try {\n this.#call.write({ heartbeat_ping: { timestamp_ms: now } });\n } catch {\n void this.#handleDisconnect('heartbeat_write_error');\n }\n }, HEARTBEAT_INTERVAL_MS);\n // Never hold the process open on the heartbeat alone: a CLI that finishes\n // its work should exit, not hang for 30s.\n this.#heartbeatTimer.unref?.();\n }\n\n #stopHeartbeat(): void {\n if (this.#heartbeatTimer !== null) {\n clearInterval(this.#heartbeatTimer);\n this.#heartbeatTimer = null;\n }\n }\n\n #closeCall(): void {\n try {\n this.#call?.end();\n } catch {\n /* already torn down */\n }\n this.#call = null;\n }\n\n #setState(state: StreamState): void {\n this.#state = state;\n this.#options.onStateChange?.(state);\n }\n}\n"],"mappings":";;;;;;;AAaO,IAAM,YAAY;AAElB,IAAM,yBAAyB;AAAA,EACpC,UAAU;AAAA,IACR,SAAS;AAAA,MACP,UAAU;AAAA,QACR,MAAM;AAAA,UACJ,UAAU;AAAA,YACR,gBAAgB;AAAA,cACd,WAAW;AAAA,gBACT,UAAU;AAAA,kBACR,eAAe;AAAA,kBACf,iBAAiB;AAAA,kBACjB,gBAAgB;AAAA,kBAChB,kBAAkB;AAAA,gBACpB;AAAA,gBACA,mBAAmB;AAAA,kBACjB,eAAe;AAAA,kBACf,iBAAiB;AAAA,kBACjB,gBAAgB;AAAA,gBAClB;AAAA,cACF;AAAA,YACF;AAAA,YACA,eAAe;AAAA,cACb,UAAU;AAAA,gBACR,WAAW;AAAA,kBACT,SAAS;AAAA,oBACP;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,cACA,UAAU;AAAA,gBACR,sBAAsB;AAAA,kBACpB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,kBAAkB;AAAA,kBAChB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,mBAAmB;AAAA,kBACjB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,gBAAgB;AAAA,kBACd,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,qBAAqB;AAAA,kBACnB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA,oBAAoB;AAAA,cAClB,UAAU;AAAA,gBACR,aAAa;AAAA,kBACX,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,mBAAmB;AAAA,kBACjB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,WAAW;AAAA,kBACT,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,eAAe;AAAA,kBACb,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,mBAAmB;AAAA,kBACjB,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,gBAAgB;AAAA,kBACd,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,SAAS;AAAA,kBACP,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,qBAAqB;AAAA,kBACnB,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA,yBAAyB;AAAA,cACvB,UAAU;AAAA,gBACR,kBAAkB;AAAA,kBAChB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,mBAAmB;AAAA,kBACjB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,WAAW;AAAA,kBACT,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,eAAe;AAAA,kBACb,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,kBAAkB;AAAA,kBAChB,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,sBAAsB;AAAA,kBACpB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,iBAAiB;AAAA,kBACf,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,qBAAqB;AAAA,kBACnB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,4BAA4B;AAAA,kBAC1B,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,mBAAmB;AAAA,kBACjB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,wBAAwB;AAAA,kBACtB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,aAAa;AAAA,kBACX,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,gBAAgB;AAAA,kBACd,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,eAAe;AAAA,kBACb,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA,qBAAqB;AAAA,cACnB,UAAU;AAAA,gBACR,cAAc;AAAA,kBACZ,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,mBAAmB;AAAA,kBACjB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,WAAW;AAAA,kBACT,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,QAAQ;AAAA,kBACN,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,WAAW;AAAA,kBACT,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,eAAe;AAAA,kBACb,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,cAAc;AAAA,kBACZ,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,YAAY;AAAA,kBACV,WAAW;AAAA,kBACX,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,gBAAgB;AAAA,kBACd,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,aAAa;AAAA,kBACX,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,kBAAkB;AAAA,kBAChB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,oBAAoB;AAAA,kBAClB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,gBAAgB;AAAA,kBACd,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,kBAAkB;AAAA,kBAChB,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,iBAAiB;AAAA,kBACf,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,SAAS;AAAA,kBACP,WAAW;AAAA,kBACX,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,YAAY;AAAA,kBACV,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,cAAc;AAAA,kBACZ,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA,iBAAiB;AAAA,cACf,UAAU;AAAA,gBACR,gBAAgB;AAAA,kBACd,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA,kBAAkB;AAAA,cAChB,UAAU;AAAA,gBACR,UAAU;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,cAAc;AAAA,kBACZ,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,mBAAmB;AAAA,kBACjB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,WAAW;AAAA,kBACT,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,eAAe;AAAA,kBACb,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA,kBAAkB;AAAA,cAChB,UAAU;AAAA,gBACR,WAAW;AAAA,kBACT,SAAS;AAAA,oBACP;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,cACA,UAAU;AAAA,gBACR,kBAAkB;AAAA,kBAChB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,kBAAkB;AAAA,kBAChB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,UAAU;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,aAAa;AAAA,kBACX,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA,YAAY;AAAA,cACV,UAAU;AAAA,gBACR,aAAa;AAAA,kBACX,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,gBAAgB;AAAA,kBACd,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA,iBAAiB;AAAA,cACf,UAAU;AAAA,gBACR,gBAAgB;AAAA,kBACd,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA,gBAAgB;AAAA,cACd,UAAU;AAAA,gBACR,eAAe;AAAA,kBACb,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,UAAU;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,YAAY;AAAA,kBACV,WAAW;AAAA,kBACX,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA,sBAAsB;AAAA,cACpB,UAAU;AAAA,gBACR,aAAa;AAAA,kBACX,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,eAAe;AAAA,kBACb,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,iBAAiB;AAAA,kBACf,WAAW;AAAA,kBACX,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,gBAAgB;AAAA,kBACd,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,gBAAgB;AAAA,kBACd,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,mBAAmB;AAAA,kBACjB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,kBAAkB;AAAA,kBAChB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,mBAAmB;AAAA,kBACjB,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,qBAAqB;AAAA,kBACnB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,YAAY;AAAA,kBACV,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,cAAc;AAAA,kBACZ,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,qBAAqB;AAAA,kBACnB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,aAAa;AAAA,kBACX,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,kBAAkB;AAAA,kBAChB,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,wBAAwB;AAAA,kBACtB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,4BAA4B;AAAA,kBAC1B,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,gCAAgC;AAAA,kBAC9B,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,mBAAmB;AAAA,kBACjB,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,eAAe;AAAA,kBACb,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,wBAAwB;AAAA,kBACtB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,qBAAqB;AAAA,kBACnB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,qBAAqB;AAAA,kBACnB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,oBAAoB;AAAA,kBAClB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,2BAA2B;AAAA,kBACzB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA,4BAA4B;AAAA,cAC1B,UAAU;AAAA,gBACR,WAAW;AAAA,kBACT,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,sBAAsB;AAAA,kBACpB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,wBAAwB;AAAA,kBACtB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,gBAAgB;AAAA,kBACd,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,iBAAiB;AAAA,kBACf,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,gBAAgB;AAAA,kBACd,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,mBAAmB;AAAA,kBACjB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA,mBAAmB;AAAA,cACjB,UAAU;AAAA,gBACR,QAAQ;AAAA,kBACN,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,WAAW;AAAA,kBACT,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,aAAa;AAAA,kBACX,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA,mBAAmB;AAAA,cACjB,UAAU;AAAA,gBACR,SAAS;AAAA,kBACP,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA,oBAAoB;AAAA,cAClB,UAAU;AAAA,gBACR,WAAW;AAAA,kBACT,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,WAAW;AAAA,kBACT,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,gBAAgB;AAAA,kBACd,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,UAAU;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,oBAAoB;AAAA,kBAClB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,mBAAmB;AAAA,kBACjB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,cAAc;AAAA,kBACZ,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,SAAS;AAAA,kBACP,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,aAAa;AAAA,kBACX,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,cAAc;AAAA,kBACZ,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,cAAc;AAAA,kBACZ,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,eAAe;AAAA,kBACb,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,qBAAqB;AAAA,kBACnB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,uBAAuB;AAAA,kBACrB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA,kBAAkB;AAAA,cAChB,UAAU;AAAA,gBACR,cAAc;AAAA,kBACZ,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,eAAe;AAAA,kBACb,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,aAAa;AAAA,kBACX,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,kBAAkB;AAAA,kBAChB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,gBAAgB;AAAA,kBACd,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,cAAc;AAAA,kBACZ,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,UAAU;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,cAAc;AAAA,kBACZ,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,SAAS;AAAA,kBACP,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,gBAAgB;AAAA,kBACd,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,WAAW;AAAA,kBACT,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,eAAe;AAAA,kBACb,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,aAAa;AAAA,kBACX,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,oBAAoB;AAAA,kBAClB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,YAAY;AAAA,kBACV,WAAW;AAAA,kBACX,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,eAAe;AAAA,kBACb,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,YAAY;AAAA,kBACV,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA,gBAAgB;AAAA,cACd,UAAU;AAAA,gBACR,UAAU;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,gBACA,mBAAmB;AAAA,kBACjB,QAAQ;AAAA,kBACR,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AClnBA,IAAM,0BAA0B;AAGhC,IAAM,yBAAyB;AAC/B,IAAM,kBAAkB;AACxB,IAAM,iBAAiB;AACvB,IAAM,wBAAwB;AAC9B,IAAM,uBAAuB;AAC7B,IAAM,wBAAwB;AAM9B,IAAM,uBAAuB;AAG7B,IAAM,iBAAiB;AACvB,IAAM,wBAAwB,IAAI,KAAK;AAKvC,IAAM,kBAAkB;AA4BxB,IAAM,0BAA0B;AAOzB,IAAM,uBAAuB;AAO7B,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,cAAc,UAAmB,KAA4B;AACpE,MAAI,aAAa,QAAQ,OAAO,aAAa,SAAU,QAAO;AAC9D,QAAM,SAAU,SAA8C;AAC9D,QAAM,MAAM,OAAO,WAAW,aAC1B,OAAO,KAAK,UAAU,GAAG,IACxB,SAAqC,GAAG;AAC7C,QAAM,QAAQ,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI;AAC5C,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,QAAM,OAAO,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAC7D,SAAO,SAAS,KAAK,OAAO;AAC9B;AAEA,SAAS,aAAa,OAAqC;AACzD,MAAI,UAAU,KAAM,QAAO;AAC3B,QAAM,SAAS,OAAO,KAAK;AAC3B,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAcO,SAAS,mBACd,OACA,gBAA+B,MACZ;AACnB,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,MAAK,MAA6B,SAAS,wBAAyB,QAAO;AAE3E,QAAM,WAAY,MAAiC;AACnD,QAAM,SAAS,cAAc,UAAU,eAAe;AACtD,MAAI,WAAW,QAAQ,CAAC,oBAAoB,IAAI,MAAM,EAAG,QAAO;AAEhE,QAAM,aAAc,MAAgC;AACpD,QAAM,UAAU,OAAO,eAAe,YAAY,eAAe,KAC7D,aACA;AACJ,QAAM,YAAY,cAAc,UAAU,YAAY,KAAK;AAC3D,QAAM,YAAY,cAAc,UAAU,mBAAmB;AAE7D,MAAI,WAAW,qBAAqB;AAClC,WAAO,IAAI,yBAAyB,SAAS;AAAA,MAC3C,eAAe;AAAA,MACf,gBAAgB,aAAa,cAAc,UAAU,gBAAgB,CAAC;AAAA,MACtE,iBAAiB,aAAa,cAAc,UAAU,yBAAyB,CAAC;AAAA,MAChF,aAAa,cAAc,UAAU,qBAAqB;AAAA,MAC1D,WAAW,cAAc,UAAU,mBAAmB;AAAA,MACtD;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,IAAI,eAAe,SAAS;AAAA,IACjC,eAAe;AAAA,IACf;AAAA,IACA,YAAY,cAAc,UAAU,oBAAoB;AAAA,IACxD;AAAA,EACF,CAAC;AACH;AAGO,SAAS,aAAa,OAAyB;AACpD,MAAI,EAAE,iBAAiB,6BAA6B,EAAE,iBAAiB,iBAAiB;AACtF,WAAO;AAAA,EACT;AACA,QAAM,SAAU,MAA+B;AAC/C,SAAO,OAAO,WAAW,YAAY,oBAAoB,IAAI,MAAM;AACrE;AA0CO,IAAM,mBAAN,MAAuB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EAET,SAAsB;AAAA,EACtB,QAA2B;AAAA,EAC3B,qBAAqB;AAAA,EACrB,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,kBAAyD;AAAA,EACzD,qBAAqB;AAAA;AAAA,EAErB,aAAyE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1E,WAAW,oBAAI,IAAiE;AAAA;AAAA;AAAA,EAGhF,aAAgC;AAAA,EAEhC,QAA+C;AAAA,EAC/C,eAAwG;AAAA,EAE/F;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,aACA,OACA,UAA+B,CAAC,GAChC;AACA,SAAK,eAAe;AACpB,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,OAAO,QAAQ,QAAQ;AAC5B,SAAK,OAAO,QAAQ,QAAQ;AAC5B,SAAK,SAAS,QAAQ,UAAU;AAChC,SAAK,SAAS,QAAQ,UAAU,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAC5E,SAAK,oBAAoB,QAAQ,oBAAoB;AAAA,EACvD;AAAA,EAEA,IAAI,eAA4B;AAAE,WAAO,KAAK;AAAA,EAAQ;AAAA,EACtD,IAAI,cAAuB;AAAE,WAAO,KAAK,WAAW;AAAA,EAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASjE,IAAI,YAA+B;AAAE,WAAO,KAAK;AAAA,EAAY;AAAA,EAE7D,MAAM,UAAyB;AAC7B,UAAM,KAAK,UAAU;AACrB,SAAK,qBAAqB;AAC1B,SAAK,aAAa;AAClB,UAAM,KAAK,WAAW;AACtB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,MAAM,aAA4B;AAGhC,SAAK,qBAAqB;AAC1B,SAAK,eAAe;AAGpB,SAAK,kBAAkB;AAWvB,UAAM,OAAO,KAAK;AAClB,QAAI,SAAS,MAAM;AACjB,UAAI;AAAE,aAAK,IAAI;AAAA,MAAG,QAAQ;AAAA,MAA0B;AACpD,YAAM,IAAI,QAAc,CAAC,YAAY;AACnC,YAAI,UAAU;AACd,cAAM,OAAO,MAAM;AAAE,cAAI,CAAC,SAAS;AAAE,sBAAU;AAAM,oBAAQ;AAAA,UAAG;AAAA,QAAE;AAClE,cAAM,QAAQ,WAAW,MAAM;AAC7B,gBAAM,OAAO,KAAK,YAAY;AAC9B,cAAI,KAAK,iBAAiB,KAAK,KAAK,SAAS,GAAG;AAC9C,oBAAQ;AAAA,cACN,wBAAwB,KAAK,MAAM,eAC9B,KAAK,cAAc,8DACA,cAAc;AAAA,YACxC;AAAA,UACF;AACA,eAAK;AAAA,QACP,GAAG,cAAc;AACjB,YAAI,OAAO,MAAM,UAAU,WAAY,OAAM,MAAM;AACnD,aAAK,GAAG,OAAO,MAAM;AAAE,uBAAa,KAAK;AAAG,eAAK;AAAA,QAAG,CAAC;AACrD,aAAK,GAAG,UAAU,MAAM;AAAE,uBAAa,KAAK;AAAG,eAAK;AAAA,QAAG,CAAC;AACxD,aAAK,GAAG,SAAS,MAAM;AAAE,uBAAa,KAAK;AAAG,eAAK;AAAA,QAAG,CAAC;AAAA,MACzD,CAAC;AAAA,IACH;AAEA,SAAK,QAAQ;AACb,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAA0D;AACxD,WAAO,EAAE,QAAQ,KAAK,WAAW,QAAQ,gBAAgB,KAAK,SAAS,KAAK;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,sBAAsB,OAAqC;AACzD,UAAM,UAAkC;AAAA,MACtC,GAAG;AAAA,MACH,UAAU,MAAM,YAAY,MAAM,aAAa,KAAK,MAAM,WAAW,iBAAiB;AAAA,MACtF,YAAY,MAAM,cAAc,KAAK,IAAI;AAAA,IAC3C;AACA,QAAI,CAAC,KAAK,eAAe,KAAK,UAAU,MAAM;AAC5C,WAAK,SAAS,OAAO;AACrB;AAAA,IACF;AACA,SAAK,OAAO,EAAE,oBAAoB,EAAE,GAAG,QAAQ,EAAE,CAAC;AAClD,SAAK,cAAc,OAAO;AAAA,EAC5B;AAAA,EAEA,SAAS,OAAqC;AAC5C,SAAK,YAAY;AACjB,QAAI,KAAK,WAAW,UAAU,sBAAsB;AAClD,YAAM,UAAU,KAAK,WAAW,MAAM;AACtC,cAAQ;AAAA,QACN,gCAAgC,oBAAoB,wCAC7B,SAAS,MAAM,UAAU;AAAA,MAClD;AAAA,IACF;AACA,SAAK,WAAW,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,CAAC;AAAA,EACtD;AAAA,EAEA,cAAoB;AAClB,UAAM,SAAS,KAAK,IAAI,IAAI;AAC5B,WAAO,KAAK,WAAW,SAAS,MAAM,KAAK,WAAW,CAAC,GAAG,YAAY,KAAK,QAAQ;AACjF,YAAM,UAAU,KAAK,WAAW,MAAM;AACtC,cAAQ;AAAA,QACN,qCAAqC,qBAAqB,6BACzC,SAAS,MAAM,UAAU;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc,OAAqC;AACjD,UAAM,KAAK,MAAM;AACjB,QAAI,OAAO,UAAa,OAAO,GAAI;AACnC,UAAM,SAAS,KAAK,IAAI,IAAI;AAC5B,eAAW,CAAC,UAAU,IAAI,KAAK,KAAK,UAAU;AAC5C,UAAI,KAAK,YAAY,UAAU,KAAK,SAAS,OAAO,qBAAsB;AAC1E,WAAK,SAAS,OAAO,QAAQ;AAC7B,cAAQ;AAAA,QACN,mFACiB,KAAK,MAAM,UAAU;AAAA,MACxC;AAAA,IACF;AACA,SAAK,SAAS,IAAI,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,CAAC;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,kBAAwB;AACtB,UAAM,UAAU,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC;AAC1C,UAAM,SAAS,KAAK;AACpB,SAAK,aAAa,CAAC;AACnB,eAAW,QAAQ,CAAC,GAAG,SAAS,GAAG,MAAM,GAAG;AAC1C,WAAK,OAAO,EAAE,oBAAoB,EAAE,GAAG,KAAK,MAAM,EAAE,CAAC;AAAA,IACvD;AACA,QAAI,QAAQ,SAAS,KAAK,OAAO,SAAS,GAAG;AAC3C,cAAQ;AAAA,QACN,oBAAoB,QAAQ,MAAM,uBAAuB,OAAO,MAAM;AAAA,MAExE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAmB,OAMV;AACP,SAAK,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,EAAE,CAAC;AAAA,EAC/C;AAAA,EAEA,gBAAgB,OAAsC;AACpD,SAAK,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;AAAA,EAC5C;AAAA,EAEA,qBAAqB,OAAsC;AACzD,SAAK,OAAO,EAAE,mBAAmB,EAAE,GAAG,MAAM,EAAE,CAAC;AAAA,EACjD;AAAA,EAEA,oBAA0B;AACxB,QAAI,CAAC,KAAK,eAAe,KAAK,UAAU,MAAM;AAC5C,UAAI,KAAK,WAAW,SAAS,KAAK,KAAK,SAAS,OAAO,GAAG;AACxD,gBAAQ;AAAA,UACN,wBAAwB,KAAK,WAAW,MAAM,eACzC,KAAK,SAAS,IAAI;AAAA,QAEzB;AAAA,MACF;AACA;AAAA,IACF;AACA,UAAM,SAAS,KAAK;AACpB,SAAK,aAAa,CAAC;AACnB,eAAW,QAAQ,QAAQ;AACzB,WAAK,OAAO,EAAE,oBAAoB,EAAE,GAAG,KAAK,MAAM,EAAE,CAAC;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,OAAO,KAAoB;AACzB,QAAI,CAAC,KAAK,eAAe,KAAK,UAAU,KAAM;AAC9C,QAAI;AACF,WAAK,MAAM,MAAM,GAAG;AAAA,IACtB,QAAQ;AAAA,IAGR;AAAA,EACF;AAAA,EAEA,MAAM,YAA2B;AAC/B,QAAI,KAAK,UAAU,KAAM;AACzB,UAAM,CAAC,SAAS,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC5C;AAAA;AAAA,QAA0B;AAAA,MAAe;AAAA,MACzC;AAAA;AAAA,QAA0B;AAAA,MAAoB;AAAA,IAChD,CAAC;AACD,SAAK,QAAQ;AAKb,UAAM,SAAS,SAAS;AAAA,MACtB;AAAA,MACA,EAAE,UAAU,MAAM,OAAO,QAAQ,OAAO,QAAQ,UAAU,MAAM,QAAQ,KAAK;AAAA,IAC/E;AACA,UAAM,MAAM,QAAQ,sBAAsB,MAAM;AAGhD,SAAK,eAAe,IAAI,MAAM,GAAG;AAAA,EACnC;AAAA,EAEA,MAAM,aAA4B;AAChC,SAAK,UAAU,YAAY;AAC3B,UAAM,OAAO,KAAK;AAClB,UAAM,OAAO,KAAK;AAClB,QAAI,SAAS,QAAQ,SAAS,KAAM,OAAM,IAAI,MAAM,iBAAiB;AAErE,UAAM,eAAe,KAAK,SACtB,KAAK,YAAY,UAAU,IAC3B,KAAK,YAAY,eAAe;AAEpC,UAAM,OAAO,IAAI,KAAK,GAAG,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,cAAc;AAAA,MAC/D,0BAA0B;AAAA,MAC1B,6BAA6B;AAAA,MAC7B,uCAAuC;AAAA,IACzC,CAAC;AAYD,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,YAAM,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,iBAAiB;AAC7D,YAAM,eAAgB,KAEnB;AACH,UAAI,OAAO,iBAAiB,YAAY;AAGtC,gBAAQ;AACR;AAAA,MACF;AACA,mBAAa,KAAK,MAAM,UAAU,CAAC,UAAkB;AACnD,YAAI,MAAO,QAAO,KAAK;AAAA,YAClB,SAAQ;AAAA,MACf,CAAC;AAAA,IACH,CAAC;AAED,UAAM,WAAW,IAAI,KAAK,SAAS;AACnC,aAAS,IAAI,iBAAiB,UAAU,KAAK,aAAa,MAAM,EAAE;AAClE,aAAS,IAAI,eAAe,KAAK,aAAa,QAAQ;AACtD,aAAS,IAAI,iBAAiB,KAAK,aAAa,UAAU;AAE1D,UAAM,OAAQ,KAAK,QAAQ,EAAiC,QAAQ;AACpE,SAAK,GAAG,QAAQ,CAAC,QAAQ,KAAK,eAAe,GAA8B,CAAC;AAC5E,SAAK,GAAG,SAAS,CAAC,QAAQ;AAGxB,YAAM,cAAc,mBAAmB,GAAG;AAC1C,UAAI,gBAAgB,MAAM;AACxB,aAAK,kBAAkB,WAAW;AAClC;AAAA,MACF;AACA,WAAK,KAAK,kBAAkB,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,IACrD,CAAC;AACD,SAAK,GAAG,OAAO,MAAM;AAAE,WAAK,KAAK,kBAAkB,cAAc;AAAA,IAAG,CAAC;AAoBrE,SAAK,QAAQ;AACb,SAAK,UAAU,WAAW;AAC1B,SAAK,qBAAqB;AAC1B,SAAK,cAAc,KAAK,IAAI;AAG5B,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,eAAe,KAAoC;AACjD,UAAM,MAAM,IAAI,WAAW;AAC3B,QAAI,KAAK;AACP,iBAAW,MAAM,IAAI,aAAa,CAAC,EAAG,MAAK,SAAS,OAAO,EAAE;AAC7D;AAAA,IACF;AACA,QAAI,IAAI,gBAAgB,GAAG;AACzB,WAAK,cAAc,IAAI,gBAAgB,CAA4B;AACnE;AAAA,IACF;AACA,QAAI,IAAI,gBAAgB,GAAG;AACzB,WAAK,cAAc,KAAK,IAAI;AAC5B,WAAK,oBAAoB;AACzB;AAAA,IACF;AACA,UAAM,SAAS,IAAI,QAAQ;AAC3B,QAAI,QAAQ,gBAAgB,WAAW;AACrC,WAAK,KAAK,kBAAkB,uBAAuB;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,cAAc,QAAuC;AACnD,UAAM,aAAa,OAAO,OAAO,aAAa,KAAK,EAAE,KAAK;AAC1D,UAAM,iBAAiB,OAAO,OAAO,8BAA8B,KAAK,EAAE;AAE1E,QAAI,eAAe,wBAAyB,MAAK,OAAO,QAAQ,YAAY,cAAc;AAE1F,QAAI,eAAe,uBAAuB,mBAAmB,IAAI;AAK/D,WAAK,SAAS,qBAAqB,gBAAgB,MAAM;AAAA,IAC3D;AAGA,SAAK,SAAS,YAAY,MAAM;AAAA,EAClC;AAAA,EAEA,OAAO,QAAiC,YAAoB,gBAA8B;AACxF,UAAM,cAA8D,CAAC;AACrE,eAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,OAAO,eAAe,KAAK,CAAC,CAAC,GAAG;AACxE,YAAM,QAAS,MAAqD;AACpE,kBAAY,IAAI,IAAI,SAAS,CAAC;AAAA,IAChC;AAEA,UAAM,UAAU,OAAO,OAAO,kBAAkB,KAAK,CAAC;AACtD,SAAK,OAAO,MAAM;AAAA,MAChB,UAAU,OAAO,OAAO,WAAW,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA,MAI1C,UACE,OAAO,OAAO,sBAAsB,KAAK,EAAE,KAC3C,OAAO,OAAO,0BAA0B,KAAK,EAAE,KAC/C;AAAA,MACF,gBAAgB,kBAAkB;AAAA;AAAA;AAAA;AAAA,MAIlC,WAAW,OAAO,OAAO,yBAAyB,KAAK,EAAE,KAAK;AAAA,MAC9D;AAAA;AAAA,MAEA,gBAAgB,UAAU,IAAI,KAAK,IAAI,SAAS,eAAe,IAAI;AAAA,MACnE;AAAA,MACA,eAAe;AAAA,QACb,GAAK,OAAO,gBAAgB,KAA8B,CAAC;AAAA,QAC3D,GAAK,OAAO,iBAAiB,KAA8B,CAAC;AAAA,MAC9D;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,kBAAkB,OAAyB;AACzC,SAAK,aAAa;AAClB,SAAK,qBAAqB;AAC1B,SAAK,eAAe;AACpB,SAAK,WAAW;AAChB,SAAK,UAAU,cAAc;AAAA,EAC/B;AAAA,EAEA,MAAM,kBAAkB,SAAgC;AACtD,QAAI,KAAK,mBAAoB;AAE7B,SAAK,WAAW;AAChB,SAAK,UAAU,cAAc;AAE7B,QAAI,KAAK,sBAAsB,wBAAwB;AACrD,WAAK,UAAU,cAAc;AAC7B;AAAA,IACF;AAIA,UAAM,QAAQ,KAAK;AAAA,MACjB,kBAAkB,KAAK,KAAK,qBAAqB,KAAK,OAAO,IAAI;AAAA,MACjE;AAAA,IACF;AACA,SAAK,sBAAsB;AAE3B,UAAM,KAAK,OAAO,KAAK;AACvB,QAAI,KAAK,mBAAoB;AAC7B,QAAI;AACF,YAAM,KAAK,WAAW;AAAA,IACxB,SAAS,OAAO;AACd,UAAI,aAAa,KAAK,GAAG;AACvB,aAAK,kBAAkB,KAAmB;AAC1C;AAAA,MACF;AACA,WAAK,KAAK,kBAAkB,kBAAkB;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,kBAAwB;AACtB,SAAK,kBAAkB,YAAY,MAAM;AACvC,UAAI,CAAC,KAAK,eAAe,KAAK,UAAU,KAAM;AAC9C,YAAM,MAAM,KAAK,IAAI;AAErB,UAAI,MAAM,KAAK,cAAc,sBAAsB;AACjD,aAAK,qBAAqB;AAC1B,YAAI,KAAK,qBAAqB,uBAAuB;AACnD,eAAK,KAAK,kBAAkB,mBAAmB;AAC/C;AAAA,QACF;AAAA,MACF;AACA,UAAI;AACF,aAAK,MAAM,MAAM,EAAE,gBAAgB,EAAE,cAAc,IAAI,EAAE,CAAC;AAAA,MAC5D,QAAQ;AACN,aAAK,KAAK,kBAAkB,uBAAuB;AAAA,MACrD;AAAA,IACF,GAAG,qBAAqB;AAGxB,SAAK,gBAAgB,QAAQ;AAAA,EAC/B;AAAA,EAEA,iBAAuB;AACrB,QAAI,KAAK,oBAAoB,MAAM;AACjC,oBAAc,KAAK,eAAe;AAClC,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,aAAmB;AACjB,QAAI;AACF,WAAK,OAAO,IAAI;AAAA,IAClB,QAAQ;AAAA,IAER;AACA,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,UAAU,OAA0B;AAClC,SAAK,SAAS;AACd,SAAK,SAAS,gBAAgB,KAAK;AAAA,EACrC;AACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/scaler/maximem_synap/synap/sdk/js/dist/chunk-IA2N5NUY.cjs","../src/grpc/descriptor.ts","../src/grpc/stream-client.ts"],"names":[],"mappings":"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","file":"/Users/scaler/maximem_synap/synap/sdk/js/dist/chunk-IA2N5NUY.cjs","sourcesContent":[null,"/**\n * GENERATED FILE. Do not edit by hand.\n *\n * Source: synap/proto/synap_service.proto\n * Generator: synap/sdk/scripts/gen_proto_descriptor.mjs\n * Proto SHA: c1d834043608ad4f\n *\n * The proto is inlined as a JSON descriptor rather than loaded from disk so\n * that bundlers and Vercel file tracing cannot lose it. Regenerate with\n * `npm run sync-behavior` in synap/sdk/js.\n */\n\n/** sha256 (first 16 hex chars) of the proto this descriptor was built from. */\nexport const PROTO_SHA = 'c1d834043608ad4f';\n\nexport const SYNAP_PROTO_DESCRIPTOR = {\n \"nested\": {\n \"synap\": {\n \"nested\": {\n \"v1\": {\n \"nested\": {\n \"SynapService\": {\n \"methods\": {\n \"Listen\": {\n \"requestType\": \"StreamEvent\",\n \"requestStream\": true,\n \"responseType\": \"StreamResponse\",\n \"responseStream\": true\n },\n \"IngestTelemetry\": {\n \"requestType\": \"TelemetryEvent\",\n \"requestStream\": true,\n \"responseType\": \"TelemetryAck\"\n }\n }\n },\n \"StreamEvent\": {\n \"oneofs\": {\n \"payload\": {\n \"oneof\": [\n \"conversation_event\",\n \"heartbeat_ping\",\n \"session_control\",\n \"context_used\",\n \"context_assembled\"\n ]\n }\n },\n \"fields\": {\n \"conversation_event\": {\n \"type\": \"ConversationEvent\",\n \"id\": 1\n },\n \"heartbeat_ping\": {\n \"type\": \"HeartbeatPing\",\n \"id\": 2\n },\n \"session_control\": {\n \"type\": \"SessionControl\",\n \"id\": 3\n },\n \"context_used\": {\n \"type\": \"ContextUsedEvent\",\n \"id\": 4\n },\n \"context_assembled\": {\n \"type\": \"ContextAssembledEvent\",\n \"id\": 5\n }\n }\n },\n \"ContextUsedEvent\": {\n \"fields\": {\n \"bundle_id\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"conversation_id\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"user_id\": {\n \"type\": \"string\",\n \"id\": 3\n },\n \"customer_id\": {\n \"type\": \"string\",\n \"id\": 4\n },\n \"served_item_ids\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 5\n },\n \"timestamp_ms\": {\n \"type\": \"int64\",\n \"id\": 6\n },\n \"scope\": {\n \"type\": \"string\",\n \"id\": 7\n },\n \"source_bundle_ids\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 8\n }\n }\n },\n \"ContextAssembledEvent\": {\n \"fields\": {\n \"correlation_id\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"conversation_id\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"user_id\": {\n \"type\": \"string\",\n \"id\": 3\n },\n \"customer_id\": {\n \"type\": \"string\",\n \"id\": 4\n },\n \"final_item_ids\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 5\n },\n \"final_total_tokens\": {\n \"type\": \"int32\",\n \"id\": 6\n },\n \"compaction_id\": {\n \"type\": \"string\",\n \"id\": 7\n },\n \"recent_turn_count\": {\n \"type\": \"int32\",\n \"id\": 8\n },\n \"compaction_end_timestamp\": {\n \"type\": \"string\",\n \"id\": 9\n },\n \"assembly_source\": {\n \"type\": \"string\",\n \"id\": 10\n },\n \"assembly_duration_ms\": {\n \"type\": \"int32\",\n \"id\": 11\n },\n \"cache_hit\": {\n \"type\": \"bool\",\n \"id\": 12\n },\n \"timestamp_ms\": {\n \"type\": \"int64\",\n \"id\": 13\n },\n \"sdk_version\": {\n \"type\": \"string\",\n \"id\": 14\n }\n }\n },\n \"ConversationEvent\": {\n \"fields\": {\n \"event_type\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"conversation_id\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"user_id\": {\n \"type\": \"string\",\n \"id\": 3\n },\n \"role\": {\n \"type\": \"string\",\n \"id\": 4\n },\n \"content\": {\n \"type\": \"string\",\n \"id\": 5\n },\n \"customer_id\": {\n \"type\": \"string\",\n \"id\": 6\n },\n \"session_id\": {\n \"type\": \"string\",\n \"id\": 7\n },\n \"metadata\": {\n \"keyType\": \"string\",\n \"type\": \"string\",\n \"id\": 8\n },\n \"timestamp_ms\": {\n \"type\": \"int64\",\n \"id\": 9\n },\n \"tool_name\": {\n \"type\": \"string\",\n \"id\": 10\n },\n \"tool_args_json\": {\n \"type\": \"string\",\n \"id\": 11\n },\n \"tool_result_json\": {\n \"type\": \"string\",\n \"id\": 15\n },\n \"tool_call_id\": {\n \"type\": \"string\",\n \"id\": 16\n },\n \"search_queries\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 12\n },\n \"context_types\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 13\n },\n \"scope\": {\n \"keyType\": \"string\",\n \"type\": \"string\",\n \"id\": 14\n },\n \"event_id\": {\n \"type\": \"string\",\n \"id\": 17\n },\n \"sent_at_ms\": {\n \"type\": \"int64\",\n \"id\": 18\n }\n }\n },\n \"HeartbeatPing\": {\n \"fields\": {\n \"timestamp_ms\": {\n \"type\": \"int64\",\n \"id\": 1\n }\n }\n },\n \"SessionControl\": {\n \"fields\": {\n \"action\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"session_id\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"conversation_id\": {\n \"type\": \"string\",\n \"id\": 3\n },\n \"user_id\": {\n \"type\": \"string\",\n \"id\": 4\n },\n \"customer_id\": {\n \"type\": \"string\",\n \"id\": 5\n }\n }\n },\n \"StreamResponse\": {\n \"oneofs\": {\n \"payload\": {\n \"oneof\": [\n \"context_bundle\",\n \"heartbeat_pong\",\n \"signal\",\n \"event_ack\"\n ]\n }\n },\n \"fields\": {\n \"context_bundle\": {\n \"type\": \"ContextBundleProto\",\n \"id\": 1\n },\n \"heartbeat_pong\": {\n \"type\": \"HeartbeatPong\",\n \"id\": 2\n },\n \"signal\": {\n \"type\": \"StreamSignal\",\n \"id\": 3\n },\n \"event_ack\": {\n \"type\": \"EventAck\",\n \"id\": 4\n }\n }\n },\n \"EventAck\": {\n \"fields\": {\n \"event_ids\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 1\n },\n \"timestamp_ms\": {\n \"type\": \"int64\",\n \"id\": 2\n }\n }\n },\n \"HeartbeatPong\": {\n \"fields\": {\n \"timestamp_ms\": {\n \"type\": \"int64\",\n \"id\": 1\n }\n }\n },\n \"StreamSignal\": {\n \"fields\": {\n \"signal_type\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"reason\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"metadata\": {\n \"keyType\": \"string\",\n \"type\": \"string\",\n \"id\": 3\n }\n }\n },\n \"ContextBundleProto\": {\n \"fields\": {\n \"bundle_id\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"decision_id\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"items_by_type\": {\n \"keyType\": \"string\",\n \"type\": \"ContextItemList\",\n \"id\": 3\n },\n \"total_tokens\": {\n \"type\": \"int32\",\n \"id\": 4\n },\n \"token_budget\": {\n \"type\": \"int32\",\n \"id\": 5\n },\n \"budget_exceeded\": {\n \"type\": \"bool\",\n \"id\": 6\n },\n \"retrieval_mode\": {\n \"type\": \"string\",\n \"id\": 7\n },\n \"sources_queried\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 8\n },\n \"degradation_level\": {\n \"type\": \"string\",\n \"id\": 9\n },\n \"warnings\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 10\n },\n \"created_at\": {\n \"type\": \"string\",\n \"id\": 11\n },\n \"retrieval_time_ms\": {\n \"type\": \"int32\",\n \"id\": 12\n },\n \"cache_hit\": {\n \"type\": \"bool\",\n \"id\": 13\n },\n \"search_queries\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 14\n },\n \"anticipation_user_id\": {\n \"type\": \"string\",\n \"id\": 15\n },\n \"anticipation_customer_id\": {\n \"type\": \"string\",\n \"id\": 16\n },\n \"anticipation_conversation_id\": {\n \"type\": \"string\",\n \"id\": 17\n },\n \"search_keywords\": {\n \"rule\": \"repeated\",\n \"type\": \"string\",\n \"id\": 18\n },\n \"bundle_type\": {\n \"type\": \"string\",\n \"id\": 19\n },\n \"conversation_context\": {\n \"type\": \"ConversationContextProto\",\n \"id\": 20\n },\n \"bundle_confidence\": {\n \"type\": \"float\",\n \"id\": 21\n },\n \"origin_pattern_id\": {\n \"type\": \"string\",\n \"id\": 22\n },\n \"ttl_hint_seconds\": {\n \"type\": \"int32\",\n \"id\": 23\n },\n \"anticipation_scope_rung\": {\n \"type\": \"string\",\n \"id\": 24\n }\n }\n },\n \"ConversationContextProto\": {\n \"fields\": {\n \"summary\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"current_state_json\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"key_extractions_json\": {\n \"type\": \"string\",\n \"id\": 3\n },\n \"recent_turns\": {\n \"rule\": \"repeated\",\n \"type\": \"RecentTurnProto\",\n \"id\": 4\n },\n \"compaction_id\": {\n \"type\": \"string\",\n \"id\": 5\n },\n \"compacted_at\": {\n \"type\": \"string\",\n \"id\": 6\n },\n \"conversation_id\": {\n \"type\": \"string\",\n \"id\": 7\n }\n }\n },\n \"RecentTurnProto\": {\n \"fields\": {\n \"role\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"content\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"timestamp\": {\n \"type\": \"string\",\n \"id\": 3\n }\n }\n },\n \"ContextItemList\": {\n \"fields\": {\n \"items\": {\n \"rule\": \"repeated\",\n \"type\": \"ContextItemProto\",\n \"id\": 1\n }\n }\n },\n \"ContextItemProto\": {\n \"fields\": {\n \"item_id\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"content\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"context_type\": {\n \"type\": \"string\",\n \"id\": 3\n },\n \"source\": {\n \"type\": \"string\",\n \"id\": 4\n },\n \"similarity_score\": {\n \"type\": \"float\",\n \"id\": 5\n },\n \"relevance_score\": {\n \"type\": \"float\",\n \"id\": 6\n },\n \"confidence\": {\n \"type\": \"float\",\n \"id\": 7\n },\n \"scope\": {\n \"type\": \"string\",\n \"id\": 8\n },\n \"entity_id\": {\n \"type\": \"string\",\n \"id\": 9\n },\n \"created_at\": {\n \"type\": \"string\",\n \"id\": 10\n },\n \"event_date\": {\n \"type\": \"string\",\n \"id\": 11\n },\n \"valid_until\": {\n \"type\": \"string\",\n \"id\": 12\n },\n \"temporal_category\": {\n \"type\": \"string\",\n \"id\": 13\n },\n \"temporal_confidence\": {\n \"type\": \"float\",\n \"id\": 14\n }\n }\n },\n \"TelemetryEvent\": {\n \"fields\": {\n \"event_type\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"instance_id\": {\n \"type\": \"string\",\n \"id\": 2\n },\n \"client_id\": {\n \"type\": \"string\",\n \"id\": 3\n },\n \"correlation_id\": {\n \"type\": \"string\",\n \"id\": 4\n },\n \"timestamp_ms\": {\n \"type\": \"int64\",\n \"id\": 5\n },\n \"latency_ms\": {\n \"type\": \"int32\",\n \"id\": 6\n },\n \"status\": {\n \"type\": \"string\",\n \"id\": 7\n },\n \"error_code\": {\n \"type\": \"string\",\n \"id\": 8\n },\n \"scope\": {\n \"type\": \"string\",\n \"id\": 9\n },\n \"cache_status\": {\n \"type\": \"string\",\n \"id\": 10\n },\n \"attempt\": {\n \"type\": \"int32\",\n \"id\": 11\n },\n \"http_method\": {\n \"type\": \"string\",\n \"id\": 12\n },\n \"http_path\": {\n \"type\": \"string\",\n \"id\": 13\n },\n \"http_status_code\": {\n \"type\": \"int32\",\n \"id\": 14\n },\n \"metadata\": {\n \"keyType\": \"string\",\n \"type\": \"string\",\n \"id\": 15\n },\n \"sdk_version\": {\n \"type\": \"string\",\n \"id\": 16\n },\n \"batch_id\": {\n \"type\": \"string\",\n \"id\": 17\n }\n }\n },\n \"TelemetryAck\": {\n \"fields\": {\n \"status\": {\n \"type\": \"string\",\n \"id\": 1\n },\n \"events_received\": {\n \"type\": \"int32\",\n \"id\": 2\n }\n }\n }\n }\n }\n }\n }\n }\n} as const;\n","/**\n * Bidirectional gRPC stream client for the Synap anticipation channel.\n *\n * Mirrors Python's `GRPCTransport` and the synap-vercel-adk client:\n * - `/synap.v1.SynapService/Listen`, StreamEvent in, StreamResponse out\n * - Auth via `authorization: Bearer <key>` plus `x-client-id` / `x-instance-id`\n * - 30s heartbeat, exponential-backoff reconnect\n * - Server pushes ContextBundleProto, which lands in the AnticipationCache\n *\n * Node-only, and reached exclusively through a lazy `import()` so that merely\n * importing the SDK on Edge or in a Worker stays safe. grpc-js is built on\n * `node:http2`/`node:net`/`node:tls`; a static import fails the BUILD there.\n *\n * The proto arrives as an inlined descriptor (see ./descriptor.ts) rather than\n * being read from disk, so bundlers and Vercel file tracing cannot lose it.\n */\n\nimport type { AnticipationCache } from '../context/anticipation-cache.js';\nimport { SYNAP_PROTO_DESCRIPTOR } from './descriptor.js';\nimport { newCorrelationId } from '../util/correlation.js';\nimport { InsufficientCreditsError, RateLimitError, type SynapError } from '../errors.js';\n\nexport type StreamState =\n | 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'closed';\n\n/**\n * The ONLY bundle type the cache refuses.\n *\n * NOTE: this deliberately differs from the synap-vercel-adk stream client,\n * which caches an allowlist of `anticipation` and `user_summary` and drops\n * compaction updates. Python's `_handle_anticipated_bundle` stores everything\n * except `reactive`, and Python is the reference implementation, so an\n * allowlist here would silently cache less than the pip SDK does.\n *\n * Reactive bundles are excluded because they answer a fetch that already\n * happened; caching one serves a stale answer to a different question.\n */\nconst UNCACHEABLE_BUNDLE_TYPE = 'reactive';\n\n// Mirrors the Python GRPCTransport constants.\nconst MAX_RECONNECT_ATTEMPTS = 10;\nconst BACKOFF_BASE_MS = 1_000;\nconst BACKOFF_MAX_MS = 30_000;\nconst HEARTBEAT_INTERVAL_MS = 30_000;\nconst HEARTBEAT_TIMEOUT_MS = 10_000;\nconst MAX_MISSED_HEARTBEATS = 3;\n\n// The outbound buffer, same shape and same numbers as Python's transport\n// (SEND_QUEUE_MAX_DEPTH / SEND_QUEUE_MAX_AGE). Events written while the stream\n// is down were silently dropped here: `#write` returned early and said nothing,\n// so a reconnect lost every turn that happened during it.\nconst SEND_QUEUE_MAX_DEPTH = 100;\n// How long disconnect() waits for the server to finish reading after the\n// half-close. Matches Python's CLOSE_GRACE.\nconst CLOSE_GRACE_MS = 2_000;\nconst SEND_QUEUE_MAX_AGE_MS = 5 * 60 * 1_000;\n// How long disconnect() waits for the buffer to go out. Short: a shutdown path\n// that blocks is worse than a lost event.\nconst CLOSE_FLUSH_TIMEOUT_MS = 2_000;\n/** The server may only SHORTEN the SDK default, never extend it past this floor. */\nconst MIN_TTL_SECONDS = 60;\n\nexport interface StreamCredentials {\n apiKey: string;\n clientId: string;\n instanceId: string;\n}\n\nexport interface StreamClientOptions {\n host?: string;\n port?: number;\n useTls?: boolean;\n /** Injected in tests so reconnect backoff does not make the suite slow. */\n sleep?: (ms: number) => Promise<void>;\n /** How long to wait for the channel to become ready. Default 10s. */\n connectTimeoutMs?: number;\n onStateChange?: (state: StreamState) => void;\n /** Fires for every bundle, before the cache filter. Backs `listen({onContext})`. */\n onContext?: (bundle: Record<string, unknown>) => void;\n /** Fires only for `compaction_update` bundles. Backs the compaction subscriptions. */\n onCompactionUpdate?: (conversationId: string, bundle: Record<string, unknown>) => void;\n}\n\n/**\n * grpc-js status code for RESOURCE_EXHAUSTED. Hard-coded rather than read from\n * `grpc.status`, because this module is loaded before grpc-js on some paths and\n * the numbers are fixed by the gRPC spec.\n */\nconst GRPC_RESOURCE_EXHAUSTED = 8;\n\n/**\n * The credit gate refuses a call with RESOURCE_EXHAUSTED, these details, and\n * the balance and reason in trailing metadata. See\n * synap/cloud/application/credits/grpc_gate.py.\n */\nexport const CREDIT_ABORT_DETAILS = 'insufficient_credits';\n\n/**\n * Reasons that end the stream. A reconnect re-runs the same gate with the same\n * balance, so retrying only delays the answer the caller needs. Mirrors\n * `CREDIT_STOP_REASONS` in `transport/grpc_client.py`.\n */\nexport const CREDIT_STOP_REASONS = new Set([\n 'overages_disabled',\n 'trial_limit_reached',\n 'subscription_inactive',\n]);\n\nfunction metadataValue(metadata: unknown, key: string): string | null {\n if (metadata === null || typeof metadata !== 'object') return null;\n const getter = (metadata as { get?: (k: string) => unknown }).get;\n const raw = typeof getter === 'function'\n ? getter.call(metadata, key)\n : (metadata as Record<string, unknown>)[key];\n const value = Array.isArray(raw) ? raw[0] : raw;\n if (value === undefined || value === null) return null;\n const text = typeof value === 'string' ? value : String(value);\n return text === '' ? null : text;\n}\n\nfunction numberOrNull(value: string | null): number | null {\n if (value === null) return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\n/**\n * Translate a credit refusal into the same error HTTP would have raised.\n *\n * RESOURCE_EXHAUSTED on its own is indistinguishable from server overload, so\n * this keys on `credit-reason`: `overages_disabled` is an\n * `InsufficientCreditsError` (permanent, a paid plan at zero that has not\n * allowed usage past zero), while `trial_limit_reached` and\n * `subscription_inactive` are a `RateLimitError`. Returns null for anything\n * else, including a RESOURCE_EXHAUSTED that is not a credit refusal and a\n * reason this SDK does not know: the caller then keeps its existing behaviour\n * of treating the abort as transient. Mirrors `credit_error_from_rpc`.\n */\nexport function creditErrorFromRpc(\n error: unknown,\n correlationId: string | null = null,\n): SynapError | null {\n if (error === null || typeof error !== 'object') return null;\n if ((error as { code?: unknown }).code !== GRPC_RESOURCE_EXHAUSTED) return null;\n\n const metadata = (error as { metadata?: unknown }).metadata;\n const reason = metadataValue(metadata, 'credit-reason');\n if (reason === null || !CREDIT_STOP_REASONS.has(reason)) return null;\n\n const rawDetails = (error as { details?: unknown }).details;\n const details = typeof rawDetails === 'string' && rawDetails !== ''\n ? rawDetails\n : CREDIT_ABORT_DETAILS;\n const requestId = metadataValue(metadata, 'request-id') ?? correlationId;\n const manageUrl = metadataValue(metadata, 'credit-manage-url');\n\n if (reason === 'overages_disabled') {\n return new InsufficientCreditsError(details, {\n correlationId: requestId,\n balanceCredits: numberOrNull(metadataValue(metadata, 'credit-balance')),\n requiredCredits: numberOrNull(metadataValue(metadata, 'credit-minimum-required')),\n recoveryUrl: metadataValue(metadata, 'credit-recovery-url'),\n redeemUrl: metadataValue(metadata, 'credit-redeem-url'),\n reason,\n manageUrl,\n });\n }\n\n return new RateLimitError(details, {\n correlationId: requestId,\n reason,\n upgradeUrl: metadataValue(metadata, 'credit-upgrade-url'),\n manageUrl,\n });\n}\n\n/** True for an error this module raised from a credit refusal. */\nexport function isCreditStop(error: unknown): boolean {\n if (!(error instanceof InsufficientCreditsError) && !(error instanceof RateLimitError)) {\n return false;\n }\n const reason = (error as { reason?: unknown }).reason;\n return typeof reason === 'string' && CREDIT_STOP_REASONS.has(reason);\n}\n\ninterface DuplexCall {\n write: (msg: unknown) => void;\n on: (event: string, handler: (arg?: unknown) => void) => void;\n end: () => void;\n}\n\nexport interface ConversationEventInput {\n event_type: string;\n conversation_id?: string;\n user_id?: string;\n customer_id?: string;\n role?: string;\n content?: string;\n session_id?: string;\n metadata?: Record<string, string>;\n timestamp_ms?: number;\n /** proto: ConversationEvent.tool_name */\n tool_name?: string;\n /** proto: ConversationEvent.tool_args_json. Python sends json.dumps(tool_args). */\n tool_args_json?: string;\n /**\n * proto: ConversationEvent.tool_result_json. A result is not a message, so\n * it does not ride in `content`; a string is sent as itself rather than as a\n * quoted JSON string, matching Python.\n */\n tool_result_json?: string;\n /** proto: ConversationEvent.tool_call_id. Ties a result to its call. */\n tool_call_id?: string;\n search_queries?: string[];\n context_types?: string[];\n /**\n * proto: ConversationEvent.event_id. Minted here when absent, and the SAME\n * id travels on every replay — that is what the server's dedupe matches, so\n * a retry cannot double a turn.\n */\n event_id?: string;\n /** proto: ConversationEvent.sent_at_ms. When we FIRST tried, not when it happened. */\n sent_at_ms?: number;\n}\n\nexport class GrpcStreamClient {\n readonly host: string;\n readonly port: number;\n readonly useTls: boolean;\n\n #state: StreamState = 'disconnected';\n #call: DuplexCall | null = null;\n #reconnectAttempts = 0;\n #lastPongAt = 0;\n #missedHeartbeats = 0;\n #heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n #shutdownRequested = false;\n // Events that could not be written because there was no stream.\n #sendQueue: Array<{ queuedAt: number; event: ConversationEventInput }> = [];\n // Events written to a live stream that the server has not acknowledged. The\n // queue above covers \"the stream was down\"; this covers the half that\n // actually loses sessions — the write succeeded, the stream broke before the\n // server processed it, and nobody knows.\n #unacked = new Map<string, { queuedAt: number; event: ConversationEventInput }>();\n // Why the stream stopped, when it stopped for a reason the caller can act on\n // (today: a credit refusal). Mirrors Python's `last_error`.\n #lastError: SynapError | null = null;\n\n #grpc: typeof import('@grpc/grpc-js') | null = null;\n #ServiceStub: (new (target: string, creds: unknown, opts: unknown) => Record<string, unknown>) | null = null;\n\n readonly #credentials: StreamCredentials;\n readonly #cache: AnticipationCache;\n readonly #options: StreamClientOptions;\n readonly #sleep: (ms: number) => Promise<void>;\n readonly #connectTimeoutMs: number;\n\n constructor(\n credentials: StreamCredentials,\n cache: AnticipationCache,\n options: StreamClientOptions = {},\n ) {\n this.#credentials = credentials;\n this.#cache = cache;\n this.#options = options;\n this.host = options.host ?? 'synap-cloud-prod.maximem.ai';\n this.port = options.port ?? 443;\n this.useTls = options.useTls ?? true;\n this.#sleep = options.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));\n this.#connectTimeoutMs = options.connectTimeoutMs ?? 10_000;\n }\n\n get currentState(): StreamState { return this.#state; }\n get isConnected(): boolean { return this.#state === 'connected'; }\n\n /**\n * The error that ended the stream, if one did.\n *\n * Set when the server refused the stream for credits, so an `onDisconnect`\n * handler can read the balance, the reason and the URL to fix it. Null for an\n * ordinary disconnect.\n */\n get lastError(): SynapError | null { return this.#lastError; }\n\n async connect(): Promise<void> {\n await this.#loadGrpc();\n this.#shutdownRequested = false;\n this.#lastError = null;\n await this.#establish();\n this.#startHeartbeat();\n }\n\n async disconnect(): Promise<void> {\n // Stop the heartbeat first: it writes, and a write after the half-close\n // below is an error.\n this.#shutdownRequested = true;\n this.#stopHeartbeat();\n\n // What is still buffered goes out before the half-close.\n this.#flushBeforeClose();\n\n // ⚠ `end()` half-closes the write side, which is right, but on its own it\n // is not enough. It used to return immediately and the process would exit\n // while the server was still reading, so the events were written and never\n // processed. Waiting for the server to finish its side is what makes the\n // half-close mean anything.\n //\n // Bounded, because a shutdown that hangs on a dead network is its own kind\n // of broken, and whatever misses the deadline is reported rather than lost\n // silently. See `undelivered()`.\n const call = this.#call;\n if (call !== null) {\n try { call.end(); } catch { /* already torn down */ }\n await new Promise<void>((resolve) => {\n let settled = false;\n const done = () => { if (!settled) { settled = true; resolve(); } };\n const timer = setTimeout(() => {\n const left = this.undelivered();\n if (left.unacknowledged > 0 || left.queued > 0) {\n console.warn(\n `[synap] closing with ${left.queued} queued and `\n + `${left.unacknowledged} unacknowledged event(s) the server did `\n + `not confirm within ${CLOSE_GRACE_MS}ms`,\n );\n }\n done();\n }, CLOSE_GRACE_MS);\n if (typeof timer.unref === 'function') timer.unref();\n call.on('end', () => { clearTimeout(timer); done(); });\n call.on('status', () => { clearTimeout(timer); done(); });\n call.on('error', () => { clearTimeout(timer); done(); });\n });\n }\n\n this.#call = null;\n this.#setState('closed');\n }\n\n /**\n * What this client could not get to the server.\n *\n * Every send path returns void, so a caller had no way to tell a delivered\n * turn from a lost one. Mirrors Python's `undelivered()`.\n */\n undelivered(): { queued: number; unacknowledged: number } {\n return { queued: this.#sendQueue.length, unacknowledged: this.#unacked.size };\n }\n\n /**\n * Never fails the caller's turn, and no longer loses it either.\n *\n * A write that cannot go out is buffered and replayed on reconnect, and a\n * write that does go out is held until the server acknowledges it. Before\n * this, both cases ended at a silent `return`.\n */\n sendConversationEvent(event: ConversationEventInput): void {\n const stamped: ConversationEventInput = {\n ...event,\n event_id: event.event_id && event.event_id !== '' ? event.event_id : newCorrelationId(),\n sent_at_ms: event.sent_at_ms ?? Date.now(),\n };\n if (!this.isConnected || this.#call === null) {\n this.#enqueue(stamped);\n return;\n }\n this.#write({ conversation_event: { ...stamped } });\n this.#trackUnacked(stamped);\n }\n\n #enqueue(event: ConversationEventInput): void {\n this.#pruneQueue();\n if (this.#sendQueue.length >= SEND_QUEUE_MAX_DEPTH) {\n const evicted = this.#sendQueue.shift();\n console.warn(\n `[synap] send queue full (max=${SEND_QUEUE_MAX_DEPTH}); dropping oldest `\n + `event (event_type=${evicted?.event.event_type})`,\n );\n }\n this.#sendQueue.push({ queuedAt: Date.now(), event });\n }\n\n #pruneQueue(): void {\n const cutoff = Date.now() - SEND_QUEUE_MAX_AGE_MS;\n while (this.#sendQueue.length > 0 && (this.#sendQueue[0]?.queuedAt ?? 0) < cutoff) {\n const expired = this.#sendQueue.shift();\n console.warn(\n `[synap] queued event expired (age>${SEND_QUEUE_MAX_AGE_MS}ms); dropping `\n + `(event_type=${expired?.event.event_type})`,\n );\n }\n }\n\n #trackUnacked(event: ConversationEventInput): void {\n const id = event.event_id;\n if (id === undefined || id === '') return;\n const cutoff = Date.now() - SEND_QUEUE_MAX_AGE_MS;\n for (const [oldestId, held] of this.#unacked) {\n if (held.queuedAt >= cutoff && this.#unacked.size < SEND_QUEUE_MAX_DEPTH) break;\n this.#unacked.delete(oldestId);\n console.warn(\n '[synap] unacknowledged event dropped: the server never confirmed it '\n + `(event_type=${held.event.event_type})`,\n );\n }\n this.#unacked.set(id, { queuedAt: Date.now(), event });\n }\n\n /**\n * Replay what the server never confirmed, then what never went out.\n *\n * That order is the order things happened in: an unacked event was written\n * to the previous stream, so it is older than anything that piled up while\n * there was no stream at all. Safe to repeat — every event carries the id it\n * was first sent with and the server drops a second sighting of it.\n */\n #replayBuffered(): void {\n const unacked = [...this.#unacked.values()];\n const queued = this.#sendQueue;\n this.#sendQueue = [];\n for (const held of [...unacked, ...queued]) {\n this.#write({ conversation_event: { ...held.event } });\n }\n if (unacked.length > 0 || queued.length > 0) {\n console.warn(\n `[synap] replayed ${unacked.length} unacknowledged and ${queued.length} `\n + 'queued event(s) after reconnect',\n );\n }\n }\n\n sendSessionControl(input: {\n action: string;\n session_id?: string;\n conversation_id?: string;\n user_id?: string;\n customer_id?: string;\n }): void {\n this.#write({ session_control: { ...input } });\n }\n\n sendContextUsed(event: Record<string, unknown>): void {\n this.#write({ context_used: { ...event } });\n }\n\n sendContextAssembled(event: Record<string, unknown>): void {\n this.#write({ context_assembled: { ...event } });\n }\n\n #flushBeforeClose(): void {\n if (!this.isConnected || this.#call === null) {\n if (this.#sendQueue.length > 0 || this.#unacked.size > 0) {\n console.warn(\n `[synap] closing with ${this.#sendQueue.length} queued and `\n + `${this.#unacked.size} unacknowledged event(s) and no stream to send `\n + 'them on; they are lost',\n );\n }\n return;\n }\n const queued = this.#sendQueue;\n this.#sendQueue = [];\n for (const held of queued) {\n this.#write({ conversation_event: { ...held.event } });\n }\n }\n\n #write(msg: unknown): void {\n if (!this.isConnected || this.#call === null) return;\n try {\n this.#call.write(msg);\n } catch {\n // Non-fatal. These are telemetry and control events; losing one is\n // strictly better than surfacing a stream hiccup to the caller.\n }\n }\n\n async #loadGrpc(): Promise<void> {\n if (this.#grpc !== null) return;\n const [grpcMod, protoMod] = await Promise.all([\n import(/* @vite-ignore */ '@grpc/grpc-js'),\n import(/* @vite-ignore */ '@grpc/proto-loader'),\n ]);\n this.#grpc = grpcMod;\n\n // `fromJSON`, not `loadSync`: no path, no disk read, nothing for a bundler\n // to fail to trace. `keepCase` keeps the snake_case field names the server\n // and the Python SDK both use.\n const pkgDef = protoMod.fromJSON(\n SYNAP_PROTO_DESCRIPTOR as unknown as Parameters<typeof protoMod.fromJSON>[0],\n { keepCase: true, longs: Number, enums: String, defaults: true, oneofs: true },\n );\n const pkg = grpcMod.loadPackageDefinition(pkgDef) as unknown as {\n synap: { v1: { SynapService: new (t: string, c: unknown, o: unknown) => Record<string, unknown> } };\n };\n this.#ServiceStub = pkg.synap.v1.SynapService;\n }\n\n async #establish(): Promise<void> {\n this.#setState('connecting');\n const grpc = this.#grpc;\n const Stub = this.#ServiceStub;\n if (grpc === null || Stub === null) throw new Error('gRPC not loaded');\n\n const channelCreds = this.useTls\n ? grpc.credentials.createSsl()\n : grpc.credentials.createInsecure();\n\n const stub = new Stub(`${this.host}:${this.port}`, channelCreds, {\n 'grpc.keepalive_time_ms': 30_000,\n 'grpc.keepalive_timeout_ms': 10_000,\n 'grpc.keepalive_permit_without_calls': 1,\n });\n\n // Wait for the channel before reporting success.\n //\n // grpc-js connects LAZILY: constructing the stub and creating the call both\n // return immediately, and a bad host surfaces later through the call's\n // 'error' event. Without this, `await listen()` resolved against an\n // unreachable port, `is_listening` read true for a stream that never\n // connected, and `send_message()` then dropped every event silently,\n // because sends are deliberately fire-and-forget. Failing loudly here is\n // the difference between a clear error and an agent that looks like it has\n // no memory.\n await new Promise<void>((resolve, reject) => {\n const deadline = new Date(Date.now() + this.#connectTimeoutMs);\n const waitForReady = (stub as unknown as {\n waitForReady?: (d: Date, cb: (e?: Error) => void) => void;\n }).waitForReady;\n if (typeof waitForReady !== 'function') {\n // Older grpc-js, or a stub that does not expose it. Fall back to the\n // lazy behaviour rather than failing outright.\n resolve();\n return;\n }\n waitForReady.call(stub, deadline, (error?: Error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n\n const metadata = new grpc.Metadata();\n metadata.add('authorization', `Bearer ${this.#credentials.apiKey}`);\n metadata.add('x-client-id', this.#credentials.clientId);\n metadata.add('x-instance-id', this.#credentials.instanceId);\n\n const call = (stub['Listen'] as (m: unknown) => DuplexCall)(metadata);\n call.on('data', (msg) => this.#handleMessage(msg as Record<string, unknown>));\n call.on('error', (err) => {\n // A credit refusal arrives here, not from waitForReady: the channel is\n // healthy and the gate aborts the call itself.\n const creditError = creditErrorFromRpc(err);\n if (creditError !== null) {\n this.#handleCreditStop(creditError);\n return;\n }\n void this.#handleDisconnect(`error: ${String(err)}`);\n });\n call.on('end', () => { void this.#handleDisconnect('server_close'); });\n\n // NOTE, and this is where JS and Python legitimately differ.\n //\n // Python waits on `call.wait_for_connection()` here, because grpc.aio\n // reports CONNECTED off a call object the server has not accepted and\n // events written in that window were written into a buffer that the close\n // then discarded.\n //\n // grpc-js has no equivalent, and the obvious stand-in does not work: a\n // grpc-js server sends no initial metadata until it writes, so waiting on\n // the 'metadata' event stalls for the whole connect timeout on a server\n // that is perfectly healthy. Measured: it made every test here time out.\n //\n // It is also not needed. grpc-js buffers writes on the call and flushes\n // them once the call is established, so an event written this early is not\n // lost by the write. It is lost by the TEARDOWN, which is what\n // `disconnect()` now fixes: half-close, then wait for the server to finish\n // reading. The parity is in the outcome the tests assert, a whole turn\n // reaching the server with no pause anywhere, not in the mechanism.\n this.#call = call;\n this.#setState('connected');\n this.#reconnectAttempts = 0;\n this.#lastPongAt = Date.now();\n // Before anything else on the new stream: the turns that happened while\n // there was not one.\n this.#replayBuffered();\n }\n\n #handleMessage(msg: Record<string, unknown>): void {\n const ack = msg['event_ack'] as { event_ids?: string[] } | undefined;\n if (ack) {\n for (const id of ack.event_ids ?? []) this.#unacked.delete(id);\n return;\n }\n if (msg['context_bundle']) {\n this.#handleBundle(msg['context_bundle'] as Record<string, unknown>);\n return;\n }\n if (msg['heartbeat_pong']) {\n this.#lastPongAt = Date.now();\n this.#missedHeartbeats = 0;\n return;\n }\n const signal = msg['signal'] as { signal_type?: string } | undefined;\n if (signal?.signal_type === 'closing') {\n void this.#handleDisconnect('server_signal_closing');\n }\n }\n\n #handleBundle(bundle: Record<string, unknown>): void {\n const bundleType = String(bundle['bundle_type'] ?? '') || 'anticipation';\n const conversationId = String(bundle['anticipation_conversation_id'] ?? '');\n\n if (bundleType !== UNCACHEABLE_BUNDLE_TYPE) this.#store(bundle, bundleType, conversationId);\n\n if (bundleType === 'compaction_update' && conversationId !== '') {\n // Python also deletes this conversation's `compacted_full` /\n // `compacted_context` entries from its separate CacheManager. This SDK\n // has no such cache, and calling dropConversation() here would delete\n // the bundle just stored above, so there is nothing to invalidate.\n this.#options.onCompactionUpdate?.(conversationId, bundle);\n }\n\n // Fires for every type, after storing, matching Python's ordering.\n this.#options.onContext?.(bundle);\n }\n\n #store(bundle: Record<string, unknown>, bundleType: string, conversationId: string): void {\n const itemsByType: Record<string, Array<Record<string, unknown>>> = {};\n for (const [type, list] of Object.entries(bundle['items_by_type'] ?? {})) {\n const items = (list as { items?: Array<Record<string, unknown>> })?.items;\n itemsByType[type] = items ?? [];\n }\n\n const ttlHint = Number(bundle['ttl_hint_seconds'] ?? 0);\n this.#cache.store({\n bundleId: String(bundle['bundle_id'] ?? ''),\n // The cache keys on ONE entity. User id wins when present, so a bundle\n // pushed for a user cannot be served to a different user in the same\n // customer; falling back to customer id keeps org-scope bundles usable.\n entityId:\n String(bundle['anticipation_user_id'] ?? '') ||\n String(bundle['anticipation_customer_id'] ?? '') ||\n null,\n conversationId: conversationId || null,\n // The rung the server retrieved this bundle at. Absent from anything an\n // older server sent, and absent reads as \"named no rung\" rather than as\n // \"matches anything\".\n scopeRung: String(bundle['anticipation_scope_rung'] ?? '') || null,\n itemsByType,\n // 0 means \"use the SDK default\"; anything else is floored at 60s.\n ttlHintSeconds: ttlHint > 0 ? Math.max(ttlHint, MIN_TTL_SECONDS) : null,\n bundleType,\n searchQueries: [\n ...((bundle['search_queries'] as string[] | undefined) ?? []),\n ...((bundle['search_keywords'] as string[] | undefined) ?? []),\n ],\n });\n }\n\n /**\n * End the stream because the server refused it for credits.\n *\n * Reconnecting cannot clear a credit refusal, so the stream closes and the\n * typed error is kept on `lastError` for the application to read. Mirrors\n * Python's `_handle_credit_stop`.\n */\n #handleCreditStop(error: SynapError): void {\n this.#lastError = error;\n this.#shutdownRequested = true;\n this.#stopHeartbeat();\n this.#closeCall();\n this.#setState('disconnected');\n }\n\n async #handleDisconnect(_reason: string): Promise<void> {\n if (this.#shutdownRequested) return;\n\n this.#closeCall();\n this.#setState('reconnecting');\n\n if (this.#reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {\n this.#setState('disconnected');\n return;\n }\n\n // Jittered exponential backoff. The jitter matters with many SDK instances\n // behind one deploy: without it they all retry in lockstep.\n const delay = Math.min(\n BACKOFF_BASE_MS * 2 ** this.#reconnectAttempts + Math.random() * 1_000,\n BACKOFF_MAX_MS,\n );\n this.#reconnectAttempts += 1;\n\n await this.#sleep(delay);\n if (this.#shutdownRequested) return;\n try {\n await this.#establish();\n } catch (error) {\n if (isCreditStop(error)) {\n this.#handleCreditStop(error as SynapError);\n return;\n }\n void this.#handleDisconnect('reconnect_failed');\n }\n }\n\n #startHeartbeat(): void {\n this.#heartbeatTimer = setInterval(() => {\n if (!this.isConnected || this.#call === null) return;\n const now = Date.now();\n\n if (now - this.#lastPongAt > HEARTBEAT_TIMEOUT_MS) {\n this.#missedHeartbeats += 1;\n if (this.#missedHeartbeats >= MAX_MISSED_HEARTBEATS) {\n void this.#handleDisconnect('heartbeat_timeout');\n return;\n }\n }\n try {\n this.#call.write({ heartbeat_ping: { timestamp_ms: now } });\n } catch {\n void this.#handleDisconnect('heartbeat_write_error');\n }\n }, HEARTBEAT_INTERVAL_MS);\n // Never hold the process open on the heartbeat alone: a CLI that finishes\n // its work should exit, not hang for 30s.\n this.#heartbeatTimer.unref?.();\n }\n\n #stopHeartbeat(): void {\n if (this.#heartbeatTimer !== null) {\n clearInterval(this.#heartbeatTimer);\n this.#heartbeatTimer = null;\n }\n }\n\n #closeCall(): void {\n try {\n this.#call?.end();\n } catch {\n /* already torn down */\n }\n this.#call = null;\n }\n\n #setState(state: StreamState): void {\n this.#state = state;\n this.#options.onStateChange?.(state);\n }\n}\n"]}
@@ -1,16 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
-
3
-
4
-
5
-
6
-
7
- var _chunkIA2N5NUYcjs = require('./chunk-IA2N5NUY.cjs');
8
- require('./chunk-T372OL3Q.cjs');
9
-
10
-
11
-
12
-
13
-
14
-
15
- exports.CREDIT_ABORT_DETAILS = _chunkIA2N5NUYcjs.CREDIT_ABORT_DETAILS; exports.CREDIT_STOP_REASONS = _chunkIA2N5NUYcjs.CREDIT_STOP_REASONS; exports.GrpcStreamClient = _chunkIA2N5NUYcjs.GrpcStreamClient; exports.creditErrorFromRpc = _chunkIA2N5NUYcjs.creditErrorFromRpc; exports.isCreditStop = _chunkIA2N5NUYcjs.isCreditStop;
16
- //# sourceMappingURL=stream-client-Y5JGSF2R.cjs.map