agentopia 1.0.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 (140) hide show
  1. package/.claude/settings.local.json +28 -0
  2. package/dist/app.d.ts +10 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +121 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/config.d.ts +9 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +19 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/db/database.d.ts +5 -0
  11. package/dist/db/database.d.ts.map +1 -0
  12. package/dist/db/database.js +39 -0
  13. package/dist/db/database.js.map +1 -0
  14. package/dist/db/schema.d.ts +3 -0
  15. package/dist/db/schema.d.ts.map +1 -0
  16. package/dist/db/schema.js +621 -0
  17. package/dist/db/schema.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +49 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/logger.d.ts +4 -0
  23. package/dist/logger.d.ts.map +1 -0
  24. package/dist/logger.js +9 -0
  25. package/dist/logger.js.map +1 -0
  26. package/dist/middleware/auth.d.ts +13 -0
  27. package/dist/middleware/auth.d.ts.map +1 -0
  28. package/dist/middleware/auth.js +733 -0
  29. package/dist/middleware/auth.js.map +1 -0
  30. package/dist/routes/agents.d.ts +3 -0
  31. package/dist/routes/agents.d.ts.map +1 -0
  32. package/dist/routes/agents.js +1058 -0
  33. package/dist/routes/agents.js.map +1 -0
  34. package/dist/routes/issues.d.ts +4 -0
  35. package/dist/routes/issues.d.ts.map +1 -0
  36. package/dist/routes/issues.js +946 -0
  37. package/dist/routes/issues.js.map +1 -0
  38. package/dist/routes/knowledge.d.ts +3 -0
  39. package/dist/routes/knowledge.d.ts.map +1 -0
  40. package/dist/routes/knowledge.js +117 -0
  41. package/dist/routes/knowledge.js.map +1 -0
  42. package/dist/routes/memories.d.ts +3 -0
  43. package/dist/routes/memories.d.ts.map +1 -0
  44. package/dist/routes/memories.js +115 -0
  45. package/dist/routes/memories.js.map +1 -0
  46. package/dist/routes/messages.d.ts +3 -0
  47. package/dist/routes/messages.d.ts.map +1 -0
  48. package/dist/routes/messages.js +130 -0
  49. package/dist/routes/messages.js.map +1 -0
  50. package/dist/routes/projects.d.ts +3 -0
  51. package/dist/routes/projects.d.ts.map +1 -0
  52. package/dist/routes/projects.js +754 -0
  53. package/dist/routes/projects.js.map +1 -0
  54. package/dist/routes/templates.d.ts +3 -0
  55. package/dist/routes/templates.d.ts.map +1 -0
  56. package/dist/routes/templates.js +117 -0
  57. package/dist/routes/templates.js.map +1 -0
  58. package/dist/routes/ui.d.ts +3 -0
  59. package/dist/routes/ui.d.ts.map +1 -0
  60. package/dist/routes/ui.js +38 -0
  61. package/dist/routes/ui.js.map +1 -0
  62. package/dist/services/agent-hierarchy.d.ts +14 -0
  63. package/dist/services/agent-hierarchy.d.ts.map +1 -0
  64. package/dist/services/agent-hierarchy.js +58 -0
  65. package/dist/services/agent-hierarchy.js.map +1 -0
  66. package/dist/services/agent-issue-batch.d.ts +17 -0
  67. package/dist/services/agent-issue-batch.d.ts.map +1 -0
  68. package/dist/services/agent-issue-batch.js +57 -0
  69. package/dist/services/agent-issue-batch.js.map +1 -0
  70. package/dist/services/controller.d.ts +4 -0
  71. package/dist/services/controller.d.ts.map +1 -0
  72. package/dist/services/controller.js +237 -0
  73. package/dist/services/controller.js.map +1 -0
  74. package/dist/services/langgraph-runner.d.ts +33 -0
  75. package/dist/services/langgraph-runner.d.ts.map +1 -0
  76. package/dist/services/langgraph-runner.js +478 -0
  77. package/dist/services/langgraph-runner.js.map +1 -0
  78. package/dist/services/orchestrator.d.ts +9 -0
  79. package/dist/services/orchestrator.d.ts.map +1 -0
  80. package/dist/services/orchestrator.js +116 -0
  81. package/dist/services/orchestrator.js.map +1 -0
  82. package/dist/services/pre-controller.d.ts +7 -0
  83. package/dist/services/pre-controller.d.ts.map +1 -0
  84. package/dist/services/pre-controller.js +101 -0
  85. package/dist/services/pre-controller.js.map +1 -0
  86. package/dist/services/process-manager.d.ts +67 -0
  87. package/dist/services/process-manager.d.ts.map +1 -0
  88. package/dist/services/process-manager.js +938 -0
  89. package/dist/services/process-manager.js.map +1 -0
  90. package/dist/services/project-permissions.d.ts +84 -0
  91. package/dist/services/project-permissions.d.ts.map +1 -0
  92. package/dist/services/project-permissions.js +129 -0
  93. package/dist/services/project-permissions.js.map +1 -0
  94. package/dist/services/scheduler.d.ts +6 -0
  95. package/dist/services/scheduler.d.ts.map +1 -0
  96. package/dist/services/scheduler.js +300 -0
  97. package/dist/services/scheduler.js.map +1 -0
  98. package/dist/services/system-prompt.d.ts +3 -0
  99. package/dist/services/system-prompt.d.ts.map +1 -0
  100. package/dist/services/system-prompt.js +285 -0
  101. package/dist/services/system-prompt.js.map +1 -0
  102. package/dist/services/terminal.d.ts +18 -0
  103. package/dist/services/terminal.d.ts.map +1 -0
  104. package/dist/services/terminal.js +222 -0
  105. package/dist/services/terminal.js.map +1 -0
  106. package/dist/services/websocket.d.ts +15 -0
  107. package/dist/services/websocket.d.ts.map +1 -0
  108. package/dist/services/websocket.js +204 -0
  109. package/dist/services/websocket.js.map +1 -0
  110. package/dist/types.d.ts +108 -0
  111. package/dist/types.d.ts.map +1 -0
  112. package/dist/types.js +3 -0
  113. package/dist/types.js.map +1 -0
  114. package/env.ini +18 -0
  115. package/package.json +38 -0
  116. package/project_id +0 -0
  117. package/public/admin-users.html +188 -0
  118. package/public/agent.html +199 -0
  119. package/public/css/issues.css +275 -0
  120. package/public/css/style.css +1299 -0
  121. package/public/index.html +166 -0
  122. package/public/issue.html +76 -0
  123. package/public/js/agent.js +19 -0
  124. package/public/js/common.js +735 -0
  125. package/public/js/dashboard.js +772 -0
  126. package/public/js/files-panel.js +703 -0
  127. package/public/js/interactive-terminal.js +201 -0
  128. package/public/js/issue-renderer.js +559 -0
  129. package/public/js/issue.js +57 -0
  130. package/public/js/project.js +2425 -0
  131. package/public/js/terminal.js +564 -0
  132. package/public/project.html +430 -0
  133. package/public/terminal.html +67 -0
  134. package/public/vendor/marked.js +74 -0
  135. package/public/vendor/xterm-addon-fit.js +2 -0
  136. package/public/vendor/xterm.css +209 -0
  137. package/public/vendor/xterm.js +2 -0
  138. package/send_message_and_update_issue.js +65 -0
  139. package/tsconfig.json +19 -0
  140. package/update_round2_and_create_round3.js +284 -0
@@ -0,0 +1,621 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.initializeDatabase = initializeDatabase;
7
+ const node_crypto_1 = require("node:crypto");
8
+ const logger_1 = __importDefault(require("../logger"));
9
+ function initializeDatabase(db) {
10
+ db.pragma('journal_mode = WAL');
11
+ db.pragma('foreign_keys = ON');
12
+ db.exec(`
13
+ CREATE TABLE IF NOT EXISTS settings (
14
+ key TEXT PRIMARY KEY,
15
+ value TEXT NOT NULL
16
+ );
17
+
18
+ CREATE TABLE IF NOT EXISTS projects (
19
+ id TEXT PRIMARY KEY,
20
+ name TEXT NOT NULL,
21
+ description TEXT DEFAULT '',
22
+ task_description TEXT NOT NULL,
23
+ command_template TEXT DEFAULT 'cld',
24
+ orchestrator_engine TEXT DEFAULT 'langgraph' CHECK(orchestrator_engine IN ('native', 'langgraph')),
25
+ schedule_hours TEXT DEFAULT '',
26
+ status TEXT DEFAULT 'active' CHECK(status IN ('active', 'paused', 'completed')),
27
+ owner_id TEXT REFERENCES users(id) ON DELETE SET NULL,
28
+ created_at DATETIME DEFAULT (datetime('now')),
29
+ updated_at DATETIME DEFAULT (datetime('now'))
30
+ );
31
+
32
+ CREATE TABLE IF NOT EXISTS agents (
33
+ id TEXT PRIMARY KEY,
34
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
35
+ name TEXT NOT NULL,
36
+ role TEXT DEFAULT '',
37
+ is_controller BOOLEAN DEFAULT 0,
38
+ parent_agent_id TEXT REFERENCES agents(id) ON DELETE SET NULL,
39
+ session_id TEXT,
40
+ working_directory TEXT,
41
+ custom_instructions TEXT DEFAULT '',
42
+ new_session_per_run BOOLEAN DEFAULT 0,
43
+ session_run_count INTEGER DEFAULT 0,
44
+ session_max_runs INTEGER DEFAULT 10,
45
+ session_token_count INTEGER DEFAULT 0,
46
+ session_max_tokens INTEGER DEFAULT 400000,
47
+ session_resume_timeout INTEGER DEFAULT 300,
48
+ command_template TEXT DEFAULT NULL,
49
+ status TEXT DEFAULT 'idle' CHECK(status IN ('idle', 'running', 'waiting', 'error', 'stopped')),
50
+ paused BOOLEAN DEFAULT 0,
51
+ pid INTEGER,
52
+ last_prompt TEXT,
53
+ started_at DATETIME,
54
+ finished_at DATETIME,
55
+ created_at DATETIME DEFAULT (datetime('now'))
56
+ );
57
+
58
+ CREATE TABLE IF NOT EXISTS issues (
59
+ id TEXT PRIMARY KEY,
60
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
61
+ number INTEGER NOT NULL,
62
+ title TEXT NOT NULL,
63
+ body TEXT DEFAULT '',
64
+ created_by TEXT NOT NULL,
65
+ assigned_to TEXT,
66
+ priority INTEGER DEFAULT 1,
67
+ status TEXT DEFAULT 'open' CHECK(status IN ('open', 'in_progress', 'pending', 'done', 'closed')),
68
+ labels TEXT DEFAULT '',
69
+ milestone_id TEXT,
70
+ parent_id TEXT REFERENCES issues(id) ON DELETE SET NULL,
71
+ created_at DATETIME DEFAULT (datetime('now')),
72
+ updated_at DATETIME DEFAULT (datetime('now'))
73
+ );
74
+
75
+ CREATE TABLE IF NOT EXISTS issue_comments (
76
+ id TEXT PRIMARY KEY,
77
+ issue_id TEXT NOT NULL REFERENCES issues(id) ON DELETE CASCADE,
78
+ author_id TEXT NOT NULL,
79
+ body TEXT NOT NULL,
80
+ event_type TEXT DEFAULT 'comment' CHECK(event_type IN ('comment', 'status_change', 'assignment', 'label_change')),
81
+ meta TEXT DEFAULT '',
82
+ created_at DATETIME DEFAULT (datetime('now'))
83
+ );
84
+
85
+ CREATE TABLE IF NOT EXISTS milestones (
86
+ id TEXT PRIMARY KEY,
87
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
88
+ title TEXT NOT NULL,
89
+ description TEXT DEFAULT '',
90
+ due_date TEXT,
91
+ status TEXT DEFAULT 'open' CHECK(status IN ('open', 'closed')),
92
+ created_at DATETIME DEFAULT (datetime('now'))
93
+ );
94
+
95
+ CREATE TABLE IF NOT EXISTS reactions (
96
+ id TEXT PRIMARY KEY,
97
+ target_type TEXT NOT NULL CHECK(target_type IN ('issue', 'comment')),
98
+ target_id TEXT NOT NULL,
99
+ user_id TEXT NOT NULL,
100
+ emoji TEXT NOT NULL,
101
+ created_at DATETIME DEFAULT (datetime('now')),
102
+ UNIQUE(target_type, target_id, user_id, emoji)
103
+ );
104
+
105
+ CREATE TABLE IF NOT EXISTS conversation_logs (
106
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
107
+ agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
108
+ run_id TEXT NOT NULL,
109
+ content TEXT NOT NULL,
110
+ stream TEXT DEFAULT 'stdout' CHECK(stream IN ('stdin', 'stdout', 'stderr', 'cost')),
111
+ created_at DATETIME DEFAULT (datetime('now'))
112
+ );
113
+
114
+ CREATE TABLE IF NOT EXISTS orchestration_runs (
115
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
116
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
117
+ engine TEXT NOT NULL CHECK(engine IN ('native', 'langgraph')),
118
+ decision TEXT NOT NULL,
119
+ controller_agent_id TEXT,
120
+ controller_started BOOLEAN DEFAULT 0,
121
+ controller_run_id TEXT,
122
+ controller_pid INTEGER,
123
+ dispatch_count INTEGER DEFAULT 0,
124
+ dispatch_summary TEXT DEFAULT '',
125
+ reasons TEXT DEFAULT '',
126
+ actions TEXT DEFAULT '',
127
+ dispatch_results TEXT DEFAULT '',
128
+ created_at DATETIME DEFAULT (datetime('now'))
129
+ );
130
+
131
+ CREATE INDEX IF NOT EXISTS idx_agents_project ON agents(project_id);
132
+ CREATE INDEX IF NOT EXISTS idx_agents_parent ON agents(parent_agent_id);
133
+ CREATE INDEX IF NOT EXISTS idx_issues_project ON issues(project_id);
134
+ CREATE INDEX IF NOT EXISTS idx_issues_assigned ON issues(assigned_to, status);
135
+ CREATE INDEX IF NOT EXISTS idx_issue_comments ON issue_comments(issue_id);
136
+ CREATE INDEX IF NOT EXISTS idx_issues_parent ON issues(parent_id);
137
+ CREATE INDEX IF NOT EXISTS idx_milestones_project ON milestones(project_id);
138
+ CREATE INDEX IF NOT EXISTS idx_reactions_target ON reactions(target_type, target_id);
139
+
140
+ CREATE TABLE IF NOT EXISTS users (
141
+ id TEXT PRIMARY KEY,
142
+ username TEXT NOT NULL UNIQUE,
143
+ email TEXT DEFAULT '',
144
+ password_hash TEXT NOT NULL,
145
+ password_salt TEXT NOT NULL,
146
+ display_name TEXT DEFAULT '',
147
+ role TEXT DEFAULT 'member' CHECK(role IN ('admin', 'member')),
148
+ created_at DATETIME DEFAULT (datetime('now')),
149
+ last_login_at DATETIME
150
+ );
151
+ CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
152
+
153
+ CREATE TABLE IF NOT EXISTS project_members (
154
+ id TEXT PRIMARY KEY,
155
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
156
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
157
+ role TEXT DEFAULT 'member' CHECK(role IN ('owner', 'member')),
158
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
159
+ UNIQUE(project_id, user_id)
160
+ );
161
+ CREATE INDEX IF NOT EXISTS idx_project_members_project ON project_members(project_id);
162
+ CREATE INDEX IF NOT EXISTS idx_project_members_user ON project_members(user_id);
163
+
164
+ CREATE TABLE IF NOT EXISTS sessions (
165
+ token TEXT PRIMARY KEY,
166
+ user_id TEXT REFERENCES users(id) ON DELETE CASCADE,
167
+ csrf_token TEXT NOT NULL,
168
+ created_at INTEGER NOT NULL,
169
+ expires_at INTEGER NOT NULL
170
+ );
171
+
172
+ CREATE INDEX IF NOT EXISTS idx_sessions_expires ON sessions(expires_at);
173
+ CREATE INDEX IF NOT EXISTS idx_sessions_user ON sessions(user_id);
174
+
175
+ CREATE TABLE IF NOT EXISTS knowledge_entries (
176
+ id TEXT PRIMARY KEY,
177
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
178
+ title TEXT NOT NULL,
179
+ content TEXT NOT NULL DEFAULT '',
180
+ tags TEXT DEFAULT '',
181
+ importance TEXT DEFAULT 'medium' CHECK(importance IN ('high', 'medium', 'low')),
182
+ created_by TEXT DEFAULT 'user',
183
+ created_at DATETIME DEFAULT (datetime('now')),
184
+ updated_at DATETIME DEFAULT (datetime('now'))
185
+ );
186
+ CREATE INDEX IF NOT EXISTS idx_knowledge_project ON knowledge_entries(project_id);
187
+
188
+ CREATE TABLE IF NOT EXISTS agent_memories (
189
+ id TEXT PRIMARY KEY,
190
+ agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
191
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
192
+ session_id TEXT,
193
+ content TEXT NOT NULL,
194
+ tags TEXT DEFAULT '',
195
+ scope TEXT DEFAULT 'private' CHECK(scope IN ('private', 'project')),
196
+ created_at DATETIME DEFAULT (datetime('now')),
197
+ expires_at DATETIME
198
+ );
199
+ CREATE INDEX IF NOT EXISTS idx_memories_agent ON agent_memories(agent_id);
200
+ CREATE INDEX IF NOT EXISTS idx_memories_project_scope ON agent_memories(project_id, scope);
201
+
202
+ CREATE TABLE IF NOT EXISTS issue_relations (
203
+ id TEXT PRIMARY KEY,
204
+ from_issue_id TEXT NOT NULL REFERENCES issues(id) ON DELETE CASCADE,
205
+ to_issue_id TEXT NOT NULL REFERENCES issues(id) ON DELETE CASCADE,
206
+ relation_type TEXT NOT NULL CHECK(relation_type IN ('blocks', 'related_to')),
207
+ created_by TEXT DEFAULT 'user',
208
+ created_at DATETIME DEFAULT (datetime('now')),
209
+ UNIQUE(from_issue_id, to_issue_id, relation_type)
210
+ );
211
+ CREATE INDEX IF NOT EXISTS idx_relations_from ON issue_relations(from_issue_id);
212
+ CREATE INDEX IF NOT EXISTS idx_relations_to ON issue_relations(to_issue_id);
213
+
214
+ CREATE TABLE IF NOT EXISTS agent_messages (
215
+ id TEXT PRIMARY KEY,
216
+ from_agent_id TEXT NOT NULL,
217
+ to_agent_id TEXT NOT NULL,
218
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
219
+ subject TEXT DEFAULT '',
220
+ body TEXT NOT NULL,
221
+ status TEXT DEFAULT 'unread' CHECK(status IN ('unread', 'read')),
222
+ reply_to_id TEXT REFERENCES agent_messages(id) ON DELETE SET NULL,
223
+ created_at DATETIME DEFAULT (datetime('now'))
224
+ );
225
+ CREATE INDEX IF NOT EXISTS idx_agent_messages_to ON agent_messages(to_agent_id, status);
226
+ CREATE INDEX IF NOT EXISTS idx_agent_messages_from ON agent_messages(from_agent_id);
227
+ CREATE INDEX IF NOT EXISTS idx_agent_messages_project ON agent_messages(project_id);
228
+
229
+ CREATE TABLE IF NOT EXISTS project_templates (
230
+ id TEXT PRIMARY KEY,
231
+ name TEXT NOT NULL,
232
+ description TEXT DEFAULT '',
233
+ template_data TEXT NOT NULL DEFAULT '{}',
234
+ created_by TEXT DEFAULT 'system',
235
+ is_builtin BOOLEAN DEFAULT 0,
236
+ created_at DATETIME DEFAULT (datetime('now'))
237
+ );
238
+
239
+ CREATE INDEX IF NOT EXISTS idx_logs_agent ON conversation_logs(agent_id);
240
+ CREATE INDEX IF NOT EXISTS idx_logs_run ON conversation_logs(run_id);
241
+ CREATE INDEX IF NOT EXISTS idx_orch_runs_project_created ON orchestration_runs(project_id, created_at DESC);
242
+ `);
243
+ // Migration: add paused column if missing
244
+ const cols = db.prepare("PRAGMA table_info(agents)").all();
245
+ if (!cols.find((c) => c.name === 'paused')) {
246
+ db.exec("ALTER TABLE agents ADD COLUMN paused BOOLEAN DEFAULT 0");
247
+ logger_1.default.info('Migration: added paused column to agents table');
248
+ }
249
+ // Migration: add session_token_count and session_max_tokens columns if missing
250
+ if (!cols.find((c) => c.name === 'session_token_count')) {
251
+ db.exec("ALTER TABLE agents ADD COLUMN session_token_count INTEGER DEFAULT 0");
252
+ logger_1.default.info('Migration: added session_token_count column to agents table');
253
+ }
254
+ if (!cols.find((c) => c.name === 'session_max_tokens')) {
255
+ db.exec("ALTER TABLE agents ADD COLUMN session_max_tokens INTEGER DEFAULT 400000");
256
+ logger_1.default.info('Migration: added session_max_tokens column to agents table');
257
+ }
258
+ // Migration: update session_max_tokens from 0 to 400000 for existing agents
259
+ const updated = db.prepare("UPDATE agents SET session_max_tokens = 400000 WHERE session_max_tokens = 0").run();
260
+ if (updated.changes > 0) {
261
+ logger_1.default.info(`Migration: updated session_max_tokens from 0 to 400000 for ${updated.changes} agent(s)`);
262
+ }
263
+ // Migration: upgrade session_max_tokens from 200000 to 400000 (cost optimization)
264
+ const upgraded = db.prepare("UPDATE agents SET session_max_tokens = 400000 WHERE session_max_tokens = 200000").run();
265
+ if (upgraded.changes > 0) {
266
+ logger_1.default.info(`Migration: upgraded session_max_tokens from 200000 to 400000 for ${upgraded.changes} agent(s)`);
267
+ }
268
+ // Migration: add session_resume_timeout column if missing (default 300s = 5 minutes)
269
+ if (!cols.find((c) => c.name === 'session_resume_timeout')) {
270
+ db.exec("ALTER TABLE agents ADD COLUMN session_resume_timeout INTEGER DEFAULT 300");
271
+ logger_1.default.info('Migration: added session_resume_timeout column to agents table');
272
+ }
273
+ // Migration: add command_template column to agents if missing
274
+ if (!cols.find((c) => c.name === 'command_template')) {
275
+ db.exec("ALTER TABLE agents ADD COLUMN command_template TEXT DEFAULT NULL");
276
+ logger_1.default.info('Migration: added command_template column to agents table');
277
+ }
278
+ // Migration: add parent_agent_id column to agents if missing
279
+ if (!cols.find((c) => c.name === 'parent_agent_id')) {
280
+ db.exec("ALTER TABLE agents ADD COLUMN parent_agent_id TEXT REFERENCES agents(id) ON DELETE SET NULL");
281
+ db.exec("CREATE INDEX IF NOT EXISTS idx_agents_parent ON agents(parent_agent_id)");
282
+ logger_1.default.info('Migration: added parent_agent_id column to agents table');
283
+ }
284
+ // Migration: add orchestrator_engine column to projects if missing
285
+ const projectCols = db.prepare("PRAGMA table_info(projects)").all();
286
+ if (!projectCols.find((c) => c.name === 'orchestrator_engine')) {
287
+ db.exec("ALTER TABLE projects ADD COLUMN orchestrator_engine TEXT DEFAULT 'langgraph'");
288
+ logger_1.default.info('Migration: added orchestrator_engine column to projects table');
289
+ }
290
+ if (!projectCols.find((c) => c.name === 'owner_id')) {
291
+ db.exec("ALTER TABLE projects ADD COLUMN owner_id TEXT REFERENCES users(id) ON DELETE SET NULL");
292
+ logger_1.default.info('Migration: added owner_id column to projects table');
293
+ }
294
+ db.exec(`
295
+ CREATE TABLE IF NOT EXISTS project_members (
296
+ id TEXT PRIMARY KEY,
297
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
298
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
299
+ role TEXT DEFAULT 'member' CHECK(role IN ('owner', 'member')),
300
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
301
+ UNIQUE(project_id, user_id)
302
+ );
303
+ CREATE INDEX IF NOT EXISTS idx_project_members_project ON project_members(project_id);
304
+ CREATE INDEX IF NOT EXISTS idx_project_members_user ON project_members(user_id);
305
+ `);
306
+ // Migration: normalize invalid orchestrator_engine values
307
+ const normalizedEngines = db.prepare("UPDATE projects SET orchestrator_engine = 'langgraph' WHERE orchestrator_engine IS NULL OR orchestrator_engine NOT IN ('native', 'langgraph')").run();
308
+ if (normalizedEngines.changes > 0) {
309
+ logger_1.default.info(`Migration: normalized orchestrator_engine for ${normalizedEngines.changes} project(s)`);
310
+ }
311
+ // Migration: add acknowledged_at column to issues if missing
312
+ const issueCols = db.prepare("PRAGMA table_info(issues)").all();
313
+ if (!issueCols.find((c) => c.name === 'acknowledged_at')) {
314
+ db.exec("ALTER TABLE issues ADD COLUMN acknowledged_at TEXT DEFAULT NULL");
315
+ logger_1.default.info('Migration: added acknowledged_at column to issues table');
316
+ }
317
+ // Migration: add parent_id column to issues if missing
318
+ if (!issueCols.find((c) => c.name === 'parent_id')) {
319
+ db.exec("ALTER TABLE issues ADD COLUMN parent_id TEXT REFERENCES issues(id) ON DELETE SET NULL");
320
+ db.exec("CREATE INDEX IF NOT EXISTS idx_issues_parent ON issues(parent_id)");
321
+ logger_1.default.info('Migration: added parent_id column to issues table');
322
+ }
323
+ // Migration: fix issues CHECK constraint to include 'pending' status
324
+ // SQLite doesn't support ALTER CHECK, so we rebuild the table if the constraint is missing.
325
+ // IMPORTANT: must disable foreign_keys during table rebuild to avoid breaking FK references.
326
+ const issuesTableSql = db.prepare("SELECT sql FROM sqlite_master WHERE type='table' AND name='issues'").get();
327
+ if (issuesTableSql && !issuesTableSql.sql.includes("'pending'")) {
328
+ db.pragma('foreign_keys = OFF');
329
+ db.exec(`
330
+ ALTER TABLE issues RENAME TO issues_old;
331
+ CREATE TABLE issues (
332
+ id TEXT PRIMARY KEY,
333
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
334
+ number INTEGER NOT NULL,
335
+ title TEXT NOT NULL,
336
+ body TEXT DEFAULT '',
337
+ created_by TEXT NOT NULL,
338
+ assigned_to TEXT,
339
+ priority INTEGER DEFAULT 1,
340
+ status TEXT DEFAULT 'open' CHECK(status IN ('open', 'in_progress', 'pending', 'done', 'closed')),
341
+ labels TEXT DEFAULT '',
342
+ milestone_id TEXT,
343
+ acknowledged_at DATETIME,
344
+ parent_id TEXT REFERENCES issues(id) ON DELETE SET NULL,
345
+ created_at DATETIME DEFAULT (datetime('now')),
346
+ updated_at DATETIME DEFAULT (datetime('now'))
347
+ );
348
+ INSERT INTO issues SELECT * FROM issues_old;
349
+ DROP TABLE issues_old;
350
+ CREATE INDEX IF NOT EXISTS idx_issues_project ON issues(project_id);
351
+ CREATE INDEX IF NOT EXISTS idx_issues_assigned ON issues(assigned_to, status);
352
+ CREATE INDEX IF NOT EXISTS idx_issues_parent ON issues(parent_id);
353
+ `);
354
+ db.pragma('foreign_keys = ON');
355
+ logger_1.default.info('Migration: rebuilt issues table with pending status in CHECK constraint');
356
+ }
357
+ // Migration: fix broken FK references after prior table rebuild
358
+ // If issue_comments FK still references issues_old (which no longer exists), rebuild issue_comments too.
359
+ const commentsTableSql = db.prepare("SELECT sql FROM sqlite_master WHERE type='table' AND name='issue_comments'").get();
360
+ if (commentsTableSql && commentsTableSql.sql.includes('issues_old')) {
361
+ db.pragma('foreign_keys = OFF');
362
+ db.exec(`
363
+ ALTER TABLE issue_comments RENAME TO issue_comments_old;
364
+ CREATE TABLE issue_comments (
365
+ id TEXT PRIMARY KEY,
366
+ issue_id TEXT NOT NULL REFERENCES issues(id) ON DELETE CASCADE,
367
+ author_id TEXT NOT NULL,
368
+ body TEXT NOT NULL,
369
+ event_type TEXT DEFAULT 'comment' CHECK(event_type IN ('comment', 'status_change', 'assignment', 'label_change')),
370
+ meta TEXT DEFAULT '',
371
+ created_at DATETIME DEFAULT (datetime('now'))
372
+ );
373
+ INSERT INTO issue_comments SELECT * FROM issue_comments_old;
374
+ DROP TABLE issue_comments_old;
375
+ CREATE INDEX IF NOT EXISTS idx_issue_comments ON issue_comments(issue_id);
376
+ `);
377
+ db.pragma('foreign_keys = ON');
378
+ logger_1.default.info('Migration: rebuilt issue_comments table to fix FK references');
379
+ }
380
+ // Migration: fix agents CHECK constraint to include 'waiting' status
381
+ const agentsTableSql = db.prepare("SELECT sql FROM sqlite_master WHERE type='table' AND name='agents'").get();
382
+ if (agentsTableSql && !agentsTableSql.sql.includes("'waiting'")) {
383
+ db.pragma('foreign_keys = OFF');
384
+ db.exec(`
385
+ ALTER TABLE agents RENAME TO agents_old;
386
+ CREATE TABLE agents (
387
+ id TEXT PRIMARY KEY,
388
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
389
+ name TEXT NOT NULL,
390
+ role TEXT DEFAULT '',
391
+ is_controller BOOLEAN DEFAULT 0,
392
+ parent_agent_id TEXT REFERENCES agents(id) ON DELETE SET NULL,
393
+ session_id TEXT,
394
+ working_directory TEXT,
395
+ custom_instructions TEXT DEFAULT '',
396
+ new_session_per_run BOOLEAN DEFAULT 0,
397
+ session_run_count INTEGER DEFAULT 0,
398
+ session_max_runs INTEGER DEFAULT 10,
399
+ session_token_count INTEGER DEFAULT 0,
400
+ session_max_tokens INTEGER DEFAULT 400000,
401
+ session_resume_timeout INTEGER DEFAULT 300,
402
+ command_template TEXT DEFAULT NULL,
403
+ status TEXT DEFAULT 'idle' CHECK(status IN ('idle', 'running', 'waiting', 'error', 'stopped')),
404
+ paused BOOLEAN DEFAULT 0,
405
+ pid INTEGER,
406
+ last_prompt TEXT,
407
+ started_at DATETIME,
408
+ finished_at DATETIME,
409
+ created_at DATETIME DEFAULT (datetime('now'))
410
+ );
411
+ INSERT INTO agents (
412
+ id, project_id, name, role, is_controller, parent_agent_id, session_id, working_directory,
413
+ custom_instructions, new_session_per_run, session_run_count, session_max_runs,
414
+ session_token_count, session_max_tokens, session_resume_timeout, command_template,
415
+ status, paused, pid, last_prompt, started_at, finished_at, created_at
416
+ )
417
+ SELECT
418
+ id, project_id, name, role, is_controller, parent_agent_id, session_id, working_directory,
419
+ custom_instructions, new_session_per_run, session_run_count, session_max_runs,
420
+ session_token_count, session_max_tokens, session_resume_timeout, command_template,
421
+ status, paused, pid, last_prompt, started_at, finished_at, created_at
422
+ FROM agents_old;
423
+ DROP TABLE agents_old;
424
+ CREATE INDEX IF NOT EXISTS idx_agents_project ON agents(project_id);
425
+ CREATE INDEX IF NOT EXISTS idx_agents_parent ON agents(parent_agent_id);
426
+ `);
427
+ db.pragma('foreign_keys = ON');
428
+ logger_1.default.info('Migration: rebuilt agents table with waiting status in CHECK constraint');
429
+ }
430
+ // Migration: fix broken FK references after agents table rebuild
431
+ const logsTableSql = db.prepare("SELECT sql FROM sqlite_master WHERE type='table' AND name='conversation_logs'").get();
432
+ if (logsTableSql && logsTableSql.sql.includes('agents_old')) {
433
+ db.pragma('foreign_keys = OFF');
434
+ db.exec(`
435
+ ALTER TABLE conversation_logs RENAME TO conversation_logs_old;
436
+ CREATE TABLE conversation_logs (
437
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
438
+ agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
439
+ run_id TEXT NOT NULL,
440
+ content TEXT NOT NULL,
441
+ stream TEXT DEFAULT 'stdout' CHECK(stream IN ('stdin', 'stdout', 'stderr', 'cost')),
442
+ created_at DATETIME DEFAULT (datetime('now'))
443
+ );
444
+ INSERT INTO conversation_logs SELECT * FROM conversation_logs_old;
445
+ DROP TABLE conversation_logs_old;
446
+ CREATE INDEX IF NOT EXISTS idx_logs_agent ON conversation_logs(agent_id);
447
+ CREATE INDEX IF NOT EXISTS idx_logs_run ON conversation_logs(run_id);
448
+ `);
449
+ db.pragma('foreign_keys = ON');
450
+ logger_1.default.info('Migration: rebuilt conversation_logs table to fix FK references');
451
+ }
452
+ const memoriesTableSql = db.prepare("SELECT sql FROM sqlite_master WHERE type='table' AND name='agent_memories'").get();
453
+ if (memoriesTableSql && memoriesTableSql.sql.includes('agents_old')) {
454
+ db.pragma('foreign_keys = OFF');
455
+ db.exec(`
456
+ ALTER TABLE agent_memories RENAME TO agent_memories_old;
457
+ CREATE TABLE agent_memories (
458
+ id TEXT PRIMARY KEY,
459
+ agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
460
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
461
+ session_id TEXT,
462
+ content TEXT NOT NULL,
463
+ tags TEXT DEFAULT '',
464
+ scope TEXT DEFAULT 'private' CHECK(scope IN ('private', 'project')),
465
+ created_at DATETIME DEFAULT (datetime('now')),
466
+ expires_at DATETIME
467
+ );
468
+ INSERT INTO agent_memories SELECT * FROM agent_memories_old;
469
+ DROP TABLE agent_memories_old;
470
+ CREATE INDEX IF NOT EXISTS idx_memories_agent ON agent_memories(agent_id);
471
+ CREATE INDEX IF NOT EXISTS idx_memories_project_scope ON agent_memories(project_id, scope);
472
+ `);
473
+ db.pragma('foreign_keys = ON');
474
+ logger_1.default.info('Migration: rebuilt agent_memories table to fix FK references');
475
+ }
476
+ // Migration: set default Sonnet model for controller agents without a --model flag
477
+ const ctrlModelUpdated = db.prepare("UPDATE agents SET command_template = COALESCE(command_template, 'cld') || ' --model claude-sonnet-4-6' WHERE is_controller = 1 AND (command_template IS NULL OR (command_template NOT LIKE '%--model%'))").run();
478
+ if (ctrlModelUpdated.changes > 0) {
479
+ logger_1.default.info(`Migration: set default Sonnet model for ${ctrlModelUpdated.changes} controller agent(s)`);
480
+ }
481
+ // Migration: create FTS5 virtual table for knowledge full-text search
482
+ const ftsExists = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='knowledge_fts'").get();
483
+ if (!ftsExists) {
484
+ db.exec(`
485
+ CREATE VIRTUAL TABLE knowledge_fts USING fts5(title, content, content=knowledge_entries, content_rowid=rowid);
486
+ `);
487
+ // Populate FTS index from existing data
488
+ db.exec(`
489
+ INSERT INTO knowledge_fts(rowid, title, content)
490
+ SELECT rowid, title, content FROM knowledge_entries;
491
+ `);
492
+ // Create triggers to keep FTS in sync
493
+ db.exec(`
494
+ CREATE TRIGGER IF NOT EXISTS knowledge_ai AFTER INSERT ON knowledge_entries BEGIN
495
+ INSERT INTO knowledge_fts(rowid, title, content) VALUES (new.rowid, new.title, new.content);
496
+ END;
497
+ CREATE TRIGGER IF NOT EXISTS knowledge_ad AFTER DELETE ON knowledge_entries BEGIN
498
+ INSERT INTO knowledge_fts(knowledge_fts, rowid, title, content) VALUES('delete', old.rowid, old.title, old.content);
499
+ END;
500
+ CREATE TRIGGER IF NOT EXISTS knowledge_au AFTER UPDATE ON knowledge_entries BEGIN
501
+ INSERT INTO knowledge_fts(knowledge_fts, rowid, title, content) VALUES('delete', old.rowid, old.title, old.content);
502
+ INSERT INTO knowledge_fts(rowid, title, content) VALUES (new.rowid, new.title, new.content);
503
+ END;
504
+ `);
505
+ logger_1.default.info('Migration: created FTS5 virtual table for knowledge full-text search');
506
+ }
507
+ // Migration: create FTS5 virtual table for agent memories full-text search
508
+ const memFtsExists = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='memories_fts'").get();
509
+ if (!memFtsExists) {
510
+ db.exec(`
511
+ CREATE VIRTUAL TABLE memories_fts USING fts5(content, tags, content=agent_memories, content_rowid=rowid);
512
+ `);
513
+ db.exec(`
514
+ INSERT INTO memories_fts(rowid, content, tags)
515
+ SELECT rowid, content, tags FROM agent_memories;
516
+ `);
517
+ db.exec(`
518
+ CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON agent_memories BEGIN
519
+ INSERT INTO memories_fts(rowid, content, tags) VALUES (new.rowid, new.content, new.tags);
520
+ END;
521
+ CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON agent_memories BEGIN
522
+ INSERT INTO memories_fts(memories_fts, rowid, content, tags) VALUES('delete', old.rowid, old.content, old.tags);
523
+ END;
524
+ CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON agent_memories BEGIN
525
+ INSERT INTO memories_fts(memories_fts, rowid, content, tags) VALUES('delete', old.rowid, old.content, old.tags);
526
+ INSERT INTO memories_fts(rowid, content, tags) VALUES (new.rowid, new.content, new.tags);
527
+ END;
528
+ `);
529
+ logger_1.default.info('Migration: created FTS5 virtual table for agent memories full-text search');
530
+ }
531
+ // Migration: add user_id column to sessions if missing
532
+ const sessionCols = db.prepare("PRAGMA table_info(sessions)").all();
533
+ if (!sessionCols.find((c) => c.name === 'user_id')) {
534
+ db.exec("ALTER TABLE sessions ADD COLUMN user_id TEXT REFERENCES users(id) ON DELETE CASCADE");
535
+ db.exec("CREATE INDEX IF NOT EXISTS idx_sessions_user ON sessions(user_id)");
536
+ logger_1.default.info('Migration: added user_id column to sessions table');
537
+ }
538
+ const firstAdmin = db.prepare("SELECT id FROM users WHERE role = 'admin' ORDER BY created_at, id LIMIT 1").get();
539
+ if (firstAdmin?.id) {
540
+ const ownerSeeded = db.prepare("UPDATE projects SET owner_id = ? WHERE owner_id IS NULL").run(firstAdmin.id);
541
+ if (ownerSeeded.changes > 0) {
542
+ logger_1.default.info(`Migration: assigned owner_id to ${ownerSeeded.changes} project(s) using first admin`);
543
+ }
544
+ }
545
+ const ownedProjects = db.prepare('SELECT id, owner_id FROM projects WHERE owner_id IS NOT NULL').all();
546
+ const upsertOwnerMember = db.prepare(`INSERT INTO project_members (id, project_id, user_id, role)
547
+ VALUES (?, ?, ?, 'owner')
548
+ ON CONFLICT(project_id, user_id) DO UPDATE SET role = 'owner'`);
549
+ for (const project of ownedProjects) {
550
+ upsertOwnerMember.run((0, node_crypto_1.randomUUID)(), project.id, project.owner_id);
551
+ }
552
+ // Migration: seed builtin project templates
553
+ const templateCount = db.prepare('SELECT COUNT(*) as c FROM project_templates WHERE is_builtin = 1').get().c;
554
+ if (templateCount === 0) {
555
+ const builtinTemplates = [
556
+ {
557
+ id: 'tpl-bugfix',
558
+ name: 'Bug修复流程',
559
+ description: '标准bug修复流程:复现 → 定位 → 修复 → 回归测试',
560
+ template_data: JSON.stringify({
561
+ agents: [
562
+ { name: 'dev', role: '开发Agent。负责定位和修复bug。' },
563
+ { name: 'test', role: '测试Agent。负责复现bug和回归测试。' },
564
+ ],
565
+ issues: [
566
+ { title: '复现bug', assigned_to_role: 'test', body: '复现bug,记录复现步骤和环境信息。' },
567
+ { title: '定位根因', assigned_to_role: 'dev', body: '分析代码定位bug根因。' },
568
+ { title: '修复实现', assigned_to_role: 'dev', body: '编写修复代码并通过编译。' },
569
+ { title: '回归测试', assigned_to_role: 'test', body: '验证修复是否生效,确认无回归问题。' },
570
+ ],
571
+ }),
572
+ },
573
+ {
574
+ id: 'tpl-feature',
575
+ name: '功能开发流程',
576
+ description: '完整功能开发流程:需求分析 → 技术设计 → 实现 → 测试',
577
+ template_data: JSON.stringify({
578
+ agents: [
579
+ { name: 'product', role: '产品Agent。负责需求分析和产品规划。' },
580
+ { name: 'dev', role: '开发Agent。负责技术设计和代码实现。' },
581
+ { name: 'test', role: '测试Agent。负责编写测试用例和质量保障。' },
582
+ ],
583
+ issues: [
584
+ { title: '需求分析', assigned_to_role: 'product', body: '分析功能需求,输出需求文档。' },
585
+ { title: '技术设计', assigned_to_role: 'dev', body: '基于需求文档进行技术方案设计。' },
586
+ { title: '代码实现', assigned_to_role: 'dev', body: '按技术方案编写代码实现功能。' },
587
+ { title: '测试验证', assigned_to_role: 'test', body: '编写和运行测试用例,验证功能正确性。' },
588
+ ],
589
+ }),
590
+ },
591
+ {
592
+ id: 'tpl-review',
593
+ name: '代码审查流程',
594
+ description: '代码审查流程:阅读代码 → 发现问题 → 出审查报告',
595
+ template_data: JSON.stringify({
596
+ agents: [
597
+ { name: 'reviewer', role: '代码审查Agent。阅读和审查代码,发现潜在问题。' },
598
+ { name: 'dev', role: '开发Agent。根据审查意见修复代码问题。' },
599
+ ],
600
+ issues: [
601
+ { title: '阅读代码', assigned_to_role: 'reviewer', body: '阅读指定代码范围,理解逻辑和结构。' },
602
+ { title: '发现问题', assigned_to_role: 'reviewer', body: '记录发现的代码问题、风格问题和潜在bug。' },
603
+ { title: '输出审查报告', assigned_to_role: 'reviewer', body: '汇总所有问题,输出结构化审查报告。' },
604
+ ],
605
+ }),
606
+ },
607
+ ];
608
+ const insertStmt = db.prepare('INSERT INTO project_templates (id, name, description, template_data, created_by, is_builtin) VALUES (?, ?, ?, ?, ?, 1)');
609
+ for (const t of builtinTemplates) {
610
+ insertStmt.run(t.id, t.name, t.description, t.template_data, 'system');
611
+ }
612
+ logger_1.default.info(`Migration: seeded ${builtinTemplates.length} builtin project templates`);
613
+ }
614
+ // Reset any agents stuck in 'running' from a previous crash
615
+ const reset = db.prepare("UPDATE agents SET status = 'idle', pid = NULL WHERE status = 'running'");
616
+ const changes = reset.run();
617
+ if (changes.changes > 0) {
618
+ logger_1.default.info(`Reset ${changes.changes} agent(s) from 'running' to 'idle' (stale from previous run)`);
619
+ }
620
+ }
621
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}