seclaw-agent 0.1.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.
Files changed (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +668 -0
  3. package/SECURITY.md +253 -0
  4. package/assets/logo.png +0 -0
  5. package/dist/agent/context.d.ts +37 -0
  6. package/dist/agent/context.d.ts.map +1 -0
  7. package/dist/agent/context.js +211 -0
  8. package/dist/agent/context.js.map +1 -0
  9. package/dist/agent/docker_sandbox.d.ts +41 -0
  10. package/dist/agent/docker_sandbox.d.ts.map +1 -0
  11. package/dist/agent/docker_sandbox.js +239 -0
  12. package/dist/agent/docker_sandbox.js.map +1 -0
  13. package/dist/agent/loop.d.ts +86 -0
  14. package/dist/agent/loop.d.ts.map +1 -0
  15. package/dist/agent/loop.js +858 -0
  16. package/dist/agent/loop.js.map +1 -0
  17. package/dist/agent/memory.d.ts +21 -0
  18. package/dist/agent/memory.d.ts.map +1 -0
  19. package/dist/agent/memory.js +128 -0
  20. package/dist/agent/memory.js.map +1 -0
  21. package/dist/agent/security/execution_audit.d.ts +17 -0
  22. package/dist/agent/security/execution_audit.d.ts.map +1 -0
  23. package/dist/agent/security/execution_audit.js +126 -0
  24. package/dist/agent/security/execution_audit.js.map +1 -0
  25. package/dist/agent/security/input_validation/entity.d.ts +57 -0
  26. package/dist/agent/security/input_validation/entity.d.ts.map +1 -0
  27. package/dist/agent/security/input_validation/entity.js +121 -0
  28. package/dist/agent/security/input_validation/entity.js.map +1 -0
  29. package/dist/agent/security/input_validation/index.d.ts +114 -0
  30. package/dist/agent/security/input_validation/index.d.ts.map +1 -0
  31. package/dist/agent/security/input_validation/index.js +971 -0
  32. package/dist/agent/security/input_validation/index.js.map +1 -0
  33. package/dist/agent/security/input_validation/lattice.d.ts +33 -0
  34. package/dist/agent/security/input_validation/lattice.d.ts.map +1 -0
  35. package/dist/agent/security/input_validation/lattice.js +61 -0
  36. package/dist/agent/security/input_validation/lattice.js.map +1 -0
  37. package/dist/agent/security/input_validation/program_graph.d.ts +51 -0
  38. package/dist/agent/security/input_validation/program_graph.d.ts.map +1 -0
  39. package/dist/agent/security/input_validation/program_graph.js +285 -0
  40. package/dist/agent/security/input_validation/program_graph.js.map +1 -0
  41. package/dist/agent/security/input_validation/security_policy.d.ts +29 -0
  42. package/dist/agent/security/input_validation/security_policy.d.ts.map +1 -0
  43. package/dist/agent/security/input_validation/security_policy.js +256 -0
  44. package/dist/agent/security/input_validation/security_policy.js.map +1 -0
  45. package/dist/agent/security/memory_audit.d.ts +14 -0
  46. package/dist/agent/security/memory_audit.d.ts.map +1 -0
  47. package/dist/agent/security/memory_audit.js +126 -0
  48. package/dist/agent/security/memory_audit.js.map +1 -0
  49. package/dist/agent/security/skill_audit.d.ts +15 -0
  50. package/dist/agent/security/skill_audit.d.ts.map +1 -0
  51. package/dist/agent/security/skill_audit.js +112 -0
  52. package/dist/agent/security/skill_audit.js.map +1 -0
  53. package/dist/agent/security/snapshot_and_rollback/base.d.ts +10 -0
  54. package/dist/agent/security/snapshot_and_rollback/base.d.ts.map +1 -0
  55. package/dist/agent/security/snapshot_and_rollback/base.js +10 -0
  56. package/dist/agent/security/snapshot_and_rollback/base.js.map +1 -0
  57. package/dist/agent/security/snapshot_and_rollback/docker_snapshot.d.ts +52 -0
  58. package/dist/agent/security/snapshot_and_rollback/docker_snapshot.d.ts.map +1 -0
  59. package/dist/agent/security/snapshot_and_rollback/docker_snapshot.js +358 -0
  60. package/dist/agent/security/snapshot_and_rollback/docker_snapshot.js.map +1 -0
  61. package/dist/agent/security/snapshot_and_rollback/index.d.ts +7 -0
  62. package/dist/agent/security/snapshot_and_rollback/index.d.ts.map +1 -0
  63. package/dist/agent/security/snapshot_and_rollback/index.js +450 -0
  64. package/dist/agent/security/snapshot_and_rollback/index.js.map +1 -0
  65. package/dist/agent/skills.d.ts +35 -0
  66. package/dist/agent/skills.d.ts.map +1 -0
  67. package/dist/agent/skills.js +235 -0
  68. package/dist/agent/skills.js.map +1 -0
  69. package/dist/agent/subagent.d.ts +39 -0
  70. package/dist/agent/subagent.d.ts.map +1 -0
  71. package/dist/agent/subagent.js +151 -0
  72. package/dist/agent/subagent.js.map +1 -0
  73. package/dist/agent/tools/base.d.ts +32 -0
  74. package/dist/agent/tools/base.d.ts.map +1 -0
  75. package/dist/agent/tools/base.js +91 -0
  76. package/dist/agent/tools/base.js.map +1 -0
  77. package/dist/agent/tools/cron.d.ts +46 -0
  78. package/dist/agent/tools/cron.d.ts.map +1 -0
  79. package/dist/agent/tools/cron.js +95 -0
  80. package/dist/agent/tools/cron.js.map +1 -0
  81. package/dist/agent/tools/filesystem.d.ts +102 -0
  82. package/dist/agent/tools/filesystem.d.ts.map +1 -0
  83. package/dist/agent/tools/filesystem.js +257 -0
  84. package/dist/agent/tools/filesystem.js.map +1 -0
  85. package/dist/agent/tools/message.d.ts +40 -0
  86. package/dist/agent/tools/message.d.ts.map +1 -0
  87. package/dist/agent/tools/message.js +55 -0
  88. package/dist/agent/tools/message.js.map +1 -0
  89. package/dist/agent/tools/registry.d.ts +16 -0
  90. package/dist/agent/tools/registry.d.ts.map +1 -0
  91. package/dist/agent/tools/registry.js +47 -0
  92. package/dist/agent/tools/registry.js.map +1 -0
  93. package/dist/agent/tools/shell.d.ts +40 -0
  94. package/dist/agent/tools/shell.d.ts.map +1 -0
  95. package/dist/agent/tools/shell.js +166 -0
  96. package/dist/agent/tools/shell.js.map +1 -0
  97. package/dist/agent/tools/spawn.d.ts +30 -0
  98. package/dist/agent/tools/spawn.d.ts.map +1 -0
  99. package/dist/agent/tools/spawn.js +50 -0
  100. package/dist/agent/tools/spawn.js.map +1 -0
  101. package/dist/agent/tools/web.d.ts +59 -0
  102. package/dist/agent/tools/web.d.ts.map +1 -0
  103. package/dist/agent/tools/web.js +167 -0
  104. package/dist/agent/tools/web.js.map +1 -0
  105. package/dist/bus/events.d.ts +31 -0
  106. package/dist/bus/events.d.ts.map +1 -0
  107. package/dist/bus/events.js +28 -0
  108. package/dist/bus/events.js.map +1 -0
  109. package/dist/bus/queue.d.ts +32 -0
  110. package/dist/bus/queue.d.ts.map +1 -0
  111. package/dist/bus/queue.js +104 -0
  112. package/dist/bus/queue.js.map +1 -0
  113. package/dist/channels/base.d.ts +25 -0
  114. package/dist/channels/base.d.ts.map +1 -0
  115. package/dist/channels/base.js +54 -0
  116. package/dist/channels/base.js.map +1 -0
  117. package/dist/channels/dingtalk.d.ts +31 -0
  118. package/dist/channels/dingtalk.d.ts.map +1 -0
  119. package/dist/channels/dingtalk.js +177 -0
  120. package/dist/channels/dingtalk.js.map +1 -0
  121. package/dist/channels/discord.d.ts +30 -0
  122. package/dist/channels/discord.d.ts.map +1 -0
  123. package/dist/channels/discord.js +197 -0
  124. package/dist/channels/discord.js.map +1 -0
  125. package/dist/channels/email.d.ts +41 -0
  126. package/dist/channels/email.d.ts.map +1 -0
  127. package/dist/channels/email.js +210 -0
  128. package/dist/channels/email.js.map +1 -0
  129. package/dist/channels/feishu.d.ts +32 -0
  130. package/dist/channels/feishu.d.ts.map +1 -0
  131. package/dist/channels/feishu.js +109 -0
  132. package/dist/channels/feishu.js.map +1 -0
  133. package/dist/channels/manager.d.ts +24 -0
  134. package/dist/channels/manager.d.ts.map +1 -0
  135. package/dist/channels/manager.js +205 -0
  136. package/dist/channels/manager.js.map +1 -0
  137. package/dist/channels/mochat.d.ts +38 -0
  138. package/dist/channels/mochat.d.ts.map +1 -0
  139. package/dist/channels/mochat.js +201 -0
  140. package/dist/channels/mochat.js.map +1 -0
  141. package/dist/channels/qq.d.ts +40 -0
  142. package/dist/channels/qq.d.ts.map +1 -0
  143. package/dist/channels/qq.js +280 -0
  144. package/dist/channels/qq.js.map +1 -0
  145. package/dist/channels/slack.d.ts +27 -0
  146. package/dist/channels/slack.d.ts.map +1 -0
  147. package/dist/channels/slack.js +118 -0
  148. package/dist/channels/slack.js.map +1 -0
  149. package/dist/channels/telegram.d.ts +31 -0
  150. package/dist/channels/telegram.d.ts.map +1 -0
  151. package/dist/channels/telegram.js +218 -0
  152. package/dist/channels/telegram.js.map +1 -0
  153. package/dist/channels/whatsapp.d.ts +29 -0
  154. package/dist/channels/whatsapp.d.ts.map +1 -0
  155. package/dist/channels/whatsapp.js +117 -0
  156. package/dist/channels/whatsapp.js.map +1 -0
  157. package/dist/cli/commands.d.ts +8 -0
  158. package/dist/cli/commands.d.ts.map +1 -0
  159. package/dist/cli/commands.js +537 -0
  160. package/dist/cli/commands.js.map +1 -0
  161. package/dist/config/loader.d.ts +24 -0
  162. package/dist/config/loader.d.ts.map +1 -0
  163. package/dist/config/loader.js +182 -0
  164. package/dist/config/loader.js.map +1 -0
  165. package/dist/config/schema.d.ts +2921 -0
  166. package/dist/config/schema.d.ts.map +1 -0
  167. package/dist/config/schema.js +257 -0
  168. package/dist/config/schema.js.map +1 -0
  169. package/dist/cron/service.d.ts +38 -0
  170. package/dist/cron/service.d.ts.map +1 -0
  171. package/dist/cron/service.js +336 -0
  172. package/dist/cron/service.js.map +1 -0
  173. package/dist/cron/types.d.ts +46 -0
  174. package/dist/cron/types.d.ts.map +1 -0
  175. package/dist/cron/types.js +6 -0
  176. package/dist/cron/types.js.map +1 -0
  177. package/dist/heartbeat/service.d.ts +26 -0
  178. package/dist/heartbeat/service.d.ts.map +1 -0
  179. package/dist/heartbeat/service.js +142 -0
  180. package/dist/heartbeat/service.js.map +1 -0
  181. package/dist/index.d.ts +7 -0
  182. package/dist/index.d.ts.map +1 -0
  183. package/dist/index.js +14 -0
  184. package/dist/index.js.map +1 -0
  185. package/dist/providers/base.d.ts +38 -0
  186. package/dist/providers/base.d.ts.map +1 -0
  187. package/dist/providers/base.js +21 -0
  188. package/dist/providers/base.js.map +1 -0
  189. package/dist/providers/litellm_provider.d.ts +35 -0
  190. package/dist/providers/litellm_provider.d.ts.map +1 -0
  191. package/dist/providers/litellm_provider.js +205 -0
  192. package/dist/providers/litellm_provider.js.map +1 -0
  193. package/dist/providers/registry.d.ts +44 -0
  194. package/dist/providers/registry.d.ts.map +1 -0
  195. package/dist/providers/registry.js +252 -0
  196. package/dist/providers/registry.js.map +1 -0
  197. package/dist/providers/transcription.d.ts +10 -0
  198. package/dist/providers/transcription.d.ts.map +1 -0
  199. package/dist/providers/transcription.js +83 -0
  200. package/dist/providers/transcription.js.map +1 -0
  201. package/dist/session/manager.d.ts +35 -0
  202. package/dist/session/manager.d.ts.map +1 -0
  203. package/dist/session/manager.js +193 -0
  204. package/dist/session/manager.js.map +1 -0
  205. package/dist/utils/helpers.d.ts +15 -0
  206. package/dist/utils/helpers.d.ts.map +1 -0
  207. package/dist/utils/helpers.js +100 -0
  208. package/dist/utils/helpers.js.map +1 -0
  209. package/dist/utils/logger.d.ts +7 -0
  210. package/dist/utils/logger.d.ts.map +1 -0
  211. package/dist/utils/logger.js +25 -0
  212. package/dist/utils/logger.js.map +1 -0
  213. package/package.json +58 -0
  214. package/templates/AGENTS.md +51 -0
  215. package/templates/HEARTBEAT.md +16 -0
  216. package/templates/SOUL.md +36 -0
  217. package/templates/TOOLS.md +150 -0
  218. package/templates/USER.md +17 -0
  219. package/templates/memory/MEMORY.md +23 -0
@@ -0,0 +1,537 @@
1
+ "use strict";
2
+ /**
3
+ * CLI commands for seclaw
4
+ *
5
+ * Uses commander for CLI parsing.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.buildCLI = buildCLI;
42
+ const commander_1 = require("commander");
43
+ const readline = __importStar(require("readline"));
44
+ const path = __importStar(require("path"));
45
+ const fs = __importStar(require("fs"));
46
+ const os = __importStar(require("os"));
47
+ const loader_1 = require("../config/loader");
48
+ const schema_1 = require("../config/schema");
49
+ const litellm_provider_1 = require("../providers/litellm_provider");
50
+ const queue_1 = require("../bus/queue");
51
+ const loop_1 = require("../agent/loop");
52
+ const manager_1 = require("../session/manager");
53
+ const manager_2 = require("../channels/manager");
54
+ const service_1 = require("../cron/service");
55
+ const service_2 = require("../heartbeat/service");
56
+ const events_1 = require("../bus/events");
57
+ const VERSION = "0.1.0";
58
+ const LOGO = "🤖";
59
+ const EXIT_COMMANDS = new Set(["exit", "quit", "/exit", "/quit", ":q"]);
60
+ // ─────────────────────────────────────────────
61
+ // Helper: create LLM provider from config
62
+ // ─────────────────────────────────────────────
63
+ function makeProvider(config) {
64
+ const p = (0, loader_1.getProvider)(config);
65
+ const model = config.agents.defaults.model;
66
+ if (!p?.apiKey && !model.startsWith("bedrock/")) {
67
+ console.error("Error: No API key configured.");
68
+ console.error("Set one in ~/.seclaw/config.json under providers section");
69
+ process.exit(1);
70
+ }
71
+ return new litellm_provider_1.LiteLLMProvider({
72
+ apiKey: p?.apiKey,
73
+ apiBase: (0, loader_1.getApiBase)(config),
74
+ defaultModel: model,
75
+ extraHeaders: p?.extraHeaders ?? undefined,
76
+ providerName: (0, loader_1.getProviderName)(config),
77
+ });
78
+ }
79
+ // ─────────────────────────────────────────────
80
+ // Interactive readline helper
81
+ // ─────────────────────────────────────────────
82
+ function readLineAsync(rl, prompt) {
83
+ return new Promise((resolve) => {
84
+ rl.question(prompt, (answer) => {
85
+ resolve(answer);
86
+ });
87
+ });
88
+ }
89
+ function elapsedMs(startNs) {
90
+ return Number(process.hrtime.bigint() - startNs) / 1_000_000;
91
+ }
92
+ // ─────────────────────────────────────────────
93
+ // Workspace template creation
94
+ // ─────────────────────────────────────────────
95
+ function findTemplateRoot() {
96
+ const candidates = [
97
+ path.resolve(__dirname, "../../templates"),
98
+ path.resolve(process.cwd(), "templates"),
99
+ ];
100
+ for (const candidate of candidates) {
101
+ if (fs.existsSync(candidate) && fs.statSync(candidate).isDirectory()) {
102
+ return candidate;
103
+ }
104
+ }
105
+ return null;
106
+ }
107
+ function copyTemplates(templateRoot, workspacePath) {
108
+ const copyDir = (sourceDir, relativeDir = "") => {
109
+ const entries = fs.readdirSync(sourceDir, { withFileTypes: true });
110
+ for (const entry of entries) {
111
+ const relativePath = path.join(relativeDir, entry.name);
112
+ const sourcePath = path.join(sourceDir, entry.name);
113
+ const targetPath = path.join(workspacePath, relativePath);
114
+ if (entry.isDirectory()) {
115
+ fs.mkdirSync(targetPath, { recursive: true });
116
+ copyDir(sourcePath, relativePath);
117
+ continue;
118
+ }
119
+ if (!entry.isFile() || fs.existsSync(targetPath))
120
+ continue;
121
+ fs.mkdirSync(path.dirname(targetPath), { recursive: true });
122
+ fs.copyFileSync(sourcePath, targetPath);
123
+ console.log(` Created ${relativePath.split(path.sep).join("/")}`);
124
+ }
125
+ };
126
+ copyDir(templateRoot);
127
+ }
128
+ function createWorkspaceTemplates(workspacePath) {
129
+ const templateRoot = findTemplateRoot();
130
+ if (templateRoot) {
131
+ copyTemplates(templateRoot, workspacePath);
132
+ }
133
+ else {
134
+ console.warn("Warning: templates directory not found; skipping template file creation.");
135
+ }
136
+ const skillsDir = path.join(workspacePath, "skills");
137
+ fs.mkdirSync(skillsDir, { recursive: true });
138
+ }
139
+ // ─────────────────────────────────────────────
140
+ // Snapshot helpers (reads snapshot dir)
141
+ // ─────────────────────────────────────────────
142
+ function listSnapshotIds() {
143
+ const dir = path.join(os.homedir(), ".seclaw", "snapshots");
144
+ if (!fs.existsSync(dir))
145
+ return [];
146
+ return fs
147
+ .readdirSync(dir)
148
+ .filter((f) => fs.statSync(path.join(dir, f)).isDirectory())
149
+ .sort()
150
+ .reverse();
151
+ }
152
+ // ─────────────────────────────────────────────
153
+ // Build CLI
154
+ // ─────────────────────────────────────────────
155
+ function buildCLI() {
156
+ const program = new commander_1.Command("seclaw")
157
+ .description(`${LOGO} seclaw - Personal AI Assistant`)
158
+ .version(VERSION, "-v, --version");
159
+ // ──────────── onboard ────────────
160
+ program
161
+ .command("onboard")
162
+ .description("Initialize seclaw configuration and workspace")
163
+ .option("-f, --force", "Overwrite existing configuration", false)
164
+ .action((opts) => {
165
+ const configPath = (0, loader_1.getConfigPath)();
166
+ if (fs.existsSync(configPath) && !opts.force) {
167
+ console.log(`Config already exists at ${configPath}`);
168
+ console.log("Use --force to overwrite it.");
169
+ return;
170
+ }
171
+ fs.mkdirSync(path.dirname(configPath), { recursive: true });
172
+ const defaultConfig = schema_1.ConfigSchema.parse({});
173
+ defaultConfig.agents.defaults.model = "";
174
+ defaultConfig.security.dockerSandbox.enabled = true;
175
+ defaultConfig.security.dockerSandbox.snapshotMax = 5;
176
+ defaultConfig.security.dockerSandbox.snapshotMinIntervalSeconds = 1200;
177
+ defaultConfig.security.prohibitedCommands = ["rm -rf", "sudo"];
178
+ fs.writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2));
179
+ console.log(`${opts.force ? "\u2713 Overwrote" : "\u2713 Created"} config at ${configPath}`);
180
+ const config = (0, loader_1.loadConfig)();
181
+ const workspacePath = (0, schema_1.getWorkspacePath)(config);
182
+ fs.mkdirSync(workspacePath, { recursive: true });
183
+ createWorkspaceTemplates(workspacePath);
184
+ console.log(`\u2713 Created workspace at ${workspacePath}`);
185
+ console.log(`\n${LOGO} seclaw is ready!`);
186
+ console.log("\nNext steps:");
187
+ console.log(" 1. Add your API key to ~/.seclaw/config.json");
188
+ console.log(' 2. Chat: seclaw agent -m "Hello!"');
189
+ });
190
+ // ──────────── gateway ────────────
191
+ program
192
+ .command("gateway")
193
+ .description("Start the seclaw gateway (all channels + agent)")
194
+ .option("-p, --port <number>", "Gateway port", "18790")
195
+ .option("--verbose", "Verbose output", false)
196
+ .option("--startup-metrics", "Print startup timing metrics", false)
197
+ .action(async (opts) => {
198
+ const startupMetricsEnabled = Boolean(opts.startupMetrics || opts.verbose || process.env["SECLAW_STARTUP_METRICS"] === "1");
199
+ const startupNs = process.hrtime.bigint();
200
+ const startupMarks = [];
201
+ const markStartup = (phase) => {
202
+ if (!startupMetricsEnabled)
203
+ return;
204
+ const gatewayMs = elapsedMs(startupNs);
205
+ const processMs = process.uptime() * 1000;
206
+ startupMarks.push({ phase, gatewayMs, processMs });
207
+ console.log(`[startup] phase=${phase} gateway_ms=${gatewayMs.toFixed(1)} process_ms=${processMs.toFixed(1)}`);
208
+ };
209
+ markStartup("gateway_action_enter");
210
+ const config = (0, loader_1.loadConfig)();
211
+ markStartup("config_loaded");
212
+ const workspacePath = (0, schema_1.getWorkspacePath)(config);
213
+ const bus = new queue_1.MessageBus();
214
+ const provider = makeProvider(config);
215
+ const sessionManager = new manager_1.SessionManager(workspacePath);
216
+ markStartup("core_services_initialized");
217
+ // Docker sandbox (optional)
218
+ let dockerSandbox;
219
+ const sandboxCfg = config.security.dockerSandbox;
220
+ if (sandboxCfg?.enabled) {
221
+ try {
222
+ const { DockerSandbox } = await Promise.resolve().then(() => __importStar(require("../agent/docker_sandbox")));
223
+ dockerSandbox = new DockerSandbox({
224
+ image: sandboxCfg.image,
225
+ containerName: sandboxCfg.containerName,
226
+ workspaceHost: workspacePath,
227
+ workspaceContainer: sandboxCfg.workspaceContainer,
228
+ workspaceReadOnly: sandboxCfg.workspaceReadOnly,
229
+ extraMounts: sandboxCfg.extraMounts,
230
+ extraEnv: sandboxCfg.extraEnv,
231
+ memoryLimit: sandboxCfg.memoryLimit ?? undefined,
232
+ network: sandboxCfg.network,
233
+ snapshotEnabled: sandboxCfg.snapshotEnabled,
234
+ snapshotMax: sandboxCfg.snapshotMax,
235
+ });
236
+ await dockerSandbox.start();
237
+ markStartup("docker_sandbox_started");
238
+ console.log(`\u2713 Docker sandbox started: ${sandboxCfg.containerName} (${sandboxCfg.image})`);
239
+ }
240
+ catch (e) {
241
+ console.error(`Error starting Docker sandbox: ${e}`);
242
+ dockerSandbox = undefined;
243
+ markStartup("docker_sandbox_failed");
244
+ }
245
+ }
246
+ else {
247
+ markStartup("docker_sandbox_skipped");
248
+ }
249
+ // Cron service
250
+ const cronStorePath = path.join((0, loader_1.getDataDir)(), "cron", "jobs.json");
251
+ const cron = new service_1.CronService(cronStorePath);
252
+ // Agent loop
253
+ const agent = new loop_1.AgentLoop({
254
+ bus,
255
+ provider,
256
+ workspace: workspacePath,
257
+ model: config.agents.defaults.model,
258
+ maxIterations: config.agents.defaults.maxToolIterations,
259
+ braveApiKey: config.tools.web?.search?.apiKey || undefined,
260
+ execConfig: config.tools.exec,
261
+ cronService: cron,
262
+ restrictToWorkspace: config.tools.restrictToWorkspace,
263
+ sessionManager,
264
+ dockerSandbox,
265
+ securityConfig: config.security,
266
+ });
267
+ markStartup("agent_initialized");
268
+ // Wire cron callback
269
+ cron.onJob = async (job) => {
270
+ const response = await agent.processDirect(job.payload.message, `cron:${job.id}`, job.payload.channel ?? "cli", job.payload.to ?? "direct");
271
+ if (job.payload.deliver && job.payload.to) {
272
+ await bus.publishOutbound((0, events_1.makeOutboundMessage)({
273
+ channel: job.payload.channel ?? "cli",
274
+ chatId: job.payload.to,
275
+ content: response ?? "",
276
+ }));
277
+ }
278
+ return response ?? null;
279
+ };
280
+ // Heartbeat
281
+ const heartbeat = new service_2.HeartbeatService({
282
+ workspace: workspacePath,
283
+ onHeartbeat: (prompt) => agent.processDirect(prompt, "heartbeat"),
284
+ intervalSeconds: 30 * 60,
285
+ enabled: true,
286
+ });
287
+ // Channel manager
288
+ const channels = new manager_2.ChannelManager(config, bus, sessionManager);
289
+ markStartup("channels_initialized");
290
+ if (channels.enabledChannels.length > 0) {
291
+ console.log(`\u2713 Channels: ${channels.enabledChannels.join(", ")}`);
292
+ }
293
+ else {
294
+ console.warn("Warning: No channels enabled");
295
+ }
296
+ const cronStatus = cron.status();
297
+ const jobCount = typeof cronStatus["jobs"] === "number" ? cronStatus["jobs"] : 0;
298
+ if (jobCount > 0)
299
+ console.log(`\u2713 Cron: ${jobCount} scheduled jobs`);
300
+ console.log("\u2713 Heartbeat: every 30m");
301
+ console.log(`${LOGO} seclaw gateway running on port ${opts.port}`);
302
+ const shutdown = () => {
303
+ console.log("\nShutting down...");
304
+ heartbeat.stop();
305
+ cron.stop();
306
+ agent.stop();
307
+ channels.stopAll().then(() => {
308
+ if (dockerSandbox)
309
+ dockerSandbox.stop();
310
+ process.exit(0);
311
+ });
312
+ };
313
+ process.on("SIGINT", shutdown);
314
+ process.on("SIGTERM", shutdown);
315
+ const agentRunPromise = agent.run();
316
+ markStartup("agent_run_invoked");
317
+ const startupTasks = [
318
+ cron.start().then(() => markStartup("cron_started")),
319
+ heartbeat.start().then(() => markStartup("heartbeat_started")),
320
+ channels.startAll().then(() => markStartup("channels_started")),
321
+ agent.waitUntilReady(120000).then(() => markStartup("agent_ready")),
322
+ ];
323
+ try {
324
+ await Promise.all(startupTasks);
325
+ }
326
+ catch (e) {
327
+ if (startupMetricsEnabled) {
328
+ const gatewayMs = Math.round(elapsedMs(startupNs));
329
+ const processMs = Math.round(process.uptime() * 1000);
330
+ console.error(`[startup] result=failed gateway_ms=${gatewayMs} process_ms=${processMs} error=${String(e)}`);
331
+ }
332
+ throw e;
333
+ }
334
+ if (startupMetricsEnabled) {
335
+ const gatewayMs = Math.round(elapsedMs(startupNs));
336
+ const processMs = Math.round(process.uptime() * 1000);
337
+ const phaseSummary = startupMarks
338
+ .map((m) => `${m.phase}:${m.gatewayMs.toFixed(1)}ms`)
339
+ .join(", ");
340
+ console.log(`[startup] result=ready gateway_ms=${gatewayMs} process_ms=${processMs}`);
341
+ console.log(`[startup] phases=${phaseSummary}`);
342
+ }
343
+ await agentRunPromise;
344
+ });
345
+ // ──────────── agent ────────────
346
+ program
347
+ .command("agent")
348
+ .description("Interact with the agent directly")
349
+ .option("-m, --message <text>", "Message to send to the agent")
350
+ .option("-s, --session <id>", "Session ID", "cli:default")
351
+ .option("--no-markdown", "Disable markdown rendering")
352
+ .option("--logs", "Show runtime logs", false)
353
+ .action(async (opts) => {
354
+ const config = (0, loader_1.loadConfig)();
355
+ const workspacePath = (0, schema_1.getWorkspacePath)(config);
356
+ const bus = new queue_1.MessageBus();
357
+ const provider = makeProvider(config);
358
+ const agentLoop = new loop_1.AgentLoop({
359
+ bus,
360
+ provider,
361
+ workspace: workspacePath,
362
+ braveApiKey: config.tools.web?.search?.apiKey || undefined,
363
+ execConfig: config.tools.exec,
364
+ restrictToWorkspace: config.tools.restrictToWorkspace,
365
+ securityConfig: config.security,
366
+ });
367
+ if (opts.message) {
368
+ const response = await agentLoop.processDirect(opts.message, opts.session);
369
+ console.log(`\n${LOGO} seclaw`);
370
+ console.log(response ?? "");
371
+ }
372
+ else {
373
+ const rl = readline.createInterface({
374
+ input: process.stdin,
375
+ output: process.stdout,
376
+ terminal: true,
377
+ });
378
+ console.log(`${LOGO} Interactive mode (type 'exit' or Ctrl+C to quit)\n`);
379
+ const cleanup = () => {
380
+ rl.close();
381
+ process.exit(0);
382
+ };
383
+ process.on("SIGINT", cleanup);
384
+ // eslint-disable-next-line no-constant-condition
385
+ while (true) {
386
+ let userInput;
387
+ try {
388
+ userInput = await readLineAsync(rl, "You: ");
389
+ }
390
+ catch {
391
+ break;
392
+ }
393
+ const command = userInput.trim();
394
+ if (!command)
395
+ continue;
396
+ if (EXIT_COMMANDS.has(command.toLowerCase())) {
397
+ console.log("\nGoodbye!");
398
+ rl.close();
399
+ break;
400
+ }
401
+ process.stdout.write("(thinking...) ");
402
+ const response = await agentLoop.processDirect(userInput, opts.session);
403
+ process.stdout.write("\r \r");
404
+ console.log(`\n${LOGO} seclaw`);
405
+ console.log(response ?? "");
406
+ console.log();
407
+ }
408
+ }
409
+ });
410
+ // ──────────── channels sub-command ────────────
411
+ const channelsCmd = program.command("channels").description("Manage channels");
412
+ channelsCmd
413
+ .command("status")
414
+ .description("Show channel status")
415
+ .action(() => {
416
+ const config = (0, loader_1.loadConfig)();
417
+ const ch = config.channels;
418
+ const rows = [
419
+ ["whatsapp", ch.whatsapp?.enabled ? "\u2713" : "\u2717", ch.whatsapp?.bridgeUrl ?? "-"],
420
+ ["telegram", ch.telegram?.enabled ? "\u2713" : "\u2717", ch.telegram?.token ? "configured" : "-"],
421
+ ["discord", ch.discord?.enabled ? "\u2713" : "\u2717", ch.discord?.token ? "configured" : "-"],
422
+ ["slack", ch.slack?.enabled ? "\u2713" : "\u2717", ch.slack?.appToken ? "socket-mode" : "-"],
423
+ ["feishu", ch.feishu?.enabled ? "\u2713" : "\u2717", ch.feishu?.appId ? "configured" : "-"],
424
+ ["dingtalk", ch.dingtalk?.enabled ? "\u2713" : "\u2717", ch.dingtalk?.clientId ? "configured" : "-"],
425
+ ["mochat", ch.mochat?.enabled ? "\u2713" : "\u2717", ch.mochat?.baseUrl ?? "-"],
426
+ ["qq", ch.qq?.enabled ? "\u2713" : "\u2717", ch.qq?.appId ? "configured" : "-"],
427
+ ["email", ch.email?.enabled ? "\u2713" : "\u2717", ch.email?.imapHost ?? "-"],
428
+ ];
429
+ console.log("\nChannel Status:");
430
+ console.log("Channel Enabled Config");
431
+ console.log("\u2500".repeat(50));
432
+ for (const [name, enabled, cfg] of rows) {
433
+ console.log(`${name.padEnd(14)}${enabled.padEnd(9)}${cfg}`);
434
+ }
435
+ console.log();
436
+ });
437
+ channelsCmd
438
+ .command("login")
439
+ .description("Link WhatsApp device via QR code (starts bridge)")
440
+ .action(() => {
441
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
442
+ const { spawnSync } = require("child_process");
443
+ const bridgeDir = path.join(os.homedir(), ".seclaw", "bridge");
444
+ if (!fs.existsSync(bridgeDir)) {
445
+ console.error("Bridge not found. Please build the bridge first.");
446
+ process.exit(1);
447
+ }
448
+ spawnSync("npm", ["start"], { cwd: bridgeDir, stdio: "inherit" });
449
+ });
450
+ // ──────────── cron sub-command ────────────
451
+ const cronCmd = program.command("cron").description("Manage scheduled tasks");
452
+ cronCmd
453
+ .command("list")
454
+ .description("List scheduled jobs")
455
+ .option("-a, --all", "Include disabled jobs", false)
456
+ .action((opts) => {
457
+ const storePath = path.join((0, loader_1.getDataDir)(), "cron", "jobs.json");
458
+ const cron = new service_1.CronService(storePath);
459
+ const jobs = cron.listJobs(opts.all);
460
+ if (jobs.length === 0) {
461
+ console.log("No scheduled jobs.");
462
+ return;
463
+ }
464
+ console.log("\nScheduled Jobs:");
465
+ console.log("ID".padEnd(10) + "Schedule".padEnd(30) + "Status".padEnd(10) + "Message");
466
+ console.log("\u2500".repeat(70));
467
+ for (const job of jobs) {
468
+ const status = job.enabled ? "enabled" : "disabled";
469
+ const schedStr = job.schedule.expr
470
+ ? `cron:${job.schedule.expr}`
471
+ : job.schedule.everyMs
472
+ ? `every:${job.schedule.everyMs}ms`
473
+ : job.schedule.atMs
474
+ ? `at:${new Date(job.schedule.atMs).toISOString()}`
475
+ : "unknown";
476
+ console.log(job.id.slice(0, 9).padEnd(10) +
477
+ schedStr.padEnd(30) +
478
+ status.padEnd(10) +
479
+ (job.payload.message ?? ""));
480
+ }
481
+ });
482
+ cronCmd
483
+ .command("remove <id>")
484
+ .description("Remove a scheduled job")
485
+ .action((id) => {
486
+ const storePath = path.join((0, loader_1.getDataDir)(), "cron", "jobs.json");
487
+ const cron = new service_1.CronService(storePath);
488
+ const removed = cron.removeJob(id);
489
+ console.log(removed ? `Removed job: ${id}` : `Job not found: ${id}`);
490
+ });
491
+ // ──────────── snapshot sub-command ────────────
492
+ const snapshotCmd = program.command("snapshot").description("Manage workspace snapshots");
493
+ snapshotCmd
494
+ .command("list")
495
+ .description("List snapshots")
496
+ .action(() => {
497
+ const ids = listSnapshotIds();
498
+ if (ids.length === 0) {
499
+ console.log("No snapshots.");
500
+ return;
501
+ }
502
+ for (const id of ids)
503
+ console.log(` ${id}`);
504
+ });
505
+ snapshotCmd
506
+ .command("take [label]")
507
+ .description("Take a snapshot of the workspace")
508
+ .action(async (_label) => {
509
+ const { getBackend } = await Promise.resolve().then(() => __importStar(require("../agent/security/snapshot_and_rollback/index")));
510
+ const config = (0, loader_1.loadConfig)();
511
+ const workspacePath = (0, schema_1.getWorkspacePath)(config);
512
+ const backend = getBackend();
513
+ if (!backend) {
514
+ console.error("No snapshot backend available on this platform");
515
+ return;
516
+ }
517
+ const tag = backend.takeSnapshot([workspacePath]);
518
+ console.log(tag ? `\u2713 Snapshot created: ${tag}` : "Snapshot failed");
519
+ });
520
+ snapshotCmd
521
+ .command("restore <tag>")
522
+ .description("Restore a snapshot by tag")
523
+ .action(async (tag) => {
524
+ const { getBackend } = await Promise.resolve().then(() => __importStar(require("../agent/security/snapshot_and_rollback/index")));
525
+ const config = (0, loader_1.loadConfig)();
526
+ const workspacePath = (0, schema_1.getWorkspacePath)(config);
527
+ const backend = getBackend();
528
+ if (!backend) {
529
+ console.error("No snapshot backend available");
530
+ return;
531
+ }
532
+ const ok = backend.restoreSnapshot(tag, [workspacePath]);
533
+ console.log(ok ? `\u2713 Restored snapshot: ${tag}` : `Failed to restore: ${tag}`);
534
+ });
535
+ return program;
536
+ }
537
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Configuration loading utilities
3
+ */
4
+ import { Config, ProviderConfig } from "./schema";
5
+ export declare function getConfigPath(): string;
6
+ export declare function getDataDir(): string;
7
+ /** Load configuration from file or create default. */
8
+ export declare function loadConfig(configPath?: string): Config;
9
+ /** Save configuration to file. */
10
+ export declare function saveConfig(config: Config, configPath?: string): void;
11
+ /** Convert camelCase keys to snake_case-like camelCase for Zod. */
12
+ export declare function convertKeys(data: unknown): unknown;
13
+ /** Convert snake_case or other forms to camelCase for JSON output. */
14
+ export declare function convertToCamel(data: unknown): unknown;
15
+ export declare function camelToLowerCamel(name: string): string;
16
+ export declare function camelToSnake(name: string): string;
17
+ export declare function snakeToCamel(name: string): string;
18
+ /** Match provider config and its registry name. */
19
+ export declare function matchProvider(config: Config, model?: string): [ProviderConfig | null, string | null];
20
+ export declare function getProvider(config: Config, model?: string): ProviderConfig | null;
21
+ export declare function getProviderName(config: Config, model?: string): string | null;
22
+ export declare function getApiKey(config: Config, model?: string): string | null;
23
+ export declare function getApiBase(config: Config, model?: string): string | null;
24
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,MAAM,EAAgB,cAAc,EAAE,MAAM,UAAU,CAAC;AAGhE,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,sDAAsD;AACtD,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAetD;AAED,kCAAkC;AAClC,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAKpE;AAqBD,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAUlD;AAED,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAUrD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGjD;AASD,mDAAmD;AACnD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,CAAC,cAAc,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAgBxC;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAEjF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE7E;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEvE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQxE"}