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,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session management commands
|
|
3
|
+
* chainlesschain session list|show|resume|export|delete
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import fs from "fs";
|
|
7
|
+
import chalk from "chalk";
|
|
8
|
+
import { logger } from "../lib/logger.js";
|
|
9
|
+
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
10
|
+
import {
|
|
11
|
+
listSessions,
|
|
12
|
+
getSession,
|
|
13
|
+
deleteSession,
|
|
14
|
+
exportSessionMarkdown,
|
|
15
|
+
} from "../lib/session-manager.js";
|
|
16
|
+
|
|
17
|
+
export function registerSessionCommand(program) {
|
|
18
|
+
const session = program
|
|
19
|
+
.command("session")
|
|
20
|
+
.description("Conversation session management");
|
|
21
|
+
|
|
22
|
+
// session list
|
|
23
|
+
session
|
|
24
|
+
.command("list", { isDefault: true })
|
|
25
|
+
.description("List saved sessions")
|
|
26
|
+
.option("-n, --limit <n>", "Max sessions", "20")
|
|
27
|
+
.option("--json", "Output as JSON")
|
|
28
|
+
.action(async (options) => {
|
|
29
|
+
try {
|
|
30
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
31
|
+
if (!ctx.db) {
|
|
32
|
+
logger.error("Database not available");
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
const db = ctx.db.getDatabase();
|
|
36
|
+
const sessions = listSessions(db, {
|
|
37
|
+
limit: Math.max(1, parseInt(options.limit) || 20),
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
if (options.json) {
|
|
41
|
+
console.log(JSON.stringify(sessions, null, 2));
|
|
42
|
+
} else if (sessions.length === 0) {
|
|
43
|
+
logger.info(
|
|
44
|
+
"No saved sessions. Use 'chat' or 'agent' to create one.",
|
|
45
|
+
);
|
|
46
|
+
} else {
|
|
47
|
+
logger.log(chalk.bold(`Sessions (${sessions.length}):\n`));
|
|
48
|
+
for (const s of sessions) {
|
|
49
|
+
logger.log(
|
|
50
|
+
` ${chalk.gray(s.id.slice(0, 16))} ${chalk.white(s.title)} ${chalk.cyan(s.message_count + " msgs")} ${chalk.gray(s.updated_at)}`,
|
|
51
|
+
);
|
|
52
|
+
if (s.summary) {
|
|
53
|
+
logger.log(` ${chalk.gray(s.summary.substring(0, 100))}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
await shutdown();
|
|
59
|
+
} catch (err) {
|
|
60
|
+
logger.error(`Failed: ${err.message}`);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
// session show
|
|
66
|
+
session
|
|
67
|
+
.command("show")
|
|
68
|
+
.description("Show a session's messages")
|
|
69
|
+
.argument("<id>", "Session ID (or prefix)")
|
|
70
|
+
.option("-n, --limit <n>", "Max messages to show")
|
|
71
|
+
.option("--json", "Output as JSON")
|
|
72
|
+
.action(async (id, options) => {
|
|
73
|
+
try {
|
|
74
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
75
|
+
if (!ctx.db) {
|
|
76
|
+
logger.error("Database not available");
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
const db = ctx.db.getDatabase();
|
|
80
|
+
const sess = getSession(db, id);
|
|
81
|
+
|
|
82
|
+
if (!sess) {
|
|
83
|
+
logger.error(`Session not found: ${id}`);
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (options.json) {
|
|
88
|
+
console.log(JSON.stringify(sess, null, 2));
|
|
89
|
+
} else {
|
|
90
|
+
logger.log(chalk.bold(sess.title));
|
|
91
|
+
logger.log(
|
|
92
|
+
chalk.gray(
|
|
93
|
+
`ID: ${sess.id} Provider: ${sess.provider} Model: ${sess.model} Messages: ${sess.message_count}`,
|
|
94
|
+
),
|
|
95
|
+
);
|
|
96
|
+
logger.log("");
|
|
97
|
+
|
|
98
|
+
let messages = sess.messages;
|
|
99
|
+
if (options.limit) {
|
|
100
|
+
messages = messages.slice(-parseInt(options.limit));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
for (const msg of messages) {
|
|
104
|
+
if (msg.role === "system") continue;
|
|
105
|
+
const label =
|
|
106
|
+
msg.role === "user" ? chalk.green("you> ") : chalk.blue("ai> ");
|
|
107
|
+
const content = (msg.content || "").substring(0, 500);
|
|
108
|
+
logger.log(`${label}${content}`);
|
|
109
|
+
logger.log("");
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
await shutdown();
|
|
114
|
+
} catch (err) {
|
|
115
|
+
logger.error(`Failed: ${err.message}`);
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
// session resume
|
|
121
|
+
session
|
|
122
|
+
.command("resume")
|
|
123
|
+
.description("Resume a session in chat mode")
|
|
124
|
+
.argument("<id>", "Session ID (or prefix)")
|
|
125
|
+
.option("--model <model>", "Model name")
|
|
126
|
+
.option("--provider <provider>", "LLM provider")
|
|
127
|
+
.action(async (id, options) => {
|
|
128
|
+
try {
|
|
129
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
130
|
+
if (!ctx.db) {
|
|
131
|
+
logger.error("Database not available");
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
const db = ctx.db.getDatabase();
|
|
135
|
+
const sess = getSession(db, id);
|
|
136
|
+
|
|
137
|
+
if (!sess) {
|
|
138
|
+
logger.error(`Session not found: ${id}`);
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
logger.info(
|
|
143
|
+
`Resuming session: ${chalk.cyan(sess.title)} (${sess.message_count} messages)`,
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
// Import and start chat REPL with restored messages
|
|
147
|
+
const { startChatRepl } = await import("../repl/chat-repl.js");
|
|
148
|
+
await startChatRepl({
|
|
149
|
+
model: options.model || sess.model || "qwen2:7b",
|
|
150
|
+
provider: options.provider || sess.provider || "ollama",
|
|
151
|
+
baseUrl: options.baseUrl || "http://localhost:11434",
|
|
152
|
+
resumeMessages: sess.messages,
|
|
153
|
+
sessionId: sess.id,
|
|
154
|
+
});
|
|
155
|
+
} catch (err) {
|
|
156
|
+
logger.error(`Failed: ${err.message}`);
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
// session export
|
|
162
|
+
session
|
|
163
|
+
.command("export")
|
|
164
|
+
.description("Export a session as Markdown")
|
|
165
|
+
.argument("<id>", "Session ID (or prefix)")
|
|
166
|
+
.option("-o, --output <file>", "Output file path")
|
|
167
|
+
.action(async (id, options) => {
|
|
168
|
+
try {
|
|
169
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
170
|
+
if (!ctx.db) {
|
|
171
|
+
logger.error("Database not available");
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
const db = ctx.db.getDatabase();
|
|
175
|
+
const sess = getSession(db, id);
|
|
176
|
+
|
|
177
|
+
if (!sess) {
|
|
178
|
+
logger.error(`Session not found: ${id}`);
|
|
179
|
+
process.exit(1);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const markdown = exportSessionMarkdown(sess);
|
|
183
|
+
|
|
184
|
+
if (options.output) {
|
|
185
|
+
fs.writeFileSync(options.output, markdown, "utf8");
|
|
186
|
+
logger.success(`Exported to ${chalk.cyan(options.output)}`);
|
|
187
|
+
} else {
|
|
188
|
+
console.log(markdown);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
await shutdown();
|
|
192
|
+
} catch (err) {
|
|
193
|
+
logger.error(`Failed: ${err.message}`);
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
// session delete
|
|
199
|
+
session
|
|
200
|
+
.command("delete")
|
|
201
|
+
.description("Delete a session")
|
|
202
|
+
.argument("<id>", "Session ID")
|
|
203
|
+
.option("--force", "Skip confirmation")
|
|
204
|
+
.action(async (id, options) => {
|
|
205
|
+
try {
|
|
206
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
207
|
+
if (!ctx.db) {
|
|
208
|
+
logger.error("Database not available");
|
|
209
|
+
process.exit(1);
|
|
210
|
+
}
|
|
211
|
+
const db = ctx.db.getDatabase();
|
|
212
|
+
|
|
213
|
+
if (!options.force) {
|
|
214
|
+
const { confirm } = await import("@inquirer/prompts");
|
|
215
|
+
const ok = await confirm({
|
|
216
|
+
message: `Delete session "${id}"?`,
|
|
217
|
+
});
|
|
218
|
+
if (!ok) {
|
|
219
|
+
logger.info("Cancelled");
|
|
220
|
+
await shutdown();
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const ok = deleteSession(db, id);
|
|
226
|
+
if (ok) {
|
|
227
|
+
logger.success("Session deleted");
|
|
228
|
+
} else {
|
|
229
|
+
logger.error(`Session not found: ${id}`);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
await shutdown();
|
|
233
|
+
} catch (err) {
|
|
234
|
+
logger.error(`Failed: ${err.message}`);
|
|
235
|
+
process.exit(1);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
}
|