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.
Files changed (84) hide show
  1. package/README.md +309 -19
  2. package/bin/chainlesschain.js +4 -0
  3. package/package.json +1 -1
  4. package/src/commands/a2a.js +374 -0
  5. package/src/commands/audit.js +286 -0
  6. package/src/commands/auth.js +387 -0
  7. package/src/commands/bi.js +240 -0
  8. package/src/commands/browse.js +184 -0
  9. package/src/commands/cowork.js +317 -0
  10. package/src/commands/did.js +376 -0
  11. package/src/commands/economy.js +375 -0
  12. package/src/commands/encrypt.js +233 -0
  13. package/src/commands/evolution.js +398 -0
  14. package/src/commands/export.js +125 -0
  15. package/src/commands/git.js +215 -0
  16. package/src/commands/hmemory.js +273 -0
  17. package/src/commands/hook.js +260 -0
  18. package/src/commands/import.js +259 -0
  19. package/src/commands/init.js +184 -0
  20. package/src/commands/instinct.js +202 -0
  21. package/src/commands/llm.js +155 -4
  22. package/src/commands/lowcode.js +320 -0
  23. package/src/commands/mcp.js +302 -0
  24. package/src/commands/memory.js +282 -0
  25. package/src/commands/note.js +187 -0
  26. package/src/commands/org.js +505 -0
  27. package/src/commands/p2p.js +274 -0
  28. package/src/commands/plugin.js +451 -0
  29. package/src/commands/sandbox.js +366 -0
  30. package/src/commands/search.js +237 -0
  31. package/src/commands/session.js +238 -0
  32. package/src/commands/skill.js +254 -201
  33. package/src/commands/sync.js +249 -0
  34. package/src/commands/tokens.js +214 -0
  35. package/src/commands/wallet.js +416 -0
  36. package/src/commands/workflow.js +359 -0
  37. package/src/commands/zkp.js +277 -0
  38. package/src/index.js +93 -1
  39. package/src/lib/a2a-protocol.js +371 -0
  40. package/src/lib/agent-coordinator.js +273 -0
  41. package/src/lib/agent-economy.js +369 -0
  42. package/src/lib/app-builder.js +377 -0
  43. package/src/lib/audit-logger.js +364 -0
  44. package/src/lib/bi-engine.js +299 -0
  45. package/src/lib/bm25-search.js +322 -0
  46. package/src/lib/browser-automation.js +216 -0
  47. package/src/lib/cowork/ab-comparator-cli.js +180 -0
  48. package/src/lib/cowork/code-knowledge-graph-cli.js +232 -0
  49. package/src/lib/cowork/debate-review-cli.js +144 -0
  50. package/src/lib/cowork/decision-kb-cli.js +153 -0
  51. package/src/lib/cowork/project-style-analyzer-cli.js +168 -0
  52. package/src/lib/cowork-adapter.js +106 -0
  53. package/src/lib/crypto-manager.js +246 -0
  54. package/src/lib/did-manager.js +270 -0
  55. package/src/lib/ensure-utf8.js +59 -0
  56. package/src/lib/evolution-system.js +508 -0
  57. package/src/lib/git-integration.js +220 -0
  58. package/src/lib/hierarchical-memory.js +471 -0
  59. package/src/lib/hook-manager.js +387 -0
  60. package/src/lib/instinct-manager.js +190 -0
  61. package/src/lib/knowledge-exporter.js +302 -0
  62. package/src/lib/knowledge-importer.js +293 -0
  63. package/src/lib/llm-providers.js +325 -0
  64. package/src/lib/mcp-client.js +413 -0
  65. package/src/lib/memory-manager.js +211 -0
  66. package/src/lib/note-versioning.js +244 -0
  67. package/src/lib/org-manager.js +424 -0
  68. package/src/lib/p2p-manager.js +317 -0
  69. package/src/lib/pdf-parser.js +96 -0
  70. package/src/lib/permission-engine.js +374 -0
  71. package/src/lib/plan-mode.js +333 -0
  72. package/src/lib/plugin-manager.js +430 -0
  73. package/src/lib/project-detector.js +53 -0
  74. package/src/lib/response-cache.js +156 -0
  75. package/src/lib/sandbox-v2.js +503 -0
  76. package/src/lib/service-container.js +183 -0
  77. package/src/lib/session-manager.js +189 -0
  78. package/src/lib/skill-loader.js +274 -0
  79. package/src/lib/sync-manager.js +347 -0
  80. package/src/lib/token-tracker.js +200 -0
  81. package/src/lib/wallet-manager.js +348 -0
  82. package/src/lib/workflow-engine.js +503 -0
  83. package/src/lib/zkp-engine.js +241 -0
  84. 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
+ }