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.
Files changed (115) hide show
  1. package/dist/approval.d.ts +1 -6
  2. package/dist/approval.d.ts.map +1 -1
  3. package/dist/approval.js +2 -7
  4. package/dist/approval.js.map +1 -1
  5. package/dist/bot-manager.d.ts +5 -1
  6. package/dist/bot-manager.d.ts.map +1 -1
  7. package/dist/bot-manager.js +23 -13
  8. package/dist/bot-manager.js.map +1 -1
  9. package/dist/cli-session-epoch.d.ts +1 -1
  10. package/dist/cli-session-epoch.d.ts.map +1 -1
  11. package/dist/cli-session-epoch.js +1 -1
  12. package/dist/cli-session-epoch.js.map +1 -1
  13. package/dist/cli-session-registry.d.ts +35 -0
  14. package/dist/cli-session-registry.d.ts.map +1 -0
  15. package/dist/cli-session-registry.js +177 -0
  16. package/dist/cli-session-registry.js.map +1 -0
  17. package/dist/cli.js +62 -0
  18. package/dist/cli.js.map +1 -1
  19. package/dist/codex-app-server-manager.d.ts +129 -0
  20. package/dist/codex-app-server-manager.d.ts.map +1 -0
  21. package/dist/codex-app-server-manager.js +768 -0
  22. package/dist/codex-app-server-manager.js.map +1 -0
  23. package/dist/commands/init.d.ts.map +1 -1
  24. package/dist/commands/init.js +8 -30
  25. package/dist/commands/init.js.map +1 -1
  26. package/dist/commands/setup.d.ts +4 -1
  27. package/dist/commands/setup.d.ts.map +1 -1
  28. package/dist/commands/setup.js +9 -25
  29. package/dist/commands/setup.js.map +1 -1
  30. package/dist/commands/start.d.ts.map +1 -1
  31. package/dist/commands/start.js +77 -2
  32. package/dist/commands/start.js.map +1 -1
  33. package/dist/completion-marker.d.ts +7 -0
  34. package/dist/completion-marker.d.ts.map +1 -0
  35. package/dist/completion-marker.js +28 -0
  36. package/dist/completion-marker.js.map +1 -0
  37. package/dist/config.d.ts +6 -2
  38. package/dist/config.d.ts.map +1 -1
  39. package/dist/config.js +15 -3
  40. package/dist/config.js.map +1 -1
  41. package/dist/context-window.d.ts.map +1 -1
  42. package/dist/context-window.js +8 -1
  43. package/dist/context-window.js.map +1 -1
  44. package/dist/live-activity.d.ts +29 -0
  45. package/dist/live-activity.d.ts.map +1 -0
  46. package/dist/live-activity.js +36 -0
  47. package/dist/live-activity.js.map +1 -0
  48. package/dist/local-cli-pty-manager.d.ts +51 -0
  49. package/dist/local-cli-pty-manager.d.ts.map +1 -1
  50. package/dist/local-cli-pty-manager.js +1227 -114
  51. package/dist/local-cli-pty-manager.js.map +1 -1
  52. package/dist/local-data.d.ts +41 -0
  53. package/dist/local-data.d.ts.map +1 -1
  54. package/dist/local-data.js +140 -4
  55. package/dist/local-data.js.map +1 -1
  56. package/dist/local-db.d.ts.map +1 -1
  57. package/dist/local-db.js +55 -1
  58. package/dist/local-db.js.map +1 -1
  59. package/dist/local-server.d.ts +25 -0
  60. package/dist/local-server.d.ts.map +1 -1
  61. package/dist/local-server.js +528 -267
  62. package/dist/local-server.js.map +1 -1
  63. package/dist/message-loop.d.ts +6 -0
  64. package/dist/message-loop.d.ts.map +1 -1
  65. package/dist/message-loop.js +247 -89
  66. package/dist/message-loop.js.map +1 -1
  67. package/dist/mqtt-client.d.ts +10 -1
  68. package/dist/mqtt-client.d.ts.map +1 -1
  69. package/dist/mqtt-client.js +14 -1
  70. package/dist/mqtt-client.js.map +1 -1
  71. package/dist/oauth.d.ts.map +1 -1
  72. package/dist/oauth.js +69 -29
  73. package/dist/oauth.js.map +1 -1
  74. package/dist/orchestration/orchestrator-operating-prompt.d.ts +1 -0
  75. package/dist/orchestration/orchestrator-operating-prompt.d.ts.map +1 -1
  76. package/dist/orchestration/orchestrator-operating-prompt.js +60 -0
  77. package/dist/orchestration/orchestrator-operating-prompt.js.map +1 -1
  78. package/dist/orchestration/validation.d.ts +40 -0
  79. package/dist/orchestration/validation.d.ts.map +1 -0
  80. package/dist/orchestration/validation.js +203 -0
  81. package/dist/orchestration/validation.js.map +1 -0
  82. package/dist/orchestrator.d.ts +21 -32
  83. package/dist/orchestrator.d.ts.map +1 -1
  84. package/dist/orchestrator.js +287 -725
  85. package/dist/orchestrator.js.map +1 -1
  86. package/dist/providers/claude-cli-prompt.d.ts.map +1 -1
  87. package/dist/providers/claude-cli-prompt.js +49 -5
  88. package/dist/providers/claude-cli-prompt.js.map +1 -1
  89. package/dist/providers/claude-cli.d.ts.map +1 -1
  90. package/dist/providers/claude-cli.js +56 -5
  91. package/dist/providers/claude-cli.js.map +1 -1
  92. package/dist/providers/codex-cli.d.ts.map +1 -1
  93. package/dist/providers/codex-cli.js +15 -10
  94. package/dist/providers/codex-cli.js.map +1 -1
  95. package/dist/response-guard.js +1 -1
  96. package/dist/response-guard.js.map +1 -1
  97. package/dist/tools/admin-tools.d.ts.map +1 -1
  98. package/dist/tools/admin-tools.js +8 -2
  99. package/dist/tools/admin-tools.js.map +1 -1
  100. package/dist/tools/index.d.ts.map +1 -1
  101. package/dist/tools/index.js +2 -1
  102. package/dist/tools/index.js.map +1 -1
  103. package/dist/tools/search-conversation-history.d.ts +16 -0
  104. package/dist/tools/search-conversation-history.d.ts.map +1 -0
  105. package/dist/tools/search-conversation-history.js +324 -0
  106. package/dist/tools/search-conversation-history.js.map +1 -0
  107. package/dist/wizard-state.d.ts +7 -0
  108. package/dist/wizard-state.d.ts.map +1 -1
  109. package/dist/wizard-state.js +31 -2
  110. package/dist/wizard-state.js.map +1 -1
  111. package/dist/workflow-engine.d.ts +4 -1
  112. package/dist/workflow-engine.d.ts.map +1 -1
  113. package/dist/workflow-engine.js +190 -29
  114. package/dist/workflow-engine.js.map +1 -1
  115. package/package.json +1 -1
@@ -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, created_at, updated_at
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
- return getDb().prepare('DELETE FROM topic WHERE id = ?').run(id).changes > 0;
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();