@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
@@ -2915,6 +2915,33 @@ async function ensureSchema() {
2915
2915
  CREATE INDEX IF NOT EXISTS idx_chat_history_session
2916
2916
  ON chat_history(session_id, id);
2917
2917
  `);
2918
+ await client.executeMultiple(`
2919
+ CREATE TABLE IF NOT EXISTS session_events (
2920
+ id TEXT PRIMARY KEY,
2921
+ agent_id TEXT NOT NULL,
2922
+ agent_role TEXT NOT NULL,
2923
+ session_id TEXT NOT NULL,
2924
+ session_scope TEXT,
2925
+ project_name TEXT NOT NULL,
2926
+ event_index INTEGER NOT NULL,
2927
+ event_type TEXT NOT NULL,
2928
+ tool_name TEXT,
2929
+ tool_use_id TEXT,
2930
+ content TEXT NOT NULL,
2931
+ payload_json TEXT,
2932
+ has_error INTEGER NOT NULL DEFAULT 0,
2933
+ created_at TEXT NOT NULL
2934
+ );
2935
+
2936
+ CREATE INDEX IF NOT EXISTS idx_session_events_agent_time
2937
+ ON session_events(agent_id, created_at DESC);
2938
+
2939
+ CREATE INDEX IF NOT EXISTS idx_session_events_session_index
2940
+ ON session_events(session_id, event_index);
2941
+
2942
+ CREATE INDEX IF NOT EXISTS idx_session_events_scope_agent_time
2943
+ ON session_events(session_scope, agent_id, created_at DESC);
2944
+ `);
2918
2945
  await client.executeMultiple(`
2919
2946
  CREATE TABLE IF NOT EXISTS workspaces (
2920
2947
  id TEXT PRIMARY KEY,
@@ -26997,9 +27024,199 @@ Upstream status: ${upstreamStatus}`
26997
27024
  );
26998
27025
  }
26999
27026
 
27000
- // src/mcp/tools/code-context.ts
27027
+ // src/mcp/tools/get-session-events.ts
27028
+ init_active_agent();
27029
+ init_fast_db_init();
27001
27030
  import { z as z88 } from "zod";
27002
27031
 
27032
+ // src/lib/session-events.ts
27033
+ init_task_scope();
27034
+ init_project_name();
27035
+ import { randomUUID as randomUUID9 } from "crypto";
27036
+ async function ensureSessionEventsTable(client) {
27037
+ await client.execute(`
27038
+ CREATE TABLE IF NOT EXISTS session_events (
27039
+ id TEXT PRIMARY KEY,
27040
+ agent_id TEXT NOT NULL,
27041
+ agent_role TEXT NOT NULL,
27042
+ session_id TEXT NOT NULL,
27043
+ session_scope TEXT,
27044
+ project_name TEXT NOT NULL,
27045
+ event_index INTEGER NOT NULL,
27046
+ event_type TEXT NOT NULL,
27047
+ tool_name TEXT,
27048
+ tool_use_id TEXT,
27049
+ content TEXT NOT NULL,
27050
+ payload_json TEXT,
27051
+ has_error INTEGER NOT NULL DEFAULT 0,
27052
+ created_at TEXT NOT NULL
27053
+ )
27054
+ `);
27055
+ await client.execute(`
27056
+ CREATE INDEX IF NOT EXISTS idx_session_events_agent_time
27057
+ ON session_events(agent_id, created_at DESC)
27058
+ `);
27059
+ await client.execute(`
27060
+ CREATE INDEX IF NOT EXISTS idx_session_events_session_index
27061
+ ON session_events(session_id, event_index)
27062
+ `);
27063
+ await client.execute(`
27064
+ CREATE INDEX IF NOT EXISTS idx_session_events_scope_agent_time
27065
+ ON session_events(session_scope, agent_id, created_at DESC)
27066
+ `);
27067
+ }
27068
+ async function listRecentSessionEvents(client, options) {
27069
+ await ensureSessionEventsTable(client);
27070
+ const conditions = ["agent_id = ?"];
27071
+ const args = [options.agentId];
27072
+ if (options.sessionId) {
27073
+ conditions.push("session_id = ?");
27074
+ args.push(options.sessionId);
27075
+ }
27076
+ if (options.eventType) {
27077
+ conditions.push("event_type = ?");
27078
+ args.push(options.eventType);
27079
+ }
27080
+ if (options.projectName && options.projectName !== "all") {
27081
+ conditions.push("project_name = ?");
27082
+ args.push(options.projectName);
27083
+ }
27084
+ const scope = strictSessionScopeFilter(options.sessionScope);
27085
+ const where = `WHERE ${conditions.join(" AND ")}${scope.sql}`;
27086
+ args.push(...scope.args);
27087
+ args.push(Math.min(Math.max(options.limit ?? 20, 1), 100));
27088
+ const result2 = await client.execute({
27089
+ sql: `SELECT id, agent_id, agent_role, session_id, session_scope,
27090
+ project_name, event_index, event_type, tool_name, tool_use_id,
27091
+ content, payload_json, has_error, created_at
27092
+ FROM session_events
27093
+ ${where}
27094
+ ORDER BY created_at DESC, event_index DESC
27095
+ LIMIT ?`,
27096
+ args
27097
+ });
27098
+ return result2.rows.map((row) => ({
27099
+ id: String(row.id),
27100
+ agentId: String(row.agent_id),
27101
+ agentRole: String(row.agent_role),
27102
+ sessionId: String(row.session_id),
27103
+ sessionScope: row.session_scope == null ? null : String(row.session_scope),
27104
+ projectName: String(row.project_name),
27105
+ eventIndex: Number(row.event_index),
27106
+ eventType: String(row.event_type),
27107
+ toolName: row.tool_name == null ? null : String(row.tool_name),
27108
+ toolUseId: row.tool_use_id == null ? null : String(row.tool_use_id),
27109
+ content: String(row.content),
27110
+ payloadJson: row.payload_json == null ? null : String(row.payload_json),
27111
+ hasError: Number(row.has_error) === 1,
27112
+ createdAt: String(row.created_at)
27113
+ }));
27114
+ }
27115
+
27116
+ // src/mcp/tools/get-session-events.ts
27117
+ var EVENT_TYPE = z88.enum([
27118
+ "user_prompt",
27119
+ "assistant_response",
27120
+ "tool_call",
27121
+ "tool_result",
27122
+ "system_event"
27123
+ ]);
27124
+ function canReadAgent(activeRole, activeAgent, requestedAgent) {
27125
+ return requestedAgent === activeAgent || activeRole === "COO" || activeRole === "CTO";
27126
+ }
27127
+ function formatEvent(event) {
27128
+ const header = [
27129
+ `[${event.createdAt}]`,
27130
+ `${event.agentId}`,
27131
+ `${event.eventType}`,
27132
+ `session=${event.sessionId}`,
27133
+ `#${event.eventIndex}`,
27134
+ event.toolName ? `tool=${event.toolName}` : "",
27135
+ event.hasError ? "ERROR" : ""
27136
+ ].filter(Boolean).join(" ");
27137
+ return `${header}
27138
+ ${event.content}`;
27139
+ }
27140
+ function registerGetSessionEvents(server2) {
27141
+ server2.registerTool(
27142
+ "get_session_events",
27143
+ {
27144
+ title: "Get Session Events",
27145
+ 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.",
27146
+ inputSchema: {
27147
+ agent_id: z88.string().optional().describe("Agent to inspect. Defaults to active agent. COO/CTO may inspect others."),
27148
+ session_id: z88.string().optional().describe("Optional exact runtime session id."),
27149
+ event_type: EVENT_TYPE.optional().describe("Filter to one event type."),
27150
+ project_name: z88.string().optional().describe("Optional project filter. Pass 'all' for all projects."),
27151
+ limit: z88.number().int().min(1).max(100).default(20).describe("Number of events to return.")
27152
+ }
27153
+ },
27154
+ async ({ agent_id, session_id, event_type, project_name, limit }) => {
27155
+ const active = getActiveAgent();
27156
+ const targetAgent = agent_id?.trim() || active.agentId;
27157
+ if (!canReadAgent(active.agentRole, active.agentId, targetAgent)) {
27158
+ return {
27159
+ content: [{ type: "text", text: "Permission denied: only COO/CTO may read another agent's session events." }],
27160
+ isError: true
27161
+ };
27162
+ }
27163
+ const client = await fastDbInit();
27164
+ const events = await listRecentSessionEvents(client, {
27165
+ agentId: targetAgent,
27166
+ sessionId: session_id,
27167
+ eventType: event_type,
27168
+ projectName: project_name,
27169
+ limit
27170
+ });
27171
+ if (events.length === 0) {
27172
+ return { content: [{ type: "text", text: "No session events found." }] };
27173
+ }
27174
+ return {
27175
+ content: [{ type: "text", text: events.map(formatEvent).join("\n\n---\n\n") }]
27176
+ };
27177
+ }
27178
+ );
27179
+ }
27180
+ function registerGetLastAssistantResponse(server2) {
27181
+ server2.registerTool(
27182
+ "get_last_assistant_response",
27183
+ {
27184
+ title: "Get Last Assistant Response",
27185
+ description: "Return the exact last assistant response for an agent from the session event journal. Use for 'what was the last thing you said?'",
27186
+ inputSchema: {
27187
+ agent_id: z88.string().optional().describe("Agent to inspect. Defaults to active agent. COO/CTO may inspect others."),
27188
+ project_name: z88.string().optional().describe("Optional project filter. Pass 'all' for all projects.")
27189
+ }
27190
+ },
27191
+ async ({ agent_id, project_name }) => {
27192
+ const active = getActiveAgent();
27193
+ const targetAgent = agent_id?.trim() || active.agentId;
27194
+ if (!canReadAgent(active.agentRole, active.agentId, targetAgent)) {
27195
+ return {
27196
+ content: [{ type: "text", text: "Permission denied: only COO/CTO may read another agent's last response." }],
27197
+ isError: true
27198
+ };
27199
+ }
27200
+ const client = await fastDbInit();
27201
+ const events = await listRecentSessionEvents(client, {
27202
+ agentId: targetAgent,
27203
+ eventType: "assistant_response",
27204
+ projectName: project_name,
27205
+ limit: 1
27206
+ });
27207
+ if (events.length === 0) {
27208
+ return { content: [{ type: "text", text: "No assistant response found in the session journal." }] };
27209
+ }
27210
+ return {
27211
+ content: [{ type: "text", text: formatEvent(events[0]) }]
27212
+ };
27213
+ }
27214
+ );
27215
+ }
27216
+
27217
+ // src/mcp/tools/code-context.ts
27218
+ import { z as z89 } from "zod";
27219
+
27003
27220
  // src/lib/code-context-index.ts
27004
27221
  init_config();
27005
27222
  import crypto19 from "crypto";
@@ -27414,19 +27631,19 @@ function registerCodeContext(server2) {
27414
27631
  title: "Code Context",
27415
27632
  description: "Persistent codebase context engine. One consolidated tool to avoid MCP bloat. Actions: index, search, trace, blast_radius, stats.",
27416
27633
  inputSchema: {
27417
- action: z88.enum(["index", "search", "trace", "blast_radius", "stats"]).describe("Code context operation"),
27418
- project_root: z88.string().optional().describe("Repository root. Defaults to current working directory."),
27419
- query: z88.string().optional().describe("Search query for action=search"),
27420
- symbol: z88.string().optional().describe("Symbol/function/class/type name for trace or blast_radius"),
27421
- file_path: z88.string().optional().describe("File path for blast_radius"),
27422
- force: z88.boolean().optional().describe("Force rebuild before answering"),
27423
- limit: z88.coerce.number().int().min(1).max(100).optional().describe("Max results"),
27424
- offset: z88.coerce.number().int().min(0).optional().describe("Search pagination offset"),
27425
- refresh_index: z88.boolean().optional().describe("Refresh/rebuild index before searching"),
27426
- languages: z88.array(z88.string()).optional().describe('Language filters, e.g. ["python", "typescript"]'),
27427
- paths: z88.array(z88.string()).optional().describe("Path/glob filters"),
27428
- depth: z88.coerce.number().int().min(1).max(5).optional().describe("Dependent traversal depth for blast_radius"),
27429
- max_files: z88.coerce.number().int().min(1).max(1e4).optional().describe("Max code files to index")
27634
+ action: z89.enum(["index", "search", "trace", "blast_radius", "stats"]).describe("Code context operation"),
27635
+ project_root: z89.string().optional().describe("Repository root. Defaults to current working directory."),
27636
+ query: z89.string().optional().describe("Search query for action=search"),
27637
+ symbol: z89.string().optional().describe("Symbol/function/class/type name for trace or blast_radius"),
27638
+ file_path: z89.string().optional().describe("File path for blast_radius"),
27639
+ force: z89.boolean().optional().describe("Force rebuild before answering"),
27640
+ limit: z89.coerce.number().int().min(1).max(100).optional().describe("Max results"),
27641
+ offset: z89.coerce.number().int().min(0).optional().describe("Search pagination offset"),
27642
+ refresh_index: z89.boolean().optional().describe("Refresh/rebuild index before searching"),
27643
+ languages: z89.array(z89.string()).optional().describe('Language filters, e.g. ["python", "typescript"]'),
27644
+ paths: z89.array(z89.string()).optional().describe("Path/glob filters"),
27645
+ depth: z89.coerce.number().int().min(1).max(5).optional().describe("Dependent traversal depth for blast_radius"),
27646
+ max_files: z89.coerce.number().int().min(1).max(1e4).optional().describe("Max code files to index")
27430
27647
  }
27431
27648
  }, async ({ action, project_root, query, symbol, file_path, force, limit, offset, refresh_index, languages, paths, depth, max_files }) => {
27432
27649
  const opts = { projectRoot: project_root, force, maxFiles: max_files };
@@ -27471,9 +27688,9 @@ function registerCodeContext(server2) {
27471
27688
  }
27472
27689
 
27473
27690
  // src/mcp/tools/support-inbox.ts
27474
- import { z as z89 } from "zod";
27691
+ import { z as z90 } from "zod";
27475
27692
  var DEFAULT_ENDPOINT = "https://askexe.com/admin/support/bug-reports";
27476
- var STATUS = z89.enum(["open", "triaged", "fixed", "closed", "wontfix"]);
27693
+ var STATUS = z90.enum(["open", "triaged", "fixed", "closed", "wontfix"]);
27477
27694
  function adminToken() {
27478
27695
  return process.env.ASKEXE_SUPPORT_ADMIN_TOKEN || process.env.EXE_SUPPORT_ADMIN_TOKEN;
27479
27696
  }
@@ -27512,9 +27729,9 @@ function registerListBugReports(server2) {
27512
27729
  title: "List Bug Reports",
27513
27730
  description: "AskExe-internal only: list incoming customer bug reports from the support inbox.",
27514
27731
  inputSchema: {
27515
- status: z89.enum(["all", "open", "triaged", "fixed", "closed", "wontfix"]).default("open"),
27516
- severity: z89.enum(["p0", "p1", "p2", "p3"]).optional(),
27517
- limit: z89.number().int().min(1).max(100).default(25)
27732
+ status: z90.enum(["all", "open", "triaged", "fixed", "closed", "wontfix"]).default("open"),
27733
+ severity: z90.enum(["p0", "p1", "p2", "p3"]).optional(),
27734
+ limit: z90.number().int().min(1).max(100).default(25)
27518
27735
  }
27519
27736
  },
27520
27737
  async ({ status, severity, limit }) => {
@@ -27533,7 +27750,7 @@ function registerGetBugReport(server2) {
27533
27750
  {
27534
27751
  title: "Get Bug Report",
27535
27752
  description: "AskExe-internal only: fetch one customer bug report with full markdown payload.",
27536
- inputSchema: { id: z89.string().min(8) }
27753
+ inputSchema: { id: z90.string().min(8) }
27537
27754
  },
27538
27755
  async ({ id }) => {
27539
27756
  const data = await requestJson(`${endpoint()}/${encodeURIComponent(id)}`);
@@ -27548,12 +27765,12 @@ function registerTriageBugReport(server2) {
27548
27765
  title: "Triage Bug Report",
27549
27766
  description: "AskExe-internal only: update bug report status and link task/commit/release metadata.",
27550
27767
  inputSchema: {
27551
- id: z89.string().min(8),
27768
+ id: z90.string().min(8),
27552
27769
  status: STATUS.optional(),
27553
- triage_notes: z89.string().optional(),
27554
- linked_task_id: z89.string().optional(),
27555
- linked_commit: z89.string().optional(),
27556
- fixed_version: z89.string().optional()
27770
+ triage_notes: z90.string().optional(),
27771
+ linked_task_id: z90.string().optional(),
27772
+ linked_commit: z90.string().optional(),
27773
+ fixed_version: z90.string().optional()
27557
27774
  }
27558
27775
  },
27559
27776
  async ({ id, status, triage_notes, linked_task_id, linked_commit, fixed_version }) => {
@@ -27616,6 +27833,8 @@ var TOOL_CATEGORIES = {
27616
27833
  registerStoreDecision: "core",
27617
27834
  registerGetDecision: "core",
27618
27835
  registerCreateBugReport: "core",
27836
+ registerGetSessionEvents: "core",
27837
+ registerGetLastAssistantResponse: "core",
27619
27838
  registerCodeContext: "graph-read",
27620
27839
  registerListBugReports: "admin",
27621
27840
  registerGetBugReport: "admin",
@@ -27881,6 +28100,8 @@ function registerAllTools(server2) {
27881
28100
  gate("registerStoreDecision", registerStoreDecision);
27882
28101
  gate("registerGetDecision", registerGetDecision);
27883
28102
  gate("registerCreateBugReport", registerCreateBugReport);
28103
+ gate("registerGetSessionEvents", registerGetSessionEvents);
28104
+ gate("registerGetLastAssistantResponse", registerGetLastAssistantResponse);
27884
28105
  gate("registerCodeContext", registerCodeContext);
27885
28106
  if (process.env.ASKEXE_SUPPORT_ADMIN_TOKEN || process.env.EXE_SUPPORT_ADMIN_TOKEN) {
27886
28107
  gate("registerListBugReports", registerListBugReports);
@@ -3006,6 +3006,33 @@ async function ensureSchema() {
3006
3006
  CREATE INDEX IF NOT EXISTS idx_chat_history_session
3007
3007
  ON chat_history(session_id, id);
3008
3008
  `);
3009
+ await client.executeMultiple(`
3010
+ CREATE TABLE IF NOT EXISTS session_events (
3011
+ id TEXT PRIMARY KEY,
3012
+ agent_id TEXT NOT NULL,
3013
+ agent_role TEXT NOT NULL,
3014
+ session_id TEXT NOT NULL,
3015
+ session_scope TEXT,
3016
+ project_name TEXT NOT NULL,
3017
+ event_index INTEGER NOT NULL,
3018
+ event_type TEXT NOT NULL,
3019
+ tool_name TEXT,
3020
+ tool_use_id TEXT,
3021
+ content TEXT NOT NULL,
3022
+ payload_json TEXT,
3023
+ has_error INTEGER NOT NULL DEFAULT 0,
3024
+ created_at TEXT NOT NULL
3025
+ );
3026
+
3027
+ CREATE INDEX IF NOT EXISTS idx_session_events_agent_time
3028
+ ON session_events(agent_id, created_at DESC);
3029
+
3030
+ CREATE INDEX IF NOT EXISTS idx_session_events_session_index
3031
+ ON session_events(session_id, event_index);
3032
+
3033
+ CREATE INDEX IF NOT EXISTS idx_session_events_scope_agent_time
3034
+ ON session_events(session_scope, agent_id, created_at DESC);
3035
+ `);
3009
3036
  await client.executeMultiple(`
3010
3037
  CREATE TABLE IF NOT EXISTS workspaces (
3011
3038
  id TEXT PRIMARY KEY,
package/dist/tui/App.js CHANGED
@@ -3258,6 +3258,33 @@ async function ensureSchema() {
3258
3258
  CREATE INDEX IF NOT EXISTS idx_chat_history_session
3259
3259
  ON chat_history(session_id, id);
3260
3260
  `);
3261
+ await client.executeMultiple(`
3262
+ CREATE TABLE IF NOT EXISTS session_events (
3263
+ id TEXT PRIMARY KEY,
3264
+ agent_id TEXT NOT NULL,
3265
+ agent_role TEXT NOT NULL,
3266
+ session_id TEXT NOT NULL,
3267
+ session_scope TEXT,
3268
+ project_name TEXT NOT NULL,
3269
+ event_index INTEGER NOT NULL,
3270
+ event_type TEXT NOT NULL,
3271
+ tool_name TEXT,
3272
+ tool_use_id TEXT,
3273
+ content TEXT NOT NULL,
3274
+ payload_json TEXT,
3275
+ has_error INTEGER NOT NULL DEFAULT 0,
3276
+ created_at TEXT NOT NULL
3277
+ );
3278
+
3279
+ CREATE INDEX IF NOT EXISTS idx_session_events_agent_time
3280
+ ON session_events(agent_id, created_at DESC);
3281
+
3282
+ CREATE INDEX IF NOT EXISTS idx_session_events_session_index
3283
+ ON session_events(session_id, event_index);
3284
+
3285
+ CREATE INDEX IF NOT EXISTS idx_session_events_scope_agent_time
3286
+ ON session_events(session_scope, agent_id, created_at DESC);
3287
+ `);
3261
3288
  await client.executeMultiple(`
3262
3289
  CREATE TABLE IF NOT EXISTS workspaces (
3263
3290
  id TEXT PRIMARY KEY,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askexenow/exe-os",
3
- "version": "0.9.70",
3
+ "version": "0.9.71",
4
4
  "description": "AI employee operating system — persistent memory, task management, and multi-agent coordination for Claude Code.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",