@luckydraw/cumulus 0.27.41 → 0.28.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 (99) hide show
  1. package/dist/gateway/adapters/webchat.d.ts +5 -7
  2. package/dist/gateway/adapters/webchat.d.ts.map +1 -1
  3. package/dist/gateway/adapters/webchat.js +204 -57
  4. package/dist/gateway/adapters/webchat.js.map +1 -1
  5. package/dist/gateway/config.d.ts +48 -0
  6. package/dist/gateway/config.d.ts.map +1 -1
  7. package/dist/gateway/config.js +90 -0
  8. package/dist/gateway/config.js.map +1 -1
  9. package/dist/gateway/daemon.d.ts.map +1 -1
  10. package/dist/gateway/daemon.js +272 -28
  11. package/dist/gateway/daemon.js.map +1 -1
  12. package/dist/gateway/gateway-agents-mcp.js +570 -31
  13. package/dist/gateway/gateway-agents-mcp.js.map +1 -1
  14. package/dist/gateway/hooks.d.ts +101 -0
  15. package/dist/gateway/hooks.d.ts.map +1 -0
  16. package/dist/gateway/hooks.js +200 -0
  17. package/dist/gateway/hooks.js.map +1 -0
  18. package/dist/gateway/scheduler.d.ts +50 -0
  19. package/dist/gateway/scheduler.d.ts.map +1 -0
  20. package/dist/gateway/scheduler.js +263 -0
  21. package/dist/gateway/scheduler.js.map +1 -0
  22. package/dist/gateway/server.d.ts +16 -1
  23. package/dist/gateway/server.d.ts.map +1 -1
  24. package/dist/gateway/server.js +451 -22
  25. package/dist/gateway/server.js.map +1 -1
  26. package/dist/gateway/static/blex.min.js +74 -17
  27. package/dist/gateway/static/chat.html +1 -4
  28. package/dist/gateway/static/dashboard.html +151 -0
  29. package/dist/gateway/static/dashboard.js +229 -0
  30. package/dist/gateway/static/widget.js +656 -460
  31. package/dist/index.d.ts +13 -5
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +9 -3
  34. package/dist/index.js.map +1 -1
  35. package/dist/lib/agentic-loop.d.ts +124 -0
  36. package/dist/lib/agentic-loop.d.ts.map +1 -0
  37. package/dist/lib/agentic-loop.js +338 -0
  38. package/dist/lib/agentic-loop.js.map +1 -0
  39. package/dist/lib/config.d.ts +28 -15
  40. package/dist/lib/config.d.ts.map +1 -1
  41. package/dist/lib/config.js +47 -41
  42. package/dist/lib/config.js.map +1 -1
  43. package/dist/lib/gateway.d.ts +34 -3
  44. package/dist/lib/gateway.d.ts.map +1 -1
  45. package/dist/lib/gateway.js +584 -37
  46. package/dist/lib/gateway.js.map +1 -1
  47. package/dist/lib/huggingface-provider.d.ts +26 -0
  48. package/dist/lib/huggingface-provider.d.ts.map +1 -0
  49. package/dist/lib/huggingface-provider.js +338 -0
  50. package/dist/lib/huggingface-provider.js.map +1 -0
  51. package/dist/lib/provider.d.ts +71 -0
  52. package/dist/lib/provider.d.ts.map +1 -0
  53. package/dist/lib/provider.js +90 -0
  54. package/dist/lib/provider.js.map +1 -0
  55. package/dist/lib/tools/ask-user-question.d.ts +14 -0
  56. package/dist/lib/tools/ask-user-question.d.ts.map +1 -0
  57. package/dist/lib/tools/ask-user-question.js +74 -0
  58. package/dist/lib/tools/ask-user-question.js.map +1 -0
  59. package/dist/lib/tools/bash.d.ts +6 -0
  60. package/dist/lib/tools/bash.d.ts.map +1 -0
  61. package/dist/lib/tools/bash.js +85 -0
  62. package/dist/lib/tools/bash.js.map +1 -0
  63. package/dist/lib/tools/edit.d.ts +6 -0
  64. package/dist/lib/tools/edit.d.ts.map +1 -0
  65. package/dist/lib/tools/edit.js +79 -0
  66. package/dist/lib/tools/edit.js.map +1 -0
  67. package/dist/lib/tools/glob.d.ts +6 -0
  68. package/dist/lib/tools/glob.d.ts.map +1 -0
  69. package/dist/lib/tools/glob.js +91 -0
  70. package/dist/lib/tools/glob.js.map +1 -0
  71. package/dist/lib/tools/grep.d.ts +6 -0
  72. package/dist/lib/tools/grep.d.ts.map +1 -0
  73. package/dist/lib/tools/grep.js +110 -0
  74. package/dist/lib/tools/grep.js.map +1 -0
  75. package/dist/lib/tools/index.d.ts +29 -0
  76. package/dist/lib/tools/index.d.ts.map +1 -0
  77. package/dist/lib/tools/index.js +52 -0
  78. package/dist/lib/tools/index.js.map +1 -0
  79. package/dist/lib/tools/read.d.ts +6 -0
  80. package/dist/lib/tools/read.d.ts.map +1 -0
  81. package/dist/lib/tools/read.js +80 -0
  82. package/dist/lib/tools/read.js.map +1 -0
  83. package/dist/lib/tools/tool-search.d.ts +30 -0
  84. package/dist/lib/tools/tool-search.d.ts.map +1 -0
  85. package/dist/lib/tools/tool-search.js +108 -0
  86. package/dist/lib/tools/tool-search.js.map +1 -0
  87. package/dist/lib/tools/web-fetch.d.ts +9 -0
  88. package/dist/lib/tools/web-fetch.d.ts.map +1 -0
  89. package/dist/lib/tools/web-fetch.js +114 -0
  90. package/dist/lib/tools/web-fetch.js.map +1 -0
  91. package/dist/lib/tools/web-search.d.ts +12 -0
  92. package/dist/lib/tools/web-search.d.ts.map +1 -0
  93. package/dist/lib/tools/web-search.js +89 -0
  94. package/dist/lib/tools/web-search.js.map +1 -0
  95. package/dist/lib/tools/write.d.ts +6 -0
  96. package/dist/lib/tools/write.d.ts.map +1 -0
  97. package/dist/lib/tools/write.js +44 -0
  98. package/dist/lib/tools/write.js.map +1 -0
  99. package/package.json +3 -2
@@ -16,12 +16,9 @@
16
16
  overflow: hidden;
17
17
  }
18
18
  </style>
19
- <script type="importmap">
20
- { "imports": { "mermaid": "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs" } }
21
- </script>
22
19
  </head>
23
20
  <body>
24
- <script src="/blex.min.js"></script>
21
+ <script src="/blex.min.js" onload="console.log('[blex] blex.min.js loaded, Blex:', typeof Blex)" onerror="console.error('[blex] FAILED to load blex.min.js')"></script>
25
22
  <script src="/widget.js" data-standalone="true" data-api-key=""></script>
26
23
  </body>
27
24
  </html>
@@ -0,0 +1,151 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Pipeline Dashboard</title>
7
+ <meta name="api-key" data-api-key="">
8
+ <style>
9
+ * { box-sizing: border-box; margin: 0; padding: 0; }
10
+ body {
11
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
12
+ background: #0f0f0f;
13
+ color: #e5e5e5;
14
+ min-height: 100vh;
15
+ }
16
+ header {
17
+ display: flex;
18
+ justify-content: space-between;
19
+ align-items: center;
20
+ padding: 1rem 2rem;
21
+ border-bottom: 1px solid #333;
22
+ }
23
+ h1 { font-size: 1.5rem; font-weight: 600; }
24
+ .actions { display: flex; gap: 0.5rem; }
25
+ button {
26
+ background: #1a1a1a;
27
+ border: 1px solid #333;
28
+ color: #e5e5e5;
29
+ padding: 0.5rem 1rem;
30
+ border-radius: 6px;
31
+ cursor: pointer;
32
+ font-size: 0.875rem;
33
+ }
34
+ button:hover { background: #252525; }
35
+ .stats {
36
+ display: flex;
37
+ gap: 1rem;
38
+ padding: 1rem 2rem;
39
+ border-bottom: 1px solid #333;
40
+ overflow-x: auto;
41
+ }
42
+ .stat {
43
+ background: #1a1a1a;
44
+ padding: 0.75rem 1rem;
45
+ border-radius: 6px;
46
+ min-width: 100px;
47
+ text-align: center;
48
+ }
49
+ .stat-value { font-size: 1.25rem; font-weight: 600; }
50
+ .stat-label { font-size: 0.75rem; color: #888; margin-top: 0.25rem; }
51
+ .board {
52
+ display: flex;
53
+ gap: 1rem;
54
+ padding: 1rem 2rem;
55
+ overflow-x: auto;
56
+ min-height: calc(100vh - 150px);
57
+ }
58
+ .column {
59
+ flex: 0 0 260px;
60
+ background: #1a1a1a;
61
+ border-radius: 8px;
62
+ display: flex;
63
+ flex-direction: column;
64
+ max-height: calc(100vh - 170px);
65
+ }
66
+ .column-header {
67
+ padding: 0.75rem 1rem;
68
+ border-bottom: 1px solid #333;
69
+ display: flex;
70
+ justify-content: space-between;
71
+ align-items: center;
72
+ }
73
+ .column-title { font-weight: 600; font-size: 0.875rem; }
74
+ .column-count {
75
+ background: #333;
76
+ padding: 0.125rem 0.5rem;
77
+ border-radius: 4px;
78
+ font-size: 0.75rem;
79
+ }
80
+ .cards {
81
+ flex: 1;
82
+ overflow-y: auto;
83
+ padding: 0.5rem;
84
+ min-height: 60px;
85
+ }
86
+ .card {
87
+ background: #252525;
88
+ border: 1px solid #333;
89
+ border-radius: 6px;
90
+ padding: 0.75rem;
91
+ margin-bottom: 0.5rem;
92
+ cursor: pointer;
93
+ transition: background 0.15s, border-color 0.15s;
94
+ }
95
+ .card:hover {
96
+ background: #2a2a2a;
97
+ border-color: #444;
98
+ }
99
+ .card.dragging { opacity: 0.4; }
100
+ .card-name { font-weight: 500; margin-bottom: 0.375rem; }
101
+ .card-row { display: flex; align-items: center; gap: 0.5rem; }
102
+ .card-score {
103
+ display: inline-block;
104
+ padding: 0.125rem 0.375rem;
105
+ border-radius: 4px;
106
+ font-size: 0.75rem;
107
+ font-weight: 600;
108
+ }
109
+ .card-score.high { background: #22c55e20; color: #22c55e; }
110
+ .card-score.medium { background: #eab30820; color: #eab308; }
111
+ .card-score.low { background: #ef444420; color: #ef4444; }
112
+ .card-meta { font-size: 0.75rem; color: #888; }
113
+ .card-next { font-size: 0.75rem; color: #999; margin-top: 0.25rem; }
114
+ .cards.drag-over {
115
+ background: #3b82f610;
116
+ outline: 2px dashed #3b82f650;
117
+ outline-offset: -2px;
118
+ border-radius: 4px;
119
+ }
120
+ .empty-state {
121
+ text-align: center;
122
+ color: #555;
123
+ padding: 2rem 1rem;
124
+ font-size: 0.875rem;
125
+ }
126
+ .loading {
127
+ display: flex;
128
+ align-items: center;
129
+ justify-content: center;
130
+ height: 50vh;
131
+ color: #888;
132
+ font-size: 1rem;
133
+ }
134
+ </style>
135
+ </head>
136
+ <body>
137
+ <header>
138
+ <h1>Pipeline Dashboard</h1>
139
+ <div class="actions">
140
+ <button data-testid="dashboard-refresh" id="refresh">Refresh</button>
141
+ <button data-testid="dashboard-open-chat" id="open-chat">Open Chat</button>
142
+ </div>
143
+ </header>
144
+ <div class="stats" id="stats" data-testid="dashboard-stats"></div>
145
+ <div id="board-container">
146
+ <div class="loading" id="loading" data-testid="dashboard-loading" data-loading="true" aria-busy="true">Loading dashboard...</div>
147
+ <div class="board" id="board" data-testid="dashboard-board" style="display:none"></div>
148
+ </div>
149
+ <script src="/dashboard.js"></script>
150
+ </body>
151
+ </html>
@@ -0,0 +1,229 @@
1
+ /* Pipeline Dashboard — vanilla JS, no framework */
2
+
3
+ const STAGES = [
4
+ 'prospect',
5
+ 'outreach',
6
+ 'warm-engagement',
7
+ 'proposal',
8
+ 'onboarding',
9
+ 'active-client',
10
+ ];
11
+
12
+ const API_KEY = document.querySelector('meta[name="api-key"]')?.getAttribute('data-api-key') || '';
13
+
14
+ let state = { threads: {}, stats: {} };
15
+ let draggedCard = null;
16
+
17
+ // ── API ──────────────────────────────────────────────────────
18
+
19
+ async function fetchDashboard() {
20
+ try {
21
+ const res = await fetch('/api/dashboard', {
22
+ headers: API_KEY ? { 'X-API-Key': API_KEY } : {},
23
+ });
24
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
25
+ const data = await res.json();
26
+ state = data;
27
+ render();
28
+ } catch (err) {
29
+ console.error('Failed to fetch dashboard:', err);
30
+ }
31
+ }
32
+
33
+ async function updatePipeline(threadName, updates) {
34
+ try {
35
+ await fetch(`/api/thread/${encodeURIComponent(threadName)}/pipeline`, {
36
+ method: 'PUT',
37
+ headers: {
38
+ 'Content-Type': 'application/json',
39
+ ...(API_KEY ? { 'X-API-Key': API_KEY } : {}),
40
+ },
41
+ body: JSON.stringify(updates),
42
+ });
43
+ } catch (err) {
44
+ console.error('Failed to update pipeline:', err);
45
+ fetchDashboard(); // Revert on error
46
+ }
47
+ }
48
+
49
+ // ── Rendering ────────────────────────────────────────────────
50
+
51
+ function render() {
52
+ document.getElementById('loading').style.display = 'none';
53
+ document.getElementById('loading').setAttribute('data-loading', 'false');
54
+ document.getElementById('loading').setAttribute('aria-busy', 'false');
55
+ document.getElementById('board').style.display = 'flex';
56
+ renderStats();
57
+ renderBoard();
58
+ }
59
+
60
+ function renderStats() {
61
+ const el = document.getElementById('stats');
62
+ const total = state.stats?.total || 0;
63
+ el.innerHTML = `
64
+ <div class="stat" data-testid="stat-total">
65
+ <div class="stat-value">${total}</div>
66
+ <div class="stat-label">Total</div>
67
+ </div>
68
+ ${STAGES.map(
69
+ s => `
70
+ <div class="stat" data-testid="stat-${s}">
71
+ <div class="stat-value">${state.stats?.byStage?.[s] || 0}</div>
72
+ <div class="stat-label">${formatStage(s)}</div>
73
+ </div>
74
+ `
75
+ ).join('')}
76
+ `;
77
+ }
78
+
79
+ function renderBoard() {
80
+ const el = document.getElementById('board');
81
+ el.innerHTML = STAGES.map(stage => {
82
+ const threads = state.threads?.[stage] || [];
83
+ return `
84
+ <div class="column" data-testid="column-${stage}">
85
+ <div class="column-header">
86
+ <span class="column-title">${formatStage(stage)}</span>
87
+ <span class="column-count">${threads.length}</span>
88
+ </div>
89
+ <div class="cards" data-stage="${stage}" data-testid="cards-${stage}">
90
+ ${
91
+ threads.length > 0
92
+ ? threads.map(t => renderCard(t)).join('')
93
+ : '<div class="empty-state">No threads</div>'
94
+ }
95
+ </div>
96
+ </div>
97
+ `;
98
+ }).join('');
99
+
100
+ // Attach drag handlers
101
+ document.querySelectorAll('.card[draggable]').forEach(card => {
102
+ card.addEventListener('dragstart', handleDragStart);
103
+ card.addEventListener('dragend', handleDragEnd);
104
+ });
105
+
106
+ document.querySelectorAll('.cards').forEach(zone => {
107
+ zone.addEventListener('dragover', handleDragOver);
108
+ zone.addEventListener('dragleave', handleDragLeave);
109
+ zone.addEventListener('drop', handleDrop);
110
+ });
111
+ }
112
+
113
+ function renderCard(thread) {
114
+ const scoreClass = thread.score >= 70 ? 'high' : thread.score >= 40 ? 'medium' : 'low';
115
+ const lastContact = thread.lastContact
116
+ ? new Date(thread.lastContact).toLocaleDateString()
117
+ : 'Never';
118
+
119
+ return `
120
+ <div class="card"
121
+ draggable="true"
122
+ data-thread="${thread.name}"
123
+ data-testid="card-${thread.name}"
124
+ onclick="openThread('${thread.name}')">
125
+ <div class="card-name">${formatThreadName(thread.name)}</div>
126
+ <div class="card-row">
127
+ <span class="card-score ${scoreClass}">${thread.score}</span>
128
+ <span class="card-meta">Last: ${lastContact}</span>
129
+ </div>
130
+ ${thread.nextAction ? `<div class="card-next">Next: ${thread.nextAction}</div>` : ''}
131
+ </div>
132
+ `;
133
+ }
134
+
135
+ // ── Formatting helpers ───────────────────────────────────────
136
+
137
+ function formatStage(stage) {
138
+ return stage
139
+ .split('-')
140
+ .map(w => w[0].toUpperCase() + w.slice(1))
141
+ .join(' ');
142
+ }
143
+
144
+ function formatThreadName(name) {
145
+ return name
146
+ .replace(/^prospect-/, '')
147
+ .split('-')
148
+ .map(w => w[0].toUpperCase() + w.slice(1))
149
+ .join(' ');
150
+ }
151
+
152
+ // ── Navigation ───────────────────────────────────────────────
153
+
154
+ function openThread(name) {
155
+ window.open(`/chat?thread=${encodeURIComponent(name)}`, '_blank');
156
+ }
157
+
158
+ // ── Drag and drop ────────────────────────────────────────────
159
+
160
+ function handleDragStart(e) {
161
+ draggedCard = e.target.closest('.card');
162
+ if (draggedCard) {
163
+ draggedCard.classList.add('dragging');
164
+ e.dataTransfer.effectAllowed = 'move';
165
+ e.dataTransfer.setData('text/plain', draggedCard.dataset.thread);
166
+ }
167
+ }
168
+
169
+ function handleDragEnd() {
170
+ if (draggedCard) draggedCard.classList.remove('dragging');
171
+ draggedCard = null;
172
+ document.querySelectorAll('.cards').forEach(z => z.classList.remove('drag-over'));
173
+ }
174
+
175
+ function handleDragOver(e) {
176
+ e.preventDefault();
177
+ e.currentTarget.classList.add('drag-over');
178
+ }
179
+
180
+ function handleDragLeave(e) {
181
+ e.currentTarget.classList.remove('drag-over');
182
+ }
183
+
184
+ async function handleDrop(e) {
185
+ e.preventDefault();
186
+ e.currentTarget.classList.remove('drag-over');
187
+
188
+ const newStage = e.currentTarget.dataset.stage;
189
+ const threadName = e.dataTransfer.getData('text/plain');
190
+
191
+ if (!newStage || !threadName) return;
192
+
193
+ // Find the thread in current state and move it optimistically
194
+ const allThreads = Object.values(state.threads).flat();
195
+ const thread = allThreads.find(t => t.name === threadName);
196
+ if (!thread || thread.stage === newStage) return;
197
+
198
+ const oldStage = thread.stage;
199
+ thread.stage = newStage;
200
+
201
+ // Move between arrays
202
+ state.threads[oldStage] = (state.threads[oldStage] || []).filter(t => t.name !== threadName);
203
+ state.threads[newStage] = state.threads[newStage] || [];
204
+ state.threads[newStage].push(thread);
205
+
206
+ // Update stats
207
+ if (state.stats?.byStage) {
208
+ state.stats.byStage[oldStage] = (state.stats.byStage[oldStage] || 1) - 1;
209
+ state.stats.byStage[newStage] = (state.stats.byStage[newStage] || 0) + 1;
210
+ }
211
+
212
+ render();
213
+
214
+ // Persist
215
+ await updatePipeline(threadName, { stage: newStage });
216
+ }
217
+
218
+ // ── Event listeners ──────────────────────────────────────────
219
+
220
+ document.getElementById('refresh').addEventListener('click', fetchDashboard);
221
+ document.getElementById('open-chat').addEventListener('click', () => {
222
+ window.open('/chat', '_blank');
223
+ });
224
+
225
+ // Initial load
226
+ fetchDashboard();
227
+
228
+ // Auto-refresh every 30s
229
+ setInterval(fetchDashboard, 30000);