@ai2aim.ai/hivemind-sdk 1.0.8 → 1.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/web.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAupCH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAmC1D"}
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA0pCH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAmC1D"}
package/dist/web.js CHANGED
@@ -57,7 +57,9 @@ function buildDashboardHtml(config) {
57
57
  </style>
58
58
  </head>
59
59
  <body class="bg-bg text-white overflow-hidden h-screen">
60
- <div id="app" class="flex h-screen">
60
+ <div id="app"></div>
61
+ <script type="text/html" id="app-tpl">
62
+ <div class="flex h-screen">
61
63
 
62
64
  <!-- ═══════ SIDEBAR ═══════ -->
63
65
  <aside :class="sidebarOpen?'sidebar-full':'sidebar-mini'" class="bg-surface border-r border-border flex flex-col h-full overflow-hidden z-20 flex-shrink-0">
@@ -77,7 +79,7 @@ function buildDashboardHtml(config) {
77
79
  </div>
78
80
  </div>
79
81
  <nav class="flex-1 overflow-y-auto py-2">
80
- <template v-for="sec in navSections" :key="sec.name">
82
+ <div v-for="sec in navSections" :key="sec.name" style="display:contents">
81
83
  <div v-if="sidebarOpen" class="px-4 pt-3 pb-1 text-[10px] uppercase tracking-wider text-gray-600 font-semibold">{{sec.name}}</div>
82
84
  <button v-for="item in sec.items" :key="item.view" @click="navigate(item.view)"
83
85
  class="w-full flex items-center gap-3 px-4 py-2 text-sm transition-all hover:bg-white/5 group relative"
@@ -86,12 +88,12 @@ function buildDashboardHtml(config) {
86
88
  <span v-if="sidebarOpen" class="truncate">{{item.label}}</span>
87
89
  <span v-if="!sidebarOpen" class="absolute left-full ml-2 px-2 py-1 bg-surface border border-border rounded text-xs whitespace-nowrap opacity-0 group-hover:opacity-100 pointer-events-none transition-opacity z-50">{{item.label}}</span>
88
90
  </button>
89
- </template>
91
+ </div>
90
92
  </nav>
91
93
  <div class="border-t border-border p-3" :class="sidebarOpen?'':'flex justify-center'">
92
94
  <button @click="showShortcuts=true" class="text-gray-500 hover:text-white transition text-sm flex items-center gap-2 w-full" :title="sidebarOpen?'Keyboard shortcuts':'?'">
93
95
  <span class="mdi mdi-keyboard"></span>
94
- <template v-if="sidebarOpen"><span class="text-xs">Shortcuts</span><kbd class="ml-auto text-[10px] bg-bg px-1.5 py-0.5 rounded border border-border text-gray-500">?</kbd></template>
96
+ <span v-if="sidebarOpen" class="contents"><span class="text-xs">Shortcuts</span><kbd class="ml-auto text-[10px] bg-bg px-1.5 py-0.5 rounded border border-border text-gray-500">?</kbd></span>
95
97
  </button>
96
98
  </div>
97
99
  </aside>
@@ -102,7 +104,7 @@ function buildDashboardHtml(config) {
102
104
  <header class="h-14 border-b border-border flex items-center gap-3 px-4 bg-surface/50 backdrop-blur-sm flex-shrink-0 z-10">
103
105
  <nav class="flex items-center gap-1 text-sm">
104
106
  <button @click="navigate('home')" class="text-gray-500 hover:text-white transition"><span class="mdi mdi-home"></span></button>
105
- <template v-if="breadcrumb"><span class="text-gray-600 mdi mdi-chevron-right text-xs"></span><span class="text-gray-300 text-xs">{{breadcrumb}}</span></template>
107
+ <span v-if="breadcrumb" class="contents"><span class="text-gray-600 mdi mdi-chevron-right text-xs"></span><span class="text-gray-300 text-xs">{{breadcrumb}}</span></span>
106
108
  </nav>
107
109
  <div class="flex-1"></div>
108
110
  <button @click="cmdOpen=true" class="flex items-center gap-2 bg-bg border border-border rounded-lg px-3 py-1.5 text-xs text-gray-500 hover:text-gray-300 hover:border-gray-500 transition min-w-[200px]">
@@ -215,7 +217,7 @@ function buildDashboardHtml(config) {
215
217
  <text-field label="Org ID" v-model="orgFlow.orgId" placeholder="my-org-1"></text-field>
216
218
  <text-field label="Name" v-model="orgFlow.name" placeholder="Acme Corp"></text-field>
217
219
  <select-field label="Tier" v-model="orgFlow.tier" :options="['free','standard','premium','enterprise']"></select-field>
218
- <template #actions><flow-btn @click="orgFlowCreate" :loading="orgFlow.loading">Create Organization</flow-btn></template>
220
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="orgFlowCreate" :loading="orgFlow.loading">Create Organization</flow-btn></div>
219
221
  </step-card>
220
222
  <step-card v-if="orgFlow.step===1" title="API Key Generated" subtitle="Store this key securely — it won't be shown again.">
221
223
  <div class="flex items-center gap-2 bg-bg rounded-lg p-3 border border-green-900">
@@ -224,10 +226,10 @@ function buildDashboardHtml(config) {
224
226
  <button @click="copyText(orgFlow.apiKey)" class="text-gray-500 hover:text-white transition" title="Copy"><span class="mdi mdi-content-copy"></span></button>
225
227
  </div>
226
228
  <kv-display v-if="orgFlow.orgData" :items="orgFlow.orgData" class="mt-3"></kv-display>
227
- <template #actions><flow-btn @click="orgFlow.step=2">Verify →</flow-btn></template>
229
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="orgFlow.step=2">Verify →</flow-btn></div>
228
230
  </step-card>
229
231
  <step-card v-if="orgFlow.step===2" title="Verify Organization" subtitle="Confirm the org was created correctly.">
230
- <template #actions><flow-btn @click="orgFlowVerify" :loading="orgFlow.loading">Verify</flow-btn></template>
232
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="orgFlowVerify" :loading="orgFlow.loading">Verify</flow-btn></div>
231
233
  </step-card>
232
234
  <step-card v-if="orgFlow.step===3" title="Rotate API Key" subtitle="Generate a new key (the old one becomes invalid).">
233
235
  <kv-display v-if="orgFlow.verifyData" :items="orgFlow.verifyData" class="mb-3"></kv-display>
@@ -236,7 +238,7 @@ function buildDashboardHtml(config) {
236
238
  <code class="text-amber-300 text-xs flex-1 break-all select-all">{{orgFlow.newKey}}</code>
237
239
  <button @click="copyText(orgFlow.newKey)" class="text-gray-500 hover:text-white transition"><span class="mdi mdi-content-copy"></span></button>
238
240
  </div>
239
- <template #actions><flow-btn @click="orgFlowRotate" :loading="orgFlow.loading" variant="warn">Rotate Key</flow-btn></template>
241
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="orgFlowRotate" :loading="orgFlow.loading" variant="warn">Rotate Key</flow-btn></div>
240
242
  </step-card>
241
243
  <flow-result :result="orgFlow.lastResult"></flow-result>
242
244
  </div>
@@ -246,7 +248,7 @@ function buildDashboardHtml(config) {
246
248
  <flow-header title="Document Pipeline" desc="Upload documents, query via RAG, chat with your data." :step="docFlow.step" :steps="docFlow.steps"></flow-header>
247
249
  <step-card v-if="docFlow.step===0" title="Select Organization" subtitle="Which org should own the documents?">
248
250
  <text-field label="Org ID" v-model="docFlow.orgId" placeholder="my-org-1"></text-field>
249
- <template #actions><flow-btn @click="docFlow.step=1" :disabled="!docFlow.orgId">Next →</flow-btn></template>
251
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="docFlow.step=1" :disabled="!docFlow.orgId">Next →</flow-btn></div>
250
252
  </step-card>
251
253
  <step-card v-if="docFlow.step===1" title="Upload Document" subtitle="Select a file or drag & drop anywhere on the page.">
252
254
  <div class="border-2 border-dashed rounded-xl p-8 text-center transition-all" :class="dragActive?'border-brand bg-brand/5':'border-border hover:border-gray-500'" @click="$refs.docFile&&$refs.docFile.click()">
@@ -256,10 +258,10 @@ function buildDashboardHtml(config) {
256
258
  </div>
257
259
  <input ref="docFile" id="docFileInput" type="file" class="hidden" @change="docFlowUpload">
258
260
  <kv-display v-if="docFlow.uploadResult" :items="docFlow.uploadResult" class="mt-3"></kv-display>
259
- <template #actions>
261
+ <div class="flex flex-wrap gap-2 mt-4">
260
262
  <flow-btn @click="$refs.docFile&&$refs.docFile.click()" :loading="docFlow.loading">Upload</flow-btn>
261
263
  <flow-btn variant="secondary" @click="docFlow.step=2" v-if="docFlow.uploadResult">Query →</flow-btn>
262
- </template>
264
+ </div>
263
265
  </step-card>
264
266
  <step-card v-if="docFlow.step===2" title="RAG Query" subtitle="Ask questions about your uploaded documents.">
265
267
  <text-field label="Query" v-model="docFlow.query" placeholder="What are the key findings?"></text-field>
@@ -271,10 +273,10 @@ function buildDashboardHtml(config) {
271
273
  <div class="text-xs text-gray-500 mb-1 flex items-center gap-2"><span class="mdi mdi-robot"></span> Answer</div>
272
274
  <div class="text-sm text-gray-300 whitespace-pre-wrap">{{docFlow.answer}}</div>
273
275
  </div>
274
- <template #actions>
276
+ <div class="flex flex-wrap gap-2 mt-4">
275
277
  <flow-btn @click="docFlowQuery" :loading="docFlow.loading">Ask</flow-btn>
276
278
  <flow-btn variant="secondary" @click="docFlow.step=3">Data Chat →</flow-btn>
277
- </template>
279
+ </div>
278
280
  </step-card>
279
281
  <step-card v-if="docFlow.step===3" title="Data Chat" subtitle="Have a conversation with your documents.">
280
282
  <div class="bg-bg rounded-xl border border-border overflow-hidden">
@@ -306,7 +308,7 @@ function buildDashboardHtml(config) {
306
308
  <span class="mdi text-3xl block mb-1" :class="t.icon"></span><span class="text-sm font-medium">{{t.label}}</span>
307
309
  </button>
308
310
  </div>
309
- <template #actions><flow-btn @click="genFlow.step=1" :disabled="!genFlow.type||!genFlow.orgId">Configure →</flow-btn></template>
311
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="genFlow.step=1" :disabled="!genFlow.type||!genFlow.orgId">Configure →</flow-btn></div>
310
312
  </step-card>
311
313
  <step-card v-if="genFlow.step===1" title="Configure" subtitle="Describe what you want to generate.">
312
314
  <text-area label="Prompt" v-model="genFlow.prompt" placeholder="A cinematic drone flyover of a futuristic city…"></text-area>
@@ -316,7 +318,7 @@ function buildDashboardHtml(config) {
316
318
  <text-field v-if="genFlow.type==='image'" label="Count" v-model="genFlow.numImages" placeholder="1"></text-field>
317
319
  </div>
318
320
  <text-field label="Style (optional)" v-model="genFlow.style" placeholder="photorealistic, cinematic"></text-field>
319
- <template #actions><flow-btn @click="genFlowSubmit" :loading="genFlow.loading">Generate</flow-btn></template>
321
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="genFlowSubmit" :loading="genFlow.loading">Generate</flow-btn></div>
320
322
  </step-card>
321
323
  <step-card v-if="genFlow.step===2" title="Track Job" subtitle="Monitor generation progress.">
322
324
  <div class="bg-bg rounded-lg p-4 border border-border mb-3">
@@ -332,11 +334,11 @@ function buildDashboardHtml(config) {
332
334
  </div>
333
335
  </div>
334
336
  <kv-display v-if="genFlow.jobResult" :items="genFlow.jobResult" class="mt-2"></kv-display>
335
- <template #actions>
337
+ <div class="flex flex-wrap gap-2 mt-4">
336
338
  <flow-btn @click="genFlowPoll" :loading="genFlow.loading" size="sm">Poll Now</flow-btn>
337
339
  <flow-btn v-if="!isPolling('gen')" variant="secondary" size="sm" @click="startPoll('gen',genFlowPoll,3000)"><span class="mdi mdi-sync mr-1"></span>Auto-Poll</flow-btn>
338
340
  <flow-btn v-else variant="warn" size="sm" @click="stopPoll('gen')"><span class="mdi mdi-stop mr-1"></span>Stop</flow-btn>
339
- </template>
341
+ </div>
340
342
  </step-card>
341
343
  <flow-result :result="genFlow.lastResult"></flow-result>
342
344
  </div>
@@ -352,16 +354,16 @@ function buildDashboardHtml(config) {
352
354
  <text-field label="Description" v-model="bpFlow.description" placeholder="Standard HR policy doc"></text-field>
353
355
  </div>
354
356
  <text-area label="Sections JSON" v-model="bpFlow.sectionsJson" placeholder='[{"title":"Introduction","instructions":"Write an intro"}]'></text-area>
355
- <template #actions><flow-btn @click="bpFlowCreate" :loading="bpFlow.loading">Create Blueprint</flow-btn></template>
357
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="bpFlowCreate" :loading="bpFlow.loading">Create Blueprint</flow-btn></div>
356
358
  </step-card>
357
359
  <step-card v-if="bpFlow.step===1" title="Publish Blueprint" subtitle="Make the blueprint available for document creation.">
358
360
  <div class="bg-bg rounded-lg p-3 border border-border text-sm text-gray-400"><span class="mdi mdi-information text-brand mr-1"></span>Blueprint <strong class="text-white">{{bpFlow.blueprintId}}</strong> ready to publish.</div>
359
- <template #actions><flow-btn @click="bpFlowPublish" :loading="bpFlow.loading">Publish</flow-btn></template>
361
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="bpFlowPublish" :loading="bpFlow.loading">Publish</flow-btn></div>
360
362
  </step-card>
361
363
  <step-card v-if="bpFlow.step===2" title="Create Document" subtitle="Generate a new document from this blueprint.">
362
364
  <text-field label="Title" v-model="bpFlow.docTitle" placeholder="Q1 Report 2026"></text-field>
363
365
  <text-field label="Description" v-model="bpFlow.docDesc" placeholder="Quarterly report"></text-field>
364
- <template #actions><flow-btn @click="bpFlowCreateDoc" :loading="bpFlow.loading">Create Document</flow-btn></template>
366
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="bpFlowCreateDoc" :loading="bpFlow.loading">Create Document</flow-btn></div>
365
367
  </step-card>
366
368
  <step-card v-if="bpFlow.step===3" title="AI Generate Sections" subtitle="Fill sections with AI-generated content.">
367
369
  <div v-if="bpFlow.docSections.length" class="space-y-2 mb-3">
@@ -377,13 +379,13 @@ function buildDashboardHtml(config) {
377
379
  <text-field label="Section ID" v-model="bpFlow.manualSectionId" placeholder="sec-1" class="flex-1"></text-field>
378
380
  <text-field label="Context JSON" v-model="bpFlow.genContext" placeholder="{}" class="flex-1"></text-field>
379
381
  </div>
380
- <template #actions><flow-btn size="sm" @click="bpFlowGenManual" :loading="bpFlow.loading">Generate</flow-btn><flow-btn variant="secondary" size="sm" @click="bpFlow.step=4">Workflow →</flow-btn></template>
382
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn size="sm" @click="bpFlowGenManual" :loading="bpFlow.loading">Generate</flow-btn><flow-btn variant="secondary" size="sm" @click="bpFlow.step=4">Workflow →</flow-btn></div>
381
383
  </div>
382
384
  </step-card>
383
385
  <step-card v-if="bpFlow.step===4" title="Workflow Action" subtitle="Submit the document for review or approval.">
384
386
  <select-field label="Action" v-model="bpFlow.wfAction" :options="['submit','approve','reject','request_changes','publish']"></select-field>
385
387
  <text-area label="Comment" v-model="bpFlow.wfComment" placeholder="Looks good, approved."></text-area>
386
- <template #actions><flow-btn @click="bpFlowWorkflow" :loading="bpFlow.loading">Execute Workflow</flow-btn></template>
388
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="bpFlowWorkflow" :loading="bpFlow.loading">Execute Workflow</flow-btn></div>
387
389
  </step-card>
388
390
  <flow-result :result="bpFlow.lastResult"></flow-result>
389
391
  </div>
@@ -396,7 +398,7 @@ function buildDashboardHtml(config) {
396
398
  <text-field label="Agent Name" v-model="agentFlow.name" placeholder="HR Assistant"></text-field>
397
399
  <text-area label="Instructions" v-model="agentFlow.instructions" placeholder="You are an HR assistant…"></text-area>
398
400
  <text-field label="Tools (JSON)" v-model="agentFlow.tools" placeholder='["rag_search","web_search"]'></text-field>
399
- <template #actions><flow-btn @click="agentFlowCreate" :loading="agentFlow.loading">Create Agent</flow-btn></template>
401
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="agentFlowCreate" :loading="agentFlow.loading">Create Agent</flow-btn></div>
400
402
  </step-card>
401
403
  <step-card v-if="agentFlow.step===1" title="Chat with Agent" subtitle="Talk to your custom agent.">
402
404
  <select-field label="Agent Type" v-model="agentFlow.agentType" :options="['auto','custom','rag','data']"></select-field>
@@ -425,26 +427,26 @@ function buildDashboardHtml(config) {
425
427
  <text-field label="Site URL" v-model="jiraFlow.siteUrl" placeholder="https://yoursite.atlassian.net"></text-field>
426
428
  <text-field label="Email" v-model="jiraFlow.email" placeholder="user@company.com"></text-field>
427
429
  <text-field label="API Token" v-model="jiraFlow.apiToken" placeholder="Your Jira API token" type="password"></text-field>
428
- <template #actions><flow-btn @click="jiraFlowConnect" :loading="jiraFlow.loading">Connect</flow-btn></template>
430
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="jiraFlowConnect" :loading="jiraFlow.loading">Connect</flow-btn></div>
429
431
  </step-card>
430
432
  <step-card v-if="jiraFlow.step===1" title="Connection Status" subtitle="Verify your Jira connection.">
431
433
  <kv-display v-if="jiraFlow.statusData" :items="jiraFlow.statusData"></kv-display>
432
434
  <div v-else class="skeleton h-20 w-full"></div>
433
- <template #actions>
435
+ <div class="flex flex-wrap gap-2 mt-4">
434
436
  <flow-btn @click="jiraFlowStatus" :loading="jiraFlow.loading" size="sm">Refresh</flow-btn>
435
437
  <flow-btn variant="secondary" @click="jiraFlow.step=2">Sync →</flow-btn>
436
- </template>
438
+ </div>
437
439
  </step-card>
438
440
  <step-card v-if="jiraFlow.step===2" title="Sync Projects" subtitle="Choose which Jira projects to synchronize.">
439
441
  <text-field label="Project Keys (comma-separated)" v-model="jiraFlow.projectKeys" placeholder="PROJ, TEAM, OPS"></text-field>
440
- <template #actions><flow-btn @click="jiraFlowSync" :loading="jiraFlow.loading">Start Sync</flow-btn></template>
442
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="jiraFlowSync" :loading="jiraFlow.loading">Start Sync</flow-btn></div>
441
443
  </step-card>
442
444
  <step-card v-if="jiraFlow.step===3" title="Manage" subtitle="Manage your Jira integration.">
443
445
  <div class="bg-bg rounded-lg p-3 border border-green-900 text-sm text-green-400 mb-3"><span class="mdi mdi-check-circle mr-1"></span>Jira is connected and syncing.</div>
444
- <template #actions>
446
+ <div class="flex flex-wrap gap-2 mt-4">
445
447
  <flow-btn @click="jiraFlowStatus" :loading="jiraFlow.loading" size="sm">Refresh Status</flow-btn>
446
448
  <flow-btn variant="danger" size="sm" @click="confirmAction('Disconnect Jira','This will remove the Jira integration. Are you sure?',jiraFlowDisconnect)">Disconnect</flow-btn>
447
- </template>
449
+ </div>
448
450
  </step-card>
449
451
  <flow-result :result="jiraFlow.lastResult"></flow-result>
450
452
  </div>
@@ -456,7 +458,7 @@ function buildDashboardHtml(config) {
456
458
  <div class="flex justify-end mb-1"><button @click="scrapeFlowConfig" class="text-[10px] text-gray-500 hover:text-brand transition"><span class="mdi mdi-cog mr-1"></span>View Config</button></div>
457
459
  <kv-display v-if="scrapeFlow.configData" :items="scrapeFlow.configData" class="mb-3"></kv-display>
458
460
  <text-area label="URLs (one per line)" v-model="scrapeFlow.urls" placeholder="https://example.com\nhttps://docs.example.com"></text-area>
459
- <template #actions><flow-btn @click="scrapeFlowSubmit" :loading="scrapeFlow.loading">Submit</flow-btn></template>
461
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="scrapeFlowSubmit" :loading="scrapeFlow.loading">Submit</flow-btn></div>
460
462
  </step-card>
461
463
  <step-card v-if="scrapeFlow.step===1" title="Monitor Progress" subtitle="Track the scraping task.">
462
464
  <div class="bg-bg rounded-lg p-4 border border-border mb-3">
@@ -471,11 +473,11 @@ function buildDashboardHtml(config) {
471
473
  </div>
472
474
  </div>
473
475
  <kv-display v-if="scrapeFlow.taskResult" :items="scrapeFlow.taskResult"></kv-display>
474
- <template #actions>
476
+ <div class="flex flex-wrap gap-2 mt-4">
475
477
  <flow-btn @click="scrapeFlowPoll" :loading="scrapeFlow.loading" size="sm">Poll Now</flow-btn>
476
478
  <flow-btn v-if="!isPolling('scrape')" variant="secondary" size="sm" @click="startPoll('scrape',scrapeFlowPoll,3000)"><span class="mdi mdi-sync mr-1"></span>Auto-Poll</flow-btn>
477
479
  <flow-btn v-else variant="warn" size="sm" @click="stopPoll('scrape')"><span class="mdi mdi-stop mr-1"></span>Stop</flow-btn>
478
- </template>
480
+ </div>
479
481
  </step-card>
480
482
  <flow-result :result="scrapeFlow.lastResult"></flow-result>
481
483
  </div>
@@ -488,20 +490,20 @@ function buildDashboardHtml(config) {
488
490
  <text-field label="Target Column" v-model="mlFlow.target" placeholder="churn"></text-field>
489
491
  <text-field label="Feature Columns (JSON)" v-model="mlFlow.features" placeholder='["tenure","monthly_charges"]'></text-field>
490
492
  <text-area label="Training Rows (JSON)" v-model="mlFlow.rows" placeholder='[{"tenure":12,"monthly_charges":50,"churn":0}]'></text-area>
491
- <template #actions><flow-btn @click="mlFlowTrain" :loading="mlFlow.loading">Train</flow-btn></template>
493
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="mlFlowTrain" :loading="mlFlow.loading">Train</flow-btn></div>
492
494
  </step-card>
493
495
  <step-card v-if="mlFlow.step===1" title="Predict" subtitle="Run predictions using the trained model.">
494
496
  <div v-if="mlFlow.modelId" class="bg-bg rounded-lg p-3 border border-green-900 text-sm text-green-400 mb-3"><span class="mdi mdi-check-circle mr-1"></span>Model: <code>{{mlFlow.modelId}}</code></div>
495
497
  <text-area label="Instances (JSON)" v-model="mlFlow.instances" placeholder='[{"tenure":24,"monthly_charges":80}]'></text-area>
496
- <template #actions>
498
+ <div class="flex flex-wrap gap-2 mt-4">
497
499
  <flow-btn @click="mlFlowPredict" :loading="mlFlow.loading">Predict</flow-btn>
498
500
  <flow-btn variant="secondary" @click="mlFlow.step=2">Forecast →</flow-btn>
499
- </template>
501
+ </div>
500
502
  </step-card>
501
503
  <step-card v-if="mlFlow.step===2" title="Forecast" subtitle="Generate time-series forecasts.">
502
504
  <text-field label="Time Series (JSON)" v-model="mlFlow.series" placeholder="[10,20,30,40,50]"></text-field>
503
505
  <text-field label="Horizon (days)" v-model="mlFlow.horizon" placeholder="30"></text-field>
504
- <template #actions><flow-btn @click="mlFlowForecast" :loading="mlFlow.loading">Forecast</flow-btn></template>
506
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="mlFlowForecast" :loading="mlFlow.loading">Forecast</flow-btn></div>
505
507
  </step-card>
506
508
  <flow-result :result="mlFlow.lastResult"></flow-result>
507
509
  </div>
@@ -513,12 +515,12 @@ function buildDashboardHtml(config) {
513
515
  <text-field label="Org ID" v-model="audioFlow.orgId" placeholder="my-org-1"></text-field>
514
516
  <text-area label="Audio Text / Base64" v-model="audioFlow.audioText" placeholder="Audio content or base64…"></text-area>
515
517
  <select-field label="Language" v-model="audioFlow.lang" :options="['en-US','en-GB','es-ES','fr-FR','de-DE','ja-JP','zh-CN']"></select-field>
516
- <template #actions><flow-btn @click="audioFlowTranscribe" :loading="audioFlow.loading">Transcribe</flow-btn></template>
518
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="audioFlowTranscribe" :loading="audioFlow.loading">Transcribe</flow-btn></div>
517
519
  </step-card>
518
520
  <step-card v-if="audioFlow.step===1" title="Synthesize Speech" subtitle="Convert text to audio.">
519
521
  <text-area label="Text" v-model="audioFlow.synthText" placeholder="Hello, welcome to Hivemind."></text-area>
520
522
  <text-field label="Voice" v-model="audioFlow.voice" placeholder="en-US-Neural2-J"></text-field>
521
- <template #actions><flow-btn @click="audioFlowSynthesize" :loading="audioFlow.loading">Synthesize</flow-btn></template>
523
+ <div class="flex flex-wrap gap-2 mt-4"><flow-btn @click="audioFlowSynthesize" :loading="audioFlow.loading">Synthesize</flow-btn></div>
522
524
  </step-card>
523
525
  <flow-result :result="audioFlow.lastResult"></flow-result>
524
526
  </div>
@@ -725,11 +727,13 @@ function buildDashboardHtml(config) {
725
727
  </transition-group>
726
728
  </div>
727
729
 
728
- </div><!-- /#app -->
730
+ </div>
731
+ <\/script>
729
732
 
730
733
  <script>
731
734
  const{createApp,ref,reactive,computed,onMounted,watch,nextTick}=Vue;
732
735
  createApp({
736
+ template:document.getElementById('app-tpl').innerHTML,
733
737
  setup(){
734
738
  const cfg=reactive({baseUrl:'${esc(config.baseUrl)}',apiPrefix:'${esc(config.apiPrefix)}',apiKey:'${esc(config.apiKey)}',adminKey:'${esc(config.adminKey)}',webhookSecret:'${esc(config.webhookSecret)}',employeeId:'${esc(config.employeeId)}'});
735
739
  const settingsFields=[{key:'baseUrl',label:'Base URL',placeholder:'http://localhost:8000'},{key:'apiPrefix',label:'API Prefix',placeholder:'/api/v1'},{key:'apiKey',label:'API Key',placeholder:'key-…',type:'password'},{key:'adminKey',label:'Admin Key',placeholder:'admin-…',type:'password'},{key:'webhookSecret',label:'Webhook Secret',placeholder:'whsec-…',type:'password'},{key:'employeeId',label:'Employee ID',placeholder:'EMP001'}];
@@ -1078,7 +1082,7 @@ createApp({
1078
1082
  </div>
1079
1083
  <p class="text-gray-400 text-sm mb-4 ml-8">{{desc}}</p>
1080
1084
  <div class="flex items-center gap-1 mb-2 ml-8">
1081
- <template v-for="(s,i) in steps" :key="i">
1085
+ <div v-for="(s,i) in steps" :key="i" style="display:contents">
1082
1086
  <div class="flex items-center gap-1 cursor-pointer" @click="$emit('jump',i)">
1083
1087
  <div class="w-8 h-8 rounded-full flex items-center justify-center text-xs font-bold transition-all"
1084
1088
  :class="i<step?'bg-green-500 text-white scale-90':i===step?'bg-brand text-white ring-2 ring-brand/30 scale-110':'bg-gray-700 text-gray-500'">
@@ -1087,7 +1091,7 @@ createApp({
1087
1091
  <span class="text-xs hidden sm:inline transition-colors" :class="i===step?'text-white font-semibold':'text-gray-500'">{{s}}</span>
1088
1092
  </div>
1089
1093
  <div v-if="i<steps.length-1" class="flex-1 h-0.5 mx-1 rounded transition-all" :class="i<step?'bg-green-500':'bg-gray-700'"></div>
1090
- </template>
1094
+ </div>
1091
1095
  </div>
1092
1096
  </div>\`})
1093
1097
  .component('step-card',{props:['title','subtitle'],template:\`
@@ -1095,7 +1099,6 @@ createApp({
1095
1099
  <h3 class="text-lg font-semibold text-white mb-1">{{title}}</h3>
1096
1100
  <p class="text-xs text-gray-500 mb-4">{{subtitle}}</p>
1097
1101
  <slot></slot>
1098
- <div class="flex flex-wrap gap-2 mt-4" v-if="$slots.actions"><slot name="actions"></slot></div>
1099
1102
  </div>\`})
1100
1103
  .component('text-field',{props:['label','modelValue','placeholder','disabled','type'],emits:['update:modelValue'],template:\`
1101
1104
  <div class="mt-2">
@@ -1141,27 +1144,27 @@ createApp({
1141
1144
  </div>\`})
1142
1145
  .component('json-tree',{props:['data','depth'],template:\`
1143
1146
  <div :style="{paddingLeft:(depth*16)+'px'}" class="text-xs font-mono">
1144
- <template v-if="typeof data==='object'&&data!==null">
1147
+ <div v-if="typeof data==='object'&&data!==null">
1145
1148
  <div v-for="(v,k) in data" :key="k" class="py-0.5">
1146
- <template v-if="typeof v==='object'&&v!==null">
1149
+ <div v-if="typeof v==='object'&&v!==null">
1147
1150
  <details :open="depth<2">
1148
1151
  <summary class="cursor-pointer hover:bg-white/5 rounded px-1 -mx-1 transition select-none">
1149
1152
  <span class="jt-key">"{{k}}"</span><span class="text-gray-600">: {{Array.isArray(v)?'['+v.length+']':'{'+Object.keys(v).length+'}'}}</span>
1150
1153
  </summary>
1151
1154
  <json-tree :data="v" :depth="depth+1"></json-tree>
1152
1155
  </details>
1153
- </template>
1154
- <template v-else>
1156
+ </div>
1157
+ <div v-else>
1155
1158
  <div class="hover:bg-white/5 rounded px-1 -mx-1 transition cursor-default">
1156
1159
  <span class="jt-key">"{{k}}"</span><span class="text-gray-600">: </span>
1157
1160
  <span :class="typeof v==='string'?'jt-str':typeof v==='number'?'jt-num':typeof v==='boolean'?'jt-bool':'jt-null'">{{typeof v==='string'?'"'+v+'"':String(v)}}</span>
1158
1161
  </div>
1159
- </template>
1162
+ </div>
1160
1163
  </div>
1161
- </template>
1162
- <template v-else>
1164
+ </div>
1165
+ <div v-else>
1163
1166
  <span :class="typeof data==='string'?'jt-str':typeof data==='number'?'jt-num':typeof data==='boolean'?'jt-bool':'jt-null'">{{typeof data==='string'?'"'+data+'"':String(data)}}</span>
1164
- </template>
1167
+ </div>
1165
1168
  </div>\`})
1166
1169
  .mount('#app');
1167
1170
  <\/script>
package/dist/web.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai2aim.ai/hivemind-sdk",
3
- "version": "1.0.8",
3
+ "version": "1.0.10",
4
4
  "description": "Node.js/TypeScript SDK for the Hivemind API",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",