@animalabs/agent-framework 0.19.0 → 0.20.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 (193) hide show
  1. package/README.md +29 -0
  2. package/dist/src/agent.d.ts +22 -0
  3. package/dist/src/agent.d.ts.map +1 -1
  4. package/dist/src/agent.js +128 -10
  5. package/dist/src/agent.js.map +1 -1
  6. package/dist/src/api/types.d.ts +1 -1
  7. package/dist/src/api/types.d.ts.map +1 -1
  8. package/dist/src/code-execution/py-runner.d.ts +10 -1
  9. package/dist/src/code-execution/py-runner.d.ts.map +1 -1
  10. package/dist/src/code-execution/py-runner.js +27 -2
  11. package/dist/src/code-execution/py-runner.js.map +1 -1
  12. package/dist/src/code-execution/tool-definition.d.ts +21 -0
  13. package/dist/src/code-execution/tool-definition.d.ts.map +1 -1
  14. package/dist/src/code-execution/tool-definition.js +34 -0
  15. package/dist/src/code-execution/tool-definition.js.map +1 -1
  16. package/dist/src/framework.d.ts +153 -2
  17. package/dist/src/framework.d.ts.map +1 -1
  18. package/dist/src/framework.js +1169 -76
  19. package/dist/src/framework.js.map +1 -1
  20. package/dist/src/index.d.ts +2 -0
  21. package/dist/src/index.d.ts.map +1 -1
  22. package/dist/src/index.js +4 -0
  23. package/dist/src/index.js.map +1 -1
  24. package/dist/src/mcpl/capability-grant.d.ts +1 -1
  25. package/dist/src/mcpl/capability-grant.d.ts.map +1 -1
  26. package/dist/src/mcpl/capability-grant.js +49 -5
  27. package/dist/src/mcpl/capability-grant.js.map +1 -1
  28. package/dist/src/mcpl/channel-registry.d.ts +59 -2
  29. package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
  30. package/dist/src/mcpl/channel-registry.js +106 -6
  31. package/dist/src/mcpl/channel-registry.js.map +1 -1
  32. package/dist/src/mcpl/index.d.ts +3 -0
  33. package/dist/src/mcpl/index.d.ts.map +1 -1
  34. package/dist/src/mcpl/index.js +3 -0
  35. package/dist/src/mcpl/index.js.map +1 -1
  36. package/dist/src/mcpl/push-coalescer.d.ts +318 -0
  37. package/dist/src/mcpl/push-coalescer.d.ts.map +1 -0
  38. package/dist/src/mcpl/push-coalescer.js +709 -0
  39. package/dist/src/mcpl/push-coalescer.js.map +1 -0
  40. package/dist/src/mcpl/push-handler.d.ts +7 -2
  41. package/dist/src/mcpl/push-handler.d.ts.map +1 -1
  42. package/dist/src/mcpl/push-handler.js +43 -4
  43. package/dist/src/mcpl/push-handler.js.map +1 -1
  44. package/dist/src/mcpl/server-connection.d.ts +18 -0
  45. package/dist/src/mcpl/server-connection.d.ts.map +1 -1
  46. package/dist/src/mcpl/server-connection.js +44 -1
  47. package/dist/src/mcpl/server-connection.js.map +1 -1
  48. package/dist/src/mcpl/tool-classes.d.ts +71 -0
  49. package/dist/src/mcpl/tool-classes.d.ts.map +1 -0
  50. package/dist/src/mcpl/tool-classes.js +170 -0
  51. package/dist/src/mcpl/tool-classes.js.map +1 -0
  52. package/dist/src/mcpl/tool-glob.d.ts +16 -0
  53. package/dist/src/mcpl/tool-glob.d.ts.map +1 -0
  54. package/dist/src/mcpl/tool-glob.js +41 -0
  55. package/dist/src/mcpl/tool-glob.js.map +1 -0
  56. package/dist/src/mcpl/tool-lifecycle.d.ts +253 -0
  57. package/dist/src/mcpl/tool-lifecycle.d.ts.map +1 -0
  58. package/dist/src/mcpl/tool-lifecycle.js +592 -0
  59. package/dist/src/mcpl/tool-lifecycle.js.map +1 -0
  60. package/dist/src/mcpl/transport.d.ts +12 -0
  61. package/dist/src/mcpl/transport.d.ts.map +1 -1
  62. package/dist/src/mcpl/transport.js +33 -1
  63. package/dist/src/mcpl/transport.js.map +1 -1
  64. package/dist/src/mcpl/types.d.ts +66 -1
  65. package/dist/src/mcpl/types.d.ts.map +1 -1
  66. package/dist/src/mcpl/types.js +6 -0
  67. package/dist/src/mcpl/types.js.map +1 -1
  68. package/dist/src/modules/discord/index.js +1 -1
  69. package/dist/src/modules/discord/index.js.map +1 -1
  70. package/dist/src/modules/history/index.d.ts +85 -0
  71. package/dist/src/modules/history/index.d.ts.map +1 -1
  72. package/dist/src/modules/history/index.js +1019 -24
  73. package/dist/src/modules/history/index.js.map +1 -1
  74. package/dist/src/modules/history/semantic.d.ts +202 -0
  75. package/dist/src/modules/history/semantic.d.ts.map +1 -0
  76. package/dist/src/modules/history/semantic.js +418 -0
  77. package/dist/src/modules/history/semantic.js.map +1 -0
  78. package/dist/src/modules/index.d.ts +2 -1
  79. package/dist/src/modules/index.d.ts.map +1 -1
  80. package/dist/src/modules/index.js.map +1 -1
  81. package/dist/src/tool-result-guard.d.ts +82 -0
  82. package/dist/src/tool-result-guard.d.ts.map +1 -0
  83. package/dist/src/tool-result-guard.js +306 -0
  84. package/dist/src/tool-result-guard.js.map +1 -0
  85. package/dist/src/types/agent.d.ts +14 -0
  86. package/dist/src/types/agent.d.ts.map +1 -1
  87. package/dist/src/types/framework.d.ts +21 -0
  88. package/dist/src/types/framework.d.ts.map +1 -1
  89. package/dist/src/types/trace.d.ts +17 -0
  90. package/dist/src/types/trace.d.ts.map +1 -1
  91. package/dist/test/channel-registry-routing.test.js +59 -0
  92. package/dist/test/channel-registry-routing.test.js.map +1 -1
  93. package/dist/test/code-execution.test.js +139 -0
  94. package/dist/test/code-execution.test.js.map +1 -1
  95. package/dist/test/helpers/coalescing-fixture.d.ts +72 -0
  96. package/dist/test/helpers/coalescing-fixture.d.ts.map +1 -0
  97. package/dist/test/helpers/coalescing-fixture.js +145 -0
  98. package/dist/test/helpers/coalescing-fixture.js.map +1 -0
  99. package/dist/test/helpers/coalescing-kill-child.d.ts +2 -0
  100. package/dist/test/helpers/coalescing-kill-child.d.ts.map +1 -0
  101. package/dist/test/helpers/coalescing-kill-child.js +24 -0
  102. package/dist/test/helpers/coalescing-kill-child.js.map +1 -0
  103. package/dist/test/history-module-realstore.test.d.ts +2 -0
  104. package/dist/test/history-module-realstore.test.d.ts.map +1 -0
  105. package/dist/test/history-module-realstore.test.js +363 -0
  106. package/dist/test/history-module-realstore.test.js.map +1 -0
  107. package/dist/test/history-module-semantic.test.d.ts +2 -0
  108. package/dist/test/history-module-semantic.test.d.ts.map +1 -0
  109. package/dist/test/history-module-semantic.test.js +213 -0
  110. package/dist/test/history-module-semantic.test.js.map +1 -0
  111. package/dist/test/history-module-ux.test.d.ts +2 -0
  112. package/dist/test/history-module-ux.test.d.ts.map +1 -0
  113. package/dist/test/history-module-ux.test.js +304 -0
  114. package/dist/test/history-module-ux.test.js.map +1 -0
  115. package/dist/test/history-module.test.js +25 -1
  116. package/dist/test/history-module.test.js.map +1 -1
  117. package/dist/test/history-semantic-review-findings.test.d.ts +2 -0
  118. package/dist/test/history-semantic-review-findings.test.d.ts.map +1 -0
  119. package/dist/test/history-semantic-review-findings.test.js +338 -0
  120. package/dist/test/history-semantic-review-findings.test.js.map +1 -0
  121. package/dist/test/history-semantic-sync-converges.test.d.ts +2 -0
  122. package/dist/test/history-semantic-sync-converges.test.d.ts.map +1 -0
  123. package/dist/test/history-semantic-sync-converges.test.js +109 -0
  124. package/dist/test/history-semantic-sync-converges.test.js.map +1 -0
  125. package/dist/test/mcpl-capability-grant.test.js +3 -1
  126. package/dist/test/mcpl-capability-grant.test.js.map +1 -1
  127. package/dist/test/mcpl-child-env.test.d.ts +2 -0
  128. package/dist/test/mcpl-child-env.test.d.ts.map +1 -0
  129. package/dist/test/mcpl-child-env.test.js +69 -0
  130. package/dist/test/mcpl-child-env.test.js.map +1 -0
  131. package/dist/test/mcpl-coalescing.test.d.ts +2 -0
  132. package/dist/test/mcpl-coalescing.test.d.ts.map +1 -0
  133. package/dist/test/mcpl-coalescing.test.js +1050 -0
  134. package/dist/test/mcpl-coalescing.test.js.map +1 -0
  135. package/dist/test/mcpl-list-status.test.js +4 -0
  136. package/dist/test/mcpl-list-status.test.js.map +1 -1
  137. package/dist/test/mcpl-tool-class-listing.test.d.ts +2 -0
  138. package/dist/test/mcpl-tool-class-listing.test.d.ts.map +1 -0
  139. package/dist/test/mcpl-tool-class-listing.test.js +147 -0
  140. package/dist/test/mcpl-tool-class-listing.test.js.map +1 -0
  141. package/dist/test/mcpl-tool-classes.test.d.ts +7 -0
  142. package/dist/test/mcpl-tool-classes.test.d.ts.map +1 -0
  143. package/dist/test/mcpl-tool-classes.test.js +80 -0
  144. package/dist/test/mcpl-tool-classes.test.js.map +1 -0
  145. package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts +2 -0
  146. package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts.map +1 -0
  147. package/dist/test/mcpl-tool-lifecycle-e2e.test.js +237 -0
  148. package/dist/test/mcpl-tool-lifecycle-e2e.test.js.map +1 -0
  149. package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts +11 -0
  150. package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts.map +1 -0
  151. package/dist/test/mcpl-tool-lifecycle-emitter.test.js +307 -0
  152. package/dist/test/mcpl-tool-lifecycle-emitter.test.js.map +1 -0
  153. package/dist/test/mcpl-tool-lifecycle.test.d.ts +11 -0
  154. package/dist/test/mcpl-tool-lifecycle.test.d.ts.map +1 -0
  155. package/dist/test/mcpl-tool-lifecycle.test.js +270 -0
  156. package/dist/test/mcpl-tool-lifecycle.test.js.map +1 -0
  157. package/dist/test/silent-heartbeat.test.d.ts +2 -0
  158. package/dist/test/silent-heartbeat.test.d.ts.map +1 -0
  159. package/dist/test/silent-heartbeat.test.js +154 -0
  160. package/dist/test/silent-heartbeat.test.js.map +1 -0
  161. package/dist/test/tool-result-guard.test.d.ts +2 -0
  162. package/dist/test/tool-result-guard.test.d.ts.map +1 -0
  163. package/dist/test/tool-result-guard.test.js +1081 -0
  164. package/dist/test/tool-result-guard.test.js.map +1 -0
  165. package/dist/test/trunk-channel-routing.test.js +67 -0
  166. package/dist/test/trunk-channel-routing.test.js.map +1 -1
  167. package/dist/tsconfig.tsbuildinfo +1 -1
  168. package/package.json +2 -2
  169. package/src/agent.ts +128 -10
  170. package/src/api/types.ts +2 -0
  171. package/src/code-execution/py-runner.ts +34 -2
  172. package/src/code-execution/tool-definition.ts +46 -0
  173. package/src/framework.ts +1201 -80
  174. package/src/index.ts +13 -0
  175. package/src/mcpl/capability-grant.ts +54 -6
  176. package/src/mcpl/channel-registry.ts +115 -7
  177. package/src/mcpl/index.ts +29 -0
  178. package/src/mcpl/push-coalescer.ts +821 -0
  179. package/src/mcpl/push-handler.ts +40 -4
  180. package/src/mcpl/server-connection.ts +48 -2
  181. package/src/mcpl/tool-classes.ts +188 -0
  182. package/src/mcpl/tool-glob.ts +36 -0
  183. package/src/mcpl/tool-lifecycle.ts +730 -0
  184. package/src/mcpl/transport.ts +35 -1
  185. package/src/mcpl/types.ts +69 -1
  186. package/src/modules/discord/index.ts +1 -1
  187. package/src/modules/history/index.ts +1089 -24
  188. package/src/modules/history/semantic.ts +473 -0
  189. package/src/modules/index.ts +2 -1
  190. package/src/tool-result-guard.ts +318 -0
  191. package/src/types/agent.ts +15 -0
  192. package/src/types/framework.ts +23 -0
  193. package/src/types/trace.ts +17 -0
@@ -0,0 +1,592 @@
1
+ /**
2
+ * Tool lifecycle (MCPL RFC-007): `tools/lifecycle` notifications about the
3
+ * agent's tool calls, and the `tools/observe` filter a server sets on them.
4
+ *
5
+ * Authority is the grant plus host narrowing; a server's filter is interest
6
+ * and only ever narrows. Per call and connection the host decides, in order
7
+ * (RFC-007 §6.4):
8
+ *
9
+ * 1. reported at all? grant `toolLifecycle.observe` + its narrowing
10
+ * 2. reported to this server? filter: first matching rule and its `report`
11
+ * (no filter → yes)
12
+ * 3. arguments requested? that rule's `input` (no filter → NO)
13
+ * 4. arguments allowed? grant `toolLifecycle.inputs` + its narrowing,
14
+ * and never for `comms` or unclassed tools
15
+ * 5. which fields, how large? the rule's field selection, then the bound
16
+ *
17
+ * Tool RESULTS are never carried — no field for them exists here.
18
+ *
19
+ * Delivery is best-effort like `inference/lifecycle` (SPEC §10.5): one
20
+ * terminal is attempted per opened call, to exactly the connections the
21
+ * opening went to, unless their grant or narrowing no longer covers the call
22
+ * (RFC-007 §4.5). A filter change never suppresses a terminal (§6.5).
23
+ */
24
+ import { CapabilityGrant } from './capability-grant.js';
25
+ import { globMatch } from './tool-glob.js';
26
+ import { DEFAULT_INPUT_CLASSES, isToolClass } from './tool-classes.js';
27
+ export const TOOL_LIFECYCLE_OBSERVE = 'toolLifecycle.observe';
28
+ export const TOOL_LIFECYCLE_INPUTS = 'toolLifecycle.inputs';
29
+ export const DEFAULT_MAX_INPUT_BYTES = 16 * 1024;
30
+ /** Accepted sizes for a `tools/observe` request (RFC-007 §6.6 asks hosts to
31
+ * accept at least 64 rules, 64 paths per rule, 256-character strings). */
32
+ export const TOOL_OBSERVE_LIMITS = {
33
+ rules: 256,
34
+ pathsPerRule: 256,
35
+ stringLength: 256,
36
+ };
37
+ const MATCH_KEYS = new Set(['tool', 'serverTool', 'serverId', 'conversationId', 'class']);
38
+ const RULE_KEYS = new Set(['match', 'report', 'input']);
39
+ function isPlainObject(value) {
40
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
41
+ }
42
+ /**
43
+ * Validate `tools/observe` params. `rules` absent or null clears the filter
44
+ * (`{ok, rules: null}`); `[]` is a valid filter that reports nothing. Unknown
45
+ * members are REJECTED, not ignored: ignoring an unknown `match` member would
46
+ * make a rule match more than its author wrote.
47
+ */
48
+ export function parseToolObserveParams(params) {
49
+ if (params === undefined || params === null)
50
+ return { ok: true, rules: null };
51
+ if (!isPlainObject(params))
52
+ return { ok: false, message: 'tools/observe params must be an object' };
53
+ // Unknown members are rejected here too (MCP's own `_meta` excepted): a
54
+ // misspelled `rules` must not read as "no rules" and silently clear a
55
+ // restrictive filter.
56
+ for (const key of Object.keys(params)) {
57
+ if (key !== 'rules' && key !== '_meta') {
58
+ return { ok: false, message: `tools/observe: unknown params member "${key}"` };
59
+ }
60
+ }
61
+ const raw = params.rules;
62
+ if (raw === undefined || raw === null)
63
+ return { ok: true, rules: null };
64
+ if (!Array.isArray(raw))
65
+ return { ok: false, message: 'tools/observe: rules must be an array or null' };
66
+ if (raw.length > TOOL_OBSERVE_LIMITS.rules) {
67
+ return { ok: false, message: `tools/observe: more than ${TOOL_OBSERVE_LIMITS.rules} rules`, data: { limit: 'rules' } };
68
+ }
69
+ const rules = [];
70
+ for (let i = 0; i < raw.length; i++) {
71
+ const at = `rules[${i}]`;
72
+ const rule = raw[i];
73
+ if (!isPlainObject(rule))
74
+ return { ok: false, message: `tools/observe: ${at} must be an object` };
75
+ for (const key of Object.keys(rule)) {
76
+ if (!RULE_KEYS.has(key))
77
+ return { ok: false, message: `tools/observe: ${at} has unknown member "${key}"` };
78
+ }
79
+ if (!isPlainObject(rule.match))
80
+ return { ok: false, message: `tools/observe: ${at}.match must be an object` };
81
+ const match = {};
82
+ for (const [key, value] of Object.entries(rule.match)) {
83
+ if (!MATCH_KEYS.has(key)) {
84
+ return { ok: false, message: `tools/observe: ${at}.match has unknown member "${key}"` };
85
+ }
86
+ if (key === 'class') {
87
+ if (!isToolClass(value))
88
+ return { ok: false, message: `tools/observe: ${at}.match.class is not a ToolClass` };
89
+ match.class = value;
90
+ continue;
91
+ }
92
+ if (typeof value !== 'string')
93
+ return { ok: false, message: `tools/observe: ${at}.match.${key} must be a string` };
94
+ if (value.length > TOOL_OBSERVE_LIMITS.stringLength) {
95
+ return { ok: false, message: `tools/observe: ${at}.match.${key} is too long`, data: { limit: 'stringLength' } };
96
+ }
97
+ match[key] = value;
98
+ }
99
+ if (rule.report !== undefined && typeof rule.report !== 'boolean') {
100
+ return { ok: false, message: `tools/observe: ${at}.report must be a boolean` };
101
+ }
102
+ let input = false;
103
+ if (rule.input !== undefined) {
104
+ if (typeof rule.input === 'boolean') {
105
+ input = rule.input;
106
+ }
107
+ else if (Array.isArray(rule.input)) {
108
+ if (rule.input.length > TOOL_OBSERVE_LIMITS.pathsPerRule) {
109
+ return { ok: false, message: `tools/observe: ${at}.input has too many paths`, data: { limit: 'pathsPerRule' } };
110
+ }
111
+ const paths = [];
112
+ for (const path of rule.input) {
113
+ if (typeof path !== 'string' || path.length === 0) {
114
+ return { ok: false, message: `tools/observe: ${at}.input must hold non-empty strings` };
115
+ }
116
+ if (path.length > TOOL_OBSERVE_LIMITS.stringLength) {
117
+ return { ok: false, message: `tools/observe: ${at}.input path is too long`, data: { limit: 'stringLength' } };
118
+ }
119
+ paths.push(path);
120
+ }
121
+ input = paths;
122
+ }
123
+ else {
124
+ return { ok: false, message: `tools/observe: ${at}.input must be a boolean or an array of field paths` };
125
+ }
126
+ }
127
+ rules.push({ match, report: rule.report !== false, input });
128
+ }
129
+ return { ok: true, rules };
130
+ }
131
+ function anyGlob(patterns, subject) {
132
+ for (const p of patterns)
133
+ if (globMatch(p, subject))
134
+ return true;
135
+ return false;
136
+ }
137
+ const isStringArray = (v) => Array.isArray(v) && v.every((x) => typeof x === 'string');
138
+ /**
139
+ * Every stated key must hold. An unclassed tool never satisfies `classes`.
140
+ * Policy comes from operator config (JSON recipes), so a key of the wrong
141
+ * shape admits NOTHING rather than being read as absent — fail closed.
142
+ */
143
+ function narrowingAdmits(n, call) {
144
+ if (n.tools !== undefined && (!isStringArray(n.tools) || !anyGlob(n.tools, call.tool)))
145
+ return false;
146
+ if (n.classes !== undefined) {
147
+ const classes = n.classes === 'default' ? DEFAULT_INPUT_CLASSES : n.classes;
148
+ if (!Array.isArray(classes) || !call.class.some((c) => classes.includes(c)))
149
+ return false;
150
+ }
151
+ if (n.conversations !== undefined
152
+ && (!isStringArray(n.conversations) || !anyGlob(n.conversations, call.conversationId))) {
153
+ return false;
154
+ }
155
+ return true;
156
+ }
157
+ /**
158
+ * `observe` narrowing: absent means no narrowing (the grant is enough). A
159
+ * value that is not a narrowing object (`false`, `null`, a string) admits
160
+ * nothing: a setting that looks like "off" must never read as "everything".
161
+ */
162
+ export function observeAdmits(config, call) {
163
+ const n = config?.observe;
164
+ if (n === undefined)
165
+ return true;
166
+ if (!isPlainObject(n))
167
+ return false;
168
+ return narrowingAdmits(n, call);
169
+ }
170
+ /**
171
+ * Does `inputs` narrowing say this call has no tool/class term at all? Such
172
+ * an entry is unconditional and therefore treated as narrowed to NO tools
173
+ * (RFC-007 §4.3 — the widest form is not producible by omission).
174
+ */
175
+ export function inputsNarrowingIsUnconditional(n) {
176
+ if (!isPlainObject(n))
177
+ return true;
178
+ const hasTools = Array.isArray(n.tools) && n.tools.length > 0;
179
+ const hasClasses = n.classes === 'default' || (Array.isArray(n.classes) && n.classes.length > 0);
180
+ return !hasTools && !hasClasses;
181
+ }
182
+ /** Class exclusions that no narrowing overrides (RFC-007 §4.3, §5.4). */
183
+ export function inputsExcludedByClass(call) {
184
+ return call.class.length === 0 || call.class.includes('comms');
185
+ }
186
+ export function inputsAdmit(config, call) {
187
+ const n = config?.inputs;
188
+ if (inputsNarrowingIsUnconditional(n))
189
+ return false;
190
+ if (inputsExcludedByClass(call))
191
+ return false;
192
+ return narrowingAdmits(n, call);
193
+ }
194
+ export function ruleMatches(match, call) {
195
+ if (match.tool !== undefined && !globMatch(match.tool, call.tool))
196
+ return false;
197
+ if (match.serverTool !== undefined && (call.serverTool === undefined || !globMatch(match.serverTool, call.serverTool))) {
198
+ return false;
199
+ }
200
+ if (match.serverId !== undefined && (call.serverId === undefined || !globMatch(match.serverId, call.serverId))) {
201
+ return false;
202
+ }
203
+ if (match.conversationId !== undefined && !globMatch(match.conversationId, call.conversationId))
204
+ return false;
205
+ if (match.class !== undefined && !call.class.includes(match.class))
206
+ return false;
207
+ return true;
208
+ }
209
+ // ============================================================================
210
+ // Arguments: field selection and bounding (RFC-007 §5.2, §6.3)
211
+ // ============================================================================
212
+ const hasOwn = (o, k) => Object.prototype.hasOwnProperty.call(o, k);
213
+ function cloneJson(value) {
214
+ return JSON.parse(JSON.stringify(value));
215
+ }
216
+ /**
217
+ * Select field paths from an arguments object. `.` descends into nested
218
+ * objects; a path ending on an object or array selects it whole; a path that
219
+ * passes through a non-object or names a missing member selects nothing.
220
+ * Selected members keep their place in the structure. Only OWN properties
221
+ * are read and the output is built from null-prototype objects, so a path
222
+ * like `__proto__.x` can neither read nor write a prototype.
223
+ */
224
+ export function selectFields(input, paths) {
225
+ const out = Object.create(null);
226
+ for (const path of paths) {
227
+ const segs = path.split('.');
228
+ let src = input;
229
+ let found = true;
230
+ for (const seg of segs) {
231
+ if (!isPlainObject(src) || !hasOwn(src, seg)) {
232
+ found = false;
233
+ break;
234
+ }
235
+ src = src[seg];
236
+ }
237
+ if (!found || src === undefined)
238
+ continue;
239
+ let dst = out;
240
+ for (let i = 0; i < segs.length - 1; i++) {
241
+ const seg = segs[i];
242
+ const next = hasOwn(dst, seg) ? dst[seg] : undefined;
243
+ if (!isPlainObject(next)) {
244
+ const fresh = Object.create(null);
245
+ dst[seg] = fresh;
246
+ dst = fresh;
247
+ }
248
+ else {
249
+ dst = next;
250
+ }
251
+ }
252
+ dst[segs[segs.length - 1]] = cloneJson(src);
253
+ }
254
+ // Round-trip to ordinary objects: the wire form is JSON either way, and
255
+ // callers comparing with deepEqual expect Object prototypes.
256
+ return JSON.parse(JSON.stringify(out));
257
+ }
258
+ const byteLength = (value) => Buffer.byteLength(JSON.stringify(value), 'utf8');
259
+ /** Walk an object tree and collect every string leaf with its holder. */
260
+ function collectStrings(root) {
261
+ const out = [];
262
+ const visit = (node) => {
263
+ if (Array.isArray(node)) {
264
+ node.forEach((v, i) => {
265
+ if (typeof v === 'string')
266
+ out.push({ holder: node, key: i, length: v.length });
267
+ else
268
+ visit(v);
269
+ });
270
+ }
271
+ else if (isPlainObject(node)) {
272
+ for (const [k, v] of Object.entries(node)) {
273
+ if (typeof v === 'string')
274
+ out.push({ holder: node, key: k, length: v.length });
275
+ else
276
+ visit(v);
277
+ }
278
+ }
279
+ };
280
+ visit(root);
281
+ return out;
282
+ }
283
+ /** Cut a string to a prefix of at most `length` code units without leaving
284
+ * half a surrogate pair at the end. */
285
+ function prefixOf(s, length) {
286
+ let cut = s.slice(0, Math.max(0, length));
287
+ const last = cut.charCodeAt(cut.length - 1);
288
+ if (last >= 0xd800 && last <= 0xdbff)
289
+ cut = cut.slice(0, -1);
290
+ return cut;
291
+ }
292
+ /**
293
+ * Bound `value` to `maxBytes` of serialized JSON (RFC-007 §5.2): first by
294
+ * replacing the longest strings with prefixes of themselves, then by removing
295
+ * the largest members. The result is always a JSON object. Returns null when
296
+ * nothing meaningful fits — the caller withholds instead.
297
+ */
298
+ export function boundInput(value, maxBytes) {
299
+ if (byteLength(value) <= maxBytes)
300
+ return { value, altered: false };
301
+ const clone = cloneJson(value);
302
+ const MIN_STRING = 32;
303
+ for (let guard = 0; guard < 256; guard++) {
304
+ const over = byteLength(clone) - maxBytes;
305
+ if (over <= 0)
306
+ return { value: clone, altered: true };
307
+ const strings = collectStrings(clone).filter((s) => s.length > MIN_STRING);
308
+ if (strings.length === 0)
309
+ break;
310
+ strings.sort((a, b) => b.length - a.length);
311
+ const longest = strings[0];
312
+ const current = longest.holder[longest.key];
313
+ const target = Math.max(MIN_STRING, Math.min(Math.floor(current.length / 2), current.length - over));
314
+ longest.holder[longest.key] = prefixOf(current, target);
315
+ }
316
+ // Still over: remove top-level members, largest first, in ONE pass (sizes
317
+ // measured once; a running estimate decides when to stop). A member that
318
+ // is itself a huge nested structure goes whole — what remains must be
319
+ // meaningful, or the caller withholds.
320
+ let total = byteLength(clone);
321
+ const members = Object.keys(clone)
322
+ .map((key) => ({ key, size: byteLength(key) + 1 + byteLength(clone[key]) + 1 }))
323
+ .sort((a, b) => b.size - a.size);
324
+ for (const { key, size } of members) {
325
+ if (total <= maxBytes)
326
+ break;
327
+ delete clone[key];
328
+ total -= size;
329
+ }
330
+ return byteLength(clone) <= maxBytes && Object.keys(clone).length > 0 ? { value: clone, altered: true } : null;
331
+ }
332
+ function baseParams(call, phase) {
333
+ return {
334
+ toolCallId: call.toolCallId,
335
+ inferenceId: call.inferenceId,
336
+ conversationId: call.conversationId,
337
+ tool: call.tool,
338
+ class: [...call.class],
339
+ ...(call.serverId !== undefined ? { serverId: call.serverId, serverTool: call.serverTool } : {}),
340
+ phase,
341
+ };
342
+ }
343
+ /**
344
+ * The opening notification (`pending` or `started`) this connection should
345
+ * receive for `call`, or null when it receives nothing. Steps 1–5 of
346
+ * RFC-007 §6.4.
347
+ */
348
+ export function openingFor(observer, config, call, phase) {
349
+ const grant = CapabilityGrant.of(observer);
350
+ if (!grant.has(TOOL_LIFECYCLE_OBSERVE))
351
+ return null;
352
+ // A connection's own tools: it already sees the call as tools/call (§7.1).
353
+ if (call.serverId !== undefined && call.serverId === observer.id)
354
+ return null;
355
+ if (!observeAdmits(config, call))
356
+ return null;
357
+ const filter = observer.toolObserveFilter ?? null;
358
+ let requested = false; // no filter → metadata only (§5.1)
359
+ if (filter) {
360
+ const rule = filter.find((r) => ruleMatches(r.match, call));
361
+ if (!rule || !rule.report)
362
+ return null;
363
+ requested = rule.input;
364
+ }
365
+ const params = baseParams(call, phase);
366
+ if (phase !== 'started' || requested === false)
367
+ return params;
368
+ // Arguments were requested. Without the inputs grant the server learns
369
+ // nothing more (no inputWithheld — §5.1).
370
+ if (!grant.has(TOOL_LIFECYCLE_INPUTS))
371
+ return params;
372
+ if (!inputsAdmit(config, call)) {
373
+ params.inputWithheld = true;
374
+ return params;
375
+ }
376
+ const args = isPlainObject(call.input) ? call.input : {};
377
+ const selected = requested === true ? cloneJson(args) : selectFields(args, requested);
378
+ const bounded = boundInput(selected, config?.maxInputBytes ?? DEFAULT_MAX_INPUT_BYTES);
379
+ if (!bounded) {
380
+ params.inputWithheld = true;
381
+ return params;
382
+ }
383
+ params.input = bounded.value;
384
+ if (bounded.altered)
385
+ params.inputAltered = true;
386
+ return params;
387
+ }
388
+ /** Does this connection still get the terminal for a call it was opened to? */
389
+ export function terminalStillAllowed(observer, config, call) {
390
+ return CapabilityGrant.of(observer).has(TOOL_LIFECYCLE_OBSERVE) && observeAdmits(config, call);
391
+ }
392
+ /**
393
+ * Provider identifiers trusted as unique (RFC-007 §3 rev 3: reuse the
394
+ * model's id only where the provider guarantees it). Anthropic `tool_use`
395
+ * ids are random and at least this long; everything else — per-response
396
+ * counters like `call_0`, other providers' formats — is minted over.
397
+ */
398
+ const PROVIDER_UNIQUE_ID = /^toolu_[A-Za-z0-9]{20,}$/;
399
+ const RECENT_ID_WINDOW = 8192;
400
+ const callKey = (agentName, callId) => `${agentName}\u0000${callId}`;
401
+ export class ToolLifecycleEmitter {
402
+ host;
403
+ now;
404
+ /** Opened calls awaiting their terminal, keyed by (agent, model call id). */
405
+ calls = new Map();
406
+ recentIds = new Set();
407
+ recentOrder = [];
408
+ mintSeq = 0;
409
+ constructor(host, now = Date.now) {
410
+ this.host = host;
411
+ this.now = now;
412
+ }
413
+ /** Nothing observes: skip all work on the hot path. */
414
+ anyObserver() {
415
+ for (const o of this.host.observers()) {
416
+ if (CapabilityGrant.of(o).has(TOOL_LIFECYCLE_OBSERVE))
417
+ return true;
418
+ }
419
+ return false;
420
+ }
421
+ /**
422
+ * A host-unique id for a call (RFC-007 §3): the model's own only where the
423
+ * provider guarantees it unique and it was not reported recently; minted
424
+ * otherwise. Minted ids carry a per-process counter, so they never repeat.
425
+ */
426
+ hostCallId(modelCallId) {
427
+ let id = modelCallId;
428
+ if (!PROVIDER_UNIQUE_ID.test(id) || this.recentIds.has(id)) {
429
+ id = `${modelCallId}~h${(++this.mintSeq).toString(36)}`;
430
+ }
431
+ this.recentIds.add(id);
432
+ this.recentOrder.push(id);
433
+ if (this.recentOrder.length > RECENT_ID_WINDOW) {
434
+ this.recentIds.delete(this.recentOrder.shift());
435
+ }
436
+ return id;
437
+ }
438
+ /**
439
+ * A model-issued call is about to be dispatched. Recorded, keyed by
440
+ * (agent, model call id) — never matched through the trace stream, so two
441
+ * agents' identical short ids cannot cross — but nothing is sent yet: the
442
+ * host may still refuse it (refuse()) before it executes.
443
+ */
444
+ register(agentName, inferenceId, call) {
445
+ if (!this.anyObserver())
446
+ return;
447
+ const described = this.host.describe(call.name);
448
+ this.calls.set(callKey(agentName, call.id), {
449
+ agentName,
450
+ modelCallId: call.id,
451
+ call: {
452
+ toolCallId: this.hostCallId(call.id),
453
+ inferenceId,
454
+ conversationId: agentName,
455
+ tool: call.name,
456
+ class: described.class,
457
+ ...(described.serverId !== undefined
458
+ ? { serverId: described.serverId, serverTool: described.serverTool }
459
+ : {}),
460
+ input: call.input,
461
+ },
462
+ openedTo: new Map(),
463
+ opened: false,
464
+ // Taken before dispatch, so durationMs includes work a synchronous
465
+ // tool does inside dispatch (its `started` is sent only after).
466
+ startedAt: this.now(),
467
+ failed: false,
468
+ });
469
+ }
470
+ /**
471
+ * The host refused the call before executing it — its provider is gone,
472
+ * host tool policy denies it, a conversation-bound agent reached outside
473
+ * its channel. Called from the refusal site itself, synchronously within
474
+ * dispatch, so the call is forgotten before open() would send anything:
475
+ * a refused call produces no events (RFC-007 §3).
476
+ */
477
+ refuse(agentName, callId) {
478
+ const key = callKey(agentName, callId);
479
+ const tracked = this.calls.get(key);
480
+ if (tracked && !tracked.opened)
481
+ this.calls.delete(key);
482
+ }
483
+ /**
484
+ * Dispatch returned and the call was not refused: execution has begun.
485
+ * Send `started` to every connection that should see it. Refusal sites
486
+ * run synchronously inside dispatch, before this.
487
+ */
488
+ open(agentName, callId) {
489
+ const key = callKey(agentName, callId);
490
+ const tracked = this.calls.get(key);
491
+ if (!tracked || tracked.opened)
492
+ return;
493
+ tracked.opened = true;
494
+ for (const observer of this.host.observers()) {
495
+ let params;
496
+ try {
497
+ params = openingFor(observer, this.host.configFor(observer.id), tracked.call, 'started');
498
+ }
499
+ catch (err) {
500
+ console.error(`[mcpl] ${observer.id}: tools/lifecycle decision failed: ${err.message}`);
501
+ continue;
502
+ }
503
+ if (!params)
504
+ continue;
505
+ try {
506
+ observer.sendToolLifecycle(params);
507
+ tracked.openedTo.set(observer.id, observer.transportEpoch ?? 0);
508
+ }
509
+ catch {
510
+ /* best-effort */
511
+ }
512
+ }
513
+ // Nobody received an opening, so nobody is owed a terminal.
514
+ if (tracked.openedTo.size === 0)
515
+ this.calls.delete(key);
516
+ }
517
+ /**
518
+ * The host could not obtain a result for this call (its dispatch threw,
519
+ * the provider's transport failed, the request timed out). Its terminal
520
+ * will be `failed`. An error RESULT returned by the tool is not this: it
521
+ * is `completed` with `isError` (RFC-007 §3).
522
+ */
523
+ markDispatchFailure(agentName, callId) {
524
+ const tracked = this.calls.get(callKey(agentName, callId));
525
+ if (tracked)
526
+ tracked.failed = true;
527
+ }
528
+ terminate(tracked, phase, isError) {
529
+ this.calls.delete(callKey(tracked.agentName, tracked.modelCallId));
530
+ const durationMs = Math.max(0, this.now() - tracked.startedAt);
531
+ for (const observer of this.host.observers()) {
532
+ const epoch = tracked.openedTo.get(observer.id);
533
+ // Only the transport epoch the opening went to: a reconnected observer
534
+ // never receives a terminal for an opening it did not see (§7.3).
535
+ if (epoch === undefined || epoch !== (observer.transportEpoch ?? 0))
536
+ continue;
537
+ if (!terminalStillAllowed(observer, this.host.configFor(observer.id), tracked.call))
538
+ continue;
539
+ const params = baseParams(tracked.call, phase);
540
+ if (phase === 'completed')
541
+ params.isError = !!isError;
542
+ params.durationMs = durationMs;
543
+ try {
544
+ observer.sendToolLifecycle(params);
545
+ }
546
+ catch {
547
+ /* best-effort */
548
+ }
549
+ }
550
+ }
551
+ /** A tool result reached the host: the call's terminal. */
552
+ onResult(agentName, callId, result) {
553
+ if (this.calls.size === 0)
554
+ return;
555
+ const tracked = this.calls.get(callKey(agentName, callId));
556
+ if (!tracked)
557
+ return;
558
+ if (!tracked.opened) {
559
+ // Never opened (a path that bypassed open()): nothing was sent.
560
+ this.calls.delete(callKey(agentName, callId));
561
+ return;
562
+ }
563
+ if (tracked.failed)
564
+ this.terminate(tracked, 'failed');
565
+ else
566
+ this.terminate(tracked, 'completed', result?.isError === true || result?.success === false);
567
+ }
568
+ /**
569
+ * A stream ended: its calls still open were cancelled before a result.
570
+ * Scoped to the inference ids that stream minted, so a successor stream
571
+ * for the same agent (a budget restart overlapping this one's teardown)
572
+ * keeps its live calls. A result arriving later finds nothing.
573
+ */
574
+ abortOpen(agentName, inferenceIds) {
575
+ if (this.calls.size === 0)
576
+ return;
577
+ const ids = new Set(inferenceIds);
578
+ for (const tracked of [...this.calls.values()]) {
579
+ if (tracked.agentName === agentName && ids.has(tracked.call.inferenceId)) {
580
+ if (tracked.opened)
581
+ this.terminate(tracked, 'aborted');
582
+ else
583
+ this.calls.delete(callKey(tracked.agentName, tracked.modelCallId));
584
+ }
585
+ }
586
+ }
587
+ /** For tests and diagnostics. */
588
+ get openCount() {
589
+ return this.calls.size;
590
+ }
591
+ }
592
+ //# sourceMappingURL=tool-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-lifecycle.js","sourceRoot":"","sources":["../../../src/mcpl/tool-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -55,6 +55,18 @@ export declare abstract class McplTransport extends EventEmitter {
55
55
  /** Close the transport and release resources. Resolves once fully closed. */
56
56
  abstract close(): Promise<void>;
57
57
  }
58
+ /**
59
+ * Host variables a stdio child gets by default: just enough for an ordinary
60
+ * process to run (find binaries, a home dir, temp dir, locale, TLS roots,
61
+ * a display for GUI helpers). Everything else in the host env — notably API
62
+ * keys and bot tokens — is NOT passed on; a server that needs a variable must
63
+ * declare it in its `env` (recipes can `${VAR}`-substitute from .env), or set
64
+ * `inheritEnv: true` to get the whole host env as before.
65
+ */
66
+ export declare const CHILD_ENV_ALLOWLIST: string[];
67
+ /** Environment for a stdio child: allowlisted host vars (+ LC_*), then the
68
+ * server's declared `env` on top. `inheritEnv: true` restores full inheritance. */
69
+ export declare function buildChildEnv(config: Pick<McplServerConfig, 'env' | 'inheritEnv'>, hostEnv?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
58
70
  export declare class StdioTransport extends McplTransport {
59
71
  private readonly child;
60
72
  private readonly rl;
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/mcpl/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;4EAC4E;AAC5E,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,8BAAsB,aAAc,SAAQ,YAAY;IACtD,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,CAAC;IAE9C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,YAAY,CAAgB;IAEpC,SAAS;IAgBT,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,wEAAwE;IACxE,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKtC,0EAA0E;IAC1E,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKxC,iCAAiC;IACjC,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAMpD,oDAAoD;IACpD,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAEtC,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAChC;AAMD,qBAAa,cAAe,SAAQ,aAAa;IAI7C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,EAAE;IAJrB,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IAEjC,OAAO;IAuBP;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,gBAAgB,GAAG,cAAc;IActD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAc7B;AASD,qBAAa,kBAAmB,SAAQ,aAAa;IAG/B,OAAO,CAAC,QAAQ,CAAC,EAAE;IAFvC,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;IAErC,OAAO;IAmBP;;;;OAIG;WACU,IAAI,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA8DxE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB7B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAoBjG;AAMD;qCACqC;AACrC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAItE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CAKpF"}
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/mcpl/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;4EAC4E;AAC5E,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,8BAAsB,aAAc,SAAQ,YAAY;IACtD,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,CAAC;IAE9C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,YAAY,CAAgB;IAEpC,SAAS;IAgBT,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,wEAAwE;IACxE,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKtC,0EAA0E;IAC1E,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKxC,iCAAiC;IACjC,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAMpD,oDAAoD;IACpD,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAEtC,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAChC;AAMD;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,UAS/B,CAAC;AAEF;oFACoF;AACpF,wBAAgB,aAAa,CAC3B,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,YAAY,CAAC,EACpD,OAAO,GAAE,MAAM,CAAC,UAAwB,GACvC,MAAM,CAAC,UAAU,CAQnB;AAED,qBAAa,cAAe,SAAQ,aAAa;IAI7C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,EAAE;IAJrB,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IAEjC,OAAO;IAuBP;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,gBAAgB,GAAG,cAAc;IActD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAc7B;AASD,qBAAa,kBAAmB,SAAQ,aAAa;IAG/B,OAAO,CAAC,QAAQ,CAAC,EAAE;IAFvC,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;IAErC,OAAO;IAmBP;;;;OAIG;WACU,IAAI,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA8DxE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB7B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAoBjG;AAMD;qCACqC;AACrC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAItE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CAKpF"}