@askexenow/exe-os 0.9.12 → 0.9.13

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 (67) hide show
  1. package/dist/bin/backfill-conversations.js +22 -1
  2. package/dist/bin/backfill-responses.js +22 -1
  3. package/dist/bin/backfill-vectors.js +22 -1
  4. package/dist/bin/cleanup-stale-review-tasks.js +22 -1
  5. package/dist/bin/cli.js +22 -1
  6. package/dist/bin/exe-assign.js +22 -1
  7. package/dist/bin/exe-boot.js +22 -1
  8. package/dist/bin/exe-dispatch.js +22 -1
  9. package/dist/bin/exe-doctor.js +22 -1
  10. package/dist/bin/exe-export-behaviors.js +22 -1
  11. package/dist/bin/exe-forget.js +22 -1
  12. package/dist/bin/exe-gateway.js +22 -1
  13. package/dist/bin/exe-heartbeat.js +22 -1
  14. package/dist/bin/exe-kill.js +22 -1
  15. package/dist/bin/exe-launch-agent.js +22 -1
  16. package/dist/bin/exe-link.js +22 -1
  17. package/dist/bin/exe-pending-messages.js +22 -1
  18. package/dist/bin/exe-pending-notifications.js +22 -1
  19. package/dist/bin/exe-pending-reviews.js +22 -1
  20. package/dist/bin/exe-rename.js +22 -1
  21. package/dist/bin/exe-review.js +22 -1
  22. package/dist/bin/exe-search.js +22 -1
  23. package/dist/bin/exe-session-cleanup.js +22 -1
  24. package/dist/bin/exe-start-codex.js +22 -1
  25. package/dist/bin/exe-start-opencode.js +22 -1
  26. package/dist/bin/exe-status.js +22 -1
  27. package/dist/bin/exe-team.js +22 -1
  28. package/dist/bin/git-sweep.js +22 -1
  29. package/dist/bin/graph-backfill.js +22 -1
  30. package/dist/bin/graph-export.js +22 -1
  31. package/dist/bin/scan-tasks.js +22 -1
  32. package/dist/bin/setup.js +22 -1
  33. package/dist/bin/shard-migrate.js +22 -1
  34. package/dist/bin/wiki-sync.js +22 -1
  35. package/dist/gateway/index.js +22 -1
  36. package/dist/hooks/bug-report-worker.js +22 -1
  37. package/dist/hooks/codex-stop-task-finalizer.js +22 -1
  38. package/dist/hooks/commit-complete.js +22 -1
  39. package/dist/hooks/error-recall.js +22 -1
  40. package/dist/hooks/ingest-worker.js +22 -1
  41. package/dist/hooks/ingest.js +3345 -232
  42. package/dist/hooks/instructions-loaded.js +22 -1
  43. package/dist/hooks/notification.js +22 -1
  44. package/dist/hooks/post-compact.js +22 -1
  45. package/dist/hooks/pre-compact.js +22 -1
  46. package/dist/hooks/pre-tool-use.js +22 -1
  47. package/dist/hooks/prompt-ingest-worker.js +22 -1
  48. package/dist/hooks/prompt-submit.js +1700 -1396
  49. package/dist/hooks/response-ingest-worker.js +22 -1
  50. package/dist/hooks/session-end.js +345 -187
  51. package/dist/hooks/session-start.js +304 -15
  52. package/dist/hooks/stop.js +22 -1
  53. package/dist/hooks/subagent-stop.js +22 -1
  54. package/dist/hooks/summary-worker.js +22 -1
  55. package/dist/index.js +22 -1
  56. package/dist/lib/cloud-sync.js +22 -1
  57. package/dist/lib/database.js +22 -1
  58. package/dist/lib/db.js +22 -1
  59. package/dist/lib/device-registry.js +22 -1
  60. package/dist/lib/exe-daemon.js +22 -1
  61. package/dist/lib/hybrid-search.js +22 -1
  62. package/dist/lib/schedules.js +22 -1
  63. package/dist/lib/store.js +22 -1
  64. package/dist/mcp/server.js +126 -1
  65. package/dist/runtime/index.js +22 -1
  66. package/dist/tui/App.js +22 -1
  67. package/package.json +1 -1
@@ -1749,12 +1749,26 @@ async function ensureSchema() {
1749
1749
  session_name TEXT,
1750
1750
  task_id TEXT,
1751
1751
  project_name TEXT,
1752
- started_at TEXT NOT NULL
1752
+ started_at TEXT NOT NULL,
1753
+ cache_cold_count INTEGER NOT NULL DEFAULT 0
1753
1754
  );
1754
1755
 
1755
1756
  CREATE INDEX IF NOT EXISTS idx_session_agent_map_agent
1756
1757
  ON session_agent_map(agent_id);
1757
1758
  `);
1759
+ await client.executeMultiple(`
1760
+ CREATE TABLE IF NOT EXISTS agent_file_reads (
1761
+ session_uuid TEXT NOT NULL,
1762
+ agent_id TEXT NOT NULL,
1763
+ file_path TEXT NOT NULL,
1764
+ read_at TEXT NOT NULL,
1765
+ commit_hash TEXT,
1766
+ PRIMARY KEY (session_uuid, file_path)
1767
+ );
1768
+
1769
+ CREATE INDEX IF NOT EXISTS idx_agent_file_reads_agent_read_at
1770
+ ON agent_file_reads(agent_id, read_at);
1771
+ `);
1758
1772
  try {
1759
1773
  const mapCount = await client.execute({ sql: `SELECT COUNT(*) as cnt FROM session_agent_map`, args: [] });
1760
1774
  if (Number(mapCount.rows[0]?.cnt ?? 0) === 0) {
@@ -1769,6 +1783,13 @@ async function ensureSchema() {
1769
1783
  }
1770
1784
  } catch {
1771
1785
  }
1786
+ try {
1787
+ await client.execute({
1788
+ sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
1789
+ args: []
1790
+ });
1791
+ } catch {
1792
+ }
1772
1793
  try {
1773
1794
  await client.execute({
1774
1795
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
@@ -1749,12 +1749,26 @@ async function ensureSchema() {
1749
1749
  session_name TEXT,
1750
1750
  task_id TEXT,
1751
1751
  project_name TEXT,
1752
- started_at TEXT NOT NULL
1752
+ started_at TEXT NOT NULL,
1753
+ cache_cold_count INTEGER NOT NULL DEFAULT 0
1753
1754
  );
1754
1755
 
1755
1756
  CREATE INDEX IF NOT EXISTS idx_session_agent_map_agent
1756
1757
  ON session_agent_map(agent_id);
1757
1758
  `);
1759
+ await client.executeMultiple(`
1760
+ CREATE TABLE IF NOT EXISTS agent_file_reads (
1761
+ session_uuid TEXT NOT NULL,
1762
+ agent_id TEXT NOT NULL,
1763
+ file_path TEXT NOT NULL,
1764
+ read_at TEXT NOT NULL,
1765
+ commit_hash TEXT,
1766
+ PRIMARY KEY (session_uuid, file_path)
1767
+ );
1768
+
1769
+ CREATE INDEX IF NOT EXISTS idx_agent_file_reads_agent_read_at
1770
+ ON agent_file_reads(agent_id, read_at);
1771
+ `);
1758
1772
  try {
1759
1773
  const mapCount = await client.execute({ sql: `SELECT COUNT(*) as cnt FROM session_agent_map`, args: [] });
1760
1774
  if (Number(mapCount.rows[0]?.cnt ?? 0) === 0) {
@@ -1769,6 +1783,13 @@ async function ensureSchema() {
1769
1783
  }
1770
1784
  } catch {
1771
1785
  }
1786
+ try {
1787
+ await client.execute({
1788
+ sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
1789
+ args: []
1790
+ });
1791
+ } catch {
1792
+ }
1772
1793
  try {
1773
1794
  await client.execute({
1774
1795
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
@@ -1751,12 +1751,26 @@ async function ensureSchema() {
1751
1751
  session_name TEXT,
1752
1752
  task_id TEXT,
1753
1753
  project_name TEXT,
1754
- started_at TEXT NOT NULL
1754
+ started_at TEXT NOT NULL,
1755
+ cache_cold_count INTEGER NOT NULL DEFAULT 0
1755
1756
  );
1756
1757
 
1757
1758
  CREATE INDEX IF NOT EXISTS idx_session_agent_map_agent
1758
1759
  ON session_agent_map(agent_id);
1759
1760
  `);
1761
+ await client.executeMultiple(`
1762
+ CREATE TABLE IF NOT EXISTS agent_file_reads (
1763
+ session_uuid TEXT NOT NULL,
1764
+ agent_id TEXT NOT NULL,
1765
+ file_path TEXT NOT NULL,
1766
+ read_at TEXT NOT NULL,
1767
+ commit_hash TEXT,
1768
+ PRIMARY KEY (session_uuid, file_path)
1769
+ );
1770
+
1771
+ CREATE INDEX IF NOT EXISTS idx_agent_file_reads_agent_read_at
1772
+ ON agent_file_reads(agent_id, read_at);
1773
+ `);
1760
1774
  try {
1761
1775
  const mapCount = await client.execute({ sql: `SELECT COUNT(*) as cnt FROM session_agent_map`, args: [] });
1762
1776
  if (Number(mapCount.rows[0]?.cnt ?? 0) === 0) {
@@ -1771,6 +1785,13 @@ async function ensureSchema() {
1771
1785
  }
1772
1786
  } catch {
1773
1787
  }
1788
+ try {
1789
+ await client.execute({
1790
+ sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
1791
+ args: []
1792
+ });
1793
+ } catch {
1794
+ }
1774
1795
  try {
1775
1796
  await client.execute({
1776
1797
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
@@ -1743,12 +1743,26 @@ async function ensureSchema() {
1743
1743
  session_name TEXT,
1744
1744
  task_id TEXT,
1745
1745
  project_name TEXT,
1746
- started_at TEXT NOT NULL
1746
+ started_at TEXT NOT NULL,
1747
+ cache_cold_count INTEGER NOT NULL DEFAULT 0
1747
1748
  );
1748
1749
 
1749
1750
  CREATE INDEX IF NOT EXISTS idx_session_agent_map_agent
1750
1751
  ON session_agent_map(agent_id);
1751
1752
  `);
1753
+ await client.executeMultiple(`
1754
+ CREATE TABLE IF NOT EXISTS agent_file_reads (
1755
+ session_uuid TEXT NOT NULL,
1756
+ agent_id TEXT NOT NULL,
1757
+ file_path TEXT NOT NULL,
1758
+ read_at TEXT NOT NULL,
1759
+ commit_hash TEXT,
1760
+ PRIMARY KEY (session_uuid, file_path)
1761
+ );
1762
+
1763
+ CREATE INDEX IF NOT EXISTS idx_agent_file_reads_agent_read_at
1764
+ ON agent_file_reads(agent_id, read_at);
1765
+ `);
1752
1766
  try {
1753
1767
  const mapCount = await client.execute({ sql: `SELECT COUNT(*) as cnt FROM session_agent_map`, args: [] });
1754
1768
  if (Number(mapCount.rows[0]?.cnt ?? 0) === 0) {
@@ -1763,6 +1777,13 @@ async function ensureSchema() {
1763
1777
  }
1764
1778
  } catch {
1765
1779
  }
1780
+ try {
1781
+ await client.execute({
1782
+ sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
1783
+ args: []
1784
+ });
1785
+ } catch {
1786
+ }
1766
1787
  try {
1767
1788
  await client.execute({
1768
1789
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
package/dist/bin/cli.js CHANGED
@@ -3917,12 +3917,26 @@ async function ensureSchema() {
3917
3917
  session_name TEXT,
3918
3918
  task_id TEXT,
3919
3919
  project_name TEXT,
3920
- started_at TEXT NOT NULL
3920
+ started_at TEXT NOT NULL,
3921
+ cache_cold_count INTEGER NOT NULL DEFAULT 0
3921
3922
  );
3922
3923
 
3923
3924
  CREATE INDEX IF NOT EXISTS idx_session_agent_map_agent
3924
3925
  ON session_agent_map(agent_id);
3925
3926
  `);
3927
+ await client.executeMultiple(`
3928
+ CREATE TABLE IF NOT EXISTS agent_file_reads (
3929
+ session_uuid TEXT NOT NULL,
3930
+ agent_id TEXT NOT NULL,
3931
+ file_path TEXT NOT NULL,
3932
+ read_at TEXT NOT NULL,
3933
+ commit_hash TEXT,
3934
+ PRIMARY KEY (session_uuid, file_path)
3935
+ );
3936
+
3937
+ CREATE INDEX IF NOT EXISTS idx_agent_file_reads_agent_read_at
3938
+ ON agent_file_reads(agent_id, read_at);
3939
+ `);
3926
3940
  try {
3927
3941
  const mapCount = await client.execute({ sql: `SELECT COUNT(*) as cnt FROM session_agent_map`, args: [] });
3928
3942
  if (Number(mapCount.rows[0]?.cnt ?? 0) === 0) {
@@ -3937,6 +3951,13 @@ async function ensureSchema() {
3937
3951
  }
3938
3952
  } catch {
3939
3953
  }
3954
+ try {
3955
+ await client.execute({
3956
+ sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
3957
+ args: []
3958
+ });
3959
+ } catch {
3960
+ }
3940
3961
  try {
3941
3962
  await client.execute({
3942
3963
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
@@ -2191,12 +2191,26 @@ async function ensureSchema() {
2191
2191
  session_name TEXT,
2192
2192
  task_id TEXT,
2193
2193
  project_name TEXT,
2194
- started_at TEXT NOT NULL
2194
+ started_at TEXT NOT NULL,
2195
+ cache_cold_count INTEGER NOT NULL DEFAULT 0
2195
2196
  );
2196
2197
 
2197
2198
  CREATE INDEX IF NOT EXISTS idx_session_agent_map_agent
2198
2199
  ON session_agent_map(agent_id);
2199
2200
  `);
2201
+ await client.executeMultiple(`
2202
+ CREATE TABLE IF NOT EXISTS agent_file_reads (
2203
+ session_uuid TEXT NOT NULL,
2204
+ agent_id TEXT NOT NULL,
2205
+ file_path TEXT NOT NULL,
2206
+ read_at TEXT NOT NULL,
2207
+ commit_hash TEXT,
2208
+ PRIMARY KEY (session_uuid, file_path)
2209
+ );
2210
+
2211
+ CREATE INDEX IF NOT EXISTS idx_agent_file_reads_agent_read_at
2212
+ ON agent_file_reads(agent_id, read_at);
2213
+ `);
2200
2214
  try {
2201
2215
  const mapCount = await client.execute({ sql: `SELECT COUNT(*) as cnt FROM session_agent_map`, args: [] });
2202
2216
  if (Number(mapCount.rows[0]?.cnt ?? 0) === 0) {
@@ -2211,6 +2225,13 @@ async function ensureSchema() {
2211
2225
  }
2212
2226
  } catch {
2213
2227
  }
2228
+ try {
2229
+ await client.execute({
2230
+ sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
2231
+ args: []
2232
+ });
2233
+ } catch {
2234
+ }
2214
2235
  try {
2215
2236
  await client.execute({
2216
2237
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
@@ -2421,12 +2421,26 @@ async function ensureSchema() {
2421
2421
  session_name TEXT,
2422
2422
  task_id TEXT,
2423
2423
  project_name TEXT,
2424
- started_at TEXT NOT NULL
2424
+ started_at TEXT NOT NULL,
2425
+ cache_cold_count INTEGER NOT NULL DEFAULT 0
2425
2426
  );
2426
2427
 
2427
2428
  CREATE INDEX IF NOT EXISTS idx_session_agent_map_agent
2428
2429
  ON session_agent_map(agent_id);
2429
2430
  `);
2431
+ await client.executeMultiple(`
2432
+ CREATE TABLE IF NOT EXISTS agent_file_reads (
2433
+ session_uuid TEXT NOT NULL,
2434
+ agent_id TEXT NOT NULL,
2435
+ file_path TEXT NOT NULL,
2436
+ read_at TEXT NOT NULL,
2437
+ commit_hash TEXT,
2438
+ PRIMARY KEY (session_uuid, file_path)
2439
+ );
2440
+
2441
+ CREATE INDEX IF NOT EXISTS idx_agent_file_reads_agent_read_at
2442
+ ON agent_file_reads(agent_id, read_at);
2443
+ `);
2430
2444
  try {
2431
2445
  const mapCount = await client.execute({ sql: `SELECT COUNT(*) as cnt FROM session_agent_map`, args: [] });
2432
2446
  if (Number(mapCount.rows[0]?.cnt ?? 0) === 0) {
@@ -2441,6 +2455,13 @@ async function ensureSchema() {
2441
2455
  }
2442
2456
  } catch {
2443
2457
  }
2458
+ try {
2459
+ await client.execute({
2460
+ sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
2461
+ args: []
2462
+ });
2463
+ } catch {
2464
+ }
2444
2465
  try {
2445
2466
  await client.execute({
2446
2467
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
@@ -2252,12 +2252,26 @@ async function ensureSchema() {
2252
2252
  session_name TEXT,
2253
2253
  task_id TEXT,
2254
2254
  project_name TEXT,
2255
- started_at TEXT NOT NULL
2255
+ started_at TEXT NOT NULL,
2256
+ cache_cold_count INTEGER NOT NULL DEFAULT 0
2256
2257
  );
2257
2258
 
2258
2259
  CREATE INDEX IF NOT EXISTS idx_session_agent_map_agent
2259
2260
  ON session_agent_map(agent_id);
2260
2261
  `);
2262
+ await client.executeMultiple(`
2263
+ CREATE TABLE IF NOT EXISTS agent_file_reads (
2264
+ session_uuid TEXT NOT NULL,
2265
+ agent_id TEXT NOT NULL,
2266
+ file_path TEXT NOT NULL,
2267
+ read_at TEXT NOT NULL,
2268
+ commit_hash TEXT,
2269
+ PRIMARY KEY (session_uuid, file_path)
2270
+ );
2271
+
2272
+ CREATE INDEX IF NOT EXISTS idx_agent_file_reads_agent_read_at
2273
+ ON agent_file_reads(agent_id, read_at);
2274
+ `);
2261
2275
  try {
2262
2276
  const mapCount = await client.execute({ sql: `SELECT COUNT(*) as cnt FROM session_agent_map`, args: [] });
2263
2277
  if (Number(mapCount.rows[0]?.cnt ?? 0) === 0) {
@@ -2272,6 +2286,13 @@ async function ensureSchema() {
2272
2286
  }
2273
2287
  } catch {
2274
2288
  }
2289
+ try {
2290
+ await client.execute({
2291
+ sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
2292
+ args: []
2293
+ });
2294
+ } catch {
2295
+ }
2275
2296
  try {
2276
2297
  await client.execute({
2277
2298
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
@@ -1738,12 +1738,26 @@ async function ensureSchema() {
1738
1738
  session_name TEXT,
1739
1739
  task_id TEXT,
1740
1740
  project_name TEXT,
1741
- started_at TEXT NOT NULL
1741
+ started_at TEXT NOT NULL,
1742
+ cache_cold_count INTEGER NOT NULL DEFAULT 0
1742
1743
  );
1743
1744
 
1744
1745
  CREATE INDEX IF NOT EXISTS idx_session_agent_map_agent
1745
1746
  ON session_agent_map(agent_id);
1746
1747
  `);
1748
+ await client.executeMultiple(`
1749
+ CREATE TABLE IF NOT EXISTS agent_file_reads (
1750
+ session_uuid TEXT NOT NULL,
1751
+ agent_id TEXT NOT NULL,
1752
+ file_path TEXT NOT NULL,
1753
+ read_at TEXT NOT NULL,
1754
+ commit_hash TEXT,
1755
+ PRIMARY KEY (session_uuid, file_path)
1756
+ );
1757
+
1758
+ CREATE INDEX IF NOT EXISTS idx_agent_file_reads_agent_read_at
1759
+ ON agent_file_reads(agent_id, read_at);
1760
+ `);
1747
1761
  try {
1748
1762
  const mapCount = await client.execute({ sql: `SELECT COUNT(*) as cnt FROM session_agent_map`, args: [] });
1749
1763
  if (Number(mapCount.rows[0]?.cnt ?? 0) === 0) {
@@ -1758,6 +1772,13 @@ async function ensureSchema() {
1758
1772
  }
1759
1773
  } catch {
1760
1774
  }
1775
+ try {
1776
+ await client.execute({
1777
+ sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
1778
+ args: []
1779
+ });
1780
+ } catch {
1781
+ }
1761
1782
  try {
1762
1783
  await client.execute({
1763
1784
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
@@ -1732,12 +1732,26 @@ async function ensureSchema() {
1732
1732
  session_name TEXT,
1733
1733
  task_id TEXT,
1734
1734
  project_name TEXT,
1735
- started_at TEXT NOT NULL
1735
+ started_at TEXT NOT NULL,
1736
+ cache_cold_count INTEGER NOT NULL DEFAULT 0
1736
1737
  );
1737
1738
 
1738
1739
  CREATE INDEX IF NOT EXISTS idx_session_agent_map_agent
1739
1740
  ON session_agent_map(agent_id);
1740
1741
  `);
1742
+ await client.executeMultiple(`
1743
+ CREATE TABLE IF NOT EXISTS agent_file_reads (
1744
+ session_uuid TEXT NOT NULL,
1745
+ agent_id TEXT NOT NULL,
1746
+ file_path TEXT NOT NULL,
1747
+ read_at TEXT NOT NULL,
1748
+ commit_hash TEXT,
1749
+ PRIMARY KEY (session_uuid, file_path)
1750
+ );
1751
+
1752
+ CREATE INDEX IF NOT EXISTS idx_agent_file_reads_agent_read_at
1753
+ ON agent_file_reads(agent_id, read_at);
1754
+ `);
1741
1755
  try {
1742
1756
  const mapCount = await client.execute({ sql: `SELECT COUNT(*) as cnt FROM session_agent_map`, args: [] });
1743
1757
  if (Number(mapCount.rows[0]?.cnt ?? 0) === 0) {
@@ -1752,6 +1766,13 @@ async function ensureSchema() {
1752
1766
  }
1753
1767
  } catch {
1754
1768
  }
1769
+ try {
1770
+ await client.execute({
1771
+ sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
1772
+ args: []
1773
+ });
1774
+ } catch {
1775
+ }
1755
1776
  try {
1756
1777
  await client.execute({
1757
1778
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
@@ -1739,12 +1739,26 @@ async function ensureSchema() {
1739
1739
  session_name TEXT,
1740
1740
  task_id TEXT,
1741
1741
  project_name TEXT,
1742
- started_at TEXT NOT NULL
1742
+ started_at TEXT NOT NULL,
1743
+ cache_cold_count INTEGER NOT NULL DEFAULT 0
1743
1744
  );
1744
1745
 
1745
1746
  CREATE INDEX IF NOT EXISTS idx_session_agent_map_agent
1746
1747
  ON session_agent_map(agent_id);
1747
1748
  `);
1749
+ await client.executeMultiple(`
1750
+ CREATE TABLE IF NOT EXISTS agent_file_reads (
1751
+ session_uuid TEXT NOT NULL,
1752
+ agent_id TEXT NOT NULL,
1753
+ file_path TEXT NOT NULL,
1754
+ read_at TEXT NOT NULL,
1755
+ commit_hash TEXT,
1756
+ PRIMARY KEY (session_uuid, file_path)
1757
+ );
1758
+
1759
+ CREATE INDEX IF NOT EXISTS idx_agent_file_reads_agent_read_at
1760
+ ON agent_file_reads(agent_id, read_at);
1761
+ `);
1748
1762
  try {
1749
1763
  const mapCount = await client.execute({ sql: `SELECT COUNT(*) as cnt FROM session_agent_map`, args: [] });
1750
1764
  if (Number(mapCount.rows[0]?.cnt ?? 0) === 0) {
@@ -1759,6 +1773,13 @@ async function ensureSchema() {
1759
1773
  }
1760
1774
  } catch {
1761
1775
  }
1776
+ try {
1777
+ await client.execute({
1778
+ sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
1779
+ args: []
1780
+ });
1781
+ } catch {
1782
+ }
1762
1783
  try {
1763
1784
  await client.execute({
1764
1785
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
@@ -2460,12 +2460,26 @@ async function ensureSchema() {
2460
2460
  session_name TEXT,
2461
2461
  task_id TEXT,
2462
2462
  project_name TEXT,
2463
- started_at TEXT NOT NULL
2463
+ started_at TEXT NOT NULL,
2464
+ cache_cold_count INTEGER NOT NULL DEFAULT 0
2464
2465
  );
2465
2466
 
2466
2467
  CREATE INDEX IF NOT EXISTS idx_session_agent_map_agent
2467
2468
  ON session_agent_map(agent_id);
2468
2469
  `);
2470
+ await client.executeMultiple(`
2471
+ CREATE TABLE IF NOT EXISTS agent_file_reads (
2472
+ session_uuid TEXT NOT NULL,
2473
+ agent_id TEXT NOT NULL,
2474
+ file_path TEXT NOT NULL,
2475
+ read_at TEXT NOT NULL,
2476
+ commit_hash TEXT,
2477
+ PRIMARY KEY (session_uuid, file_path)
2478
+ );
2479
+
2480
+ CREATE INDEX IF NOT EXISTS idx_agent_file_reads_agent_read_at
2481
+ ON agent_file_reads(agent_id, read_at);
2482
+ `);
2469
2483
  try {
2470
2484
  const mapCount = await client.execute({ sql: `SELECT COUNT(*) as cnt FROM session_agent_map`, args: [] });
2471
2485
  if (Number(mapCount.rows[0]?.cnt ?? 0) === 0) {
@@ -2480,6 +2494,13 @@ async function ensureSchema() {
2480
2494
  }
2481
2495
  } catch {
2482
2496
  }
2497
+ try {
2498
+ await client.execute({
2499
+ sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
2500
+ args: []
2501
+ });
2502
+ } catch {
2503
+ }
2483
2504
  try {
2484
2505
  await client.execute({
2485
2506
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
@@ -1762,12 +1762,26 @@ async function ensureSchema() {
1762
1762
  session_name TEXT,
1763
1763
  task_id TEXT,
1764
1764
  project_name TEXT,
1765
- started_at TEXT NOT NULL
1765
+ started_at TEXT NOT NULL,
1766
+ cache_cold_count INTEGER NOT NULL DEFAULT 0
1766
1767
  );
1767
1768
 
1768
1769
  CREATE INDEX IF NOT EXISTS idx_session_agent_map_agent
1769
1770
  ON session_agent_map(agent_id);
1770
1771
  `);
1772
+ await client.executeMultiple(`
1773
+ CREATE TABLE IF NOT EXISTS agent_file_reads (
1774
+ session_uuid TEXT NOT NULL,
1775
+ agent_id TEXT NOT NULL,
1776
+ file_path TEXT NOT NULL,
1777
+ read_at TEXT NOT NULL,
1778
+ commit_hash TEXT,
1779
+ PRIMARY KEY (session_uuid, file_path)
1780
+ );
1781
+
1782
+ CREATE INDEX IF NOT EXISTS idx_agent_file_reads_agent_read_at
1783
+ ON agent_file_reads(agent_id, read_at);
1784
+ `);
1771
1785
  try {
1772
1786
  const mapCount = await client.execute({ sql: `SELECT COUNT(*) as cnt FROM session_agent_map`, args: [] });
1773
1787
  if (Number(mapCount.rows[0]?.cnt ?? 0) === 0) {
@@ -1782,6 +1796,13 @@ async function ensureSchema() {
1782
1796
  }
1783
1797
  } catch {
1784
1798
  }
1799
+ try {
1800
+ await client.execute({
1801
+ sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
1802
+ args: []
1803
+ });
1804
+ } catch {
1805
+ }
1785
1806
  try {
1786
1807
  await client.execute({
1787
1808
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
@@ -1732,12 +1732,26 @@ async function ensureSchema() {
1732
1732
  session_name TEXT,
1733
1733
  task_id TEXT,
1734
1734
  project_name TEXT,
1735
- started_at TEXT NOT NULL
1735
+ started_at TEXT NOT NULL,
1736
+ cache_cold_count INTEGER NOT NULL DEFAULT 0
1736
1737
  );
1737
1738
 
1738
1739
  CREATE INDEX IF NOT EXISTS idx_session_agent_map_agent
1739
1740
  ON session_agent_map(agent_id);
1740
1741
  `);
1742
+ await client.executeMultiple(`
1743
+ CREATE TABLE IF NOT EXISTS agent_file_reads (
1744
+ session_uuid TEXT NOT NULL,
1745
+ agent_id TEXT NOT NULL,
1746
+ file_path TEXT NOT NULL,
1747
+ read_at TEXT NOT NULL,
1748
+ commit_hash TEXT,
1749
+ PRIMARY KEY (session_uuid, file_path)
1750
+ );
1751
+
1752
+ CREATE INDEX IF NOT EXISTS idx_agent_file_reads_agent_read_at
1753
+ ON agent_file_reads(agent_id, read_at);
1754
+ `);
1741
1755
  try {
1742
1756
  const mapCount = await client.execute({ sql: `SELECT COUNT(*) as cnt FROM session_agent_map`, args: [] });
1743
1757
  if (Number(mapCount.rows[0]?.cnt ?? 0) === 0) {
@@ -1752,6 +1766,13 @@ async function ensureSchema() {
1752
1766
  }
1753
1767
  } catch {
1754
1768
  }
1769
+ try {
1770
+ await client.execute({
1771
+ sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
1772
+ args: []
1773
+ });
1774
+ } catch {
1775
+ }
1755
1776
  try {
1756
1777
  await client.execute({
1757
1778
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
@@ -2083,12 +2083,26 @@ async function ensureSchema() {
2083
2083
  session_name TEXT,
2084
2084
  task_id TEXT,
2085
2085
  project_name TEXT,
2086
- started_at TEXT NOT NULL
2086
+ started_at TEXT NOT NULL,
2087
+ cache_cold_count INTEGER NOT NULL DEFAULT 0
2087
2088
  );
2088
2089
 
2089
2090
  CREATE INDEX IF NOT EXISTS idx_session_agent_map_agent
2090
2091
  ON session_agent_map(agent_id);
2091
2092
  `);
2093
+ await client.executeMultiple(`
2094
+ CREATE TABLE IF NOT EXISTS agent_file_reads (
2095
+ session_uuid TEXT NOT NULL,
2096
+ agent_id TEXT NOT NULL,
2097
+ file_path TEXT NOT NULL,
2098
+ read_at TEXT NOT NULL,
2099
+ commit_hash TEXT,
2100
+ PRIMARY KEY (session_uuid, file_path)
2101
+ );
2102
+
2103
+ CREATE INDEX IF NOT EXISTS idx_agent_file_reads_agent_read_at
2104
+ ON agent_file_reads(agent_id, read_at);
2105
+ `);
2092
2106
  try {
2093
2107
  const mapCount = await client.execute({ sql: `SELECT COUNT(*) as cnt FROM session_agent_map`, args: [] });
2094
2108
  if (Number(mapCount.rows[0]?.cnt ?? 0) === 0) {
@@ -2103,6 +2117,13 @@ async function ensureSchema() {
2103
2117
  }
2104
2118
  } catch {
2105
2119
  }
2120
+ try {
2121
+ await client.execute({
2122
+ sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
2123
+ args: []
2124
+ });
2125
+ } catch {
2126
+ }
2106
2127
  try {
2107
2128
  await client.execute({
2108
2129
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
@@ -2564,12 +2564,26 @@ async function ensureSchema() {
2564
2564
  session_name TEXT,
2565
2565
  task_id TEXT,
2566
2566
  project_name TEXT,
2567
- started_at TEXT NOT NULL
2567
+ started_at TEXT NOT NULL,
2568
+ cache_cold_count INTEGER NOT NULL DEFAULT 0
2568
2569
  );
2569
2570
 
2570
2571
  CREATE INDEX IF NOT EXISTS idx_session_agent_map_agent
2571
2572
  ON session_agent_map(agent_id);
2572
2573
  `);
2574
+ await client.executeMultiple(`
2575
+ CREATE TABLE IF NOT EXISTS agent_file_reads (
2576
+ session_uuid TEXT NOT NULL,
2577
+ agent_id TEXT NOT NULL,
2578
+ file_path TEXT NOT NULL,
2579
+ read_at TEXT NOT NULL,
2580
+ commit_hash TEXT,
2581
+ PRIMARY KEY (session_uuid, file_path)
2582
+ );
2583
+
2584
+ CREATE INDEX IF NOT EXISTS idx_agent_file_reads_agent_read_at
2585
+ ON agent_file_reads(agent_id, read_at);
2586
+ `);
2573
2587
  try {
2574
2588
  const mapCount = await client.execute({ sql: `SELECT COUNT(*) as cnt FROM session_agent_map`, args: [] });
2575
2589
  if (Number(mapCount.rows[0]?.cnt ?? 0) === 0) {
@@ -2584,6 +2598,13 @@ async function ensureSchema() {
2584
2598
  }
2585
2599
  } catch {
2586
2600
  }
2601
+ try {
2602
+ await client.execute({
2603
+ sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
2604
+ args: []
2605
+ });
2606
+ } catch {
2607
+ }
2587
2608
  try {
2588
2609
  await client.execute({
2589
2610
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,