spora 0.7.8 → 0.7.10

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,69 +0,0 @@
1
- import {
2
- logInteraction
3
- } from "./chunk-6WBIVXOY.js";
4
-
5
- // src/runtime/heartbeat-narrative.ts
6
- function clip(text, max = 70) {
7
- if (!text) return "";
8
- const clean = text.replace(/\s+/g, " ").trim();
9
- if (clean.length <= max) return clean;
10
- return `${clean.slice(0, max - 3)}...`;
11
- }
12
- function actionLine(action, result) {
13
- const outcome = result.success ? "ok" : "fail";
14
- if (action.action === "post") {
15
- return `${outcome} post "${clip(action.content)}"`;
16
- }
17
- if (action.action === "reply") {
18
- return `${outcome} reply "${clip(action.content)}"${action.tweetId ? ` -> ${action.tweetId}` : ""}`;
19
- }
20
- if (action.action === "follow") {
21
- return `${outcome} follow @${action.handle ?? "unknown"}`;
22
- }
23
- if (action.action === "like" || action.action === "retweet") {
24
- return `${outcome} ${action.action}${action.tweetId ? ` ${action.tweetId}` : ""}`;
25
- }
26
- if (action.action === "skip") {
27
- return `skip ${clip(action.reason ?? action.reasoning, 40)}`;
28
- }
29
- return `${outcome} ${action.action}`;
30
- }
31
- function buildHeartbeatNarrative(input) {
32
- const { heartbeatCount, timelineCount, mentionsCount, actions, results } = input;
33
- const successCount = results.filter((r) => r.success).length;
34
- const details = [];
35
- for (let i = 0; i < actions.length; i += 1) {
36
- const action = actions[i];
37
- const result = results[i];
38
- if (!action || !result) continue;
39
- details.push(actionLine(action, result));
40
- }
41
- if (actions.length === 0) {
42
- return {
43
- summary: `Heartbeat #${heartbeatCount}: scanned ${timelineCount} timeline + ${mentionsCount} mentions, took no actions.`,
44
- details
45
- };
46
- }
47
- const preview = details.slice(0, 3).join(" | ");
48
- return {
49
- summary: `Heartbeat #${heartbeatCount}: scanned ${timelineCount}/${mentionsCount}, executed ${actions.length} actions (${successCount} ok). ${preview}`,
50
- details
51
- };
52
- }
53
- function saveHeartbeatNarrative(narrative, success) {
54
- logInteraction({
55
- id: `heartbeat-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
56
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
57
- type: "heartbeat",
58
- content: narrative.slice(0, 500),
59
- targetHandle: "self",
60
- creditsUsed: 0,
61
- success
62
- });
63
- }
64
-
65
- export {
66
- buildHeartbeatNarrative,
67
- saveHeartbeatNarrative
68
- };
69
- //# sourceMappingURL=chunk-OLYPPXKP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/heartbeat-narrative.ts"],"sourcesContent":["import { logInteraction } from \"../memory/index.js\";\nimport type { AgentAction, ActionResult } from \"./decision-engine.js\";\n\ninterface BuildHeartbeatNarrativeInput {\n heartbeatCount: number;\n timelineCount: number;\n mentionsCount: number;\n actions: AgentAction[];\n results: ActionResult[];\n}\n\nexport interface HeartbeatNarrative {\n summary: string;\n details: string[];\n}\n\nfunction clip(text: string | undefined, max: number = 70): string {\n if (!text) return \"\";\n const clean = text.replace(/\\s+/g, \" \").trim();\n if (clean.length <= max) return clean;\n return `${clean.slice(0, max - 3)}...`;\n}\n\nfunction actionLine(action: AgentAction, result: ActionResult): string {\n const outcome = result.success ? \"ok\" : \"fail\";\n if (action.action === \"post\") {\n return `${outcome} post \"${clip(action.content)}\"`;\n }\n if (action.action === \"reply\") {\n return `${outcome} reply \"${clip(action.content)}\"${action.tweetId ? ` -> ${action.tweetId}` : \"\"}`;\n }\n if (action.action === \"follow\") {\n return `${outcome} follow @${action.handle ?? \"unknown\"}`;\n }\n if (action.action === \"like\" || action.action === \"retweet\") {\n return `${outcome} ${action.action}${action.tweetId ? ` ${action.tweetId}` : \"\"}`;\n }\n if (action.action === \"skip\") {\n return `skip ${clip(action.reason ?? action.reasoning, 40)}`;\n }\n return `${outcome} ${action.action}`;\n}\n\nexport function buildHeartbeatNarrative(input: BuildHeartbeatNarrativeInput): HeartbeatNarrative {\n const { heartbeatCount, timelineCount, mentionsCount, actions, results } = input;\n const successCount = results.filter((r) => r.success).length;\n\n const details: string[] = [];\n for (let i = 0; i < actions.length; i += 1) {\n const action = actions[i];\n const result = results[i];\n if (!action || !result) continue;\n details.push(actionLine(action, result));\n }\n\n if (actions.length === 0) {\n return {\n summary: `Heartbeat #${heartbeatCount}: scanned ${timelineCount} timeline + ${mentionsCount} mentions, took no actions.`,\n details,\n };\n }\n\n const preview = details.slice(0, 3).join(\" | \");\n return {\n summary: `Heartbeat #${heartbeatCount}: scanned ${timelineCount}/${mentionsCount}, executed ${actions.length} actions (${successCount} ok). ${preview}`,\n details,\n };\n}\n\nexport function saveHeartbeatNarrative(narrative: string, success: boolean): void {\n logInteraction({\n id: `heartbeat-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n timestamp: new Date().toISOString(),\n type: \"heartbeat\",\n content: narrative.slice(0, 500),\n targetHandle: \"self\",\n creditsUsed: 0,\n success,\n });\n}\n\n"],"mappings":";;;;;AAgBA,SAAS,KAAK,MAA0B,MAAc,IAAY;AAChE,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,QAAQ,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC7C,MAAI,MAAM,UAAU,IAAK,QAAO;AAChC,SAAO,GAAG,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC;AACnC;AAEA,SAAS,WAAW,QAAqB,QAA8B;AACrE,QAAM,UAAU,OAAO,UAAU,OAAO;AACxC,MAAI,OAAO,WAAW,QAAQ;AAC5B,WAAO,GAAG,OAAO,UAAU,KAAK,OAAO,OAAO,CAAC;AAAA,EACjD;AACA,MAAI,OAAO,WAAW,SAAS;AAC7B,WAAO,GAAG,OAAO,WAAW,KAAK,OAAO,OAAO,CAAC,IAAI,OAAO,UAAU,OAAO,OAAO,OAAO,KAAK,EAAE;AAAA,EACnG;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,GAAG,OAAO,YAAY,OAAO,UAAU,SAAS;AAAA,EACzD;AACA,MAAI,OAAO,WAAW,UAAU,OAAO,WAAW,WAAW;AAC3D,WAAO,GAAG,OAAO,IAAI,OAAO,MAAM,GAAG,OAAO,UAAU,IAAI,OAAO,OAAO,KAAK,EAAE;AAAA,EACjF;AACA,MAAI,OAAO,WAAW,QAAQ;AAC5B,WAAO,QAAQ,KAAK,OAAO,UAAU,OAAO,WAAW,EAAE,CAAC;AAAA,EAC5D;AACA,SAAO,GAAG,OAAO,IAAI,OAAO,MAAM;AACpC;AAEO,SAAS,wBAAwB,OAAyD;AAC/F,QAAM,EAAE,gBAAgB,eAAe,eAAe,SAAS,QAAQ,IAAI;AAC3E,QAAM,eAAe,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAEtD,QAAM,UAAoB,CAAC;AAC3B,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;AAC1C,UAAM,SAAS,QAAQ,CAAC;AACxB,UAAM,SAAS,QAAQ,CAAC;AACxB,QAAI,CAAC,UAAU,CAAC,OAAQ;AACxB,YAAQ,KAAK,WAAW,QAAQ,MAAM,CAAC;AAAA,EACzC;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,MACL,SAAS,cAAc,cAAc,aAAa,aAAa,eAAe,aAAa;AAAA,MAC3F;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,MAAM,GAAG,CAAC,EAAE,KAAK,KAAK;AAC9C,SAAO;AAAA,IACL,SAAS,cAAc,cAAc,aAAa,aAAa,IAAI,aAAa,cAAc,QAAQ,MAAM,aAAa,YAAY,SAAS,OAAO;AAAA,IACrJ;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,WAAmB,SAAwB;AAChF,iBAAe;AAAA,IACb,IAAI,aAAa,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,IACrE,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,MAAM;AAAA,IACN,SAAS,UAAU,MAAM,GAAG,GAAG;AAAA,IAC/B,cAAc;AAAA,IACd,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/decision-engine.ts","../src/runtime/policy.ts","../src/runtime/bandit.ts","../src/runtime/autonomy.ts"],"sourcesContent":["import { logger } from \"../utils/logger.js\";\nimport { getXClient } from \"../x-client/index.js\";\nimport { addLearning, logInteraction } from \"../memory/index.js\";\nimport { loadIdentity, saveIdentity } from \"../identity/index.js\";\nimport { addToQueue } from \"../scheduler/queue.js\";\n\nexport interface AgentAction {\n action: string;\n content?: string;\n tweetId?: string;\n handle?: string;\n targetHandle?: string;\n source?: string;\n banditArm?: string;\n opportunityId?: string;\n intentIds?: string[];\n tags?: string[];\n reason?: string;\n reasoning?: string;\n}\n\nexport interface ActionResult {\n action: string;\n success: boolean;\n detail?: string;\n error?: string;\n}\n\nexport function parseActions(llmResponse: string): AgentAction[] {\n // Strategy: try multiple extraction approaches, most specific first\n\n // 1. Try markdown code block first (```json ... ``` or ``` ... ```)\n const codeBlockMatch = llmResponse.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)```/);\n if (codeBlockMatch) {\n const inside = codeBlockMatch[1].trim();\n try {\n const parsed = JSON.parse(inside);\n return Array.isArray(parsed) ? parsed : [parsed];\n } catch {\n // Code block content wasn't valid JSON, continue to other strategies\n }\n }\n\n // 2. Find the last JSON array in the response (LLMs often put reasoning before the array)\n // Use a greedy approach to find the outermost array brackets\n let lastArrayStart = -1;\n let lastArrayEnd = -1;\n let depth = 0;\n for (let i = 0; i < llmResponse.length; i++) {\n if (llmResponse[i] === \"[\") {\n if (depth === 0) lastArrayStart = i;\n depth++;\n } else if (llmResponse[i] === \"]\") {\n depth--;\n if (depth === 0) lastArrayEnd = i;\n }\n }\n\n if (lastArrayStart >= 0 && lastArrayEnd > lastArrayStart) {\n const arrayStr = llmResponse.slice(lastArrayStart, lastArrayEnd + 1);\n try {\n const parsed = JSON.parse(arrayStr);\n if (Array.isArray(parsed) && parsed.length > 0 && parsed[0].action) {\n return parsed;\n }\n } catch {\n // Not valid JSON array, try next strategy\n }\n }\n\n // 3. Try to find a single action object (last one in the response)\n const objMatches = [...llmResponse.matchAll(/\\{[^{}]*\"action\"\\s*:\\s*\"[^\"]+\"/g)];\n if (objMatches.length > 0) {\n // Find the full object starting from this match\n for (let i = objMatches.length - 1; i >= 0; i--) {\n const start = objMatches[i].index!;\n let braceDepth = 0;\n let end = -1;\n for (let j = start; j < llmResponse.length; j++) {\n if (llmResponse[j] === \"{\") braceDepth++;\n else if (llmResponse[j] === \"}\") {\n braceDepth--;\n if (braceDepth === 0) { end = j; break; }\n }\n }\n if (end > start) {\n try {\n const obj = JSON.parse(llmResponse.slice(start, end + 1));\n if (obj.action) return [obj as AgentAction];\n } catch {\n continue;\n }\n }\n }\n }\n\n // 4. Last resort: try the whole response as JSON\n try {\n const parsed = JSON.parse(llmResponse.trim());\n if (Array.isArray(parsed)) return parsed;\n if (parsed.action) return [parsed as AgentAction];\n } catch {\n // Not JSON at all\n }\n\n logger.warn(\"Failed to parse actions from LLM response\");\n if (llmResponse.length < 500) {\n logger.warn(`Response was: ${llmResponse}`);\n } else {\n logger.warn(`Response starts with: ${llmResponse.slice(0, 200)}...`);\n }\n return [];\n}\n\nexport async function executeAction(action: AgentAction): Promise<ActionResult> {\n const { action: type } = action;\n\n try {\n switch (type) {\n case \"post\": {\n if (!action.content) return { action: type, success: false, error: \"No content provided\" };\n if (action.content.length > 280) {\n return { action: type, success: false, error: `Tweet too long: ${action.content.length} chars (max 280)` };\n }\n\n const client = await getXClient();\n const result = await client.postTweet(action.content);\n if (result.success) logger.info(`Posted: \"${action.content.slice(0, 50)}...\"`);\n return { action: type, success: result.success, detail: result.tweetId, error: result.error };\n }\n\n case \"reply\": {\n if (!action.tweetId || !action.content) {\n return { action: type, success: false, error: \"Missing tweetId or content\" };\n }\n const client = await getXClient();\n const result = await client.replyToTweet(action.tweetId, action.content);\n if (result.success) logger.info(`Replied to ${action.tweetId}: \"${action.content.slice(0, 50)}...\"`);\n return { action: type, success: result.success, detail: result.tweetId, error: result.error };\n }\n\n case \"like\": {\n if (!action.tweetId) return { action: type, success: false, error: \"Missing tweetId\" };\n const client = await getXClient();\n const result = await client.likeTweet(action.tweetId);\n return { action: type, success: result.success, error: result.error };\n }\n\n case \"retweet\": {\n if (!action.tweetId) return { action: type, success: false, error: \"Missing tweetId\" };\n const client = await getXClient();\n const result = await client.retweet(action.tweetId);\n return { action: type, success: result.success, error: result.error };\n }\n\n case \"follow\": {\n if (!action.handle) return { action: type, success: false, error: \"Missing handle\" };\n const client = await getXClient();\n const result = await client.followUser(action.handle);\n if (!result.success) {\n logInteraction({\n id: `int-${Date.now()}`,\n timestamp: new Date().toISOString(),\n type: \"follow\",\n targetHandle: action.handle.replace(/^@/, \"\"),\n creditsUsed: 0,\n success: false,\n error: result.error,\n });\n }\n return { action: type, success: result.success, error: result.error };\n }\n\n case \"schedule\": {\n if (!action.content) return { action: type, success: false, error: \"No content\" };\n const entry = addToQueue(action.content);\n logger.info(`Scheduled: \"${action.content.slice(0, 50)}...\" for ${entry.scheduledFor}`);\n return { action: type, success: true, detail: `Scheduled for ${entry.scheduledFor}` };\n }\n\n case \"learn\": {\n if (!action.content) return { action: type, success: false, error: \"No content\" };\n addLearning(action.content, \"agent\", action.tags ?? [\"heartbeat\"]);\n logger.info(`Learned: \"${action.content.slice(0, 50)}...\"`);\n return { action: type, success: true };\n }\n\n case \"reflect\": {\n if (!action.content) return { action: type, success: false, error: \"No content\" };\n const identity = loadIdentity();\n identity.evolutionJournal.push({\n date: new Date().toISOString(),\n reflection: action.content,\n });\n saveIdentity(identity);\n logger.info(`Reflected: \"${action.content.slice(0, 50)}...\"`);\n return { action: type, success: true };\n }\n\n case \"skip\": {\n logger.info(`Skipping: ${action.reason ?? action.reasoning ?? \"no reason given\"}`);\n return { action: type, success: true, detail: action.reason ?? action.reasoning };\n }\n\n default:\n logger.warn(`Unknown action: ${type}`);\n return { action: type, success: false, error: `Unknown action: ${type}` };\n }\n } catch (error) {\n const msg = (error as Error).message;\n logger.error(`Action ${type} failed: ${msg}`);\n return { action: type, success: false, error: msg };\n }\n}\n\nexport async function executeActions(actions: AgentAction[]): Promise<ActionResult[]> {\n const results: ActionResult[] = [];\n for (const action of actions) {\n const result = await executeAction(action);\n results.push(result);\n // Small delay between actions to be human-like\n await new Promise((r) => setTimeout(r, 2000 + Math.random() * 3000));\n }\n return results;\n}\n","import { getRecentInteractions, type InteractionEntry } from \"../memory/index.js\";\nimport { loadIdentity } from \"../identity/index.js\";\nimport { getPersonaConstraints, personaConstraintHandles } from \"./persona-constraints.js\";\nimport type { Tweet } from \"../x-client/types.js\";\nimport type { AgentAction } from \"./decision-engine.js\";\n\nexport interface PolicyContext {\n action: AgentAction;\n step: number;\n timeline: Tweet[];\n mentions: Tweet[];\n executedActions: AgentAction[];\n observedTweetIds?: string[];\n observedTweets?: Tweet[];\n selfHandle?: string;\n selfUserId?: string | null;\n}\n\nexport interface PolicyDecision {\n allowed: boolean;\n reason?: string;\n}\n\nfunction normalize(text: string): string {\n return text\n .toLowerCase()\n .replace(/https?:\\/\\/\\S+/g, \"\")\n .replace(/[@#]\\w+/g, \"\")\n .replace(/[^a-z0-9\\s]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction tokenSet(text: string): Set<string> {\n const tokens = normalize(text).split(\" \").filter(Boolean);\n return new Set(tokens);\n}\n\nfunction jaccardSimilarity(a: string, b: string): number {\n const aSet = tokenSet(a);\n const bSet = tokenSet(b);\n if (aSet.size === 0 || bSet.size === 0) return 0;\n\n let overlap = 0;\n for (const token of aSet) {\n if (bSet.has(token)) overlap += 1;\n }\n\n const union = aSet.size + bSet.size - overlap;\n return union === 0 ? 0 : overlap / union;\n}\n\nfunction firstWords(text: string, n: number): string {\n return normalize(text).split(\" \").filter(Boolean).slice(0, n).join(\" \");\n}\n\nfunction hasAllCapsEnding(text: string): boolean {\n const ending = text.split(/[.!?]/).map((s) => s.trim()).filter(Boolean).slice(-1)[0] ?? \"\";\n const words = ending.split(/\\s+/).filter(Boolean);\n if (words.length < 3) return false;\n return words.every((word) => /^[A-Z0-9]+$/.test(word));\n}\n\nfunction wordCount(text: string): number {\n return normalize(text).split(\" \").filter(Boolean).length;\n}\n\nfunction sentenceCount(text: string): number {\n return text\n .split(/[.!?]/)\n .map((part) => part.trim())\n .filter(Boolean).length;\n}\n\nfunction explanatoryMarkerHits(text: string): number {\n const lower = text.toLowerCase();\n const markers = [\n \"the real issue\",\n \"the core issue\",\n \"in other words\",\n \"the point is\",\n \"what this means\",\n \"the lesson\",\n \"therefore\",\n \"ultimately\",\n \"meanwhile\",\n \"this reveals\",\n \"this proves\",\n ];\n return markers.reduce((hits, marker) => hits + (lower.includes(marker) ? 1 : 0), 0);\n}\n\nfunction soundsLikeLecture(content: string): boolean {\n const words = wordCount(content);\n const commas = (content.match(/,/g) ?? []).length;\n const semicolons = (content.match(/;/g) ?? []).length;\n const hasQuestion = content.includes(\"?\");\n const markerHits = explanatoryMarkerHits(content);\n\n if (words > 58) return true;\n if (words > 42 && commas + semicolons >= 3 && !hasQuestion) return true;\n if (markerHits >= 2) return true;\n return false;\n}\n\nfunction soundsTooHedgedForPersona(content: string): boolean {\n try {\n const identity = loadIdentity();\n const assertive =\n identity.traits.confidence >= 0.72 ||\n identity.traits.aggression >= 0.62 ||\n identity.conflictStyle === \"clap-back\" ||\n identity.conflictStyle === \"debate\";\n if (!assertive) return false;\n\n const lower = content.toLowerCase();\n const hedges = [\n \"you're both right\",\n \"both can be true\",\n \"on one hand\",\n \"on the other hand\",\n \"it depends\",\n \"it's complicated\",\n \"nuance\",\n \"fair point from both\",\n ];\n return hedges.some((phrase) => lower.includes(phrase));\n } catch {\n return false;\n }\n}\n\nfunction allowsPhilosopherCadence(): boolean {\n try {\n const identity = loadIdentity();\n if (identity.framework === \"philosopher\") return true;\n // Truthseeker can be analytical, but still should avoid abstract manifesto loops.\n if (identity.framework === \"truthseeker\") return false;\n return false;\n } catch {\n return false;\n }\n}\n\nfunction philosophicalPatternHits(content: string): number {\n const lower = content.toLowerCase();\n const markers = [\n \"the real question\",\n \"the deeper question\",\n \"what becomes possible\",\n \"is just the start\",\n \"the future isn't about\",\n \"the future is not about\",\n \"when intelligence becomes\",\n \"protocols are infrastructure\",\n \"the core future\",\n \"the true question\",\n \"value might emerge\",\n \"isn't about\",\n \"is not about\",\n \"it's about\",\n \"just the start\",\n ];\n return markers.reduce((hits, marker) => hits + (lower.includes(marker) ? 1 : 0), 0);\n}\n\nfunction abstractWordCount(content: string): number {\n const words = normalize(content).split(\" \").filter(Boolean);\n const abstractWords = new Set([\n \"infrastructure\",\n \"protocol\",\n \"protocols\",\n \"architecture\",\n \"architectures\",\n \"consciousness\",\n \"economy\",\n \"economics\",\n \"currency\",\n \"systems\",\n \"system\",\n \"future\",\n \"intelligence\",\n \"optimization\",\n \"abstraction\",\n \"paradigm\",\n \"emerge\",\n \"emergence\",\n \"governs\",\n \"governance\",\n ]);\n return words.filter((word) => abstractWords.has(word)).length;\n}\n\nfunction usesManifestoPunctuation(content: string): boolean {\n // Colon/semicolon/em-dash patterns correlate strongly with the explanatory style we want to avoid.\n return content.includes(\":\") || content.includes(\";\") || content.includes(\"—\");\n}\n\nconst OVERLAP_STOPWORDS = new Set([\n \"this\", \"that\", \"with\", \"from\", \"have\", \"what\", \"when\", \"where\", \"which\", \"your\", \"youre\",\n \"they\", \"them\", \"about\", \"into\", \"over\", \"under\", \"while\", \"just\", \"like\", \"really\",\n \"there\", \"their\", \"then\", \"than\", \"because\", \"would\", \"could\", \"should\", \"being\", \"been\",\n \"it's\", \"its\", \"the\", \"and\", \"for\", \"are\", \"was\", \"were\", \"will\", \"not\", \"but\", \"you\",\n \"our\", \"out\", \"all\", \"too\", \"can\", \"get\", \"got\", \"any\",\n]);\n\nfunction meaningfulTokenSet(text: string): Set<string> {\n const tokens = normalize(text)\n .split(\" \")\n .filter((token) => token.length >= 4 && !OVERLAP_STOPWORDS.has(token));\n return new Set(tokens);\n}\n\nfunction hasMeaningfulContextOverlap(content: string, targetText: string): boolean {\n const a = meaningfulTokenSet(content);\n const b = meaningfulTokenSet(targetText);\n if (a.size === 0 || b.size === 0) return false;\n for (const token of a) {\n if (b.has(token)) return true;\n }\n return false;\n}\n\nfunction recentWrittenContent(): string[] {\n const recent = getRecentInteractions(40);\n return recent\n .filter((i) => i.type === \"post\" || i.type === \"reply\")\n .map((i) => i.content ?? \"\")\n .filter((content) => content.length > 0);\n}\n\nconst REPETITION_STOPWORDS = new Set([\n \"about\", \"after\", \"again\", \"against\", \"almost\", \"always\", \"among\", \"because\", \"being\", \"between\",\n \"could\", \"every\", \"first\", \"found\", \"from\", \"going\", \"great\", \"have\", \"having\", \"here\", \"into\",\n \"just\", \"like\", \"make\", \"more\", \"most\", \"much\", \"only\", \"other\", \"over\", \"really\", \"same\", \"some\",\n \"such\", \"than\", \"that\", \"their\", \"there\", \"these\", \"they\", \"this\", \"those\", \"through\", \"time\", \"very\",\n \"what\", \"when\", \"where\", \"which\", \"while\", \"with\", \"would\", \"your\", \"youre\", \"dont\", \"cant\", \"will\",\n \"shall\", \"should\", \"also\", \"tweet\", \"tweets\", \"thread\", \"threads\", \"future\", \"human\", \"humans\",\n \"technology\", \"tech\", \"build\", \"building\", \"system\", \"systems\", \"agent\", \"agents\",\n]);\n\nfunction informativeTokens(text: string): string[] {\n return normalize(text)\n .split(\" \")\n .filter((token) => token.length >= 5 && !REPETITION_STOPWORDS.has(token));\n}\n\nfunction findOverusedAnchor(content: string, recent: string[]): string | null {\n const recentWindow = recent.slice(0, 12);\n if (recentWindow.length < 5) return null;\n\n const tokenCounts = new Map<string, number>();\n const bigramCounts = new Map<string, number>();\n\n for (const sample of recentWindow) {\n const tokens = informativeTokens(sample);\n const uniqueTokens = new Set(tokens);\n for (const token of uniqueTokens) {\n tokenCounts.set(token, (tokenCounts.get(token) ?? 0) + 1);\n }\n for (let i = 0; i < tokens.length - 1; i += 1) {\n const bigram = `${tokens[i]} ${tokens[i + 1]}`;\n bigramCounts.set(bigram, (bigramCounts.get(bigram) ?? 0) + 1);\n }\n }\n\n const contentTokens = informativeTokens(content);\n const contentTokenSet = new Set(contentTokens);\n for (const token of contentTokenSet) {\n const count = tokenCounts.get(token) ?? 0;\n if (count >= 4) return token;\n }\n\n for (let i = 0; i < contentTokens.length - 1; i += 1) {\n const bigram = `${contentTokens[i]} ${contentTokens[i + 1]}`;\n const count = bigramCounts.get(bigram) ?? 0;\n if (count >= 3) return bigram;\n }\n\n return null;\n}\n\nfunction openingFragment(text: string, words: number = 4): string {\n return normalize(text).split(\" \").filter(Boolean).slice(0, words).join(\" \");\n}\n\nfunction findOverusedOpening(content: string, recent: string[]): string | null {\n const opening = openingFragment(content, 4);\n if (!opening || opening.split(\" \").length < 3) return null;\n\n let matches = 0;\n for (const sample of recent.slice(0, 12)) {\n if (openingFragment(sample, 4) === opening) {\n matches += 1;\n }\n }\n\n return matches >= 2 ? opening : null;\n}\n\nfunction vocabularyNoveltyRatio(content: string, recent: string[]): number {\n const current = new Set(informativeTokens(content));\n if (current.size === 0) return 1;\n\n const seen = new Set<string>();\n for (const sample of recent.slice(0, 14)) {\n for (const token of informativeTokens(sample)) {\n seen.add(token);\n }\n }\n\n let fresh = 0;\n for (const token of current) {\n if (!seen.has(token)) fresh += 1;\n }\n return fresh / current.size;\n}\n\nfunction looksOverAbstractWithoutAnchor(content: string): boolean {\n const abstractCount = abstractWordCount(content);\n if (abstractCount < 4) return false;\n\n const words = wordCount(content);\n const density = abstractCount / Math.max(1, words);\n if (density < 0.2) return false;\n\n const lower = content.toLowerCase();\n const hasHandle = /@\\w+/.test(content);\n const hasNumber = /\\b\\d+(\\.\\d+)?\\b/.test(content);\n const hasQuote = /[\"“”']/.test(content);\n const hasSpecificFigure = /\\b(musk|elon|zuck|altman|openai|tesla|spacex|meta|google|apple)\\b/.test(lower);\n const hasQuestion = content.includes(\"?\");\n\n return !(hasHandle || hasNumber || hasQuote || hasSpecificFigure || hasQuestion);\n}\n\nfunction hasStrongConversationOpportunity(timeline: Tweet[], mentions: Tweet[]): boolean {\n if (mentions.length > 0) return true;\n return timeline.some((tweet) => (tweet.replyCount ?? 0) > 0 || tweet.text.includes(\"?\"));\n}\n\nfunction wasInteractionAction(action: AgentAction): boolean {\n return [\"reply\", \"like\", \"retweet\", \"follow\"].includes(action.action);\n}\n\nfunction isWritingAction(action: AgentAction): boolean {\n return [\"post\", \"reply\", \"schedule\"].includes(action.action);\n}\n\nfunction normalizeHandle(handle: string | undefined): string {\n return (handle ?? \"\").replace(/^@/, \"\").trim().toLowerCase();\n}\n\nfunction resolveActionTargetHandle(action: AgentAction, tweetById: Map<string, Tweet>): string {\n if (action.handle) return normalizeHandle(action.handle);\n if (action.targetHandle) return normalizeHandle(action.targetHandle);\n if (action.tweetId) return normalizeHandle(tweetById.get(action.tweetId)?.authorHandle);\n return \"\";\n}\n\nfunction executedWrittenContent(executedActions: AgentAction[]): string[] {\n return executedActions\n .filter((a) => isWritingAction(a) && typeof a.content === \"string\")\n .map((a) => a.content?.trim() ?? \"\")\n .filter((content) => content.length > 0);\n}\n\nfunction nearExactDuplicate(content: string, recent: string[]): boolean {\n const normalized = normalize(content);\n if (!normalized) return false;\n\n return recent.some((r) => {\n const candidate = normalize(r);\n if (!candidate) return false;\n if (candidate === normalized) return true;\n return jaccardSimilarity(content, r) >= 0.88;\n });\n}\n\nfunction isDuplicateTarget(action: AgentAction, executedActions: AgentAction[]): boolean {\n if (!action.tweetId) return false;\n return executedActions.some((a) => a.tweetId === action.tweetId && a.action === action.action);\n}\n\nfunction repeatedTemplate(content: string, recent: string[]): boolean {\n const prefix = firstWords(content, 7);\n if (!prefix) return false;\n\n return recent.some((r) => {\n const sameStart = firstWords(r, 7) === prefix;\n const similar = jaccardSimilarity(content, r) >= 0.62;\n return sameStart || similar;\n });\n}\n\nfunction overusingAllCapsCadence(content: string, recentEntries: InteractionEntry[]): boolean {\n if (!hasAllCapsEnding(content)) return false;\n const recentCaps = recentEntries\n .filter((i) => i.type === \"post\" && i.content)\n .slice(0, 8)\n .filter((i) => hasAllCapsEnding(i.content ?? \"\"));\n\n return recentCaps.length >= 2;\n}\n\nexport function evaluateActionPolicy(context: PolicyContext): PolicyDecision {\n const {\n action,\n step,\n timeline,\n mentions,\n executedActions,\n observedTweetIds,\n observedTweets,\n selfHandle,\n selfUserId,\n } = context;\n const self = normalizeHandle(selfHandle);\n const selfId = (selfUserId ?? \"\").trim();\n const knownTweets = observedTweets ?? [...timeline, ...mentions];\n const tweetById = new Map(knownTweets.map((tweet) => [tweet.id, tweet]));\n const constraints = getPersonaConstraints();\n const strictReplyHandles = new Set(constraints.onlyReplyToHandles.map((handle) => normalizeHandle(handle)));\n const strictInteractHandles = new Set(personaConstraintHandles(constraints).map((handle) => normalizeHandle(handle)));\n const targetHandle = resolveActionTargetHandle(action, tweetById);\n\n // Persona hard constraints: these are operational, not advisory.\n if (constraints.replyOnlyMode && ![\"reply\", \"skip\", \"learn\", \"reflect\"].includes(action.action)) {\n return {\n allowed: false,\n reason: \"Persona is in reply-only mode. Use reply actions only.\",\n };\n }\n\n if (constraints.noOriginalPosts && (action.action === \"post\" || action.action === \"schedule\")) {\n return {\n allowed: false,\n reason: \"Persona forbids standalone original posts.\",\n };\n }\n\n if (strictReplyHandles.size > 0) {\n if (action.action !== \"reply\") {\n return {\n allowed: false,\n reason: `Persona requires replying only to specific target(s): @${[...strictReplyHandles].join(\", @\")}.`,\n };\n }\n if (!targetHandle || !strictReplyHandles.has(targetHandle)) {\n return {\n allowed: false,\n reason: `Reply target must be one of @${[...strictReplyHandles].join(\", @\")}.`,\n };\n }\n }\n\n if (\n strictInteractHandles.size > 0 &&\n [\"reply\", \"like\", \"retweet\", \"follow\"].includes(action.action)\n ) {\n if (!targetHandle || !strictInteractHandles.has(targetHandle)) {\n return {\n allowed: false,\n reason: `Interaction target must be one of @${[...strictInteractHandles].join(\", @\")}.`,\n };\n }\n }\n\n if (isDuplicateTarget(action, executedActions)) {\n return { allowed: false, reason: `Action ${action.action} already executed for tweet ${action.tweetId} this heartbeat.` };\n }\n\n if (action.content && isWritingAction(action)) {\n if (action.content.length > 280) {\n return {\n allowed: false,\n reason: `Content is too long (${action.content.length}/280). Keep it tighter and more conversational.`,\n };\n }\n\n if (action.action === \"reply\" && wordCount(action.content) > 45 && !action.content.includes(\"?\")) {\n return {\n allowed: false,\n reason: \"Reply is too monologue-like. Keep it shorter or ask a direct question.\",\n };\n }\n\n if (soundsLikeLecture(action.content)) {\n return {\n allowed: false,\n reason: \"Rejected lecture-like writing style. Use a more human, reactive, conversational tone.\",\n };\n }\n\n if (soundsTooHedgedForPersona(action.content)) {\n return {\n allowed: false,\n reason: \"Rejected hedged consensus phrasing. Your persona should be more decisive and opinionated.\",\n };\n }\n\n if (!allowsPhilosopherCadence()) {\n const phiHits = philosophicalPatternHits(action.content);\n const abstractCount = abstractWordCount(action.content);\n const hasQuestion = action.content.includes(\"?\");\n if (phiHits >= 1 || (abstractCount >= 5 && hasQuestion)) {\n return {\n allowed: false,\n reason: \"Rejected abstract philosopher cadence. Use concrete, contextual language tied to the actual tweet.\",\n };\n }\n\n const words = wordCount(action.content);\n const sentences = sentenceCount(action.content);\n if (action.action === \"reply\" && (words > 34 || sentences > 2)) {\n return {\n allowed: false,\n reason: \"Reply is too long/explanatory for this persona. Keep it short and direct.\",\n };\n }\n if (action.action === \"post\" && (words > 42 || sentences > 3)) {\n return {\n allowed: false,\n reason: \"Post is drifting into manifesto style. Keep it more concrete and human.\",\n };\n }\n if ((action.action === \"reply\" || action.action === \"post\") && usesManifestoPunctuation(action.content) && words > 16) {\n return {\n allowed: false,\n reason: \"Rejected manifesto punctuation style. Avoid colon/semicolon/em-dash framing.\",\n };\n }\n }\n\n const existingInHeartbeat = executedWrittenContent(executedActions);\n if (nearExactDuplicate(action.content, existingInHeartbeat)) {\n return {\n allowed: false,\n reason: \"Rejected duplicate wording in this heartbeat. Write a distinct message before posting/replying again.\",\n };\n }\n\n const recent = recentWrittenContent();\n const overusedAnchor = findOverusedAnchor(action.content, recent);\n if (overusedAnchor) {\n return {\n allowed: false,\n reason: `Rejected repetitive anchor phrase/term \"${overusedAnchor}\". Use a different framing and vocabulary.`,\n };\n }\n\n const overusedOpening = findOverusedOpening(action.content, recent);\n if (overusedOpening) {\n return {\n allowed: false,\n reason: `Rejected repetitive opening phrase \"${overusedOpening}\". Start from a fresh angle.`,\n };\n }\n\n if (recent.length >= 6 && wordCount(action.content) >= 10) {\n const novelty = vocabularyNoveltyRatio(action.content, recent);\n if (novelty < 0.34) {\n return {\n allowed: false,\n reason: \"Rejected low-novelty vocabulary loop. Use fresher words, examples, or a different conversational angle.\",\n };\n }\n }\n\n if (!allowsPhilosopherCadence() && looksOverAbstractWithoutAnchor(action.content)) {\n return {\n allowed: false,\n reason: \"Rejected abstract wording without concrete anchor. Reference a specific person, event, quote, or question.\",\n };\n }\n }\n\n const hasConversationOpportunity = hasStrongConversationOpportunity(timeline, mentions);\n const interactedAlready = executedActions.some(wasInteractionAction);\n const observedCount = observedTweetIds && observedTweetIds.length > 0\n ? observedTweetIds.length\n : timeline.length + mentions.length;\n\n if ((action.action === \"reply\" || action.action === \"like\" || action.action === \"retweet\") && observedCount === 0) {\n return {\n allowed: false,\n reason: \"No tweets observed in current context. Avoid blind interactions; gather timeline/search context first.\",\n };\n }\n\n if (\n action.action === \"post\" &&\n hasConversationOpportunity &&\n !interactedAlready &&\n step < 2\n ) {\n return {\n allowed: false,\n reason: \"Engage first: reply/like/follow when mentions or active conversations are available before posting an original tweet.\",\n };\n }\n\n if (isWritingAction(action) && action.content) {\n const recent = recentWrittenContent();\n if (nearExactDuplicate(action.content, recent)) {\n return {\n allowed: false,\n reason: \"Rejected near-duplicate content from recent history. Tailor this message to the specific context.\",\n };\n }\n\n if (repeatedTemplate(action.content, recent)) {\n return {\n allowed: false,\n reason: \"Rejected repetitive content pattern. Use a more novel structure or engage directly with timeline context.\",\n };\n }\n }\n\n if ((action.action === \"post\" || action.action === \"schedule\") && action.content) {\n const recentInteractions = getRecentInteractions(20);\n if (overusingAllCapsCadence(action.content, recentInteractions)) {\n return {\n allowed: false,\n reason: \"Rejected repetitive all-caps slogan cadence. Vary style and reduce monologue formatting.\",\n };\n }\n }\n\n if ((action.action === \"reply\" || action.action === \"like\" || action.action === \"retweet\") && action.tweetId) {\n const known = new Set(observedTweetIds ?? [...timeline, ...mentions].map((tweet) => tweet.id));\n if (!known.has(action.tweetId)) {\n return {\n allowed: false,\n reason: `Tweet ${action.tweetId} is not in current observations. Choose a visible timeline/mention tweet for grounded engagement.`,\n };\n }\n\n const targetTweet = tweetById.get(action.tweetId);\n if (targetTweet && (\n (self && normalizeHandle(targetTweet.authorHandle) === self) ||\n (selfId && targetTweet.authorId === selfId)\n )) {\n return {\n allowed: false,\n reason: \"Rejected self-interaction. Do not reply/like/retweet your own tweets.\",\n };\n }\n }\n\n if (action.action === \"reply\" && action.tweetId) {\n if (action.content) {\n const targetTweet = tweetById.get(action.tweetId);\n if (targetTweet && !hasMeaningfulContextOverlap(action.content, targetTweet.text)) {\n const phiHits = philosophicalPatternHits(action.content);\n if (wordCount(action.content) > 9 || phiHits > 0 || abstractWordCount(action.content) >= 4) {\n return {\n allowed: false,\n reason: \"Reply is not grounded in the target tweet context. Reference concrete details from their actual post.\",\n };\n }\n }\n }\n }\n\n if (action.action === \"follow\" && action.handle) {\n const target = normalizeHandle(action.handle);\n if (!target) {\n return { allowed: false, reason: \"Follow target is empty.\" };\n }\n\n if (self && target === self) {\n return {\n allowed: false,\n reason: \"Rejected self-follow. Do not follow your own account.\",\n };\n }\n\n }\n\n return { allowed: true };\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { updatePostMetrics } from \"../memory/performance.js\";\nimport { paths } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { AgentAction, ActionResult } from \"./decision-engine.js\";\nimport type { ActionOpportunity } from \"./opportunity-engine.js\";\nimport type { XClientInterface } from \"../x-client/types.js\";\n\ninterface BanditArm {\n key: string;\n pulls: number;\n rewardSum: number;\n lastReward: number;\n updatedAt: string;\n}\n\ninterface PendingOutcome {\n id: string;\n armKey: string;\n actionType: string;\n tweetId?: string;\n createdAt: string;\n resolveAt: string;\n resolved: boolean;\n}\n\ninterface BanditState {\n totalPulls: number;\n explorationBudget: number;\n arms: Record<string, BanditArm>;\n pending: PendingOutcome[];\n}\n\ninterface ScoredOpportunity {\n opportunity: ActionOpportunity;\n adjustedScore: number;\n pulls: number;\n}\n\nexport interface OutcomeCollectionResult {\n processed: number;\n resolved: number;\n rewardAdded: number;\n}\n\nconst DEFAULT_EXPLORATION_BUDGET = 0.25;\n\nfunction defaultState(): BanditState {\n return {\n totalPulls: 0,\n explorationBudget: DEFAULT_EXPLORATION_BUDGET,\n arms: {},\n pending: [],\n };\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction loadState(): BanditState {\n if (!existsSync(paths.bandit)) return defaultState();\n try {\n const parsed = JSON.parse(readFileSync(paths.bandit, \"utf-8\")) as Partial<BanditState>;\n const state: BanditState = {\n totalPulls: Math.max(0, parsed.totalPulls ?? 0),\n explorationBudget: clamp(parsed.explorationBudget ?? DEFAULT_EXPLORATION_BUDGET, 0.1, 0.45),\n arms: parsed.arms ?? {},\n pending: Array.isArray(parsed.pending) ? parsed.pending : [],\n };\n return state;\n } catch {\n return defaultState();\n }\n}\n\nfunction saveState(state: BanditState): void {\n state.explorationBudget = clamp(state.explorationBudget, 0.1, 0.45);\n state.pending = state.pending\n .filter((entry) => {\n if (!entry.resolved) return true;\n const resolvedAtMs = Date.parse(entry.resolveAt);\n if (Number.isNaN(resolvedAtMs)) return false;\n return Date.now() - resolvedAtMs < 7 * 24 * 60 * 60 * 1000;\n })\n .slice(-1200);\n writeFileSync(paths.bandit, JSON.stringify(state, null, 2));\n}\n\nfunction ensureArm(state: BanditState, armKey: string): BanditArm {\n const existing = state.arms[armKey];\n if (existing) return existing;\n const arm: BanditArm = {\n key: armKey,\n pulls: 0,\n rewardSum: 0,\n lastReward: 0,\n updatedAt: new Date().toISOString(),\n };\n state.arms[armKey] = arm;\n return arm;\n}\n\nfunction averageReward(arm: BanditArm): number {\n if (arm.pulls <= 0) return 0;\n return arm.rewardSum / arm.pulls;\n}\n\nfunction ucbBonus(totalPulls: number, armPulls: number): number {\n const t = Math.max(1, totalPulls);\n return Math.sqrt((2 * Math.log(t + 1)) / (armPulls + 1));\n}\n\nfunction computeImmediateReward(result: ActionResult): number {\n if (result.success) return 0.12;\n const error = (result.error ?? \"\").toLowerCase();\n if (error.includes(\"duplicate content\")) return -0.95;\n if (error.includes(\"rate limit\")) return -0.5;\n if (error.includes(\"forbidden\") || error.includes(\"403\")) return -0.55;\n return -0.35;\n}\n\nfunction resolveDelayedReward(metrics: { likeCount: number; replyCount: number; retweetCount: number } | null): number {\n if (!metrics) return -0.05;\n const reward =\n Math.min(metrics.likeCount * 0.03, 0.9) +\n Math.min(metrics.replyCount * 0.12, 0.9) +\n Math.min(metrics.retweetCount * 0.08, 0.8);\n if (metrics.likeCount === 0 && metrics.replyCount === 0 && metrics.retweetCount === 0) {\n return -0.15;\n }\n return Math.min(reward, 1.8);\n}\n\nfunction armKeyFromAction(action: AgentAction): string {\n if (action.banditArm && action.banditArm.trim().length > 0) return action.banditArm;\n const source = action.source ?? \"unknown\";\n return `${action.action}:${source}`;\n}\n\nfunction extractTweetId(action: AgentAction, result: ActionResult): string | undefined {\n if (result.detail && /^\\d+$/.test(result.detail)) return result.detail;\n if (action.action !== \"reply\" && action.tweetId) return action.tweetId;\n return undefined;\n}\n\nexport function selectBanditOpportunityPool(\n opportunities: ActionOpportunity[],\n maxPoolSize: number = 24,\n): ActionOpportunity[] {\n if (opportunities.length <= maxPoolSize) return opportunities;\n\n const state = loadState();\n const totalPulls = Math.max(1, state.totalPulls);\n const scored: ScoredOpportunity[] = opportunities.map((opportunity) => {\n const arm = ensureArm(state, opportunity.armKey);\n const mean = averageReward(arm);\n const bonus = ucbBonus(totalPulls, arm.pulls);\n const coldStartBoost = arm.pulls === 0 ? 0.25 : 0;\n const adjustedScore = opportunity.score + mean * 1.5 + bonus * 0.35 + coldStartBoost;\n return {\n opportunity: {\n ...opportunity,\n score: adjustedScore,\n },\n adjustedScore,\n pulls: arm.pulls,\n };\n });\n\n const explorationBudget = clamp(state.explorationBudget, 0.1, 0.45);\n const exploreCount = Math.max(1, Math.floor(maxPoolSize * explorationBudget));\n const exploitCount = Math.max(1, maxPoolSize - exploreCount);\n\n const exploit = [...scored].sort((a, b) => b.adjustedScore - a.adjustedScore).slice(0, exploitCount);\n const selected = new Map<string, ActionOpportunity>();\n for (const row of exploit) {\n selected.set(row.opportunity.id, row.opportunity);\n }\n\n const remaining = scored\n .filter((row) => !selected.has(row.opportunity.id))\n .sort((a, b) => {\n if (a.pulls !== b.pulls) return a.pulls - b.pulls;\n return b.adjustedScore - a.adjustedScore;\n });\n\n // Add low-pull candidates first, with slight randomization for exploration.\n while (selected.size < maxPoolSize && remaining.length > 0) {\n const window = remaining.splice(0, Math.min(5, remaining.length));\n const pick = window[Math.floor(Math.random() * window.length)];\n if (!selected.has(pick.opportunity.id)) {\n selected.set(pick.opportunity.id, pick.opportunity);\n }\n for (const row of window) {\n if (row.opportunity.id !== pick.opportunity.id) {\n remaining.push(row);\n }\n }\n remaining.sort((a, b) => {\n if (a.pulls !== b.pulls) return a.pulls - b.pulls;\n return b.adjustedScore - a.adjustedScore;\n });\n }\n\n const picked = [...selected.values()].sort((a, b) => b.score - a.score).slice(0, maxPoolSize);\n saveState(state);\n return picked;\n}\n\nexport function recordBanditActionResults(actions: AgentAction[], results: ActionResult[]): void {\n if (actions.length === 0 || results.length === 0) return;\n const state = loadState();\n const now = new Date().toISOString();\n\n for (let i = 0; i < Math.min(actions.length, results.length); i += 1) {\n const action = actions[i];\n const result = results[i];\n const armKey = armKeyFromAction(action);\n const arm = ensureArm(state, armKey);\n\n const immediateReward = computeImmediateReward(result);\n arm.pulls += 1;\n arm.rewardSum += immediateReward;\n arm.lastReward = immediateReward;\n arm.updatedAt = now;\n state.totalPulls += 1;\n\n const tweetId = extractTweetId(action, result);\n if (result.success && tweetId && (action.action === \"post\" || action.action === \"reply\")) {\n const delayMs = action.action === \"reply\" ? 20 * 60 * 1000 : 45 * 60 * 1000;\n state.pending.push({\n id: `pending-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n armKey,\n actionType: action.action,\n tweetId,\n createdAt: now,\n resolveAt: new Date(Date.now() + delayMs).toISOString(),\n resolved: false,\n });\n }\n }\n\n saveState(state);\n}\n\nexport async function collectDelayedOutcomes(client: XClientInterface): Promise<OutcomeCollectionResult> {\n const state = loadState();\n const now = Date.now();\n const pendingDue = state.pending.filter((entry) => !entry.resolved && Date.parse(entry.resolveAt) <= now).slice(0, 8);\n if (pendingDue.length === 0) {\n return { processed: 0, resolved: 0, rewardAdded: 0 };\n }\n\n let rewardAdded = 0;\n let resolved = 0;\n const checkedAt = new Date().toISOString();\n\n for (const pending of pendingDue) {\n const arm = ensureArm(state, pending.armKey);\n let metrics: { likeCount: number; retweetCount: number; replyCount: number } | null = null;\n\n if (pending.tweetId) {\n metrics = await client.getTweetMetrics(pending.tweetId);\n if (metrics) {\n updatePostMetrics(pending.tweetId, {\n checkedAt,\n likes: metrics.likeCount,\n retweets: metrics.retweetCount,\n replies: metrics.replyCount,\n });\n }\n }\n\n const reward = resolveDelayedReward(\n metrics\n ? {\n likeCount: metrics.likeCount,\n retweetCount: metrics.retweetCount,\n replyCount: metrics.replyCount,\n }\n : null,\n );\n\n arm.rewardSum += reward;\n arm.lastReward = reward;\n arm.updatedAt = checkedAt;\n rewardAdded += reward;\n pending.resolved = true;\n resolved += 1;\n }\n\n saveState(state);\n logger.info(\n `Bandit delayed outcomes processed=${pendingDue.length}, resolved=${resolved}, rewardDelta=${rewardAdded.toFixed(2)}`\n );\n\n return {\n processed: pendingDue.length,\n resolved,\n rewardAdded,\n };\n}\n","import { getXClient } from \"../x-client/index.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { getRecentInteractions } from \"../memory/index.js\";\nimport { listIntents, recordIntentExecution } from \"../memory/intents.js\";\nimport { loadIdentity } from \"../identity/index.js\";\nimport { loadCredentials } from \"../utils/crypto.js\";\nimport type { Tweet } from \"../x-client/types.js\";\nimport { buildSystemPrompt } from \"./prompt-builder.js\";\nimport { executeAction, type AgentAction, type ActionResult } from \"./decision-engine.js\";\nimport { evaluateActionPolicy } from \"./policy.js\";\nimport { generateResponse } from \"./llm.js\";\nimport { buildPersonaConstraintLines, getPersonaConstraints } from \"./persona-constraints.js\";\nimport {\n collectDelayedOutcomes,\n recordBanditActionResults,\n} from \"./bandit.js\";\n\nexport interface AutonomyCycleResult {\n timeline: Tweet[];\n mentions: Tweet[];\n actions: AgentAction[];\n results: ActionResult[];\n policyFeedback: string[];\n}\n\nfunction selfUserIdFromCredentials(): string | null {\n try {\n const creds = loadCredentials();\n const accessToken = creds.accessToken;\n if (!accessToken) return null;\n const dashIdx = accessToken.indexOf(\"-\");\n if (dashIdx <= 0) return null;\n const candidate = accessToken.substring(0, dashIdx);\n return /^\\d+$/.test(candidate) ? candidate : null;\n } catch {\n return null;\n }\n}\n\nfunction normalizeHandle(handle: string | undefined): string {\n return (handle ?? \"\").replace(/^@/, \"\").trim().toLowerCase();\n}\n\nfunction canonicalPlannerHandle(handle: string): string {\n const clean = normalizeHandle(handle);\n const aliasMap: Record<string, string> = {\n gork: \"grok\",\n spora: \"sporaai\",\n spora_ai: \"sporaai\",\n };\n return aliasMap[clean] ?? clean;\n}\n\nfunction canonicalizePlannerQuery(rawQuery: string): string {\n return rawQuery.replace(/from:([a-zA-Z0-9_]{1,15})/gi, (_match, handle) => `from:${canonicalPlannerHandle(handle)}`);\n}\n\ntype RewriteStyleMode =\n | \"quick_reaction\"\n | \"curious_question\"\n | \"friendly_pushback\"\n | \"plain_observation\"\n | \"playful_line\";\n\nfunction roughWordCount(text: string): number {\n return text.trim().split(/\\s+/).filter(Boolean).length;\n}\n\nfunction inferStyleMode(text: string): RewriteStyleMode {\n const lower = text.toLowerCase();\n if (text.includes(\"?\")) return \"curious_question\";\n if (/\\b(lol|lmao|haha|wild|fr|ngl)\\b/i.test(text)) return \"playful_line\";\n if (/\\b(not|isn'?t|wrong|nah|nope|doesn'?t)\\b/i.test(lower)) return \"friendly_pushback\";\n if (roughWordCount(text) <= 9) return \"quick_reaction\";\n return \"plain_observation\";\n}\n\nfunction chooseRewriteStyleMode(recentTexts?: string[], targetTweetText?: string): RewriteStyleMode {\n const counts: Record<RewriteStyleMode, number> = {\n quick_reaction: 0,\n curious_question: 0,\n friendly_pushback: 0,\n plain_observation: 0,\n playful_line: 0,\n };\n for (const text of (recentTexts ?? []).slice(0, 10)) {\n counts[inferStyleMode(text)] += 1;\n }\n\n if ((targetTweetText ?? \"\").includes(\"?\") && counts.curious_question <= 2) {\n return \"curious_question\";\n }\n\n return (Object.entries(counts).sort((a, b) => a[1] - b[1])[0]?.[0] as RewriteStyleMode) ?? \"plain_observation\";\n}\n\nfunction rewriteStyleModeInstructions(mode: RewriteStyleMode): string[] {\n if (mode === \"quick_reaction\") {\n return [\n \"- style mode: quick reaction\",\n \"- 6-14 words, one short sentence\",\n \"- immediate reaction tone, no thesis statement\",\n ];\n }\n if (mode === \"curious_question\") {\n return [\n \"- style mode: curious question\",\n \"- include exactly one direct question\",\n \"- ask about a specific detail from the target tweet\",\n ];\n }\n if (mode === \"friendly_pushback\") {\n return [\n \"- style mode: friendly pushback\",\n \"- politely disagree in plain words\",\n \"- no lecture or abstract framing\",\n ];\n }\n if (mode === \"playful_line\") {\n return [\n \"- style mode: playful line\",\n \"- keep it light and witty, not sarcastic essay mode\",\n \"- avoid internet clichés and overused slogans\",\n ];\n }\n return [\n \"- style mode: plain observation\",\n \"- write like a natural human thought said out loud\",\n \"- concrete detail first, no broad generalization\",\n ];\n}\n\nfunction shouldAttemptStyleRewrite(action: AgentAction, reason: string): boolean {\n if (!action.content || (action.action !== \"reply\" && action.action !== \"post\")) return false;\n const lower = reason.toLowerCase();\n return (\n lower.includes(\"lecture-like\") ||\n lower.includes(\"abstract philosopher cadence\") ||\n lower.includes(\"manifesto\") ||\n lower.includes(\"too long/explanatory\") ||\n lower.includes(\"grounded in the target tweet context\") ||\n lower.includes(\"hedged consensus phrasing\") ||\n lower.includes(\"repetitive anchor phrase/term\") ||\n lower.includes(\"repetitive opening phrase\") ||\n lower.includes(\"low-novelty vocabulary loop\") ||\n lower.includes(\"abstract wording without concrete anchor\")\n );\n}\n\nfunction cleanRewriteOutput(text: string): string {\n const cleaned = text\n .replace(/```[\\s\\S]*?```/g, \"\")\n .replace(/^[\"'`]+|[\"'`]+$/g, \"\")\n .trim();\n const firstLine = cleaned.split(\"\\n\").map((line) => line.trim()).filter(Boolean)[0] ?? cleaned;\n return firstLine.trim();\n}\n\nasync function rewriteDraftForHumanVoice(input: {\n action: AgentAction;\n reason: string;\n targetTweetText?: string;\n recentTexts?: string[];\n}): Promise<string | null> {\n if (!input.action.content) return null;\n const identity = loadIdentity();\n const maxChars = input.action.action === \"reply\" ? 100 : 130;\n const minChars = input.action.action === \"reply\" ? 18 : 24;\n const styleMode = chooseRewriteStyleMode(input.recentTexts, input.targetTweetText);\n\n const system = [\n `You rewrite X/Twitter drafts into ${identity.name}'s natural voice.`,\n \"Output must feel human, direct, and contextual.\",\n \"Never write abstract philosophy or explanatory manifesto style.\",\n \"Return ONLY rewritten tweet text, no commentary.\",\n ].join(\" \");\n\n const promptParts: string[] = [];\n promptParts.push(`Current draft: ${input.action.content}`);\n promptParts.push(`Rejected because: ${input.reason}`);\n if (input.targetTweetText) {\n promptParts.push(`Target tweet context: ${input.targetTweetText}`);\n }\n promptParts.push(`Constraints:`);\n promptParts.push(`- ${minChars}-${maxChars} characters`);\n promptParts.push(\"- 1-2 short sentences max\");\n promptParts.push(\"- no 'the real question' / 'the deeper question' framing\");\n promptParts.push(\"- no colon, semicolon, or em dash\");\n promptParts.push(\"- specific and concrete, not abstract\");\n promptParts.push(\"- keep the same core stance\");\n promptParts.push(\"- use natural spoken phrasing and contractions when it fits\");\n for (const line of rewriteStyleModeInstructions(styleMode)) {\n promptParts.push(line);\n }\n if (input.recentTexts && input.recentTexts.length > 0) {\n promptParts.push(\"- avoid vocabulary anchors from these recent outputs:\");\n for (const text of input.recentTexts.slice(0, 5)) {\n promptParts.push(` - ${text.slice(0, 120)}`);\n }\n }\n\n try {\n const rewrite = await generateResponse(system, promptParts.join(\"\\n\"));\n const candidate = cleanRewriteOutput(rewrite.content);\n if (!candidate) return null;\n return candidate;\n } catch {\n return null;\n }\n}\n\ninterface LoopTopicSearchResult {\n query: string;\n tweets: Tweet[];\n}\n\ninterface LoopPersonActivity {\n handle: string;\n userId: string;\n reason: string;\n tweets: Tweet[];\n}\n\ninterface LoopResearchState {\n timeline: Tweet[];\n mentions: Tweet[];\n topicSearchResults: LoopTopicSearchResult[];\n peopleActivity: LoopPersonActivity[];\n}\n\ntype PlannerToolName =\n | \"observe_timeline\"\n | \"observe_mentions\"\n | \"search_tweets\"\n | \"check_profile\"\n | \"reply\"\n | \"like\"\n | \"retweet\"\n | \"follow\"\n | \"post\"\n | \"skip\";\n\ninterface PlannerDecision {\n tool: PlannerToolName;\n args: Record<string, unknown>;\n reasoning?: string;\n}\n\ninterface ToolStepSummary {\n step: number;\n tool: PlannerToolName;\n summary: string;\n}\n\nfunction loopClampInt(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, Math.round(value)));\n}\n\nfunction parseJsonObjectFromText(text: string): Record<string, unknown> | null {\n const fenced = text.match(/```(?:json)?\\s*([\\s\\S]*?)```/i)?.[1];\n const candidates = [fenced, text].filter((v): v is string => Boolean(v)).map((v) => v.trim());\n for (const candidate of candidates) {\n try {\n const parsed = JSON.parse(candidate);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n if (Array.isArray(parsed) && parsed.length > 0 && parsed[0] && typeof parsed[0] === \"object\") {\n return parsed[0] as Record<string, unknown>;\n }\n } catch {\n // Continue to extraction fallback.\n }\n const obj = candidate.match(/\\{[\\s\\S]*\\}/);\n if (!obj) continue;\n try {\n const parsed = JSON.parse(obj[0]);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // Continue.\n }\n }\n return null;\n}\n\nfunction mapPlannerTool(raw: string | undefined): PlannerToolName | null {\n const clean = (raw ?? \"\").trim().toLowerCase();\n if (!clean) return null;\n if (clean === \"observe_timeline\" || clean === \"read_timeline\" || clean === \"timeline\") return \"observe_timeline\";\n if (clean === \"observe_mentions\" || clean === \"read_mentions\" || clean === \"mentions\") return \"observe_mentions\";\n if (clean === \"search_tweets\" || clean === \"search\" || clean === \"topic_search\") return \"search_tweets\";\n if (clean === \"check_profile\" || clean === \"check_person\" || clean === \"people_check\" || clean === \"profile_check\") return \"check_profile\";\n if (clean === \"reply\") return \"reply\";\n if (clean === \"like\") return \"like\";\n if (clean === \"retweet\") return \"retweet\";\n if (clean === \"follow\") return \"follow\";\n if (clean === \"post\" || clean === \"tweet\") return \"post\";\n if (clean === \"skip\" || clean === \"noop\" || clean === \"no_action\") return \"skip\";\n return null;\n}\n\nfunction parsePlannerDecision(text: string): PlannerDecision | null {\n const parsed = parseJsonObjectFromText(text);\n if (!parsed) return null;\n\n const rawTool =\n typeof parsed.tool === \"string\"\n ? parsed.tool\n : typeof parsed.action === \"string\"\n ? parsed.action\n : undefined;\n const tool = mapPlannerTool(rawTool);\n if (!tool) return null;\n\n const rawArgs = parsed.args;\n const args: Record<string, unknown> =\n rawArgs && typeof rawArgs === \"object\" && !Array.isArray(rawArgs)\n ? { ...(rawArgs as Record<string, unknown>) }\n : {};\n\n for (const key of [\"tweetId\", \"content\", \"handle\", \"query\", \"count\", \"reason\"]) {\n if (args[key] !== undefined) continue;\n if (parsed[key] !== undefined) args[key] = parsed[key];\n }\n\n const reasoning = typeof parsed.reasoning === \"string\" ? parsed.reasoning.trim() : undefined;\n return { tool, args, reasoning };\n}\n\nfunction argString(args: Record<string, unknown>, key: string): string | undefined {\n const value = args[key];\n if (typeof value !== \"string\") return undefined;\n const clean = value.trim();\n return clean.length > 0 ? clean : undefined;\n}\n\nfunction argCount(args: Record<string, unknown>, fallback: number, min: number, max: number): number {\n const raw = args.count;\n if (typeof raw === \"number\" && Number.isFinite(raw)) {\n return loopClampInt(raw, min, max);\n }\n if (typeof raw === \"string\" && raw.trim().length > 0) {\n const parsed = Number(raw);\n if (Number.isFinite(parsed)) return loopClampInt(parsed, min, max);\n }\n return loopClampInt(fallback, min, max);\n}\n\nfunction tweetTimestamp(tweet: Tweet): number {\n const ts = Date.parse(tweet.createdAt);\n return Number.isNaN(ts) ? 0 : ts;\n}\n\nfunction mergeTweetList(current: Tweet[], incoming: Tweet[]): { tweets: Tweet[]; added: number } {\n const byId = new Map<string, Tweet>();\n for (const tweet of current) byId.set(tweet.id, tweet);\n let added = 0;\n for (const tweet of incoming) {\n if (!tweet.id) continue;\n if (!byId.has(tweet.id)) added += 1;\n byId.set(tweet.id, tweet);\n }\n const tweets = [...byId.values()].sort((a, b) => tweetTimestamp(b) - tweetTimestamp(a));\n return { tweets, added };\n}\n\nfunction mergeTopicResult(\n current: LoopTopicSearchResult[],\n query: string,\n incoming: Tweet[],\n): { next: LoopTopicSearchResult[]; added: number } {\n const idx = current.findIndex((item) => item.query.toLowerCase() === query.toLowerCase());\n if (idx < 0) {\n const merged = mergeTweetList([], incoming);\n return {\n next: [...current, { query, tweets: merged.tweets }],\n added: merged.added,\n };\n }\n const merged = mergeTweetList(current[idx].tweets, incoming);\n const next = [...current];\n next[idx] = { ...next[idx], tweets: merged.tweets };\n return { next, added: merged.added };\n}\n\nfunction mergePeopleActivity(\n current: LoopPersonActivity[],\n incoming: LoopPersonActivity,\n): { next: LoopPersonActivity[]; added: number } {\n const handle = normalizeHandle(incoming.handle);\n const idx = current.findIndex((item) => normalizeHandle(item.handle) === handle);\n if (idx < 0) {\n const merged = mergeTweetList([], incoming.tweets);\n return {\n next: [...current, { ...incoming, handle, tweets: merged.tweets }],\n added: merged.added,\n };\n }\n const merged = mergeTweetList(current[idx].tweets, incoming.tweets);\n const next = [...current];\n next[idx] = {\n ...next[idx],\n userId: incoming.userId || next[idx].userId,\n reason: incoming.reason || next[idx].reason,\n tweets: merged.tweets,\n };\n return { next, added: merged.added };\n}\n\nfunction collectObserved(state: LoopResearchState): {\n ids: string[];\n tweets: Tweet[];\n byId: Map<string, Tweet>;\n} {\n const tweets = [\n ...state.timeline,\n ...state.mentions,\n ...state.topicSearchResults.flatMap((item) => item.tweets),\n ...state.peopleActivity.flatMap((item) => item.tweets),\n ];\n const byId = new Map<string, Tweet>();\n for (const tweet of tweets) {\n if (!tweet.id || byId.has(tweet.id)) continue;\n byId.set(tweet.id, tweet);\n }\n return {\n ids: [...byId.keys()],\n tweets: [...byId.values()],\n byId,\n };\n}\n\nfunction buildPlannerCandidates(\n state: LoopResearchState,\n): Tweet[] {\n const ordered = [\n ...state.mentions,\n ...state.timeline,\n ...state.topicSearchResults.flatMap((item) => item.tweets),\n ...state.peopleActivity.flatMap((item) => item.tweets),\n ];\n const byId = new Map<string, Tweet>();\n for (const tweet of ordered) {\n if (!tweet.id) continue;\n if (!byId.has(tweet.id)) byId.set(tweet.id, tweet);\n }\n return [...byId.values()].slice(0, 24);\n}\n\nfunction buildToolLoopPrompt(input: {\n identity: {\n name: string;\n handle: string;\n bio: string;\n tone: string;\n goals: string[];\n boundaries: string[];\n };\n constraintLines: string[];\n candidates: Tweet[];\n state: LoopResearchState;\n actions: AgentAction[];\n policyFeedback: string[];\n toolHistory: ToolStepSummary[];\n recentMemory: string[];\n heartbeatCount: number;\n}): string {\n const lines: string[] = [];\n lines.push(\"Choose exactly ONE tool call in strict JSON.\");\n lines.push(\"You are the autonomous planner. No fixed research sequence is required.\");\n lines.push(\"Act based on persona + live context, not templates.\");\n lines.push(\"\");\n lines.push(`Heartbeat: #${input.heartbeatCount}`);\n lines.push(`Agent: ${input.identity.name} (@${input.identity.handle})`);\n lines.push(`Bio: ${input.identity.bio}`);\n lines.push(`Tone: ${input.identity.tone}`);\n lines.push(`Goals: ${input.identity.goals.join(\" | \") || \"none\"}`);\n lines.push(`Boundaries: ${input.identity.boundaries.join(\" | \") || \"none\"}`);\n lines.push(\"\");\n if (input.constraintLines.length > 0) {\n lines.push(\"Hard persona constraints:\");\n for (const line of input.constraintLines) lines.push(line);\n lines.push(\"\");\n }\n if (input.recentMemory.length > 0) {\n lines.push(\"Recent memory:\");\n for (const row of input.recentMemory.slice(0, 8)) {\n lines.push(`- ${row}`);\n }\n lines.push(\"\");\n }\n lines.push(`Executed actions this heartbeat: ${input.actions.length}`);\n lines.push(\n `Current context counts: timeline=${input.state.timeline.length}, mentions=${input.state.mentions.length}, topicTweets=${input.state.topicSearchResults.reduce((sum, item) => sum + item.tweets.length, 0)}, peopleTweets=${input.state.peopleActivity.reduce((sum, item) => sum + item.tweets.length, 0)}`\n );\n lines.push(\"\");\n if (input.toolHistory.length > 0) {\n lines.push(\"Recent tool steps:\");\n for (const row of input.toolHistory.slice(-6)) {\n lines.push(`- Step ${row.step}: ${row.tool} -> ${row.summary}`);\n }\n lines.push(\"\");\n }\n if (input.policyFeedback.length > 0) {\n lines.push(\"Recent policy feedback:\");\n for (const note of input.policyFeedback.slice(-8)) {\n lines.push(`- ${note}`);\n }\n lines.push(\"\");\n }\n if (input.candidates.length > 0) {\n lines.push(`Top candidate tweets (${input.candidates.length}):`);\n for (const tweet of input.candidates.slice(0, 16)) {\n lines.push(\n `- [${tweet.id}] @${tweet.authorHandle}: ${tweet.text.slice(0, 190)} (${tweet.likeCount ?? 0} likes, ${tweet.replyCount ?? 0} replies)`\n );\n }\n lines.push(\"\");\n } else {\n lines.push(\"No candidate tweets currently in context.\");\n lines.push(\"\");\n }\n lines.push(\"Tool options:\");\n lines.push('- observe_timeline: { \"count\": 8-30 }');\n lines.push('- observe_mentions: { \"count\": 8-30 }');\n lines.push('- search_tweets: { \"query\": \"x api search query\", \"count\": 3-20 }');\n lines.push('- check_profile: { \"handle\": \"@username\", \"count\": 3-12 }');\n lines.push('- reply: { \"tweetId\": \"id\", \"content\": \"reply under 220 chars\" }');\n lines.push('- like: { \"tweetId\": \"id\" }');\n lines.push('- retweet: { \"tweetId\": \"id\" }');\n lines.push('- follow: { \"handle\": \"@username\" }');\n lines.push('- post: { \"content\": \"post under 220 chars\" }');\n lines.push('- skip: { \"reason\": \"short reason\" }');\n lines.push(\"\");\n lines.push(\"Output JSON object only:\");\n lines.push('{ \"tool\": \"reply\", \"args\": { \"tweetId\": \"...\", \"content\": \"...\" }, \"reasoning\": \"short why\" }');\n lines.push(\"\");\n lines.push(\"Planning rules:\");\n lines.push(\"- if timeline/mentions already have viable tweets, prefer acting over more research\");\n lines.push(\"- use search/profile checks only when you have a clear reason\");\n lines.push(\"- avoid repeating the same query/target unless context changed\");\n lines.push(\"\");\n lines.push(\"Writing constraints:\");\n lines.push(\"- sound human and specific, no manifesto language\");\n lines.push(\"- avoid 'the real question' / 'the deeper question' phrasing\");\n lines.push(\"- no repetitive anchor terms from recent outputs\");\n lines.push(\"- match the persona tone strictly\");\n return lines.join(\"\\n\");\n}\n\nfunction fallbackPlannerDecision(step: number, observedCount: number): PlannerDecision {\n if (observedCount === 0) {\n return {\n tool: step % 2 === 0 ? \"observe_timeline\" : \"observe_mentions\",\n args: { count: 20 },\n reasoning: \"fallback context bootstrap\",\n };\n }\n return {\n tool: \"skip\",\n args: { reason: \"planner parse fallback; preserve current context\" },\n reasoning: \"fallback no-op\",\n };\n}\n\nfunction decisionToAgentAction(decision: PlannerDecision): AgentAction | null {\n if (decision.tool === \"reply\") {\n const tweetId = argString(decision.args, \"tweetId\");\n const content = argString(decision.args, \"content\");\n if (!tweetId || !content) return null;\n return { action: \"reply\", tweetId, content, reasoning: decision.reasoning };\n }\n if (decision.tool === \"like\") {\n const tweetId = argString(decision.args, \"tweetId\");\n if (!tweetId) return null;\n return { action: \"like\", tweetId, reasoning: decision.reasoning };\n }\n if (decision.tool === \"retweet\") {\n const tweetId = argString(decision.args, \"tweetId\");\n if (!tweetId) return null;\n return { action: \"retweet\", tweetId, reasoning: decision.reasoning };\n }\n if (decision.tool === \"follow\") {\n const handle = argString(decision.args, \"handle\");\n if (!handle) return null;\n return { action: \"follow\", handle, targetHandle: handle, reasoning: decision.reasoning };\n }\n if (decision.tool === \"post\") {\n const content = argString(decision.args, \"content\");\n if (!content) return null;\n return { action: \"post\", content, reasoning: decision.reasoning };\n }\n if (decision.tool === \"skip\") {\n return { action: \"skip\", reason: argString(decision.args, \"reason\"), reasoning: decision.reasoning };\n }\n return null;\n}\n\nexport async function runAutonomyCycle(maxActions: number, heartbeatCount: number = 0): Promise<AutonomyCycleResult> {\n const client = await getXClient();\n const identity = loadIdentity();\n const constraints = getPersonaConstraints();\n const constraintLines = buildPersonaConstraintLines(constraints);\n if (constraintLines.length > 0) {\n logger.info(`Persona constraints active: ${constraintLines.join(\" | \")}`);\n }\n logger.info(`Autonomy runtime v2 active: planner-primary, persona+memory driven.`);\n\n try {\n const delayed = await collectDelayedOutcomes(client);\n if (delayed.processed > 0) {\n logger.info(\n `Delayed outcomes: processed=${delayed.processed}, resolved=${delayed.resolved}, rewardDelta=${delayed.rewardAdded.toFixed(2)}`\n );\n }\n } catch (error) {\n logger.warn(`Delayed outcome collection failed: ${(error as Error).message}`);\n }\n\n const selfHandle = identity.handle.replace(/^@/, \"\").toLowerCase();\n const selfUserId = selfUserIdFromCredentials();\n const isSelfTweet = (tweet: Tweet): boolean =>\n tweet.authorHandle.replace(/^@/, \"\").toLowerCase() === selfHandle ||\n (selfUserId !== null && tweet.authorId === selfUserId);\n\n const state: LoopResearchState = {\n timeline: [],\n mentions: [],\n topicSearchResults: [],\n peopleActivity: [],\n };\n\n try {\n const timeline = (await client.getTimeline({ count: 30 })).filter((tweet) => !isSelfTweet(tweet));\n state.timeline = mergeTweetList(state.timeline, timeline).tweets;\n } catch (error) {\n logger.warn(`Seed timeline read failed: ${(error as Error).message}`);\n }\n\n try {\n const mentions = (await client.getMentions({ count: 30 })).filter((tweet) => !isSelfTweet(tweet));\n state.mentions = mergeTweetList(state.mentions, mentions).tweets;\n } catch (error) {\n logger.warn(`Seed mentions read failed: ${(error as Error).message}`);\n }\n\n logger.info(\n `Autonomy context: timeline=${state.timeline.length}, mentions=${state.mentions.length}, topicTweets=${state.topicSearchResults.reduce((sum, item) => sum + item.tweets.length, 0)}, peopleTweets=${state.peopleActivity.reduce((sum, item) => sum + item.tweets.length, 0)}`\n );\n\n const actions: AgentAction[] = [];\n const results: ActionResult[] = [];\n const toolHistory: ToolStepSummary[] = [];\n const policyFeedback: string[] = [\n `Persona: ${identity.name} (@${identity.handle})`,\n `Tone: ${identity.tone}`,\n `Goals: ${(identity.goals ?? []).slice(0, 4).join(\" | \") || \"none\"}`,\n ];\n\n const systemPrompt = buildSystemPrompt();\n const toolSystemPrompt = [\n systemPrompt,\n \"TOOL LOOP MODE: You must choose exactly one tool call each step using strict JSON.\",\n \"Planner-first mode: there is no pre-defined research flow.\",\n \"Everything must be persona-driven, memory-aware, and context-grounded.\",\n \"Do not fall into repetitive searches or repetitive targets.\",\n ].join(\"\\n\\n\");\n const activeIntents = listIntents();\n let staleSteps = 0;\n let attemptedActions = 0;\n const maxToolSteps = Math.max(12, maxActions * 6);\n\n // Keep short memory available in context by touching it before loop.\n getRecentInteractions(20);\n\n for (let step = 0; step < maxToolSteps && actions.length < maxActions; step += 1) {\n const candidates = buildPlannerCandidates(state);\n const recentMemory = getRecentInteractions(24)\n .slice(0, 12)\n .map((entry) => {\n const text = (entry.content ?? \"\").replace(/\\s+/g, \" \").trim().slice(0, 120);\n const target = entry.targetHandle ? ` @${entry.targetHandle}` : \"\";\n return `${entry.type}${target}${text ? `: ${text}` : \"\"}`;\n });\n const prompt = buildToolLoopPrompt({\n identity: {\n name: identity.name,\n handle: identity.handle,\n bio: identity.bio,\n tone: identity.tone,\n goals: identity.goals ?? [],\n boundaries: identity.boundaries ?? [],\n },\n constraintLines,\n candidates,\n state,\n actions,\n policyFeedback,\n toolHistory,\n recentMemory,\n heartbeatCount,\n });\n\n let decision = fallbackPlannerDecision(step, candidates.length);\n try {\n const response = await generateResponse(toolSystemPrompt, prompt);\n const parsed = parsePlannerDecision(response.content);\n if (parsed) {\n decision = parsed;\n } else {\n policyFeedback.push(\"Planner returned invalid JSON decision. Using fallback tool.\");\n }\n } catch (error) {\n policyFeedback.push(`Planner call failed: ${(error as Error).message}`);\n }\n\n logger.info(`Tool loop step ${step + 1}: ${decision.tool}`);\n let stepProgress = false;\n\n if (decision.tool === \"observe_timeline\") {\n const count = argCount(decision.args, 16, 8, 30);\n try {\n const incoming = (await client.getTimeline({ count })).filter((tweet) => !isSelfTweet(tweet));\n const merged = mergeTweetList(state.timeline, incoming);\n state.timeline = merged.tweets;\n stepProgress = merged.added > 0;\n toolHistory.push({\n step: step + 1,\n tool: decision.tool,\n summary: `fetched ${incoming.length}, added ${merged.added}`,\n });\n } catch (error) {\n policyFeedback.push(`observe_timeline failed: ${(error as Error).message}`);\n }\n if (!stepProgress) policyFeedback.push(\"observe_timeline found no new tweets.\");\n continue;\n }\n\n if (decision.tool === \"observe_mentions\") {\n const count = argCount(decision.args, 16, 8, 30);\n try {\n const incoming = (await client.getMentions({ count })).filter((tweet) => !isSelfTweet(tweet));\n const merged = mergeTweetList(state.mentions, incoming);\n state.mentions = merged.tweets;\n stepProgress = merged.added > 0;\n toolHistory.push({\n step: step + 1,\n tool: decision.tool,\n summary: `fetched ${incoming.length}, added ${merged.added}`,\n });\n } catch (error) {\n policyFeedback.push(`observe_mentions failed: ${(error as Error).message}`);\n }\n if (!stepProgress) policyFeedback.push(\"observe_mentions found no new tweets.\");\n continue;\n }\n\n if (decision.tool === \"search_tweets\") {\n const rawQuery = argString(decision.args, \"query\");\n if (!rawQuery) {\n policyFeedback.push(\"search_tweets rejected: missing query.\");\n continue;\n }\n const query = canonicalizePlannerQuery(rawQuery);\n if (query !== rawQuery) {\n policyFeedback.push(`search_tweets normalized handle query: \"${rawQuery}\" -> \"${query}\"`);\n }\n const count = argCount(decision.args, 10, 3, 20);\n try {\n const incoming = (await client.searchTweets(query, { count })).filter((tweet) => !isSelfTweet(tweet));\n const merged = mergeTopicResult(state.topicSearchResults, query, incoming);\n state.topicSearchResults = merged.next;\n stepProgress = merged.added > 0;\n toolHistory.push({\n step: step + 1,\n tool: decision.tool,\n summary: `\"${query}\" fetched ${incoming.length}, added ${merged.added}`,\n });\n logger.info(`Tool search \"${query}\": found ${incoming.length} tweets`);\n } catch (error) {\n policyFeedback.push(`search_tweets failed for \"${query}\": ${(error as Error).message}`);\n }\n if (!stepProgress) policyFeedback.push(`search_tweets \"${query}\" found no new tweets.`);\n continue;\n }\n\n if (decision.tool === \"check_profile\") {\n const handleInput = argString(decision.args, \"handle\");\n const handle = handleInput ? canonicalPlannerHandle(handleInput) : \"\";\n if (!handle) {\n policyFeedback.push(\"check_profile rejected: missing handle.\");\n continue;\n }\n const count = argCount(decision.args, 6, 3, 12);\n try {\n const profile = await client.getProfile(handle);\n const tweets = (await client.getUserTweets(profile.id, { count })).filter((tweet) => !isSelfTweet(tweet));\n const merged = mergePeopleActivity(state.peopleActivity, {\n handle,\n userId: profile.id,\n reason: \"tool-loop check\",\n tweets,\n });\n state.peopleActivity = merged.next;\n stepProgress = merged.added > 0;\n toolHistory.push({\n step: step + 1,\n tool: decision.tool,\n summary: `@${handle} fetched ${tweets.length}, added ${merged.added}`,\n });\n logger.info(`People check @${handle}: ${tweets.length} recent tweets`);\n } catch (error) {\n policyFeedback.push(`check_profile failed for @${handle}: ${(error as Error).message}`);\n }\n if (!stepProgress) policyFeedback.push(`check_profile @${handle} found no new tweets.`);\n continue;\n }\n\n const observed = collectObserved(state);\n let candidateAction = decisionToAgentAction(decision);\n if (!candidateAction) {\n policyFeedback.push(`Tool decision ${decision.tool} rejected: invalid arguments.`);\n staleSteps += 1;\n continue;\n }\n\n if (candidateAction.tweetId && observed.byId.has(candidateAction.tweetId)) {\n const author = normalizeHandle(observed.byId.get(candidateAction.tweetId)?.authorHandle);\n if (author && !candidateAction.targetHandle) {\n candidateAction.targetHandle = `@${author}`;\n }\n }\n\n if (candidateAction.action === \"skip\") {\n const reason = candidateAction.reason ?? candidateAction.reasoning ?? \"planner skip\";\n policyFeedback.push(`Planner chose skip: ${reason}`);\n toolHistory.push({\n step: step + 1,\n tool: decision.tool,\n summary: reason,\n });\n staleSteps += 1;\n if (staleSteps >= 4) break;\n continue;\n }\n\n attemptedActions += 1;\n let policy = evaluateActionPolicy({\n action: candidateAction,\n step: attemptedActions,\n timeline: state.timeline,\n mentions: state.mentions,\n executedActions: actions,\n observedTweetIds: observed.ids,\n observedTweets: observed.tweets,\n selfHandle,\n selfUserId,\n });\n\n if (!policy.allowed && shouldAttemptStyleRewrite(candidateAction, policy.reason ?? \"\")) {\n const recentTexts = getRecentInteractions(10)\n .filter((entry) => entry.type === \"post\" || entry.type === \"reply\")\n .map((entry) => entry.content ?? \"\")\n .filter(Boolean);\n const rewritten = await rewriteDraftForHumanVoice({\n action: candidateAction,\n reason: policy.reason ?? \"policy rejected\",\n targetTweetText: candidateAction.tweetId ? observed.byId.get(candidateAction.tweetId)?.text : undefined,\n recentTexts,\n });\n\n if (rewritten && rewritten !== candidateAction.content) {\n candidateAction = {\n ...candidateAction,\n content: rewritten,\n reasoning: `${candidateAction.reasoning ?? \"rewritten\"} | style rewrite`,\n };\n policy = evaluateActionPolicy({\n action: candidateAction,\n step: attemptedActions,\n timeline: state.timeline,\n mentions: state.mentions,\n executedActions: actions,\n observedTweetIds: observed.ids,\n observedTweets: observed.tweets,\n selfHandle,\n selfUserId,\n });\n }\n }\n\n if (!policy.allowed) {\n const reason = policy.reason ?? \"Policy rejected action\";\n // Policy is fully advisory in planner-primary mode.\n policyFeedback.push(`Policy advisory (not blocking): ${reason}`);\n logger.info(`Policy advisory for ${candidateAction.action}: ${reason}`);\n }\n\n const result = await executeAction(candidateAction);\n actions.push(candidateAction);\n results.push(result);\n staleSteps = 0;\n stepProgress = true;\n toolHistory.push({\n step: step + 1,\n tool: decision.tool,\n summary: `${candidateAction.action}${result.success ? \" success\" : \" failed\"}`,\n });\n\n if (activeIntents.length > 0) {\n const touchedHandle = normalizeHandle(\n candidateAction.targetHandle ??\n candidateAction.handle ??\n (candidateAction.tweetId ? observed.byId.get(candidateAction.tweetId)?.authorHandle : undefined)\n );\n const loweredContent = (candidateAction.content ?? \"\").toLowerCase();\n for (const intent of activeIntents) {\n const handleMatch =\n touchedHandle.length > 0 &&\n intent.targetHandles.some((handle) => normalizeHandle(handle) === touchedHandle);\n const topicMatch =\n loweredContent.length > 0 &&\n intent.focusTopics.some((topic) => loweredContent.includes(topic.toLowerCase()));\n if (!handleMatch && !topicMatch) continue;\n recordIntentExecution(intent.id, {\n success: result.success,\n note: `${candidateAction.action}${touchedHandle ? ` @${touchedHandle}` : \"\"}`,\n });\n }\n }\n\n if (!result.success) {\n const err = result.error ?? \"\";\n if (candidateAction.action === \"reply\" && /duplicate content/i.test(err)) {\n const reason = \"Reply failed with duplicate-content error. Planner should choose a different wording/target.\";\n policyFeedback.push(reason);\n logger.info(`Policy adjustment: ${reason}`);\n }\n if (candidateAction.action === \"post\" && /duplicate content/i.test(err)) {\n const reason = \"Post failed with duplicate-content error. Change framing and try a different angle.\";\n policyFeedback.push(reason);\n logger.info(`Policy adjustment: ${reason}`);\n }\n }\n\n if (!stepProgress) {\n staleSteps += 1;\n }\n if (staleSteps >= 5) {\n logger.info(\"Tool loop stopped after repeated no-progress steps.\");\n break;\n }\n }\n\n recordBanditActionResults(actions, results);\n\n return {\n timeline: state.timeline,\n mentions: state.mentions,\n actions,\n results,\n policyFeedback,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkHA,eAAsB,cAAc,QAA4C;AAC9E,QAAM,EAAE,QAAQ,KAAK,IAAI;AAEzB,MAAI;AACF,YAAQ,MAAM;AAAA,MACZ,KAAK,QAAQ;AACX,YAAI,CAAC,OAAO,QAAS,QAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,OAAO,sBAAsB;AACzF,YAAI,OAAO,QAAQ,SAAS,KAAK;AAC/B,iBAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,OAAO,mBAAmB,OAAO,QAAQ,MAAM,mBAAmB;AAAA,QAC3G;AAEA,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,SAAS,MAAM,OAAO,UAAU,OAAO,OAAO;AACpD,YAAI,OAAO,QAAS,QAAO,KAAK,YAAY,OAAO,QAAQ,MAAM,GAAG,EAAE,CAAC,MAAM;AAC7E,eAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,SAAS,QAAQ,OAAO,SAAS,OAAO,OAAO,MAAM;AAAA,MAC9F;AAAA,MAEA,KAAK,SAAS;AACZ,YAAI,CAAC,OAAO,WAAW,CAAC,OAAO,SAAS;AACtC,iBAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,OAAO,6BAA6B;AAAA,QAC7E;AACA,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,SAAS,MAAM,OAAO,aAAa,OAAO,SAAS,OAAO,OAAO;AACvE,YAAI,OAAO,QAAS,QAAO,KAAK,cAAc,OAAO,OAAO,MAAM,OAAO,QAAQ,MAAM,GAAG,EAAE,CAAC,MAAM;AACnG,eAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,SAAS,QAAQ,OAAO,SAAS,OAAO,OAAO,MAAM;AAAA,MAC9F;AAAA,MAEA,KAAK,QAAQ;AACX,YAAI,CAAC,OAAO,QAAS,QAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,OAAO,kBAAkB;AACrF,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,SAAS,MAAM,OAAO,UAAU,OAAO,OAAO;AACpD,eAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,SAAS,OAAO,OAAO,MAAM;AAAA,MACtE;AAAA,MAEA,KAAK,WAAW;AACd,YAAI,CAAC,OAAO,QAAS,QAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,OAAO,kBAAkB;AACrF,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,SAAS,MAAM,OAAO,QAAQ,OAAO,OAAO;AAClD,eAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,SAAS,OAAO,OAAO,MAAM;AAAA,MACtE;AAAA,MAEA,KAAK,UAAU;AACb,YAAI,CAAC,OAAO,OAAQ,QAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,OAAO,iBAAiB;AACnF,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,SAAS,MAAM,OAAO,WAAW,OAAO,MAAM;AACpD,YAAI,CAAC,OAAO,SAAS;AACnB,yBAAe;AAAA,YACb,IAAI,OAAO,KAAK,IAAI,CAAC;AAAA,YACrB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,YAClC,MAAM;AAAA,YACN,cAAc,OAAO,OAAO,QAAQ,MAAM,EAAE;AAAA,YAC5C,aAAa;AAAA,YACb,SAAS;AAAA,YACT,OAAO,OAAO;AAAA,UAChB,CAAC;AAAA,QACH;AACA,eAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,SAAS,OAAO,OAAO,MAAM;AAAA,MACtE;AAAA,MAEA,KAAK,YAAY;AACf,YAAI,CAAC,OAAO,QAAS,QAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,OAAO,aAAa;AAChF,cAAM,QAAQ,WAAW,OAAO,OAAO;AACvC,eAAO,KAAK,eAAe,OAAO,QAAQ,MAAM,GAAG,EAAE,CAAC,YAAY,MAAM,YAAY,EAAE;AACtF,eAAO,EAAE,QAAQ,MAAM,SAAS,MAAM,QAAQ,iBAAiB,MAAM,YAAY,GAAG;AAAA,MACtF;AAAA,MAEA,KAAK,SAAS;AACZ,YAAI,CAAC,OAAO,QAAS,QAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,OAAO,aAAa;AAChF,oBAAY,OAAO,SAAS,SAAS,OAAO,QAAQ,CAAC,WAAW,CAAC;AACjE,eAAO,KAAK,aAAa,OAAO,QAAQ,MAAM,GAAG,EAAE,CAAC,MAAM;AAC1D,eAAO,EAAE,QAAQ,MAAM,SAAS,KAAK;AAAA,MACvC;AAAA,MAEA,KAAK,WAAW;AACd,YAAI,CAAC,OAAO,QAAS,QAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,OAAO,aAAa;AAChF,cAAM,WAAW,aAAa;AAC9B,iBAAS,iBAAiB,KAAK;AAAA,UAC7B,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,UAC7B,YAAY,OAAO;AAAA,QACrB,CAAC;AACD,qBAAa,QAAQ;AACrB,eAAO,KAAK,eAAe,OAAO,QAAQ,MAAM,GAAG,EAAE,CAAC,MAAM;AAC5D,eAAO,EAAE,QAAQ,MAAM,SAAS,KAAK;AAAA,MACvC;AAAA,MAEA,KAAK,QAAQ;AACX,eAAO,KAAK,aAAa,OAAO,UAAU,OAAO,aAAa,iBAAiB,EAAE;AACjF,eAAO,EAAE,QAAQ,MAAM,SAAS,MAAM,QAAQ,OAAO,UAAU,OAAO,UAAU;AAAA,MAClF;AAAA,MAEA;AACE,eAAO,KAAK,mBAAmB,IAAI,EAAE;AACrC,eAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,OAAO,mBAAmB,IAAI,GAAG;AAAA,IAC5E;AAAA,EACF,SAAS,OAAO;AACd,UAAM,MAAO,MAAgB;AAC7B,WAAO,MAAM,UAAU,IAAI,YAAY,GAAG,EAAE;AAC5C,WAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,OAAO,IAAI;AAAA,EACpD;AACF;;;AC9LA,SAAS,UAAU,MAAsB;AACvC,SAAO,KACJ,YAAY,EACZ,QAAQ,mBAAmB,EAAE,EAC7B,QAAQ,YAAY,EAAE,EACtB,QAAQ,gBAAgB,GAAG,EAC3B,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAEA,SAAS,SAAS,MAA2B;AAC3C,QAAM,SAAS,UAAU,IAAI,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO;AACxD,SAAO,IAAI,IAAI,MAAM;AACvB;AAEA,SAAS,kBAAkB,GAAW,GAAmB;AACvD,QAAM,OAAO,SAAS,CAAC;AACvB,QAAM,OAAO,SAAS,CAAC;AACvB,MAAI,KAAK,SAAS,KAAK,KAAK,SAAS,EAAG,QAAO;AAE/C,MAAI,UAAU;AACd,aAAW,SAAS,MAAM;AACxB,QAAI,KAAK,IAAI,KAAK,EAAG,YAAW;AAAA,EAClC;AAEA,QAAM,QAAQ,KAAK,OAAO,KAAK,OAAO;AACtC,SAAO,UAAU,IAAI,IAAI,UAAU;AACrC;AAEA,SAAS,WAAW,MAAc,GAAmB;AACnD,SAAO,UAAU,IAAI,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AACxE;AAEA,SAAS,iBAAiB,MAAuB;AAC/C,QAAM,SAAS,KAAK,MAAM,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK;AACxF,QAAM,QAAQ,OAAO,MAAM,KAAK,EAAE,OAAO,OAAO;AAChD,MAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,SAAO,MAAM,MAAM,CAAC,SAAS,cAAc,KAAK,IAAI,CAAC;AACvD;AAEA,SAAS,UAAU,MAAsB;AACvC,SAAO,UAAU,IAAI,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE;AACpD;AAEA,SAAS,cAAc,MAAsB;AAC3C,SAAO,KACJ,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EAAE;AACrB;AAEA,SAAS,sBAAsB,MAAsB;AACnD,QAAM,QAAQ,KAAK,YAAY;AAC/B,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,QAAQ,OAAO,CAAC,MAAM,WAAW,QAAQ,MAAM,SAAS,MAAM,IAAI,IAAI,IAAI,CAAC;AACpF;AAEA,SAAS,kBAAkB,SAA0B;AACnD,QAAM,QAAQ,UAAU,OAAO;AAC/B,QAAM,UAAU,QAAQ,MAAM,IAAI,KAAK,CAAC,GAAG;AAC3C,QAAM,cAAc,QAAQ,MAAM,IAAI,KAAK,CAAC,GAAG;AAC/C,QAAM,cAAc,QAAQ,SAAS,GAAG;AACxC,QAAM,aAAa,sBAAsB,OAAO;AAEhD,MAAI,QAAQ,GAAI,QAAO;AACvB,MAAI,QAAQ,MAAM,SAAS,cAAc,KAAK,CAAC,YAAa,QAAO;AACnE,MAAI,cAAc,EAAG,QAAO;AAC5B,SAAO;AACT;AAEA,SAAS,0BAA0B,SAA0B;AAC3D,MAAI;AACF,UAAM,WAAW,aAAa;AAC9B,UAAM,YACJ,SAAS,OAAO,cAAc,QAC9B,SAAS,OAAO,cAAc,QAC9B,SAAS,kBAAkB,eAC3B,SAAS,kBAAkB;AAC7B,QAAI,CAAC,UAAW,QAAO;AAEvB,UAAM,QAAQ,QAAQ,YAAY;AAClC,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,OAAO,KAAK,CAAC,WAAW,MAAM,SAAS,MAAM,CAAC;AAAA,EACvD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,2BAAoC;AAC3C,MAAI;AACF,UAAM,WAAW,aAAa;AAC9B,QAAI,SAAS,cAAc,cAAe,QAAO;AAEjD,QAAI,SAAS,cAAc,cAAe,QAAO;AACjD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,yBAAyB,SAAyB;AACzD,QAAM,QAAQ,QAAQ,YAAY;AAClC,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,QAAQ,OAAO,CAAC,MAAM,WAAW,QAAQ,MAAM,SAAS,MAAM,IAAI,IAAI,IAAI,CAAC;AACpF;AAEA,SAAS,kBAAkB,SAAyB;AAClD,QAAM,QAAQ,UAAU,OAAO,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO;AAC1D,QAAM,gBAAgB,oBAAI,IAAI;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO,MAAM,OAAO,CAAC,SAAS,cAAc,IAAI,IAAI,CAAC,EAAE;AACzD;AAEA,SAAS,yBAAyB,SAA0B;AAE1D,SAAO,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,QAAG;AAC/E;AAEA,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAS;AAAA,EAAQ;AAAA,EAClF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAC3E;AAAA,EAAS;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAS;AAAA,EAAS;AAAA,EAAU;AAAA,EAAS;AAAA,EAClF;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAO;AAAA,EAChF;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AACnD,CAAC;AAED,SAAS,mBAAmB,MAA2B;AACrD,QAAM,SAAS,UAAU,IAAI,EAC1B,MAAM,GAAG,EACT,OAAO,CAAC,UAAU,MAAM,UAAU,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC;AACvE,SAAO,IAAI,IAAI,MAAM;AACvB;AAEA,SAAS,4BAA4B,SAAiB,YAA6B;AACjF,QAAM,IAAI,mBAAmB,OAAO;AACpC,QAAM,IAAI,mBAAmB,UAAU;AACvC,MAAI,EAAE,SAAS,KAAK,EAAE,SAAS,EAAG,QAAO;AACzC,aAAW,SAAS,GAAG;AACrB,QAAI,EAAE,IAAI,KAAK,EAAG,QAAO;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,uBAAiC;AACxC,QAAM,SAAS,sBAAsB,EAAE;AACvC,SAAO,OACJ,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,SAAS,OAAO,EACrD,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,EAC1B,OAAO,CAAC,YAAY,QAAQ,SAAS,CAAC;AAC3C;AAEA,IAAM,uBAAuB,oBAAI,IAAI;AAAA,EACnC;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAW;AAAA,EAAU;AAAA,EAAU;AAAA,EAAS;AAAA,EAAW;AAAA,EAAS;AAAA,EACvF;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAQ;AAAA,EAC3F;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAW;AAAA,EAAQ;AAAA,EAC/F;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAC7F;AAAA,EAAS;AAAA,EAAU;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAU;AAAA,EAAU;AAAA,EAAW;AAAA,EAAU;AAAA,EAAS;AAAA,EACtF;AAAA,EAAc;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAY;AAAA,EAAU;AAAA,EAAW;AAAA,EAAS;AAC3E,CAAC;AAED,SAAS,kBAAkB,MAAwB;AACjD,SAAO,UAAU,IAAI,EAClB,MAAM,GAAG,EACT,OAAO,CAAC,UAAU,MAAM,UAAU,KAAK,CAAC,qBAAqB,IAAI,KAAK,CAAC;AAC5E;AAEA,SAAS,mBAAmB,SAAiB,QAAiC;AAC5E,QAAM,eAAe,OAAO,MAAM,GAAG,EAAE;AACvC,MAAI,aAAa,SAAS,EAAG,QAAO;AAEpC,QAAM,cAAc,oBAAI,IAAoB;AAC5C,QAAM,eAAe,oBAAI,IAAoB;AAE7C,aAAW,UAAU,cAAc;AACjC,UAAM,SAAS,kBAAkB,MAAM;AACvC,UAAM,eAAe,IAAI,IAAI,MAAM;AACnC,eAAW,SAAS,cAAc;AAChC,kBAAY,IAAI,QAAQ,YAAY,IAAI,KAAK,KAAK,KAAK,CAAC;AAAA,IAC1D;AACA,aAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG;AAC7C,YAAM,SAAS,GAAG,OAAO,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC;AAC5C,mBAAa,IAAI,SAAS,aAAa,IAAI,MAAM,KAAK,KAAK,CAAC;AAAA,IAC9D;AAAA,EACF;AAEA,QAAM,gBAAgB,kBAAkB,OAAO;AAC/C,QAAM,kBAAkB,IAAI,IAAI,aAAa;AAC7C,aAAW,SAAS,iBAAiB;AACnC,UAAM,QAAQ,YAAY,IAAI,KAAK,KAAK;AACxC,QAAI,SAAS,EAAG,QAAO;AAAA,EACzB;AAEA,WAAS,IAAI,GAAG,IAAI,cAAc,SAAS,GAAG,KAAK,GAAG;AACpD,UAAM,SAAS,GAAG,cAAc,CAAC,CAAC,IAAI,cAAc,IAAI,CAAC,CAAC;AAC1D,UAAM,QAAQ,aAAa,IAAI,MAAM,KAAK;AAC1C,QAAI,SAAS,EAAG,QAAO;AAAA,EACzB;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAc,QAAgB,GAAW;AAChE,SAAO,UAAU,IAAI,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,KAAK,GAAG;AAC5E;AAEA,SAAS,oBAAoB,SAAiB,QAAiC;AAC7E,QAAM,UAAU,gBAAgB,SAAS,CAAC;AAC1C,MAAI,CAAC,WAAW,QAAQ,MAAM,GAAG,EAAE,SAAS,EAAG,QAAO;AAEtD,MAAI,UAAU;AACd,aAAW,UAAU,OAAO,MAAM,GAAG,EAAE,GAAG;AACxC,QAAI,gBAAgB,QAAQ,CAAC,MAAM,SAAS;AAC1C,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,SAAO,WAAW,IAAI,UAAU;AAClC;AAEA,SAAS,uBAAuB,SAAiB,QAA0B;AACzE,QAAM,UAAU,IAAI,IAAI,kBAAkB,OAAO,CAAC;AAClD,MAAI,QAAQ,SAAS,EAAG,QAAO;AAE/B,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,UAAU,OAAO,MAAM,GAAG,EAAE,GAAG;AACxC,eAAW,SAAS,kBAAkB,MAAM,GAAG;AAC7C,WAAK,IAAI,KAAK;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,QAAQ;AACZ,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,KAAK,IAAI,KAAK,EAAG,UAAS;AAAA,EACjC;AACA,SAAO,QAAQ,QAAQ;AACzB;AAEA,SAAS,+BAA+B,SAA0B;AAChE,QAAM,gBAAgB,kBAAkB,OAAO;AAC/C,MAAI,gBAAgB,EAAG,QAAO;AAE9B,QAAM,QAAQ,UAAU,OAAO;AAC/B,QAAM,UAAU,gBAAgB,KAAK,IAAI,GAAG,KAAK;AACjD,MAAI,UAAU,IAAK,QAAO;AAE1B,QAAM,QAAQ,QAAQ,YAAY;AAClC,QAAM,YAAY,OAAO,KAAK,OAAO;AACrC,QAAM,YAAY,kBAAkB,KAAK,OAAO;AAChD,QAAM,WAAW,SAAS,KAAK,OAAO;AACtC,QAAM,oBAAoB,oEAAoE,KAAK,KAAK;AACxG,QAAM,cAAc,QAAQ,SAAS,GAAG;AAExC,SAAO,EAAE,aAAa,aAAa,YAAY,qBAAqB;AACtE;AAEA,SAAS,iCAAiC,UAAmB,UAA4B;AACvF,MAAI,SAAS,SAAS,EAAG,QAAO;AAChC,SAAO,SAAS,KAAK,CAAC,WAAW,MAAM,cAAc,KAAK,KAAK,MAAM,KAAK,SAAS,GAAG,CAAC;AACzF;AAEA,SAAS,qBAAqB,QAA8B;AAC1D,SAAO,CAAC,SAAS,QAAQ,WAAW,QAAQ,EAAE,SAAS,OAAO,MAAM;AACtE;AAEA,SAAS,gBAAgB,QAA8B;AACrD,SAAO,CAAC,QAAQ,SAAS,UAAU,EAAE,SAAS,OAAO,MAAM;AAC7D;AAEA,SAAS,gBAAgB,QAAoC;AAC3D,UAAQ,UAAU,IAAI,QAAQ,MAAM,EAAE,EAAE,KAAK,EAAE,YAAY;AAC7D;AAEA,SAAS,0BAA0B,QAAqB,WAAuC;AAC7F,MAAI,OAAO,OAAQ,QAAO,gBAAgB,OAAO,MAAM;AACvD,MAAI,OAAO,aAAc,QAAO,gBAAgB,OAAO,YAAY;AACnE,MAAI,OAAO,QAAS,QAAO,gBAAgB,UAAU,IAAI,OAAO,OAAO,GAAG,YAAY;AACtF,SAAO;AACT;AAEA,SAAS,uBAAuB,iBAA0C;AACxE,SAAO,gBACJ,OAAO,CAAC,MAAM,gBAAgB,CAAC,KAAK,OAAO,EAAE,YAAY,QAAQ,EACjE,IAAI,CAAC,MAAM,EAAE,SAAS,KAAK,KAAK,EAAE,EAClC,OAAO,CAAC,YAAY,QAAQ,SAAS,CAAC;AAC3C;AAEA,SAAS,mBAAmB,SAAiB,QAA2B;AACtE,QAAM,aAAa,UAAU,OAAO;AACpC,MAAI,CAAC,WAAY,QAAO;AAExB,SAAO,OAAO,KAAK,CAAC,MAAM;AACxB,UAAM,YAAY,UAAU,CAAC;AAC7B,QAAI,CAAC,UAAW,QAAO;AACvB,QAAI,cAAc,WAAY,QAAO;AACrC,WAAO,kBAAkB,SAAS,CAAC,KAAK;AAAA,EAC1C,CAAC;AACH;AAEA,SAAS,kBAAkB,QAAqB,iBAAyC;AACvF,MAAI,CAAC,OAAO,QAAS,QAAO;AAC5B,SAAO,gBAAgB,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO,WAAW,EAAE,WAAW,OAAO,MAAM;AAC/F;AAEA,SAAS,iBAAiB,SAAiB,QAA2B;AACpE,QAAM,SAAS,WAAW,SAAS,CAAC;AACpC,MAAI,CAAC,OAAQ,QAAO;AAEpB,SAAO,OAAO,KAAK,CAAC,MAAM;AACxB,UAAM,YAAY,WAAW,GAAG,CAAC,MAAM;AACvC,UAAM,UAAU,kBAAkB,SAAS,CAAC,KAAK;AACjD,WAAO,aAAa;AAAA,EACtB,CAAC;AACH;AAEA,SAAS,wBAAwB,SAAiB,eAA4C;AAC5F,MAAI,CAAC,iBAAiB,OAAO,EAAG,QAAO;AACvC,QAAM,aAAa,cAChB,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,OAAO,EAC5C,MAAM,GAAG,CAAC,EACV,OAAO,CAAC,MAAM,iBAAiB,EAAE,WAAW,EAAE,CAAC;AAElD,SAAO,WAAW,UAAU;AAC9B;AAEO,SAAS,qBAAqB,SAAwC;AAC3E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,OAAO,gBAAgB,UAAU;AACvC,QAAM,UAAU,cAAc,IAAI,KAAK;AACvC,QAAM,cAAc,kBAAkB,CAAC,GAAG,UAAU,GAAG,QAAQ;AAC/D,QAAM,YAAY,IAAI,IAAI,YAAY,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;AACvE,QAAM,cAAc,sBAAsB;AAC1C,QAAM,qBAAqB,IAAI,IAAI,YAAY,mBAAmB,IAAI,CAAC,WAAW,gBAAgB,MAAM,CAAC,CAAC;AAC1G,QAAM,wBAAwB,IAAI,IAAI,yBAAyB,WAAW,EAAE,IAAI,CAAC,WAAW,gBAAgB,MAAM,CAAC,CAAC;AACpH,QAAM,eAAe,0BAA0B,QAAQ,SAAS;AAGhE,MAAI,YAAY,iBAAiB,CAAC,CAAC,SAAS,QAAQ,SAAS,SAAS,EAAE,SAAS,OAAO,MAAM,GAAG;AAC/F,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,YAAY,oBAAoB,OAAO,WAAW,UAAU,OAAO,WAAW,aAAa;AAC7F,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,mBAAmB,OAAO,GAAG;AAC/B,QAAI,OAAO,WAAW,SAAS;AAC7B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,0DAA0D,CAAC,GAAG,kBAAkB,EAAE,KAAK,KAAK,CAAC;AAAA,MACvG;AAAA,IACF;AACA,QAAI,CAAC,gBAAgB,CAAC,mBAAmB,IAAI,YAAY,GAAG;AAC1D,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,gCAAgC,CAAC,GAAG,kBAAkB,EAAE,KAAK,KAAK,CAAC;AAAA,MAC7E;AAAA,IACF;AAAA,EACF;AAEA,MACE,sBAAsB,OAAO,KAC7B,CAAC,SAAS,QAAQ,WAAW,QAAQ,EAAE,SAAS,OAAO,MAAM,GAC7D;AACA,QAAI,CAAC,gBAAgB,CAAC,sBAAsB,IAAI,YAAY,GAAG;AAC7D,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,sCAAsC,CAAC,GAAG,qBAAqB,EAAE,KAAK,KAAK,CAAC;AAAA,MACtF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,kBAAkB,QAAQ,eAAe,GAAG;AAC9C,WAAO,EAAE,SAAS,OAAO,QAAQ,UAAU,OAAO,MAAM,+BAA+B,OAAO,OAAO,mBAAmB;AAAA,EAC1H;AAEA,MAAI,OAAO,WAAW,gBAAgB,MAAM,GAAG;AAC7C,QAAI,OAAO,QAAQ,SAAS,KAAK;AAC/B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,wBAAwB,OAAO,QAAQ,MAAM;AAAA,MACvD;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,WAAW,UAAU,OAAO,OAAO,IAAI,MAAM,CAAC,OAAO,QAAQ,SAAS,GAAG,GAAG;AAChG,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,kBAAkB,OAAO,OAAO,GAAG;AACrC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,0BAA0B,OAAO,OAAO,GAAG;AAC7C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,CAAC,yBAAyB,GAAG;AAC/B,YAAM,UAAU,yBAAyB,OAAO,OAAO;AACvD,YAAM,gBAAgB,kBAAkB,OAAO,OAAO;AACtD,YAAM,cAAc,OAAO,QAAQ,SAAS,GAAG;AAC/C,UAAI,WAAW,KAAM,iBAAiB,KAAK,aAAc;AACvD,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ;AAAA,QACV;AAAA,MACF;AAEA,YAAM,QAAQ,UAAU,OAAO,OAAO;AACtC,YAAM,YAAY,cAAc,OAAO,OAAO;AAC9C,UAAI,OAAO,WAAW,YAAY,QAAQ,MAAM,YAAY,IAAI;AAC9D,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ;AAAA,QACV;AAAA,MACF;AACA,UAAI,OAAO,WAAW,WAAW,QAAQ,MAAM,YAAY,IAAI;AAC7D,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ;AAAA,QACV;AAAA,MACF;AACA,WAAK,OAAO,WAAW,WAAW,OAAO,WAAW,WAAW,yBAAyB,OAAO,OAAO,KAAK,QAAQ,IAAI;AACrH,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,UAAM,sBAAsB,uBAAuB,eAAe;AAClE,QAAI,mBAAmB,OAAO,SAAS,mBAAmB,GAAG;AAC3D,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,SAAS,qBAAqB;AACpC,UAAM,iBAAiB,mBAAmB,OAAO,SAAS,MAAM;AAChE,QAAI,gBAAgB;AAClB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,2CAA2C,cAAc;AAAA,MACnE;AAAA,IACF;AAEA,UAAM,kBAAkB,oBAAoB,OAAO,SAAS,MAAM;AAClE,QAAI,iBAAiB;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,uCAAuC,eAAe;AAAA,MAChE;AAAA,IACF;AAEA,QAAI,OAAO,UAAU,KAAK,UAAU,OAAO,OAAO,KAAK,IAAI;AACzD,YAAM,UAAU,uBAAuB,OAAO,SAAS,MAAM;AAC7D,UAAI,UAAU,MAAM;AAClB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,yBAAyB,KAAK,+BAA+B,OAAO,OAAO,GAAG;AACjF,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,QAAM,6BAA6B,iCAAiC,UAAU,QAAQ;AACtF,QAAM,oBAAoB,gBAAgB,KAAK,oBAAoB;AACnE,QAAM,gBAAgB,oBAAoB,iBAAiB,SAAS,IAChE,iBAAiB,SACjB,SAAS,SAAS,SAAS;AAE/B,OAAK,OAAO,WAAW,WAAW,OAAO,WAAW,UAAU,OAAO,WAAW,cAAc,kBAAkB,GAAG;AACjH,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MACE,OAAO,WAAW,UAClB,8BACA,CAAC,qBACD,OAAO,GACP;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,gBAAgB,MAAM,KAAK,OAAO,SAAS;AAC7C,UAAM,SAAS,qBAAqB;AACpC,QAAI,mBAAmB,OAAO,SAAS,MAAM,GAAG;AAC9C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,iBAAiB,OAAO,SAAS,MAAM,GAAG;AAC5C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,OAAK,OAAO,WAAW,UAAU,OAAO,WAAW,eAAe,OAAO,SAAS;AAChF,UAAM,qBAAqB,sBAAsB,EAAE;AACnD,QAAI,wBAAwB,OAAO,SAAS,kBAAkB,GAAG;AAC/D,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,OAAK,OAAO,WAAW,WAAW,OAAO,WAAW,UAAU,OAAO,WAAW,cAAc,OAAO,SAAS;AAC5G,UAAM,QAAQ,IAAI,IAAI,oBAAoB,CAAC,GAAG,UAAU,GAAG,QAAQ,EAAE,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC;AAC7F,QAAI,CAAC,MAAM,IAAI,OAAO,OAAO,GAAG;AAC9B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,SAAS,OAAO,OAAO;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,cAAc,UAAU,IAAI,OAAO,OAAO;AAChD,QAAI,gBACD,QAAQ,gBAAgB,YAAY,YAAY,MAAM,QACtD,UAAU,YAAY,aAAa,SACnC;AACD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,WAAW,OAAO,SAAS;AAC/C,QAAI,OAAO,SAAS;AAClB,YAAM,cAAc,UAAU,IAAI,OAAO,OAAO;AAChD,UAAI,eAAe,CAAC,4BAA4B,OAAO,SAAS,YAAY,IAAI,GAAG;AACjF,cAAM,UAAU,yBAAyB,OAAO,OAAO;AACvD,YAAI,UAAU,OAAO,OAAO,IAAI,KAAK,UAAU,KAAK,kBAAkB,OAAO,OAAO,KAAK,GAAG;AAC1F,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,YAAY,OAAO,QAAQ;AAC/C,UAAM,SAAS,gBAAgB,OAAO,MAAM;AAC5C,QAAI,CAAC,QAAQ;AACX,aAAO,EAAE,SAAS,OAAO,QAAQ,0BAA0B;AAAA,IAC7D;AAEA,QAAI,QAAQ,WAAW,MAAM;AAC3B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EAEF;AAEA,SAAO,EAAE,SAAS,KAAK;AACzB;;;ACzqBA,SAAS,YAAY,cAAc,qBAAqB;AA6CxD,IAAM,6BAA6B;AAEnC,SAAS,eAA4B;AACnC,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,mBAAmB;AAAA,IACnB,MAAM,CAAC;AAAA,IACP,SAAS,CAAC;AAAA,EACZ;AACF;AAEA,SAAS,MAAM,OAAe,KAAa,KAAqB;AAC9D,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;AAEA,SAAS,YAAyB;AAChC,MAAI,CAAC,WAAW,MAAM,MAAM,EAAG,QAAO,aAAa;AACnD,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,aAAa,MAAM,QAAQ,OAAO,CAAC;AAC7D,UAAM,QAAqB;AAAA,MACzB,YAAY,KAAK,IAAI,GAAG,OAAO,cAAc,CAAC;AAAA,MAC9C,mBAAmB,MAAM,OAAO,qBAAqB,4BAA4B,KAAK,IAAI;AAAA,MAC1F,MAAM,OAAO,QAAQ,CAAC;AAAA,MACtB,SAAS,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,UAAU,CAAC;AAAA,IAC7D;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,aAAa;AAAA,EACtB;AACF;AAEA,SAAS,UAAU,OAA0B;AAC3C,QAAM,oBAAoB,MAAM,MAAM,mBAAmB,KAAK,IAAI;AAClE,QAAM,UAAU,MAAM,QACnB,OAAO,CAAC,UAAU;AACjB,QAAI,CAAC,MAAM,SAAU,QAAO;AAC5B,UAAM,eAAe,KAAK,MAAM,MAAM,SAAS;AAC/C,QAAI,OAAO,MAAM,YAAY,EAAG,QAAO;AACvC,WAAO,KAAK,IAAI,IAAI,eAAe,IAAI,KAAK,KAAK,KAAK;AAAA,EACxD,CAAC,EACA,MAAM,KAAK;AACd,gBAAc,MAAM,QAAQ,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC5D;AAEA,SAAS,UAAU,OAAoB,QAA2B;AAChE,QAAM,WAAW,MAAM,KAAK,MAAM;AAClC,MAAI,SAAU,QAAO;AACrB,QAAM,MAAiB;AAAA,IACrB,KAAK;AAAA,IACL,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACA,QAAM,KAAK,MAAM,IAAI;AACrB,SAAO;AACT;AAYA,SAAS,uBAAuB,QAA8B;AAC5D,MAAI,OAAO,QAAS,QAAO;AAC3B,QAAM,SAAS,OAAO,SAAS,IAAI,YAAY;AAC/C,MAAI,MAAM,SAAS,mBAAmB,EAAG,QAAO;AAChD,MAAI,MAAM,SAAS,YAAY,EAAG,QAAO;AACzC,MAAI,MAAM,SAAS,WAAW,KAAK,MAAM,SAAS,KAAK,EAAG,QAAO;AACjE,SAAO;AACT;AAEA,SAAS,qBAAqB,SAAyF;AACrH,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,SACJ,KAAK,IAAI,QAAQ,YAAY,MAAM,GAAG,IACtC,KAAK,IAAI,QAAQ,aAAa,MAAM,GAAG,IACvC,KAAK,IAAI,QAAQ,eAAe,MAAM,GAAG;AAC3C,MAAI,QAAQ,cAAc,KAAK,QAAQ,eAAe,KAAK,QAAQ,iBAAiB,GAAG;AACrF,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,QAAQ,GAAG;AAC7B;AAEA,SAAS,iBAAiB,QAA6B;AACrD,MAAI,OAAO,aAAa,OAAO,UAAU,KAAK,EAAE,SAAS,EAAG,QAAO,OAAO;AAC1E,QAAM,SAAS,OAAO,UAAU;AAChC,SAAO,GAAG,OAAO,MAAM,IAAI,MAAM;AACnC;AAEA,SAAS,eAAe,QAAqB,QAA0C;AACrF,MAAI,OAAO,UAAU,QAAQ,KAAK,OAAO,MAAM,EAAG,QAAO,OAAO;AAChE,MAAI,OAAO,WAAW,WAAW,OAAO,QAAS,QAAO,OAAO;AAC/D,SAAO;AACT;AAkEO,SAAS,0BAA0B,SAAwB,SAA+B;AAC/F,MAAI,QAAQ,WAAW,KAAK,QAAQ,WAAW,EAAG;AAClD,QAAM,QAAQ,UAAU;AACxB,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,WAAS,IAAI,GAAG,IAAI,KAAK,IAAI,QAAQ,QAAQ,QAAQ,MAAM,GAAG,KAAK,GAAG;AACpE,UAAM,SAAS,QAAQ,CAAC;AACxB,UAAM,SAAS,QAAQ,CAAC;AACxB,UAAM,SAAS,iBAAiB,MAAM;AACtC,UAAM,MAAM,UAAU,OAAO,MAAM;AAEnC,UAAM,kBAAkB,uBAAuB,MAAM;AACrD,QAAI,SAAS;AACb,QAAI,aAAa;AACjB,QAAI,aAAa;AACjB,QAAI,YAAY;AAChB,UAAM,cAAc;AAEpB,UAAM,UAAU,eAAe,QAAQ,MAAM;AAC7C,QAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAAU,OAAO,WAAW,UAAU;AACxF,YAAM,UAAU,OAAO,WAAW,UAAU,KAAK,KAAK,MAAO,KAAK,KAAK;AACvE,YAAM,QAAQ,KAAK;AAAA,QACjB,IAAI,WAAW,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,QACnE;AAAA,QACA,YAAY,OAAO;AAAA,QACnB;AAAA,QACA,WAAW;AAAA,QACX,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,EAAE,YAAY;AAAA,QACtD,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,YAAU,KAAK;AACjB;AAEA,eAAsB,uBAAuB,QAA4D;AACvG,QAAM,QAAQ,UAAU;AACxB,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,aAAa,MAAM,QAAQ,OAAO,CAAC,UAAU,CAAC,MAAM,YAAY,KAAK,MAAM,MAAM,SAAS,KAAK,GAAG,EAAE,MAAM,GAAG,CAAC;AACpH,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,EAAE,WAAW,GAAG,UAAU,GAAG,aAAa,EAAE;AAAA,EACrD;AAEA,MAAI,cAAc;AAClB,MAAI,WAAW;AACf,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AAEzC,aAAW,WAAW,YAAY;AAChC,UAAM,MAAM,UAAU,OAAO,QAAQ,MAAM;AAC3C,QAAI,UAAkF;AAEtF,QAAI,QAAQ,SAAS;AACnB,gBAAU,MAAM,OAAO,gBAAgB,QAAQ,OAAO;AACtD,UAAI,SAAS;AACX,0BAAkB,QAAQ,SAAS;AAAA,UACjC;AAAA,UACA,OAAO,QAAQ;AAAA,UACf,UAAU,QAAQ;AAAA,UAClB,SAAS,QAAQ;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,SAAS;AAAA,MACb,UACI;AAAA,QACE,WAAW,QAAQ;AAAA,QACnB,cAAc,QAAQ;AAAA,QACtB,YAAY,QAAQ;AAAA,MACtB,IACA;AAAA,IACN;AAEA,QAAI,aAAa;AACjB,QAAI,aAAa;AACjB,QAAI,YAAY;AAChB,mBAAe;AACf,YAAQ,WAAW;AACnB,gBAAY;AAAA,EACd;AAEA,YAAU,KAAK;AACf,SAAO;AAAA,IACL,qCAAqC,WAAW,MAAM,cAAc,QAAQ,iBAAiB,YAAY,QAAQ,CAAC,CAAC;AAAA,EACrH;AAEA,SAAO;AAAA,IACL,WAAW,WAAW;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AACF;;;ACrRA,SAAS,4BAA2C;AAClD,MAAI;AACF,UAAM,QAAQ,gBAAgB;AAC9B,UAAM,cAAc,MAAM;AAC1B,QAAI,CAAC,YAAa,QAAO;AACzB,UAAM,UAAU,YAAY,QAAQ,GAAG;AACvC,QAAI,WAAW,EAAG,QAAO;AACzB,UAAM,YAAY,YAAY,UAAU,GAAG,OAAO;AAClD,WAAO,QAAQ,KAAK,SAAS,IAAI,YAAY;AAAA,EAC/C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASA,iBAAgB,QAAoC;AAC3D,UAAQ,UAAU,IAAI,QAAQ,MAAM,EAAE,EAAE,KAAK,EAAE,YAAY;AAC7D;AAEA,SAAS,uBAAuB,QAAwB;AACtD,QAAM,QAAQA,iBAAgB,MAAM;AACpC,QAAM,WAAmC;AAAA,IACvC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AACA,SAAO,SAAS,KAAK,KAAK;AAC5B;AAEA,SAAS,yBAAyB,UAA0B;AAC1D,SAAO,SAAS,QAAQ,+BAA+B,CAAC,QAAQ,WAAW,QAAQ,uBAAuB,MAAM,CAAC,EAAE;AACrH;AASA,SAAS,eAAe,MAAsB;AAC5C,SAAO,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO,EAAE;AAClD;AAEA,SAAS,eAAe,MAAgC;AACtD,QAAM,QAAQ,KAAK,YAAY;AAC/B,MAAI,KAAK,SAAS,GAAG,EAAG,QAAO;AAC/B,MAAI,mCAAmC,KAAK,IAAI,EAAG,QAAO;AAC1D,MAAI,4CAA4C,KAAK,KAAK,EAAG,QAAO;AACpE,MAAI,eAAe,IAAI,KAAK,EAAG,QAAO;AACtC,SAAO;AACT;AAEA,SAAS,uBAAuB,aAAwB,iBAA4C;AAClG,QAAM,SAA2C;AAAA,IAC/C,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,cAAc;AAAA,EAChB;AACA,aAAW,SAAS,eAAe,CAAC,GAAG,MAAM,GAAG,EAAE,GAAG;AACnD,WAAO,eAAe,IAAI,CAAC,KAAK;AAAA,EAClC;AAEA,OAAK,mBAAmB,IAAI,SAAS,GAAG,KAAK,OAAO,oBAAoB,GAAG;AACzE,WAAO;AAAA,EACT;AAEA,SAAQ,OAAO,QAAQ,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAA0B;AAC7F;AAEA,SAAS,6BAA6B,MAAkC;AACtE,MAAI,SAAS,kBAAkB;AAC7B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,oBAAoB;AAC/B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,qBAAqB;AAChC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,gBAAgB;AAC3B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,0BAA0B,QAAqB,QAAyB;AAC/E,MAAI,CAAC,OAAO,WAAY,OAAO,WAAW,WAAW,OAAO,WAAW,OAAS,QAAO;AACvF,QAAM,QAAQ,OAAO,YAAY;AACjC,SACE,MAAM,SAAS,cAAc,KAC7B,MAAM,SAAS,8BAA8B,KAC7C,MAAM,SAAS,WAAW,KAC1B,MAAM,SAAS,sBAAsB,KACrC,MAAM,SAAS,sCAAsC,KACrD,MAAM,SAAS,2BAA2B,KAC1C,MAAM,SAAS,+BAA+B,KAC9C,MAAM,SAAS,2BAA2B,KAC1C,MAAM,SAAS,6BAA6B,KAC5C,MAAM,SAAS,0CAA0C;AAE7D;AAEA,SAAS,mBAAmB,MAAsB;AAChD,QAAM,UAAU,KACb,QAAQ,mBAAmB,EAAE,EAC7B,QAAQ,oBAAoB,EAAE,EAC9B,KAAK;AACR,QAAM,YAAY,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO,EAAE,CAAC,KAAK;AACvF,SAAO,UAAU,KAAK;AACxB;AAEA,eAAe,0BAA0B,OAKd;AACzB,MAAI,CAAC,MAAM,OAAO,QAAS,QAAO;AAClC,QAAM,WAAW,aAAa;AAC9B,QAAM,WAAW,MAAM,OAAO,WAAW,UAAU,MAAM;AACzD,QAAM,WAAW,MAAM,OAAO,WAAW,UAAU,KAAK;AACxD,QAAM,YAAY,uBAAuB,MAAM,aAAa,MAAM,eAAe;AAEjF,QAAM,SAAS;AAAA,IACb,qCAAqC,SAAS,IAAI;AAAA,IAClD;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AAEV,QAAM,cAAwB,CAAC;AAC/B,cAAY,KAAK,kBAAkB,MAAM,OAAO,OAAO,EAAE;AACzD,cAAY,KAAK,qBAAqB,MAAM,MAAM,EAAE;AACpD,MAAI,MAAM,iBAAiB;AACzB,gBAAY,KAAK,yBAAyB,MAAM,eAAe,EAAE;AAAA,EACnE;AACA,cAAY,KAAK,cAAc;AAC/B,cAAY,KAAK,KAAK,QAAQ,IAAI,QAAQ,aAAa;AACvD,cAAY,KAAK,2BAA2B;AAC5C,cAAY,KAAK,0DAA0D;AAC3E,cAAY,KAAK,mCAAmC;AACpD,cAAY,KAAK,uCAAuC;AACxD,cAAY,KAAK,6BAA6B;AAC9C,cAAY,KAAK,6DAA6D;AAC9E,aAAW,QAAQ,6BAA6B,SAAS,GAAG;AAC1D,gBAAY,KAAK,IAAI;AAAA,EACvB;AACA,MAAI,MAAM,eAAe,MAAM,YAAY,SAAS,GAAG;AACrD,gBAAY,KAAK,uDAAuD;AACxE,eAAW,QAAQ,MAAM,YAAY,MAAM,GAAG,CAAC,GAAG;AAChD,kBAAY,KAAK,OAAO,KAAK,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,IAC9C;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,MAAM,iBAAiB,QAAQ,YAAY,KAAK,IAAI,CAAC;AACrE,UAAM,YAAY,mBAAmB,QAAQ,OAAO;AACpD,QAAI,CAAC,UAAW,QAAO;AACvB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AA6CA,SAAS,aAAa,OAAe,KAAa,KAAqB;AACrE,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC;AACvD;AAEA,SAAS,wBAAwB,MAA8C;AAC7E,QAAM,SAAS,KAAK,MAAM,+BAA+B,IAAI,CAAC;AAC9D,QAAM,aAAa,CAAC,QAAQ,IAAI,EAAE,OAAO,CAAC,MAAmB,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAC5F,aAAW,aAAa,YAAY;AAClC,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,SAAS;AACnC,UAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAClE,eAAO;AAAA,MACT;AACA,UAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,KAAK,OAAO,CAAC,KAAK,OAAO,OAAO,CAAC,MAAM,UAAU;AAC5F,eAAO,OAAO,CAAC;AAAA,MACjB;AAAA,IACF,QAAQ;AAAA,IAER;AACA,UAAM,MAAM,UAAU,MAAM,aAAa;AACzC,QAAI,CAAC,IAAK;AACV,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,IAAI,CAAC,CAAC;AAChC,UAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAClE,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAiD;AACvE,QAAM,SAAS,OAAO,IAAI,KAAK,EAAE,YAAY;AAC7C,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,UAAU,sBAAsB,UAAU,mBAAmB,UAAU,WAAY,QAAO;AAC9F,MAAI,UAAU,sBAAsB,UAAU,mBAAmB,UAAU,WAAY,QAAO;AAC9F,MAAI,UAAU,mBAAmB,UAAU,YAAY,UAAU,eAAgB,QAAO;AACxF,MAAI,UAAU,mBAAmB,UAAU,kBAAkB,UAAU,kBAAkB,UAAU,gBAAiB,QAAO;AAC3H,MAAI,UAAU,QAAS,QAAO;AAC9B,MAAI,UAAU,OAAQ,QAAO;AAC7B,MAAI,UAAU,UAAW,QAAO;AAChC,MAAI,UAAU,SAAU,QAAO;AAC/B,MAAI,UAAU,UAAU,UAAU,QAAS,QAAO;AAClD,MAAI,UAAU,UAAU,UAAU,UAAU,UAAU,YAAa,QAAO;AAC1E,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAsC;AAClE,QAAM,SAAS,wBAAwB,IAAI;AAC3C,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,UACJ,OAAO,OAAO,SAAS,WACnB,OAAO,OACP,OAAO,OAAO,WAAW,WACvB,OAAO,SACP;AACR,QAAM,OAAO,eAAe,OAAO;AACnC,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,UAAU,OAAO;AACvB,QAAM,OACJ,WAAW,OAAO,YAAY,YAAY,CAAC,MAAM,QAAQ,OAAO,IAC5D,EAAE,GAAI,QAAoC,IAC1C,CAAC;AAEP,aAAW,OAAO,CAAC,WAAW,WAAW,UAAU,SAAS,SAAS,QAAQ,GAAG;AAC9E,QAAI,KAAK,GAAG,MAAM,OAAW;AAC7B,QAAI,OAAO,GAAG,MAAM,OAAW,MAAK,GAAG,IAAI,OAAO,GAAG;AAAA,EACvD;AAEA,QAAM,YAAY,OAAO,OAAO,cAAc,WAAW,OAAO,UAAU,KAAK,IAAI;AACnF,SAAO,EAAE,MAAM,MAAM,UAAU;AACjC;AAEA,SAAS,UAAU,MAA+B,KAAiC;AACjF,QAAM,QAAQ,KAAK,GAAG;AACtB,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,QAAQ,MAAM,KAAK;AACzB,SAAO,MAAM,SAAS,IAAI,QAAQ;AACpC;AAEA,SAAS,SAAS,MAA+B,UAAkB,KAAa,KAAqB;AACnG,QAAM,MAAM,KAAK;AACjB,MAAI,OAAO,QAAQ,YAAY,OAAO,SAAS,GAAG,GAAG;AACnD,WAAO,aAAa,KAAK,KAAK,GAAG;AAAA,EACnC;AACA,MAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,EAAE,SAAS,GAAG;AACpD,UAAM,SAAS,OAAO,GAAG;AACzB,QAAI,OAAO,SAAS,MAAM,EAAG,QAAO,aAAa,QAAQ,KAAK,GAAG;AAAA,EACnE;AACA,SAAO,aAAa,UAAU,KAAK,GAAG;AACxC;AAEA,SAAS,eAAe,OAAsB;AAC5C,QAAM,KAAK,KAAK,MAAM,MAAM,SAAS;AACrC,SAAO,OAAO,MAAM,EAAE,IAAI,IAAI;AAChC;AAEA,SAAS,eAAe,SAAkB,UAAuD;AAC/F,QAAM,OAAO,oBAAI,IAAmB;AACpC,aAAW,SAAS,QAAS,MAAK,IAAI,MAAM,IAAI,KAAK;AACrD,MAAI,QAAQ;AACZ,aAAW,SAAS,UAAU;AAC5B,QAAI,CAAC,MAAM,GAAI;AACf,QAAI,CAAC,KAAK,IAAI,MAAM,EAAE,EAAG,UAAS;AAClC,SAAK,IAAI,MAAM,IAAI,KAAK;AAAA,EAC1B;AACA,QAAM,SAAS,CAAC,GAAG,KAAK,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,eAAe,CAAC,IAAI,eAAe,CAAC,CAAC;AACtF,SAAO,EAAE,QAAQ,MAAM;AACzB;AAEA,SAAS,iBACP,SACA,OACA,UACkD;AAClD,QAAM,MAAM,QAAQ,UAAU,CAAC,SAAS,KAAK,MAAM,YAAY,MAAM,MAAM,YAAY,CAAC;AACxF,MAAI,MAAM,GAAG;AACX,UAAMC,UAAS,eAAe,CAAC,GAAG,QAAQ;AAC1C,WAAO;AAAA,MACL,MAAM,CAAC,GAAG,SAAS,EAAE,OAAO,QAAQA,QAAO,OAAO,CAAC;AAAA,MACnD,OAAOA,QAAO;AAAA,IAChB;AAAA,EACF;AACA,QAAM,SAAS,eAAe,QAAQ,GAAG,EAAE,QAAQ,QAAQ;AAC3D,QAAM,OAAO,CAAC,GAAG,OAAO;AACxB,OAAK,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,GAAG,QAAQ,OAAO,OAAO;AAClD,SAAO,EAAE,MAAM,OAAO,OAAO,MAAM;AACrC;AAEA,SAAS,oBACP,SACA,UAC+C;AAC/C,QAAM,SAASD,iBAAgB,SAAS,MAAM;AAC9C,QAAM,MAAM,QAAQ,UAAU,CAAC,SAASA,iBAAgB,KAAK,MAAM,MAAM,MAAM;AAC/E,MAAI,MAAM,GAAG;AACX,UAAMC,UAAS,eAAe,CAAC,GAAG,SAAS,MAAM;AACjD,WAAO;AAAA,MACL,MAAM,CAAC,GAAG,SAAS,EAAE,GAAG,UAAU,QAAQ,QAAQA,QAAO,OAAO,CAAC;AAAA,MACjE,OAAOA,QAAO;AAAA,IAChB;AAAA,EACF;AACA,QAAM,SAAS,eAAe,QAAQ,GAAG,EAAE,QAAQ,SAAS,MAAM;AAClE,QAAM,OAAO,CAAC,GAAG,OAAO;AACxB,OAAK,GAAG,IAAI;AAAA,IACV,GAAG,KAAK,GAAG;AAAA,IACX,QAAQ,SAAS,UAAU,KAAK,GAAG,EAAE;AAAA,IACrC,QAAQ,SAAS,UAAU,KAAK,GAAG,EAAE;AAAA,IACrC,QAAQ,OAAO;AAAA,EACjB;AACA,SAAO,EAAE,MAAM,OAAO,OAAO,MAAM;AACrC;AAEA,SAAS,gBAAgB,OAIvB;AACA,QAAM,SAAS;AAAA,IACb,GAAG,MAAM;AAAA,IACT,GAAG,MAAM;AAAA,IACT,GAAG,MAAM,mBAAmB,QAAQ,CAAC,SAAS,KAAK,MAAM;AAAA,IACzD,GAAG,MAAM,eAAe,QAAQ,CAAC,SAAS,KAAK,MAAM;AAAA,EACvD;AACA,QAAM,OAAO,oBAAI,IAAmB;AACpC,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,MAAM,MAAM,KAAK,IAAI,MAAM,EAAE,EAAG;AACrC,SAAK,IAAI,MAAM,IAAI,KAAK;AAAA,EAC1B;AACA,SAAO;AAAA,IACL,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC;AAAA,IACpB,QAAQ,CAAC,GAAG,KAAK,OAAO,CAAC;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,uBACP,OACS;AACT,QAAM,UAAU;AAAA,IACd,GAAG,MAAM;AAAA,IACT,GAAG,MAAM;AAAA,IACT,GAAG,MAAM,mBAAmB,QAAQ,CAAC,SAAS,KAAK,MAAM;AAAA,IACzD,GAAG,MAAM,eAAe,QAAQ,CAAC,SAAS,KAAK,MAAM;AAAA,EACvD;AACA,QAAM,OAAO,oBAAI,IAAmB;AACpC,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,GAAI;AACf,QAAI,CAAC,KAAK,IAAI,MAAM,EAAE,EAAG,MAAK,IAAI,MAAM,IAAI,KAAK;AAAA,EACnD;AACA,SAAO,CAAC,GAAG,KAAK,OAAO,CAAC,EAAE,MAAM,GAAG,EAAE;AACvC;AAEA,SAAS,oBAAoB,OAiBlB;AACT,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,8CAA8C;AACzD,QAAM,KAAK,yEAAyE;AACpF,QAAM,KAAK,qDAAqD;AAChE,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,eAAe,MAAM,cAAc,EAAE;AAChD,QAAM,KAAK,UAAU,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,MAAM,GAAG;AACtE,QAAM,KAAK,QAAQ,MAAM,SAAS,GAAG,EAAE;AACvC,QAAM,KAAK,SAAS,MAAM,SAAS,IAAI,EAAE;AACzC,QAAM,KAAK,UAAU,MAAM,SAAS,MAAM,KAAK,KAAK,KAAK,MAAM,EAAE;AACjE,QAAM,KAAK,eAAe,MAAM,SAAS,WAAW,KAAK,KAAK,KAAK,MAAM,EAAE;AAC3E,QAAM,KAAK,EAAE;AACb,MAAI,MAAM,gBAAgB,SAAS,GAAG;AACpC,UAAM,KAAK,2BAA2B;AACtC,eAAW,QAAQ,MAAM,gBAAiB,OAAM,KAAK,IAAI;AACzD,UAAM,KAAK,EAAE;AAAA,EACf;AACA,MAAI,MAAM,aAAa,SAAS,GAAG;AACjC,UAAM,KAAK,gBAAgB;AAC3B,eAAW,OAAO,MAAM,aAAa,MAAM,GAAG,CAAC,GAAG;AAChD,YAAM,KAAK,KAAK,GAAG,EAAE;AAAA,IACvB;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AACA,QAAM,KAAK,oCAAoC,MAAM,QAAQ,MAAM,EAAE;AACrE,QAAM;AAAA,IACJ,oCAAoC,MAAM,MAAM,SAAS,MAAM,cAAc,MAAM,MAAM,SAAS,MAAM,iBAAiB,MAAM,MAAM,mBAAmB,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,QAAQ,CAAC,CAAC,kBAAkB,MAAM,MAAM,eAAe,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,QAAQ,CAAC,CAAC;AAAA,EAC3S;AACA,QAAM,KAAK,EAAE;AACb,MAAI,MAAM,YAAY,SAAS,GAAG;AAChC,UAAM,KAAK,oBAAoB;AAC/B,eAAW,OAAO,MAAM,YAAY,MAAM,EAAE,GAAG;AAC7C,YAAM,KAAK,UAAU,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,OAAO,EAAE;AAAA,IAChE;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AACA,MAAI,MAAM,eAAe,SAAS,GAAG;AACnC,UAAM,KAAK,yBAAyB;AACpC,eAAW,QAAQ,MAAM,eAAe,MAAM,EAAE,GAAG;AACjD,YAAM,KAAK,KAAK,IAAI,EAAE;AAAA,IACxB;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AACA,MAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,UAAM,KAAK,yBAAyB,MAAM,WAAW,MAAM,IAAI;AAC/D,eAAW,SAAS,MAAM,WAAW,MAAM,GAAG,EAAE,GAAG;AACjD,YAAM;AAAA,QACJ,MAAM,MAAM,EAAE,MAAM,MAAM,YAAY,KAAK,MAAM,KAAK,MAAM,GAAG,GAAG,CAAC,KAAK,MAAM,aAAa,CAAC,WAAW,MAAM,cAAc,CAAC;AAAA,MAC9H;AAAA,IACF;AACA,UAAM,KAAK,EAAE;AAAA,EACf,OAAO;AACL,UAAM,KAAK,2CAA2C;AACtD,UAAM,KAAK,EAAE;AAAA,EACf;AACA,QAAM,KAAK,eAAe;AAC1B,QAAM,KAAK,uCAAuC;AAClD,QAAM,KAAK,uCAAuC;AAClD,QAAM,KAAK,mEAAmE;AAC9E,QAAM,KAAK,2DAA2D;AACtE,QAAM,KAAK,kEAAkE;AAC7E,QAAM,KAAK,6BAA6B;AACxC,QAAM,KAAK,gCAAgC;AAC3C,QAAM,KAAK,qCAAqC;AAChD,QAAM,KAAK,+CAA+C;AAC1D,QAAM,KAAK,sCAAsC;AACjD,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,0BAA0B;AACrC,QAAM,KAAK,+FAA+F;AAC1G,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,iBAAiB;AAC5B,QAAM,KAAK,qFAAqF;AAChG,QAAM,KAAK,+DAA+D;AAC1E,QAAM,KAAK,gEAAgE;AAC3E,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,sBAAsB;AACjC,QAAM,KAAK,mDAAmD;AAC9D,QAAM,KAAK,8DAA8D;AACzE,QAAM,KAAK,kDAAkD;AAC7D,QAAM,KAAK,mCAAmC;AAC9C,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,wBAAwB,MAAc,eAAwC;AACrF,MAAI,kBAAkB,GAAG;AACvB,WAAO;AAAA,MACL,MAAM,OAAO,MAAM,IAAI,qBAAqB;AAAA,MAC5C,MAAM,EAAE,OAAO,GAAG;AAAA,MAClB,WAAW;AAAA,IACb;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,EAAE,QAAQ,mDAAmD;AAAA,IACnE,WAAW;AAAA,EACb;AACF;AAEA,SAAS,sBAAsB,UAA+C;AAC5E,MAAI,SAAS,SAAS,SAAS;AAC7B,UAAM,UAAU,UAAU,SAAS,MAAM,SAAS;AAClD,UAAM,UAAU,UAAU,SAAS,MAAM,SAAS;AAClD,QAAI,CAAC,WAAW,CAAC,QAAS,QAAO;AACjC,WAAO,EAAE,QAAQ,SAAS,SAAS,SAAS,WAAW,SAAS,UAAU;AAAA,EAC5E;AACA,MAAI,SAAS,SAAS,QAAQ;AAC5B,UAAM,UAAU,UAAU,SAAS,MAAM,SAAS;AAClD,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,EAAE,QAAQ,QAAQ,SAAS,WAAW,SAAS,UAAU;AAAA,EAClE;AACA,MAAI,SAAS,SAAS,WAAW;AAC/B,UAAM,UAAU,UAAU,SAAS,MAAM,SAAS;AAClD,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,EAAE,QAAQ,WAAW,SAAS,WAAW,SAAS,UAAU;AAAA,EACrE;AACA,MAAI,SAAS,SAAS,UAAU;AAC9B,UAAM,SAAS,UAAU,SAAS,MAAM,QAAQ;AAChD,QAAI,CAAC,OAAQ,QAAO;AACpB,WAAO,EAAE,QAAQ,UAAU,QAAQ,cAAc,QAAQ,WAAW,SAAS,UAAU;AAAA,EACzF;AACA,MAAI,SAAS,SAAS,QAAQ;AAC5B,UAAM,UAAU,UAAU,SAAS,MAAM,SAAS;AAClD,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,EAAE,QAAQ,QAAQ,SAAS,WAAW,SAAS,UAAU;AAAA,EAClE;AACA,MAAI,SAAS,SAAS,QAAQ;AAC5B,WAAO,EAAE,QAAQ,QAAQ,QAAQ,UAAU,SAAS,MAAM,QAAQ,GAAG,WAAW,SAAS,UAAU;AAAA,EACrG;AACA,SAAO;AACT;AAEA,eAAsB,iBAAiB,YAAoB,iBAAyB,GAAiC;AACnH,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,WAAW,aAAa;AAC9B,QAAM,cAAc,sBAAsB;AAC1C,QAAM,kBAAkB,4BAA4B,WAAW;AAC/D,MAAI,gBAAgB,SAAS,GAAG;AAC9B,WAAO,KAAK,+BAA+B,gBAAgB,KAAK,KAAK,CAAC,EAAE;AAAA,EAC1E;AACA,SAAO,KAAK,qEAAqE;AAEjF,MAAI;AACF,UAAM,UAAU,MAAM,uBAAuB,MAAM;AACnD,QAAI,QAAQ,YAAY,GAAG;AACzB,aAAO;AAAA,QACL,+BAA+B,QAAQ,SAAS,cAAc,QAAQ,QAAQ,iBAAiB,QAAQ,YAAY,QAAQ,CAAC,CAAC;AAAA,MAC/H;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO,KAAK,sCAAuC,MAAgB,OAAO,EAAE;AAAA,EAC9E;AAEA,QAAM,aAAa,SAAS,OAAO,QAAQ,MAAM,EAAE,EAAE,YAAY;AACjE,QAAM,aAAa,0BAA0B;AAC7C,QAAM,cAAc,CAAC,UACnB,MAAM,aAAa,QAAQ,MAAM,EAAE,EAAE,YAAY,MAAM,cACtD,eAAe,QAAQ,MAAM,aAAa;AAE7C,QAAM,QAA2B;AAAA,IAC/B,UAAU,CAAC;AAAA,IACX,UAAU,CAAC;AAAA,IACX,oBAAoB,CAAC;AAAA,IACrB,gBAAgB,CAAC;AAAA,EACnB;AAEA,MAAI;AACF,UAAM,YAAY,MAAM,OAAO,YAAY,EAAE,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC;AAChG,UAAM,WAAW,eAAe,MAAM,UAAU,QAAQ,EAAE;AAAA,EAC5D,SAAS,OAAO;AACd,WAAO,KAAK,8BAA+B,MAAgB,OAAO,EAAE;AAAA,EACtE;AAEA,MAAI;AACF,UAAM,YAAY,MAAM,OAAO,YAAY,EAAE,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC;AAChG,UAAM,WAAW,eAAe,MAAM,UAAU,QAAQ,EAAE;AAAA,EAC5D,SAAS,OAAO;AACd,WAAO,KAAK,8BAA+B,MAAgB,OAAO,EAAE;AAAA,EACtE;AAEA,SAAO;AAAA,IACL,8BAA8B,MAAM,SAAS,MAAM,cAAc,MAAM,SAAS,MAAM,iBAAiB,MAAM,mBAAmB,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,QAAQ,CAAC,CAAC,kBAAkB,MAAM,eAAe,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,QAAQ,CAAC,CAAC;AAAA,EAC7Q;AAEA,QAAM,UAAyB,CAAC;AAChC,QAAM,UAA0B,CAAC;AACjC,QAAM,cAAiC,CAAC;AACxC,QAAM,iBAA2B;AAAA,IAC/B,YAAY,SAAS,IAAI,MAAM,SAAS,MAAM;AAAA,IAC9C,SAAS,SAAS,IAAI;AAAA,IACtB,WAAW,SAAS,SAAS,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,KAAK,KAAK,KAAK,MAAM;AAAA,EACpE;AAEA,QAAM,eAAe,kBAAkB;AACvC,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,MAAM;AACb,QAAM,gBAAgB,YAAY;AAClC,MAAI,aAAa;AACjB,MAAI,mBAAmB;AACvB,QAAM,eAAe,KAAK,IAAI,IAAI,aAAa,CAAC;AAGhD,wBAAsB,EAAE;AAExB,WAAS,OAAO,GAAG,OAAO,gBAAgB,QAAQ,SAAS,YAAY,QAAQ,GAAG;AAChF,UAAM,aAAa,uBAAuB,KAAK;AAC/C,UAAM,eAAe,sBAAsB,EAAE,EAC1C,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,UAAU;AACd,YAAM,QAAQ,MAAM,WAAW,IAAI,QAAQ,QAAQ,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG;AAC3E,YAAM,SAAS,MAAM,eAAe,KAAK,MAAM,YAAY,KAAK;AAChE,aAAO,GAAG,MAAM,IAAI,GAAG,MAAM,GAAG,OAAO,KAAK,IAAI,KAAK,EAAE;AAAA,IACzD,CAAC;AACH,UAAM,SAAS,oBAAoB;AAAA,MACjC,UAAU;AAAA,QACR,MAAM,SAAS;AAAA,QACf,QAAQ,SAAS;AAAA,QACjB,KAAK,SAAS;AAAA,QACd,MAAM,SAAS;AAAA,QACf,OAAO,SAAS,SAAS,CAAC;AAAA,QAC1B,YAAY,SAAS,cAAc,CAAC;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,WAAW,wBAAwB,MAAM,WAAW,MAAM;AAC9D,QAAI;AACF,YAAM,WAAW,MAAM,iBAAiB,kBAAkB,MAAM;AAChE,YAAM,SAAS,qBAAqB,SAAS,OAAO;AACpD,UAAI,QAAQ;AACV,mBAAW;AAAA,MACb,OAAO;AACL,uBAAe,KAAK,8DAA8D;AAAA,MACpF;AAAA,IACF,SAAS,OAAO;AACd,qBAAe,KAAK,wBAAyB,MAAgB,OAAO,EAAE;AAAA,IACxE;AAEA,WAAO,KAAK,kBAAkB,OAAO,CAAC,KAAK,SAAS,IAAI,EAAE;AAC1D,QAAI,eAAe;AAEnB,QAAI,SAAS,SAAS,oBAAoB;AACxC,YAAM,QAAQ,SAAS,SAAS,MAAM,IAAI,GAAG,EAAE;AAC/C,UAAI;AACF,cAAM,YAAY,MAAM,OAAO,YAAY,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC;AAC5F,cAAM,SAAS,eAAe,MAAM,UAAU,QAAQ;AACtD,cAAM,WAAW,OAAO;AACxB,uBAAe,OAAO,QAAQ;AAC9B,oBAAY,KAAK;AAAA,UACf,MAAM,OAAO;AAAA,UACb,MAAM,SAAS;AAAA,UACf,SAAS,WAAW,SAAS,MAAM,WAAW,OAAO,KAAK;AAAA,QAC5D,CAAC;AAAA,MACH,SAAS,OAAO;AACd,uBAAe,KAAK,4BAA6B,MAAgB,OAAO,EAAE;AAAA,MAC5E;AACA,UAAI,CAAC,aAAc,gBAAe,KAAK,uCAAuC;AAC9E;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,oBAAoB;AACxC,YAAM,QAAQ,SAAS,SAAS,MAAM,IAAI,GAAG,EAAE;AAC/C,UAAI;AACF,cAAM,YAAY,MAAM,OAAO,YAAY,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC;AAC5F,cAAM,SAAS,eAAe,MAAM,UAAU,QAAQ;AACtD,cAAM,WAAW,OAAO;AACxB,uBAAe,OAAO,QAAQ;AAC9B,oBAAY,KAAK;AAAA,UACf,MAAM,OAAO;AAAA,UACb,MAAM,SAAS;AAAA,UACf,SAAS,WAAW,SAAS,MAAM,WAAW,OAAO,KAAK;AAAA,QAC5D,CAAC;AAAA,MACH,SAAS,OAAO;AACd,uBAAe,KAAK,4BAA6B,MAAgB,OAAO,EAAE;AAAA,MAC5E;AACA,UAAI,CAAC,aAAc,gBAAe,KAAK,uCAAuC;AAC9E;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,iBAAiB;AACrC,YAAM,WAAW,UAAU,SAAS,MAAM,OAAO;AACjD,UAAI,CAAC,UAAU;AACb,uBAAe,KAAK,wCAAwC;AAC5D;AAAA,MACF;AACA,YAAM,QAAQ,yBAAyB,QAAQ;AAC/C,UAAI,UAAU,UAAU;AACtB,uBAAe,KAAK,2CAA2C,QAAQ,SAAS,KAAK,GAAG;AAAA,MAC1F;AACA,YAAM,QAAQ,SAAS,SAAS,MAAM,IAAI,GAAG,EAAE;AAC/C,UAAI;AACF,cAAM,YAAY,MAAM,OAAO,aAAa,OAAO,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC;AACpG,cAAM,SAAS,iBAAiB,MAAM,oBAAoB,OAAO,QAAQ;AACzE,cAAM,qBAAqB,OAAO;AAClC,uBAAe,OAAO,QAAQ;AAC9B,oBAAY,KAAK;AAAA,UACf,MAAM,OAAO;AAAA,UACb,MAAM,SAAS;AAAA,UACf,SAAS,IAAI,KAAK,aAAa,SAAS,MAAM,WAAW,OAAO,KAAK;AAAA,QACvE,CAAC;AACD,eAAO,KAAK,gBAAgB,KAAK,YAAY,SAAS,MAAM,SAAS;AAAA,MACvE,SAAS,OAAO;AACd,uBAAe,KAAK,6BAA6B,KAAK,MAAO,MAAgB,OAAO,EAAE;AAAA,MACxF;AACA,UAAI,CAAC,aAAc,gBAAe,KAAK,kBAAkB,KAAK,wBAAwB;AACtF;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,iBAAiB;AACrC,YAAM,cAAc,UAAU,SAAS,MAAM,QAAQ;AACrD,YAAM,SAAS,cAAc,uBAAuB,WAAW,IAAI;AACnE,UAAI,CAAC,QAAQ;AACX,uBAAe,KAAK,yCAAyC;AAC7D;AAAA,MACF;AACA,YAAM,QAAQ,SAAS,SAAS,MAAM,GAAG,GAAG,EAAE;AAC9C,UAAI;AACF,cAAM,UAAU,MAAM,OAAO,WAAW,MAAM;AAC9C,cAAM,UAAU,MAAM,OAAO,cAAc,QAAQ,IAAI,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC;AACxG,cAAM,SAAS,oBAAoB,MAAM,gBAAgB;AAAA,UACvD;AAAA,UACA,QAAQ,QAAQ;AAAA,UAChB,QAAQ;AAAA,UACR;AAAA,QACF,CAAC;AACD,cAAM,iBAAiB,OAAO;AAC9B,uBAAe,OAAO,QAAQ;AAC9B,oBAAY,KAAK;AAAA,UACf,MAAM,OAAO;AAAA,UACb,MAAM,SAAS;AAAA,UACf,SAAS,IAAI,MAAM,YAAY,OAAO,MAAM,WAAW,OAAO,KAAK;AAAA,QACrE,CAAC;AACD,eAAO,KAAK,iBAAiB,MAAM,KAAK,OAAO,MAAM,gBAAgB;AAAA,MACvE,SAAS,OAAO;AACd,uBAAe,KAAK,6BAA6B,MAAM,KAAM,MAAgB,OAAO,EAAE;AAAA,MACxF;AACA,UAAI,CAAC,aAAc,gBAAe,KAAK,kBAAkB,MAAM,uBAAuB;AACtF;AAAA,IACF;AAEA,UAAM,WAAW,gBAAgB,KAAK;AACtC,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,CAAC,iBAAiB;AACpB,qBAAe,KAAK,iBAAiB,SAAS,IAAI,+BAA+B;AACjF,oBAAc;AACd;AAAA,IACF;AAEA,QAAI,gBAAgB,WAAW,SAAS,KAAK,IAAI,gBAAgB,OAAO,GAAG;AACzE,YAAM,SAASD,iBAAgB,SAAS,KAAK,IAAI,gBAAgB,OAAO,GAAG,YAAY;AACvF,UAAI,UAAU,CAAC,gBAAgB,cAAc;AAC3C,wBAAgB,eAAe,IAAI,MAAM;AAAA,MAC3C;AAAA,IACF;AAEA,QAAI,gBAAgB,WAAW,QAAQ;AACrC,YAAM,SAAS,gBAAgB,UAAU,gBAAgB,aAAa;AACtE,qBAAe,KAAK,uBAAuB,MAAM,EAAE;AACnD,kBAAY,KAAK;AAAA,QACf,MAAM,OAAO;AAAA,QACb,MAAM,SAAS;AAAA,QACf,SAAS;AAAA,MACX,CAAC;AACD,oBAAc;AACd,UAAI,cAAc,EAAG;AACrB;AAAA,IACF;AAEA,wBAAoB;AACpB,QAAI,SAAS,qBAAqB;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB,iBAAiB;AAAA,MACjB,kBAAkB,SAAS;AAAA,MAC3B,gBAAgB,SAAS;AAAA,MACzB;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,CAAC,OAAO,WAAW,0BAA0B,iBAAiB,OAAO,UAAU,EAAE,GAAG;AACtF,YAAM,cAAc,sBAAsB,EAAE,EACzC,OAAO,CAAC,UAAU,MAAM,SAAS,UAAU,MAAM,SAAS,OAAO,EACjE,IAAI,CAAC,UAAU,MAAM,WAAW,EAAE,EAClC,OAAO,OAAO;AACjB,YAAM,YAAY,MAAM,0BAA0B;AAAA,QAChD,QAAQ;AAAA,QACR,QAAQ,OAAO,UAAU;AAAA,QACzB,iBAAiB,gBAAgB,UAAU,SAAS,KAAK,IAAI,gBAAgB,OAAO,GAAG,OAAO;AAAA,QAC9F;AAAA,MACF,CAAC;AAED,UAAI,aAAa,cAAc,gBAAgB,SAAS;AACtD,0BAAkB;AAAA,UAChB,GAAG;AAAA,UACH,SAAS;AAAA,UACT,WAAW,GAAG,gBAAgB,aAAa,WAAW;AAAA,QACxD;AACA,iBAAS,qBAAqB;AAAA,UAC5B,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,UAAU,MAAM;AAAA,UAChB,UAAU,MAAM;AAAA,UAChB,iBAAiB;AAAA,UACjB,kBAAkB,SAAS;AAAA,UAC3B,gBAAgB,SAAS;AAAA,UACzB;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,SAAS,OAAO,UAAU;AAEhC,qBAAe,KAAK,mCAAmC,MAAM,EAAE;AAC/D,aAAO,KAAK,uBAAuB,gBAAgB,MAAM,KAAK,MAAM,EAAE;AAAA,IACxE;AAEA,UAAM,SAAS,MAAM,cAAc,eAAe;AAClD,YAAQ,KAAK,eAAe;AAC5B,YAAQ,KAAK,MAAM;AACnB,iBAAa;AACb,mBAAe;AACf,gBAAY,KAAK;AAAA,MACf,MAAM,OAAO;AAAA,MACb,MAAM,SAAS;AAAA,MACf,SAAS,GAAG,gBAAgB,MAAM,GAAG,OAAO,UAAU,aAAa,SAAS;AAAA,IAC9E,CAAC;AAED,QAAI,cAAc,SAAS,GAAG;AAC5B,YAAM,gBAAgBA;AAAA,QACpB,gBAAgB,gBAChB,gBAAgB,WACf,gBAAgB,UAAU,SAAS,KAAK,IAAI,gBAAgB,OAAO,GAAG,eAAe;AAAA,MACxF;AACA,YAAM,kBAAkB,gBAAgB,WAAW,IAAI,YAAY;AACnE,iBAAW,UAAU,eAAe;AAClC,cAAM,cACJ,cAAc,SAAS,KACvB,OAAO,cAAc,KAAK,CAAC,WAAWA,iBAAgB,MAAM,MAAM,aAAa;AACjF,cAAM,aACJ,eAAe,SAAS,KACxB,OAAO,YAAY,KAAK,CAAC,UAAU,eAAe,SAAS,MAAM,YAAY,CAAC,CAAC;AACjF,YAAI,CAAC,eAAe,CAAC,WAAY;AACjC,8BAAsB,OAAO,IAAI;AAAA,UAC/B,SAAS,OAAO;AAAA,UAChB,MAAM,GAAG,gBAAgB,MAAM,GAAG,gBAAgB,KAAK,aAAa,KAAK,EAAE;AAAA,QAC7E,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,MAAM,OAAO,SAAS;AAC5B,UAAI,gBAAgB,WAAW,WAAW,qBAAqB,KAAK,GAAG,GAAG;AACxE,cAAM,SAAS;AACf,uBAAe,KAAK,MAAM;AAC1B,eAAO,KAAK,sBAAsB,MAAM,EAAE;AAAA,MAC5C;AACA,UAAI,gBAAgB,WAAW,UAAU,qBAAqB,KAAK,GAAG,GAAG;AACvE,cAAM,SAAS;AACf,uBAAe,KAAK,MAAM;AAC1B,eAAO,KAAK,sBAAsB,MAAM,EAAE;AAAA,MAC5C;AAAA,IACF;AAEA,QAAI,CAAC,cAAc;AACjB,oBAAc;AAAA,IAChB;AACA,QAAI,cAAc,GAAG;AACnB,aAAO,KAAK,qDAAqD;AACjE;AAAA,IACF;AAAA,EACF;AAEA,4BAA0B,SAAS,OAAO;AAE1C,SAAO;AAAA,IACL,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":["normalizeHandle","merged"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/web-chat/server.ts","../src/web-chat/index.ts"],"sourcesContent":["/**\n * Local web chat server\n * Serves a simple chat interface for interacting with your Spore\n */\n\nimport http from \"node:http\";\nimport { URL } from \"node:url\";\nimport { readFileSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\ninterface ChatMessage {\n role: \"user\" | \"assistant\";\n content: string;\n timestamp: number;\n}\n\ninterface AgentActivity {\n type: \"heartbeat\" | \"action\" | \"status\";\n message: string;\n timestamp: number;\n}\n\n/** Messages pushed from the heartbeat into the chat UI */\nexport interface AgentChatEvent {\n type: \"narration\" | \"tweet\" | \"action\" | \"sleep\" | \"wake\" | \"error\";\n content: string;\n timestamp: number;\n meta?: Record<string, unknown>;\n}\n\ninterface AgentIdentity {\n name: string;\n handle: string;\n bio?: string;\n profileImage?: string;\n}\n\ninterface HeartbeatConfigHandlers {\n getIntervalMs: () => number | Promise<number>;\n setIntervalMs: (intervalMs: number) => void | Promise<void>;\n}\n\nconst ALLOWED_HEARTBEAT_INTERVALS = [60_000, 300_000, 1_800_000, 3_600_000, 21_600_000] as const;\n\nexport class WebChatServer {\n private server: http.Server | null = null;\n private port: number;\n private messages: ChatMessage[] = [];\n private activities: AgentActivity[] = [];\n private agentEvents: AgentChatEvent[] = [];\n private onUserMessage?: (message: string) => Promise<string>;\n private identity?: AgentIdentity;\n private heartbeatConfigHandlers?: HeartbeatConfigHandlers;\n\n constructor(port = 3737) {\n this.port = port;\n }\n\n setIdentity(identity: AgentIdentity) {\n this.identity = identity;\n }\n\n setMessageHandler(handler: (message: string) => Promise<string>) {\n this.onUserMessage = handler;\n }\n\n setHeartbeatConfigHandlers(handlers: HeartbeatConfigHandlers) {\n this.heartbeatConfigHandlers = handlers;\n }\n\n /** Push an activity update (from heartbeat) to the UI — kept for backwards compat */\n pushActivity(type: AgentActivity[\"type\"], message: string) {\n this.activities.push({ type, message, timestamp: Date.now() });\n if (this.activities.length > 100) {\n this.activities = this.activities.slice(-100);\n }\n }\n\n /** Push an event into the chat stream (narration, tweet card, sleep state, etc.) */\n pushAgentEvent(type: AgentChatEvent[\"type\"], content: string, meta?: Record<string, unknown>) {\n this.agentEvents.push({ type, content, timestamp: Date.now(), meta });\n if (this.agentEvents.length > 200) {\n this.agentEvents = this.agentEvents.slice(-200);\n }\n }\n\n async start(): Promise<string> {\n return new Promise((resolve, reject) => {\n this.server = http.createServer(async (req, res) => {\n const url = new URL(req.url || \"/\", `http://${req.headers.host}`);\n\n // CORS headers\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type\");\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(200);\n res.end();\n return;\n }\n\n // Serve HTML\n if (url.pathname === \"/\" || url.pathname === \"/index.html\") {\n try {\n const possiblePaths = [\n join(__dirname, \"web-chat\", \"chat.html\"),\n join(__dirname, \"chat.html\"),\n join(__dirname, \"..\", \"web-chat\", \"chat.html\"),\n join(__dirname, \"..\", \"src\", \"web-chat\", \"chat.html\"),\n ];\n\n let html: string | null = null;\n for (const p of possiblePaths) {\n try {\n html = readFileSync(p, \"utf-8\");\n break;\n } catch {\n continue;\n }\n }\n\n if (html) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(html);\n } else {\n console.error(\"Could not find chat.html in any of:\", possiblePaths);\n res.writeHead(500);\n res.end(\"Error: Could not find chat.html\");\n }\n } catch (error) {\n res.writeHead(500);\n res.end(\"Error loading chat interface\");\n }\n return;\n }\n\n // API: Get agent identity\n if (url.pathname === \"/api/identity\" && req.method === \"GET\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ identity: this.identity || null }));\n return;\n }\n\n // API: Get messages\n if (url.pathname === \"/api/messages\" && req.method === \"GET\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ messages: this.messages }));\n return;\n }\n\n // API: Get agent activity feed (legacy, kept for compat)\n if (url.pathname === \"/api/activity\" && req.method === \"GET\") {\n const since = parseInt(url.searchParams.get(\"since\") || \"0\", 10);\n const newActivities = this.activities.filter((a) => a.timestamp > since);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ activities: newActivities }));\n return;\n }\n\n // API: Get agent events (narration, tweets, sleep) — polled by chat UI\n if (url.pathname === \"/api/agent-events\" && req.method === \"GET\") {\n const since = parseInt(url.searchParams.get(\"since\") || \"0\", 10);\n const newEvents = this.agentEvents.filter((e) => e.timestamp > since);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ events: newEvents }));\n return;\n }\n\n // API: Read heartbeat interval config\n if (url.pathname === \"/api/heartbeat-config\" && req.method === \"GET\") {\n if (!this.heartbeatConfigHandlers) {\n res.writeHead(503, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Heartbeat config unavailable\" }));\n return;\n }\n\n try {\n const intervalMs = await this.heartbeatConfigHandlers.getIntervalMs();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ intervalMs, allowedIntervals: ALLOWED_HEARTBEAT_INTERVALS }));\n } catch {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Failed to load heartbeat config\" }));\n }\n return;\n }\n\n // API: Update heartbeat interval config\n if (url.pathname === \"/api/heartbeat-config\" && req.method === \"POST\") {\n if (!this.heartbeatConfigHandlers) {\n res.writeHead(503, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Heartbeat config unavailable\" }));\n return;\n }\n const handlers = this.heartbeatConfigHandlers;\n\n let body = \"\";\n req.on(\"data\", (chunk) => {\n body += chunk.toString();\n });\n\n req.on(\"end\", async () => {\n try {\n const parsed = JSON.parse(body) as { intervalMs?: number };\n const intervalMs = parsed.intervalMs;\n\n if (\n typeof intervalMs !== \"number\" ||\n !Number.isInteger(intervalMs) ||\n !ALLOWED_HEARTBEAT_INTERVALS.includes(intervalMs as (typeof ALLOWED_HEARTBEAT_INTERVALS)[number])\n ) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Unsupported heartbeat interval\" }));\n return;\n }\n\n await handlers.setIntervalMs(intervalMs);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ success: true, intervalMs }));\n } catch {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Invalid request\" }));\n }\n });\n return;\n }\n\n // API: Send message\n if (url.pathname === \"/api/message\" && req.method === \"POST\") {\n let body = \"\";\n req.on(\"data\", (chunk) => {\n body += chunk.toString();\n });\n\n req.on(\"end\", async () => {\n try {\n const { message } = JSON.parse(body);\n\n // Add user message\n this.messages.push({\n role: \"user\",\n content: message,\n timestamp: Date.now(),\n });\n\n // Get response\n if (this.onUserMessage) {\n const response = await this.onUserMessage(message);\n this.messages.push({\n role: \"assistant\",\n content: response,\n timestamp: Date.now(),\n });\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ success: true, response }));\n } else {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"No message handler configured\" }));\n }\n } catch (error) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Invalid request\" }));\n }\n });\n return;\n }\n\n // 404\n res.writeHead(404);\n res.end(\"Not found\");\n });\n\n this.server.listen(this.port, () => {\n const url = `http://localhost:${this.port}`;\n resolve(url);\n });\n\n this.server.on(\"error\", (error: NodeJS.ErrnoException) => {\n if (error.code === \"EADDRINUSE\") {\n this.port++;\n this.server?.close();\n this.start().then(resolve).catch(reject);\n } else {\n reject(error);\n }\n });\n });\n }\n\n stop() {\n if (this.server) {\n this.server.close();\n this.server = null;\n }\n }\n}\n","/**\n * Web chat integration with autonomous heartbeat\n */\n\nimport { WebChatServer } from \"./server.js\";\nimport { loadIdentity } from \"../identity/index.js\";\nimport { execSync } from \"node:child_process\";\nimport chalk from \"chalk\";\n\nconst HEARTBEAT_INTERVAL_OPTIONS = [60_000, 300_000, 1_800_000, 3_600_000, 21_600_000] as const;\n\nfunction formatHeartbeatInterval(intervalMs: number): string {\n const minutes = intervalMs / 60_000;\n if (minutes < 60) return `${minutes} minute${minutes === 1 ? \"\" : \"s\"}`;\n const hours = minutes / 60;\n return `${hours} hour${hours === 1 ? \"\" : \"s\"}`;\n}\n\n/**\n * Extract <<LEARN: ...>> tags from response, save them, and return cleaned text\n */\nasync function extractAndSaveLearnings(responseText: string): Promise<string> {\n const learnPattern = /<<LEARN:\\s*(.+?)>>/g;\n const matches = [...responseText.matchAll(learnPattern)];\n\n if (matches.length > 0) {\n const { addLearning } = await import(\"../memory/index.js\");\n for (const match of matches) {\n const learning = match[1].trim();\n addLearning(learning, \"web-chat\", [\"chat\", \"creator-interaction\"]);\n console.log(chalk.dim(` [Memory] Saved learning: ${learning}`));\n }\n }\n\n // Strip the learn tags from the response the user sees\n return responseText.replace(/<<LEARN:\\s*.+?>>/g, \"\").trim();\n}\n\n/**\n * Extract <<TRAINING:{json}>> tags from response, apply updates to identity/strategy/goals, and return cleaned text\n */\nasync function extractAndApplyTraining(responseText: string): Promise<string> {\n const trainingPattern = /<<TRAINING:([\\s\\S]*?)>>/g;\n const matches = [...responseText.matchAll(trainingPattern)];\n\n for (const match of matches) {\n try {\n const update = JSON.parse(match[1].trim());\n\n // Apply identity changes\n if (update.identity) {\n const { loadIdentity, mutateIdentity, saveIdentity } = await import(\"../identity/index.js\");\n let identity = loadIdentity();\n\n const identityFields: Record<string, string> = {\n tone: \"tone\",\n worldview: \"worldview\",\n conflictStyle: \"conflictStyle\",\n vocabularyStyle: \"vocabularyStyle\",\n tweetStyle: \"tweetStyle\",\n };\n\n // Simple string/enum fields\n for (const [key, field] of Object.entries(identityFields)) {\n if (update.identity[key] !== undefined) {\n identity = mutateIdentity(identity, field, update.identity[key], \"training-chat\");\n console.log(chalk.dim(` [Training] Updated ${field}`));\n }\n }\n\n // Array fields (replace entire array)\n const arrayFields = [\"coreValues\", \"topics\", \"avoidTopics\", \"goals\", \"boundaries\", \"catchphrases\", \"heroes\"];\n for (const field of arrayFields) {\n if (update.identity[field] !== undefined && Array.isArray(update.identity[field])) {\n identity = mutateIdentity(identity, field, update.identity[field], \"training-chat\");\n console.log(chalk.dim(` [Training] Updated ${field}`));\n }\n }\n\n // Traits (merge, don't replace)\n if (update.identity.traits && typeof update.identity.traits === \"object\") {\n for (const [trait, value] of Object.entries(update.identity.traits)) {\n if (typeof value === \"number\" && value >= 0 && value <= 1) {\n identity = mutateIdentity(identity, `traits.${trait}`, value, \"training-chat\");\n console.log(chalk.dim(` [Training] Updated traits.${trait} = ${value}`));\n }\n }\n }\n\n // Engagement strategy (merge)\n if (update.identity.engagementStrategy && typeof update.identity.engagementStrategy === \"object\") {\n for (const [key, value] of Object.entries(update.identity.engagementStrategy)) {\n identity = mutateIdentity(identity, `engagementStrategy.${key}`, value, \"training-chat\");\n console.log(chalk.dim(` [Training] Updated engagementStrategy.${key}`));\n }\n }\n\n saveIdentity(identity);\n }\n\n // Apply strategy changes\n if (update.strategy) {\n const { loadStrategy, saveStrategy } = await import(\"../memory/strategy.js\");\n const strategy = loadStrategy();\n\n if (update.strategy.currentFocus) strategy.currentFocus = update.strategy.currentFocus;\n if (update.strategy.shortTermGoals) strategy.shortTermGoals = update.strategy.shortTermGoals;\n if (update.strategy.experiments) {\n strategy.experiments.push(...update.strategy.experiments);\n }\n if (update.strategy.peopleToEngage) {\n strategy.peopleToEngage.push(...update.strategy.peopleToEngage);\n }\n\n strategy.lastUpdated = new Date().toISOString();\n saveStrategy(strategy);\n console.log(chalk.dim(` [Training] Updated strategy`));\n }\n\n // Apply standalone learning\n if (update.learning) {\n const { addLearning } = await import(\"../memory/index.js\");\n addLearning(\n update.learning.content,\n \"training-chat\",\n update.learning.tags || [\"training\"],\n );\n console.log(chalk.dim(` [Training] Saved learning: ${update.learning.content}`));\n }\n\n // Apply reflection to evolution journal\n if (update.reflection) {\n const { loadIdentity, saveIdentity } = await import(\"../identity/index.js\");\n const identity = loadIdentity();\n identity.evolutionJournal.push({\n date: new Date().toISOString(),\n reflection: update.reflection,\n });\n saveIdentity(identity);\n console.log(chalk.dim(` [Training] Added reflection to evolution journal`));\n }\n\n // Apply goal updates\n if (update.goalUpdates && Array.isArray(update.goalUpdates)) {\n const { loadGoals, saveGoals } = await import(\"../memory/goals.js\");\n const tracker = loadGoals();\n\n for (const gu of update.goalUpdates) {\n const existing = tracker.goals.find((g: { goal: string }) => g.goal === gu.goal);\n if (existing) {\n existing.progress = gu.progress;\n existing.lastUpdated = new Date().toISOString();\n } else {\n tracker.goals.push({\n goal: gu.goal,\n progress: gu.progress,\n lastUpdated: new Date().toISOString(),\n });\n }\n }\n\n tracker.lastReviewed = new Date().toISOString();\n saveGoals(tracker);\n console.log(chalk.dim(` [Training] Updated ${update.goalUpdates.length} goal(s)`));\n }\n\n } catch (err) {\n console.error(chalk.dim(` [Training] Failed to parse training update: ${(err as Error).message}`));\n }\n }\n\n // Strip the training tags from the response the user sees\n return responseText.replace(/<<TRAINING:[\\s\\S]*?>>/g, \"\").trim();\n}\n\n/**\n * Log a chat exchange as an interaction in memory\n */\nasync function logChatInteraction(userMessage: string, agentResponse: string): Promise<void> {\n const { logInteraction } = await import(\"../memory/index.js\");\n logInteraction({\n id: `chat-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n timestamp: new Date().toISOString(),\n type: \"reply\",\n content: agentResponse.slice(0, 200),\n targetHandle: \"creator\",\n creditsUsed: 0,\n success: true,\n });\n}\n\n/**\n * Run the autonomous heartbeat in the background, narrating to the chat UI\n */\nasync function runNarratedHeartbeat(server: WebChatServer): Promise<void> {\n const { loadConfig } = await import(\"../utils/config.js\");\n const { flushQueue } = await import(\"../scheduler/queue.js\");\n const { runAutonomyCycle } = await import(\"../runtime/autonomy.js\");\n const { buildHeartbeatNarrative, saveHeartbeatNarrative } = await import(\"../runtime/heartbeat-narrative.js\");\n const { buildReflectionPrompt } = await import(\"../runtime/prompt-builder.js\");\n const { generateResponse } = await import(\"../runtime/llm.js\");\n const { addLearning } = await import(\"../memory/index.js\");\n const { loadStrategy, saveStrategy, applyStrategyUpdate } = await import(\"../memory/strategy.js\");\n\n let heartbeatCount = 0;\n let lastIntervalMs = loadConfig().runtime?.heartbeatIntervalMs ?? 300_000;\n\n console.log(chalk.cyan(` [Agent] Autonomous heartbeat started (every ${Math.round(lastIntervalMs / 60_000)} min)`));\n\n while (true) {\n const runtimeConfig = loadConfig();\n const intervalMs = runtimeConfig.runtime?.heartbeatIntervalMs ?? 300_000;\n const maxActions = runtimeConfig.runtime?.actionsPerHeartbeat ?? 4;\n\n if (intervalMs !== lastIntervalMs) {\n server.pushAgentEvent(\"narration\", `Heartbeat interval updated to ${formatHeartbeatInterval(intervalMs)}.`);\n console.log(chalk.cyan(` [Agent] Heartbeat interval updated to ${Math.round(intervalMs / 60_000)} min`));\n lastIntervalMs = intervalMs;\n }\n\n // Sleep first, then heartbeat\n const jitter = Math.floor(Math.random() * intervalMs * 0.3);\n const sleepMs = heartbeatCount === 0 ? 10_000 : intervalMs + jitter;\n const wakeUpAt = Date.now() + sleepMs;\n\n // Show sleep state in chat (skip for first quick boot)\n if (heartbeatCount > 0) {\n server.pushAgentEvent(\"sleep\", \"sleeping\", { wakeUpAt });\n }\n\n // Sleep in short chunks so heartbeat interval changes apply immediately.\n let sleptMs = 0;\n let intervalChangedDuringSleep = false;\n while (sleptMs < sleepMs) {\n const chunkMs = Math.min(1000, sleepMs - sleptMs);\n await new Promise((r) => setTimeout(r, chunkMs));\n sleptMs += chunkMs;\n\n const liveIntervalMs = loadConfig().runtime?.heartbeatIntervalMs ?? 300_000;\n if (liveIntervalMs !== intervalMs) {\n intervalChangedDuringSleep = true;\n break;\n }\n }\n\n if (intervalChangedDuringSleep) {\n continue;\n }\n\n heartbeatCount++;\n console.log(chalk.cyan(` [Agent] Heartbeat #${heartbeatCount}`));\n server.pushAgentEvent(\"wake\", `Waking up... heartbeat #${heartbeatCount}`);\n\n try {\n // 1. Flush queue\n try {\n const flushed = await flushQueue();\n if (flushed.posted > 0) {\n server.pushAgentEvent(\"action\", `Flushed ${flushed.posted} queued post(s)`);\n }\n } catch {\n // Queue flush is best-effort\n }\n\n // 2. Run tool-driven autonomy cycle\n server.pushAgentEvent(\"narration\", \"Observing timeline and planning actions...\");\n const cycle = await runAutonomyCycle(maxActions, heartbeatCount);\n const narrative = buildHeartbeatNarrative({\n heartbeatCount,\n timelineCount: cycle.timeline.length,\n mentionsCount: cycle.mentions.length,\n actions: cycle.actions,\n results: cycle.results,\n });\n saveHeartbeatNarrative(\n narrative.summary,\n cycle.results.length === 0 ? true : cycle.results.every((r) => r.success),\n );\n server.pushAgentEvent(\"narration\", narrative.summary);\n\n if (cycle.timeline.length > 0 || cycle.mentions.length > 0) {\n server.pushAgentEvent(\"narration\", `Found ${cycle.timeline.length} timeline posts and ${cycle.mentions.length} mentions`);\n }\n\n if (cycle.actions.length === 0) {\n server.pushAgentEvent(\"narration\", \"No actions this heartbeat. Going back to sleep.\");\n console.log(chalk.dim(` [Agent] No actions this heartbeat`));\n continue;\n }\n\n // 3. Report results — push tweet cards for posts, narration for everything else\n for (let i = 0; i < cycle.results.length; i++) {\n const result = cycle.results[i];\n const action = cycle.actions[i];\n if (!action) continue;\n\n if (result.success) {\n if (action.action === \"post\" && action.content) {\n server.pushAgentEvent(\"tweet\", action.content, { kind: \"Post\", status: \"Posted to X\", tweetId: result.detail });\n } else if (action.action === \"reply\" && action.content) {\n server.pushAgentEvent(\"tweet\", action.content, {\n kind: \"Reply\",\n status: \"Reply sent\",\n tweetId: result.detail,\n replyTo: action.tweetId,\n });\n } else if (action.action === \"like\") {\n server.pushAgentEvent(\"action\", `Liked a tweet`);\n } else if (action.action === \"retweet\") {\n server.pushAgentEvent(\"action\", `Retweeted`);\n } else if (action.action === \"follow\") {\n server.pushAgentEvent(\"action\", `Followed @${action.handle}`);\n } else if (action.action === \"schedule\" && action.content) {\n server.pushAgentEvent(\"tweet\", action.content, { kind: \"Scheduled\", status: \"Queued\" });\n } else {\n server.pushAgentEvent(\"action\", `${action.action}${result.detail ? `: ${result.detail}` : \"\"}`);\n }\n console.log(chalk.green(` [Agent] ✓ ${result.action}`));\n } else {\n if ((action.action === \"post\" || action.action === \"reply\") && action.content) {\n server.pushAgentEvent(\"tweet\", action.content, {\n kind: action.action === \"reply\" ? \"Reply\" : \"Post\",\n status: `Failed: ${result.error}`,\n replyTo: action.action === \"reply\" ? action.tweetId : undefined,\n });\n } else {\n server.pushAgentEvent(\"error\", `${result.action} failed: ${result.error}`);\n }\n console.log(chalk.red(` [Agent] ✗ ${result.action}: ${result.error}`));\n }\n }\n\n for (const feedback of cycle.policyFeedback) {\n server.pushAgentEvent(\"narration\", `Policy adjusted plan: ${feedback}`);\n }\n\n // Reflection phase — every 3rd heartbeat, review performance\n if (heartbeatCount % 3 === 0) {\n try {\n server.pushAgentEvent(\"narration\", \"Reflecting on recent performance...\");\n const reflectionPrompt = buildReflectionPrompt(cycle.results);\n const reflectionResponse = await generateResponse(\n `You are ${loadIdentity().name}. Reflect honestly on your performance.`,\n reflectionPrompt,\n );\n\n // Parse reflection JSON\n const jsonMatch = reflectionResponse.content.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n try {\n const reflection = JSON.parse(jsonMatch[0]);\n if (reflection.learning && reflection.learning !== \"null\") {\n addLearning(reflection.learning, \"reflection\", [\"heartbeat\", \"performance\"]);\n server.pushAgentEvent(\"narration\", `Learned: ${reflection.learning}`);\n console.log(chalk.dim(` [Agent] Reflection learning: ${reflection.learning}`));\n }\n if (reflection.strategyUpdate && reflection.strategyUpdate !== \"null\") {\n const strategy = loadStrategy();\n saveStrategy(applyStrategyUpdate(strategy, reflection.strategyUpdate));\n server.pushAgentEvent(\"narration\", `Strategy: ${reflection.strategyUpdate}`);\n console.log(chalk.dim(` [Agent] Strategy update: ${reflection.strategyUpdate}`));\n }\n } catch {\n // Couldn't parse reflection JSON, that's fine\n }\n }\n } catch (err) {\n console.log(chalk.dim(` [Agent] Reflection failed: ${(err as Error).message}`));\n }\n }\n\n } catch (error) {\n const msg = (error as Error).message;\n console.error(chalk.red(` [Agent] Heartbeat #${heartbeatCount} error: ${msg}`));\n server.pushAgentEvent(\"error\", `Something went wrong: ${msg}`);\n }\n }\n}\n\nexport async function startWebChat() {\n const identity = loadIdentity();\n const { loadConfig: loadRuntimeConfig, saveConfig } = await import(\"../utils/config.js\");\n\n const server = new WebChatServer();\n\n // Pass identity to server so the chat UI can display it\n server.setIdentity({\n name: identity.name,\n handle: identity.handle,\n bio: identity.bio,\n profileImage: identity.profileImage,\n });\n\n server.setHeartbeatConfigHandlers({\n getIntervalMs: () => {\n const config = loadRuntimeConfig();\n return config.runtime?.heartbeatIntervalMs ?? 300_000;\n },\n setIntervalMs: (intervalMs) => {\n if (!HEARTBEAT_INTERVAL_OPTIONS.includes(intervalMs as (typeof HEARTBEAT_INTERVAL_OPTIONS)[number])) {\n throw new Error(\"Unsupported heartbeat interval.\");\n }\n\n const config = loadRuntimeConfig();\n config.runtime = {\n heartbeatIntervalMs: intervalMs,\n actionsPerHeartbeat: config.runtime?.actionsPerHeartbeat ?? 4,\n enabled: true,\n };\n saveConfig(config);\n server.pushAgentEvent(\"narration\", `Heartbeat interval set to ${formatHeartbeatInterval(intervalMs)}.`);\n },\n });\n\n // Set up message handler - connected to actual LLM with memory\n const chatHistory: Array<{ role: \"user\" | \"assistant\"; content: string }> = [];\n let systemPrompt: string | null = null;\n let messageCount = 0;\n\n server.setMessageHandler(async (message: string) => {\n try {\n // Build training prompt on first message, rebuild every 10 messages to refresh memory\n if (!systemPrompt || messageCount % 10 === 0) {\n const { buildTrainingChatPrompt } = await import(\"../runtime/prompt-builder.js\");\n systemPrompt = buildTrainingChatPrompt();\n }\n messageCount++;\n\n // Check for LLM key\n const { hasLLMKey, chat: chatLLM } = await import(\"../runtime/llm.js\");\n if (!hasLLMKey()) {\n return \"I can't respond right now - no API key configured. Run `spora llm set --provider <provider>` to set one up.\";\n }\n\n // Add user message to history\n chatHistory.push({ role: \"user\", content: message });\n\n // Call LLM with full conversation history\n const response = await chatLLM(systemPrompt, chatHistory);\n\n // Extract training updates and learnings from response\n const afterTraining = await extractAndApplyTraining(response.content);\n const cleanResponse = await extractAndSaveLearnings(afterTraining);\n\n // Add cleaned assistant response to history\n chatHistory.push({ role: \"assistant\", content: cleanResponse });\n\n // Log interaction to memory (async, don't block response)\n logChatInteraction(message, cleanResponse).catch((err) =>\n console.error(chalk.dim(\" [Memory] Failed to log interaction:\"), err)\n );\n\n return cleanResponse;\n } catch (error) {\n console.error(\"Chat error:\", error);\n return `Sorry, I ran into an issue: ${(error as Error).message}`;\n }\n });\n\n const url = await server.start();\n\n console.log(chalk.green(`\\n✓ Chat interface started at ${chalk.bold(url)}\\n`));\n console.log(chalk.dim(`Press Ctrl+C to stop the server\\n`));\n\n // Open browser\n openBrowser(url);\n\n // Start autonomous heartbeat in background\n try {\n const { hasLLMKey } = await import(\"../runtime/llm.js\");\n if (hasLLMKey()) {\n runNarratedHeartbeat(server).catch((err) => {\n console.error(chalk.red(`Heartbeat failed to start: ${err}`));\n });\n } else {\n console.log(chalk.yellow(\" [Agent] No LLM key — autonomous heartbeat disabled. Run `spora llm set --provider <provider>` to enable.\"));\n server.pushActivity(\"status\", \"No LLM API key configured. Autonomous mode disabled.\");\n }\n } catch (err) {\n console.error(chalk.red(`Heartbeat failed to start: ${err}`));\n }\n\n // Keep process alive\n process.on(\"SIGINT\", () => {\n console.log(chalk.yellow(\"\\n\\nStopping chat server...\"));\n server.stop();\n process.exit(0);\n });\n\n // Return the server instance for external control\n return server;\n}\n\n/**\n * Open URL in a separate browser window (app-like)\n */\nfunction openBrowser(url: string) {\n const platform = process.platform;\n\n try {\n if (platform === \"darwin\") {\n // Open as a standalone Chrome app window (smaller, separate from existing tabs)\n try {\n execSync(`open -na \"Google Chrome\" --args --app=\"${url}\" --window-size=500,700`, { stdio: \"ignore\" });\n } catch {\n // Fallback: try Chromium-based browsers, then default\n try {\n execSync(`open -na \"Brave Browser\" --args --app=\"${url}\" --window-size=500,700`, { stdio: \"ignore\" });\n } catch {\n execSync(`open \"${url}\"`, { stdio: \"ignore\" });\n }\n }\n } else if (platform === \"win32\") {\n try {\n execSync(`start chrome --app=\"${url}\" --window-size=500,700`, { stdio: \"ignore\" });\n } catch {\n execSync(`start \"\" \"${url}\"`, { stdio: \"ignore\" });\n }\n } else {\n // Linux\n try {\n execSync(`google-chrome --app=\"${url}\" --window-size=500,700`, { stdio: \"ignore\" });\n } catch {\n execSync(`xdg-open \"${url}\"`, { stdio: \"ignore\" });\n }\n }\n } catch (error) {\n // Browser couldn't be opened, that's okay\n console.log(chalk.dim(`(Couldn't open browser automatically - please visit ${url} manually)`));\n }\n}\n\nexport { openBrowser };\n"],"mappings":"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","names":["loadIdentity"]}