funolio-agent 1.0.52 → 1.0.75
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/dist/approval.d.ts +1 -6
- package/dist/approval.d.ts.map +1 -1
- package/dist/approval.js +2 -7
- package/dist/approval.js.map +1 -1
- package/dist/bot-manager.d.ts +5 -1
- package/dist/bot-manager.d.ts.map +1 -1
- package/dist/bot-manager.js +23 -13
- package/dist/bot-manager.js.map +1 -1
- package/dist/cli-session-epoch.d.ts +1 -1
- package/dist/cli-session-epoch.d.ts.map +1 -1
- package/dist/cli-session-epoch.js +1 -1
- package/dist/cli-session-epoch.js.map +1 -1
- package/dist/cli-session-registry.d.ts +35 -0
- package/dist/cli-session-registry.d.ts.map +1 -0
- package/dist/cli-session-registry.js +177 -0
- package/dist/cli-session-registry.js.map +1 -0
- package/dist/cli.js +62 -0
- package/dist/cli.js.map +1 -1
- package/dist/codex-app-server-manager.d.ts +129 -0
- package/dist/codex-app-server-manager.d.ts.map +1 -0
- package/dist/codex-app-server-manager.js +768 -0
- package/dist/codex-app-server-manager.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +8 -30
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/setup.d.ts +4 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +9 -25
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +77 -2
- package/dist/commands/start.js.map +1 -1
- package/dist/completion-marker.d.ts +7 -0
- package/dist/completion-marker.d.ts.map +1 -0
- package/dist/completion-marker.js +28 -0
- package/dist/completion-marker.js.map +1 -0
- package/dist/config.d.ts +6 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +15 -3
- package/dist/config.js.map +1 -1
- package/dist/context-window.d.ts.map +1 -1
- package/dist/context-window.js +8 -1
- package/dist/context-window.js.map +1 -1
- package/dist/live-activity.d.ts +29 -0
- package/dist/live-activity.d.ts.map +1 -0
- package/dist/live-activity.js +36 -0
- package/dist/live-activity.js.map +1 -0
- package/dist/local-cli-pty-manager.d.ts +51 -0
- package/dist/local-cli-pty-manager.d.ts.map +1 -1
- package/dist/local-cli-pty-manager.js +1227 -114
- package/dist/local-cli-pty-manager.js.map +1 -1
- package/dist/local-data.d.ts +41 -0
- package/dist/local-data.d.ts.map +1 -1
- package/dist/local-data.js +140 -4
- package/dist/local-data.js.map +1 -1
- package/dist/local-db.d.ts.map +1 -1
- package/dist/local-db.js +55 -1
- package/dist/local-db.js.map +1 -1
- package/dist/local-server.d.ts +25 -0
- package/dist/local-server.d.ts.map +1 -1
- package/dist/local-server.js +528 -267
- package/dist/local-server.js.map +1 -1
- package/dist/message-loop.d.ts +6 -0
- package/dist/message-loop.d.ts.map +1 -1
- package/dist/message-loop.js +247 -89
- package/dist/message-loop.js.map +1 -1
- package/dist/mqtt-client.d.ts +10 -1
- package/dist/mqtt-client.d.ts.map +1 -1
- package/dist/mqtt-client.js +14 -1
- package/dist/mqtt-client.js.map +1 -1
- package/dist/oauth.d.ts.map +1 -1
- package/dist/oauth.js +69 -29
- package/dist/oauth.js.map +1 -1
- package/dist/orchestration/orchestrator-operating-prompt.d.ts +1 -0
- package/dist/orchestration/orchestrator-operating-prompt.d.ts.map +1 -1
- package/dist/orchestration/orchestrator-operating-prompt.js +60 -0
- package/dist/orchestration/orchestrator-operating-prompt.js.map +1 -1
- package/dist/orchestration/validation.d.ts +40 -0
- package/dist/orchestration/validation.d.ts.map +1 -0
- package/dist/orchestration/validation.js +203 -0
- package/dist/orchestration/validation.js.map +1 -0
- package/dist/orchestrator.d.ts +21 -32
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +287 -725
- package/dist/orchestrator.js.map +1 -1
- package/dist/providers/claude-cli-prompt.d.ts.map +1 -1
- package/dist/providers/claude-cli-prompt.js +49 -5
- package/dist/providers/claude-cli-prompt.js.map +1 -1
- package/dist/providers/claude-cli.d.ts.map +1 -1
- package/dist/providers/claude-cli.js +56 -5
- package/dist/providers/claude-cli.js.map +1 -1
- package/dist/providers/codex-cli.d.ts.map +1 -1
- package/dist/providers/codex-cli.js +15 -10
- package/dist/providers/codex-cli.js.map +1 -1
- package/dist/response-guard.js +1 -1
- package/dist/response-guard.js.map +1 -1
- package/dist/tools/admin-tools.d.ts.map +1 -1
- package/dist/tools/admin-tools.js +8 -2
- package/dist/tools/admin-tools.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/search-conversation-history.d.ts +16 -0
- package/dist/tools/search-conversation-history.d.ts.map +1 -0
- package/dist/tools/search-conversation-history.js +324 -0
- package/dist/tools/search-conversation-history.js.map +1 -0
- package/dist/wizard-state.d.ts +7 -0
- package/dist/wizard-state.d.ts.map +1 -1
- package/dist/wizard-state.js +31 -2
- package/dist/wizard-state.js.map +1 -1
- package/dist/workflow-engine.d.ts +4 -1
- package/dist/workflow-engine.d.ts.map +1 -1
- package/dist/workflow-engine.js +190 -29
- package/dist/workflow-engine.js.map +1 -1
- package/package.json +1 -1
package/dist/local-data.js
CHANGED
|
@@ -40,10 +40,14 @@ exports.createAgentProfile = createAgentProfile;
|
|
|
40
40
|
exports.getAgentProfile = getAgentProfile;
|
|
41
41
|
exports.getDefaultAgentProfile = getDefaultAgentProfile;
|
|
42
42
|
exports.getOrchestratorBot = getOrchestratorBot;
|
|
43
|
+
exports.getCurrentOrchestratorSelection = getCurrentOrchestratorSelection;
|
|
43
44
|
exports.listAgentProfiles = listAgentProfiles;
|
|
44
45
|
exports.migrateAgentProfilesToDefaultToolProfile = migrateAgentProfilesToDefaultToolProfile;
|
|
45
46
|
exports.updateAgentProfile = updateAgentProfile;
|
|
46
47
|
exports.setOrchestratorBot = setOrchestratorBot;
|
|
48
|
+
exports.setDefaultAgentProfile = setDefaultAgentProfile;
|
|
49
|
+
exports.isClerkOrchestratorEnabled = isClerkOrchestratorEnabled;
|
|
50
|
+
exports.setClerkAsOrchestrator = setClerkAsOrchestrator;
|
|
47
51
|
exports.createProviderConnection = createProviderConnection;
|
|
48
52
|
exports.listProviderConnections = listProviderConnections;
|
|
49
53
|
exports.getProviderConnection = getProviderConnection;
|
|
@@ -69,9 +73,13 @@ exports.createChatJob = createChatJob;
|
|
|
69
73
|
exports.getCliSessionEpoch = getCliSessionEpoch;
|
|
70
74
|
exports.upsertCliSessionEpoch = upsertCliSessionEpoch;
|
|
71
75
|
exports.deleteCliSessionEpoch = deleteCliSessionEpoch;
|
|
76
|
+
exports.generateNextSessionId = generateNextSessionId;
|
|
72
77
|
exports.getChatJob = getChatJob;
|
|
73
78
|
exports.getLatestConversationChatJob = getLatestConversationChatJob;
|
|
79
|
+
exports.getLatestConversationBotChatJob = getLatestConversationBotChatJob;
|
|
74
80
|
exports.listQueuedChatJobs = listQueuedChatJobs;
|
|
81
|
+
exports.listRunningChatJobs = listRunningChatJobs;
|
|
82
|
+
exports.listActiveAssistantMessageIds = listActiveAssistantMessageIds;
|
|
75
83
|
exports.countRunningChatJobs = countRunningChatJobs;
|
|
76
84
|
exports.updateChatJob = updateChatJob;
|
|
77
85
|
exports.markRunningChatJobsInterrupted = markRunningChatJobsInterrupted;
|
|
@@ -229,6 +237,7 @@ const crypto = __importStar(require("crypto"));
|
|
|
229
237
|
const default_tool_profile_1 = require("./default-tool-profile");
|
|
230
238
|
const approval_1 = require("./approval");
|
|
231
239
|
let _db = null;
|
|
240
|
+
const CLERK_IS_ORCHESTRATOR_KEY = 'clerk_is_orchestrator';
|
|
232
241
|
/** Get or open the shared database connection */
|
|
233
242
|
function getDb() {
|
|
234
243
|
if (!_db) {
|
|
@@ -258,15 +267,22 @@ function createAgentProfile(p) {
|
|
|
258
267
|
id, provider, model, name, soul_md, memory_md, tools_md, skills_md, api_key_enc,
|
|
259
268
|
permission_mode, is_default, role_label, role_class, is_active, priority,
|
|
260
269
|
provider_connection_id, color, purpose_md, identity_summary, final_prompt,
|
|
261
|
-
enabled_builtin_tools_json, enabled_mcp_tools_json, show_thinking, is_orchestrator,
|
|
270
|
+
enabled_builtin_tools_json, enabled_mcp_tools_json, show_thinking, is_orchestrator,
|
|
271
|
+
codex_reasoning_effort, codex_reasoning_summary, codex_personality,
|
|
272
|
+
codex_service_tier, codex_sandbox_policy, codex_approval_policy,
|
|
273
|
+
created_at, updated_at
|
|
262
274
|
)
|
|
263
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, ?, ?, ?)
|
|
275
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
264
276
|
`);
|
|
265
277
|
const transaction = db.transaction(() => {
|
|
278
|
+
if (p.isDefault) {
|
|
279
|
+
db.prepare("UPDATE agent_profile SET is_default = 0, updated_at = datetime('now') WHERE is_default = 1").run();
|
|
280
|
+
}
|
|
266
281
|
if (p.isOrchestrator) {
|
|
267
282
|
db.prepare("UPDATE agent_profile SET is_orchestrator = 0, updated_at = datetime('now') WHERE is_orchestrator = 1").run();
|
|
283
|
+
setSetting(CLERK_IS_ORCHESTRATOR_KEY, 'false');
|
|
268
284
|
}
|
|
269
|
-
insert.run(id, p.provider, p.model, p.name, p.soulMd ?? null, p.memoryMd ?? null, p.toolsMd ?? null, p.skillsMd ?? null, p.apiKeyEnc ?? null, (0, approval_1.normalizePermissionMode)(p.permissionMode ?? default_tool_profile_1.DEFAULT_PERMISSION_MODE), p.isDefault ? 1 : 0, p.roleLabel ?? null, p.roleClass ?? null, p.isActive !== false ? 1 : 0, p.priority ?? 100, p.providerConnectionId ?? null, p.color ?? null, p.purposeMd ?? null, p.identitySummary ?? null, p.finalPrompt ?? null, p.enabledBuiltinToolsJson ?? null, p.enabledMcpToolsJson ?? null, p.isOrchestrator ? 1 : 0, ts, ts);
|
|
285
|
+
insert.run(id, p.provider, p.model, p.name, p.soulMd ?? null, p.memoryMd ?? null, p.toolsMd ?? null, p.skillsMd ?? null, p.apiKeyEnc ?? null, (0, approval_1.normalizePermissionMode)(p.permissionMode ?? default_tool_profile_1.DEFAULT_PERMISSION_MODE), p.isDefault ? 1 : 0, p.roleLabel ?? null, p.roleClass ?? null, p.isActive !== false ? 1 : 0, p.priority ?? 100, p.providerConnectionId ?? null, p.color ?? null, p.purposeMd ?? null, p.identitySummary ?? null, p.finalPrompt ?? null, p.enabledBuiltinToolsJson ?? null, p.enabledMcpToolsJson ?? null, p.isOrchestrator ? 1 : 0, p.codexReasoningEffort ?? 'none', p.codexReasoningSummary ?? 'detailed', p.codexPersonality ?? 'friendly', p.codexServiceTier ?? 'fast', p.codexSandboxPolicy ?? 'danger-full-access', p.codexApprovalPolicy ?? 'never', ts, ts);
|
|
270
286
|
});
|
|
271
287
|
transaction();
|
|
272
288
|
return db.prepare('SELECT * FROM agent_profile WHERE id = ?').get(id);
|
|
@@ -280,6 +296,20 @@ function getDefaultAgentProfile() {
|
|
|
280
296
|
function getOrchestratorBot() {
|
|
281
297
|
return getDb().prepare('SELECT * FROM agent_profile WHERE is_orchestrator = 1 ORDER BY updated_at DESC LIMIT 1').get();
|
|
282
298
|
}
|
|
299
|
+
function getCurrentOrchestratorSelection() {
|
|
300
|
+
if (isClerkOrchestratorEnabled()) {
|
|
301
|
+
return {
|
|
302
|
+
type: 'clerk',
|
|
303
|
+
provider: getSetting('clerk_provider') || null,
|
|
304
|
+
model: getSetting('clerk_model') || null,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
const bot = getOrchestratorBot();
|
|
308
|
+
if (bot) {
|
|
309
|
+
return { type: 'bot', botId: bot.id, botName: bot.name };
|
|
310
|
+
}
|
|
311
|
+
return { type: 'none' };
|
|
312
|
+
}
|
|
283
313
|
function listAgentProfiles() {
|
|
284
314
|
return getDb().prepare('SELECT * FROM agent_profile ORDER BY is_default DESC, created_at ASC').all();
|
|
285
315
|
}
|
|
@@ -423,11 +453,39 @@ function updateAgentProfile(id, fields) {
|
|
|
423
453
|
sets.push('is_orchestrator = ?');
|
|
424
454
|
vals.push(fields.isOrchestrator ? 1 : 0);
|
|
425
455
|
}
|
|
456
|
+
if (fields.codexReasoningEffort !== undefined) {
|
|
457
|
+
sets.push('codex_reasoning_effort = ?');
|
|
458
|
+
vals.push(fields.codexReasoningEffort);
|
|
459
|
+
}
|
|
460
|
+
if (fields.codexReasoningSummary !== undefined) {
|
|
461
|
+
sets.push('codex_reasoning_summary = ?');
|
|
462
|
+
vals.push(fields.codexReasoningSummary);
|
|
463
|
+
}
|
|
464
|
+
if (fields.codexPersonality !== undefined) {
|
|
465
|
+
sets.push('codex_personality = ?');
|
|
466
|
+
vals.push(fields.codexPersonality);
|
|
467
|
+
}
|
|
468
|
+
if (fields.codexServiceTier !== undefined) {
|
|
469
|
+
sets.push('codex_service_tier = ?');
|
|
470
|
+
vals.push(fields.codexServiceTier);
|
|
471
|
+
}
|
|
472
|
+
if (fields.codexSandboxPolicy !== undefined) {
|
|
473
|
+
sets.push('codex_sandbox_policy = ?');
|
|
474
|
+
vals.push(fields.codexSandboxPolicy);
|
|
475
|
+
}
|
|
476
|
+
if (fields.codexApprovalPolicy !== undefined) {
|
|
477
|
+
sets.push('codex_approval_policy = ?');
|
|
478
|
+
vals.push(fields.codexApprovalPolicy);
|
|
479
|
+
}
|
|
426
480
|
if (sets.length === 0)
|
|
427
481
|
return row;
|
|
428
482
|
const transaction = db.transaction(() => {
|
|
483
|
+
if (fields.isDefault === true) {
|
|
484
|
+
db.prepare("UPDATE agent_profile SET is_default = 0, updated_at = datetime('now') WHERE is_default = 1 AND id <> ?").run(id);
|
|
485
|
+
}
|
|
429
486
|
if (fields.isOrchestrator === true) {
|
|
430
487
|
db.prepare("UPDATE agent_profile SET is_orchestrator = 0, updated_at = datetime('now') WHERE is_orchestrator = 1 AND id <> ?").run(id);
|
|
488
|
+
setSetting(CLERK_IS_ORCHESTRATOR_KEY, 'false');
|
|
431
489
|
}
|
|
432
490
|
sets.push("updated_at = datetime('now')");
|
|
433
491
|
vals.push(id);
|
|
@@ -444,10 +502,36 @@ function setOrchestratorBot(botId) {
|
|
|
444
502
|
const transaction = db.transaction(() => {
|
|
445
503
|
db.prepare("UPDATE agent_profile SET is_orchestrator = 0, updated_at = datetime('now') WHERE is_orchestrator = 1").run();
|
|
446
504
|
db.prepare("UPDATE agent_profile SET is_orchestrator = 1, updated_at = datetime('now') WHERE id = ?").run(botId);
|
|
505
|
+
setSetting(CLERK_IS_ORCHESTRATOR_KEY, 'false');
|
|
447
506
|
});
|
|
448
507
|
transaction();
|
|
449
508
|
return db.prepare('SELECT * FROM agent_profile WHERE id = ?').get(botId);
|
|
450
509
|
}
|
|
510
|
+
function setDefaultAgentProfile(botId) {
|
|
511
|
+
const db = getDb();
|
|
512
|
+
const row = db.prepare('SELECT * FROM agent_profile WHERE id = ?').get(botId);
|
|
513
|
+
if (!row)
|
|
514
|
+
return undefined;
|
|
515
|
+
const transaction = db.transaction(() => {
|
|
516
|
+
db.prepare("UPDATE agent_profile SET is_default = 0, updated_at = datetime('now') WHERE is_default = 1").run();
|
|
517
|
+
db.prepare("UPDATE agent_profile SET is_default = 1, updated_at = datetime('now') WHERE id = ?").run(botId);
|
|
518
|
+
});
|
|
519
|
+
transaction();
|
|
520
|
+
return db.prepare('SELECT * FROM agent_profile WHERE id = ?').get(botId);
|
|
521
|
+
}
|
|
522
|
+
function isClerkOrchestratorEnabled() {
|
|
523
|
+
return getSetting(CLERK_IS_ORCHESTRATOR_KEY) === 'true';
|
|
524
|
+
}
|
|
525
|
+
function setClerkAsOrchestrator(enabled) {
|
|
526
|
+
const db = getDb();
|
|
527
|
+
const transaction = db.transaction(() => {
|
|
528
|
+
setSetting(CLERK_IS_ORCHESTRATOR_KEY, enabled ? 'true' : 'false');
|
|
529
|
+
if (enabled) {
|
|
530
|
+
db.prepare("UPDATE agent_profile SET is_orchestrator = 0, updated_at = datetime('now') WHERE is_orchestrator = 1").run();
|
|
531
|
+
}
|
|
532
|
+
});
|
|
533
|
+
transaction();
|
|
534
|
+
}
|
|
451
535
|
const CLI_PROVIDER_IDS = new Set(['claude-cli', 'codex-cli']);
|
|
452
536
|
const SUPPORTED_PROVIDER_ACCESS_MODES = new Set(['api', 'cli']);
|
|
453
537
|
function createProviderConnection(p) {
|
|
@@ -1078,6 +1162,18 @@ function deleteCliSessionEpoch(conversationId, botId) {
|
|
|
1078
1162
|
WHERE conversation_id = ? AND bot_id = ?
|
|
1079
1163
|
`).run(conversationId, botId).changes > 0;
|
|
1080
1164
|
}
|
|
1165
|
+
/**
|
|
1166
|
+
* Generate the next sequential Funolio session ID.
|
|
1167
|
+
* Format: fff00000-0000-4000-8000-NNNNNNNNNNNN
|
|
1168
|
+
* Used by Pattern A providers (Claude CLI) that support --session-id.
|
|
1169
|
+
*/
|
|
1170
|
+
function generateNextSessionId() {
|
|
1171
|
+
getDb().prepare('UPDATE funolio_session_counter SET last_value = last_value + 1 WHERE id = 1').run();
|
|
1172
|
+
const row = getDb().prepare('SELECT last_value FROM funolio_session_counter WHERE id = 1').get();
|
|
1173
|
+
const counter = row?.last_value ?? 1;
|
|
1174
|
+
const hex = counter.toString(16).padStart(12, '0');
|
|
1175
|
+
return `fff00000-0000-4000-8000-${hex}`;
|
|
1176
|
+
}
|
|
1081
1177
|
function getChatJob(id) {
|
|
1082
1178
|
return getDb().prepare('SELECT * FROM chat_job WHERE id = ?').get(id);
|
|
1083
1179
|
}
|
|
@@ -1090,6 +1186,16 @@ function getLatestConversationChatJob(conversationId) {
|
|
|
1090
1186
|
LIMIT 1
|
|
1091
1187
|
`).get(conversationId);
|
|
1092
1188
|
}
|
|
1189
|
+
function getLatestConversationBotChatJob(conversationId, botId) {
|
|
1190
|
+
return getDb().prepare(`
|
|
1191
|
+
SELECT *
|
|
1192
|
+
FROM chat_job
|
|
1193
|
+
WHERE conversation_id = ?
|
|
1194
|
+
AND bot_id = ?
|
|
1195
|
+
ORDER BY datetime(created_at) DESC, rowid DESC
|
|
1196
|
+
LIMIT 1
|
|
1197
|
+
`).get(conversationId, botId);
|
|
1198
|
+
}
|
|
1093
1199
|
function listQueuedChatJobs(limit = 50) {
|
|
1094
1200
|
return getDb().prepare(`
|
|
1095
1201
|
SELECT *
|
|
@@ -1099,6 +1205,25 @@ function listQueuedChatJobs(limit = 50) {
|
|
|
1099
1205
|
LIMIT ?
|
|
1100
1206
|
`).all(limit);
|
|
1101
1207
|
}
|
|
1208
|
+
function listRunningChatJobs(limit = 50) {
|
|
1209
|
+
return getDb().prepare(`
|
|
1210
|
+
SELECT *
|
|
1211
|
+
FROM chat_job
|
|
1212
|
+
WHERE status = 'running'
|
|
1213
|
+
ORDER BY datetime(started_at) ASC, datetime(created_at) ASC, rowid ASC
|
|
1214
|
+
LIMIT ?
|
|
1215
|
+
`).all(limit);
|
|
1216
|
+
}
|
|
1217
|
+
function listActiveAssistantMessageIds(conversationId) {
|
|
1218
|
+
return getDb().prepare(`
|
|
1219
|
+
SELECT assistant_message_id
|
|
1220
|
+
FROM chat_job
|
|
1221
|
+
WHERE conversation_id = ?
|
|
1222
|
+
AND status IN ('queued', 'running')
|
|
1223
|
+
AND assistant_message_id IS NOT NULL
|
|
1224
|
+
AND trim(assistant_message_id) <> ''
|
|
1225
|
+
`).all(conversationId).map((row) => String(row.assistant_message_id || '')).filter(Boolean);
|
|
1226
|
+
}
|
|
1102
1227
|
function countRunningChatJobs() {
|
|
1103
1228
|
return getDb().prepare(`
|
|
1104
1229
|
SELECT count(*) AS cnt
|
|
@@ -3439,7 +3564,18 @@ function updateTopic(id, fields) {
|
|
|
3439
3564
|
return db.prepare('SELECT * FROM topic WHERE id = ?').get(id);
|
|
3440
3565
|
}
|
|
3441
3566
|
function deleteTopic(id) {
|
|
3442
|
-
|
|
3567
|
+
const db = getDb();
|
|
3568
|
+
const tx = db.transaction((topicId) => {
|
|
3569
|
+
const topicExists = db.prepare('SELECT id FROM topic WHERE id = ?').get(topicId);
|
|
3570
|
+
if (!topicExists)
|
|
3571
|
+
return false;
|
|
3572
|
+
const linkedConversationIds = db.prepare('SELECT DISTINCT conversation_id FROM topic_segment WHERE topic_id = ?').all(topicId).map((row) => row.conversation_id);
|
|
3573
|
+
for (const conversationId of linkedConversationIds) {
|
|
3574
|
+
db.prepare('DELETE FROM conversation WHERE id = ?').run(conversationId);
|
|
3575
|
+
}
|
|
3576
|
+
return db.prepare('DELETE FROM topic WHERE id = ?').run(topicId).changes > 0;
|
|
3577
|
+
});
|
|
3578
|
+
return tx(id);
|
|
3443
3579
|
}
|
|
3444
3580
|
function createTopicSegment(s) {
|
|
3445
3581
|
const db = getDb();
|