@indexnetwork/protocol 3.1.1-rc.251.1 → 3.2.0-rc.252.1

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.
@@ -1,5 +1,5 @@
1
1
  import { ProfileDocument } from "./profile.generator.js";
2
- import { ProfileGraphDatabase } from "../shared/interfaces/database.interface.js";
2
+ import { ProfileGraphDatabase, PremiseProvenance } from "../shared/interfaces/database.interface.js";
3
3
  import { Scraper } from "../shared/interfaces/scraper.interface.js";
4
4
  import type { ProfileEnricher } from "../shared/interfaces/enrichment.interface.js";
5
5
  import type { QuestionerEnqueueFn } from "../questioner/questioner.types.js";
@@ -14,6 +14,8 @@ export interface CompiledPremiseGraph {
14
14
  assertionText: string;
15
15
  tier: 'assertive' | 'contextual';
16
16
  operationMode: 'create';
17
+ provenanceSource?: PremiseProvenance['source'];
18
+ provenanceSourceId?: string;
17
19
  }): Promise<{
18
20
  premise?: {
19
21
  id: string;
@@ -50,6 +52,7 @@ export declare class ProfileGraphFactory {
50
52
  isAggregate: boolean;
51
53
  objective: string | undefined;
52
54
  input: string | undefined;
55
+ activeSocialIds: string[];
53
56
  profile: ProfileDocument | undefined;
54
57
  needsProfileGeneration: boolean;
55
58
  needsUserInfo: boolean;
@@ -81,6 +84,7 @@ export declare class ProfileGraphFactory {
81
84
  isAggregate?: boolean | import("@langchain/langgraph").OverwriteValue<boolean> | undefined;
82
85
  objective?: string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined;
83
86
  input?: string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined;
87
+ activeSocialIds?: string[] | import("@langchain/langgraph").OverwriteValue<string[]> | undefined;
84
88
  profile?: ProfileDocument | import("@langchain/langgraph").OverwriteValue<ProfileDocument | undefined> | undefined;
85
89
  needsProfileGeneration?: boolean | import("@langchain/langgraph").OverwriteValue<boolean> | undefined;
86
90
  needsUserInfo?: boolean | import("@langchain/langgraph").OverwriteValue<boolean> | undefined;
@@ -132,6 +136,7 @@ export declare class ProfileGraphFactory {
132
136
  isAggregate: import("@langchain/langgraph").BaseChannel<boolean, boolean | import("@langchain/langgraph").OverwriteValue<boolean>, unknown>;
133
137
  objective: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
134
138
  input: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
139
+ activeSocialIds: import("@langchain/langgraph").BaseChannel<string[], string[] | import("@langchain/langgraph").OverwriteValue<string[]>, unknown>;
135
140
  profile: import("@langchain/langgraph").BaseChannel<ProfileDocument | undefined, ProfileDocument | import("@langchain/langgraph").OverwriteValue<ProfileDocument | undefined> | undefined, unknown>;
136
141
  needsProfileGeneration: import("@langchain/langgraph").BaseChannel<boolean, boolean | import("@langchain/langgraph").OverwriteValue<boolean>, unknown>;
137
142
  needsUserInfo: import("@langchain/langgraph").BaseChannel<boolean, boolean | import("@langchain/langgraph").OverwriteValue<boolean>, unknown>;
@@ -199,6 +204,7 @@ export declare class ProfileGraphFactory {
199
204
  isAggregate: import("@langchain/langgraph").BaseChannel<boolean, boolean | import("@langchain/langgraph").OverwriteValue<boolean>, unknown>;
200
205
  objective: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
201
206
  input: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
207
+ activeSocialIds: import("@langchain/langgraph").BaseChannel<string[], string[] | import("@langchain/langgraph").OverwriteValue<string[]>, unknown>;
202
208
  profile: import("@langchain/langgraph").BaseChannel<ProfileDocument | undefined, ProfileDocument | import("@langchain/langgraph").OverwriteValue<ProfileDocument | undefined> | undefined, unknown>;
203
209
  needsProfileGeneration: import("@langchain/langgraph").BaseChannel<boolean, boolean | import("@langchain/langgraph").OverwriteValue<boolean>, unknown>;
204
210
  needsUserInfo: import("@langchain/langgraph").BaseChannel<boolean, boolean | import("@langchain/langgraph").OverwriteValue<boolean>, unknown>;
@@ -304,15 +310,18 @@ export declare class ProfileGraphFactory {
304
310
  error?: undefined;
305
311
  objective?: undefined;
306
312
  input?: undefined;
313
+ activeSocialIds?: undefined;
307
314
  operationsPerformed?: undefined;
308
315
  } | {
309
316
  error: string;
310
317
  objective?: undefined;
311
318
  input?: undefined;
319
+ activeSocialIds?: undefined;
312
320
  operationsPerformed?: undefined;
313
321
  } | {
314
322
  objective: string;
315
323
  input: string;
324
+ activeSocialIds: string[];
316
325
  operationsPerformed: {
317
326
  scraped: boolean;
318
327
  };
@@ -363,6 +372,7 @@ export declare class ProfileGraphFactory {
363
372
  needsProfileGeneration?: undefined;
364
373
  operationsPerformed?: undefined;
365
374
  forceUpdate?: undefined;
375
+ activeSocialIds?: undefined;
366
376
  } | {
367
377
  input: string;
368
378
  needsUserInfo: boolean;
@@ -372,11 +382,13 @@ export declare class ProfileGraphFactory {
372
382
  };
373
383
  error?: undefined;
374
384
  forceUpdate?: undefined;
385
+ activeSocialIds?: undefined;
375
386
  } | {
376
387
  input: string;
377
388
  needsUserInfo: boolean;
378
389
  needsProfileGeneration: boolean;
379
390
  forceUpdate: boolean;
391
+ activeSocialIds: string[];
380
392
  operationsPerformed: {
381
393
  scraped: boolean;
382
394
  };
@@ -1 +1 @@
1
- {"version":3,"file":"profile.graph.d.ts","sourceRoot":"/","sources":["profile/profile.graph.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAiB,MAAM,4CAA4C,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,2CAA2C,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAIpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAG7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAItE;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,KAAK,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,WAAW,GAAG,YAAY,CAAC;QACjC,aAAa,EAAE,QAAQ,CAAC;KACzB,GAAG,OAAO,CAAC;QACV,OAAO,CAAC,EAAE;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAC;QACrC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC5B,CAAC,CAAC;CACJ;AA+BD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ,CAAC;IACjB,OAAO,CAAC,iBAAiB,CAAC;IAC1B,OAAO,CAAC,YAAY,CAAC;gBAJb,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,eAAe,YAAA,EAC1B,iBAAiB,CAAC,EAAE,mBAAmB,YAAA,EACvC,YAAY,CAAC,EAAE,oBAAoB,YAAA;IAGtC,WAAW;;;;;;;;;;;;;;;;;;;;;;kBAI0B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAD,CAAC;;;;;;;;;;;kBAAD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAD,CAAC;;;;;;;;;;;kBAAD,CAAC;;;;;;;;;;;kBAAD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAD,CAAC;;;;;;;;;;;kBAAD,CAAC;;;;;;;;;;;kBAAD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAk4B9C"}
1
+ {"version":3,"file":"profile.graph.d.ts","sourceRoot":"/","sources":["profile/profile.graph.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAiB,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AACpH,OAAO,EAAE,OAAO,EAAE,MAAM,2CAA2C,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAIpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAG7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAItE;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,KAAK,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,WAAW,GAAG,YAAY,CAAC;QACjC,aAAa,EAAE,QAAQ,CAAC;QACxB,gBAAgB,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC/C,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,GAAG,OAAO,CAAC;QACV,OAAO,CAAC,EAAE;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAC;QACrC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC5B,CAAC,CAAC;CACJ;AA+BD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ,CAAC;IACjB,OAAO,CAAC,iBAAiB,CAAC;IAC1B,OAAO,CAAC,YAAY,CAAC;gBAJb,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,eAAe,YAAA,EAC1B,iBAAiB,CAAC,EAAE,mBAAmB,YAAA,EACvC,YAAY,CAAC,EAAE,oBAAoB,YAAA;IAGtC,WAAW;;;;;;;;;;;;;;;;;;;;;;;kBAWV,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAD,CAAC;;;;;;;;;;;kBAAD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAD,CAAC;;;;;;;;;;;kBAAD,CAAC;;;;;;;;;;;kBAAD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAD,CAAC;;;;;;;;;;;kBAAD,CAAC;;;;;;;;;;;kBAAD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAg4BV"}
@@ -274,6 +274,7 @@ export class ProfileGraphFactory {
274
274
  return {
275
275
  objective,
276
276
  input: scrapedData,
277
+ activeSocialIds: socials.map(s => s.id),
277
278
  operationsPerformed: { scraped: true }
278
279
  };
279
280
  }
@@ -428,6 +429,7 @@ export class ProfileGraphFactory {
428
429
  needsUserInfo: false,
429
430
  needsProfileGeneration: true,
430
431
  forceUpdate: true,
432
+ activeSocialIds: socials.map(s => s.id),
431
433
  operationsPerformed: { scraped: true },
432
434
  };
433
435
  }
@@ -690,6 +692,9 @@ export class ProfileGraphFactory {
690
692
  assertionText: p.text,
691
693
  tier: p.tier,
692
694
  operationMode: 'create',
695
+ ...(state.activeSocialIds?.length
696
+ ? { provenanceSource: 'integration', provenanceSourceId: state.activeSocialIds[0] }
697
+ : {}),
693
698
  });
694
699
  if (premiseResult.premise) {
695
700
  created++;
@@ -1 +1 @@
1
- {"version":3,"file":"profile.graph.js","sourceRoot":"/","sources":["profile/profile.graph.ts"],"names":[],"mappings":"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","sourcesContent":["import { StateGraph, START, END } from \"@langchain/langgraph\";\nimport { ProfileGraphState } from \"./profile.state.js\";\nimport { ProfileGenerator, ProfileDocument } from \"./profile.generator.js\";\nimport { ProfileGraphDatabase, PremiseRecord } from \"../shared/interfaces/database.interface.js\";\nimport { Scraper } from \"../shared/interfaces/scraper.interface.js\";\nimport type { ProfileEnricher } from \"../shared/interfaces/enrichment.interface.js\";\nimport { shouldEnrichGhostDisplayNameFromParallel, isEnrichedNameMeaningful } from \"./profile.enricher.js\";\nimport { socialsToEnrichmentRequest } from \"../shared/utils/social-label.js\";\nimport { protocolLogger } from \"../shared/observability/protocol.logger.js\";\nimport type { QuestionerEnqueueFn } from \"../questioner/questioner.types.js\";\nimport { timed } from \"../shared/observability/performance.js\";\nimport { requestContext } from \"../shared/observability/request-context.js\";\nimport type { DebugMetaAgent } from \"../chat/chat-streaming.types.js\";\nimport { PremiseDecomposer } from \"../premise/premise.decomposer.js\";\nimport { invokeWithAbortSignal } from \"../shared/agent/model-signal.js\";\n\n/**\n * Compiled premise graph interface. Matches the invoke signature of a compiled LangGraph.\n * Accepted as an optional dependency so write-mode input can be decomposed into premises.\n */\nexport interface CompiledPremiseGraph {\n invoke(input: {\n userId: string;\n assertionText: string;\n tier: 'assertive' | 'contextual';\n operationMode: 'create';\n }): Promise<{\n premise?: { id: string } | undefined;\n error?: string | undefined;\n }>;\n}\n\nconst logger = protocolLogger(\"ProfileGraphFactory\");\n\n/** Minimum length for input to be considered meaningful (e.g. not just \"Yes\") */\nconst MIN_MEANINGFUL_INPUT_LENGTH = 20;\n\n/** Phrases that are confirmations only and must not be used as profile content */\nconst CONFIRMATION_PHRASES = new Set([\n \"yes\", \"yeah\", \"yep\", \"sure\", \"ok\", \"okay\", \"go ahead\", \"do it\", \"please\",\n \"correct\", \"right\", \"exactly\", \"absolutely\", \"of course\", \"sounds good\",\n \"create one\", \"create it\", \"set one up\", \"set it up\", \"create my profile\",\n \"create profile\", \"set up profile\", \"create a profile\"\n]);\n\n/**\n * Returns true only if the input contains real profile information.\n * Confirmation-only replies (e.g. \"Yes\" to \"Would you like to create a profile?\")\n * must not be treated as input so we ask for user info / use scraper instead of inventing a profile.\n */\nfunction isMeaningfulProfileInput(input: string | undefined): boolean {\n if (!input || typeof input !== \"string\") return false;\n const trimmed = input.trim();\n if (trimmed.length < MIN_MEANINGFUL_INPUT_LENGTH) return false;\n const lower = trimmed.toLowerCase();\n if (CONFIRMATION_PHRASES.has(lower)) return false;\n if (CONFIRMATION_PHRASES.has(lower.replace(/[.!?]+$/, \"\"))) return false;\n return true;\n}\n\n\n/**\n * Factory class to build and compile the Profile Generation Graph.\n *\n * Flow:\n * 1. check_state - Detect whether profile needs generation\n * 2. Conditional routing based on operation mode and missing components:\n * - Query mode: Return immediately (fast path)\n * - Write mode: Generate only what's needed\n * 3. Profile generation (if needed)\n * 4. Save profile to DB\n *\n * Key Features:\n * - Read/Write separation (query vs write)\n * - Conditional generation (skip generation if profile already exists)\n */\nexport class ProfileGraphFactory {\n constructor(\n private database: ProfileGraphDatabase,\n private scraper: Scraper,\n private enricher?: ProfileEnricher,\n private questionerEnqueue?: QuestionerEnqueueFn,\n private premiseGraph?: CompiledPremiseGraph,\n ) { }\n\n public createGraph() {\n const profileGenerator = new ProfileGenerator();\n const premiseDecomposer = new PremiseDecomposer();\n\n // ─────────────────────────────────────────────────────────\n // NODE: Check State\n // Loads existing profile from DB and detects what needs generation:\n // - Profile missing\n // - User information insufficient for scraping\n // ─────────────────────────────────────────────────────────\n const checkStateNode = async (state: typeof ProfileGraphState.State) => {\n return timed(\"ProfileGraph.checkState\", async () => {\n if (!state.userId) {\n logger.error(\"Missing userId\");\n return {\n error: \"userId is required\"\n };\n }\n\n logger.verbose(\"Checking profile state...\", {\n userId: state.userId,\n operationMode: state.operationMode,\n forceUpdate: state.forceUpdate\n });\n\n try {\n const profile = await this.database.getProfile(state.userId) as any;\n\n // Query mode: Just return the profile (fast path)\n if (state.operationMode === 'query') {\n logger.verbose(\"🚀 Query mode - returning existing profile (fast path)\", {\n hasProfile: !!profile\n });\n const profileWithId = profile ? await this.database.getProfileByUserId(state.userId) : null;\n return {\n profile: profile || undefined,\n readResult: profile\n ? {\n hasProfile: true,\n profile: {\n id: profileWithId?.id,\n name: profile.identity?.name,\n bio: profile.identity?.bio,\n location: profile.identity?.location,\n skills: profile.attributes?.skills,\n interests: profile.attributes?.interests,\n },\n }\n : {\n hasProfile: false,\n message:\n \"You don't have a profile yet. Would you like to create one? You can share your LinkedIn, GitHub, or X/Twitter profile, or just tell me about yourself.\",\n },\n };\n }\n\n // Write mode: Detect what needs generation\n // Treat confirmation-only input (e.g. \"Yes\") as no input so we ask for info / use scraper\n const hasMeaningfulInput = !!state.input && isMeaningfulProfileInput(state.input);\n const needsProfileGeneration = !profile || (state.forceUpdate && hasMeaningfulInput);\n\n // Check if we need to scrape (profile generation needed but no meaningful input provided)\n const willNeedScraping = needsProfileGeneration && !hasMeaningfulInput;\n\n // If we need to scrape, check if we have sufficient user information\n let needsUserInfo = false;\n let missingUserInfo: string[] = [];\n\n if (willNeedScraping) {\n logger.verbose(\"Will need scraping - checking user information...\");\n\n const user = await this.database.getUser(state.userId);\n\n if (!user) {\n logger.error(\"User not found\", { userId: state.userId });\n return {\n error: `User not found: ${state.userId}`\n };\n }\n\n // Check what information we have from the user table (schema: users)\n // Required fields: email, name (always present)\n // Optional fields: intro, avatar, location, socials\n\n const socials = await this.database.getUserSocials(state.userId);\n const hasSocials = socials.length > 0;\n\n // Check if name is a full name (not just email username)\n // For scraping to work well, we need first + last name\n const hasMeaningfulName = user.name &&\n user.name.trim() !== '' &&\n !user.name.includes('@') &&\n user.name.split(/\\s+/).filter(Boolean).length >= 2;\n\n const hasLocation = !!(user.location && user.location.trim() !== '');\n\n // Minimum requirement for accurate scraping:\n // - At least ONE social link (preferred - most reliable for finding the right person)\n // - OR a full name (first + last) - less reliable but workable\n // Location helps disambiguate but is not required\n\n const hasMinimumInfo = hasSocials || hasMeaningfulName;\n\n if (!hasMinimumInfo) {\n needsUserInfo = true;\n\n // Build precise list of what's missing and would help\n if (!hasSocials) {\n missingUserInfo.push('social_urls');\n }\n if (!hasMeaningfulName) {\n missingUserInfo.push('full_name');\n }\n if (!hasLocation) {\n missingUserInfo.push('location'); // Nice to have\n }\n\n logger.verbose(\"⚠️ Insufficient user information for scraping\", {\n hasSocials,\n hasMeaningfulName,\n hasLocation,\n currentName: user.name,\n missingUserInfo\n });\n } else {\n logger.verbose(\"✅ Sufficient user information for scraping\", {\n hasSocials,\n hasMeaningfulName,\n hasLocation,\n willProceedWith: hasSocials ? 'social links' : 'full name'\n });\n }\n }\n\n logger.verbose(\"📊 State detection complete\", {\n hasProfile: !!profile,\n needsProfileGeneration,\n needsUserInfo,\n missingUserInfo,\n forceUpdate: state.forceUpdate,\n hasInput: !!state.input,\n hasMeaningfulInput,\n });\n\n return {\n profile: profile || undefined,\n needsProfileGeneration,\n needsUserInfo,\n missingUserInfo\n };\n } catch (error) {\n logger.error(\"Failed to load profile\", {\n error: error instanceof Error ? error.message : String(error)\n });\n return {\n profile: undefined,\n error: `Failed to load profile from database: ${error instanceof Error ? error.message : String(error)}`\n };\n }\n });\n };\n\n // ─────────────────────────────────────────────────────────\n // NODE: Scrape\n // Scrapes data from web if input is not provided\n // ─────────────────────────────────────────────────────────\n const scrapeNode = async (state: typeof ProfileGraphState.State) => {\n return timed(\"ProfileGraph.scrape\", async () => {\n if (state.input && isMeaningfulProfileInput(state.input)) {\n logger.verbose(\"Meaningful input already provided - skipping scrape\");\n return {};\n }\n\n logger.verbose(\"Starting web scrape...\", {\n userId: state.userId\n });\n\n try {\n // Fetch user details to construct objective for web scraping\n const user = await this.database.getUser(state.userId);\n\n if (!user) {\n logger.error(\"User not found\", { userId: state.userId });\n return {\n error: `User not found: ${state.userId}`\n };\n }\n\n // Build scraping objective from available user information\n // Priority: social links (most reliable) > name + location > email\n const socialParts: string[] = [];\n const socials = await this.database.getUserSocials(state.userId);\n for (const s of socials) {\n switch (s.label) {\n case 'twitter': socialParts.push(`X/Twitter: ${s.value}`); break;\n case 'linkedin': socialParts.push(`LinkedIn: ${s.value}`); break;\n case 'github': socialParts.push(`GitHub: ${s.value}`); break;\n case 'telegram': socialParts.push(`Telegram: ${s.value}`); break;\n default: socialParts.push(`Website: ${s.value}`); break;\n }\n }\n\n // Construct objective based on what we have\n let objective = `Find information about ${user.name || 'this person'}`;\n\n if (user.location) {\n objective += ` located in ${user.location}`;\n }\n\n objective += '.\\n\\n';\n\n if (socialParts.length > 0) {\n objective += `Their social profiles:\\n${socialParts.join('\\n')}\\n\\n`;\n objective += 'Use these links to find accurate information about their professional background, skills, and interests.';\n } else if (user.email) {\n objective += `Their email: ${user.email}\\n\\n`;\n objective += 'Search for professional information, skills, and background about this person.';\n } else {\n objective += 'Search for professional information and background about this person.';\n }\n\n logger.verbose(\"Constructed scraping objective\", {\n hasSocials: socialParts.length > 0,\n hasLocation: !!user.location,\n objectivePreview: objective.substring(0, 100)\n });\n\n const scrapedData = await this.scraper.scrape(objective);\n\n logger.verbose(\"✅ Scrape complete\", {\n dataLength: scrapedData?.length || 0\n });\n\n return {\n objective,\n input: scrapedData,\n operationsPerformed: { scraped: true }\n };\n } catch (error) {\n logger.error(\"Scrape failed\", {\n error: error instanceof Error ? error.message : String(error)\n });\n return {\n error: `Web scrape failed: ${error instanceof Error ? error.message : String(error)}`\n };\n }\n });\n };\n\n // ─────────────────────────────────────────────────────────\n // NODE: Auto-Generate (Parallel Chat API enrichment)\n // Calls enrichUserProfile to get structured data, then builds a\n // text blob as input for the decompose → aggregate → generate\n // pipeline. This ensures enriched users get premises with\n // embeddings, making them discoverable via premise-to-premise\n // matching.\n // On failure, falls back to basic user info for LLM generation.\n // Used in 'generate' mode only.\n // ─────────────────────────────────────────────────────────\n const autoGenerateNode = async (state: typeof ProfileGraphState.State) => {\n return timed(\"ProfileGraph.autoGenerate\", async () => {\n logger.verbose(\"Starting auto-generate via Chat API enrichment\", {\n userId: state.userId,\n });\n\n try {\n const user = await this.database.getUser(state.userId);\n if (!user) {\n logger.error(\"User not found for auto-generate\", { userId: state.userId });\n return { error: `User not found: ${state.userId}` };\n }\n\n const socials = await this.database.getUserSocials(state.userId);\n const enrichmentSocials = socialsToEnrichmentRequest(socials);\n const request = {\n name: user.name || undefined,\n email: user.email || undefined,\n linkedin: enrichmentSocials.linkedin || undefined,\n twitter: enrichmentSocials.twitter || undefined,\n github: enrichmentSocials.github || undefined,\n telegram: enrichmentSocials.telegram || undefined,\n websites: enrichmentSocials.websites?.length ? enrichmentSocials.websites : undefined,\n };\n\n const buildBasicInfo = () => {\n const parts = [\n user.name ? `Name: ${user.name}` : '',\n user.email ? `Email: ${user.email}` : '',\n user.location ? `Location: ${user.location}` : '',\n user.intro ? `Bio: ${user.intro}` : '',\n ].filter(Boolean).join('\\n');\n return parts || \"No information available\";\n };\n\n if (!this.enricher) {\n logger.warn(\"No enricher configured — falling back to basic info\", { userId: state.userId });\n return {\n input: buildBasicInfo(),\n needsUserInfo: false,\n needsProfileGeneration: true,\n operationsPerformed: { scraped: true },\n };\n }\n\n try {\n const enrichment = await this.enricher.enrichUserProfile(request);\n\n if (enrichment && !enrichment.isHuman) {\n logger.info(\"Enrichment detected non-human entity, soft-deleting ghost\", { userId: state.userId });\n await this.database.softDeleteGhost(state.userId);\n return { error: \"Non-human entity detected\" };\n }\n\n const hasMeaningfulEnrichment = !!enrichment &&\n enrichment.confidentMatch &&\n (\n enrichment.identity.bio.trim().length > 0 ||\n enrichment.narrative.context.trim().length > 0 ||\n enrichment.attributes.skills.length > 0 ||\n enrichment.attributes.interests.length > 0\n );\n\n if (hasMeaningfulEnrichment) {\n if (user.isGhost && !isEnrichedNameMeaningful(user.email || '', enrichment!.identity.name || '')) {\n logger.info(\"Enrichment has content but no real name for ghost, soft-deleting\", { userId: state.userId });\n await this.database.softDeleteGhost(state.userId);\n return { error: \"No real name found for ghost user\" };\n }\n\n logger.verbose(\"Chat API enrichment succeeded\", {\n userId: state.userId,\n skillsCount: enrichment!.attributes.skills.length,\n interestsCount: enrichment!.attributes.interests.length,\n });\n\n // Update user record with enriched data\n const updatePayload: {\n name?: string;\n intro?: string;\n location?: string;\n } = {};\n const enrichedName = enrichment!.identity.name?.trim();\n if (\n enrichedName &&\n shouldEnrichGhostDisplayNameFromParallel(\n { isGhost: !!user.isGhost, name: user.name ?? '', email: user.email ?? '' },\n enrichedName,\n )\n ) {\n updatePayload.name = enrichedName;\n }\n if (enrichment!.identity.bio?.trim()) updatePayload.intro = enrichment!.identity.bio.trim();\n if (enrichment!.identity.location?.trim()) updatePayload.location = enrichment!.identity.location.trim();\n\n const enrichedSocials: { label: string; value: string }[] = [];\n if (enrichment!.socials.twitter) enrichedSocials.push({ label: 'twitter', value: enrichment!.socials.twitter });\n if (enrichment!.socials.linkedin) enrichedSocials.push({ label: 'linkedin', value: enrichment!.socials.linkedin });\n if (enrichment!.socials.github) enrichedSocials.push({ label: 'github', value: enrichment!.socials.github });\n if (enrichment!.socials.telegram) enrichedSocials.push({ label: 'telegram', value: enrichment!.socials.telegram });\n if (enrichment!.socials.websites?.length) {\n for (const w of enrichment!.socials.websites) enrichedSocials.push({ label: 'custom', value: w });\n }\n if (enrichedSocials.length > 0) {\n const existingSocials = await this.database.getUserSocials(state.userId);\n const enrichedLabels = new Set(enrichedSocials.map(s => s.label));\n const kept = existingSocials\n .filter(s => !enrichedLabels.has(s.label) || s.label === 'custom')\n .map(s => ({ label: s.label, value: s.value }));\n const merged = enrichedLabels.has('custom')\n ? [...kept.filter(s => s.label !== 'custom'), ...enrichedSocials]\n : [...kept, ...enrichedSocials];\n await this.database.setUserSocials(state.userId, merged);\n }\n\n if (Object.keys(updatePayload).length > 0) {\n await this.database.updateUser(state.userId, updatePayload);\n }\n\n // Post-enrichment dedup: check if this ghost matches an existing user\n if (user.isGhost) {\n const currentSocials = await this.database.getUserSocials(state.userId);\n const duplicate = await this.database.findDuplicateUser(state.userId, currentSocials);\n if (duplicate) {\n logger.info(\"Post-enrichment dedup: merging ghost into existing user\", {\n ghostId: state.userId,\n targetId: duplicate.id,\n });\n await this.database.mergeGhostUser(state.userId, duplicate.id);\n return { error: `Merged as duplicate of user ${duplicate.id}` };\n }\n }\n\n // Build a text blob from the enrichment result so it flows\n // through premise decomposition (when available) rather than\n // bypassing premises via prePopulatedProfile.\n const enrichmentParts = [\n enrichment!.identity.name ? `My name is ${enrichment!.identity.name}.` : '',\n enrichment!.identity.location ? `I am based in ${enrichment!.identity.location}.` : '',\n enrichment!.identity.bio || '',\n enrichment!.narrative.context || '',\n enrichment!.attributes.skills.length ? `My skills include ${enrichment!.attributes.skills.join(', ')}.` : '',\n enrichment!.attributes.interests.length ? `My interests include ${enrichment!.attributes.interests.join(', ')}.` : '',\n ].filter(Boolean).join('\\n');\n\n return {\n input: enrichmentParts,\n needsUserInfo: false,\n needsProfileGeneration: true,\n forceUpdate: true,\n operationsPerformed: { scraped: true },\n };\n }\n\n if (user.isGhost) {\n logger.info(\"Low-confidence enrichment for ghost, soft-deleting\", { userId: state.userId });\n await this.database.softDeleteGhost(state.userId);\n return { error: \"Enrichment not confident for ghost user\" };\n }\n logger.warn(\"Chat API returned low-signal enrichment, falling back to basic info\", { userId: state.userId });\n } catch (enrichErr) {\n if (user.isGhost) {\n logger.info(\"Enrichment failed for ghost, soft-deleting\", { userId: state.userId });\n await this.database.softDeleteGhost(state.userId);\n return { error: \"Enrichment failed for ghost user\" };\n }\n logger.warn(\"Chat API enrichment failed, falling back to basic info\", {\n userId: state.userId,\n error: enrichErr instanceof Error ? enrichErr.message : String(enrichErr),\n });\n }\n\n return {\n input: buildBasicInfo(),\n needsUserInfo: false,\n needsProfileGeneration: true,\n operationsPerformed: { scraped: true },\n };\n } catch (err) {\n logger.error(\"Auto-generate failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n return { error: `Auto-generate failed: ${err instanceof Error ? err.message : String(err)}` };\n }\n });\n };\n\n // ─────────────────────────────────────────────────────────\n // NODE: Generate Profile\n // Generates profile from input using ProfileGenerator agent.\n // If updating existing profile, merges new information intelligently.\n // ─────────────────────────────────────────────────────────\n const generateProfileNode = async (state: typeof ProfileGraphState.State) => {\n return timed(\"ProfileGraph.generateProfile\", async () => {\n if (!state.input) {\n logger.error(\"No input provided for profile generation\");\n return {\n error: \"Input required for profile generation\"\n };\n }\n\n logger.verbose(\"Starting profile generation...\", {\n hasExistingProfile: !!state.profile,\n isUpdate: state.forceUpdate,\n inputLength: state.input.length\n });\n\n const agentTimingsAccum: DebugMetaAgent[] = [];\n\n try {\n // If updating existing profile, include it in the input for context\n let inputWithContext = state.input;\n if (state.profile && state.forceUpdate) {\n if (state.isAggregate) {\n inputWithContext = `EXISTING PROFILE:\\n${JSON.stringify(state.profile, null, 2)}\\n\\nPREMISE SYNTHESIS:\\n${state.input}\\n\\nRegenerate the profile by synthesizing the premises above. Use the existing profile as context for continuity, but the premises are the authoritative source. Output the full updated profile.`;\n logger.verbose(\"Aggregate synthesis with existing profile context\");\n } else {\n inputWithContext = `EXISTING PROFILE:\\n${JSON.stringify(state.profile, null, 2)}\\n\\nUSER REQUEST:\\n${state.input}\\n\\nApply the user's request to the existing profile. Preserve existing data unless the user asks to change or remove it. You may add, update, or remove skills and interests as requested. Output the full updated profile.`;\n logger.verbose(\"Merging with existing profile\");\n }\n }\n\n const _traceEmitterProfileGen = requestContext.getStore()?.traceEmitter;\n const profileGeneratorStart = Date.now();\n _traceEmitterProfileGen?.({ type: \"agent_start\", name: \"profile-generator\" });\n const result = await profileGenerator.invoke(inputWithContext);\n agentTimingsAccum.push({ name: 'profile.generator', durationMs: Date.now() - profileGeneratorStart });\n _traceEmitterProfileGen?.({ type: \"agent_end\", name: \"profile-generator\", durationMs: Date.now() - profileGeneratorStart, summary: `Generated profile for ${result.output.identity.name || \"user\"}` });\n\n logger.verbose(\"✅ Profile generated successfully\", {\n name: result.output.identity.name,\n skillsCount: result.output.attributes.skills.length,\n interestsCount: result.output.attributes.interests.length\n });\n\n return {\n profile: {\n ...result.output,\n userId: state.userId,\n },\n agentTimings: agentTimingsAccum,\n operationsPerformed: { generatedProfile: true }\n };\n } catch (error) {\n logger.error(\"Profile generation failed\", {\n error: error instanceof Error ? error.message : String(error)\n });\n return {\n error: `Profile generation failed: ${error instanceof Error ? error.message : String(error)}`,\n agentTimings: agentTimingsAccum\n };\n }\n });\n };\n\n // ─────────────────────────────────────────────────────────\n // NODE: Save Profile\n // Saves the generated profile to DB (no embedding)\n // ─────────────────────────────────────────────────────────\n const saveProfileNode = async (state: typeof ProfileGraphState.State) => {\n return timed(\"ProfileGraph.saveProfile\", async () => {\n if (!state.profile || !state.profile.identity) {\n logger.error(\"Profile or identity missing in save step\");\n return {\n error: \"Profile missing in save step\"\n };\n }\n\n logger.verbose(\"Saving profile to DB...\", {\n userId: state.userId\n });\n\n try {\n const profile = { ...state.profile };\n\n await this.database.saveProfile(state.userId, profile);\n\n logger.verbose(\"✅ Profile saved successfully\");\n\n // Fetch active premises so the questioner can see what's already covered\n let existingPremises: string[] = [];\n try {\n const activePremises = await this.database.getPremisesForUser(state.userId, 'ACTIVE');\n existingPremises = activePremises.map(p => p.assertion.text);\n logger.verbose(\"Fetched active premises for questioner context\", {\n userId: state.userId,\n count: existingPremises.length,\n });\n } catch (premiseErr) {\n logger.error(\"Failed to fetch premises for questioner context — continuing with empty list\", {\n userId: state.userId,\n error: premiseErr instanceof Error ? premiseErr.message : String(premiseErr),\n });\n }\n\n // Compute profile gaps from missing fields\n const gaps: string[] = [];\n if (!profile.identity?.location) gaps.push('location');\n if (!profile.attributes?.skills?.length) gaps.push('skills');\n if (!profile.attributes?.interests?.length) gaps.push('interests');\n if (!profile.narrative?.context) gaps.push('current work');\n\n if (gaps.length > 0 && this.questionerEnqueue) {\n this.questionerEnqueue({\n mode: 'profile',\n userId: state.userId,\n sourceType: 'profile',\n sourceId: state.userId,\n context: {\n userProfile: {\n name: profile.identity?.name,\n bio: profile.identity?.bio,\n location: profile.identity?.location,\n skills: profile.attributes?.skills,\n interests: profile.attributes?.interests,\n },\n gaps,\n existingPremises,\n },\n }).catch((err) =>\n logger.error('Failed to enqueue profile question generation', { userId: state.userId, error: err })\n );\n }\n\n return {\n profile,\n operationsPerformed: { savedProfile: true }\n };\n } catch (error) {\n logger.error(\"Failed to save profile\", {\n error: error instanceof Error ? error.message : String(error)\n });\n return {\n error: `Failed to save profile: ${error instanceof Error ? error.message : String(error)}`\n };\n }\n });\n };\n\n // ─────────────────────────────────────────────────────────\n // NODE: Aggregate Profile\n // Fetches the user's active premises and synthesizes them into profile input.\n // Sets state.input and flags so the existing generate_profile pipeline runs.\n // ─────────────────────────────────────────────────────────\n const aggregateProfileNode = async (state: typeof ProfileGraphState.State) => {\n return timed(\"ProfileGraph.aggregateProfile\", async () => {\n logger.verbose(\"Aggregating profile from premises...\", { userId: state.userId });\n\n const premises: PremiseRecord[] = await this.database.getPremisesForUser(state.userId, 'ACTIVE');\n\n if (premises.length === 0) {\n logger.verbose(\"No active premises found — skipping aggregate\");\n return { operationMode: 'query' as const };\n }\n\n const premiseTexts = premises.map(p => p.assertion.text);\n const aggregateInput = `The following are self-descriptions (premises) the user has asserted about themselves:\\n\\n${premiseTexts.map((t, i) => `${i + 1}. ${t}`).join('\\n')}\\n\\nSynthesize these into a cohesive profile.`;\n\n logger.verbose(`Aggregated ${premises.length} premise(s) into profile input`);\n\n return {\n input: aggregateInput,\n needsProfileGeneration: true,\n forceUpdate: true,\n isAggregate: true,\n };\n });\n };\n\n // ─────────────────────────────────────────────────────────\n // NODE: Decompose Premises\n // Decomposes free-text input (chat or scraped) into individual premises,\n // creates each via the premise graph, then routes to aggregate_profile\n // to synthesize the profile from all active premises.\n // ─────────────────────────────────────────────────────────\n const decomposePremisesNode = async (state: typeof ProfileGraphState.State) => {\n return timed(\"ProfileGraph.decomposePremises\", async () => {\n if (!state.input) {\n logger.error(\"No input for premise decomposition\");\n return { error: \"Input required for premise decomposition\" };\n }\n\n if (!this.premiseGraph) {\n // Fallback: if no premise graph is available, skip decomposition\n // and route directly to profile generation (legacy behavior)\n logger.warn(\"No premise graph injected — falling back to direct profile generation\");\n return {\n needsProfileGeneration: true,\n forceUpdate: true,\n };\n }\n\n logger.verbose(\"Decomposing input into premises...\", {\n userId: state.userId,\n inputLength: state.input.length,\n });\n\n const agentTimingsAccum: DebugMetaAgent[] = [];\n\n try {\n const _traceEmitter = requestContext.getStore()?.traceEmitter;\n\n const decomposeStart = Date.now();\n _traceEmitter?.({ type: \"agent_start\", name: \"premise-decomposer\" });\n const result = await premiseDecomposer.invoke(state.input);\n const decomposeMs = Date.now() - decomposeStart;\n agentTimingsAccum.push({ name: \"premise.decomposer\", durationMs: decomposeMs });\n _traceEmitter?.({\n type: \"agent_end\",\n name: \"premise-decomposer\",\n durationMs: decomposeMs,\n summary: `Decomposed into ${result.premises.length} premise(s)`,\n });\n\n if (result.premises.length === 0) {\n logger.verbose(\"No premises extracted — skipping decomposition\");\n // No premises found; fall through to aggregate which will\n // synthesize from any existing premises, or to generate_profile\n // if needsProfileGeneration is still set from check_state\n return {\n operationMode: 'aggregate' as const,\n agentTimings: agentTimingsAccum,\n };\n }\n\n logger.verbose(`Creating ${result.premises.length} premise(s) via premise graph`, {\n userId: state.userId,\n });\n\n let created = 0;\n for (const p of result.premises) {\n try {\n const premiseResult = await invokeWithAbortSignal(this.premiseGraph, {\n userId: state.userId,\n assertionText: p.text,\n tier: p.tier,\n operationMode: 'create',\n });\n\n if (premiseResult.premise) {\n created++;\n } else if (premiseResult.error) {\n logger.warn(\"Premise creation failed\", {\n text: p.text.substring(0, 60),\n error: premiseResult.error,\n });\n }\n } catch (err) {\n logger.warn(\"Premise creation threw\", {\n text: p.text.substring(0, 60),\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n logger.verbose(`Created ${created}/${result.premises.length} premise(s)`, {\n userId: state.userId,\n });\n\n // Route to aggregate mode to rebuild the profile from all active premises\n return {\n operationMode: 'aggregate' as const,\n agentTimings: agentTimingsAccum,\n operationsPerformed: { decomposedPremises: true },\n };\n } catch (err) {\n logger.error(\"Premise decomposition failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n // Fallback: route to direct profile generation\n return {\n needsProfileGeneration: true,\n forceUpdate: true,\n agentTimings: agentTimingsAccum,\n };\n }\n });\n };\n\n // ─────────────────────────────────────────────────────────\n // ROUTING CONDITIONS\n // Smart conditional routing based on operation mode and missing components\n // ─────────────────────────────────────────────────────────\n\n /**\n * Route from check_state to next step based on operation mode and detected needs.\n */\n const checkStateCondition = (state: typeof ProfileGraphState.State): string => {\n // Query mode: Return immediately (fast path)\n if (state.operationMode === 'query') {\n logger.verbose(\"Query mode - ending (fast path)\");\n return END;\n }\n\n // Aggregate mode: Synthesize profile from active premises\n if (state.operationMode === 'aggregate') {\n logger.verbose(\"Aggregate mode - synthesizing profile from premises\");\n return \"aggregate_profile\";\n }\n\n // Generate mode: use enrichUserProfile Chat API to auto-generate\n if (state.operationMode === 'generate') {\n logger.verbose(\"Generate mode - routing to auto_generate\");\n return \"auto_generate\";\n }\n\n // Check if user information is insufficient for scraping\n // Return early so chat graph can request the missing information\n if (state.needsUserInfo) {\n logger.verbose(\"⚠️ Insufficient user info - requesting from user\", {\n missingInfo: state.missingUserInfo\n });\n return END;\n }\n\n // Write mode: Check what needs generation\n if (state.needsProfileGeneration) {\n // Only use provided input if it's meaningful (not just \"Yes\" / confirmation)\n if (state.input && isMeaningfulProfileInput(state.input)) {\n // Route through premise decomposition when a premise graph is available.\n // The decompose node extracts atomic premises, creates them, then\n // routes to aggregate_profile for profile synthesis.\n if (this.premiseGraph) {\n logger.verbose(\"Profile generation needed — decomposing input into premises\");\n return \"decompose_premises\";\n }\n logger.verbose(\"Profile generation needed with meaningful input provided\");\n return \"generate_profile\";\n } else {\n logger.verbose(\"Profile generation needed - scraping first (no meaningful input)\");\n return \"scrape\";\n }\n }\n\n // Everything exists and is up to date\n logger.verbose(\"All components exist - ending\");\n return END;\n };\n\n\n // ─────────────────────────────────────────────────────────\n // GRAPH ASSEMBLY\n // Conditional flow based on operation mode and detected needs\n // ─────────────────────────────────────────────────────────\n\n const workflow = new StateGraph(ProfileGraphState)\n // Add all nodes\n .addNode(\"check_state\", checkStateNode)\n .addNode(\"scrape\", scrapeNode)\n .addNode(\"decompose_premises\", decomposePremisesNode)\n .addNode(\"auto_generate\", autoGenerateNode)\n .addNode(\"aggregate_profile\", aggregateProfileNode)\n .addNode(\"generate_profile\", generateProfileNode)\n .addNode(\"save_profile\", saveProfileNode)\n\n // Start with state check\n .addEdge(START, \"check_state\")\n\n // Conditional routing from check_state\n .addConditionalEdges(\n \"check_state\",\n checkStateCondition,\n {\n auto_generate: \"auto_generate\", // Generate mode -> Chat API enrichment\n aggregate_profile: \"aggregate_profile\", // Aggregate mode -> synthesize from premises\n decompose_premises: \"decompose_premises\", // Write mode + input + premise graph -> decompose first\n scrape: \"scrape\", // Need profile, no input -> scrape first\n generate_profile: \"generate_profile\", // Need profile, have input -> generate (legacy, no premise graph)\n [END]: END // Query mode or everything exists\n }\n )\n\n // Decompose premises routes to aggregate (normal) or generate_profile (fallback)\n .addConditionalEdges(\n \"decompose_premises\",\n (state: typeof ProfileGraphState.State) => {\n if (state.operationMode === 'aggregate') return \"aggregate_profile\";\n // Fallback when decomposition failed (no premise graph or error)\n if (state.needsProfileGeneration) return \"generate_profile\";\n return \"aggregate_profile\";\n },\n {\n aggregate_profile: \"aggregate_profile\",\n generate_profile: \"generate_profile\",\n },\n )\n\n // Aggregate profile: generate if premises found, END if none\n .addConditionalEdges(\n \"aggregate_profile\",\n (state: typeof ProfileGraphState.State) => {\n if (state.needsProfileGeneration) return \"generate_profile\";\n logger.verbose(\"Aggregate mode — no premises, ending\");\n return END;\n },\n { generate_profile: \"generate_profile\", [END]: END },\n )\n\n // Auto-generate routes to decompose_premises (when premise graph\n // available) or generate_profile (legacy, no premise graph)\n .addConditionalEdges(\n \"auto_generate\",\n (state: typeof ProfileGraphState.State) => {\n if (state.input && this.premiseGraph) {\n logger.verbose(\"Enrichment produced input — routing to premise decomposition\");\n return \"decompose_premises\";\n }\n if (state.input) {\n logger.verbose(\"Enrichment produced input — routing to LLM generation (no premise graph)\");\n return \"generate_profile\";\n }\n logger.verbose(\"Enrichment ended without data (ghost soft-deleted or error) — done\");\n return END;\n },\n {\n decompose_premises: \"decompose_premises\",\n generate_profile: \"generate_profile\",\n [END]: END,\n }\n )\n\n // Scrape -> decompose_premises (when premise graph available) or generate_profile (legacy)\n .addConditionalEdges(\n \"scrape\",\n (_state: typeof ProfileGraphState.State) => {\n if (this.premiseGraph) return \"decompose_premises\";\n return \"generate_profile\";\n },\n {\n decompose_premises: \"decompose_premises\",\n generate_profile: \"generate_profile\",\n },\n )\n\n // Generate profile -> Save profile (linear)\n .addEdge(\"generate_profile\", \"save_profile\")\n\n // Save profile -> END (linear)\n .addEdge(\"save_profile\", END);\n\n logger.verbose(\"Graph built successfully\");\n return workflow.compile();\n }\n}\n"]}
1
+ {"version":3,"file":"profile.graph.js","sourceRoot":"/","sources":["profile/profile.graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAmB,MAAM,wBAAwB,CAAC;AAI3E,OAAO,EAAE,wCAAwC,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAC3G,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAE5E,OAAO,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAE5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAoBxE,MAAM,MAAM,GAAG,cAAc,CAAC,qBAAqB,CAAC,CAAC;AAErD,iFAAiF;AACjF,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAEvC,kFAAkF;AAClF,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ;IACzE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa;IACvE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB;IACzE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB;CACvD,CAAC,CAAC;AAEH;;;;GAIG;AACH,SAAS,wBAAwB,CAAC,KAAyB;IACzD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,GAAG,2BAA2B;QAAE,OAAO,KAAK,CAAC;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACzE,OAAO,IAAI,CAAC;AACd,CAAC;AAGD;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,mBAAmB;IAC9B,YACU,QAA8B,EAC9B,OAAgB,EAChB,QAA0B,EAC1B,iBAAuC,EACvC,YAAmC;QAJnC,aAAQ,GAAR,QAAQ,CAAsB;QAC9B,YAAO,GAAP,OAAO,CAAS;QAChB,aAAQ,GAAR,QAAQ,CAAkB;QAC1B,sBAAiB,GAAjB,iBAAiB,CAAsB;QACvC,iBAAY,GAAZ,YAAY,CAAuB;IACzC,CAAC;IAEE,WAAW;QAChB,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAChD,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAElD,4DAA4D;QAC5D,oBAAoB;QACpB,oEAAoE;QACpE,oBAAoB;QACpB,+CAA+C;QAC/C,4DAA4D;QAC5D,MAAM,cAAc,GAAG,KAAK,EAAE,KAAqC,EAAE,EAAE;YACrE,OAAO,KAAK,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;gBACjD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oBAClB,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;oBAC/B,OAAO;wBACL,KAAK,EAAE,oBAAoB;qBAC5B,CAAC;gBACJ,CAAC;gBAED,MAAM,CAAC,OAAO,CAAC,2BAA2B,EAAE;oBAC1C,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,aAAa,EAAE,KAAK,CAAC,aAAa;oBAClC,WAAW,EAAE,KAAK,CAAC,WAAW;iBAC/B,CAAC,CAAC;gBAEH,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAQ,CAAC;oBAEpE,kDAAkD;oBAClD,IAAI,KAAK,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;wBACpC,MAAM,CAAC,OAAO,CAAC,wDAAwD,EAAE;4BACvE,UAAU,EAAE,CAAC,CAAC,OAAO;yBACtB,CAAC,CAAC;wBACH,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;wBAC5F,OAAO;4BACL,OAAO,EAAE,OAAO,IAAI,SAAS;4BAC7B,UAAU,EAAE,OAAO;gCACjB,CAAC,CAAC;oCACE,UAAU,EAAE,IAAI;oCAChB,OAAO,EAAE;wCACP,EAAE,EAAE,aAAa,EAAE,EAAE;wCACrB,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI;wCAC5B,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG;wCAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,QAAQ;wCACpC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM;wCAClC,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,SAAS;qCACzC;iCACF;gCACH,CAAC,CAAC;oCACE,UAAU,EAAE,KAAK;oCACjB,OAAO,EACL,wJAAwJ;iCAC3J;yBACN,CAAC;oBACJ,CAAC;oBAED,2CAA2C;oBAC3C,0FAA0F;oBAC1F,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAClF,MAAM,sBAAsB,GAAG,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,kBAAkB,CAAC,CAAC;oBAErF,0FAA0F;oBAC1F,MAAM,gBAAgB,GAAG,sBAAsB,IAAI,CAAC,kBAAkB,CAAC;oBAEvE,qEAAqE;oBACrE,IAAI,aAAa,GAAG,KAAK,CAAC;oBAC1B,IAAI,eAAe,GAAa,EAAE,CAAC;oBAEnC,IAAI,gBAAgB,EAAE,CAAC;wBACrB,MAAM,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC;wBAEpE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;wBAEvD,IAAI,CAAC,IAAI,EAAE,CAAC;4BACV,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;4BACzD,OAAO;gCACL,KAAK,EAAE,mBAAmB,KAAK,CAAC,MAAM,EAAE;6BACzC,CAAC;wBACJ,CAAC;wBAED,qEAAqE;wBACrE,gDAAgD;wBAChD,oDAAoD;wBAEpD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;wBACjE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;wBAEtC,yDAAyD;wBACzD,uDAAuD;wBACvD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI;4BACjC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;4BACvB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;4BACxB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;wBAErD,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;wBAErE,6CAA6C;wBAC7C,sFAAsF;wBACtF,+DAA+D;wBAC/D,kDAAkD;wBAElD,MAAM,cAAc,GAAG,UAAU,IAAI,iBAAiB,CAAC;wBAEvD,IAAI,CAAC,cAAc,EAAE,CAAC;4BACpB,aAAa,GAAG,IAAI,CAAC;4BAErB,sDAAsD;4BACtD,IAAI,CAAC,UAAU,EAAE,CAAC;gCAChB,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;4BACtC,CAAC;4BACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;gCACvB,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;4BACpC,CAAC;4BACD,IAAI,CAAC,WAAW,EAAE,CAAC;gCACjB,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe;4BACnD,CAAC;4BAED,MAAM,CAAC,OAAO,CAAC,+CAA+C,EAAE;gCAC9D,UAAU;gCACV,iBAAiB;gCACjB,WAAW;gCACX,WAAW,EAAE,IAAI,CAAC,IAAI;gCACtB,eAAe;6BAChB,CAAC,CAAC;wBACL,CAAC;6BAAM,CAAC;4BACN,MAAM,CAAC,OAAO,CAAC,4CAA4C,EAAE;gCAC3D,UAAU;gCACV,iBAAiB;gCACjB,WAAW;gCACX,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW;6BAC3D,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;oBAED,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE;wBAC5C,UAAU,EAAE,CAAC,CAAC,OAAO;wBACrB,sBAAsB;wBACtB,aAAa;wBACb,eAAe;wBACf,WAAW,EAAE,KAAK,CAAC,WAAW;wBAC9B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK;wBACvB,kBAAkB;qBACnB,CAAC,CAAC;oBAEH,OAAO;wBACL,OAAO,EAAE,OAAO,IAAI,SAAS;wBAC7B,sBAAsB;wBACtB,aAAa;wBACb,eAAe;qBAChB,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;wBACrC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC9D,CAAC,CAAC;oBACH,OAAO;wBACL,OAAO,EAAE,SAAS;wBAClB,KAAK,EAAE,yCAAyC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACzG,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,4DAA4D;QAC5D,eAAe;QACf,iDAAiD;QACjD,4DAA4D;QAC5D,MAAM,UAAU,GAAG,KAAK,EAAE,KAAqC,EAAE,EAAE;YACjE,OAAO,KAAK,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;gBAC7C,IAAI,KAAK,CAAC,KAAK,IAAI,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzD,MAAM,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC;oBACtE,OAAO,EAAE,CAAC;gBACZ,CAAC;gBAED,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE;oBACvC,MAAM,EAAE,KAAK,CAAC,MAAM;iBACrB,CAAC,CAAC;gBAEH,IAAI,CAAC;oBACH,6DAA6D;oBAC7D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAEvD,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;wBACzD,OAAO;4BACL,KAAK,EAAE,mBAAmB,KAAK,CAAC,MAAM,EAAE;yBACzC,CAAC;oBACJ,CAAC;oBAED,2DAA2D;oBAC3D,mEAAmE;oBACnE,MAAM,WAAW,GAAa,EAAE,CAAC;oBACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACjE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;wBACxB,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;4BAChB,KAAK,SAAS;gCAAE,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gCAAC,MAAM;4BACjE,KAAK,UAAU;gCAAE,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gCAAC,MAAM;4BACjE,KAAK,QAAQ;gCAAE,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gCAAC,MAAM;4BAC7D,KAAK,UAAU;gCAAE,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gCAAC,MAAM;4BACjE;gCAAS,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gCAAC,MAAM;wBAC1D,CAAC;oBACH,CAAC;oBAED,4CAA4C;oBAC5C,IAAI,SAAS,GAAG,0BAA0B,IAAI,CAAC,IAAI,IAAI,aAAa,EAAE,CAAC;oBAEvE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;wBAClB,SAAS,IAAI,eAAe,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC9C,CAAC;oBAED,SAAS,IAAI,OAAO,CAAC;oBAErB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC3B,SAAS,IAAI,2BAA2B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;wBACrE,SAAS,IAAI,0GAA0G,CAAC;oBAC1H,CAAC;yBAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBACtB,SAAS,IAAI,gBAAgB,IAAI,CAAC,KAAK,MAAM,CAAC;wBAC9C,SAAS,IAAI,gFAAgF,CAAC;oBAChG,CAAC;yBAAM,CAAC;wBACN,SAAS,IAAI,uEAAuE,CAAC;oBACvF,CAAC;oBAED,MAAM,CAAC,OAAO,CAAC,gCAAgC,EAAE;wBAC/C,UAAU,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC;wBAClC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ;wBAC5B,gBAAgB,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;qBAC9C,CAAC,CAAC;oBAEH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBAEzD,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE;wBAClC,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;qBACrC,CAAC,CAAC;oBAEH,OAAO;wBACL,SAAS;wBACT,KAAK,EAAE,WAAW;wBAClB,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACvC,mBAAmB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;qBACvC,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE;wBAC5B,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC9D,CAAC,CAAC;oBACH,OAAO;wBACL,KAAK,EAAE,sBAAsB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACtF,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,4DAA4D;QAC5D,qDAAqD;QACrD,gEAAgE;QAChE,8DAA8D;QAC9D,0DAA0D;QAC1D,8DAA8D;QAC9D,YAAY;QACZ,gEAAgE;QAChE,gCAAgC;QAChC,4DAA4D;QAC5D,MAAM,gBAAgB,GAAG,KAAK,EAAE,KAAqC,EAAE,EAAE;YACvE,OAAO,KAAK,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;gBACnD,MAAM,CAAC,OAAO,CAAC,gDAAgD,EAAE;oBAC/D,MAAM,EAAE,KAAK,CAAC,MAAM;iBACrB,CAAC,CAAC;gBAEH,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACvD,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;wBAC3E,OAAO,EAAE,KAAK,EAAE,mBAAmB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;oBACtD,CAAC;oBAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACjE,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;oBAC9D,MAAM,OAAO,GAAG;wBACd,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,SAAS;wBAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS;wBAC9B,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,IAAI,SAAS;wBACjD,OAAO,EAAE,iBAAiB,CAAC,OAAO,IAAI,SAAS;wBAC/C,MAAM,EAAE,iBAAiB,CAAC,MAAM,IAAI,SAAS;wBAC7C,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,IAAI,SAAS;wBACjD,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;qBACtF,CAAC;oBAEF,MAAM,cAAc,GAAG,GAAG,EAAE;wBAC1B,MAAM,KAAK,GAAG;4BACZ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;4BACrC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;4BACxC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;4BACjD,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;yBACvC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC7B,OAAO,KAAK,IAAI,0BAA0B,CAAC;oBAC7C,CAAC,CAAC;oBAEF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACnB,MAAM,CAAC,IAAI,CAAC,qDAAqD,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;wBAC7F,OAAO;4BACL,KAAK,EAAE,cAAc,EAAE;4BACvB,aAAa,EAAE,KAAK;4BACpB,sBAAsB,EAAE,IAAI;4BAC5B,mBAAmB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;yBACvC,CAAC;oBACJ,CAAC;oBAED,IAAI,CAAC;wBACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;wBAElE,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;4BACtC,MAAM,CAAC,IAAI,CAAC,2DAA2D,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;4BACnG,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;4BAClD,OAAO,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;wBAChD,CAAC;wBAED,MAAM,uBAAuB,GAAG,CAAC,CAAC,UAAU;4BAC1C,UAAU,CAAC,cAAc;4BACzB,CACE,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gCACzC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gCAC9C,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;gCACvC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAC3C,CAAC;wBAEJ,IAAI,uBAAuB,EAAE,CAAC;4BAC5B,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,UAAW,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;gCACjG,MAAM,CAAC,IAAI,CAAC,kEAAkE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;gCAC1G,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gCAClD,OAAO,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC;4BACxD,CAAC;4BAED,MAAM,CAAC,OAAO,CAAC,+BAA+B,EAAE;gCAC9C,MAAM,EAAE,KAAK,CAAC,MAAM;gCACpB,WAAW,EAAE,UAAW,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM;gCACjD,cAAc,EAAE,UAAW,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM;6BACxD,CAAC,CAAC;4BAEH,wCAAwC;4BACxC,MAAM,aAAa,GAIf,EAAE,CAAC;4BACP,MAAM,YAAY,GAAG,UAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;4BACvD,IACE,YAAY;gCACZ,wCAAwC,CACtC,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,EAC3E,YAAY,CACb,EACD,CAAC;gCACD,aAAa,CAAC,IAAI,GAAG,YAAY,CAAC;4BACpC,CAAC;4BACD,IAAI,UAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE;gCAAE,aAAa,CAAC,KAAK,GAAG,UAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;4BAC5F,IAAI,UAAW,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE;gCAAE,aAAa,CAAC,QAAQ,GAAG,UAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;4BAEzG,MAAM,eAAe,GAAuC,EAAE,CAAC;4BAC/D,IAAI,UAAW,CAAC,OAAO,CAAC,OAAO;gCAAE,eAAe,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,UAAW,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;4BAChH,IAAI,UAAW,CAAC,OAAO,CAAC,QAAQ;gCAAE,eAAe,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;4BACnH,IAAI,UAAW,CAAC,OAAO,CAAC,MAAM;gCAAE,eAAe,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;4BAC7G,IAAI,UAAW,CAAC,OAAO,CAAC,QAAQ;gCAAE,eAAe,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;4BACnH,IAAI,UAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;gCACzC,KAAK,MAAM,CAAC,IAAI,UAAW,CAAC,OAAO,CAAC,QAAQ;oCAAE,eAAe,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;4BACpG,CAAC;4BACD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCAC/B,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gCACzE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gCAClE,MAAM,IAAI,GAAG,eAAe;qCACzB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC;qCACjE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gCAClD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;oCACzC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,EAAE,GAAG,eAAe,CAAC;oCACjE,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,eAAe,CAAC,CAAC;gCAClC,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;4BAC3D,CAAC;4BAED,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCAC1C,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;4BAC9D,CAAC;4BAED,sEAAsE;4BACtE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gCACjB,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gCACxE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;gCACtF,IAAI,SAAS,EAAE,CAAC;oCACd,MAAM,CAAC,IAAI,CAAC,yDAAyD,EAAE;wCACrE,OAAO,EAAE,KAAK,CAAC,MAAM;wCACrB,QAAQ,EAAE,SAAS,CAAC,EAAE;qCACvB,CAAC,CAAC;oCACH,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;oCAC/D,OAAO,EAAE,KAAK,EAAE,+BAA+B,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;gCAClE,CAAC;4BACH,CAAC;4BAED,2DAA2D;4BAC3D,6DAA6D;4BAC7D,8CAA8C;4BAC9C,MAAM,eAAe,GAAG;gCACtB,UAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,UAAW,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE;gCAC3E,UAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,UAAW,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE;gCACtF,UAAW,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE;gCAC9B,UAAW,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE;gCACnC,UAAW,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,UAAW,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gCAC5G,UAAW,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,wBAAwB,UAAW,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;6BACtH,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BAE7B,OAAO;gCACL,KAAK,EAAE,eAAe;gCACtB,aAAa,EAAE,KAAK;gCACpB,sBAAsB,EAAE,IAAI;gCAC5B,WAAW,EAAE,IAAI;gCACjB,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gCACvC,mBAAmB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;6BACvC,CAAC;wBACJ,CAAC;wBAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;4BACjB,MAAM,CAAC,IAAI,CAAC,oDAAoD,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;4BAC5F,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;4BAClD,OAAO,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAC;wBAC9D,CAAC;wBACD,MAAM,CAAC,IAAI,CAAC,qEAAqE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC/G,CAAC;oBAAC,OAAO,SAAS,EAAE,CAAC;wBACnB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;4BACjB,MAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;4BACpF,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;4BAClD,OAAO,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC;wBACvD,CAAC;wBACD,MAAM,CAAC,IAAI,CAAC,wDAAwD,EAAE;4BACpE,MAAM,EAAE,KAAK,CAAC,MAAM;4BACpB,KAAK,EAAE,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;yBAC1E,CAAC,CAAC;oBACL,CAAC;oBAED,OAAO;wBACL,KAAK,EAAE,cAAc,EAAE;wBACvB,aAAa,EAAE,KAAK;wBACpB,sBAAsB,EAAE,IAAI;wBAC5B,mBAAmB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;qBACvC,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;wBACnC,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;qBACxD,CAAC,CAAC;oBACH,OAAO,EAAE,KAAK,EAAE,yBAAyB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBAChG,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,4DAA4D;QAC5D,yBAAyB;QACzB,6DAA6D;QAC7D,sEAAsE;QACtE,4DAA4D;QAC5D,MAAM,mBAAmB,GAAG,KAAK,EAAE,KAAqC,EAAE,EAAE;YAC1E,OAAO,KAAK,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;gBACtD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;oBACjB,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;oBACzD,OAAO;wBACL,KAAK,EAAE,uCAAuC;qBAC/C,CAAC;gBACJ,CAAC;gBAED,MAAM,CAAC,OAAO,CAAC,gCAAgC,EAAE;oBAC/C,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO;oBACnC,QAAQ,EAAE,KAAK,CAAC,WAAW;oBAC3B,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;iBAChC,CAAC,CAAC;gBAEH,MAAM,iBAAiB,GAAqB,EAAE,CAAC;gBAE/C,IAAI,CAAC;oBACH,oEAAoE;oBACpE,IAAI,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC;oBACnC,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;wBACvC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;4BACtB,gBAAgB,GAAG,sBAAsB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,2BAA2B,KAAK,CAAC,KAAK,oMAAoM,CAAC;4BAC1T,MAAM,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC;wBACtE,CAAC;6BAAM,CAAC;4BACN,gBAAgB,GAAG,sBAAsB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,sBAAsB,KAAK,CAAC,KAAK,8NAA8N,CAAC;4BAC/U,MAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;wBAClD,CAAC;oBACH,CAAC;oBAED,MAAM,uBAAuB,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,YAAY,CAAC;oBACxE,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBACzC,uBAAuB,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;oBAC9E,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;oBAC/D,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,EAAE,CAAC,CAAC;oBACtG,uBAAuB,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,EAAE,OAAO,EAAE,yBAAyB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;oBAEvM,MAAM,CAAC,OAAO,CAAC,kCAAkC,EAAE;wBACjD,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI;wBACjC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM;wBACnD,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM;qBAC1D,CAAC,CAAC;oBAEH,OAAO;wBACL,OAAO,EAAE;4BACP,GAAG,MAAM,CAAC,MAAM;4BAChB,MAAM,EAAE,KAAK,CAAC,MAAM;yBACrB;wBACD,YAAY,EAAE,iBAAiB;wBAC/B,mBAAmB,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE;qBAChD,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE;wBACxC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC9D,CAAC,CAAC;oBACH,OAAO;wBACL,KAAK,EAAE,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;wBAC7F,YAAY,EAAE,iBAAiB;qBAChC,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,4DAA4D;QAC5D,qBAAqB;QACrB,mDAAmD;QACnD,4DAA4D;QAC5D,MAAM,eAAe,GAAG,KAAK,EAAE,KAAqC,EAAE,EAAE;YACtE,OAAO,KAAK,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;gBAClD,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;oBAC9C,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;oBACzD,OAAO;wBACL,KAAK,EAAE,8BAA8B;qBACtC,CAAC;gBACJ,CAAC;gBAED,MAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE;oBACxC,MAAM,EAAE,KAAK,CAAC,MAAM;iBACrB,CAAC,CAAC;gBAEH,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;oBAErC,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAEvD,MAAM,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;oBAE/C,yEAAyE;oBACzE,IAAI,gBAAgB,GAAa,EAAE,CAAC;oBACpC,IAAI,CAAC;wBACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;wBACtF,gBAAgB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;wBAC7D,MAAM,CAAC,OAAO,CAAC,gDAAgD,EAAE;4BAC/D,MAAM,EAAE,KAAK,CAAC,MAAM;4BACpB,KAAK,EAAE,gBAAgB,CAAC,MAAM;yBAC/B,CAAC,CAAC;oBACL,CAAC;oBAAC,OAAO,UAAU,EAAE,CAAC;wBACpB,MAAM,CAAC,KAAK,CAAC,8EAA8E,EAAE;4BAC3F,MAAM,EAAE,KAAK,CAAC,MAAM;4BACpB,KAAK,EAAE,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;yBAC7E,CAAC,CAAC;oBACL,CAAC;oBAED,2CAA2C;oBAC3C,MAAM,IAAI,GAAa,EAAE,CAAC;oBAC1B,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ;wBAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACvD,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM;wBAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC7D,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM;wBAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBACnE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO;wBAAE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAE3D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBAC9C,IAAI,CAAC,iBAAiB,CAAC;4BACrB,IAAI,EAAE,SAAS;4BACf,MAAM,EAAE,KAAK,CAAC,MAAM;4BACpB,UAAU,EAAE,SAAS;4BACrB,QAAQ,EAAE,KAAK,CAAC,MAAM;4BACtB,OAAO,EAAE;gCACP,WAAW,EAAE;oCACX,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI;oCAC5B,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG;oCAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,QAAQ;oCACpC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM;oCAClC,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,SAAS;iCACzC;gCACD,IAAI;gCACJ,gBAAgB;6BACjB;yBACF,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACf,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CACpG,CAAC;oBACJ,CAAC;oBAED,OAAO;wBACL,OAAO;wBACP,mBAAmB,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;qBAC5C,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;wBACrC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC9D,CAAC,CAAC;oBACH,OAAO;wBACL,KAAK,EAAE,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC3F,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,4DAA4D;QAC5D,0BAA0B;QAC1B,8EAA8E;QAC9E,6EAA6E;QAC7E,4DAA4D;QAC5D,MAAM,oBAAoB,GAAG,KAAK,EAAE,KAAqC,EAAE,EAAE;YAC3E,OAAO,KAAK,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;gBACvD,MAAM,CAAC,OAAO,CAAC,sCAAsC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;gBAEjF,MAAM,QAAQ,GAAoB,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAEjG,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,MAAM,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC;oBAChE,OAAO,EAAE,aAAa,EAAE,OAAgB,EAAE,CAAC;gBAC7C,CAAC;gBAED,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACzD,MAAM,cAAc,GAAG,6FAA6F,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,+CAA+C,CAAC;gBAE3N,MAAM,CAAC,OAAO,CAAC,cAAc,QAAQ,CAAC,MAAM,gCAAgC,CAAC,CAAC;gBAE9E,OAAO;oBACL,KAAK,EAAE,cAAc;oBACrB,sBAAsB,EAAE,IAAI;oBAC5B,WAAW,EAAE,IAAI;oBACjB,WAAW,EAAE,IAAI;iBAClB,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,4DAA4D;QAC5D,2BAA2B;QAC3B,yEAAyE;QACzE,uEAAuE;QACvE,sDAAsD;QACtD,4DAA4D;QAC5D,MAAM,qBAAqB,GAAG,KAAK,EAAE,KAAqC,EAAE,EAAE;YAC5E,OAAO,KAAK,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;gBACxD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;oBACjB,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;oBACnD,OAAO,EAAE,KAAK,EAAE,0CAA0C,EAAE,CAAC;gBAC/D,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;oBACvB,iEAAiE;oBACjE,6DAA6D;oBAC7D,MAAM,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;oBACrF,OAAO;wBACL,sBAAsB,EAAE,IAAI;wBAC5B,WAAW,EAAE,IAAI;qBAClB,CAAC;gBACJ,CAAC;gBAED,MAAM,CAAC,OAAO,CAAC,oCAAoC,EAAE;oBACnD,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;iBAChC,CAAC,CAAC;gBAEH,MAAM,iBAAiB,GAAqB,EAAE,CAAC;gBAE/C,IAAI,CAAC;oBACH,MAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,YAAY,CAAC;oBAE9D,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAClC,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;oBACrE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;oBAChD,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;oBAChF,aAAa,EAAE,CAAC;wBACd,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,oBAAoB;wBAC1B,UAAU,EAAE,WAAW;wBACvB,OAAO,EAAE,mBAAmB,MAAM,CAAC,QAAQ,CAAC,MAAM,aAAa;qBAChE,CAAC,CAAC;oBAEH,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACjC,MAAM,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC;wBACjE,0DAA0D;wBAC1D,gEAAgE;wBAChE,0DAA0D;wBAC1D,OAAO;4BACL,aAAa,EAAE,WAAoB;4BACnC,YAAY,EAAE,iBAAiB;yBAChC,CAAC;oBACJ,CAAC;oBAED,MAAM,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,QAAQ,CAAC,MAAM,+BAA+B,EAAE;wBAChF,MAAM,EAAE,KAAK,CAAC,MAAM;qBACrB,CAAC,CAAC;oBAEH,IAAI,OAAO,GAAG,CAAC,CAAC;oBAChB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBAChC,IAAI,CAAC;4BACH,MAAM,aAAa,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,YAAY,EAAE;gCACnE,MAAM,EAAE,KAAK,CAAC,MAAM;gCACpB,aAAa,EAAE,CAAC,CAAC,IAAI;gCACrB,IAAI,EAAE,CAAC,CAAC,IAAI;gCACZ,aAAa,EAAE,QAAQ;gCACvB,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,MAAM;oCAC/B,CAAC,CAAC,EAAE,gBAAgB,EAAE,aAAsB,EAAE,kBAAkB,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE;oCAC5F,CAAC,CAAC,EAAE,CAAC;6BACR,CAAC,CAAC;4BAEH,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gCAC1B,OAAO,EAAE,CAAC;4BACZ,CAAC;iCAAM,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;gCAC/B,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;oCACrC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;oCAC7B,KAAK,EAAE,aAAa,CAAC,KAAK;iCAC3B,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;gCACpC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;gCAC7B,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;6BACxD,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;oBAED,MAAM,CAAC,OAAO,CAAC,WAAW,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,aAAa,EAAE;wBACxE,MAAM,EAAE,KAAK,CAAC,MAAM;qBACrB,CAAC,CAAC;oBAEH,0EAA0E;oBAC1E,OAAO;wBACL,aAAa,EAAE,WAAoB;wBACnC,YAAY,EAAE,iBAAiB;wBAC/B,mBAAmB,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE;qBAClD,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;wBAC3C,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;qBACxD,CAAC,CAAC;oBACH,+CAA+C;oBAC/C,OAAO;wBACL,sBAAsB,EAAE,IAAI;wBAC5B,WAAW,EAAE,IAAI;wBACjB,YAAY,EAAE,iBAAiB;qBAChC,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,4DAA4D;QAC5D,qBAAqB;QACrB,2EAA2E;QAC3E,4DAA4D;QAE5D;;WAEG;QACH,MAAM,mBAAmB,GAAG,CAAC,KAAqC,EAAU,EAAE;YAC5E,6CAA6C;YAC7C,IAAI,KAAK,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;gBACpC,MAAM,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;gBAClD,OAAO,GAAG,CAAC;YACb,CAAC;YAED,0DAA0D;YAC1D,IAAI,KAAK,CAAC,aAAa,KAAK,WAAW,EAAE,CAAC;gBACxC,MAAM,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC;gBACtE,OAAO,mBAAmB,CAAC;YAC7B,CAAC;YAED,iEAAiE;YACjE,IAAI,KAAK,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;gBACvC,MAAM,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC;gBAC3D,OAAO,eAAe,CAAC;YACzB,CAAC;YAED,yDAAyD;YACzD,iEAAiE;YACjE,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;gBACxB,MAAM,CAAC,OAAO,CAAC,kDAAkD,EAAE;oBACjE,WAAW,EAAE,KAAK,CAAC,eAAe;iBACnC,CAAC,CAAC;gBACH,OAAO,GAAG,CAAC;YACb,CAAC;YAED,0CAA0C;YAC1C,IAAI,KAAK,CAAC,sBAAsB,EAAE,CAAC;gBACjC,6EAA6E;gBAC7E,IAAI,KAAK,CAAC,KAAK,IAAI,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzD,yEAAyE;oBACzE,kEAAkE;oBAClE,qDAAqD;oBACrD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;wBACtB,MAAM,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC;wBAC9E,OAAO,oBAAoB,CAAC;oBAC9B,CAAC;oBACD,MAAM,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC;oBAC3E,OAAO,kBAAkB,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC;oBACnF,OAAO,QAAQ,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,sCAAsC;YACtC,MAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;YAChD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;QAGF,4DAA4D;QAC5D,iBAAiB;QACjB,8DAA8D;QAC9D,4DAA4D;QAE5D,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,iBAAiB,CAAC;YAChD,gBAAgB;aACf,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC;aACtC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC;aAC7B,OAAO,CAAC,oBAAoB,EAAE,qBAAqB,CAAC;aACpD,OAAO,CAAC,eAAe,EAAE,gBAAgB,CAAC;aAC1C,OAAO,CAAC,mBAAmB,EAAE,oBAAoB,CAAC;aAClD,OAAO,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;aAChD,OAAO,CAAC,cAAc,EAAE,eAAe,CAAC;YAEzC,yBAAyB;aACxB,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC;YAE9B,uCAAuC;aACtC,mBAAmB,CAClB,aAAa,EACb,mBAAmB,EACnB;YACE,aAAa,EAAE,eAAe,EAAQ,uCAAuC;YAC7E,iBAAiB,EAAE,mBAAmB,EAAE,6CAA6C;YACrF,kBAAkB,EAAE,oBAAoB,EAAE,wDAAwD;YAClG,MAAM,EAAE,QAAQ,EAAsB,yCAAyC;YAC/E,gBAAgB,EAAE,kBAAkB,EAAE,kEAAkE;YACxG,CAAC,GAAG,CAAC,EAAE,GAAG,CAA4B,kCAAkC;SACzE,CACF;YAED,iFAAiF;aAChF,mBAAmB,CAClB,oBAAoB,EACpB,CAAC,KAAqC,EAAE,EAAE;YACxC,IAAI,KAAK,CAAC,aAAa,KAAK,WAAW;gBAAE,OAAO,mBAAmB,CAAC;YACpE,iEAAiE;YACjE,IAAI,KAAK,CAAC,sBAAsB;gBAAE,OAAO,kBAAkB,CAAC;YAC5D,OAAO,mBAAmB,CAAC;QAC7B,CAAC,EACD;YACE,iBAAiB,EAAE,mBAAmB;YACtC,gBAAgB,EAAE,kBAAkB;SACrC,CACF;YAED,6DAA6D;aAC5D,mBAAmB,CAClB,mBAAmB,EACnB,CAAC,KAAqC,EAAE,EAAE;YACxC,IAAI,KAAK,CAAC,sBAAsB;gBAAE,OAAO,kBAAkB,CAAC;YAC5D,MAAM,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;YACvD,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CACrD;YAED,iEAAiE;YACjE,4DAA4D;aAC3D,mBAAmB,CAClB,eAAe,EACf,CAAC,KAAqC,EAAE,EAAE;YACxC,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACrC,MAAM,CAAC,OAAO,CAAC,8DAA8D,CAAC,CAAC;gBAC/E,OAAO,oBAAoB,CAAC;YAC9B,CAAC;YACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC;gBAC3F,OAAO,kBAAkB,CAAC;YAC5B,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,oEAAoE,CAAC,CAAC;YACrF,OAAO,GAAG,CAAC;QACb,CAAC,EACD;YACE,kBAAkB,EAAE,oBAAoB;YACxC,gBAAgB,EAAE,kBAAkB;YACpC,CAAC,GAAG,CAAC,EAAE,GAAG;SACX,CACF;YAED,2FAA2F;aAC1F,mBAAmB,CAClB,QAAQ,EACR,CAAC,MAAsC,EAAE,EAAE;YACzC,IAAI,IAAI,CAAC,YAAY;gBAAE,OAAO,oBAAoB,CAAC;YACnD,OAAO,kBAAkB,CAAC;QAC5B,CAAC,EACD;YACE,kBAAkB,EAAE,oBAAoB;YACxC,gBAAgB,EAAE,kBAAkB;SACrC,CACF;YAED,4CAA4C;aAC3C,OAAO,CAAC,kBAAkB,EAAE,cAAc,CAAC;YAE5C,+BAA+B;aAC9B,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAEhC,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAC3C,OAAO,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;CACF","sourcesContent":["import { StateGraph, START, END } from \"@langchain/langgraph\";\nimport { ProfileGraphState } from \"./profile.state.js\";\nimport { ProfileGenerator, ProfileDocument } from \"./profile.generator.js\";\nimport { ProfileGraphDatabase, PremiseRecord, PremiseProvenance } from \"../shared/interfaces/database.interface.js\";\nimport { Scraper } from \"../shared/interfaces/scraper.interface.js\";\nimport type { ProfileEnricher } from \"../shared/interfaces/enrichment.interface.js\";\nimport { shouldEnrichGhostDisplayNameFromParallel, isEnrichedNameMeaningful } from \"./profile.enricher.js\";\nimport { socialsToEnrichmentRequest } from \"../shared/utils/social-label.js\";\nimport { protocolLogger } from \"../shared/observability/protocol.logger.js\";\nimport type { QuestionerEnqueueFn } from \"../questioner/questioner.types.js\";\nimport { timed } from \"../shared/observability/performance.js\";\nimport { requestContext } from \"../shared/observability/request-context.js\";\nimport type { DebugMetaAgent } from \"../chat/chat-streaming.types.js\";\nimport { PremiseDecomposer } from \"../premise/premise.decomposer.js\";\nimport { invokeWithAbortSignal } from \"../shared/agent/model-signal.js\";\n\n/**\n * Compiled premise graph interface. Matches the invoke signature of a compiled LangGraph.\n * Accepted as an optional dependency so write-mode input can be decomposed into premises.\n */\nexport interface CompiledPremiseGraph {\n invoke(input: {\n userId: string;\n assertionText: string;\n tier: 'assertive' | 'contextual';\n operationMode: 'create';\n provenanceSource?: PremiseProvenance['source'];\n provenanceSourceId?: string;\n }): Promise<{\n premise?: { id: string } | undefined;\n error?: string | undefined;\n }>;\n}\n\nconst logger = protocolLogger(\"ProfileGraphFactory\");\n\n/** Minimum length for input to be considered meaningful (e.g. not just \"Yes\") */\nconst MIN_MEANINGFUL_INPUT_LENGTH = 20;\n\n/** Phrases that are confirmations only and must not be used as profile content */\nconst CONFIRMATION_PHRASES = new Set([\n \"yes\", \"yeah\", \"yep\", \"sure\", \"ok\", \"okay\", \"go ahead\", \"do it\", \"please\",\n \"correct\", \"right\", \"exactly\", \"absolutely\", \"of course\", \"sounds good\",\n \"create one\", \"create it\", \"set one up\", \"set it up\", \"create my profile\",\n \"create profile\", \"set up profile\", \"create a profile\"\n]);\n\n/**\n * Returns true only if the input contains real profile information.\n * Confirmation-only replies (e.g. \"Yes\" to \"Would you like to create a profile?\")\n * must not be treated as input so we ask for user info / use scraper instead of inventing a profile.\n */\nfunction isMeaningfulProfileInput(input: string | undefined): boolean {\n if (!input || typeof input !== \"string\") return false;\n const trimmed = input.trim();\n if (trimmed.length < MIN_MEANINGFUL_INPUT_LENGTH) return false;\n const lower = trimmed.toLowerCase();\n if (CONFIRMATION_PHRASES.has(lower)) return false;\n if (CONFIRMATION_PHRASES.has(lower.replace(/[.!?]+$/, \"\"))) return false;\n return true;\n}\n\n\n/**\n * Factory class to build and compile the Profile Generation Graph.\n *\n * Flow:\n * 1. check_state - Detect whether profile needs generation\n * 2. Conditional routing based on operation mode and missing components:\n * - Query mode: Return immediately (fast path)\n * - Write mode: Generate only what's needed\n * 3. Profile generation (if needed)\n * 4. Save profile to DB\n *\n * Key Features:\n * - Read/Write separation (query vs write)\n * - Conditional generation (skip generation if profile already exists)\n */\nexport class ProfileGraphFactory {\n constructor(\n private database: ProfileGraphDatabase,\n private scraper: Scraper,\n private enricher?: ProfileEnricher,\n private questionerEnqueue?: QuestionerEnqueueFn,\n private premiseGraph?: CompiledPremiseGraph,\n ) { }\n\n public createGraph() {\n const profileGenerator = new ProfileGenerator();\n const premiseDecomposer = new PremiseDecomposer();\n\n // ─────────────────────────────────────────────────────────\n // NODE: Check State\n // Loads existing profile from DB and detects what needs generation:\n // - Profile missing\n // - User information insufficient for scraping\n // ─────────────────────────────────────────────────────────\n const checkStateNode = async (state: typeof ProfileGraphState.State) => {\n return timed(\"ProfileGraph.checkState\", async () => {\n if (!state.userId) {\n logger.error(\"Missing userId\");\n return {\n error: \"userId is required\"\n };\n }\n\n logger.verbose(\"Checking profile state...\", {\n userId: state.userId,\n operationMode: state.operationMode,\n forceUpdate: state.forceUpdate\n });\n\n try {\n const profile = await this.database.getProfile(state.userId) as any;\n\n // Query mode: Just return the profile (fast path)\n if (state.operationMode === 'query') {\n logger.verbose(\"🚀 Query mode - returning existing profile (fast path)\", {\n hasProfile: !!profile\n });\n const profileWithId = profile ? await this.database.getProfileByUserId(state.userId) : null;\n return {\n profile: profile || undefined,\n readResult: profile\n ? {\n hasProfile: true,\n profile: {\n id: profileWithId?.id,\n name: profile.identity?.name,\n bio: profile.identity?.bio,\n location: profile.identity?.location,\n skills: profile.attributes?.skills,\n interests: profile.attributes?.interests,\n },\n }\n : {\n hasProfile: false,\n message:\n \"You don't have a profile yet. Would you like to create one? You can share your LinkedIn, GitHub, or X/Twitter profile, or just tell me about yourself.\",\n },\n };\n }\n\n // Write mode: Detect what needs generation\n // Treat confirmation-only input (e.g. \"Yes\") as no input so we ask for info / use scraper\n const hasMeaningfulInput = !!state.input && isMeaningfulProfileInput(state.input);\n const needsProfileGeneration = !profile || (state.forceUpdate && hasMeaningfulInput);\n\n // Check if we need to scrape (profile generation needed but no meaningful input provided)\n const willNeedScraping = needsProfileGeneration && !hasMeaningfulInput;\n\n // If we need to scrape, check if we have sufficient user information\n let needsUserInfo = false;\n let missingUserInfo: string[] = [];\n\n if (willNeedScraping) {\n logger.verbose(\"Will need scraping - checking user information...\");\n\n const user = await this.database.getUser(state.userId);\n\n if (!user) {\n logger.error(\"User not found\", { userId: state.userId });\n return {\n error: `User not found: ${state.userId}`\n };\n }\n\n // Check what information we have from the user table (schema: users)\n // Required fields: email, name (always present)\n // Optional fields: intro, avatar, location, socials\n\n const socials = await this.database.getUserSocials(state.userId);\n const hasSocials = socials.length > 0;\n\n // Check if name is a full name (not just email username)\n // For scraping to work well, we need first + last name\n const hasMeaningfulName = user.name &&\n user.name.trim() !== '' &&\n !user.name.includes('@') &&\n user.name.split(/\\s+/).filter(Boolean).length >= 2;\n\n const hasLocation = !!(user.location && user.location.trim() !== '');\n\n // Minimum requirement for accurate scraping:\n // - At least ONE social link (preferred - most reliable for finding the right person)\n // - OR a full name (first + last) - less reliable but workable\n // Location helps disambiguate but is not required\n\n const hasMinimumInfo = hasSocials || hasMeaningfulName;\n\n if (!hasMinimumInfo) {\n needsUserInfo = true;\n\n // Build precise list of what's missing and would help\n if (!hasSocials) {\n missingUserInfo.push('social_urls');\n }\n if (!hasMeaningfulName) {\n missingUserInfo.push('full_name');\n }\n if (!hasLocation) {\n missingUserInfo.push('location'); // Nice to have\n }\n\n logger.verbose(\"⚠️ Insufficient user information for scraping\", {\n hasSocials,\n hasMeaningfulName,\n hasLocation,\n currentName: user.name,\n missingUserInfo\n });\n } else {\n logger.verbose(\"✅ Sufficient user information for scraping\", {\n hasSocials,\n hasMeaningfulName,\n hasLocation,\n willProceedWith: hasSocials ? 'social links' : 'full name'\n });\n }\n }\n\n logger.verbose(\"📊 State detection complete\", {\n hasProfile: !!profile,\n needsProfileGeneration,\n needsUserInfo,\n missingUserInfo,\n forceUpdate: state.forceUpdate,\n hasInput: !!state.input,\n hasMeaningfulInput,\n });\n\n return {\n profile: profile || undefined,\n needsProfileGeneration,\n needsUserInfo,\n missingUserInfo\n };\n } catch (error) {\n logger.error(\"Failed to load profile\", {\n error: error instanceof Error ? error.message : String(error)\n });\n return {\n profile: undefined,\n error: `Failed to load profile from database: ${error instanceof Error ? error.message : String(error)}`\n };\n }\n });\n };\n\n // ─────────────────────────────────────────────────────────\n // NODE: Scrape\n // Scrapes data from web if input is not provided\n // ─────────────────────────────────────────────────────────\n const scrapeNode = async (state: typeof ProfileGraphState.State) => {\n return timed(\"ProfileGraph.scrape\", async () => {\n if (state.input && isMeaningfulProfileInput(state.input)) {\n logger.verbose(\"Meaningful input already provided - skipping scrape\");\n return {};\n }\n\n logger.verbose(\"Starting web scrape...\", {\n userId: state.userId\n });\n\n try {\n // Fetch user details to construct objective for web scraping\n const user = await this.database.getUser(state.userId);\n\n if (!user) {\n logger.error(\"User not found\", { userId: state.userId });\n return {\n error: `User not found: ${state.userId}`\n };\n }\n\n // Build scraping objective from available user information\n // Priority: social links (most reliable) > name + location > email\n const socialParts: string[] = [];\n const socials = await this.database.getUserSocials(state.userId);\n for (const s of socials) {\n switch (s.label) {\n case 'twitter': socialParts.push(`X/Twitter: ${s.value}`); break;\n case 'linkedin': socialParts.push(`LinkedIn: ${s.value}`); break;\n case 'github': socialParts.push(`GitHub: ${s.value}`); break;\n case 'telegram': socialParts.push(`Telegram: ${s.value}`); break;\n default: socialParts.push(`Website: ${s.value}`); break;\n }\n }\n\n // Construct objective based on what we have\n let objective = `Find information about ${user.name || 'this person'}`;\n\n if (user.location) {\n objective += ` located in ${user.location}`;\n }\n\n objective += '.\\n\\n';\n\n if (socialParts.length > 0) {\n objective += `Their social profiles:\\n${socialParts.join('\\n')}\\n\\n`;\n objective += 'Use these links to find accurate information about their professional background, skills, and interests.';\n } else if (user.email) {\n objective += `Their email: ${user.email}\\n\\n`;\n objective += 'Search for professional information, skills, and background about this person.';\n } else {\n objective += 'Search for professional information and background about this person.';\n }\n\n logger.verbose(\"Constructed scraping objective\", {\n hasSocials: socialParts.length > 0,\n hasLocation: !!user.location,\n objectivePreview: objective.substring(0, 100)\n });\n\n const scrapedData = await this.scraper.scrape(objective);\n\n logger.verbose(\"✅ Scrape complete\", {\n dataLength: scrapedData?.length || 0\n });\n\n return {\n objective,\n input: scrapedData,\n activeSocialIds: socials.map(s => s.id),\n operationsPerformed: { scraped: true }\n };\n } catch (error) {\n logger.error(\"Scrape failed\", {\n error: error instanceof Error ? error.message : String(error)\n });\n return {\n error: `Web scrape failed: ${error instanceof Error ? error.message : String(error)}`\n };\n }\n });\n };\n\n // ─────────────────────────────────────────────────────────\n // NODE: Auto-Generate (Parallel Chat API enrichment)\n // Calls enrichUserProfile to get structured data, then builds a\n // text blob as input for the decompose → aggregate → generate\n // pipeline. This ensures enriched users get premises with\n // embeddings, making them discoverable via premise-to-premise\n // matching.\n // On failure, falls back to basic user info for LLM generation.\n // Used in 'generate' mode only.\n // ─────────────────────────────────────────────────────────\n const autoGenerateNode = async (state: typeof ProfileGraphState.State) => {\n return timed(\"ProfileGraph.autoGenerate\", async () => {\n logger.verbose(\"Starting auto-generate via Chat API enrichment\", {\n userId: state.userId,\n });\n\n try {\n const user = await this.database.getUser(state.userId);\n if (!user) {\n logger.error(\"User not found for auto-generate\", { userId: state.userId });\n return { error: `User not found: ${state.userId}` };\n }\n\n const socials = await this.database.getUserSocials(state.userId);\n const enrichmentSocials = socialsToEnrichmentRequest(socials);\n const request = {\n name: user.name || undefined,\n email: user.email || undefined,\n linkedin: enrichmentSocials.linkedin || undefined,\n twitter: enrichmentSocials.twitter || undefined,\n github: enrichmentSocials.github || undefined,\n telegram: enrichmentSocials.telegram || undefined,\n websites: enrichmentSocials.websites?.length ? enrichmentSocials.websites : undefined,\n };\n\n const buildBasicInfo = () => {\n const parts = [\n user.name ? `Name: ${user.name}` : '',\n user.email ? `Email: ${user.email}` : '',\n user.location ? `Location: ${user.location}` : '',\n user.intro ? `Bio: ${user.intro}` : '',\n ].filter(Boolean).join('\\n');\n return parts || \"No information available\";\n };\n\n if (!this.enricher) {\n logger.warn(\"No enricher configured — falling back to basic info\", { userId: state.userId });\n return {\n input: buildBasicInfo(),\n needsUserInfo: false,\n needsProfileGeneration: true,\n operationsPerformed: { scraped: true },\n };\n }\n\n try {\n const enrichment = await this.enricher.enrichUserProfile(request);\n\n if (enrichment && !enrichment.isHuman) {\n logger.info(\"Enrichment detected non-human entity, soft-deleting ghost\", { userId: state.userId });\n await this.database.softDeleteGhost(state.userId);\n return { error: \"Non-human entity detected\" };\n }\n\n const hasMeaningfulEnrichment = !!enrichment &&\n enrichment.confidentMatch &&\n (\n enrichment.identity.bio.trim().length > 0 ||\n enrichment.narrative.context.trim().length > 0 ||\n enrichment.attributes.skills.length > 0 ||\n enrichment.attributes.interests.length > 0\n );\n\n if (hasMeaningfulEnrichment) {\n if (user.isGhost && !isEnrichedNameMeaningful(user.email || '', enrichment!.identity.name || '')) {\n logger.info(\"Enrichment has content but no real name for ghost, soft-deleting\", { userId: state.userId });\n await this.database.softDeleteGhost(state.userId);\n return { error: \"No real name found for ghost user\" };\n }\n\n logger.verbose(\"Chat API enrichment succeeded\", {\n userId: state.userId,\n skillsCount: enrichment!.attributes.skills.length,\n interestsCount: enrichment!.attributes.interests.length,\n });\n\n // Update user record with enriched data\n const updatePayload: {\n name?: string;\n intro?: string;\n location?: string;\n } = {};\n const enrichedName = enrichment!.identity.name?.trim();\n if (\n enrichedName &&\n shouldEnrichGhostDisplayNameFromParallel(\n { isGhost: !!user.isGhost, name: user.name ?? '', email: user.email ?? '' },\n enrichedName,\n )\n ) {\n updatePayload.name = enrichedName;\n }\n if (enrichment!.identity.bio?.trim()) updatePayload.intro = enrichment!.identity.bio.trim();\n if (enrichment!.identity.location?.trim()) updatePayload.location = enrichment!.identity.location.trim();\n\n const enrichedSocials: { label: string; value: string }[] = [];\n if (enrichment!.socials.twitter) enrichedSocials.push({ label: 'twitter', value: enrichment!.socials.twitter });\n if (enrichment!.socials.linkedin) enrichedSocials.push({ label: 'linkedin', value: enrichment!.socials.linkedin });\n if (enrichment!.socials.github) enrichedSocials.push({ label: 'github', value: enrichment!.socials.github });\n if (enrichment!.socials.telegram) enrichedSocials.push({ label: 'telegram', value: enrichment!.socials.telegram });\n if (enrichment!.socials.websites?.length) {\n for (const w of enrichment!.socials.websites) enrichedSocials.push({ label: 'custom', value: w });\n }\n if (enrichedSocials.length > 0) {\n const existingSocials = await this.database.getUserSocials(state.userId);\n const enrichedLabels = new Set(enrichedSocials.map(s => s.label));\n const kept = existingSocials\n .filter(s => !enrichedLabels.has(s.label) || s.label === 'custom')\n .map(s => ({ label: s.label, value: s.value }));\n const merged = enrichedLabels.has('custom')\n ? [...kept.filter(s => s.label !== 'custom'), ...enrichedSocials]\n : [...kept, ...enrichedSocials];\n await this.database.setUserSocials(state.userId, merged);\n }\n\n if (Object.keys(updatePayload).length > 0) {\n await this.database.updateUser(state.userId, updatePayload);\n }\n\n // Post-enrichment dedup: check if this ghost matches an existing user\n if (user.isGhost) {\n const currentSocials = await this.database.getUserSocials(state.userId);\n const duplicate = await this.database.findDuplicateUser(state.userId, currentSocials);\n if (duplicate) {\n logger.info(\"Post-enrichment dedup: merging ghost into existing user\", {\n ghostId: state.userId,\n targetId: duplicate.id,\n });\n await this.database.mergeGhostUser(state.userId, duplicate.id);\n return { error: `Merged as duplicate of user ${duplicate.id}` };\n }\n }\n\n // Build a text blob from the enrichment result so it flows\n // through premise decomposition (when available) rather than\n // bypassing premises via prePopulatedProfile.\n const enrichmentParts = [\n enrichment!.identity.name ? `My name is ${enrichment!.identity.name}.` : '',\n enrichment!.identity.location ? `I am based in ${enrichment!.identity.location}.` : '',\n enrichment!.identity.bio || '',\n enrichment!.narrative.context || '',\n enrichment!.attributes.skills.length ? `My skills include ${enrichment!.attributes.skills.join(', ')}.` : '',\n enrichment!.attributes.interests.length ? `My interests include ${enrichment!.attributes.interests.join(', ')}.` : '',\n ].filter(Boolean).join('\\n');\n\n return {\n input: enrichmentParts,\n needsUserInfo: false,\n needsProfileGeneration: true,\n forceUpdate: true,\n activeSocialIds: socials.map(s => s.id),\n operationsPerformed: { scraped: true },\n };\n }\n\n if (user.isGhost) {\n logger.info(\"Low-confidence enrichment for ghost, soft-deleting\", { userId: state.userId });\n await this.database.softDeleteGhost(state.userId);\n return { error: \"Enrichment not confident for ghost user\" };\n }\n logger.warn(\"Chat API returned low-signal enrichment, falling back to basic info\", { userId: state.userId });\n } catch (enrichErr) {\n if (user.isGhost) {\n logger.info(\"Enrichment failed for ghost, soft-deleting\", { userId: state.userId });\n await this.database.softDeleteGhost(state.userId);\n return { error: \"Enrichment failed for ghost user\" };\n }\n logger.warn(\"Chat API enrichment failed, falling back to basic info\", {\n userId: state.userId,\n error: enrichErr instanceof Error ? enrichErr.message : String(enrichErr),\n });\n }\n\n return {\n input: buildBasicInfo(),\n needsUserInfo: false,\n needsProfileGeneration: true,\n operationsPerformed: { scraped: true },\n };\n } catch (err) {\n logger.error(\"Auto-generate failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n return { error: `Auto-generate failed: ${err instanceof Error ? err.message : String(err)}` };\n }\n });\n };\n\n // ─────────────────────────────────────────────────────────\n // NODE: Generate Profile\n // Generates profile from input using ProfileGenerator agent.\n // If updating existing profile, merges new information intelligently.\n // ─────────────────────────────────────────────────────────\n const generateProfileNode = async (state: typeof ProfileGraphState.State) => {\n return timed(\"ProfileGraph.generateProfile\", async () => {\n if (!state.input) {\n logger.error(\"No input provided for profile generation\");\n return {\n error: \"Input required for profile generation\"\n };\n }\n\n logger.verbose(\"Starting profile generation...\", {\n hasExistingProfile: !!state.profile,\n isUpdate: state.forceUpdate,\n inputLength: state.input.length\n });\n\n const agentTimingsAccum: DebugMetaAgent[] = [];\n\n try {\n // If updating existing profile, include it in the input for context\n let inputWithContext = state.input;\n if (state.profile && state.forceUpdate) {\n if (state.isAggregate) {\n inputWithContext = `EXISTING PROFILE:\\n${JSON.stringify(state.profile, null, 2)}\\n\\nPREMISE SYNTHESIS:\\n${state.input}\\n\\nRegenerate the profile by synthesizing the premises above. Use the existing profile as context for continuity, but the premises are the authoritative source. Output the full updated profile.`;\n logger.verbose(\"Aggregate synthesis with existing profile context\");\n } else {\n inputWithContext = `EXISTING PROFILE:\\n${JSON.stringify(state.profile, null, 2)}\\n\\nUSER REQUEST:\\n${state.input}\\n\\nApply the user's request to the existing profile. Preserve existing data unless the user asks to change or remove it. You may add, update, or remove skills and interests as requested. Output the full updated profile.`;\n logger.verbose(\"Merging with existing profile\");\n }\n }\n\n const _traceEmitterProfileGen = requestContext.getStore()?.traceEmitter;\n const profileGeneratorStart = Date.now();\n _traceEmitterProfileGen?.({ type: \"agent_start\", name: \"profile-generator\" });\n const result = await profileGenerator.invoke(inputWithContext);\n agentTimingsAccum.push({ name: 'profile.generator', durationMs: Date.now() - profileGeneratorStart });\n _traceEmitterProfileGen?.({ type: \"agent_end\", name: \"profile-generator\", durationMs: Date.now() - profileGeneratorStart, summary: `Generated profile for ${result.output.identity.name || \"user\"}` });\n\n logger.verbose(\"✅ Profile generated successfully\", {\n name: result.output.identity.name,\n skillsCount: result.output.attributes.skills.length,\n interestsCount: result.output.attributes.interests.length\n });\n\n return {\n profile: {\n ...result.output,\n userId: state.userId,\n },\n agentTimings: agentTimingsAccum,\n operationsPerformed: { generatedProfile: true }\n };\n } catch (error) {\n logger.error(\"Profile generation failed\", {\n error: error instanceof Error ? error.message : String(error)\n });\n return {\n error: `Profile generation failed: ${error instanceof Error ? error.message : String(error)}`,\n agentTimings: agentTimingsAccum\n };\n }\n });\n };\n\n // ─────────────────────────────────────────────────────────\n // NODE: Save Profile\n // Saves the generated profile to DB (no embedding)\n // ─────────────────────────────────────────────────────────\n const saveProfileNode = async (state: typeof ProfileGraphState.State) => {\n return timed(\"ProfileGraph.saveProfile\", async () => {\n if (!state.profile || !state.profile.identity) {\n logger.error(\"Profile or identity missing in save step\");\n return {\n error: \"Profile missing in save step\"\n };\n }\n\n logger.verbose(\"Saving profile to DB...\", {\n userId: state.userId\n });\n\n try {\n const profile = { ...state.profile };\n\n await this.database.saveProfile(state.userId, profile);\n\n logger.verbose(\"✅ Profile saved successfully\");\n\n // Fetch active premises so the questioner can see what's already covered\n let existingPremises: string[] = [];\n try {\n const activePremises = await this.database.getPremisesForUser(state.userId, 'ACTIVE');\n existingPremises = activePremises.map(p => p.assertion.text);\n logger.verbose(\"Fetched active premises for questioner context\", {\n userId: state.userId,\n count: existingPremises.length,\n });\n } catch (premiseErr) {\n logger.error(\"Failed to fetch premises for questioner context — continuing with empty list\", {\n userId: state.userId,\n error: premiseErr instanceof Error ? premiseErr.message : String(premiseErr),\n });\n }\n\n // Compute profile gaps from missing fields\n const gaps: string[] = [];\n if (!profile.identity?.location) gaps.push('location');\n if (!profile.attributes?.skills?.length) gaps.push('skills');\n if (!profile.attributes?.interests?.length) gaps.push('interests');\n if (!profile.narrative?.context) gaps.push('current work');\n\n if (gaps.length > 0 && this.questionerEnqueue) {\n this.questionerEnqueue({\n mode: 'profile',\n userId: state.userId,\n sourceType: 'profile',\n sourceId: state.userId,\n context: {\n userProfile: {\n name: profile.identity?.name,\n bio: profile.identity?.bio,\n location: profile.identity?.location,\n skills: profile.attributes?.skills,\n interests: profile.attributes?.interests,\n },\n gaps,\n existingPremises,\n },\n }).catch((err) =>\n logger.error('Failed to enqueue profile question generation', { userId: state.userId, error: err })\n );\n }\n\n return {\n profile,\n operationsPerformed: { savedProfile: true }\n };\n } catch (error) {\n logger.error(\"Failed to save profile\", {\n error: error instanceof Error ? error.message : String(error)\n });\n return {\n error: `Failed to save profile: ${error instanceof Error ? error.message : String(error)}`\n };\n }\n });\n };\n\n // ─────────────────────────────────────────────────────────\n // NODE: Aggregate Profile\n // Fetches the user's active premises and synthesizes them into profile input.\n // Sets state.input and flags so the existing generate_profile pipeline runs.\n // ─────────────────────────────────────────────────────────\n const aggregateProfileNode = async (state: typeof ProfileGraphState.State) => {\n return timed(\"ProfileGraph.aggregateProfile\", async () => {\n logger.verbose(\"Aggregating profile from premises...\", { userId: state.userId });\n\n const premises: PremiseRecord[] = await this.database.getPremisesForUser(state.userId, 'ACTIVE');\n\n if (premises.length === 0) {\n logger.verbose(\"No active premises found — skipping aggregate\");\n return { operationMode: 'query' as const };\n }\n\n const premiseTexts = premises.map(p => p.assertion.text);\n const aggregateInput = `The following are self-descriptions (premises) the user has asserted about themselves:\\n\\n${premiseTexts.map((t, i) => `${i + 1}. ${t}`).join('\\n')}\\n\\nSynthesize these into a cohesive profile.`;\n\n logger.verbose(`Aggregated ${premises.length} premise(s) into profile input`);\n\n return {\n input: aggregateInput,\n needsProfileGeneration: true,\n forceUpdate: true,\n isAggregate: true,\n };\n });\n };\n\n // ─────────────────────────────────────────────────────────\n // NODE: Decompose Premises\n // Decomposes free-text input (chat or scraped) into individual premises,\n // creates each via the premise graph, then routes to aggregate_profile\n // to synthesize the profile from all active premises.\n // ─────────────────────────────────────────────────────────\n const decomposePremisesNode = async (state: typeof ProfileGraphState.State) => {\n return timed(\"ProfileGraph.decomposePremises\", async () => {\n if (!state.input) {\n logger.error(\"No input for premise decomposition\");\n return { error: \"Input required for premise decomposition\" };\n }\n\n if (!this.premiseGraph) {\n // Fallback: if no premise graph is available, skip decomposition\n // and route directly to profile generation (legacy behavior)\n logger.warn(\"No premise graph injected — falling back to direct profile generation\");\n return {\n needsProfileGeneration: true,\n forceUpdate: true,\n };\n }\n\n logger.verbose(\"Decomposing input into premises...\", {\n userId: state.userId,\n inputLength: state.input.length,\n });\n\n const agentTimingsAccum: DebugMetaAgent[] = [];\n\n try {\n const _traceEmitter = requestContext.getStore()?.traceEmitter;\n\n const decomposeStart = Date.now();\n _traceEmitter?.({ type: \"agent_start\", name: \"premise-decomposer\" });\n const result = await premiseDecomposer.invoke(state.input);\n const decomposeMs = Date.now() - decomposeStart;\n agentTimingsAccum.push({ name: \"premise.decomposer\", durationMs: decomposeMs });\n _traceEmitter?.({\n type: \"agent_end\",\n name: \"premise-decomposer\",\n durationMs: decomposeMs,\n summary: `Decomposed into ${result.premises.length} premise(s)`,\n });\n\n if (result.premises.length === 0) {\n logger.verbose(\"No premises extracted — skipping decomposition\");\n // No premises found; fall through to aggregate which will\n // synthesize from any existing premises, or to generate_profile\n // if needsProfileGeneration is still set from check_state\n return {\n operationMode: 'aggregate' as const,\n agentTimings: agentTimingsAccum,\n };\n }\n\n logger.verbose(`Creating ${result.premises.length} premise(s) via premise graph`, {\n userId: state.userId,\n });\n\n let created = 0;\n for (const p of result.premises) {\n try {\n const premiseResult = await invokeWithAbortSignal(this.premiseGraph, {\n userId: state.userId,\n assertionText: p.text,\n tier: p.tier,\n operationMode: 'create',\n ...(state.activeSocialIds?.length\n ? { provenanceSource: 'integration' as const, provenanceSourceId: state.activeSocialIds[0] }\n : {}),\n });\n\n if (premiseResult.premise) {\n created++;\n } else if (premiseResult.error) {\n logger.warn(\"Premise creation failed\", {\n text: p.text.substring(0, 60),\n error: premiseResult.error,\n });\n }\n } catch (err) {\n logger.warn(\"Premise creation threw\", {\n text: p.text.substring(0, 60),\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n logger.verbose(`Created ${created}/${result.premises.length} premise(s)`, {\n userId: state.userId,\n });\n\n // Route to aggregate mode to rebuild the profile from all active premises\n return {\n operationMode: 'aggregate' as const,\n agentTimings: agentTimingsAccum,\n operationsPerformed: { decomposedPremises: true },\n };\n } catch (err) {\n logger.error(\"Premise decomposition failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n // Fallback: route to direct profile generation\n return {\n needsProfileGeneration: true,\n forceUpdate: true,\n agentTimings: agentTimingsAccum,\n };\n }\n });\n };\n\n // ─────────────────────────────────────────────────────────\n // ROUTING CONDITIONS\n // Smart conditional routing based on operation mode and missing components\n // ─────────────────────────────────────────────────────────\n\n /**\n * Route from check_state to next step based on operation mode and detected needs.\n */\n const checkStateCondition = (state: typeof ProfileGraphState.State): string => {\n // Query mode: Return immediately (fast path)\n if (state.operationMode === 'query') {\n logger.verbose(\"Query mode - ending (fast path)\");\n return END;\n }\n\n // Aggregate mode: Synthesize profile from active premises\n if (state.operationMode === 'aggregate') {\n logger.verbose(\"Aggregate mode - synthesizing profile from premises\");\n return \"aggregate_profile\";\n }\n\n // Generate mode: use enrichUserProfile Chat API to auto-generate\n if (state.operationMode === 'generate') {\n logger.verbose(\"Generate mode - routing to auto_generate\");\n return \"auto_generate\";\n }\n\n // Check if user information is insufficient for scraping\n // Return early so chat graph can request the missing information\n if (state.needsUserInfo) {\n logger.verbose(\"⚠️ Insufficient user info - requesting from user\", {\n missingInfo: state.missingUserInfo\n });\n return END;\n }\n\n // Write mode: Check what needs generation\n if (state.needsProfileGeneration) {\n // Only use provided input if it's meaningful (not just \"Yes\" / confirmation)\n if (state.input && isMeaningfulProfileInput(state.input)) {\n // Route through premise decomposition when a premise graph is available.\n // The decompose node extracts atomic premises, creates them, then\n // routes to aggregate_profile for profile synthesis.\n if (this.premiseGraph) {\n logger.verbose(\"Profile generation needed — decomposing input into premises\");\n return \"decompose_premises\";\n }\n logger.verbose(\"Profile generation needed with meaningful input provided\");\n return \"generate_profile\";\n } else {\n logger.verbose(\"Profile generation needed - scraping first (no meaningful input)\");\n return \"scrape\";\n }\n }\n\n // Everything exists and is up to date\n logger.verbose(\"All components exist - ending\");\n return END;\n };\n\n\n // ─────────────────────────────────────────────────────────\n // GRAPH ASSEMBLY\n // Conditional flow based on operation mode and detected needs\n // ─────────────────────────────────────────────────────────\n\n const workflow = new StateGraph(ProfileGraphState)\n // Add all nodes\n .addNode(\"check_state\", checkStateNode)\n .addNode(\"scrape\", scrapeNode)\n .addNode(\"decompose_premises\", decomposePremisesNode)\n .addNode(\"auto_generate\", autoGenerateNode)\n .addNode(\"aggregate_profile\", aggregateProfileNode)\n .addNode(\"generate_profile\", generateProfileNode)\n .addNode(\"save_profile\", saveProfileNode)\n\n // Start with state check\n .addEdge(START, \"check_state\")\n\n // Conditional routing from check_state\n .addConditionalEdges(\n \"check_state\",\n checkStateCondition,\n {\n auto_generate: \"auto_generate\", // Generate mode -> Chat API enrichment\n aggregate_profile: \"aggregate_profile\", // Aggregate mode -> synthesize from premises\n decompose_premises: \"decompose_premises\", // Write mode + input + premise graph -> decompose first\n scrape: \"scrape\", // Need profile, no input -> scrape first\n generate_profile: \"generate_profile\", // Need profile, have input -> generate (legacy, no premise graph)\n [END]: END // Query mode or everything exists\n }\n )\n\n // Decompose premises routes to aggregate (normal) or generate_profile (fallback)\n .addConditionalEdges(\n \"decompose_premises\",\n (state: typeof ProfileGraphState.State) => {\n if (state.operationMode === 'aggregate') return \"aggregate_profile\";\n // Fallback when decomposition failed (no premise graph or error)\n if (state.needsProfileGeneration) return \"generate_profile\";\n return \"aggregate_profile\";\n },\n {\n aggregate_profile: \"aggregate_profile\",\n generate_profile: \"generate_profile\",\n },\n )\n\n // Aggregate profile: generate if premises found, END if none\n .addConditionalEdges(\n \"aggregate_profile\",\n (state: typeof ProfileGraphState.State) => {\n if (state.needsProfileGeneration) return \"generate_profile\";\n logger.verbose(\"Aggregate mode — no premises, ending\");\n return END;\n },\n { generate_profile: \"generate_profile\", [END]: END },\n )\n\n // Auto-generate routes to decompose_premises (when premise graph\n // available) or generate_profile (legacy, no premise graph)\n .addConditionalEdges(\n \"auto_generate\",\n (state: typeof ProfileGraphState.State) => {\n if (state.input && this.premiseGraph) {\n logger.verbose(\"Enrichment produced input — routing to premise decomposition\");\n return \"decompose_premises\";\n }\n if (state.input) {\n logger.verbose(\"Enrichment produced input — routing to LLM generation (no premise graph)\");\n return \"generate_profile\";\n }\n logger.verbose(\"Enrichment ended without data (ghost soft-deleted or error) — done\");\n return END;\n },\n {\n decompose_premises: \"decompose_premises\",\n generate_profile: \"generate_profile\",\n [END]: END,\n }\n )\n\n // Scrape -> decompose_premises (when premise graph available) or generate_profile (legacy)\n .addConditionalEdges(\n \"scrape\",\n (_state: typeof ProfileGraphState.State) => {\n if (this.premiseGraph) return \"decompose_premises\";\n return \"generate_profile\";\n },\n {\n decompose_premises: \"decompose_premises\",\n generate_profile: \"generate_profile\",\n },\n )\n\n // Generate profile -> Save profile (linear)\n .addEdge(\"generate_profile\", \"save_profile\")\n\n // Save profile -> END (linear)\n .addEdge(\"save_profile\", END);\n\n logger.verbose(\"Graph built successfully\");\n return workflow.compile();\n }\n}\n"]}
@@ -38,6 +38,13 @@ export declare const ProfileGraphState: import("@langchain/langgraph").Annotatio
38
38
  * Raw input data (either provided or scraped).
39
39
  */
40
40
  input: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
41
+ /**
42
+ * IDs of the user_socials records active during the current scrape/generate run.
43
+ * Populated by scrapeNode and autoGenerateNode after getUserSocials is called.
44
+ * Empty by default; read by decomposePremisesNode to set provenanceSource:
45
+ * 'integration' + provenanceSourceId when premises derive from social enrichment.
46
+ */
47
+ activeSocialIds: import("@langchain/langgraph").BaseChannel<string[], string[] | import("@langchain/langgraph").OverwriteValue<string[]>, unknown>;
41
48
  /**
42
49
  * The generated or loaded profile document.
43
50
  */
@@ -1 +1 @@
1
- {"version":3,"file":"profile.state.d.ts","sourceRoot":"/","sources":["profile/profile.state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE;;GAEG;AACH,eAAO,MAAM,iBAAiB;IAE5B;;OAEG;;;;;;IAKH;;;;;;OAMG;;IAMH;;;OAGG;;IAMH;;;OAGG;;IAQH;;OAEG;;IAMH;;OAEG;;IAMH;;OAEG;;IAMH;;OAEG;;IAMH;;;OAGG;;IAMH;;;OAGG;;IAQH;;OAEG;;IAQH;;;OAGG;;kBAES,OAAO;6BACI,OAAO;2BACT,OAAO;uBACX,OAAO;;kBAHZ,OAAO;6BACI,OAAO;2BACT,OAAO;uBACX,OAAO;;kBAHZ,OAAO;6BACI,OAAO;2BACT,OAAO;uBACX,OAAO;;IAMxB,sEAAsE;;IAMtE;;OAEG;;oBAEW,OAAO;kBACT;YACR,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,GAAG,EAAE,MAAM,CAAC;YACZ,QAAQ,EAAE,MAAM,CAAC;YACjB,MAAM,EAAE,MAAM,EAAE,CAAC;YACjB,SAAS,EAAE,MAAM,EAAE,CAAC;SACrB;kBACS,MAAM;;oBATJ,OAAO;kBACT;YACR,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,GAAG,EAAE,MAAM,CAAC;YACZ,QAAQ,EAAE,MAAM,CAAC;YACjB,MAAM,EAAE,MAAM,EAAE,CAAC;YACjB,SAAS,EAAE,MAAM,EAAE,CAAC;SACrB;kBACS,MAAM;;oBATJ,OAAO;kBACT;YACR,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,GAAG,EAAE,MAAM,CAAC;YACZ,QAAQ,EAAE,MAAM,CAAC;YACjB,MAAM,EAAE,MAAM,EAAE,CAAC;YACjB,SAAS,EAAE,MAAM,EAAE,CAAC;SACrB;kBACS,MAAM;;EAKlB,CAAC"}
1
+ {"version":3,"file":"profile.state.d.ts","sourceRoot":"/","sources":["profile/profile.state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE;;GAEG;AACH,eAAO,MAAM,iBAAiB;IAE5B;;OAEG;;;;;;IAKH;;;;;;OAMG;;IAMH;;;OAGG;;IAMH;;;OAGG;;IAQH;;OAEG;;IAMH;;OAEG;;IAMH;;;;;OAKG;;IAMH;;OAEG;;IAMH;;OAEG;;IAMH;;;OAGG;;IAMH;;;OAGG;;IAQH;;OAEG;;IAQH;;;OAGG;;kBAES,OAAO;6BACI,OAAO;2BACT,OAAO;uBACX,OAAO;;kBAHZ,OAAO;6BACI,OAAO;2BACT,OAAO;uBACX,OAAO;;kBAHZ,OAAO;6BACI,OAAO;2BACT,OAAO;uBACX,OAAO;;IAMxB,sEAAsE;;IAMtE;;OAEG;;oBAEW,OAAO;kBACT;YACR,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,GAAG,EAAE,MAAM,CAAC;YACZ,QAAQ,EAAE,MAAM,CAAC;YACjB,MAAM,EAAE,MAAM,EAAE,CAAC;YACjB,SAAS,EAAE,MAAM,EAAE,CAAC;SACrB;kBACS,MAAM;;oBATJ,OAAO;kBACT;YACR,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,GAAG,EAAE,MAAM,CAAC;YACZ,QAAQ,EAAE,MAAM,CAAC;YACjB,MAAM,EAAE,MAAM,EAAE,CAAC;YACjB,SAAS,EAAE,MAAM,EAAE,CAAC;SACrB;kBACS,MAAM;;oBATJ,OAAO;kBACT;YACR,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,GAAG,EAAE,MAAM,CAAC;YACZ,QAAQ,EAAE,MAAM,CAAC;YACjB,MAAM,EAAE,MAAM,EAAE,CAAC;YACjB,SAAS,EAAE,MAAM,EAAE,CAAC;SACrB;kBACS,MAAM;;EAKlB,CAAC"}
@@ -51,6 +51,16 @@ export const ProfileGraphState = Annotation.Root({
51
51
  reducer: (curr, next) => next,
52
52
  default: () => undefined,
53
53
  }),
54
+ /**
55
+ * IDs of the user_socials records active during the current scrape/generate run.
56
+ * Populated by scrapeNode and autoGenerateNode after getUserSocials is called.
57
+ * Empty by default; read by decomposePremisesNode to set provenanceSource:
58
+ * 'integration' + provenanceSourceId when premises derive from social enrichment.
59
+ */
60
+ activeSocialIds: Annotation({
61
+ reducer: (_, next) => next ?? [],
62
+ default: () => [],
63
+ }),
54
64
  /**
55
65
  * The generated or loaded profile document.
56
66
  */
@@ -1 +1 @@
1
- {"version":3,"file":"profile.state.js","sourceRoot":"/","sources":["profile/profile.state.ts"],"names":[],"mappings":"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","sourcesContent":["import { Annotation } from \"@langchain/langgraph\";\nimport { ProfileDocument } from \"./profile.generator.js\";\nimport type { DebugMetaAgent } from '../chat/chat-streaming.types.js';\n\n/**\n * The Graph State for Profile Generation.\n */\nexport const ProfileGraphState = Annotation.Root({\n // --- Inputs (Required at start) ---\n /**\n * The User ID to link the profile to.\n */\n userId: Annotation<string>,\n\n // --- Control Fields (Operation Mode) ---\n\n /**\n * Operation mode controls graph flow:\n * - 'query': Fast path - only retrieve existing profile (no generation)\n * - 'write': Full pipeline - generate/update profile and hyde as needed\n * - 'generate': Auto-generate profile from user table data via enrichUserProfile Chat API\n * - 'aggregate': Synthesize profile from the user's active premises\n */\n operationMode: Annotation<'query' | 'write' | 'generate' | 'aggregate'>({\n reducer: (curr, next) => next ?? curr,\n default: () => 'write',\n }),\n\n /**\n * Flag to force profile regeneration even if profile exists.\n * When true with new input, the graph will re-generate and update the profile.\n */\n forceUpdate: Annotation<boolean>({\n reducer: (curr, next) => next ?? curr,\n default: () => false,\n }),\n\n /**\n * Flag indicating the profile is being regenerated from aggregated premises.\n * When true, `generate_profile` uses synthesis framing instead of \"apply user request\" framing.\n */\n isAggregate: Annotation<boolean>({\n reducer: (curr, next) => next ?? curr,\n default: () => false,\n }),\n\n // --- Intermediate State ---\n\n /**\n * Internal objective constructed from user data.\n */\n objective: Annotation<string | undefined>({\n reducer: (curr, next) => next,\n default: () => undefined,\n }),\n\n /**\n * Raw input data (either provided or scraped).\n */\n input: Annotation<string | undefined>({\n reducer: (curr, next) => next,\n default: () => undefined,\n }),\n\n /**\n * The generated or loaded profile document.\n */\n profile: Annotation<ProfileDocument | undefined>({\n reducer: (curr, next) => next,\n default: () => undefined,\n }),\n\n /**\n * Flags to track what needs to be generated.\n */\n needsProfileGeneration: Annotation<boolean>({\n reducer: (curr, next) => next ?? curr,\n default: () => false,\n }),\n\n /**\n * Flag indicating that user information is insufficient for accurate profile generation.\n * When true, the graph should request additional information from the user.\n */\n needsUserInfo: Annotation<boolean>({\n reducer: (curr, next) => next ?? curr,\n default: () => false,\n }),\n\n /**\n * List of missing user information fields.\n * Used to construct a helpful clarification message.\n */\n missingUserInfo: Annotation<string[]>({\n reducer: (curr, next) => next ?? curr,\n default: () => [],\n }),\n\n // --- Output ---\n\n /**\n * Error message if any step fails (non-fatal).\n */\n error: Annotation<string | undefined>({\n reducer: (curr, next) => next,\n default: () => undefined,\n }),\n\n // --- Operation Tracking (for transparency) ---\n\n /**\n * Tracks which operations were actually performed during this graph execution.\n * Used to provide explicit feedback to the user about what happened.\n */\n operationsPerformed: Annotation<{\n scraped?: boolean;\n decomposedPremises?: boolean;\n generatedProfile?: boolean;\n savedProfile?: boolean;\n }>({\n reducer: (curr, next) => ({ ...curr, ...next }),\n default: () => ({}),\n }),\n\n /** Timing records for each agent invocation within this graph run. */\n agentTimings: Annotation<DebugMetaAgent[]>({\n reducer: (acc, val) => [...acc, ...val],\n default: () => [],\n }),\n\n /**\n * Output for query mode: structured result for the tool to read.\n */\n readResult: Annotation<{\n hasProfile: boolean;\n profile?: {\n id?: string;\n name: string;\n bio: string;\n location: string;\n skills: string[];\n interests: string[];\n };\n message?: string;\n } | undefined>({\n reducer: (curr, next) => next,\n default: () => undefined,\n }),\n});\n"]}
1
+ {"version":3,"file":"profile.state.js","sourceRoot":"/","sources":["profile/profile.state.ts"],"names":[],"mappings":"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","sourcesContent":["import { Annotation } from \"@langchain/langgraph\";\nimport { ProfileDocument } from \"./profile.generator.js\";\nimport type { DebugMetaAgent } from '../chat/chat-streaming.types.js';\n\n/**\n * The Graph State for Profile Generation.\n */\nexport const ProfileGraphState = Annotation.Root({\n // --- Inputs (Required at start) ---\n /**\n * The User ID to link the profile to.\n */\n userId: Annotation<string>,\n\n // --- Control Fields (Operation Mode) ---\n\n /**\n * Operation mode controls graph flow:\n * - 'query': Fast path - only retrieve existing profile (no generation)\n * - 'write': Full pipeline - generate/update profile and hyde as needed\n * - 'generate': Auto-generate profile from user table data via enrichUserProfile Chat API\n * - 'aggregate': Synthesize profile from the user's active premises\n */\n operationMode: Annotation<'query' | 'write' | 'generate' | 'aggregate'>({\n reducer: (curr, next) => next ?? curr,\n default: () => 'write',\n }),\n\n /**\n * Flag to force profile regeneration even if profile exists.\n * When true with new input, the graph will re-generate and update the profile.\n */\n forceUpdate: Annotation<boolean>({\n reducer: (curr, next) => next ?? curr,\n default: () => false,\n }),\n\n /**\n * Flag indicating the profile is being regenerated from aggregated premises.\n * When true, `generate_profile` uses synthesis framing instead of \"apply user request\" framing.\n */\n isAggregate: Annotation<boolean>({\n reducer: (curr, next) => next ?? curr,\n default: () => false,\n }),\n\n // --- Intermediate State ---\n\n /**\n * Internal objective constructed from user data.\n */\n objective: Annotation<string | undefined>({\n reducer: (curr, next) => next,\n default: () => undefined,\n }),\n\n /**\n * Raw input data (either provided or scraped).\n */\n input: Annotation<string | undefined>({\n reducer: (curr, next) => next,\n default: () => undefined,\n }),\n\n /**\n * IDs of the user_socials records active during the current scrape/generate run.\n * Populated by scrapeNode and autoGenerateNode after getUserSocials is called.\n * Empty by default; read by decomposePremisesNode to set provenanceSource:\n * 'integration' + provenanceSourceId when premises derive from social enrichment.\n */\n activeSocialIds: Annotation<string[]>({\n reducer: (_, next) => next ?? [],\n default: () => [],\n }),\n\n /**\n * The generated or loaded profile document.\n */\n profile: Annotation<ProfileDocument | undefined>({\n reducer: (curr, next) => next,\n default: () => undefined,\n }),\n\n /**\n * Flags to track what needs to be generated.\n */\n needsProfileGeneration: Annotation<boolean>({\n reducer: (curr, next) => next ?? curr,\n default: () => false,\n }),\n\n /**\n * Flag indicating that user information is insufficient for accurate profile generation.\n * When true, the graph should request additional information from the user.\n */\n needsUserInfo: Annotation<boolean>({\n reducer: (curr, next) => next ?? curr,\n default: () => false,\n }),\n\n /**\n * List of missing user information fields.\n * Used to construct a helpful clarification message.\n */\n missingUserInfo: Annotation<string[]>({\n reducer: (curr, next) => next ?? curr,\n default: () => [],\n }),\n\n // --- Output ---\n\n /**\n * Error message if any step fails (non-fatal).\n */\n error: Annotation<string | undefined>({\n reducer: (curr, next) => next,\n default: () => undefined,\n }),\n\n // --- Operation Tracking (for transparency) ---\n\n /**\n * Tracks which operations were actually performed during this graph execution.\n * Used to provide explicit feedback to the user about what happened.\n */\n operationsPerformed: Annotation<{\n scraped?: boolean;\n decomposedPremises?: boolean;\n generatedProfile?: boolean;\n savedProfile?: boolean;\n }>({\n reducer: (curr, next) => ({ ...curr, ...next }),\n default: () => ({}),\n }),\n\n /** Timing records for each agent invocation within this graph run. */\n agentTimings: Annotation<DebugMetaAgent[]>({\n reducer: (acc, val) => [...acc, ...val],\n default: () => [],\n }),\n\n /**\n * Output for query mode: structured result for the tool to read.\n */\n readResult: Annotation<{\n hasProfile: boolean;\n profile?: {\n id?: string;\n name: string;\n bio: string;\n location: string;\n skills: string[];\n interests: string[];\n };\n message?: string;\n } | undefined>({\n reducer: (curr, next) => next,\n default: () => undefined,\n }),\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indexnetwork/protocol",
3
- "version": "3.1.1-rc.251.1",
3
+ "version": "3.2.0-rc.252.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",