@askexenow/exe-os 0.9.70 → 0.9.71

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 (69) hide show
  1. package/dist/bin/agentic-ontology-backfill.js +27 -0
  2. package/dist/bin/agentic-reflection-backfill.js +27 -0
  3. package/dist/bin/agentic-semantic-label.js +27 -0
  4. package/dist/bin/backfill-conversations.js +27 -0
  5. package/dist/bin/backfill-responses.js +27 -0
  6. package/dist/bin/backfill-vectors.js +27 -0
  7. package/dist/bin/bulk-sync-postgres.js +27 -0
  8. package/dist/bin/cleanup-stale-review-tasks.js +27 -0
  9. package/dist/bin/cli.js +27 -0
  10. package/dist/bin/exe-assign.js +27 -0
  11. package/dist/bin/exe-boot.js +27 -0
  12. package/dist/bin/exe-cloud.js +27 -0
  13. package/dist/bin/exe-dispatch.js +27 -0
  14. package/dist/bin/exe-doctor.js +27 -0
  15. package/dist/bin/exe-export-behaviors.js +27 -0
  16. package/dist/bin/exe-forget.js +27 -0
  17. package/dist/bin/exe-gateway.js +27 -0
  18. package/dist/bin/exe-heartbeat.js +27 -0
  19. package/dist/bin/exe-kill.js +27 -0
  20. package/dist/bin/exe-launch-agent.js +27 -0
  21. package/dist/bin/exe-pending-messages.js +27 -0
  22. package/dist/bin/exe-pending-notifications.js +27 -0
  23. package/dist/bin/exe-pending-reviews.js +27 -0
  24. package/dist/bin/exe-rename.js +27 -0
  25. package/dist/bin/exe-review.js +27 -0
  26. package/dist/bin/exe-search.js +27 -0
  27. package/dist/bin/exe-session-cleanup.js +27 -0
  28. package/dist/bin/exe-start-codex.js +27 -0
  29. package/dist/bin/exe-start-opencode.js +27 -0
  30. package/dist/bin/exe-status.js +27 -0
  31. package/dist/bin/exe-team.js +27 -0
  32. package/dist/bin/git-sweep.js +27 -0
  33. package/dist/bin/graph-backfill.js +27 -0
  34. package/dist/bin/graph-export.js +27 -0
  35. package/dist/bin/intercom-check.js +27 -0
  36. package/dist/bin/scan-tasks.js +27 -0
  37. package/dist/bin/setup.js +27 -0
  38. package/dist/bin/shard-migrate.js +27 -0
  39. package/dist/gateway/index.js +27 -0
  40. package/dist/hooks/bug-report-worker.js +27 -0
  41. package/dist/hooks/codex-stop-task-finalizer.js +27 -0
  42. package/dist/hooks/commit-complete.js +27 -0
  43. package/dist/hooks/error-recall.js +27 -0
  44. package/dist/hooks/ingest.js +27 -0
  45. package/dist/hooks/instructions-loaded.js +27 -0
  46. package/dist/hooks/notification.js +27 -0
  47. package/dist/hooks/post-compact.js +27 -0
  48. package/dist/hooks/post-tool-combined.js +692 -17
  49. package/dist/hooks/pre-compact.js +27 -0
  50. package/dist/hooks/pre-tool-use.js +27 -0
  51. package/dist/hooks/prompt-submit.js +308 -0
  52. package/dist/hooks/session-end.js +27 -0
  53. package/dist/hooks/session-start.js +27 -0
  54. package/dist/hooks/stop.js +273 -12
  55. package/dist/hooks/subagent-stop.js +27 -0
  56. package/dist/hooks/summary-worker.js +27 -0
  57. package/dist/index.js +27 -0
  58. package/dist/lib/cloud-sync.js +27 -0
  59. package/dist/lib/database.js +27 -0
  60. package/dist/lib/db.js +27 -0
  61. package/dist/lib/device-registry.js +27 -0
  62. package/dist/lib/exe-daemon.js +260 -28
  63. package/dist/lib/hybrid-search.js +27 -0
  64. package/dist/lib/schedules.js +27 -0
  65. package/dist/lib/store.js +27 -0
  66. package/dist/mcp/server.js +246 -25
  67. package/dist/runtime/index.js +27 -0
  68. package/dist/tui/App.js +27 -0
  69. package/package.json +1 -1
@@ -2847,6 +2847,33 @@ async function ensureSchema() {
2847
2847
  CREATE INDEX IF NOT EXISTS idx_chat_history_session
2848
2848
  ON chat_history(session_id, id);
2849
2849
  `);
2850
+ await client.executeMultiple(`
2851
+ CREATE TABLE IF NOT EXISTS session_events (
2852
+ id TEXT PRIMARY KEY,
2853
+ agent_id TEXT NOT NULL,
2854
+ agent_role TEXT NOT NULL,
2855
+ session_id TEXT NOT NULL,
2856
+ session_scope TEXT,
2857
+ project_name TEXT NOT NULL,
2858
+ event_index INTEGER NOT NULL,
2859
+ event_type TEXT NOT NULL,
2860
+ tool_name TEXT,
2861
+ tool_use_id TEXT,
2862
+ content TEXT NOT NULL,
2863
+ payload_json TEXT,
2864
+ has_error INTEGER NOT NULL DEFAULT 0,
2865
+ created_at TEXT NOT NULL
2866
+ );
2867
+
2868
+ CREATE INDEX IF NOT EXISTS idx_session_events_agent_time
2869
+ ON session_events(agent_id, created_at DESC);
2870
+
2871
+ CREATE INDEX IF NOT EXISTS idx_session_events_session_index
2872
+ ON session_events(session_id, event_index);
2873
+
2874
+ CREATE INDEX IF NOT EXISTS idx_session_events_scope_agent_time
2875
+ ON session_events(session_scope, agent_id, created_at DESC);
2876
+ `);
2850
2877
  await client.executeMultiple(`
2851
2878
  CREATE TABLE IF NOT EXISTS workspaces (
2852
2879
  id TEXT PRIMARY KEY,
@@ -30029,6 +30056,206 @@ var init_create_bug_report = __esm({
30029
30056
  }
30030
30057
  });
30031
30058
 
30059
+ // src/lib/session-events.ts
30060
+ import { randomUUID as randomUUID9 } from "crypto";
30061
+ async function ensureSessionEventsTable(client) {
30062
+ await client.execute(`
30063
+ CREATE TABLE IF NOT EXISTS session_events (
30064
+ id TEXT PRIMARY KEY,
30065
+ agent_id TEXT NOT NULL,
30066
+ agent_role TEXT NOT NULL,
30067
+ session_id TEXT NOT NULL,
30068
+ session_scope TEXT,
30069
+ project_name TEXT NOT NULL,
30070
+ event_index INTEGER NOT NULL,
30071
+ event_type TEXT NOT NULL,
30072
+ tool_name TEXT,
30073
+ tool_use_id TEXT,
30074
+ content TEXT NOT NULL,
30075
+ payload_json TEXT,
30076
+ has_error INTEGER NOT NULL DEFAULT 0,
30077
+ created_at TEXT NOT NULL
30078
+ )
30079
+ `);
30080
+ await client.execute(`
30081
+ CREATE INDEX IF NOT EXISTS idx_session_events_agent_time
30082
+ ON session_events(agent_id, created_at DESC)
30083
+ `);
30084
+ await client.execute(`
30085
+ CREATE INDEX IF NOT EXISTS idx_session_events_session_index
30086
+ ON session_events(session_id, event_index)
30087
+ `);
30088
+ await client.execute(`
30089
+ CREATE INDEX IF NOT EXISTS idx_session_events_scope_agent_time
30090
+ ON session_events(session_scope, agent_id, created_at DESC)
30091
+ `);
30092
+ }
30093
+ async function listRecentSessionEvents(client, options) {
30094
+ await ensureSessionEventsTable(client);
30095
+ const conditions = ["agent_id = ?"];
30096
+ const args = [options.agentId];
30097
+ if (options.sessionId) {
30098
+ conditions.push("session_id = ?");
30099
+ args.push(options.sessionId);
30100
+ }
30101
+ if (options.eventType) {
30102
+ conditions.push("event_type = ?");
30103
+ args.push(options.eventType);
30104
+ }
30105
+ if (options.projectName && options.projectName !== "all") {
30106
+ conditions.push("project_name = ?");
30107
+ args.push(options.projectName);
30108
+ }
30109
+ const scope = strictSessionScopeFilter(options.sessionScope);
30110
+ const where = `WHERE ${conditions.join(" AND ")}${scope.sql}`;
30111
+ args.push(...scope.args);
30112
+ args.push(Math.min(Math.max(options.limit ?? 20, 1), 100));
30113
+ const result2 = await client.execute({
30114
+ sql: `SELECT id, agent_id, agent_role, session_id, session_scope,
30115
+ project_name, event_index, event_type, tool_name, tool_use_id,
30116
+ content, payload_json, has_error, created_at
30117
+ FROM session_events
30118
+ ${where}
30119
+ ORDER BY created_at DESC, event_index DESC
30120
+ LIMIT ?`,
30121
+ args
30122
+ });
30123
+ return result2.rows.map((row) => ({
30124
+ id: String(row.id),
30125
+ agentId: String(row.agent_id),
30126
+ agentRole: String(row.agent_role),
30127
+ sessionId: String(row.session_id),
30128
+ sessionScope: row.session_scope == null ? null : String(row.session_scope),
30129
+ projectName: String(row.project_name),
30130
+ eventIndex: Number(row.event_index),
30131
+ eventType: String(row.event_type),
30132
+ toolName: row.tool_name == null ? null : String(row.tool_name),
30133
+ toolUseId: row.tool_use_id == null ? null : String(row.tool_use_id),
30134
+ content: String(row.content),
30135
+ payloadJson: row.payload_json == null ? null : String(row.payload_json),
30136
+ hasError: Number(row.has_error) === 1,
30137
+ createdAt: String(row.created_at)
30138
+ }));
30139
+ }
30140
+ var init_session_events = __esm({
30141
+ "src/lib/session-events.ts"() {
30142
+ "use strict";
30143
+ init_task_scope();
30144
+ init_project_name();
30145
+ }
30146
+ });
30147
+
30148
+ // src/mcp/tools/get-session-events.ts
30149
+ import { z as z88 } from "zod";
30150
+ function canReadAgent(activeRole, activeAgent, requestedAgent) {
30151
+ return requestedAgent === activeAgent || activeRole === "COO" || activeRole === "CTO";
30152
+ }
30153
+ function formatEvent(event) {
30154
+ const header = [
30155
+ `[${event.createdAt}]`,
30156
+ `${event.agentId}`,
30157
+ `${event.eventType}`,
30158
+ `session=${event.sessionId}`,
30159
+ `#${event.eventIndex}`,
30160
+ event.toolName ? `tool=${event.toolName}` : "",
30161
+ event.hasError ? "ERROR" : ""
30162
+ ].filter(Boolean).join(" ");
30163
+ return `${header}
30164
+ ${event.content}`;
30165
+ }
30166
+ function registerGetSessionEvents(server) {
30167
+ server.registerTool(
30168
+ "get_session_events",
30169
+ {
30170
+ title: "Get Session Events",
30171
+ description: "Return exact recent chronological user prompts, assistant responses, and tool calls from the append-only session journal. Use this when asked what happened last, not semantic memory search.",
30172
+ inputSchema: {
30173
+ agent_id: z88.string().optional().describe("Agent to inspect. Defaults to active agent. COO/CTO may inspect others."),
30174
+ session_id: z88.string().optional().describe("Optional exact runtime session id."),
30175
+ event_type: EVENT_TYPE.optional().describe("Filter to one event type."),
30176
+ project_name: z88.string().optional().describe("Optional project filter. Pass 'all' for all projects."),
30177
+ limit: z88.number().int().min(1).max(100).default(20).describe("Number of events to return.")
30178
+ }
30179
+ },
30180
+ async ({ agent_id, session_id, event_type, project_name, limit }) => {
30181
+ const active = getActiveAgent();
30182
+ const targetAgent = agent_id?.trim() || active.agentId;
30183
+ if (!canReadAgent(active.agentRole, active.agentId, targetAgent)) {
30184
+ return {
30185
+ content: [{ type: "text", text: "Permission denied: only COO/CTO may read another agent's session events." }],
30186
+ isError: true
30187
+ };
30188
+ }
30189
+ const client = await fastDbInit();
30190
+ const events = await listRecentSessionEvents(client, {
30191
+ agentId: targetAgent,
30192
+ sessionId: session_id,
30193
+ eventType: event_type,
30194
+ projectName: project_name,
30195
+ limit
30196
+ });
30197
+ if (events.length === 0) {
30198
+ return { content: [{ type: "text", text: "No session events found." }] };
30199
+ }
30200
+ return {
30201
+ content: [{ type: "text", text: events.map(formatEvent).join("\n\n---\n\n") }]
30202
+ };
30203
+ }
30204
+ );
30205
+ }
30206
+ function registerGetLastAssistantResponse(server) {
30207
+ server.registerTool(
30208
+ "get_last_assistant_response",
30209
+ {
30210
+ title: "Get Last Assistant Response",
30211
+ description: "Return the exact last assistant response for an agent from the session event journal. Use for 'what was the last thing you said?'",
30212
+ inputSchema: {
30213
+ agent_id: z88.string().optional().describe("Agent to inspect. Defaults to active agent. COO/CTO may inspect others."),
30214
+ project_name: z88.string().optional().describe("Optional project filter. Pass 'all' for all projects.")
30215
+ }
30216
+ },
30217
+ async ({ agent_id, project_name }) => {
30218
+ const active = getActiveAgent();
30219
+ const targetAgent = agent_id?.trim() || active.agentId;
30220
+ if (!canReadAgent(active.agentRole, active.agentId, targetAgent)) {
30221
+ return {
30222
+ content: [{ type: "text", text: "Permission denied: only COO/CTO may read another agent's last response." }],
30223
+ isError: true
30224
+ };
30225
+ }
30226
+ const client = await fastDbInit();
30227
+ const events = await listRecentSessionEvents(client, {
30228
+ agentId: targetAgent,
30229
+ eventType: "assistant_response",
30230
+ projectName: project_name,
30231
+ limit: 1
30232
+ });
30233
+ if (events.length === 0) {
30234
+ return { content: [{ type: "text", text: "No assistant response found in the session journal." }] };
30235
+ }
30236
+ return {
30237
+ content: [{ type: "text", text: formatEvent(events[0]) }]
30238
+ };
30239
+ }
30240
+ );
30241
+ }
30242
+ var EVENT_TYPE;
30243
+ var init_get_session_events = __esm({
30244
+ "src/mcp/tools/get-session-events.ts"() {
30245
+ "use strict";
30246
+ init_active_agent();
30247
+ init_fast_db_init();
30248
+ init_session_events();
30249
+ EVENT_TYPE = z88.enum([
30250
+ "user_prompt",
30251
+ "assistant_response",
30252
+ "tool_call",
30253
+ "tool_result",
30254
+ "system_event"
30255
+ ]);
30256
+ }
30257
+ });
30258
+
30032
30259
  // src/lib/code-context-index.ts
30033
30260
  import crypto20 from "crypto";
30034
30261
  import path54 from "path";
@@ -30439,7 +30666,7 @@ var init_code_context_index = __esm({
30439
30666
  });
30440
30667
 
30441
30668
  // src/mcp/tools/code-context.ts
30442
- import { z as z88 } from "zod";
30669
+ import { z as z89 } from "zod";
30443
30670
  function errorResult10(text3) {
30444
30671
  return { content: [{ type: "text", text: text3 }], isError: true };
30445
30672
  }
@@ -30451,19 +30678,19 @@ function registerCodeContext(server) {
30451
30678
  title: "Code Context",
30452
30679
  description: "Persistent codebase context engine. One consolidated tool to avoid MCP bloat. Actions: index, search, trace, blast_radius, stats.",
30453
30680
  inputSchema: {
30454
- action: z88.enum(["index", "search", "trace", "blast_radius", "stats"]).describe("Code context operation"),
30455
- project_root: z88.string().optional().describe("Repository root. Defaults to current working directory."),
30456
- query: z88.string().optional().describe("Search query for action=search"),
30457
- symbol: z88.string().optional().describe("Symbol/function/class/type name for trace or blast_radius"),
30458
- file_path: z88.string().optional().describe("File path for blast_radius"),
30459
- force: z88.boolean().optional().describe("Force rebuild before answering"),
30460
- limit: z88.coerce.number().int().min(1).max(100).optional().describe("Max results"),
30461
- offset: z88.coerce.number().int().min(0).optional().describe("Search pagination offset"),
30462
- refresh_index: z88.boolean().optional().describe("Refresh/rebuild index before searching"),
30463
- languages: z88.array(z88.string()).optional().describe('Language filters, e.g. ["python", "typescript"]'),
30464
- paths: z88.array(z88.string()).optional().describe("Path/glob filters"),
30465
- depth: z88.coerce.number().int().min(1).max(5).optional().describe("Dependent traversal depth for blast_radius"),
30466
- max_files: z88.coerce.number().int().min(1).max(1e4).optional().describe("Max code files to index")
30681
+ action: z89.enum(["index", "search", "trace", "blast_radius", "stats"]).describe("Code context operation"),
30682
+ project_root: z89.string().optional().describe("Repository root. Defaults to current working directory."),
30683
+ query: z89.string().optional().describe("Search query for action=search"),
30684
+ symbol: z89.string().optional().describe("Symbol/function/class/type name for trace or blast_radius"),
30685
+ file_path: z89.string().optional().describe("File path for blast_radius"),
30686
+ force: z89.boolean().optional().describe("Force rebuild before answering"),
30687
+ limit: z89.coerce.number().int().min(1).max(100).optional().describe("Max results"),
30688
+ offset: z89.coerce.number().int().min(0).optional().describe("Search pagination offset"),
30689
+ refresh_index: z89.boolean().optional().describe("Refresh/rebuild index before searching"),
30690
+ languages: z89.array(z89.string()).optional().describe('Language filters, e.g. ["python", "typescript"]'),
30691
+ paths: z89.array(z89.string()).optional().describe("Path/glob filters"),
30692
+ depth: z89.coerce.number().int().min(1).max(5).optional().describe("Dependent traversal depth for blast_radius"),
30693
+ max_files: z89.coerce.number().int().min(1).max(1e4).optional().describe("Max code files to index")
30467
30694
  }
30468
30695
  }, async ({ action, project_root, query, symbol, file_path, force, limit, offset, refresh_index, languages, paths, depth, max_files }) => {
30469
30696
  const opts = { projectRoot: project_root, force, maxFiles: max_files };
@@ -30514,7 +30741,7 @@ var init_code_context = __esm({
30514
30741
  });
30515
30742
 
30516
30743
  // src/mcp/tools/support-inbox.ts
30517
- import { z as z89 } from "zod";
30744
+ import { z as z90 } from "zod";
30518
30745
  function adminToken() {
30519
30746
  return process.env.ASKEXE_SUPPORT_ADMIN_TOKEN || process.env.EXE_SUPPORT_ADMIN_TOKEN;
30520
30747
  }
@@ -30553,9 +30780,9 @@ function registerListBugReports(server) {
30553
30780
  title: "List Bug Reports",
30554
30781
  description: "AskExe-internal only: list incoming customer bug reports from the support inbox.",
30555
30782
  inputSchema: {
30556
- status: z89.enum(["all", "open", "triaged", "fixed", "closed", "wontfix"]).default("open"),
30557
- severity: z89.enum(["p0", "p1", "p2", "p3"]).optional(),
30558
- limit: z89.number().int().min(1).max(100).default(25)
30783
+ status: z90.enum(["all", "open", "triaged", "fixed", "closed", "wontfix"]).default("open"),
30784
+ severity: z90.enum(["p0", "p1", "p2", "p3"]).optional(),
30785
+ limit: z90.number().int().min(1).max(100).default(25)
30559
30786
  }
30560
30787
  },
30561
30788
  async ({ status, severity, limit }) => {
@@ -30574,7 +30801,7 @@ function registerGetBugReport(server) {
30574
30801
  {
30575
30802
  title: "Get Bug Report",
30576
30803
  description: "AskExe-internal only: fetch one customer bug report with full markdown payload.",
30577
- inputSchema: { id: z89.string().min(8) }
30804
+ inputSchema: { id: z90.string().min(8) }
30578
30805
  },
30579
30806
  async ({ id }) => {
30580
30807
  const data = await requestJson(`${endpoint()}/${encodeURIComponent(id)}`);
@@ -30589,12 +30816,12 @@ function registerTriageBugReport(server) {
30589
30816
  title: "Triage Bug Report",
30590
30817
  description: "AskExe-internal only: update bug report status and link task/commit/release metadata.",
30591
30818
  inputSchema: {
30592
- id: z89.string().min(8),
30819
+ id: z90.string().min(8),
30593
30820
  status: STATUS.optional(),
30594
- triage_notes: z89.string().optional(),
30595
- linked_task_id: z89.string().optional(),
30596
- linked_commit: z89.string().optional(),
30597
- fixed_version: z89.string().optional()
30821
+ triage_notes: z90.string().optional(),
30822
+ linked_task_id: z90.string().optional(),
30823
+ linked_commit: z90.string().optional(),
30824
+ fixed_version: z90.string().optional()
30598
30825
  }
30599
30826
  },
30600
30827
  async ({ id, status, triage_notes, linked_task_id, linked_commit, fixed_version }) => {
@@ -30611,7 +30838,7 @@ var init_support_inbox = __esm({
30611
30838
  "src/mcp/tools/support-inbox.ts"() {
30612
30839
  "use strict";
30613
30840
  DEFAULT_ENDPOINT = "https://askexe.com/admin/support/bug-reports";
30614
- STATUS = z89.enum(["open", "triaged", "fixed", "closed", "wontfix"]);
30841
+ STATUS = z90.enum(["open", "triaged", "fixed", "closed", "wontfix"]);
30615
30842
  }
30616
30843
  });
30617
30844
 
@@ -30685,6 +30912,8 @@ var init_tool_gates = __esm({
30685
30912
  registerStoreDecision: "core",
30686
30913
  registerGetDecision: "core",
30687
30914
  registerCreateBugReport: "core",
30915
+ registerGetSessionEvents: "core",
30916
+ registerGetLastAssistantResponse: "core",
30688
30917
  registerCodeContext: "graph-read",
30689
30918
  registerListBugReports: "admin",
30690
30919
  registerGetBugReport: "admin",
@@ -30940,6 +31169,8 @@ function registerAllTools(server) {
30940
31169
  gate("registerStoreDecision", registerStoreDecision);
30941
31170
  gate("registerGetDecision", registerGetDecision);
30942
31171
  gate("registerCreateBugReport", registerCreateBugReport);
31172
+ gate("registerGetSessionEvents", registerGetSessionEvents);
31173
+ gate("registerGetLastAssistantResponse", registerGetLastAssistantResponse);
30943
31174
  gate("registerCodeContext", registerCodeContext);
30944
31175
  if (process.env.ASKEXE_SUPPORT_ADMIN_TOKEN || process.env.EXE_SUPPORT_ADMIN_TOKEN) {
30945
31176
  gate("registerListBugReports", registerListBugReports);
@@ -31085,6 +31316,7 @@ var init_register_tools = __esm({
31085
31316
  init_activate_license();
31086
31317
  init_query_company_brain();
31087
31318
  init_create_bug_report();
31319
+ init_get_session_events();
31088
31320
  init_code_context();
31089
31321
  init_support_inbox();
31090
31322
  init_tool_gates();
@@ -32152,7 +32384,7 @@ init_daemon_auth();
32152
32384
  import os24 from "os";
32153
32385
  import net2 from "net";
32154
32386
  import { createServer as createHttpServer } from "http";
32155
- import { randomUUID as randomUUID9 } from "crypto";
32387
+ import { randomUUID as randomUUID10 } from "crypto";
32156
32388
  import { writeFileSync as writeFileSync28, unlinkSync as unlinkSync14, mkdirSync as mkdirSync24, existsSync as existsSync46, readFileSync as readFileSync39, chmodSync as chmodSync2 } from "fs";
32157
32389
  import path59 from "path";
32158
32390
 
@@ -32542,7 +32774,7 @@ async function handleBatchWriteMemory(socket, requestId, entries) {
32542
32774
  }
32543
32775
  }
32544
32776
  async function writeMemoryRecord(entry) {
32545
- const id = randomUUID9();
32777
+ const id = randomUUID10();
32546
32778
  const now2 = entry.timestamp || (/* @__PURE__ */ new Date()).toISOString();
32547
32779
  const governed = governMemoryRecord({
32548
32780
  id,
@@ -32955,7 +33187,7 @@ async function startMcpHttpServer() {
32955
33187
  sessionLastSeen.set(sessionId, Date.now());
32956
33188
  } else if (!sessionId && req.method === "POST" && isInitializeRequest(parsedBody)) {
32957
33189
  transport = new StreamableHTTPServerTransport({
32958
- sessionIdGenerator: () => randomUUID9(),
33190
+ sessionIdGenerator: () => randomUUID10(),
32959
33191
  onsessioninitialized: (sid) => {
32960
33192
  transports.set(sid, transport);
32961
33193
  sessionLastSeen.set(sid, Date.now());
@@ -2435,6 +2435,33 @@ async function ensureSchema() {
2435
2435
  CREATE INDEX IF NOT EXISTS idx_chat_history_session
2436
2436
  ON chat_history(session_id, id);
2437
2437
  `);
2438
+ await client.executeMultiple(`
2439
+ CREATE TABLE IF NOT EXISTS session_events (
2440
+ id TEXT PRIMARY KEY,
2441
+ agent_id TEXT NOT NULL,
2442
+ agent_role TEXT NOT NULL,
2443
+ session_id TEXT NOT NULL,
2444
+ session_scope TEXT,
2445
+ project_name TEXT NOT NULL,
2446
+ event_index INTEGER NOT NULL,
2447
+ event_type TEXT NOT NULL,
2448
+ tool_name TEXT,
2449
+ tool_use_id TEXT,
2450
+ content TEXT NOT NULL,
2451
+ payload_json TEXT,
2452
+ has_error INTEGER NOT NULL DEFAULT 0,
2453
+ created_at TEXT NOT NULL
2454
+ );
2455
+
2456
+ CREATE INDEX IF NOT EXISTS idx_session_events_agent_time
2457
+ ON session_events(agent_id, created_at DESC);
2458
+
2459
+ CREATE INDEX IF NOT EXISTS idx_session_events_session_index
2460
+ ON session_events(session_id, event_index);
2461
+
2462
+ CREATE INDEX IF NOT EXISTS idx_session_events_scope_agent_time
2463
+ ON session_events(session_scope, agent_id, created_at DESC);
2464
+ `);
2438
2465
  await client.executeMultiple(`
2439
2466
  CREATE TABLE IF NOT EXISTS workspaces (
2440
2467
  id TEXT PRIMARY KEY,
@@ -2221,6 +2221,33 @@ async function ensureSchema() {
2221
2221
  CREATE INDEX IF NOT EXISTS idx_chat_history_session
2222
2222
  ON chat_history(session_id, id);
2223
2223
  `);
2224
+ await client.executeMultiple(`
2225
+ CREATE TABLE IF NOT EXISTS session_events (
2226
+ id TEXT PRIMARY KEY,
2227
+ agent_id TEXT NOT NULL,
2228
+ agent_role TEXT NOT NULL,
2229
+ session_id TEXT NOT NULL,
2230
+ session_scope TEXT,
2231
+ project_name TEXT NOT NULL,
2232
+ event_index INTEGER NOT NULL,
2233
+ event_type TEXT NOT NULL,
2234
+ tool_name TEXT,
2235
+ tool_use_id TEXT,
2236
+ content TEXT NOT NULL,
2237
+ payload_json TEXT,
2238
+ has_error INTEGER NOT NULL DEFAULT 0,
2239
+ created_at TEXT NOT NULL
2240
+ );
2241
+
2242
+ CREATE INDEX IF NOT EXISTS idx_session_events_agent_time
2243
+ ON session_events(agent_id, created_at DESC);
2244
+
2245
+ CREATE INDEX IF NOT EXISTS idx_session_events_session_index
2246
+ ON session_events(session_id, event_index);
2247
+
2248
+ CREATE INDEX IF NOT EXISTS idx_session_events_scope_agent_time
2249
+ ON session_events(session_scope, agent_id, created_at DESC);
2250
+ `);
2224
2251
  await client.executeMultiple(`
2225
2252
  CREATE TABLE IF NOT EXISTS workspaces (
2226
2253
  id TEXT PRIMARY KEY,
package/dist/lib/store.js CHANGED
@@ -2221,6 +2221,33 @@ async function ensureSchema() {
2221
2221
  CREATE INDEX IF NOT EXISTS idx_chat_history_session
2222
2222
  ON chat_history(session_id, id);
2223
2223
  `);
2224
+ await client.executeMultiple(`
2225
+ CREATE TABLE IF NOT EXISTS session_events (
2226
+ id TEXT PRIMARY KEY,
2227
+ agent_id TEXT NOT NULL,
2228
+ agent_role TEXT NOT NULL,
2229
+ session_id TEXT NOT NULL,
2230
+ session_scope TEXT,
2231
+ project_name TEXT NOT NULL,
2232
+ event_index INTEGER NOT NULL,
2233
+ event_type TEXT NOT NULL,
2234
+ tool_name TEXT,
2235
+ tool_use_id TEXT,
2236
+ content TEXT NOT NULL,
2237
+ payload_json TEXT,
2238
+ has_error INTEGER NOT NULL DEFAULT 0,
2239
+ created_at TEXT NOT NULL
2240
+ );
2241
+
2242
+ CREATE INDEX IF NOT EXISTS idx_session_events_agent_time
2243
+ ON session_events(agent_id, created_at DESC);
2244
+
2245
+ CREATE INDEX IF NOT EXISTS idx_session_events_session_index
2246
+ ON session_events(session_id, event_index);
2247
+
2248
+ CREATE INDEX IF NOT EXISTS idx_session_events_scope_agent_time
2249
+ ON session_events(session_scope, agent_id, created_at DESC);
2250
+ `);
2224
2251
  await client.executeMultiple(`
2225
2252
  CREATE TABLE IF NOT EXISTS workspaces (
2226
2253
  id TEXT PRIMARY KEY,