agent-world 0.13.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/README.md +90 -17
  2. package/dist/cli/commands.d.ts +7 -1
  3. package/dist/cli/commands.js +27 -10
  4. package/dist/cli/hitl.d.ts +4 -1
  5. package/dist/cli/hitl.js +55 -20
  6. package/dist/cli/index.js +249 -97
  7. package/dist/cli/system-events.d.ts +27 -0
  8. package/dist/cli/system-events.js +63 -0
  9. package/dist/core/activity-tracker.d.ts +26 -0
  10. package/dist/core/activity-tracker.d.ts.map +1 -1
  11. package/dist/core/activity-tracker.js +21 -4
  12. package/dist/core/activity-tracker.js.map +1 -1
  13. package/dist/core/anthropic-direct.d.ts +2 -0
  14. package/dist/core/anthropic-direct.d.ts.map +1 -1
  15. package/dist/core/anthropic-direct.js +43 -1
  16. package/dist/core/anthropic-direct.js.map +1 -1
  17. package/dist/core/chat-constants.d.ts +12 -0
  18. package/dist/core/chat-constants.d.ts.map +1 -1
  19. package/dist/core/chat-constants.js +5 -0
  20. package/dist/core/chat-constants.js.map +1 -1
  21. package/dist/core/create-agent-tool.d.ts +5 -0
  22. package/dist/core/create-agent-tool.d.ts.map +1 -1
  23. package/dist/core/create-agent-tool.js +57 -34
  24. package/dist/core/create-agent-tool.js.map +1 -1
  25. package/dist/core/events/index.d.ts +5 -2
  26. package/dist/core/events/index.d.ts.map +1 -1
  27. package/dist/core/events/index.js +5 -2
  28. package/dist/core/events/index.js.map +1 -1
  29. package/dist/core/events/memory-manager.d.ts +26 -1
  30. package/dist/core/events/memory-manager.d.ts.map +1 -1
  31. package/dist/core/events/memory-manager.js +877 -72
  32. package/dist/core/events/memory-manager.js.map +1 -1
  33. package/dist/core/events/orchestrator.d.ts +8 -0
  34. package/dist/core/events/orchestrator.d.ts.map +1 -1
  35. package/dist/core/events/orchestrator.js +203 -36
  36. package/dist/core/events/orchestrator.js.map +1 -1
  37. package/dist/core/events/persistence.d.ts +21 -14
  38. package/dist/core/events/persistence.d.ts.map +1 -1
  39. package/dist/core/events/persistence.js +100 -35
  40. package/dist/core/events/persistence.js.map +1 -1
  41. package/dist/core/events/publishers.d.ts +13 -7
  42. package/dist/core/events/publishers.d.ts.map +1 -1
  43. package/dist/core/events/publishers.js +53 -37
  44. package/dist/core/events/publishers.js.map +1 -1
  45. package/dist/core/events/subscribers.d.ts +17 -14
  46. package/dist/core/events/subscribers.d.ts.map +1 -1
  47. package/dist/core/events/subscribers.js +61 -148
  48. package/dist/core/events/subscribers.js.map +1 -1
  49. package/dist/core/events/title-scheduler.d.ts +27 -0
  50. package/dist/core/events/title-scheduler.d.ts.map +1 -0
  51. package/dist/core/events/title-scheduler.js +135 -0
  52. package/dist/core/events/title-scheduler.js.map +1 -0
  53. package/dist/core/events/tool-bridge-logging.d.ts +4 -1
  54. package/dist/core/events/tool-bridge-logging.d.ts.map +1 -1
  55. package/dist/core/events/tool-bridge-logging.js +112 -13
  56. package/dist/core/events/tool-bridge-logging.js.map +1 -1
  57. package/dist/core/events-metadata.d.ts.map +1 -1
  58. package/dist/core/events-metadata.js +8 -4
  59. package/dist/core/events-metadata.js.map +1 -1
  60. package/dist/core/export.d.ts +1 -1
  61. package/dist/core/export.d.ts.map +1 -1
  62. package/dist/core/export.js +2 -15
  63. package/dist/core/export.js.map +1 -1
  64. package/dist/core/feature-path-logging.d.ts +50 -0
  65. package/dist/core/feature-path-logging.d.ts.map +1 -0
  66. package/dist/core/feature-path-logging.js +130 -0
  67. package/dist/core/feature-path-logging.js.map +1 -0
  68. package/dist/core/file-tools.d.ts +57 -1
  69. package/dist/core/file-tools.d.ts.map +1 -1
  70. package/dist/core/file-tools.js +329 -29
  71. package/dist/core/file-tools.js.map +1 -1
  72. package/dist/core/google-direct.d.ts +6 -1
  73. package/dist/core/google-direct.d.ts.map +1 -1
  74. package/dist/core/google-direct.js +76 -7
  75. package/dist/core/google-direct.js.map +1 -1
  76. package/dist/core/heartbeat.d.ts +34 -0
  77. package/dist/core/heartbeat.d.ts.map +1 -0
  78. package/dist/core/heartbeat.js +153 -0
  79. package/dist/core/heartbeat.js.map +1 -0
  80. package/dist/core/hitl-tool.d.ts +6 -12
  81. package/dist/core/hitl-tool.d.ts.map +1 -1
  82. package/dist/core/hitl-tool.js +66 -88
  83. package/dist/core/hitl-tool.js.map +1 -1
  84. package/dist/core/hitl.d.ts +61 -4
  85. package/dist/core/hitl.d.ts.map +1 -1
  86. package/dist/core/hitl.js +324 -60
  87. package/dist/core/hitl.js.map +1 -1
  88. package/dist/core/index.d.ts +11 -7
  89. package/dist/core/index.d.ts.map +1 -1
  90. package/dist/core/index.js +10 -6
  91. package/dist/core/index.js.map +1 -1
  92. package/dist/core/llm-manager.d.ts +15 -0
  93. package/dist/core/llm-manager.d.ts.map +1 -1
  94. package/dist/core/llm-manager.js +325 -40
  95. package/dist/core/llm-manager.js.map +1 -1
  96. package/dist/core/load-skill-tool.d.ts +36 -3
  97. package/dist/core/load-skill-tool.d.ts.map +1 -1
  98. package/dist/core/load-skill-tool.js +807 -93
  99. package/dist/core/load-skill-tool.js.map +1 -1
  100. package/dist/core/logger.d.ts +14 -0
  101. package/dist/core/logger.d.ts.map +1 -1
  102. package/dist/core/logger.js +15 -0
  103. package/dist/core/logger.js.map +1 -1
  104. package/dist/core/managers.d.ts +18 -50
  105. package/dist/core/managers.d.ts.map +1 -1
  106. package/dist/core/managers.js +340 -502
  107. package/dist/core/managers.js.map +1 -1
  108. package/dist/core/mcp-server-registry.d.ts +16 -1
  109. package/dist/core/mcp-server-registry.d.ts.map +1 -1
  110. package/dist/core/mcp-server-registry.js +162 -12
  111. package/dist/core/mcp-server-registry.js.map +1 -1
  112. package/dist/core/message-cutoff.d.ts +29 -0
  113. package/dist/core/message-cutoff.d.ts.map +1 -0
  114. package/dist/core/message-cutoff.js +63 -0
  115. package/dist/core/message-cutoff.js.map +1 -0
  116. package/dist/core/message-edit-manager.d.ts +54 -0
  117. package/dist/core/message-edit-manager.d.ts.map +1 -0
  118. package/dist/core/message-edit-manager.js +602 -0
  119. package/dist/core/message-edit-manager.js.map +1 -0
  120. package/dist/core/message-prep.d.ts +2 -0
  121. package/dist/core/message-prep.d.ts.map +1 -1
  122. package/dist/core/message-prep.js +39 -12
  123. package/dist/core/message-prep.js.map +1 -1
  124. package/dist/core/message-processing-control.d.ts +1 -0
  125. package/dist/core/message-processing-control.d.ts.map +1 -1
  126. package/dist/core/message-processing-control.js +23 -6
  127. package/dist/core/message-processing-control.js.map +1 -1
  128. package/dist/core/openai-direct.d.ts +9 -3
  129. package/dist/core/openai-direct.d.ts.map +1 -1
  130. package/dist/core/openai-direct.js +267 -33
  131. package/dist/core/openai-direct.js.map +1 -1
  132. package/dist/core/optional-tracers/opik-runtime.d.ts +32 -0
  133. package/dist/core/optional-tracers/opik-runtime.d.ts.map +1 -0
  134. package/dist/core/optional-tracers/opik-runtime.js +141 -0
  135. package/dist/core/optional-tracers/opik-runtime.js.map +1 -0
  136. package/dist/core/queue-manager.d.ts +84 -0
  137. package/dist/core/queue-manager.d.ts.map +1 -0
  138. package/dist/core/queue-manager.js +814 -0
  139. package/dist/core/queue-manager.js.map +1 -0
  140. package/dist/core/reasoning-controls.d.ts +30 -0
  141. package/dist/core/reasoning-controls.d.ts.map +1 -0
  142. package/dist/core/reasoning-controls.js +118 -0
  143. package/dist/core/reasoning-controls.js.map +1 -0
  144. package/dist/core/reliability-config.d.ts +82 -0
  145. package/dist/core/reliability-config.d.ts.map +1 -0
  146. package/dist/core/reliability-config.js +106 -0
  147. package/dist/core/reliability-config.js.map +1 -0
  148. package/dist/core/reliability-runtime.d.ts +53 -0
  149. package/dist/core/reliability-runtime.d.ts.map +1 -0
  150. package/dist/core/reliability-runtime.js +92 -0
  151. package/dist/core/reliability-runtime.js.map +1 -0
  152. package/dist/core/security/guardrails.d.ts +21 -0
  153. package/dist/core/security/guardrails.d.ts.map +1 -0
  154. package/dist/core/security/guardrails.js +111 -0
  155. package/dist/core/security/guardrails.js.map +1 -0
  156. package/dist/core/send-message-tool.d.ts +79 -0
  157. package/dist/core/send-message-tool.d.ts.map +1 -0
  158. package/dist/core/send-message-tool.js +222 -0
  159. package/dist/core/send-message-tool.js.map +1 -0
  160. package/dist/core/shell-cmd-tool.d.ts +82 -1
  161. package/dist/core/shell-cmd-tool.d.ts.map +1 -1
  162. package/dist/core/shell-cmd-tool.js +854 -42
  163. package/dist/core/shell-cmd-tool.js.map +1 -1
  164. package/dist/core/skill-registry.d.ts +2 -0
  165. package/dist/core/skill-registry.d.ts.map +1 -1
  166. package/dist/core/skill-registry.js +52 -2
  167. package/dist/core/skill-registry.js.map +1 -1
  168. package/dist/core/storage/eventStorage/fileEventStorage.d.ts +5 -0
  169. package/dist/core/storage/eventStorage/fileEventStorage.d.ts.map +1 -1
  170. package/dist/core/storage/eventStorage/fileEventStorage.js +61 -0
  171. package/dist/core/storage/eventStorage/fileEventStorage.js.map +1 -1
  172. package/dist/core/storage/eventStorage/memoryEventStorage.d.ts +5 -0
  173. package/dist/core/storage/eventStorage/memoryEventStorage.d.ts.map +1 -1
  174. package/dist/core/storage/eventStorage/memoryEventStorage.js +34 -0
  175. package/dist/core/storage/eventStorage/memoryEventStorage.js.map +1 -1
  176. package/dist/core/storage/eventStorage/sqliteEventStorage.d.ts +1 -0
  177. package/dist/core/storage/eventStorage/sqliteEventStorage.d.ts.map +1 -1
  178. package/dist/core/storage/eventStorage/sqliteEventStorage.js +19 -2
  179. package/dist/core/storage/eventStorage/sqliteEventStorage.js.map +1 -1
  180. package/dist/core/storage/eventStorage/types.d.ts +6 -0
  181. package/dist/core/storage/eventStorage/types.d.ts.map +1 -1
  182. package/dist/core/storage/eventStorage/types.js +1 -0
  183. package/dist/core/storage/eventStorage/types.js.map +1 -1
  184. package/dist/core/storage/eventStorage/validation.d.ts.map +1 -1
  185. package/dist/core/storage/eventStorage/validation.js +2 -1
  186. package/dist/core/storage/eventStorage/validation.js.map +1 -1
  187. package/dist/core/storage/github-world-import.d.ts +84 -0
  188. package/dist/core/storage/github-world-import.d.ts.map +1 -0
  189. package/dist/core/storage/github-world-import.js +365 -0
  190. package/dist/core/storage/github-world-import.js.map +1 -0
  191. package/dist/core/storage/memory-storage.d.ts +19 -8
  192. package/dist/core/storage/memory-storage.d.ts.map +1 -1
  193. package/dist/core/storage/memory-storage.js +147 -49
  194. package/dist/core/storage/memory-storage.js.map +1 -1
  195. package/dist/core/storage/queue-storage.d.ts +1 -0
  196. package/dist/core/storage/queue-storage.d.ts.map +1 -1
  197. package/dist/core/storage/queue-storage.js +3 -2
  198. package/dist/core/storage/queue-storage.js.map +1 -1
  199. package/dist/core/storage/sqlite-storage.d.ts +14 -9
  200. package/dist/core/storage/sqlite-storage.d.ts.map +1 -1
  201. package/dist/core/storage/sqlite-storage.js +131 -154
  202. package/dist/core/storage/sqlite-storage.js.map +1 -1
  203. package/dist/core/storage/storage-factory.d.ts +3 -0
  204. package/dist/core/storage/storage-factory.d.ts.map +1 -1
  205. package/dist/core/storage/storage-factory.js +175 -89
  206. package/dist/core/storage/storage-factory.js.map +1 -1
  207. package/dist/core/storage/world-storage.d.ts +1 -1
  208. package/dist/core/storage/world-storage.d.ts.map +1 -1
  209. package/dist/core/storage/world-storage.js +5 -1
  210. package/dist/core/storage/world-storage.js.map +1 -1
  211. package/dist/core/storage-init.d.ts +11 -0
  212. package/dist/core/storage-init.d.ts.map +1 -0
  213. package/dist/core/storage-init.js +122 -0
  214. package/dist/core/storage-init.js.map +1 -0
  215. package/dist/core/subscription.d.ts +8 -1
  216. package/dist/core/subscription.d.ts.map +1 -1
  217. package/dist/core/subscription.js +130 -23
  218. package/dist/core/subscription.js.map +1 -1
  219. package/dist/core/tool-approval.d.ts +45 -0
  220. package/dist/core/tool-approval.d.ts.map +1 -0
  221. package/dist/core/tool-approval.js +223 -0
  222. package/dist/core/tool-approval.js.map +1 -0
  223. package/dist/core/tool-execution-envelope.d.ts +87 -0
  224. package/dist/core/tool-execution-envelope.d.ts.map +1 -0
  225. package/dist/core/tool-execution-envelope.js +168 -0
  226. package/dist/core/tool-execution-envelope.js.map +1 -0
  227. package/dist/core/tool-utils.d.ts +7 -2
  228. package/dist/core/tool-utils.d.ts.map +1 -1
  229. package/dist/core/tool-utils.js +81 -17
  230. package/dist/core/tool-utils.js.map +1 -1
  231. package/dist/core/types.d.ts +67 -19
  232. package/dist/core/types.d.ts.map +1 -1
  233. package/dist/core/types.js +3 -0
  234. package/dist/core/types.js.map +1 -1
  235. package/dist/core/utils.d.ts +7 -0
  236. package/dist/core/utils.d.ts.map +1 -1
  237. package/dist/core/utils.js +71 -21
  238. package/dist/core/utils.js.map +1 -1
  239. package/dist/core/web-fetch-tool.d.ts +72 -0
  240. package/dist/core/web-fetch-tool.d.ts.map +1 -0
  241. package/dist/core/web-fetch-tool.js +491 -0
  242. package/dist/core/web-fetch-tool.js.map +1 -0
  243. package/dist/core/world-registry.d.ts +84 -0
  244. package/dist/core/world-registry.d.ts.map +1 -0
  245. package/dist/core/world-registry.js +247 -0
  246. package/dist/core/world-registry.js.map +1 -0
  247. package/dist/public/assets/index-Be-1xtV-.js +104 -0
  248. package/dist/public/assets/index-tsDdiXDU.css +1 -0
  249. package/dist/public/index.html +2 -2
  250. package/dist/public/mcp-sandbox-proxy.html +148 -0
  251. package/dist/server/api.js +260 -18
  252. package/dist/server/error-response.d.ts +27 -0
  253. package/dist/server/error-response.js +77 -0
  254. package/dist/server/index.d.ts +2 -1
  255. package/dist/server/index.js +6 -2
  256. package/dist/server/sse-handler.d.ts +11 -1
  257. package/dist/server/sse-handler.js +194 -34
  258. package/migrations/0015_add_message_queue.sql +36 -0
  259. package/migrations/0016_add_world_heartbeat.sql +13 -0
  260. package/migrations/0017_add_title_provenance.sql +7 -0
  261. package/package.json +31 -10
  262. package/dist/public/assets/index-BW41BxMy.css +0 -1
  263. package/dist/public/assets/index-kO6UJFwK.js +0 -96
@@ -0,0 +1,491 @@
1
+ /**
2
+ * Web Fetch Tool - Lightweight web retrieval with markdown normalization.
3
+ *
4
+ * Features:
5
+ * - Built-in `web_fetch` tool definition for world toolsets
6
+ * - URL validation with http/https scheme enforcement
7
+ * - Basic SSRF safeguards for loopback/private/link-local targets
8
+ * - Lightweight SPA bootstrap-data extraction from HTML script payloads
9
+ * - Markdown conversion via Turndown + GFM plugin
10
+ *
11
+ * Implementation Notes:
12
+ * - Uses native fetch in Node runtime; no browser automation dependencies
13
+ * - Does not execute page JavaScript; instead extracts embedded JSON state when available
14
+ * - Returns deterministic JSON string payloads for downstream tool consumers
15
+ * - Applies timeout and output-size bounds with explicit truncation metadata
16
+ *
17
+ * Recent Changes:
18
+ * - 2026-03-12: Restored private-target gating in the main execute path so blocked hosts require explicit approval before any network fetch starts.
19
+ * - 2026-03-12: Shared tool approval flow now persists durable approval prompt/resolution messages for replay-safe local/private access denials.
20
+ * - 2026-03-12: Removed permission level gating — web_fetch is now allowed at all levels (read/ask/auto), like read_file.
21
+ * - 2026-03-06: Removed `world.currentChatId` fallback from local/private access approvals; HITL approval now requires explicit `context.chatId`.
22
+ * - 2026-03-05: Added deterministic timeout-error mapping (`timeout_error`) for aborted fetches caused by per-request timeout limits.
23
+ * - 2026-03-05: Switched timeout/output bounds constants to shared reliability config.
24
+ * - 2026-02-28: Initial implementation of fetch-only web retrieval with Turndown conversion and SPA JSON heuristics.
25
+ */
26
+ /// <reference path="./globals.d.ts" />
27
+ import { lookup as dnsLookup } from 'dns/promises';
28
+ import { isIP } from 'net';
29
+ import TurndownService from 'turndown';
30
+ import { gfm } from 'turndown-plugin-gfm';
31
+ import { requestToolApproval } from './tool-approval.js';
32
+ import { RELIABILITY_CONFIG } from './reliability-config.js';
33
+ const DEFAULT_TIMEOUT_MS = RELIABILITY_CONFIG.webFetch.defaultTimeoutMs;
34
+ const MAX_TIMEOUT_MS = RELIABILITY_CONFIG.webFetch.maxTimeoutMs;
35
+ const DEFAULT_MAX_CHARS = RELIABILITY_CONFIG.webFetch.defaultMaxChars;
36
+ const MAX_MAX_CHARS = RELIABILITY_CONFIG.webFetch.maxMaxChars;
37
+ const MIN_TIMEOUT_MS = RELIABILITY_CONFIG.webFetch.minTimeoutMs;
38
+ const LOCAL_APPROVE_OPTION = 'yes';
39
+ const LOCAL_DENY_OPTION = 'no';
40
+ function clamp(value, min, max) {
41
+ return Math.max(min, Math.min(max, value));
42
+ }
43
+ function toErrorMessage(error) {
44
+ return error instanceof Error ? error.message : String(error);
45
+ }
46
+ function isAbortError(error) {
47
+ if (!error)
48
+ return false;
49
+ if (error instanceof DOMException && error.name === 'AbortError')
50
+ return true;
51
+ if (error instanceof Error && error.name === 'AbortError')
52
+ return true;
53
+ const message = toErrorMessage(error).toLowerCase();
54
+ return message.includes('aborted');
55
+ }
56
+ function parseUrlOrThrow(urlValue) {
57
+ if (typeof urlValue !== 'string' || !urlValue.trim()) {
58
+ throw new Error('invalid_url: url is required');
59
+ }
60
+ let parsed;
61
+ try {
62
+ parsed = new URL(urlValue.trim());
63
+ }
64
+ catch {
65
+ throw new Error('invalid_url: malformed URL');
66
+ }
67
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
68
+ throw new Error('unsupported_scheme: only http/https URLs are allowed');
69
+ }
70
+ return parsed;
71
+ }
72
+ function isBlockedHostname(hostname) {
73
+ const normalized = hostname.trim().toLowerCase();
74
+ if (!normalized)
75
+ return true;
76
+ if (normalized === 'localhost' || normalized.endsWith('.localhost')) {
77
+ return true;
78
+ }
79
+ if (normalized === '0.0.0.0' || normalized === '::' || normalized === '[::]') {
80
+ return true;
81
+ }
82
+ if (normalized.endsWith('.local') || normalized.endsWith('.internal')) {
83
+ return true;
84
+ }
85
+ return false;
86
+ }
87
+ function isPrivateIpv4(ip) {
88
+ const parts = ip.split('.').map((part) => Number(part));
89
+ if (parts.length !== 4 || parts.some((part) => Number.isNaN(part))) {
90
+ return true;
91
+ }
92
+ if (parts[0] === 10)
93
+ return true;
94
+ if (parts[0] === 127)
95
+ return true;
96
+ if (parts[0] === 0)
97
+ return true;
98
+ if (parts[0] === 169 && parts[1] === 254)
99
+ return true;
100
+ if (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31)
101
+ return true;
102
+ if (parts[0] === 192 && parts[1] === 168)
103
+ return true;
104
+ return false;
105
+ }
106
+ function isPrivateIpv6(ip) {
107
+ const normalized = ip.toLowerCase();
108
+ if (normalized === '::1')
109
+ return true;
110
+ if (normalized.startsWith('fc') || normalized.startsWith('fd'))
111
+ return true;
112
+ if (normalized.startsWith('fe80:'))
113
+ return true;
114
+ return false;
115
+ }
116
+ async function getTargetBlockReason(url) {
117
+ if (isBlockedHostname(url.hostname)) {
118
+ return 'local/private hostnames are not allowed';
119
+ }
120
+ const hostname = url.hostname.replace(/^\[|\]$/g, '');
121
+ const ipVersion = isIP(hostname);
122
+ if (ipVersion === 4 && isPrivateIpv4(hostname)) {
123
+ return 'private network targets are not allowed';
124
+ }
125
+ if (ipVersion === 6 && isPrivateIpv6(hostname)) {
126
+ return 'private network targets are not allowed';
127
+ }
128
+ if (ipVersion !== 0) {
129
+ return null;
130
+ }
131
+ try {
132
+ const resolved = await dnsLookup(hostname, { all: true });
133
+ for (const entry of resolved) {
134
+ if ((entry.family === 4 && isPrivateIpv4(entry.address)) || (entry.family === 6 && isPrivateIpv6(entry.address))) {
135
+ return 'hostname resolved to a private network address';
136
+ }
137
+ }
138
+ }
139
+ catch (error) {
140
+ // DNS lookup can fail on transient infra issues; keep behavior permissive for public domains.
141
+ }
142
+ return null;
143
+ }
144
+ async function requestLocalAccessApproval(options) {
145
+ const resolution = await requestToolApproval({
146
+ world: options.world,
147
+ title: 'Allow local/private web_fetch access?',
148
+ message: [
149
+ `web_fetch requested URL: ${options.url.toString()}`,
150
+ `Blocked by default because: ${options.reason}`,
151
+ 'Allow this request to proceed?',
152
+ ].join('\n'),
153
+ chatId: options.chatId,
154
+ toolCallId: options.toolCallId,
155
+ defaultOptionId: LOCAL_DENY_OPTION,
156
+ options: [
157
+ { id: LOCAL_APPROVE_OPTION, label: 'Yes', description: 'Allow this local/private fetch request.' },
158
+ { id: LOCAL_DENY_OPTION, label: 'No', description: 'Keep blocking this request.' },
159
+ ],
160
+ approvedOptionIds: [LOCAL_APPROVE_OPTION],
161
+ metadata: {
162
+ tool: 'web_fetch',
163
+ url: options.url.toString(),
164
+ blockedReason: options.reason,
165
+ ...(typeof options.toolCallId === 'string' && options.toolCallId.trim()
166
+ ? { toolCallId: options.toolCallId.trim() }
167
+ : {}),
168
+ },
169
+ agentName: options.agentName || null,
170
+ messages: options.messages,
171
+ });
172
+ return {
173
+ approved: resolution.approved,
174
+ reason: resolution.reason,
175
+ };
176
+ }
177
+ function decodeHtmlEntities(value) {
178
+ return value
179
+ .replace(/&quot;/g, '"')
180
+ .replace(/&#39;/g, "'")
181
+ .replace(/&lt;/g, '<')
182
+ .replace(/&gt;/g, '>')
183
+ .replace(/&amp;/g, '&');
184
+ }
185
+ function extractTitle(html) {
186
+ const match = html.match(/<title[^>]*>([\s\S]*?)<\/title>/i);
187
+ if (!match)
188
+ return null;
189
+ const title = decodeHtmlEntities(match[1].replace(/\s+/g, ' ').trim());
190
+ return title || null;
191
+ }
192
+ function stripNoiseHtml(html) {
193
+ return html
194
+ .replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi, '')
195
+ .replace(/<style\b[^>]*>[\s\S]*?<\/style>/gi, '')
196
+ .replace(/<noscript\b[^>]*>[\s\S]*?<\/noscript>/gi, '')
197
+ .replace(/<svg\b[^>]*>[\s\S]*?<\/svg>/gi, '')
198
+ .replace(/<!--([\s\S]*?)-->/g, '');
199
+ }
200
+ function extractTextBodyFromHtml(html) {
201
+ const bodyMatch = html.match(/<body\b[^>]*>([\s\S]*?)<\/body>/i);
202
+ const source = bodyMatch ? bodyMatch[1] : html;
203
+ const withoutTags = source
204
+ .replace(/<\/(p|div|section|article|h[1-6]|li|tr|blockquote)>/gi, '\n')
205
+ .replace(/<br\s*\/?\s*>/gi, '\n')
206
+ .replace(/<[^>]+>/g, ' ')
207
+ .replace(/\s+\n/g, '\n')
208
+ .replace(/\n{3,}/g, '\n\n')
209
+ .replace(/[ \t]{2,}/g, ' ')
210
+ .trim();
211
+ return decodeHtmlEntities(withoutTags);
212
+ }
213
+ function toSafeJsonSnippet(raw) {
214
+ const trimmed = raw.trim();
215
+ if (!trimmed)
216
+ return null;
217
+ let parsed;
218
+ try {
219
+ parsed = JSON.parse(trimmed);
220
+ }
221
+ catch {
222
+ return null;
223
+ }
224
+ const normalized = JSON.stringify(parsed, null, 2);
225
+ return normalized.length > 12000 ? `${normalized.slice(0, 12000)}\n...` : normalized;
226
+ }
227
+ function extractSpaBootstrapJson(html) {
228
+ const snippets = [];
229
+ const nextDataMatch = html.match(/<script[^>]*id=["']__NEXT_DATA__["'][^>]*>([\s\S]*?)<\/script>/i);
230
+ const nextData = nextDataMatch ? toSafeJsonSnippet(nextDataMatch[1]) : null;
231
+ if (nextData) {
232
+ snippets.push({ label: '__NEXT_DATA__', content: nextData });
233
+ }
234
+ const nuxtMatch = html.match(/<script[^>]*>\s*window\.__NUXT__\s*=\s*([\s\S]*?)<\/script>/i);
235
+ const nuxtData = nuxtMatch ? toSafeJsonSnippet(nuxtMatch[1].replace(/;\s*$/, '')) : null;
236
+ if (nuxtData) {
237
+ snippets.push({ label: 'window.__NUXT__', content: nuxtData });
238
+ }
239
+ const initialStateMatch = html.match(/<script[^>]*>\s*window\.__INITIAL_STATE__\s*=\s*([\s\S]*?)<\/script>/i);
240
+ const initialState = initialStateMatch ? toSafeJsonSnippet(initialStateMatch[1].replace(/;\s*$/, '')) : null;
241
+ if (initialState) {
242
+ snippets.push({ label: 'window.__INITIAL_STATE__', content: initialState });
243
+ }
244
+ return snippets;
245
+ }
246
+ function createTurndown(options) {
247
+ const service = new TurndownService({
248
+ headingStyle: 'atx',
249
+ codeBlockStyle: 'fenced',
250
+ bulletListMarker: '-',
251
+ emDelimiter: '_',
252
+ strongDelimiter: '**',
253
+ linkStyle: 'inlined',
254
+ });
255
+ service.use(gfm);
256
+ if (!options.includeLinks) {
257
+ service.addRule('stripLinks', {
258
+ filter: 'a',
259
+ replacement: (_content, node) => (node.textContent || '').trim(),
260
+ });
261
+ }
262
+ if (!options.includeImages) {
263
+ service.addRule('stripImages', {
264
+ filter: 'img',
265
+ replacement: () => '',
266
+ });
267
+ }
268
+ return service;
269
+ }
270
+ function applySizeLimit(markdown, maxChars) {
271
+ if (markdown.length <= maxChars) {
272
+ return { markdown, truncated: false };
273
+ }
274
+ return {
275
+ markdown: `${markdown.slice(0, maxChars)}\n\n...\n`,
276
+ truncated: true,
277
+ };
278
+ }
279
+ function buildUnsupportedResponse(url, response, timingMs) {
280
+ const result = {
281
+ url: url.toString(),
282
+ resolvedUrl: response.url || url.toString(),
283
+ status: response.status,
284
+ ok: response.ok,
285
+ contentType: response.headers.get('content-type'),
286
+ title: null,
287
+ mode: 'unsupported',
288
+ markdown: '',
289
+ limitationReason: 'unsupported_content_type',
290
+ truncated: false,
291
+ timingMs,
292
+ };
293
+ return JSON.stringify(result, null, 2);
294
+ }
295
+ async function executeWebFetch(args, context) {
296
+ const startedAt = Date.now();
297
+ const activeTimeoutMs = clamp(Number(args.timeoutMs ?? DEFAULT_TIMEOUT_MS), MIN_TIMEOUT_MS, MAX_TIMEOUT_MS);
298
+ let timedOut = false;
299
+ // web_fetch is allowed at all permission levels (read/ask/auto), like read_file.
300
+ try {
301
+ const target = parseUrlOrThrow(args.url);
302
+ const blockReason = await getTargetBlockReason(target);
303
+ if (blockReason) {
304
+ const world = context?.world;
305
+ const worldId = String(world?.id || '').trim();
306
+ if (!world || !worldId) {
307
+ throw new Error(`blocked_target: ${blockReason}`);
308
+ }
309
+ const chatId = typeof context?.chatId === 'string' && context.chatId.trim()
310
+ ? context.chatId.trim()
311
+ : null;
312
+ if (!chatId) {
313
+ throw new Error('blocked_target: local/private access approval requires an explicit chatId');
314
+ }
315
+ const approval = await requestLocalAccessApproval({
316
+ world,
317
+ url: target,
318
+ reason: blockReason,
319
+ chatId,
320
+ toolCallId: context?.toolCallId,
321
+ agentName: context?.agentName || null,
322
+ messages: context?.messages,
323
+ });
324
+ if (!approval.approved) {
325
+ if (approval.reason === 'timeout') {
326
+ throw new Error('blocked_target: local/private access approval timed out');
327
+ }
328
+ throw new Error('blocked_target: local/private access denied');
329
+ }
330
+ }
331
+ const timeoutMs = activeTimeoutMs;
332
+ const maxChars = clamp(Number(args.maxChars ?? DEFAULT_MAX_CHARS), 2000, MAX_MAX_CHARS);
333
+ const includeLinks = args.includeLinks !== false;
334
+ const includeImages = args.includeImages === true;
335
+ const controller = new AbortController();
336
+ const timer = setTimeout(() => {
337
+ timedOut = true;
338
+ controller.abort();
339
+ }, timeoutMs);
340
+ let response;
341
+ try {
342
+ response = await fetch(target.toString(), {
343
+ redirect: 'follow',
344
+ signal: controller.signal,
345
+ headers: {
346
+ 'user-agent': 'agent-world-web-fetch/1.0',
347
+ accept: 'text/html,application/json,text/plain;q=0.9,*/*;q=0.8',
348
+ },
349
+ });
350
+ }
351
+ finally {
352
+ clearTimeout(timer);
353
+ }
354
+ const timingMs = Date.now() - startedAt;
355
+ const contentTypeHeader = response.headers.get('content-type');
356
+ const contentType = contentTypeHeader ? contentTypeHeader.toLowerCase() : '';
357
+ if (!response.ok) {
358
+ throw new Error(`http_error: ${response.status} ${response.statusText || 'request failed'}`);
359
+ }
360
+ if (!(contentType.includes('text/html') || contentType.includes('text/plain') || contentType.includes('application/json') || contentType === '')) {
361
+ return buildUnsupportedResponse(target, response, timingMs);
362
+ }
363
+ const payload = await response.text();
364
+ if (contentType.includes('application/json')) {
365
+ const jsonSnippet = toSafeJsonSnippet(payload) ?? payload.slice(0, 12000);
366
+ const markdown = ['# JSON Response', '```json', jsonSnippet, '```'].join('\n');
367
+ const limited = applySizeLimit(markdown, maxChars);
368
+ const result = {
369
+ url: target.toString(),
370
+ resolvedUrl: response.url || target.toString(),
371
+ status: response.status,
372
+ ok: response.ok,
373
+ contentType: contentTypeHeader,
374
+ title: null,
375
+ mode: 'json',
376
+ markdown: limited.markdown,
377
+ truncated: limited.truncated,
378
+ timingMs,
379
+ };
380
+ return JSON.stringify(result, null, 2);
381
+ }
382
+ if (contentType.includes('text/plain')) {
383
+ const markdown = ['```text', payload, '```'].join('\n');
384
+ const limited = applySizeLimit(markdown, maxChars);
385
+ const result = {
386
+ url: target.toString(),
387
+ resolvedUrl: response.url || target.toString(),
388
+ status: response.status,
389
+ ok: response.ok,
390
+ contentType: contentTypeHeader,
391
+ title: null,
392
+ mode: 'text',
393
+ markdown: limited.markdown,
394
+ truncated: limited.truncated,
395
+ timingMs,
396
+ };
397
+ return JSON.stringify(result, null, 2);
398
+ }
399
+ const title = extractTitle(payload);
400
+ const bootstrapSnippets = extractSpaBootstrapJson(payload);
401
+ const cleanedHtml = stripNoiseHtml(payload);
402
+ const turndown = createTurndown({ includeLinks, includeImages });
403
+ const contentMarkdown = turndown.turndown(cleanedHtml).trim();
404
+ const textBody = extractTextBodyFromHtml(cleanedHtml);
405
+ const sections = [];
406
+ if (title) {
407
+ sections.push(`# ${title}`);
408
+ }
409
+ if (contentMarkdown) {
410
+ sections.push(contentMarkdown);
411
+ }
412
+ if (bootstrapSnippets.length > 0) {
413
+ sections.push('## SPA Bootstrap Data');
414
+ for (const snippet of bootstrapSnippets) {
415
+ sections.push(`### ${snippet.label}`);
416
+ sections.push('```json');
417
+ sections.push(snippet.content);
418
+ sections.push('```');
419
+ }
420
+ }
421
+ let limitationReason;
422
+ let mode = 'html';
423
+ if (!contentMarkdown || contentMarkdown.length < 120) {
424
+ if (bootstrapSnippets.length > 0) {
425
+ mode = 'spa-data';
426
+ }
427
+ else if (textBody.length < 120) {
428
+ limitationReason = 'client_side_rendering_likely_no_bootstrap_data_found';
429
+ }
430
+ }
431
+ if (sections.length === 0) {
432
+ sections.push(textBody || 'No extractable text content found.');
433
+ }
434
+ const combined = sections.join('\n\n').trim();
435
+ const limited = applySizeLimit(combined, maxChars);
436
+ const result = {
437
+ url: target.toString(),
438
+ resolvedUrl: response.url || target.toString(),
439
+ status: response.status,
440
+ ok: response.ok,
441
+ contentType: contentTypeHeader,
442
+ title,
443
+ mode,
444
+ markdown: limited.markdown,
445
+ limitationReason,
446
+ truncated: limited.truncated,
447
+ timingMs,
448
+ };
449
+ return JSON.stringify(result, null, 2);
450
+ }
451
+ catch (error) {
452
+ if (timedOut || isAbortError(error)) {
453
+ return `Error: web_fetch failed - timeout_error: request exceeded ${activeTimeoutMs}ms`;
454
+ }
455
+ const message = toErrorMessage(error);
456
+ return `Error: web_fetch failed - ${message}`;
457
+ }
458
+ }
459
+ export function createWebFetchToolDefinition() {
460
+ return {
461
+ description: 'Fetch a URL and convert response content to markdown. Supports lightweight SPA data extraction from embedded JSON state without running a browser renderer.',
462
+ parameters: {
463
+ type: 'object',
464
+ properties: {
465
+ url: {
466
+ type: 'string',
467
+ description: 'Target URL to fetch. Only http/https schemes are allowed.',
468
+ },
469
+ timeoutMs: {
470
+ type: 'number',
471
+ description: `Request timeout in milliseconds (default: ${DEFAULT_TIMEOUT_MS}, max: ${MAX_TIMEOUT_MS}).`,
472
+ },
473
+ maxChars: {
474
+ type: 'number',
475
+ description: `Maximum markdown output characters (default: ${DEFAULT_MAX_CHARS}, max: ${MAX_MAX_CHARS}).`,
476
+ },
477
+ includeLinks: {
478
+ type: 'boolean',
479
+ description: 'When false, link URLs are stripped and only anchor text is kept (default: true).',
480
+ },
481
+ includeImages: {
482
+ type: 'boolean',
483
+ description: 'When true, image markdown is preserved (default: false).',
484
+ },
485
+ },
486
+ required: ['url'],
487
+ additionalProperties: false,
488
+ },
489
+ execute: async (args, _sequenceId, _parentToolCall, context) => executeWebFetch(args, context),
490
+ };
491
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-fetch-tool.js","sourceRoot":"","sources":["../../core/web-fetch-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,uCAAuC;AAEvC,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,eAAe,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAkC7D,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AACxE,MAAM,cAAc,GAAG,kBAAkB,CAAC,QAAQ,CAAC,YAAY,CAAC;AAChE,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,eAAe,CAAC;AACtE,MAAM,aAAa,GAAG,kBAAkB,CAAC,QAAQ,CAAC,WAAW,CAAC;AAC9D,MAAM,cAAc,GAAG,kBAAkB,CAAC,QAAQ,CAAC,YAAY,CAAC;AAChE,MAAM,oBAAoB,GAAG,KAAK,CAAC;AACnC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IACpD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IAC9E,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IACvE,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,OAAO,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,eAAe,CAAC,QAAiB;IACxC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,IAAI,UAAU,KAAK,WAAW,IAAI,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC7E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,EAAU;IAC/B,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACtD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IACtE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,EAAU;IAC/B,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5E,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,GAAQ;IAC1C,IAAI,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,OAAO,yCAAyC,CAAC;IACnD,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,SAAS,KAAK,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/C,OAAO,yCAAyC,CAAC;IACnD,CAAC;IACD,IAAI,SAAS,KAAK,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/C,OAAO,yCAAyC,CAAC;IACnD,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBACjH,OAAO,gDAAgD,CAAC;YAC1D,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,8FAA8F;IAChG,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,OAQzC;IACC,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC;QAC3C,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,uCAAuC;QAC9C,OAAO,EAAE;YACP,4BAA4B,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YACpD,+BAA+B,OAAO,CAAC,MAAM,EAAE;YAC/C,gCAAgC;SACjC,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,eAAe,EAAE,iBAAiB;QAClC,OAAO,EAAE;YACP,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,yCAAyC,EAAE;YAClG,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,6BAA6B,EAAE;SACnF;QACD,iBAAiB,EAAE,CAAC,oBAAoB,CAAC;QACzC,QAAQ,EAAE;YACR,IAAI,EAAE,WAAW;YACjB,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;YAC3B,aAAa,EAAE,OAAO,CAAC,MAAM;YAC7B,GAAG,CAAC,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE;gBACrE,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE;gBAC3C,CAAC,CAAC,EAAE,CAAC;SACR;QACD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;QACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,KAAK;SACT,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC7D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,OAAO,CAAC,qCAAqC,EAAE,EAAE,CAAC;SAClD,OAAO,CAAC,mCAAmC,EAAE,EAAE,CAAC;SAChD,OAAO,CAAC,yCAAyC,EAAE,EAAE,CAAC;SACtD,OAAO,CAAC,+BAA+B,EAAE,EAAE,CAAC;SAC5C,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,MAAM,WAAW,GAAG,MAAM;SACvB,OAAO,CAAC,uDAAuD,EAAE,IAAI,CAAC;SACtE,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC;SAChC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC;SAC1B,IAAI,EAAE,CAAC;IAEV,OAAO,kBAAkB,CAAC,WAAW,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,OAAO,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;AACvF,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY;IAC3C,MAAM,QAAQ,GAA8C,EAAE,CAAC;IAE/D,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACpG,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAC7F,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzF,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC9G,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7G,IAAI,YAAY,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,OAA0D;IAChF,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC;QAClC,YAAY,EAAE,KAAK;QACnB,cAAc,EAAE,QAAQ;QACxB,gBAAgB,EAAE,GAAG;QACrB,WAAW,EAAE,GAAG;QAChB,eAAe,EAAE,IAAI;QACrB,SAAS,EAAE,SAAS;KACrB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEjB,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE;YAC5B,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,CAAC,QAAgB,EAAE,IAAqC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;SAC1G,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3B,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE;YAC7B,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB,EAAE,QAAgB;IACxD,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QAChC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW;QACnD,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,GAAQ,EAAE,QAAkB,EAAE,QAAgB;IAC9E,MAAM,MAAM,GAAmB;QAC7B,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;QACnB,WAAW,EAAE,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE;QAC3C,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QACjD,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,EAAE;QACZ,gBAAgB,EAAE,0BAA0B;QAC5C,SAAS,EAAE,KAAK;QAChB,QAAQ;KACT,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAkB,EAAE,OAA6B;IAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;IAC5G,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,iFAAiF;IAEjF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;YAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAE/C,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,mBAAmB,WAAW,EAAE,CAAC,CAAC;YACpD,CAAC;YAED,MAAM,MAAM,GAAG,OAAO,OAAO,EAAE,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;gBACzE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;gBACvB,CAAC,CAAC,IAAI,CAAC;YACT,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;YAC/F,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC;gBAChD,KAAK;gBACL,GAAG,EAAE,MAAM;gBACX,MAAM,EAAE,WAAW;gBACnB,MAAM;gBACN,UAAU,EAAE,OAAO,EAAE,UAAU;gBAC/B,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI;gBACrC,QAAQ,EAAE,OAAO,EAAE,QAAQ;aAC5B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACvB,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAClC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;gBAC7E,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,eAAe,CAAC;QAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,iBAAiB,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;QACxF,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,KAAK,KAAK,CAAC;QACjD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC;QAElD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,QAAQ,GAAG,IAAI,CAAC;YAChB,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE;gBACxC,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,OAAO,EAAE;oBACP,YAAY,EAAE,2BAA2B;oBACzC,MAAM,EAAE,uDAAuD;iBAChE;aACF,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE7E,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,eAAe,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,IAAI,gBAAgB,EAAE,CAAC,CAAC;QAC/F,CAAC;QAED,IAAI,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,WAAW,KAAK,EAAE,CAAC,EAAE,CAAC;YACjJ,OAAO,wBAAwB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEtC,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC7C,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1E,MAAM,QAAQ,GAAG,CAAC,iBAAiB,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/E,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAEnD,MAAM,MAAM,GAAmB;gBAC7B,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE;gBACtB,WAAW,EAAE,QAAQ,CAAC,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE;gBAC9C,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,WAAW,EAAE,iBAAiB;gBAC9B,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,QAAQ;aACT,CAAC;YACF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACnD,MAAM,MAAM,GAAmB;gBAC7B,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE;gBACtB,WAAW,EAAE,QAAQ,CAAC,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE;gBAC9C,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,WAAW,EAAE,iBAAiB;gBAC9B,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,QAAQ;aACT,CAAC;YACF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC;QACjE,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9D,MAAM,QAAQ,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;QAEtD,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,KAAK,EAAE,CAAC;YACV,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YACpB,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACvC,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;gBACxC,QAAQ,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;gBACtC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACzB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC/B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,IAAI,gBAAoC,CAAC;QACzC,IAAI,IAAI,GAA2B,MAAM,CAAC;QAE1C,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACrD,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,IAAI,GAAG,UAAU,CAAC;YACpB,CAAC;iBAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACjC,gBAAgB,GAAG,sDAAsD,CAAC;YAC5E,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC,QAAQ,IAAI,oCAAoC,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAmB;YAC7B,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE;YACtB,WAAW,EAAE,QAAQ,CAAC,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE;YAC9C,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,WAAW,EAAE,iBAAiB;YAC9B,KAAK;YACL,IAAI;YACJ,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,gBAAgB;YAChB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ;SACT,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,QAAQ,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,6DAA6D,eAAe,IAAI,CAAC;QAC1F,CAAC;QACD,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,6BAA6B,OAAO,EAAE,CAAC;IAChD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,OAAO;QACL,WAAW,EACT,6JAA6J;QAC/J,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2DAA2D;iBACzE;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6CAA6C,kBAAkB,UAAU,cAAc,IAAI;iBACzG;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gDAAgD,iBAAiB,UAAU,aAAa,IAAI;iBAC1G;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,kFAAkF;iBAChG;gBACD,aAAa,EAAE;oBACb,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,0DAA0D;iBACxE;aACF;YACD,QAAQ,EAAE,CAAC,KAAK,CAAC;YACjB,oBAAoB,EAAE,KAAK;SAC5B;QACD,OAAO,EAAE,KAAK,EAAE,IAAkB,EAAE,WAAoB,EAAE,eAAwB,EAAE,OAA6B,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC;KACrJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Core World Runtime Registry
3
+ *
4
+ * Purpose:
5
+ * - Provide storage-aware runtime tracking for active world runtimes.
6
+ * - Support idempotent runtime start with reference-counted consumers.
7
+ * - Offer deterministic stop/release behavior with optional refresh support.
8
+ *
9
+ * Key Features:
10
+ * - Composite runtime key: storageType + storagePath + worldId.
11
+ * - In-flight start deduplication per runtime key.
12
+ * - Consumer ref counting with last-release shutdown.
13
+ * - Runtime diagnostics snapshots for inspection.
14
+ *
15
+ * Implementation Notes:
16
+ * - The registry is runtime-process local and does not coordinate across processes.
17
+ * - Storage context defaults are sourced from environment when not provided.
18
+ *
19
+ * Recent Changes:
20
+ * - 2026-03-04: Runtime refresh now updates the registry's `world` reference.
21
+ * - Prevents callers from receiving stale pre-refresh world instances.
22
+ * - 2026-03-03: Initial runtime registry implementation for canonical world runtime ownership.
23
+ */
24
+ type StorageType = 'file' | 'sqlite' | 'memory';
25
+ export interface WorldRuntimeStorageContext {
26
+ storageType: StorageType;
27
+ storagePath: string;
28
+ }
29
+ export interface ManagedWorldRuntime<TWorld> {
30
+ world: TWorld;
31
+ stop: () => Promise<void>;
32
+ refresh?: () => Promise<TWorld | void>;
33
+ }
34
+ export interface StartWorldRuntimeParams<TWorld> {
35
+ worldId: string;
36
+ consumerId: string;
37
+ storageType?: StorageType;
38
+ storagePath?: string;
39
+ createRuntime: () => Promise<ManagedWorldRuntime<TWorld>>;
40
+ }
41
+ export interface StartedWorldRuntime<TWorld> {
42
+ runtimeKey: string;
43
+ worldId: string;
44
+ storageType: StorageType;
45
+ storagePath: string;
46
+ world: TWorld;
47
+ refCount: number;
48
+ release: () => Promise<void>;
49
+ refresh: () => Promise<void>;
50
+ }
51
+ export interface WorldRuntimeSnapshot {
52
+ runtimeKey: string;
53
+ worldId: string;
54
+ storageType: StorageType;
55
+ storagePath: string;
56
+ startedAt: string;
57
+ refCount: number;
58
+ consumers: string[];
59
+ }
60
+ export declare function createWorldRuntimeKey(worldId: string, context: WorldRuntimeStorageContext): string;
61
+ export declare function startWorldRuntime<TWorld>(params: StartWorldRuntimeParams<TWorld>): Promise<StartedWorldRuntime<TWorld>>;
62
+ export declare function releaseWorldRuntime(params: {
63
+ runtimeKey?: string;
64
+ worldId?: string;
65
+ storageType?: StorageType;
66
+ storagePath?: string;
67
+ consumerId: string;
68
+ }): Promise<void>;
69
+ export declare function getWorldRuntime<TWorld>(params: {
70
+ worldId: string;
71
+ storageType?: StorageType;
72
+ storagePath?: string;
73
+ }): StartedWorldRuntime<TWorld> | null;
74
+ export declare function getWorldRuntimeByKey<TWorld>(runtimeKey: string): StartedWorldRuntime<TWorld> | null;
75
+ export declare function listWorldRuntimeSnapshots(): WorldRuntimeSnapshot[];
76
+ export declare function stopWorldRuntime(runtimeKey: string): Promise<void>;
77
+ /**
78
+ * Stop all active world runtimes with the given worldId regardless of storage
79
+ * context. Used when a world is deleted so subsequent subscriptions do not
80
+ * reuse a stale runtime that was loaded for the previous incarnation.
81
+ */
82
+ export declare function stopWorldRuntimesByWorldId(worldId: string): Promise<void>;
83
+ export declare function stopAllWorldRuntimes(): Promise<void>;
84
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-registry.d.ts","sourceRoot":"","sources":["../../core/world-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AASH,KAAK,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhD,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB,CAAC,MAAM;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,uBAAuB,CAAC,MAAM;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,mBAAmB,CAAC,MAAM;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAiCD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,0BAA0B,GAAG,MAAM,CAIlG;AA2DD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,uBAAuB,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAyD7H;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BhB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,mBAAmB,CAAC,MAAM,CAAC,GAAG,IAAI,CAIrC;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,GAAG,IAAI,CAiBnG;AAED,wBAAgB,yBAAyB,IAAI,oBAAoB,EAAE,CAUlE;AAED,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMxE;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY/E;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAK1D"}