chainlesschain 0.37.9 → 0.37.11
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/README.md +309 -19
- package/bin/chainlesschain.js +4 -0
- package/package.json +1 -1
- package/src/commands/a2a.js +374 -0
- package/src/commands/audit.js +286 -0
- package/src/commands/auth.js +387 -0
- package/src/commands/bi.js +240 -0
- package/src/commands/browse.js +184 -0
- package/src/commands/cowork.js +317 -0
- package/src/commands/did.js +376 -0
- package/src/commands/economy.js +375 -0
- package/src/commands/encrypt.js +233 -0
- package/src/commands/evolution.js +398 -0
- package/src/commands/export.js +125 -0
- package/src/commands/git.js +215 -0
- package/src/commands/hmemory.js +273 -0
- package/src/commands/hook.js +260 -0
- package/src/commands/import.js +259 -0
- package/src/commands/init.js +184 -0
- package/src/commands/instinct.js +202 -0
- package/src/commands/llm.js +155 -4
- package/src/commands/lowcode.js +320 -0
- package/src/commands/mcp.js +302 -0
- package/src/commands/memory.js +282 -0
- package/src/commands/note.js +187 -0
- package/src/commands/org.js +505 -0
- package/src/commands/p2p.js +274 -0
- package/src/commands/plugin.js +451 -0
- package/src/commands/sandbox.js +366 -0
- package/src/commands/search.js +237 -0
- package/src/commands/session.js +238 -0
- package/src/commands/skill.js +254 -201
- package/src/commands/sync.js +249 -0
- package/src/commands/tokens.js +214 -0
- package/src/commands/wallet.js +416 -0
- package/src/commands/workflow.js +359 -0
- package/src/commands/zkp.js +277 -0
- package/src/index.js +93 -1
- package/src/lib/a2a-protocol.js +371 -0
- package/src/lib/agent-coordinator.js +273 -0
- package/src/lib/agent-economy.js +369 -0
- package/src/lib/app-builder.js +377 -0
- package/src/lib/audit-logger.js +364 -0
- package/src/lib/bi-engine.js +299 -0
- package/src/lib/bm25-search.js +322 -0
- package/src/lib/browser-automation.js +216 -0
- package/src/lib/cowork/ab-comparator-cli.js +180 -0
- package/src/lib/cowork/code-knowledge-graph-cli.js +232 -0
- package/src/lib/cowork/debate-review-cli.js +144 -0
- package/src/lib/cowork/decision-kb-cli.js +153 -0
- package/src/lib/cowork/project-style-analyzer-cli.js +168 -0
- package/src/lib/cowork-adapter.js +106 -0
- package/src/lib/crypto-manager.js +246 -0
- package/src/lib/did-manager.js +270 -0
- package/src/lib/ensure-utf8.js +59 -0
- package/src/lib/evolution-system.js +508 -0
- package/src/lib/git-integration.js +220 -0
- package/src/lib/hierarchical-memory.js +471 -0
- package/src/lib/hook-manager.js +387 -0
- package/src/lib/instinct-manager.js +190 -0
- package/src/lib/knowledge-exporter.js +302 -0
- package/src/lib/knowledge-importer.js +293 -0
- package/src/lib/llm-providers.js +325 -0
- package/src/lib/mcp-client.js +413 -0
- package/src/lib/memory-manager.js +211 -0
- package/src/lib/note-versioning.js +244 -0
- package/src/lib/org-manager.js +424 -0
- package/src/lib/p2p-manager.js +317 -0
- package/src/lib/pdf-parser.js +96 -0
- package/src/lib/permission-engine.js +374 -0
- package/src/lib/plan-mode.js +333 -0
- package/src/lib/plugin-manager.js +430 -0
- package/src/lib/project-detector.js +53 -0
- package/src/lib/response-cache.js +156 -0
- package/src/lib/sandbox-v2.js +503 -0
- package/src/lib/service-container.js +183 -0
- package/src/lib/session-manager.js +189 -0
- package/src/lib/skill-loader.js +274 -0
- package/src/lib/sync-manager.js +347 -0
- package/src/lib/token-tracker.js +200 -0
- package/src/lib/wallet-manager.js +348 -0
- package/src/lib/workflow-engine.js +503 -0
- package/src/lib/zkp-engine.js +241 -0
- package/src/repl/agent-repl.js +259 -124
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Low-Code App Builder — create, design, preview, publish, and manage
|
|
3
|
+
* low-code applications with built-in components and data sources.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import crypto from "crypto";
|
|
7
|
+
|
|
8
|
+
/** @type {Map<string, object>} In-memory app cache */
|
|
9
|
+
const _apps = new Map();
|
|
10
|
+
|
|
11
|
+
/** @type {Map<string, object>} In-memory data sources */
|
|
12
|
+
const _dataSources = new Map();
|
|
13
|
+
|
|
14
|
+
/** @type {Map<string, object[]>} In-memory version history */
|
|
15
|
+
const _versions = new Map();
|
|
16
|
+
|
|
17
|
+
/** @type {object[]|null} Cached built-in component list */
|
|
18
|
+
let _components = null;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Return the 15 built-in components, initializing on first call.
|
|
22
|
+
*
|
|
23
|
+
* @returns {object[]}
|
|
24
|
+
*/
|
|
25
|
+
export function listComponents() {
|
|
26
|
+
if (!_components) {
|
|
27
|
+
_components = [
|
|
28
|
+
{
|
|
29
|
+
name: "Form",
|
|
30
|
+
category: "input",
|
|
31
|
+
props: ["fields", "onSubmit", "validation"],
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: "DataTable",
|
|
35
|
+
category: "display",
|
|
36
|
+
props: ["columns", "data", "pagination", "sortable"],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: "BarChart",
|
|
40
|
+
category: "chart",
|
|
41
|
+
props: ["data", "xAxis", "yAxis", "colors"],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: "LineChart",
|
|
45
|
+
category: "chart",
|
|
46
|
+
props: ["data", "xAxis", "yAxis", "smooth"],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: "PieChart",
|
|
50
|
+
category: "chart",
|
|
51
|
+
props: ["data", "labels", "colors"],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: "Dashboard",
|
|
55
|
+
category: "layout",
|
|
56
|
+
props: ["widgets", "layout", "refreshInterval"],
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: "Button",
|
|
60
|
+
category: "input",
|
|
61
|
+
props: ["label", "onClick", "variant", "disabled"],
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: "TextInput",
|
|
65
|
+
category: "input",
|
|
66
|
+
props: ["placeholder", "value", "onChange", "type"],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: "Select",
|
|
70
|
+
category: "input",
|
|
71
|
+
props: ["options", "value", "onChange", "multiple"],
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: "Modal",
|
|
75
|
+
category: "overlay",
|
|
76
|
+
props: ["visible", "title", "onClose", "width"],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: "Card",
|
|
80
|
+
category: "layout",
|
|
81
|
+
props: ["title", "content", "footer"],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: "List",
|
|
85
|
+
category: "display",
|
|
86
|
+
props: ["items", "renderItem", "pagination"],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: "Image",
|
|
90
|
+
category: "display",
|
|
91
|
+
props: ["src", "alt", "width", "height"],
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: "Tabs",
|
|
95
|
+
category: "layout",
|
|
96
|
+
props: ["tabs", "activeKey", "onChange"],
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: "Calendar",
|
|
100
|
+
category: "display",
|
|
101
|
+
props: ["events", "view", "onSelect"],
|
|
102
|
+
},
|
|
103
|
+
];
|
|
104
|
+
}
|
|
105
|
+
return _components;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Ensure low-code tables exist in the database.
|
|
110
|
+
*
|
|
111
|
+
* @param {object} db
|
|
112
|
+
*/
|
|
113
|
+
export function ensureLowcodeTables(db) {
|
|
114
|
+
db.exec(`
|
|
115
|
+
CREATE TABLE IF NOT EXISTS lowcode_apps (
|
|
116
|
+
id TEXT PRIMARY KEY,
|
|
117
|
+
name TEXT NOT NULL,
|
|
118
|
+
description TEXT,
|
|
119
|
+
design TEXT,
|
|
120
|
+
status TEXT DEFAULT 'draft',
|
|
121
|
+
version INTEGER DEFAULT 1,
|
|
122
|
+
platform TEXT DEFAULT 'web',
|
|
123
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
124
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
125
|
+
)
|
|
126
|
+
`);
|
|
127
|
+
db.exec(`
|
|
128
|
+
CREATE TABLE IF NOT EXISTS lowcode_datasources (
|
|
129
|
+
id TEXT PRIMARY KEY,
|
|
130
|
+
app_id TEXT NOT NULL,
|
|
131
|
+
name TEXT NOT NULL,
|
|
132
|
+
type TEXT NOT NULL,
|
|
133
|
+
config TEXT,
|
|
134
|
+
status TEXT DEFAULT 'active',
|
|
135
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
136
|
+
)
|
|
137
|
+
`);
|
|
138
|
+
db.exec(`
|
|
139
|
+
CREATE TABLE IF NOT EXISTS lowcode_versions (
|
|
140
|
+
id TEXT PRIMARY KEY,
|
|
141
|
+
app_id TEXT NOT NULL,
|
|
142
|
+
version INTEGER NOT NULL,
|
|
143
|
+
snapshot TEXT,
|
|
144
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
145
|
+
)
|
|
146
|
+
`);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Create a new low-code application.
|
|
151
|
+
*
|
|
152
|
+
* @param {object} db
|
|
153
|
+
* @param {{ name: string, description?: string, platform?: string, design?: object }} definition
|
|
154
|
+
* @returns {{ id: string, name: string, status: string }}
|
|
155
|
+
*/
|
|
156
|
+
export function createApp(db, definition) {
|
|
157
|
+
const id = crypto.randomUUID().slice(0, 12);
|
|
158
|
+
const name = definition.name || "Untitled App";
|
|
159
|
+
const description = definition.description || "";
|
|
160
|
+
const platform = definition.platform || "web";
|
|
161
|
+
const design = definition.design || { components: [], layout: {} };
|
|
162
|
+
|
|
163
|
+
const stmt = db.prepare(
|
|
164
|
+
`INSERT INTO lowcode_apps (id, name, description, design, status, version, platform)
|
|
165
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`,
|
|
166
|
+
);
|
|
167
|
+
stmt.run(id, name, description, JSON.stringify(design), "draft", 1, platform);
|
|
168
|
+
|
|
169
|
+
const app = {
|
|
170
|
+
id,
|
|
171
|
+
name,
|
|
172
|
+
description,
|
|
173
|
+
platform,
|
|
174
|
+
design,
|
|
175
|
+
status: "draft",
|
|
176
|
+
version: 1,
|
|
177
|
+
};
|
|
178
|
+
_apps.set(id, app);
|
|
179
|
+
|
|
180
|
+
// Create initial version snapshot
|
|
181
|
+
const versionId = crypto.randomUUID().slice(0, 12);
|
|
182
|
+
const vStmt = db.prepare(
|
|
183
|
+
`INSERT INTO lowcode_versions (id, app_id, version, snapshot)
|
|
184
|
+
VALUES (?, ?, ?, ?)`,
|
|
185
|
+
);
|
|
186
|
+
vStmt.run(versionId, id, 1, JSON.stringify(design));
|
|
187
|
+
|
|
188
|
+
if (!_versions.has(id)) _versions.set(id, []);
|
|
189
|
+
_versions
|
|
190
|
+
.get(id)
|
|
191
|
+
.push({ id: versionId, app_id: id, version: 1, snapshot: design });
|
|
192
|
+
|
|
193
|
+
return { id, name, status: "draft" };
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Save a new design for an app, bump the version, and create a snapshot.
|
|
198
|
+
*
|
|
199
|
+
* @param {object} db
|
|
200
|
+
* @param {string} appId
|
|
201
|
+
* @param {object} design
|
|
202
|
+
* @returns {{ appId: string, version: number }}
|
|
203
|
+
*/
|
|
204
|
+
export function saveDesign(db, appId, design) {
|
|
205
|
+
// Get current version
|
|
206
|
+
const row = db
|
|
207
|
+
.prepare(`SELECT version FROM lowcode_apps WHERE id = ?`)
|
|
208
|
+
.get(appId);
|
|
209
|
+
const currentVersion = row ? row.version || 1 : 1;
|
|
210
|
+
const newVersion = currentVersion + 1;
|
|
211
|
+
|
|
212
|
+
db.prepare(
|
|
213
|
+
`UPDATE lowcode_apps SET design = ?, version = ?, updated_at = datetime('now') WHERE id = ?`,
|
|
214
|
+
).run(JSON.stringify(design), newVersion, appId);
|
|
215
|
+
|
|
216
|
+
// Create version snapshot
|
|
217
|
+
const versionId = crypto.randomUUID().slice(0, 12);
|
|
218
|
+
db.prepare(
|
|
219
|
+
`INSERT INTO lowcode_versions (id, app_id, version, snapshot) VALUES (?, ?, ?, ?)`,
|
|
220
|
+
).run(versionId, appId, newVersion, JSON.stringify(design));
|
|
221
|
+
|
|
222
|
+
if (!_versions.has(appId)) _versions.set(appId, []);
|
|
223
|
+
_versions
|
|
224
|
+
.get(appId)
|
|
225
|
+
.push({
|
|
226
|
+
id: versionId,
|
|
227
|
+
app_id: appId,
|
|
228
|
+
version: newVersion,
|
|
229
|
+
snapshot: design,
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
if (_apps.has(appId)) {
|
|
233
|
+
_apps.get(appId).design = design;
|
|
234
|
+
_apps.get(appId).version = newVersion;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return { appId, version: newVersion };
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Get preview info for an application.
|
|
242
|
+
*
|
|
243
|
+
* @param {string} appId
|
|
244
|
+
* @returns {{ appId: string, design: object, previewUrl: string, platform: string }}
|
|
245
|
+
*/
|
|
246
|
+
export function previewApp(appId) {
|
|
247
|
+
const app = _apps.get(appId);
|
|
248
|
+
const design = app ? app.design : { components: [], layout: {} };
|
|
249
|
+
const platform = app ? app.platform : "web";
|
|
250
|
+
|
|
251
|
+
return {
|
|
252
|
+
appId,
|
|
253
|
+
design,
|
|
254
|
+
previewUrl: `http://localhost:5173/lowcode/preview/${appId}`,
|
|
255
|
+
platform,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Publish an application (set status to 'published').
|
|
261
|
+
*
|
|
262
|
+
* @param {object} db
|
|
263
|
+
* @param {string} appId
|
|
264
|
+
* @returns {{ appId: string, status: string }}
|
|
265
|
+
*/
|
|
266
|
+
export function publishApp(db, appId) {
|
|
267
|
+
db.prepare(
|
|
268
|
+
`UPDATE lowcode_apps SET status = ?, updated_at = datetime('now') WHERE id = ?`,
|
|
269
|
+
).run("published", appId);
|
|
270
|
+
|
|
271
|
+
if (_apps.has(appId)) {
|
|
272
|
+
_apps.get(appId).status = "published";
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return { appId, status: "published" };
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Add a data source to an application.
|
|
280
|
+
*
|
|
281
|
+
* @param {object} db
|
|
282
|
+
* @param {string} appId
|
|
283
|
+
* @param {string} name
|
|
284
|
+
* @param {string} type - e.g. "rest", "graphql", "database", "csv"
|
|
285
|
+
* @param {object} config
|
|
286
|
+
* @returns {{ id: string, appId: string, name: string, type: string }}
|
|
287
|
+
*/
|
|
288
|
+
export function addDataSource(db, appId, name, type, config) {
|
|
289
|
+
const id = crypto.randomUUID().slice(0, 12);
|
|
290
|
+
const stmt = db.prepare(
|
|
291
|
+
`INSERT INTO lowcode_datasources (id, app_id, name, type, config, status)
|
|
292
|
+
VALUES (?, ?, ?, ?, ?, ?)`,
|
|
293
|
+
);
|
|
294
|
+
stmt.run(id, appId, name, type, JSON.stringify(config || {}), "active");
|
|
295
|
+
|
|
296
|
+
_dataSources.set(id, { id, appId, name, type, config, status: "active" });
|
|
297
|
+
|
|
298
|
+
return { id, appId, name, type };
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Get version history for an application.
|
|
303
|
+
*
|
|
304
|
+
* @param {string} appId
|
|
305
|
+
* @returns {object[]}
|
|
306
|
+
*/
|
|
307
|
+
export function getVersions(appId) {
|
|
308
|
+
return _versions.get(appId) || [];
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Rollback an application to a previous version.
|
|
313
|
+
*
|
|
314
|
+
* @param {object} db
|
|
315
|
+
* @param {string} appId
|
|
316
|
+
* @param {number} version
|
|
317
|
+
* @returns {{ appId: string, version: number, restored: boolean }}
|
|
318
|
+
*/
|
|
319
|
+
export function rollbackApp(db, appId, version) {
|
|
320
|
+
const versions = _versions.get(appId) || [];
|
|
321
|
+
const target = versions.find((v) => v.version === version);
|
|
322
|
+
|
|
323
|
+
if (!target) {
|
|
324
|
+
return { appId, version, restored: false };
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
const design = target.snapshot;
|
|
328
|
+
db.prepare(
|
|
329
|
+
`UPDATE lowcode_apps SET design = ?, version = ?, updated_at = datetime('now') WHERE id = ?`,
|
|
330
|
+
).run(JSON.stringify(design), version, appId);
|
|
331
|
+
|
|
332
|
+
if (_apps.has(appId)) {
|
|
333
|
+
_apps.get(appId).design = design;
|
|
334
|
+
_apps.get(appId).version = version;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
return { appId, version, restored: true };
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Export an app definition with data sources.
|
|
342
|
+
*
|
|
343
|
+
* @param {string} appId
|
|
344
|
+
* @returns {{ appId: string, app: object|null, dataSources: object[], versions: object[] }}
|
|
345
|
+
*/
|
|
346
|
+
export function exportApp(appId) {
|
|
347
|
+
const app = _apps.get(appId) || null;
|
|
348
|
+
const dataSources = [];
|
|
349
|
+
for (const [, ds] of _dataSources) {
|
|
350
|
+
if (ds.appId === appId) dataSources.push(ds);
|
|
351
|
+
}
|
|
352
|
+
const versions = _versions.get(appId) || [];
|
|
353
|
+
|
|
354
|
+
return { appId, app, dataSources, versions };
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* List all applications from the database.
|
|
359
|
+
*
|
|
360
|
+
* @param {object} db
|
|
361
|
+
* @returns {object[]}
|
|
362
|
+
*/
|
|
363
|
+
export function listApps(db) {
|
|
364
|
+
const rows = db
|
|
365
|
+
.prepare(`SELECT * FROM lowcode_apps ORDER BY updated_at DESC`)
|
|
366
|
+
.all();
|
|
367
|
+
return rows.map((r) => ({
|
|
368
|
+
id: r.id,
|
|
369
|
+
name: r.name,
|
|
370
|
+
description: r.description,
|
|
371
|
+
status: r.status,
|
|
372
|
+
version: r.version,
|
|
373
|
+
platform: r.platform,
|
|
374
|
+
created_at: r.created_at,
|
|
375
|
+
updated_at: r.updated_at,
|
|
376
|
+
}));
|
|
377
|
+
}
|