@pcircle/memesh 4.7.3 → 4.8.1

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 (140) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/AGENTS.md +3 -1
  4. package/README.de.md +42 -16
  5. package/README.md +46 -19
  6. package/README.zh-TW.md +42 -17
  7. package/dashboard/dist/index.html +1 -1
  8. package/dist/core/agent-message-storage.d.ts +76 -0
  9. package/dist/core/agent-message-storage.d.ts.map +1 -0
  10. package/dist/core/agent-message-storage.js +359 -0
  11. package/dist/core/agent-message-storage.js.map +1 -0
  12. package/dist/core/agent-messaging.d.ts +224 -0
  13. package/dist/core/agent-messaging.d.ts.map +1 -0
  14. package/dist/core/agent-messaging.js +881 -0
  15. package/dist/core/agent-messaging.js.map +1 -0
  16. package/dist/core/agent-router.d.ts +194 -0
  17. package/dist/core/agent-router.d.ts.map +1 -0
  18. package/dist/core/agent-router.js +1138 -0
  19. package/dist/core/agent-router.js.map +1 -0
  20. package/dist/core/briefing.d.ts.map +1 -1
  21. package/dist/core/briefing.js +8 -1
  22. package/dist/core/briefing.js.map +1 -1
  23. package/dist/core/config.d.ts.map +1 -1
  24. package/dist/core/config.js.map +1 -1
  25. package/dist/core/doctor.d.ts +19 -0
  26. package/dist/core/doctor.d.ts.map +1 -1
  27. package/dist/core/doctor.js +176 -2
  28. package/dist/core/doctor.js.map +1 -1
  29. package/dist/core/dreamer.d.ts +8 -5
  30. package/dist/core/dreamer.d.ts.map +1 -1
  31. package/dist/core/dreamer.js +88 -3
  32. package/dist/core/dreamer.js.map +1 -1
  33. package/dist/core/product-improvements.d.ts +61 -0
  34. package/dist/core/product-improvements.d.ts.map +1 -0
  35. package/dist/core/product-improvements.js +216 -0
  36. package/dist/core/product-improvements.js.map +1 -0
  37. package/dist/core/repo-state.d.ts +11 -0
  38. package/dist/core/repo-state.d.ts.map +1 -0
  39. package/dist/core/repo-state.js +70 -0
  40. package/dist/core/repo-state.js.map +1 -0
  41. package/dist/core/schema-export.d.ts.map +1 -1
  42. package/dist/core/schema-export.js +70 -0
  43. package/dist/core/schema-export.js.map +1 -1
  44. package/dist/core/task-state.d.ts.map +1 -1
  45. package/dist/core/task-state.js +3 -3
  46. package/dist/core/task-state.js.map +1 -1
  47. package/dist/core/updater.d.ts +2 -0
  48. package/dist/core/updater.d.ts.map +1 -1
  49. package/dist/core/updater.js +11 -5
  50. package/dist/core/updater.js.map +1 -1
  51. package/dist/core/work-topology.d.ts.map +1 -1
  52. package/dist/core/work-topology.js +1 -0
  53. package/dist/core/work-topology.js.map +1 -1
  54. package/dist/host-adapters/acp-client.d.ts +147 -0
  55. package/dist/host-adapters/acp-client.d.ts.map +1 -0
  56. package/dist/host-adapters/acp-client.js +793 -0
  57. package/dist/host-adapters/acp-client.js.map +1 -0
  58. package/dist/host-adapters/claude-channel.d.ts +75 -0
  59. package/dist/host-adapters/claude-channel.d.ts.map +1 -0
  60. package/dist/host-adapters/claude-channel.js +255 -0
  61. package/dist/host-adapters/claude-channel.js.map +1 -0
  62. package/dist/host-adapters/codex-app-server.d.ts +83 -0
  63. package/dist/host-adapters/codex-app-server.d.ts.map +1 -0
  64. package/dist/host-adapters/codex-app-server.js +360 -0
  65. package/dist/host-adapters/codex-app-server.js.map +1 -0
  66. package/dist/host-adapters/codex-cli-queue.d.ts +17 -0
  67. package/dist/host-adapters/codex-cli-queue.d.ts.map +1 -0
  68. package/dist/host-adapters/codex-cli-queue.js +85 -0
  69. package/dist/host-adapters/codex-cli-queue.js.map +1 -0
  70. package/dist/host-runtime/acp.d.ts +57 -0
  71. package/dist/host-runtime/acp.d.ts.map +1 -0
  72. package/dist/host-runtime/acp.js +338 -0
  73. package/dist/host-runtime/acp.js.map +1 -0
  74. package/dist/host-runtime/claude.d.ts +41 -0
  75. package/dist/host-runtime/claude.d.ts.map +1 -0
  76. package/dist/host-runtime/claude.js +213 -0
  77. package/dist/host-runtime/claude.js.map +1 -0
  78. package/dist/host-runtime/codex-session.d.ts +24 -0
  79. package/dist/host-runtime/codex-session.d.ts.map +1 -0
  80. package/dist/host-runtime/codex-session.js +98 -0
  81. package/dist/host-runtime/codex-session.js.map +1 -0
  82. package/dist/host-runtime/codex.d.ts +33 -0
  83. package/dist/host-runtime/codex.d.ts.map +1 -0
  84. package/dist/host-runtime/codex.js +215 -0
  85. package/dist/host-runtime/codex.js.map +1 -0
  86. package/dist/host-runtime/config.d.ts +9 -0
  87. package/dist/host-runtime/config.d.ts.map +1 -0
  88. package/dist/host-runtime/config.js +91 -0
  89. package/dist/host-runtime/config.js.map +1 -0
  90. package/dist/host-runtime/router-client.d.ts +38 -0
  91. package/dist/host-runtime/router-client.d.ts.map +1 -0
  92. package/dist/host-runtime/router-client.js +463 -0
  93. package/dist/host-runtime/router-client.js.map +1 -0
  94. package/dist/host-runtime/router.d.ts +3 -0
  95. package/dist/host-runtime/router.d.ts.map +1 -0
  96. package/dist/host-runtime/router.js +43 -0
  97. package/dist/host-runtime/router.js.map +1 -0
  98. package/dist/mcp/server.js +2 -2
  99. package/dist/mcp/server.js.map +1 -1
  100. package/dist/skills-manifest.json +22 -17
  101. package/dist/storage/conflicts.d.ts.map +1 -1
  102. package/dist/storage/conflicts.js +8 -1
  103. package/dist/storage/conflicts.js.map +1 -1
  104. package/dist/storage/schema.d.ts +1 -1
  105. package/dist/storage/schema.d.ts.map +1 -1
  106. package/dist/storage/schema.js +255 -0
  107. package/dist/storage/schema.js.map +1 -1
  108. package/dist/transports/agent-messaging.d.ts +11 -0
  109. package/dist/transports/agent-messaging.d.ts.map +1 -0
  110. package/dist/transports/agent-messaging.js +273 -0
  111. package/dist/transports/agent-messaging.js.map +1 -0
  112. package/dist/transports/cli/cli.d.ts +6 -1
  113. package/dist/transports/cli/cli.d.ts.map +1 -1
  114. package/dist/transports/cli/cli.js +392 -17
  115. package/dist/transports/cli/cli.js.map +1 -1
  116. package/dist/transports/http/server.d.ts.map +1 -1
  117. package/dist/transports/http/server.js +31 -2
  118. package/dist/transports/http/server.js.map +1 -1
  119. package/dist/transports/mcp/handlers.d.ts +152 -1
  120. package/dist/transports/mcp/handlers.d.ts.map +1 -1
  121. package/dist/transports/mcp/handlers.js +108 -3
  122. package/dist/transports/mcp/handlers.js.map +1 -1
  123. package/dist/transports/schemas.d.ts +106 -1
  124. package/dist/transports/schemas.d.ts.map +1 -1
  125. package/dist/transports/schemas.js +86 -0
  126. package/dist/transports/schemas.js.map +1 -1
  127. package/docs/platforms/README.md +167 -0
  128. package/docs/platforms/agent-messaging.md +290 -0
  129. package/hooks/hooks.json +11 -0
  130. package/llms-install.md +101 -25
  131. package/package.json +14 -5
  132. package/scripts/hooks/_generated/repo-state.js +77 -0
  133. package/scripts/hooks/_generated/schema.js +255 -0
  134. package/scripts/hooks/_generated/task-state.js +3 -3
  135. package/scripts/hooks/_generated/work-topology.js +1 -0
  136. package/scripts/hooks/_shared.js +77 -97
  137. package/scripts/hooks/auto-update-runner.mjs +243 -0
  138. package/scripts/hooks/session-start.js +12 -2
  139. package/scripts/hooks/session-summary.js +7 -6
  140. package/skills/memesh/SKILL.md +40 -1
@@ -3,7 +3,7 @@
3
3
  "entries": [
4
4
  {
5
5
  "path": ".claude-plugin/plugin.json",
6
- "sha256": "773e152af2cbcfe41135dfb8e4535682257f3575ab30139bd09e2e2017c455bd",
6
+ "sha256": "1b9d1a3e0dd305a7914b5ddc16809713fbdc0760bf8bdcb16de18a534e92472b",
7
7
  "bytes": 527
8
8
  },
9
9
  {
@@ -13,8 +13,8 @@
13
13
  },
14
14
  {
15
15
  "path": "hooks/hooks.json",
16
- "sha256": "6dab1d96f600b6b0f85c3ca276f660127582ba0b6f7f8a460a4ed6bf1611ca95",
17
- "bytes": 1803
16
+ "sha256": "f39efb39a90594141cf7b5e79062b42f7376f7e0007307040b4fed77022fd024",
17
+ "bytes": 2083
18
18
  },
19
19
  {
20
20
  "path": "scripts/hooks/_generated/capture-flag.js",
@@ -41,10 +41,15 @@
41
41
  "sha256": "a05325ec1a5e93c924219485bbe62bba7e7478a276fb31af4b4e5ffab83e675f",
42
42
  "bytes": 3987
43
43
  },
44
+ {
45
+ "path": "scripts/hooks/_generated/repo-state.js",
46
+ "sha256": "04c8df4a8565d114421fc40873d0105c0faa640a56ec0948222ad9291c73eead",
47
+ "bytes": 3367
48
+ },
44
49
  {
45
50
  "path": "scripts/hooks/_generated/schema.js",
46
- "sha256": "898b6121fd36e8fb423cfd32e1df40324c4d593def7df658c7aca80340866c64",
47
- "bytes": 12673
51
+ "sha256": "ad77ca38267c0192640b2b48627f56ccc16bdd9759506eddae8c99d386257786",
52
+ "bytes": 24956
48
53
  },
49
54
  {
50
55
  "path": "scripts/hooks/_generated/sqlite.js",
@@ -53,8 +58,8 @@
53
58
  },
54
59
  {
55
60
  "path": "scripts/hooks/_generated/task-state.js",
56
- "sha256": "937bb65e07ef82333857a8bc88e37013286644ec490ec788aa250db0b59a80d4",
57
- "bytes": 3532
61
+ "sha256": "68e5cdfa1a8c0f76a5a65d0353e942f69aab7247e73b54e5cf7e79c39188b4f5",
62
+ "bytes": 3560
58
63
  },
59
64
  {
60
65
  "path": "scripts/hooks/_generated/time-utils.js",
@@ -68,13 +73,13 @@
68
73
  },
69
74
  {
70
75
  "path": "scripts/hooks/_generated/work-topology.js",
71
- "sha256": "e821f38b547a4f7b2c2023d5cc23c3e46ae670268ee72547709b8004f729dd76",
72
- "bytes": 7075
76
+ "sha256": "166f6cf01468327184401bb3e75ecd26c4ca80b603f34c22c466cc651a4f63ed",
77
+ "bytes": 7102
73
78
  },
74
79
  {
75
80
  "path": "scripts/hooks/_shared.js",
76
- "sha256": "55c7a597f19a2270cbf06d052d7889a1a1ce7fbdc9ba96dd9cc08d206ef887c1",
77
- "bytes": 42209
81
+ "sha256": "d49e993b35aa449744b8e52bd3e47788f9418ef47204b01f3ce99582b883b5df",
82
+ "bytes": 40871
78
83
  },
79
84
  {
80
85
  "path": "scripts/hooks/guard-check.js",
@@ -98,13 +103,13 @@
98
103
  },
99
104
  {
100
105
  "path": "scripts/hooks/session-start.js",
101
- "sha256": "99acf85c9461ab3b125308af3d807d1f1a2261db208d32e241d96133e9e5251c",
102
- "bytes": 57738
106
+ "sha256": "3f0dd2bad818c621ad8f9ef6992146e0dbcb8afa89289c038699273a83a3dcff",
107
+ "bytes": 58386
103
108
  },
104
109
  {
105
110
  "path": "scripts/hooks/session-summary.js",
106
- "sha256": "2c13205539a0424ceeb11a7aed79dc8c0504e56e7a9e21661b007f2a504f5554",
107
- "bytes": 47387
111
+ "sha256": "50d2d9ee1a65e19f43d296891ffcb8222eb7b02d162c0f99f4d883d7cb9872d1",
112
+ "bytes": 47381
108
113
  },
109
114
  {
110
115
  "path": "scripts/hooks/user-prompt-intent.js",
@@ -118,8 +123,8 @@
118
123
  },
119
124
  {
120
125
  "path": "skills/memesh/SKILL.md",
121
- "sha256": "b5705f2bbaec9838716dcfe55d35399f2ede36027aa1e3a30c9deeb617660d65",
122
- "bytes": 9741
126
+ "sha256": "e669c0cbaa80d6f53b2a0ccf48c459c64bfafc5f9775acd3bf22db6be4d462b1",
127
+ "bytes": 13982
123
128
  }
124
129
  ]
125
130
  }
@@ -1 +1 @@
1
- {"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../../src/storage/conflicts.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAYlD,wBAAgB,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAqBjF;AA2BD,wBAAgB,WAAW,CACzB,EAAE,EAAE,cAAc,EAClB,SAAS,EAAE,MAAM,EAAE,GAClB,IAAI,CAWN"}
1
+ {"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../../src/storage/conflicts.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAYlD,wBAAgB,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAqBjF;AA2BD,wBAAgB,WAAW,CACzB,EAAE,EAAE,cAAc,EAClB,SAAS,EAAE,MAAM,EAAE,GAClB,IAAI,CAoBN"}
@@ -22,6 +22,13 @@ export function trackAccess(db, entityIds) {
22
22
  return;
23
23
  const now = new Date().toISOString();
24
24
  const placeholders = entityIds.map(() => '?').join(',');
25
- db.prepare(`UPDATE entities SET access_count = access_count + 1, last_accessed_at = ? WHERE id IN (${placeholders})`).run(now, ...entityIds);
25
+ try {
26
+ db.prepare(`UPDATE entities SET access_count = access_count + 1, last_accessed_at = ? WHERE id IN (${placeholders})`).run(now, ...entityIds);
27
+ }
28
+ catch (error) {
29
+ const message = error instanceof Error ? error.message : String(error);
30
+ if (!/readonly database|SQLITE_READONLY/i.test(message))
31
+ throw error;
32
+ }
26
33
  }
27
34
  //# sourceMappingURL=conflicts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../src/storage/conflicts.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,aAAa,CAAC,EAAkB,EAAE,WAAqB;IACrE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE1D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;4BAME,YAAY;0BACd,YAAY;GACnC,CAAC,CAAC,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,WAAW,CAAkD,CAAC;IAExF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,SAAS,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,kBAAkB,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AA2BD,MAAM,UAAU,WAAW,CACzB,EAAkB,EAClB,SAAmB;IAEnB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACnC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAKrC,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxD,EAAE,CAAC,OAAO,CACR,0FAA0F,YAAY,GAAG,CAC1G,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../src/storage/conflicts.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,aAAa,CAAC,EAAkB,EAAE,WAAqB;IACrE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE1D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;4BAME,YAAY;0BACd,YAAY;GACnC,CAAC,CAAC,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,WAAW,CAAkD,CAAC;IAExF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,SAAS,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,kBAAkB,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AA2BD,MAAM,UAAU,WAAW,CACzB,EAAkB,EAClB,SAAmB;IAEnB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACnC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAKrC,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CACR,0FAA0F,YAAY,GAAG,CAC1G,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAKf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,IAAI,CAAC,oCAAoC,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,MAAM,KAAK,CAAC;IACvE,CAAC;AACH,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { MemeshDatabase } from './sqlite.js';
2
- export declare const SCHEMA_SQL = "\nCREATE TABLE IF NOT EXISTS entities (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n type TEXT NOT NULL,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n metadata JSON\n);\n\nCREATE TABLE IF NOT EXISTS observations (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n entity_id INTEGER NOT NULL,\n content TEXT NOT NULL,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE\n);\n\nCREATE TABLE IF NOT EXISTS relations (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n from_entity_id INTEGER NOT NULL,\n to_entity_id INTEGER NOT NULL,\n relation_type TEXT NOT NULL,\n metadata JSON,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (from_entity_id) REFERENCES entities(id) ON DELETE CASCADE,\n FOREIGN KEY (to_entity_id) REFERENCES entities(id) ON DELETE CASCADE,\n UNIQUE(from_entity_id, to_entity_id, relation_type)\n);\n\nCREATE TABLE IF NOT EXISTS tags (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n entity_id INTEGER NOT NULL,\n tag TEXT NOT NULL,\n FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_tags_entity ON tags(entity_id);\nCREATE INDEX IF NOT EXISTS idx_tags_tag ON tags(tag);\n-- The tags dedup DELETE + idx_tags_entity_tag_unique creation live in\n-- ensureTagsUniqueIndex(), AFTER this exec \u2014 the DELETE is a one-time\n-- migration, and a DML statement in this string made every open start a\n-- write transaction even when it deleted nothing (same reader-breaking\n-- pattern as the hook_runs_since note below).\nCREATE INDEX IF NOT EXISTS idx_observations_entity ON observations(entity_id);\nCREATE INDEX IF NOT EXISTS idx_relations_from ON relations(from_entity_id);\nCREATE INDEX IF NOT EXISTS idx_relations_to ON relations(to_entity_id);\nCREATE INDEX IF NOT EXISTS idx_entities_type_created ON entities(type, created_at);\n\n-- Migration markers and small bits of persistent state (index segmentation\n-- version, embedding dimension, pending-reindex flags, backfill markers).\n--\n-- This used to be created ad hoc by each helper that needed it \u2014 four inline\n-- CREATE TABLE IF NOT EXISTS copies in src/db.ts, none of them visible to\n-- schema checks. A column added to one copy would not have been caught. It\n-- also meant the hook-side schema had no metadata table at all, so hooks\n-- could not participate in migrations even in principle.\nCREATE TABLE IF NOT EXISTS memesh_metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\n-- Proof that a capture hook actually RAN. Nothing else in this schema can\n-- give it: every other signal is \"a row was written\", and \"the hook ran and\n-- found nothing worth saving\" is the healthy case that produces no row at\n-- all. So a quiet day and a dead capture loop were byte-identical in the\n-- database, and the one doctor message that had to cover both cried wolf on\n-- the first and stayed silent on the second.\n--\n-- Written by the three hooks that hold a read-write handle (Stop, PreCompact,\n-- PostToolUse), each calling recordHookRun() at its own SUCCESSFUL exit \u2014\n-- after capture, not at open. Stamping at open certified the wrong thing: a\n-- hook that opened the database and then died mid-capture looked alive for a\n-- day. \"Successful\" is precise: a completed capture, or a well-formed\n-- payload the hook correctly decided not to capture (dedup, low-signal\n-- session). A malformed payload (schema-flip shapes) and a write that did\n-- not land both leave no stamp \u2014 either would make the heartbeat mask the\n-- exact dropout it exists to expose. The recall-side hooks open read-only\n-- and deliberately do not appear here: their liveness answers a different\n-- question, and giving them a write handle would put a lock acquisition on\n-- the SessionStart hot path.\n--\n-- One row per hook, upserted. It does not grow.\nCREATE TABLE IF NOT EXISTS hook_runs (\n hook TEXT PRIMARY KEY,\n last_run_at TIMESTAMP NOT NULL,\n run_count INTEGER NOT NULL DEFAULT 0\n);\n\n-- The 'hook_runs_since' metadata key (when this database first became able\n-- to record hook runs) is stamped by ensureHookRunsSince() AFTER this exec,\n-- NOT here. It used to be an INSERT OR IGNORE in this string, and that made\n-- every open \u2014 including opens that only ever read \u2014 start a write\n-- transaction: an INSERT statement takes the WAL writer lock even when\n-- OR IGNORE ends up changing nothing. Two states regressed from \"reads work\"\n-- to \"open throws\": a peer holding the writer lock past busy_timeout, and a\n-- read-only database FILE (measured: \"attempt to write a readonly database\"\n-- killed recall along with capture). The helper SELECTs first and writes\n-- only when the key is genuinely absent \u2014 once per database lifetime.\n";
2
+ export declare const SCHEMA_SQL = "\nCREATE TABLE IF NOT EXISTS entities (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n type TEXT NOT NULL,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n metadata JSON\n);\n\nCREATE TABLE IF NOT EXISTS observations (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n entity_id INTEGER NOT NULL,\n content TEXT NOT NULL,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE\n);\n\nCREATE TABLE IF NOT EXISTS relations (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n from_entity_id INTEGER NOT NULL,\n to_entity_id INTEGER NOT NULL,\n relation_type TEXT NOT NULL,\n metadata JSON,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (from_entity_id) REFERENCES entities(id) ON DELETE CASCADE,\n FOREIGN KEY (to_entity_id) REFERENCES entities(id) ON DELETE CASCADE,\n UNIQUE(from_entity_id, to_entity_id, relation_type)\n);\n\nCREATE TABLE IF NOT EXISTS tags (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n entity_id INTEGER NOT NULL,\n tag TEXT NOT NULL,\n FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_tags_entity ON tags(entity_id);\nCREATE INDEX IF NOT EXISTS idx_tags_tag ON tags(tag);\n-- The tags dedup DELETE + idx_tags_entity_tag_unique creation live in\n-- ensureTagsUniqueIndex(), AFTER this exec \u2014 the DELETE is a one-time\n-- migration, and a DML statement in this string made every open start a\n-- write transaction even when it deleted nothing (same reader-breaking\n-- pattern as the hook_runs_since note below).\nCREATE INDEX IF NOT EXISTS idx_observations_entity ON observations(entity_id);\nCREATE INDEX IF NOT EXISTS idx_relations_from ON relations(from_entity_id);\nCREATE INDEX IF NOT EXISTS idx_relations_to ON relations(to_entity_id);\nCREATE INDEX IF NOT EXISTS idx_entities_type_created ON entities(type, created_at);\n\n-- Migration markers and small bits of persistent state (index segmentation\n-- version, embedding dimension, pending-reindex flags, backfill markers).\n--\n-- This used to be created ad hoc by each helper that needed it \u2014 four inline\n-- CREATE TABLE IF NOT EXISTS copies in src/db.ts, none of them visible to\n-- schema checks. A column added to one copy would not have been caught. It\n-- also meant the hook-side schema had no metadata table at all, so hooks\n-- could not participate in migrations even in principle.\nCREATE TABLE IF NOT EXISTS memesh_metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\n-- Local agent messaging core. Messages are immutable, deliveries identify the\n-- authorized recipient, events are the wakeup/catch-up surface, cursors keep\n-- the internal sequence opaque, and receipts are append-only facts that remain\n-- separate from delivery existence.\nCREATE TABLE IF NOT EXISTS agent_messages (\n message_id TEXT PRIMARY KEY,\n project TEXT NOT NULL,\n sender TEXT NOT NULL,\n sender_host TEXT,\n recipient TEXT NOT NULL,\n content_type TEXT NOT NULL,\n correlation_id TEXT,\n reply_to_message_id TEXT,\n privacy TEXT NOT NULL,\n payload_json TEXT NOT NULL,\n -- A tombstone replaces only a terminal payload. The original JSON bytes\n -- are never reconstructed from these fields; they retain enough identity to\n -- audit the erasure while the routing and lifecycle tables remain intact.\n payload_sha256 TEXT,\n payload_original_bytes INTEGER,\n payload_tombstoned_at TIMESTAMP,\n provenance_json TEXT NOT NULL,\n created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE IF NOT EXISTS agent_message_deliveries (\n delivery_id TEXT PRIMARY KEY,\n message_id TEXT NOT NULL,\n project TEXT NOT NULL,\n recipient TEXT NOT NULL,\n target_kind TEXT NOT NULL DEFAULT 'principal' CHECK (target_kind IN ('principal', 'session')),\n created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (message_id) REFERENCES agent_messages(message_id) ON DELETE CASCADE,\n UNIQUE(message_id, project, recipient)\n);\n\nCREATE TABLE IF NOT EXISTS agent_message_events (\n event_sequence INTEGER PRIMARY KEY AUTOINCREMENT,\n event_id TEXT NOT NULL UNIQUE,\n message_id TEXT NOT NULL,\n delivery_id TEXT NOT NULL,\n project TEXT NOT NULL,\n recipient TEXT NOT NULL,\n event_kind TEXT NOT NULL,\n created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (message_id) REFERENCES agent_messages(message_id) ON DELETE CASCADE,\n FOREIGN KEY (delivery_id) REFERENCES agent_message_deliveries(delivery_id) ON DELETE CASCADE\n);\n\nCREATE TABLE IF NOT EXISTS agent_message_idempotency (\n project TEXT NOT NULL,\n sender TEXT NOT NULL,\n idempotency_key TEXT NOT NULL,\n request_hash TEXT NOT NULL,\n message_id TEXT NOT NULL UNIQUE,\n created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (message_id) REFERENCES agent_messages(message_id) ON DELETE CASCADE,\n PRIMARY KEY(project, sender, idempotency_key)\n);\n\nCREATE TABLE IF NOT EXISTS agent_message_cursors (\n cursor_token TEXT PRIMARY KEY,\n project TEXT NOT NULL,\n recipient TEXT NOT NULL,\n event_sequence INTEGER NOT NULL,\n created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE IF NOT EXISTS agent_message_receipts (\n receipt_id TEXT PRIMARY KEY,\n message_id TEXT NOT NULL,\n project TEXT NOT NULL,\n recipient TEXT NOT NULL,\n receipt_kind TEXT NOT NULL,\n actor TEXT NOT NULL,\n idempotency_key TEXT NOT NULL,\n request_hash TEXT NOT NULL,\n detail_json TEXT NOT NULL,\n created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (message_id) REFERENCES agent_messages(message_id) ON DELETE CASCADE,\n UNIQUE(project, recipient, message_id, receipt_kind, idempotency_key)\n);\n\n-- Host-native push identity and lifecycle. A principal is stable, a session\n-- instance is ephemeral, and every connection to that session gets a strictly\n-- increasing generation. The activation checkpoint is intentionally created\n-- at first principal registration: principal-targeted history at or before it\n-- is durable inbox history, but is never replayed as a first-time host push.\nCREATE TABLE IF NOT EXISTS agent_principals (\n project TEXT NOT NULL,\n principal_id TEXT NOT NULL,\n activation_event_sequence INTEGER NOT NULL,\n created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY(project, principal_id)\n);\n\nCREATE TABLE IF NOT EXISTS agent_session_instances (\n project TEXT NOT NULL,\n session_instance_id TEXT NOT NULL,\n principal_id TEXT NOT NULL,\n adapter_kind TEXT NOT NULL,\n last_generation INTEGER NOT NULL DEFAULT 0,\n created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY(project, session_instance_id),\n FOREIGN KEY (project, principal_id) REFERENCES agent_principals(project, principal_id)\n);\n\nCREATE TABLE IF NOT EXISTS agent_session_connections (\n connection_id TEXT PRIMARY KEY,\n project TEXT NOT NULL,\n principal_id TEXT NOT NULL,\n session_instance_id TEXT NOT NULL,\n generation INTEGER NOT NULL,\n adapter_kind TEXT NOT NULL,\n router_instance_id TEXT NOT NULL,\n lease_expires_at_ms INTEGER NOT NULL,\n connected_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n disconnected_at TIMESTAMP,\n disconnect_reason TEXT,\n UNIQUE(project, session_instance_id, generation),\n FOREIGN KEY (project, session_instance_id)\n REFERENCES agent_session_instances(project, session_instance_id)\n);\n\nCREATE TABLE IF NOT EXISTS agent_presence_facts (\n presence_fact_id TEXT PRIMARY KEY,\n project TEXT NOT NULL,\n principal_id TEXT NOT NULL,\n session_instance_id TEXT NOT NULL,\n connection_id TEXT NOT NULL,\n generation INTEGER NOT NULL,\n presence_kind TEXT NOT NULL CHECK (presence_kind IN ('connected', 'heartbeat', 'disconnected', 'superseded')),\n detail_json TEXT NOT NULL,\n created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (connection_id) REFERENCES agent_session_connections(connection_id)\n);\n\n-- Dispatch is at-least-once across a crash boundary. delivery_id is the stable\n-- adapter dispatch key; attempt_id identifies one invocation. A host_accept is\n-- a separate fact and never implies an agent acknowledgement or workflow\n-- outcome.\nCREATE TABLE IF NOT EXISTS agent_dispatch_attempts (\n attempt_id TEXT PRIMARY KEY,\n delivery_id TEXT NOT NULL,\n project TEXT NOT NULL,\n principal_id TEXT NOT NULL,\n session_instance_id TEXT NOT NULL,\n connection_id TEXT NOT NULL,\n generation INTEGER NOT NULL,\n router_instance_id TEXT NOT NULL,\n attempt_number INTEGER NOT NULL,\n result TEXT NOT NULL DEFAULT 'started' CHECK (result IN ('started', 'adapter_returned', 'adapter_rejected', 'adapter_failed', 'stale_generation')),\n failure_code TEXT,\n created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n completed_at TIMESTAMP,\n UNIQUE(delivery_id, attempt_number),\n FOREIGN KEY (delivery_id) REFERENCES agent_message_deliveries(delivery_id) ON DELETE CASCADE,\n FOREIGN KEY (connection_id) REFERENCES agent_session_connections(connection_id)\n);\n\nCREATE TABLE IF NOT EXISTS agent_host_accepts (\n host_accept_id TEXT PRIMARY KEY,\n attempt_id TEXT NOT NULL UNIQUE,\n delivery_id TEXT NOT NULL UNIQUE,\n adapter_kind TEXT NOT NULL,\n receipt_json TEXT NOT NULL,\n created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (attempt_id) REFERENCES agent_dispatch_attempts(attempt_id),\n FOREIGN KEY (delivery_id) REFERENCES agent_message_deliveries(delivery_id) ON DELETE CASCADE\n);\n\nCREATE TABLE IF NOT EXISTS agent_ack_facts (\n ack_fact_id TEXT PRIMARY KEY,\n delivery_id TEXT NOT NULL,\n host_accept_id TEXT NOT NULL,\n actor TEXT NOT NULL,\n idempotency_key TEXT NOT NULL,\n request_hash TEXT NOT NULL,\n detail_json TEXT NOT NULL,\n created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(delivery_id, actor, idempotency_key),\n FOREIGN KEY (delivery_id) REFERENCES agent_message_deliveries(delivery_id) ON DELETE CASCADE,\n FOREIGN KEY (host_accept_id) REFERENCES agent_host_accepts(host_accept_id)\n);\n\nCREATE TABLE IF NOT EXISTS agent_workflow_facts (\n workflow_fact_id TEXT PRIMARY KEY,\n delivery_id TEXT NOT NULL,\n actor TEXT NOT NULL,\n workflow_state TEXT NOT NULL,\n idempotency_key TEXT NOT NULL,\n request_hash TEXT NOT NULL,\n detail_json TEXT NOT NULL,\n created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(delivery_id, actor, idempotency_key),\n FOREIGN KEY (delivery_id) REFERENCES agent_message_deliveries(delivery_id) ON DELETE CASCADE\n);\n\nCREATE TABLE IF NOT EXISTS agent_retention_facts (\n retention_fact_id TEXT PRIMARY KEY,\n message_id TEXT NOT NULL,\n actor TEXT NOT NULL,\n retention_state TEXT NOT NULL,\n idempotency_key TEXT NOT NULL,\n request_hash TEXT NOT NULL,\n detail_json TEXT NOT NULL,\n created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(message_id, actor, idempotency_key),\n FOREIGN KEY (message_id) REFERENCES agent_messages(message_id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_agent_message_events_recipient_sequence\n ON agent_message_events(project, recipient, event_sequence);\nCREATE INDEX IF NOT EXISTS idx_agent_message_deliveries_scope\n ON agent_message_deliveries(project, recipient, message_id);\nCREATE INDEX IF NOT EXISTS idx_agent_message_receipts_scope\n ON agent_message_receipts(project, recipient, message_id, created_at);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_agent_message_cursors_unique_scope_sequence\n ON agent_message_cursors(project, recipient, event_sequence);\nCREATE INDEX IF NOT EXISTS idx_agent_principals_activation\n ON agent_principals(project, activation_event_sequence);\nCREATE INDEX IF NOT EXISTS idx_agent_session_connections_active\n ON agent_session_connections(project, principal_id, session_instance_id, lease_expires_at_ms)\n WHERE disconnected_at IS NULL;\nCREATE INDEX IF NOT EXISTS idx_agent_dispatch_attempts_delivery\n ON agent_dispatch_attempts(delivery_id, attempt_number);\nCREATE INDEX IF NOT EXISTS idx_agent_workflow_facts_delivery_created\n ON agent_workflow_facts(delivery_id, created_at, workflow_fact_id);\n\n-- Proof that a capture hook actually RAN. Nothing else in this schema can\n-- give it: every other signal is \"a row was written\", and \"the hook ran and\n-- found nothing worth saving\" is the healthy case that produces no row at\n-- all. So a quiet day and a dead capture loop were byte-identical in the\n-- database, and the one doctor message that had to cover both cried wolf on\n-- the first and stayed silent on the second.\n--\n-- Written by the three hooks that hold a read-write handle (Stop, PreCompact,\n-- PostToolUse), each calling recordHookRun() at its own SUCCESSFUL exit \u2014\n-- after capture, not at open. Stamping at open certified the wrong thing: a\n-- hook that opened the database and then died mid-capture looked alive for a\n-- day. \"Successful\" is precise: a completed capture, or a well-formed\n-- payload the hook correctly decided not to capture (dedup, low-signal\n-- session). A malformed payload (schema-flip shapes) and a write that did\n-- not land both leave no stamp \u2014 either would make the heartbeat mask the\n-- exact dropout it exists to expose. The recall-side hooks open read-only\n-- and deliberately do not appear here: their liveness answers a different\n-- question, and giving them a write handle would put a lock acquisition on\n-- the SessionStart hot path.\n--\n-- One row per hook, upserted. It does not grow.\nCREATE TABLE IF NOT EXISTS hook_runs (\n hook TEXT PRIMARY KEY,\n last_run_at TIMESTAMP NOT NULL,\n run_count INTEGER NOT NULL DEFAULT 0\n);\n\n-- The 'hook_runs_since' metadata key (when this database first became able\n-- to record hook runs) is stamped by ensureHookRunsSince() AFTER this exec,\n-- NOT here. It used to be an INSERT OR IGNORE in this string, and that made\n-- every open \u2014 including opens that only ever read \u2014 start a write\n-- transaction: an INSERT statement takes the WAL writer lock even when\n-- OR IGNORE ends up changing nothing. Two states regressed from \"reads work\"\n-- to \"open throws\": a peer holding the writer lock past busy_timeout, and a\n-- read-only database FILE (measured: \"attempt to write a readonly database\"\n-- killed recall along with capture). The helper SELECTs first and writes\n-- only when the key is genuinely absent \u2014 once per database lifetime.\n";
3
3
  export declare const FTS_SQL = "\nCREATE VIRTUAL TABLE IF NOT EXISTS entities_fts USING fts5(\n name, observations, content='',\n tokenize='unicode61 remove_diacritics 1'\n);\n\n-- Term -> document-count view over the index above. Stores nothing of its own;\n-- it exists so search() can drop query terms that appear in most of the corpus,\n-- which are the ones BM25 already scores near zero. See dropUbiquitousTerms().\nCREATE VIRTUAL TABLE IF NOT EXISTS fts_vocab USING fts5vocab(entities_fts, 'row');\n";
4
4
  export declare function safeAlter(db: MemeshDatabase, sql: string): void;
5
5
  export declare function migrateEntitiesSchema(db: MemeshDatabase): void;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/storage/schema.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,eAAO,MAAM,UAAU,gwJAkGtB,CAAC;AAGF,eAAO,MAAM,OAAO,ieAUnB,CAAC;AAYF,wBAAgB,SAAS,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAO/D;AASD,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAwD9D;AAYD,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CA6B9D;AAeD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAgC5D;AAQD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAOxD;AAGD,eAAO,MAAM,0BAA0B,QAAsB,CAAC;AA+B9D,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE;IACJ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5D,GACA,OAAO,CAoET;AAWD,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAG1C,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAuBzC,wBAAgB,eAAe,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAsDxD;AAkBD,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAO9D"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/storage/schema.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,eAAO,MAAM,UAAU,y2eAuUtB,CAAC;AAGF,eAAO,MAAM,OAAO,ieAUnB,CAAC;AAYF,wBAAgB,SAAS,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAO/D;AASD,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CA2G9D;AAYD,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CA6B9D;AAeD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAgC5D;AAQD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAOxD;AAGD,eAAO,MAAM,0BAA0B,QAAsB,CAAC;AA+B9D,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE;IACJ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5D,GACA,OAAO,CAoET;AAWD,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAG1C,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAuBzC,wBAAgB,eAAe,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAsDxD;AAkBD,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAO9D"}
@@ -61,6 +61,235 @@ CREATE TABLE IF NOT EXISTS memesh_metadata (
61
61
  value TEXT NOT NULL
62
62
  );
63
63
 
64
+ -- Local agent messaging core. Messages are immutable, deliveries identify the
65
+ -- authorized recipient, events are the wakeup/catch-up surface, cursors keep
66
+ -- the internal sequence opaque, and receipts are append-only facts that remain
67
+ -- separate from delivery existence.
68
+ CREATE TABLE IF NOT EXISTS agent_messages (
69
+ message_id TEXT PRIMARY KEY,
70
+ project TEXT NOT NULL,
71
+ sender TEXT NOT NULL,
72
+ sender_host TEXT,
73
+ recipient TEXT NOT NULL,
74
+ content_type TEXT NOT NULL,
75
+ correlation_id TEXT,
76
+ reply_to_message_id TEXT,
77
+ privacy TEXT NOT NULL,
78
+ payload_json TEXT NOT NULL,
79
+ -- A tombstone replaces only a terminal payload. The original JSON bytes
80
+ -- are never reconstructed from these fields; they retain enough identity to
81
+ -- audit the erasure while the routing and lifecycle tables remain intact.
82
+ payload_sha256 TEXT,
83
+ payload_original_bytes INTEGER,
84
+ payload_tombstoned_at TIMESTAMP,
85
+ provenance_json TEXT NOT NULL,
86
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
87
+ );
88
+
89
+ CREATE TABLE IF NOT EXISTS agent_message_deliveries (
90
+ delivery_id TEXT PRIMARY KEY,
91
+ message_id TEXT NOT NULL,
92
+ project TEXT NOT NULL,
93
+ recipient TEXT NOT NULL,
94
+ target_kind TEXT NOT NULL DEFAULT 'principal' CHECK (target_kind IN ('principal', 'session')),
95
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
96
+ FOREIGN KEY (message_id) REFERENCES agent_messages(message_id) ON DELETE CASCADE,
97
+ UNIQUE(message_id, project, recipient)
98
+ );
99
+
100
+ CREATE TABLE IF NOT EXISTS agent_message_events (
101
+ event_sequence INTEGER PRIMARY KEY AUTOINCREMENT,
102
+ event_id TEXT NOT NULL UNIQUE,
103
+ message_id TEXT NOT NULL,
104
+ delivery_id TEXT NOT NULL,
105
+ project TEXT NOT NULL,
106
+ recipient TEXT NOT NULL,
107
+ event_kind TEXT NOT NULL,
108
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
109
+ FOREIGN KEY (message_id) REFERENCES agent_messages(message_id) ON DELETE CASCADE,
110
+ FOREIGN KEY (delivery_id) REFERENCES agent_message_deliveries(delivery_id) ON DELETE CASCADE
111
+ );
112
+
113
+ CREATE TABLE IF NOT EXISTS agent_message_idempotency (
114
+ project TEXT NOT NULL,
115
+ sender TEXT NOT NULL,
116
+ idempotency_key TEXT NOT NULL,
117
+ request_hash TEXT NOT NULL,
118
+ message_id TEXT NOT NULL UNIQUE,
119
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
120
+ FOREIGN KEY (message_id) REFERENCES agent_messages(message_id) ON DELETE CASCADE,
121
+ PRIMARY KEY(project, sender, idempotency_key)
122
+ );
123
+
124
+ CREATE TABLE IF NOT EXISTS agent_message_cursors (
125
+ cursor_token TEXT PRIMARY KEY,
126
+ project TEXT NOT NULL,
127
+ recipient TEXT NOT NULL,
128
+ event_sequence INTEGER NOT NULL,
129
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
130
+ );
131
+
132
+ CREATE TABLE IF NOT EXISTS agent_message_receipts (
133
+ receipt_id TEXT PRIMARY KEY,
134
+ message_id TEXT NOT NULL,
135
+ project TEXT NOT NULL,
136
+ recipient TEXT NOT NULL,
137
+ receipt_kind TEXT NOT NULL,
138
+ actor TEXT NOT NULL,
139
+ idempotency_key TEXT NOT NULL,
140
+ request_hash TEXT NOT NULL,
141
+ detail_json TEXT NOT NULL,
142
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
143
+ FOREIGN KEY (message_id) REFERENCES agent_messages(message_id) ON DELETE CASCADE,
144
+ UNIQUE(project, recipient, message_id, receipt_kind, idempotency_key)
145
+ );
146
+
147
+ -- Host-native push identity and lifecycle. A principal is stable, a session
148
+ -- instance is ephemeral, and every connection to that session gets a strictly
149
+ -- increasing generation. The activation checkpoint is intentionally created
150
+ -- at first principal registration: principal-targeted history at or before it
151
+ -- is durable inbox history, but is never replayed as a first-time host push.
152
+ CREATE TABLE IF NOT EXISTS agent_principals (
153
+ project TEXT NOT NULL,
154
+ principal_id TEXT NOT NULL,
155
+ activation_event_sequence INTEGER NOT NULL,
156
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
157
+ PRIMARY KEY(project, principal_id)
158
+ );
159
+
160
+ CREATE TABLE IF NOT EXISTS agent_session_instances (
161
+ project TEXT NOT NULL,
162
+ session_instance_id TEXT NOT NULL,
163
+ principal_id TEXT NOT NULL,
164
+ adapter_kind TEXT NOT NULL,
165
+ last_generation INTEGER NOT NULL DEFAULT 0,
166
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
167
+ PRIMARY KEY(project, session_instance_id),
168
+ FOREIGN KEY (project, principal_id) REFERENCES agent_principals(project, principal_id)
169
+ );
170
+
171
+ CREATE TABLE IF NOT EXISTS agent_session_connections (
172
+ connection_id TEXT PRIMARY KEY,
173
+ project TEXT NOT NULL,
174
+ principal_id TEXT NOT NULL,
175
+ session_instance_id TEXT NOT NULL,
176
+ generation INTEGER NOT NULL,
177
+ adapter_kind TEXT NOT NULL,
178
+ router_instance_id TEXT NOT NULL,
179
+ lease_expires_at_ms INTEGER NOT NULL,
180
+ connected_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
181
+ disconnected_at TIMESTAMP,
182
+ disconnect_reason TEXT,
183
+ UNIQUE(project, session_instance_id, generation),
184
+ FOREIGN KEY (project, session_instance_id)
185
+ REFERENCES agent_session_instances(project, session_instance_id)
186
+ );
187
+
188
+ CREATE TABLE IF NOT EXISTS agent_presence_facts (
189
+ presence_fact_id TEXT PRIMARY KEY,
190
+ project TEXT NOT NULL,
191
+ principal_id TEXT NOT NULL,
192
+ session_instance_id TEXT NOT NULL,
193
+ connection_id TEXT NOT NULL,
194
+ generation INTEGER NOT NULL,
195
+ presence_kind TEXT NOT NULL CHECK (presence_kind IN ('connected', 'heartbeat', 'disconnected', 'superseded')),
196
+ detail_json TEXT NOT NULL,
197
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
198
+ FOREIGN KEY (connection_id) REFERENCES agent_session_connections(connection_id)
199
+ );
200
+
201
+ -- Dispatch is at-least-once across a crash boundary. delivery_id is the stable
202
+ -- adapter dispatch key; attempt_id identifies one invocation. A host_accept is
203
+ -- a separate fact and never implies an agent acknowledgement or workflow
204
+ -- outcome.
205
+ CREATE TABLE IF NOT EXISTS agent_dispatch_attempts (
206
+ attempt_id TEXT PRIMARY KEY,
207
+ delivery_id TEXT NOT NULL,
208
+ project TEXT NOT NULL,
209
+ principal_id TEXT NOT NULL,
210
+ session_instance_id TEXT NOT NULL,
211
+ connection_id TEXT NOT NULL,
212
+ generation INTEGER NOT NULL,
213
+ router_instance_id TEXT NOT NULL,
214
+ attempt_number INTEGER NOT NULL,
215
+ result TEXT NOT NULL DEFAULT 'started' CHECK (result IN ('started', 'adapter_returned', 'adapter_rejected', 'adapter_failed', 'stale_generation')),
216
+ failure_code TEXT,
217
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
218
+ completed_at TIMESTAMP,
219
+ UNIQUE(delivery_id, attempt_number),
220
+ FOREIGN KEY (delivery_id) REFERENCES agent_message_deliveries(delivery_id) ON DELETE CASCADE,
221
+ FOREIGN KEY (connection_id) REFERENCES agent_session_connections(connection_id)
222
+ );
223
+
224
+ CREATE TABLE IF NOT EXISTS agent_host_accepts (
225
+ host_accept_id TEXT PRIMARY KEY,
226
+ attempt_id TEXT NOT NULL UNIQUE,
227
+ delivery_id TEXT NOT NULL UNIQUE,
228
+ adapter_kind TEXT NOT NULL,
229
+ receipt_json TEXT NOT NULL,
230
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
231
+ FOREIGN KEY (attempt_id) REFERENCES agent_dispatch_attempts(attempt_id),
232
+ FOREIGN KEY (delivery_id) REFERENCES agent_message_deliveries(delivery_id) ON DELETE CASCADE
233
+ );
234
+
235
+ CREATE TABLE IF NOT EXISTS agent_ack_facts (
236
+ ack_fact_id TEXT PRIMARY KEY,
237
+ delivery_id TEXT NOT NULL,
238
+ host_accept_id TEXT NOT NULL,
239
+ actor TEXT NOT NULL,
240
+ idempotency_key TEXT NOT NULL,
241
+ request_hash TEXT NOT NULL,
242
+ detail_json TEXT NOT NULL,
243
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
244
+ UNIQUE(delivery_id, actor, idempotency_key),
245
+ FOREIGN KEY (delivery_id) REFERENCES agent_message_deliveries(delivery_id) ON DELETE CASCADE,
246
+ FOREIGN KEY (host_accept_id) REFERENCES agent_host_accepts(host_accept_id)
247
+ );
248
+
249
+ CREATE TABLE IF NOT EXISTS agent_workflow_facts (
250
+ workflow_fact_id TEXT PRIMARY KEY,
251
+ delivery_id TEXT NOT NULL,
252
+ actor TEXT NOT NULL,
253
+ workflow_state TEXT NOT NULL,
254
+ idempotency_key TEXT NOT NULL,
255
+ request_hash TEXT NOT NULL,
256
+ detail_json TEXT NOT NULL,
257
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
258
+ UNIQUE(delivery_id, actor, idempotency_key),
259
+ FOREIGN KEY (delivery_id) REFERENCES agent_message_deliveries(delivery_id) ON DELETE CASCADE
260
+ );
261
+
262
+ CREATE TABLE IF NOT EXISTS agent_retention_facts (
263
+ retention_fact_id TEXT PRIMARY KEY,
264
+ message_id TEXT NOT NULL,
265
+ actor TEXT NOT NULL,
266
+ retention_state TEXT NOT NULL,
267
+ idempotency_key TEXT NOT NULL,
268
+ request_hash TEXT NOT NULL,
269
+ detail_json TEXT NOT NULL,
270
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
271
+ UNIQUE(message_id, actor, idempotency_key),
272
+ FOREIGN KEY (message_id) REFERENCES agent_messages(message_id) ON DELETE CASCADE
273
+ );
274
+
275
+ CREATE INDEX IF NOT EXISTS idx_agent_message_events_recipient_sequence
276
+ ON agent_message_events(project, recipient, event_sequence);
277
+ CREATE INDEX IF NOT EXISTS idx_agent_message_deliveries_scope
278
+ ON agent_message_deliveries(project, recipient, message_id);
279
+ CREATE INDEX IF NOT EXISTS idx_agent_message_receipts_scope
280
+ ON agent_message_receipts(project, recipient, message_id, created_at);
281
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_agent_message_cursors_unique_scope_sequence
282
+ ON agent_message_cursors(project, recipient, event_sequence);
283
+ CREATE INDEX IF NOT EXISTS idx_agent_principals_activation
284
+ ON agent_principals(project, activation_event_sequence);
285
+ CREATE INDEX IF NOT EXISTS idx_agent_session_connections_active
286
+ ON agent_session_connections(project, principal_id, session_instance_id, lease_expires_at_ms)
287
+ WHERE disconnected_at IS NULL;
288
+ CREATE INDEX IF NOT EXISTS idx_agent_dispatch_attempts_delivery
289
+ ON agent_dispatch_attempts(delivery_id, attempt_number);
290
+ CREATE INDEX IF NOT EXISTS idx_agent_workflow_facts_delivery_created
291
+ ON agent_workflow_facts(delivery_id, created_at, workflow_fact_id);
292
+
64
293
  -- Proof that a capture hook actually RAN. Nothing else in this schema can
65
294
  -- give it: every other signal is "a row was written", and "the hook ran and
66
295
  -- found nothing worth saving" is the healthy case that produces no row at
@@ -140,6 +369,32 @@ export function migrateEntitiesSchema(db) {
140
369
  addColumn('title', "ALTER TABLE entities ADD COLUMN title TEXT");
141
370
  db.exec(`CREATE INDEX IF NOT EXISTS idx_entities_status ON entities(status);
142
371
  CREATE INDEX IF NOT EXISTS idx_entities_namespace ON entities(namespace);`);
372
+ const deliveryTableExists = db
373
+ .prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'agent_message_deliveries'")
374
+ .get();
375
+ if (!deliveryTableExists)
376
+ return;
377
+ const deliveryColumns = new Set(db.prepare("PRAGMA table_info(agent_message_deliveries)").all().map((column) => column.name));
378
+ if (!deliveryColumns.has('target_kind')) {
379
+ safeAlter(db, "ALTER TABLE agent_message_deliveries ADD COLUMN target_kind TEXT NOT NULL DEFAULT 'principal' " +
380
+ "CHECK (target_kind IN ('principal', 'session'))");
381
+ }
382
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_agent_message_deliveries_target
383
+ ON agent_message_deliveries(project, target_kind, recipient, message_id);`);
384
+ const messageColumns = new Set(db.prepare("PRAGMA table_info(agent_messages)").all().map((column) => column.name));
385
+ const addMessageColumn = (column, sql) => {
386
+ if (messageColumns.has(column))
387
+ return;
388
+ safeAlter(db, sql);
389
+ messageColumns.add(column);
390
+ };
391
+ addMessageColumn('payload_sha256', 'ALTER TABLE agent_messages ADD COLUMN payload_sha256 TEXT');
392
+ addMessageColumn('payload_original_bytes', 'ALTER TABLE agent_messages ADD COLUMN payload_original_bytes INTEGER');
393
+ addMessageColumn('payload_tombstoned_at', 'ALTER TABLE agent_messages ADD COLUMN payload_tombstoned_at TIMESTAMP');
394
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_agent_messages_tombstone
395
+ ON agent_messages(payload_tombstoned_at, created_at);
396
+ CREATE INDEX IF NOT EXISTS idx_agent_workflow_facts_delivery_created
397
+ ON agent_workflow_facts(delivery_id, created_at, workflow_fact_id);`);
143
398
  }
144
399
  export function ensureTagsUniqueIndex(db) {
145
400
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/storage/schema.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkGzB,CAAC;AAGF,MAAM,CAAC,MAAM,OAAO,GAAG;;;;;;;;;;CAUtB,CAAC;AAYF,MAAM,UAAU,SAAS,CAAC,EAAkB,EAAE,GAAW;IACvD,IAAI,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AASD,MAAM,UAAU,qBAAqB,CAAC,EAAkB;IACtD,MAAM,aAAa,GAAG,IAAI,GAAG,CAC1B,EAAE,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,GAAG,EAA8B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAChG,CAAC;IAkBF,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,GAAW,EAAQ,EAAE;QACtD,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO;QACtC,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACnB,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC;IAGF,SAAS,CAAC,QAAQ,EAAE,uEAAuE,CAAC,CAAC;IAG7F,SAAS,CAAC,cAAc,EAAE,gEAAgE,CAAC,CAAC;IAC5F,SAAS,CAAC,kBAAkB,EAAE,4DAA4D,CAAC,CAAC;IAC5F,SAAS,CAAC,YAAY,EAAE,6DAA6D,CAAC,CAAC;IACvF,SAAS,CAAC,YAAY,EAAE,sDAAsD,CAAC,CAAC;IAChF,SAAS,CAAC,aAAa,EAAE,uDAAuD,CAAC,CAAC;IAGlF,SAAS,CAAC,WAAW,EAAE,mEAAmE,CAAC,CAAC;IAG5F,SAAS,CAAC,aAAa,EAAE,+DAA+D,CAAC,CAAC;IAC1F,SAAS,CAAC,eAAe,EAAE,iEAAiE,CAAC,CAAC;IAK9F,SAAS,CAAC,OAAO,EAAE,4CAA4C,CAAC,CAAC;IAKjE,EAAE,CAAC,IAAI,CACL;+EAC2E,CAC5E,CAAC;AACJ,CAAC;AAYD,MAAM,UAAU,qBAAqB,CAAC,EAAkB;IACtD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE;aACf,OAAO,CAAC,0FAA0F,CAAC;aACnG,GAAG,EAAE,CAAC;QACT,IAAI,OAAO;YAAE,OAAO;QASpB,EAAE,CAAC,IAAI,CACL,mBAAmB;YACjB,uFAAuF;YACvF,wFAAwF;YACxF,SAAS,CACZ,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC;YAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAA2B,CAAC;QAChE,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mDAAmD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK;gBACtG,6EAA6E,CAChF,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC,CAAwC,CAAC;IACpD,CAAC;AACH,CAAC;AAeD,MAAM,UAAU,mBAAmB,CAAC,EAAkB;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,iEAAiE,CAAC;aAC1E,GAAG,EAAmC,CAAC;QAC1C,IAAI,GAAG,EAAE,CAAC;YASR,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC/C,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;gBAAE,OAAO;YAChE,EAAE;iBACC,OAAO,CAAC,kFAAkF,CAAC;iBAC3F,GAAG,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QACD,EAAE;aACC,OAAO,CAAC,gGAAgG,CAAC;aACzG,GAAG,EAAE,CAAC;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,4CAA4C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK;gBAC/F,+FAA+F,CAClG,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC,CAAwC,CAAC;IACpD,CAAC;AACH,CAAC;AAQD,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,MAAM,IAAI,GAAI,GAAyB,EAAE,IAAI,IAAI,EAAE,CAAC;IACpD,MAAM,GAAG,GAAI,GAA4B,EAAE,OAAO,IAAI,EAAE,CAAC;IACzD,OAAO,CACL,2CAA2C,CAAC,IAAI,CAAC,IAAI,CAAC;QACtD,+DAA+D,CAAC,IAAI,CAAC,GAAG,CAAC,CAC1E,CAAC;AACJ,CAAC;AAGD,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AA+B9D,MAAM,UAAU,gBAAgB,CAC9B,EAAkB,EAClB,IAKC;IAED,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACjD,MAAM,UAAU,GAAG,GAAG,GAAG,eAAe,CAAC;IAEzC,MAAM,UAAU,GAAG,CAAC,CAAS,EAAsB,EAAE,CAClD,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,CAAC,CAAC,CAEtD,EAAE,KAAK,CAAC;IAKxB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,OAAO;QAAE,OAAO,KAAK,CAAC;IAE5D,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,GAAG,0BAA0B,EAAE,CAAC;QACvF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAGlB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,OAAO;gBAAE,OAAO;YAExD,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEjD,EAAE,CAAC,OAAO,CAAC,mEAAmE,CAAC,CAAC,GAAG,CACjF,GAAG,EACH,MAAM,CAAC,OAAO,CAAC,CAChB,CAAC;YACF,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QAOb,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,WAAW,QAAQ,cAAc,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK;gBACpF,sEAAsE,CACzE,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;QAKD,IAAI,CAAC;YACH,EAAE,CAAC,OAAO,CAAC,mEAAmE,CAAC,CAAC,GAAG,CACjF,UAAU,EACV,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CACnB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC,CAA4B,CAAC;QAEtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,WAAW,QAAQ,YAAY,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK;YAClF,gEAAgE;YAChE,qEAAqE,CACxE,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAWD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAG1C,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAuBzC,MAAM,UAAU,eAAe,CAAC,EAAkB;IAsBhD,EAAE,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAOxE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB;;;;;;cAMU,CACX,CAAC;IAEF,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,SAAS,CAAC;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,qBAAqB,CAKlD,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;QAE7B,KAAK,MAAM,GAAG,IAAI,IAAI;YAAE,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/E,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAEnC,IAAI,IAAI,CAAC,MAAM,GAAG,qBAAqB;YAAE,MAAM;IACjD,CAAC;AACH,CAAC;AAkBD,MAAM,UAAU,qBAAqB,CAAC,EAAkB;IACtD,gBAAgB,CAAC,EAAE,EAAE;QACnB,GAAG,EAAE,0BAA0B;QAC/B,OAAO,EAAE,wBAAwB;QACjC,QAAQ,EAAE,sBAAsB;QAChC,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/storage/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod';
2
+ import type { MemeshDatabase } from '../storage/sqlite.js';
3
+ import { MessageSchema } from './schemas.js';
4
+ export type AgentMessageActionInput = z.infer<typeof MessageSchema>;
5
+ export interface AgentMessageTransportContext {
6
+ transport: 'cli' | 'http' | 'mcp';
7
+ sourceHost: string;
8
+ signal?: AbortSignal;
9
+ }
10
+ export declare function executeAgentMessageAction(db: MemeshDatabase, rawInput: unknown, context: AgentMessageTransportContext): Promise<unknown>;
11
+ //# sourceMappingURL=agent-messaging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-messaging.d.ts","sourceRoot":"","sources":["../../src/transports/agent-messaging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAe3D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAK7C,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEpE,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAsSD,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,cAAc,EAClB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,OAAO,CAAC,CAmElB"}