wu-framework 1.2.1 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/LICENSE +39 -39
  2. package/README.md +570 -489
  3. package/dist/adapters/alpine/index.js +2 -0
  4. package/dist/adapters/alpine/index.js.map +1 -0
  5. package/{src → dist}/adapters/angular/index.d.ts +154 -154
  6. package/dist/adapters/angular/index.js +2 -0
  7. package/dist/adapters/angular/index.js.map +1 -0
  8. package/{src → dist}/adapters/angular.d.ts +3 -3
  9. package/dist/adapters/htmx/index.js +2 -0
  10. package/dist/adapters/htmx/index.js.map +1 -0
  11. package/dist/adapters/index.js +2 -0
  12. package/dist/adapters/index.js.map +1 -0
  13. package/{src → dist}/adapters/lit/index.d.ts +120 -120
  14. package/dist/adapters/lit/index.js +44 -0
  15. package/dist/adapters/lit/index.js.map +1 -0
  16. package/{src → dist}/adapters/lit.d.ts +3 -3
  17. package/{src → dist}/adapters/preact/index.d.ts +108 -108
  18. package/dist/adapters/preact/index.js +2 -0
  19. package/dist/adapters/preact/index.js.map +1 -0
  20. package/{src → dist}/adapters/preact.d.ts +3 -3
  21. package/dist/adapters/qwik/index.js +2 -0
  22. package/dist/adapters/qwik/index.js.map +1 -0
  23. package/{src → dist}/adapters/react/index.d.ts +246 -246
  24. package/dist/adapters/react/index.js +2 -0
  25. package/dist/adapters/react/index.js.map +1 -0
  26. package/{src → dist}/adapters/react.d.ts +3 -3
  27. package/dist/adapters/shared.js +2 -0
  28. package/dist/adapters/shared.js.map +1 -0
  29. package/{src → dist}/adapters/solid/index.d.ts +101 -101
  30. package/dist/adapters/solid/index.js +2 -0
  31. package/dist/adapters/solid/index.js.map +1 -0
  32. package/{src → dist}/adapters/solid.d.ts +3 -3
  33. package/dist/adapters/stencil/index.js +2 -0
  34. package/dist/adapters/stencil/index.js.map +1 -0
  35. package/dist/adapters/stimulus/index.js +2 -0
  36. package/dist/adapters/stimulus/index.js.map +1 -0
  37. package/{src → dist}/adapters/svelte/index.d.ts +166 -166
  38. package/dist/adapters/svelte/index.js +2 -0
  39. package/dist/adapters/svelte/index.js.map +1 -0
  40. package/{src → dist}/adapters/svelte.d.ts +3 -3
  41. package/{src → dist}/adapters/vanilla/index.d.ts +179 -179
  42. package/dist/adapters/vanilla/index.js +2 -0
  43. package/dist/adapters/vanilla/index.js.map +1 -0
  44. package/{src → dist}/adapters/vanilla.d.ts +3 -3
  45. package/{src → dist}/adapters/vue/index.d.ts +299 -299
  46. package/dist/adapters/vue/index.js +2 -0
  47. package/dist/adapters/vue/index.js.map +1 -0
  48. package/{src → dist}/adapters/vue.d.ts +3 -3
  49. package/dist/ai/wu-ai.js +2 -0
  50. package/dist/ai/wu-ai.js.map +1 -0
  51. package/dist/core/wu-html-parser.js +2 -0
  52. package/dist/core/wu-html-parser.js.map +1 -0
  53. package/dist/core/wu-iframe-sandbox.js +2 -0
  54. package/dist/core/wu-iframe-sandbox.js.map +1 -0
  55. package/dist/core/wu-loader.js +2 -0
  56. package/dist/core/wu-loader.js.map +1 -0
  57. package/dist/core/wu-mcp-bridge.js +2 -0
  58. package/dist/core/wu-mcp-bridge.js.map +1 -0
  59. package/dist/core/wu-script-executor.js +2 -0
  60. package/dist/core/wu-script-executor.js.map +1 -0
  61. package/{src → dist}/index.d.ts +445 -317
  62. package/dist/wu-ai-browser-primitives-BDKXJlwc.js +2 -0
  63. package/dist/wu-ai-browser-primitives-BDKXJlwc.js.map +1 -0
  64. package/dist/wu-framework.cjs.js +2 -2
  65. package/dist/wu-framework.cjs.js.map +1 -1
  66. package/dist/wu-framework.dev.js +8681 -15683
  67. package/dist/wu-framework.dev.js.map +1 -1
  68. package/dist/wu-framework.esm.js +2 -2
  69. package/dist/wu-framework.esm.js.map +1 -1
  70. package/dist/wu-framework.umd.js +2 -2
  71. package/dist/wu-framework.umd.js.map +1 -1
  72. package/dist/wu-logger-fJfUHBGA.js +2 -0
  73. package/dist/wu-logger-fJfUHBGA.js.map +1 -0
  74. package/integrations/astro/README.md +127 -127
  75. package/integrations/astro/WuApp.astro +63 -63
  76. package/integrations/astro/WuShell.astro +39 -39
  77. package/integrations/astro/index.js +68 -68
  78. package/integrations/astro/package.json +38 -38
  79. package/integrations/astro/types.d.ts +53 -53
  80. package/package.json +218 -209
  81. package/src/adapters/alpine/index.js +0 -231
  82. package/src/adapters/alpine.js +0 -3
  83. package/src/adapters/angular/ai.js +0 -30
  84. package/src/adapters/angular/index.js +0 -932
  85. package/src/adapters/angular.js +0 -3
  86. package/src/adapters/htmx/index.js +0 -242
  87. package/src/adapters/htmx.js +0 -3
  88. package/src/adapters/index.js +0 -225
  89. package/src/adapters/lit/ai.js +0 -20
  90. package/src/adapters/lit/index.js +0 -721
  91. package/src/adapters/lit.js +0 -3
  92. package/src/adapters/preact/ai.js +0 -33
  93. package/src/adapters/preact/index.js +0 -661
  94. package/src/adapters/preact.js +0 -3
  95. package/src/adapters/qwik/index.js +0 -108
  96. package/src/adapters/qwik.js +0 -3
  97. package/src/adapters/react/ai.js +0 -135
  98. package/src/adapters/react/index.js +0 -695
  99. package/src/adapters/react.js +0 -3
  100. package/src/adapters/shared.js +0 -64
  101. package/src/adapters/solid/ai.js +0 -32
  102. package/src/adapters/solid/index.js +0 -586
  103. package/src/adapters/solid.js +0 -3
  104. package/src/adapters/stencil/index.js +0 -228
  105. package/src/adapters/stencil.js +0 -3
  106. package/src/adapters/stimulus/index.js +0 -255
  107. package/src/adapters/stimulus.js +0 -3
  108. package/src/adapters/svelte/ai.js +0 -31
  109. package/src/adapters/svelte/index.js +0 -798
  110. package/src/adapters/svelte.js +0 -3
  111. package/src/adapters/vanilla/ai.js +0 -30
  112. package/src/adapters/vanilla/index.js +0 -785
  113. package/src/adapters/vanilla.js +0 -3
  114. package/src/adapters/vue/ai.js +0 -52
  115. package/src/adapters/vue/index.js +0 -618
  116. package/src/adapters/vue.js +0 -3
  117. package/src/ai/wu-ai-actions.js +0 -261
  118. package/src/ai/wu-ai-agent.js +0 -546
  119. package/src/ai/wu-ai-browser-primitives.js +0 -354
  120. package/src/ai/wu-ai-browser.js +0 -380
  121. package/src/ai/wu-ai-context.js +0 -332
  122. package/src/ai/wu-ai-conversation.js +0 -613
  123. package/src/ai/wu-ai-orchestrate.js +0 -1021
  124. package/src/ai/wu-ai-permissions.js +0 -381
  125. package/src/ai/wu-ai-provider.js +0 -700
  126. package/src/ai/wu-ai-schema.js +0 -225
  127. package/src/ai/wu-ai-triggers.js +0 -396
  128. package/src/ai/wu-ai.js +0 -804
  129. package/src/core/wu-app.js +0 -236
  130. package/src/core/wu-cache.js +0 -498
  131. package/src/core/wu-core.js +0 -1412
  132. package/src/core/wu-error-boundary.js +0 -396
  133. package/src/core/wu-event-bus.js +0 -390
  134. package/src/core/wu-hooks.js +0 -350
  135. package/src/core/wu-html-parser.js +0 -199
  136. package/src/core/wu-iframe-sandbox.js +0 -328
  137. package/src/core/wu-loader.js +0 -450
  138. package/src/core/wu-logger.js +0 -143
  139. package/src/core/wu-manifest.js +0 -533
  140. package/src/core/wu-mcp-bridge.js +0 -432
  141. package/src/core/wu-overrides.js +0 -510
  142. package/src/core/wu-performance.js +0 -228
  143. package/src/core/wu-plugin.js +0 -401
  144. package/src/core/wu-prefetch.js +0 -414
  145. package/src/core/wu-proxy-sandbox.js +0 -477
  146. package/src/core/wu-sandbox.js +0 -779
  147. package/src/core/wu-script-executor.js +0 -161
  148. package/src/core/wu-sentinel-client.js +0 -311
  149. package/src/core/wu-snapshot-sandbox.js +0 -227
  150. package/src/core/wu-store.js +0 -307
  151. package/src/core/wu-strategies.js +0 -256
  152. package/src/core/wu-style-bridge.js +0 -477
  153. package/src/index.js +0 -234
  154. package/src/utils/dependency-resolver.js +0 -328
  155. /package/{src → dist}/adapters/alpine/index.d.ts +0 -0
  156. /package/{src → dist}/adapters/alpine.d.ts +0 -0
  157. /package/{src → dist}/adapters/htmx/index.d.ts +0 -0
  158. /package/{src → dist}/adapters/htmx.d.ts +0 -0
  159. /package/{src → dist}/adapters/qwik/index.d.ts +0 -0
  160. /package/{src → dist}/adapters/qwik.d.ts +0 -0
  161. /package/{src → dist}/adapters/stencil/index.d.ts +0 -0
  162. /package/{src → dist}/adapters/stencil.d.ts +0 -0
  163. /package/{src → dist}/adapters/stimulus/index.d.ts +0 -0
  164. /package/{src → dist}/adapters/stimulus.d.ts +0 -0
@@ -1,332 +0,0 @@
1
- /**
2
- * WU-AI-CONTEXT: Automatic context collector for LLMs
3
- *
4
- * Collects state from wu.store, wu.eventBus, and registered apps.
5
- * Builds a structured context object and system prompt for the LLM.
6
- *
7
- * Key design:
8
- * - ON-DEMAND collection (no polling, zero CPU idle)
9
- * - Token budget with priority (high > medium > low)
10
- * - Sensitive data redaction
11
- * - System prompt generation
12
- */
13
-
14
- import { logger } from '../core/wu-logger.js';
15
- import { redactSensitive, estimateTokens, truncateToTokenBudget } from './wu-ai-schema.js';
16
-
17
- // ─── Context Source Config ───────────────────────────────────────
18
- //
19
- // store: { include: ['user.*', 'cart.*'], priority: 'high' }
20
- // events: { include: ['cart:*', 'user:*'], lastN: 10, priority: 'medium' }
21
- // custom: [{ key: 'appVersion', value: () => '1.0', priority: 'low' }]
22
-
23
- export class WuAIContext {
24
- constructor({ store, eventBus, core }) {
25
- this._store = store;
26
- this._eventBus = eventBus;
27
- this._core = core;
28
-
29
- this._config = {
30
- budget: 4000, // token budget
31
- charRatio: 4, // chars per token estimate
32
- sources: {
33
- store: { include: [], priority: 'high' },
34
- events: { include: [], lastN: 10, priority: 'medium' },
35
- custom: [],
36
- },
37
- };
38
-
39
- this._collectors = new Map(); // name → { collector, priority }
40
- this._lastSnapshot = null;
41
- }
42
-
43
- /**
44
- * Configure context collection.
45
- */
46
- configure(config) {
47
- if (config.budget !== undefined) this._config.budget = config.budget;
48
- if (config.charRatio !== undefined) this._config.charRatio = config.charRatio;
49
- if (config.sources) {
50
- if (config.sources.store) Object.assign(this._config.sources.store, config.sources.store);
51
- if (config.sources.events) Object.assign(this._config.sources.events, config.sources.events);
52
- if (config.sources.custom) this._config.sources.custom = config.sources.custom;
53
- }
54
- }
55
-
56
- /**
57
- * Register a named context collector.
58
- *
59
- * @param {string} name - Collector name (e.g., 'dashboard', 'analytics')
60
- * @param {{ collector: Function, priority?: string }} config
61
- */
62
- register(name, config) {
63
- this._collectors.set(name, {
64
- collector: config.collector,
65
- priority: config.priority || 'medium',
66
- });
67
- logger.wuDebug(`[wu-ai] Context collector registered: '${name}' (${config.priority || 'medium'})`);
68
- }
69
-
70
- /**
71
- * Collect all context ON-DEMAND.
72
- * Called before sending a message to the LLM.
73
- *
74
- * @returns {object} Context snapshot
75
- */
76
- async collect() {
77
- const snapshot = {
78
- _timestamp: Date.now(),
79
- _mountedApps: this._getMountedApps(),
80
- };
81
-
82
- // Collect store sources
83
- const storeData = this._collectStore();
84
- if (storeData && Object.keys(storeData).length > 0) {
85
- snapshot._store = storeData;
86
- }
87
-
88
- // Collect recent events
89
- const events = this._collectEvents();
90
- if (events.length > 0) {
91
- snapshot._events = events;
92
- }
93
-
94
- // Collect custom sources
95
- for (const custom of this._config.sources.custom) {
96
- try {
97
- const value = typeof custom.value === 'function' ? await custom.value() : custom.value;
98
- snapshot[custom.key] = value;
99
- } catch (err) {
100
- logger.wuDebug(`[wu-ai] Custom collector '${custom.key}' failed: ${err.message}`);
101
- }
102
- }
103
-
104
- // Collect registered collectors
105
- for (const [name, config] of this._collectors) {
106
- try {
107
- const data = await config.collector();
108
- snapshot[name] = data;
109
- } catch (err) {
110
- logger.wuDebug(`[wu-ai] Collector '${name}' failed: ${err.message}`);
111
- }
112
- }
113
-
114
- this._lastSnapshot = snapshot;
115
- return snapshot;
116
- }
117
-
118
- /**
119
- * Build a system prompt from the context for the LLM.
120
- *
121
- * @param {{ tools?: Array }} [options] - Available tools to include
122
- * @returns {string} System prompt
123
- */
124
- toSystemPrompt(options = {}) {
125
- const snapshot = this._lastSnapshot;
126
- if (!snapshot) return this._baseSystemPrompt(options);
127
-
128
- const parts = [];
129
-
130
- // Base instruction
131
- parts.push(
132
- 'You are an AI assistant connected to a live web application via Wu Framework.',
133
- 'You can observe application state and execute actions when appropriate.',
134
- ''
135
- );
136
-
137
- // Mounted apps (always included)
138
- if (snapshot._mountedApps?.length) {
139
- parts.push(`MOUNTED APPS: ${snapshot._mountedApps.join(', ')}`, '');
140
- }
141
-
142
- // Budget tracking
143
- const budget = this._config.budget;
144
- const charBudget = budget * this._config.charRatio;
145
- let usedChars = parts.join('\n').length;
146
-
147
- // Priority-based inclusion
148
- const prioritized = this._prioritizeSections(snapshot);
149
-
150
- for (const section of prioritized) {
151
- const sectionText = section.text;
152
- if (usedChars + sectionText.length > charBudget) {
153
- // Try to truncate if high priority
154
- if (section.priority === 'high') {
155
- const remaining = charBudget - usedChars;
156
- if (remaining > 100) {
157
- parts.push(sectionText.slice(0, remaining) + '\n...[truncated]');
158
- usedChars += remaining;
159
- }
160
- }
161
- continue; // skip if over budget
162
- }
163
- parts.push(sectionText);
164
- usedChars += sectionText.length;
165
- }
166
-
167
- // Tools (outside budget — LLM needs these)
168
- if (options.tools?.length) {
169
- parts.push('', 'AVAILABLE TOOLS:');
170
- for (const tool of options.tools) {
171
- parts.push(`- ${tool.name}: ${tool.description}`);
172
- }
173
- }
174
-
175
- return parts.join('\n');
176
- }
177
-
178
- /**
179
- * Get the last collected snapshot.
180
- */
181
- getSnapshot() {
182
- return this._lastSnapshot;
183
- }
184
-
185
- /**
186
- * Get a simplified context object for template interpolation.
187
- */
188
- getInterpolationContext() {
189
- if (!this._lastSnapshot) return {};
190
- const { _timestamp, _mountedApps, _store, _events, ...custom } = this._lastSnapshot;
191
- return {
192
- apps: _mountedApps,
193
- store: _store,
194
- events: _events,
195
- ...custom,
196
- };
197
- }
198
-
199
- // ── Private: Data Collection ──
200
-
201
- _collectStore() {
202
- if (!this._store) return {};
203
- const { include } = this._config.sources.store;
204
- if (!include || include.length === 0) return {};
205
-
206
- const data = {};
207
- for (const path of include) {
208
- try {
209
- const value = this._store.get(path);
210
- if (value !== undefined) {
211
- data[path] = redactSensitive(value);
212
- }
213
- } catch {
214
- // Path doesn't exist, skip
215
- }
216
- }
217
- return data;
218
- }
219
-
220
- _collectEvents() {
221
- if (!this._eventBus) return [];
222
- const { include, lastN } = this._config.sources.events;
223
- if (!include || include.length === 0) return [];
224
-
225
- const history = this._eventBus.history || [];
226
- const matching = history.filter(event => {
227
- return include.some(pattern => this._matchPattern(event.name || event.event, pattern));
228
- });
229
-
230
- return matching.slice(-(lastN || 10)).map(e => ({
231
- event: e.name || e.event,
232
- data: redactSensitive(e.data),
233
- timestamp: e.timestamp,
234
- }));
235
- }
236
-
237
- _getMountedApps() {
238
- if (!this._core) return [];
239
- try {
240
- // WuCore exposes mounted as Map or getStats()
241
- if (this._core.mounted instanceof Map) {
242
- return [...this._core.mounted.keys()];
243
- }
244
- const stats = this._core.getStats?.();
245
- return stats?.apps || stats?.mounted || [];
246
- } catch {
247
- return [];
248
- }
249
- }
250
-
251
- // ── Private: Priority & Budget ──
252
-
253
- _prioritizeSections(snapshot) {
254
- const sections = [];
255
- const storePriority = this._config.sources.store.priority || 'high';
256
- const eventPriority = this._config.sources.events.priority || 'medium';
257
-
258
- // Store snapshot
259
- if (snapshot._store && Object.keys(snapshot._store).length > 0) {
260
- sections.push({
261
- priority: storePriority,
262
- text: `APPLICATION STATE:\n${JSON.stringify(snapshot._store, null, 2)}`,
263
- });
264
- }
265
-
266
- // Recent events
267
- if (snapshot._events?.length) {
268
- const eventLines = snapshot._events.map(e =>
269
- ` [${e.event}] ${JSON.stringify(e.data)}`
270
- ).join('\n');
271
- sections.push({
272
- priority: eventPriority,
273
- text: `RECENT EVENTS:\n${eventLines}`,
274
- });
275
- }
276
-
277
- // Custom collectors
278
- for (const [name, config] of this._collectors) {
279
- if (snapshot[name] !== undefined) {
280
- sections.push({
281
- priority: config.priority,
282
- text: `${name.toUpperCase()}:\n${JSON.stringify(snapshot[name], null, 2)}`,
283
- });
284
- }
285
- }
286
-
287
- // Custom sources
288
- for (const custom of this._config.sources.custom) {
289
- if (snapshot[custom.key] !== undefined) {
290
- sections.push({
291
- priority: custom.priority || 'low',
292
- text: `${custom.key}: ${JSON.stringify(snapshot[custom.key])}`,
293
- });
294
- }
295
- }
296
-
297
- // Sort: high → medium → low
298
- const order = { high: 0, medium: 1, low: 2 };
299
- sections.sort((a, b) => (order[a.priority] ?? 1) - (order[b.priority] ?? 1));
300
-
301
- return sections;
302
- }
303
-
304
- _baseSystemPrompt(options = {}) {
305
- let prompt = 'You are an AI assistant connected to a web application via Wu Framework.';
306
- if (options.tools?.length) {
307
- prompt += '\n\nAVAILABLE TOOLS:\n' + options.tools.map(t => `- ${t.name}: ${t.description}`).join('\n');
308
- }
309
- return prompt;
310
- }
311
-
312
- // ── Pattern Matching (reuse wu-framework convention) ──
313
-
314
- _matchPattern(eventName, pattern) {
315
- if (!eventName || !pattern) return false;
316
- if (pattern === '*') return true;
317
- if (!pattern.includes('*')) return eventName === pattern;
318
-
319
- const regex = new RegExp('^' + pattern.replace(/\*/g, '[^:]*') + '$');
320
- return regex.test(eventName);
321
- }
322
-
323
- getStats() {
324
- return {
325
- budget: this._config.budget,
326
- collectors: [...this._collectors.keys()],
327
- storePaths: this._config.sources.store.include,
328
- eventPatterns: this._config.sources.events.include,
329
- lastCollected: this._lastSnapshot?._timestamp || null,
330
- };
331
- }
332
- }