chainlesschain 0.51.0 → 0.81.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.
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AppLayout-Rvi759IS.js → AppLayout-6SPt_8Y_.js} +1 -1
- package/src/assets/web-panel/assets/{Dashboard-DBhFxXYQ.js → Dashboard-Br7kCwKJ.js} +2 -2
- package/src/assets/web-panel/assets/Dashboard-CKeMmCoT.css +1 -0
- package/src/assets/web-panel/assets/{index-uL0cZ8N_.js → index-tN-8TosE.js} +2 -2
- package/src/assets/web-panel/index.html +2 -2
- package/src/commands/a2a.js +380 -0
- package/src/commands/agent-network.js +785 -0
- package/src/commands/automation.js +654 -0
- package/src/commands/bi.js +348 -0
- package/src/commands/crosschain.js +218 -0
- package/src/commands/dao.js +565 -0
- package/src/commands/did-v2.js +620 -0
- package/src/commands/dlp.js +341 -0
- package/src/commands/economy.js +578 -0
- package/src/commands/evolution.js +391 -0
- package/src/commands/evomap.js +394 -0
- package/src/commands/federation.js +283 -0
- package/src/commands/hmemory.js +442 -0
- package/src/commands/inference.js +318 -0
- package/src/commands/lowcode.js +356 -0
- package/src/commands/marketplace.js +256 -0
- package/src/commands/perf.js +433 -0
- package/src/commands/pipeline.js +449 -0
- package/src/commands/plugin-ecosystem.js +517 -0
- package/src/commands/privacy.js +321 -0
- package/src/commands/reputation.js +261 -0
- package/src/commands/sandbox.js +401 -0
- package/src/commands/siem.js +246 -0
- package/src/commands/sla.js +259 -0
- package/src/commands/social.js +311 -0
- package/src/commands/sso.js +798 -0
- package/src/commands/stress.js +230 -0
- package/src/commands/terraform.js +245 -0
- package/src/commands/workflow.js +320 -0
- package/src/commands/zkp.js +562 -1
- package/src/index.js +21 -0
- package/src/lib/a2a-protocol.js +451 -0
- package/src/lib/agent-economy.js +479 -0
- package/src/lib/agent-network.js +1121 -0
- package/src/lib/app-builder.js +239 -0
- package/src/lib/automation-engine.js +948 -0
- package/src/lib/bi-engine.js +338 -0
- package/src/lib/cross-chain.js +345 -0
- package/src/lib/dao-governance.js +569 -0
- package/src/lib/did-v2-manager.js +1127 -0
- package/src/lib/dlp-engine.js +389 -0
- package/src/lib/evolution-system.js +453 -0
- package/src/lib/evomap-federation.js +177 -0
- package/src/lib/evomap-governance.js +276 -0
- package/src/lib/federation-hardening.js +259 -0
- package/src/lib/hierarchical-memory.js +481 -0
- package/src/lib/inference-network.js +330 -0
- package/src/lib/perf-tuning.js +734 -0
- package/src/lib/pipeline-orchestrator.js +928 -0
- package/src/lib/plugin-ecosystem.js +1109 -0
- package/src/lib/privacy-computing.js +427 -0
- package/src/lib/reputation-optimizer.js +299 -0
- package/src/lib/sandbox-v2.js +306 -0
- package/src/lib/siem-exporter.js +333 -0
- package/src/lib/skill-marketplace.js +325 -0
- package/src/lib/sla-manager.js +275 -0
- package/src/lib/social-graph-analytics.js +707 -0
- package/src/lib/sso-manager.js +841 -0
- package/src/lib/stress-tester.js +330 -0
- package/src/lib/terraform-manager.js +363 -0
- package/src/lib/workflow-engine.js +454 -1
- package/src/lib/zkp-engine.js +523 -20
- package/src/assets/web-panel/assets/Dashboard-BS-tzGNj.css +0 -1
package/src/lib/app-builder.js
CHANGED
|
@@ -503,3 +503,242 @@ export function deployApp(db, appId, options = {}) {
|
|
|
503
503
|
const deployedAt = new Date().toISOString();
|
|
504
504
|
return { appId, outputDir, files: fileNames, deployedAt };
|
|
505
505
|
}
|
|
506
|
+
|
|
507
|
+
// ─── Phase 93 V2 surface (strictly additive) ───────────────────────────
|
|
508
|
+
|
|
509
|
+
export const COMPONENT_CATEGORY = Object.freeze({
|
|
510
|
+
INPUT: "input",
|
|
511
|
+
DISPLAY: "display",
|
|
512
|
+
CHART: "chart",
|
|
513
|
+
LAYOUT: "layout",
|
|
514
|
+
OVERLAY: "overlay",
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
export const DATASOURCE_TYPE = Object.freeze({
|
|
518
|
+
REST: "rest",
|
|
519
|
+
GRAPHQL: "graphql",
|
|
520
|
+
DATABASE: "database",
|
|
521
|
+
CSV: "csv",
|
|
522
|
+
});
|
|
523
|
+
|
|
524
|
+
export const APP_STATUS = Object.freeze({
|
|
525
|
+
DRAFT: "draft",
|
|
526
|
+
PUBLISHED: "published",
|
|
527
|
+
ARCHIVED: "archived",
|
|
528
|
+
});
|
|
529
|
+
|
|
530
|
+
const _allowedStatusTransitions = Object.freeze({
|
|
531
|
+
draft: new Set(["published", "archived"]),
|
|
532
|
+
published: new Set(["draft", "archived"]),
|
|
533
|
+
archived: new Set(["draft"]),
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
const _v2DataSources = new Map();
|
|
537
|
+
const _v2StatusHistory = new Map();
|
|
538
|
+
|
|
539
|
+
function _isValidStatusTransition(from, to) {
|
|
540
|
+
if (from === to) return true;
|
|
541
|
+
const allowed = _allowedStatusTransitions[from];
|
|
542
|
+
return !!(allowed && allowed.has(to));
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
export function listComponentsV2({ category } = {}) {
|
|
546
|
+
const all = listComponents();
|
|
547
|
+
if (!category) return all.map((c) => ({ ...c }));
|
|
548
|
+
const valid = Object.values(COMPONENT_CATEGORY);
|
|
549
|
+
if (!valid.includes(category)) {
|
|
550
|
+
throw new Error(
|
|
551
|
+
`Invalid category '${category}'. Expected one of ${valid.join(", ")}`,
|
|
552
|
+
);
|
|
553
|
+
}
|
|
554
|
+
return all.filter((c) => c.category === category).map((c) => ({ ...c }));
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
export function registerDataSourceV2(db, { appId, name, type, config = {} }) {
|
|
558
|
+
const valid = Object.values(DATASOURCE_TYPE);
|
|
559
|
+
if (!valid.includes(type)) {
|
|
560
|
+
throw new Error(
|
|
561
|
+
`Invalid datasource type '${type}'. Expected one of ${valid.join(", ")}`,
|
|
562
|
+
);
|
|
563
|
+
}
|
|
564
|
+
if (!appId) throw new Error("appId is required");
|
|
565
|
+
if (!name) throw new Error("name is required");
|
|
566
|
+
|
|
567
|
+
const result = addDataSource(db, appId, name, type, config);
|
|
568
|
+
_v2DataSources.set(result.id, { ...result, config, validated: false });
|
|
569
|
+
return result;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
export function testDataSourceConnection(dataSourceId) {
|
|
573
|
+
const ds = _v2DataSources.get(dataSourceId);
|
|
574
|
+
if (!ds) {
|
|
575
|
+
return { dataSourceId, ok: false, reason: "datasource not found" };
|
|
576
|
+
}
|
|
577
|
+
const config = ds.config || {};
|
|
578
|
+
let ok = false;
|
|
579
|
+
let reason = "";
|
|
580
|
+
switch (ds.type) {
|
|
581
|
+
case DATASOURCE_TYPE.REST:
|
|
582
|
+
ok = typeof config.url === "string" && config.url.length > 0;
|
|
583
|
+
reason = ok ? "ok" : "missing url";
|
|
584
|
+
break;
|
|
585
|
+
case DATASOURCE_TYPE.GRAPHQL:
|
|
586
|
+
ok = typeof config.endpoint === "string" && config.endpoint.length > 0;
|
|
587
|
+
reason = ok ? "ok" : "missing endpoint";
|
|
588
|
+
break;
|
|
589
|
+
case DATASOURCE_TYPE.DATABASE:
|
|
590
|
+
ok = typeof config.host === "string" && config.host.length > 0;
|
|
591
|
+
reason = ok ? "ok" : "missing host";
|
|
592
|
+
break;
|
|
593
|
+
case DATASOURCE_TYPE.CSV:
|
|
594
|
+
ok = typeof config.path === "string" && config.path.length > 0;
|
|
595
|
+
reason = ok ? "ok" : "missing path";
|
|
596
|
+
break;
|
|
597
|
+
default:
|
|
598
|
+
reason = "unknown type";
|
|
599
|
+
}
|
|
600
|
+
if (ok) {
|
|
601
|
+
ds.validated = true;
|
|
602
|
+
_v2DataSources.set(dataSourceId, ds);
|
|
603
|
+
}
|
|
604
|
+
return { dataSourceId, type: ds.type, ok, reason };
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
export function updateAppStatus(db, { appId, status }) {
|
|
608
|
+
const valid = Object.values(APP_STATUS);
|
|
609
|
+
if (!valid.includes(status)) {
|
|
610
|
+
throw new Error(
|
|
611
|
+
`Invalid status '${status}'. Expected one of ${valid.join(", ")}`,
|
|
612
|
+
);
|
|
613
|
+
}
|
|
614
|
+
const app = getApp(db, appId);
|
|
615
|
+
if (!app) throw new Error(`App '${appId}' not found`);
|
|
616
|
+
|
|
617
|
+
const currentStatus =
|
|
618
|
+
app.status === "deployed" ? APP_STATUS.PUBLISHED : app.status;
|
|
619
|
+
if (!_isValidStatusTransition(currentStatus, status)) {
|
|
620
|
+
throw new Error(`Invalid status transition: ${currentStatus} → ${status}`);
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
db.prepare(
|
|
624
|
+
`UPDATE lowcode_apps SET status = ?, updated_at = datetime('now') WHERE id = ?`,
|
|
625
|
+
).run(status, appId);
|
|
626
|
+
if (_apps.has(appId)) _apps.get(appId).status = status;
|
|
627
|
+
|
|
628
|
+
const hist = _v2StatusHistory.get(appId) || [];
|
|
629
|
+
hist.push({
|
|
630
|
+
from: currentStatus,
|
|
631
|
+
to: status,
|
|
632
|
+
at: new Date().toISOString(),
|
|
633
|
+
});
|
|
634
|
+
_v2StatusHistory.set(appId, hist);
|
|
635
|
+
return { appId, status, previous: currentStatus };
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
export function archiveApp(db, appId) {
|
|
639
|
+
return updateAppStatus(db, { appId, status: APP_STATUS.ARCHIVED });
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
export function getStatusHistory(appId) {
|
|
643
|
+
return (_v2StatusHistory.get(appId) || []).slice();
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
export function cloneApp(db, { sourceId, newName }) {
|
|
647
|
+
const source = getApp(db, sourceId);
|
|
648
|
+
if (!source) throw new Error(`App '${sourceId}' not found`);
|
|
649
|
+
const cloned = createApp(db, {
|
|
650
|
+
name: newName || `${source.name} (Copy)`,
|
|
651
|
+
description: source.description,
|
|
652
|
+
platform: source.platform,
|
|
653
|
+
design: source.design,
|
|
654
|
+
});
|
|
655
|
+
// Persist the copied design so version snapshot matches source
|
|
656
|
+
if (
|
|
657
|
+
source.design &&
|
|
658
|
+
source.design.components &&
|
|
659
|
+
source.design.components.length > 0
|
|
660
|
+
) {
|
|
661
|
+
saveDesign(db, cloned.id, source.design);
|
|
662
|
+
}
|
|
663
|
+
return { sourceId, clonedId: cloned.id, name: cloned.name };
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
export function exportAppJSON(db, appId) {
|
|
667
|
+
const app = getApp(db, appId);
|
|
668
|
+
if (!app) throw new Error(`App '${appId}' not found`);
|
|
669
|
+
const legacy = exportApp(appId);
|
|
670
|
+
return {
|
|
671
|
+
schema: "chainlesschain.lowcode.v2",
|
|
672
|
+
exportedAt: new Date().toISOString(),
|
|
673
|
+
app,
|
|
674
|
+
dataSources: legacy.dataSources,
|
|
675
|
+
versions: legacy.versions,
|
|
676
|
+
};
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
export function importAppJSON(db, json) {
|
|
680
|
+
if (!json || typeof json !== "object") {
|
|
681
|
+
throw new Error("import payload must be a JSON object");
|
|
682
|
+
}
|
|
683
|
+
if (json.schema !== "chainlesschain.lowcode.v2") {
|
|
684
|
+
throw new Error(
|
|
685
|
+
`unsupported schema '${json.schema}'. Expected 'chainlesschain.lowcode.v2'`,
|
|
686
|
+
);
|
|
687
|
+
}
|
|
688
|
+
if (!json.app || !json.app.name) {
|
|
689
|
+
throw new Error("import payload missing app.name");
|
|
690
|
+
}
|
|
691
|
+
const imported = createApp(db, {
|
|
692
|
+
name: json.app.name,
|
|
693
|
+
description: json.app.description || "",
|
|
694
|
+
platform: json.app.platform || "web",
|
|
695
|
+
design: json.app.design || { components: [], layout: {} },
|
|
696
|
+
});
|
|
697
|
+
let dsCount = 0;
|
|
698
|
+
for (const ds of json.dataSources || []) {
|
|
699
|
+
if (!ds.type || !ds.name) continue;
|
|
700
|
+
if (!Object.values(DATASOURCE_TYPE).includes(ds.type)) continue;
|
|
701
|
+
registerDataSourceV2(db, {
|
|
702
|
+
appId: imported.id,
|
|
703
|
+
name: ds.name,
|
|
704
|
+
type: ds.type,
|
|
705
|
+
config: ds.config || {},
|
|
706
|
+
});
|
|
707
|
+
dsCount++;
|
|
708
|
+
}
|
|
709
|
+
return { importedId: imported.id, name: imported.name, dataSources: dsCount };
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
export function getLowcodeStatsV2(db) {
|
|
713
|
+
const rows = db.prepare(`SELECT status, platform FROM lowcode_apps`).all();
|
|
714
|
+
const byStatus = { draft: 0, published: 0, archived: 0, deployed: 0 };
|
|
715
|
+
const byPlatform = {};
|
|
716
|
+
for (const r of rows) {
|
|
717
|
+
const s = r.status || "draft";
|
|
718
|
+
byStatus[s] = (byStatus[s] || 0) + 1;
|
|
719
|
+
const p = r.platform || "web";
|
|
720
|
+
byPlatform[p] = (byPlatform[p] || 0) + 1;
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
const dsRows = db.prepare(`SELECT type FROM lowcode_datasources`).all();
|
|
724
|
+
const byDataSourceType = {};
|
|
725
|
+
for (const r of dsRows) {
|
|
726
|
+
byDataSourceType[r.type] = (byDataSourceType[r.type] || 0) + 1;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
return {
|
|
730
|
+
totalApps: rows.length,
|
|
731
|
+
byStatus,
|
|
732
|
+
byPlatform,
|
|
733
|
+
dataSources: {
|
|
734
|
+
total: dsRows.length,
|
|
735
|
+
byType: byDataSourceType,
|
|
736
|
+
},
|
|
737
|
+
componentsAvailable: listComponents().length,
|
|
738
|
+
};
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
export function _resetV2State() {
|
|
742
|
+
_v2DataSources.clear();
|
|
743
|
+
_v2StatusHistory.clear();
|
|
744
|
+
}
|