@jungjaehoon/mama-core 2.4.1 → 4.0.0

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 (371) hide show
  1. package/README.md +76 -239
  2. package/db/migrations/030-case-first-memory-substrate.sql +13 -98
  3. package/db/migrations/034-add-connector-event-scope-columns.sql +9 -13
  4. package/db/migrations/039-add-connector-event-operator-ingest-seq.sql +9 -95
  5. package/db/migrations/062-refresh-connector-event-sequences.sql +9 -113
  6. package/db/migrations/063-refresh-legacy-connector-event-updates.sql +9 -32
  7. package/db/migrations/067-add-connector-event-source-entity-id.sql +9 -13
  8. package/db/migrations/069-create-registry-nodes.sql +52 -0
  9. package/db/migrations/070-record-identity.sql +35 -0
  10. package/db/migrations/071-service-operation-origins.sql +187 -0
  11. package/db/migrations/072-observation-versions.sql +29 -0
  12. package/db/migrations/073-registry-corrections.sql +45 -0
  13. package/db/migrations/074-work-graph-ref-kinds.sql +39 -0
  14. package/db/migrations/075-agent-judgments.sql +58 -0
  15. package/db/migrations/076-scoped-checkpoint-bindings.sql +15 -0
  16. package/db/migrations/077-legacy-record-kind.sql +6 -0
  17. package/db/migrations/078-source-ingest-commands.sql +18 -0
  18. package/db/migrations/079-twin-edge-relations.sql +43 -0
  19. package/db/migrations/080-restore-duration-days.sql +7 -0
  20. package/db/migrations/081-mailbox.sql +61 -0
  21. package/db/migrations/082-commitments-row-id.sql +12 -0
  22. package/db/migrations/083-observation-is-the-evidence.sql +49 -0
  23. package/db/migrations/084-scope-kind-is-not-the-cores-to-list.sql +34 -0
  24. package/db/migrations/085-a-migration-has-a-source.sql +37 -0
  25. package/db/migrations/086-the-mailbox-is-generic.sql +110 -0
  26. package/db/migrations/087-mailbox-payload.sql +5 -0
  27. package/db/migrations/088-native-input-journal.sql +14 -0
  28. package/db/migrations/089-native-turn-receipt-lookup.sql +3 -0
  29. package/db/migrations/090-model-run-native-inputs.sql +29 -0
  30. package/db/migrations/091-native-turn-results.sql +11 -0
  31. package/db/migrations/092-restore-decision-fts.sql +34 -0
  32. package/db/migrations/093-native-turn-primary-kind.sql +14 -0
  33. package/db/migrations/094-commitment-run-provenance.sql +9 -0
  34. package/db/migrations/095-model-run-native-input-identity.sql +39 -0
  35. package/db/migrations/096-drop-connector-event-index-fts.sql +9 -0
  36. package/db/migrations/097-native-input-json-validity.sql +37 -0
  37. package/db/migrations/098-workflow-memory-kind.sql +105 -0
  38. package/dist/action-contracts.d.ts +212 -0
  39. package/dist/action-contracts.js +10 -0
  40. package/dist/api/catalog.d.ts +118 -0
  41. package/dist/api/catalog.js +1756 -0
  42. package/dist/api/dispatch.d.ts +76 -0
  43. package/dist/api/dispatch.js +372 -0
  44. package/dist/canonicalize.d.ts +2 -2
  45. package/dist/canonicalize.js +3 -3
  46. package/dist/client/client.d.ts +33 -0
  47. package/dist/client/client.js +123 -0
  48. package/dist/client/ipc.d.ts +81 -0
  49. package/dist/client/ipc.js +314 -0
  50. package/dist/db-adapter/base-adapter.d.ts +6 -66
  51. package/dist/db-adapter/base-adapter.js +6 -6
  52. package/dist/db-adapter/index.d.ts +5 -5
  53. package/dist/db-adapter/index.js +2 -5
  54. package/dist/db-adapter/node-sqlite-adapter.d.ts +85 -15
  55. package/dist/db-adapter/node-sqlite-adapter.js +1968 -570
  56. package/dist/db-manager.d.ts +53 -97
  57. package/dist/db-manager.js +121 -603
  58. package/dist/embedding/embedder.d.ts +132 -0
  59. package/dist/embedding/embedder.js +299 -0
  60. package/dist/identity/principal-repository.d.ts +2 -2
  61. package/dist/index.d.ts +43 -58
  62. package/dist/index.js +97 -145
  63. package/dist/{context-compile/channel-grant.d.ts → knowledge/access.d.ts} +12 -17
  64. package/dist/knowledge/access.js +663 -0
  65. package/dist/knowledge/case-errors.d.ts +31 -0
  66. package/dist/knowledge/case-errors.js +40 -0
  67. package/dist/{cases/search-rollup.d.ts → knowledge/case-search-rollup.d.ts} +5 -4
  68. package/dist/{cases/search-rollup.js → knowledge/case-search-rollup.js} +6 -8
  69. package/dist/{cases/store.d.ts → knowledge/case-store.d.ts} +3 -6
  70. package/dist/{cases/store.js → knowledge/case-store.js} +7 -42
  71. package/dist/{cases/timeline-range.d.ts → knowledge/case-timeline-range.d.ts} +3 -3
  72. package/dist/{cases/timeline-range.js → knowledge/case-timeline-range.js} +47 -25
  73. package/dist/{cases/types.d.ts → knowledge/case-types.d.ts} +8 -2
  74. package/dist/{cases/types.js → knowledge/case-types.js} +1 -1
  75. package/dist/knowledge/commitments.d.ts +188 -0
  76. package/dist/knowledge/commitments.js +370 -0
  77. package/dist/knowledge/decision-edges.d.ts +70 -0
  78. package/dist/knowledge/decision-edges.js +123 -0
  79. package/dist/{agent-graph/types.d.ts → knowledge/graph-query.d.ts} +80 -70
  80. package/dist/knowledge/graph-query.js +1585 -0
  81. package/dist/knowledge/identity.d.ts +16 -0
  82. package/dist/knowledge/identity.js +22 -0
  83. package/dist/knowledge/index.d.ts +47 -0
  84. package/dist/knowledge/index.js +90 -0
  85. package/dist/knowledge/judgments.d.ts +118 -0
  86. package/dist/knowledge/judgments.js +808 -0
  87. package/dist/knowledge/observations.d.ts +160 -0
  88. package/dist/knowledge/observations.js +449 -0
  89. package/dist/knowledge/question-type.d.ts +34 -0
  90. package/dist/knowledge/question-type.js +70 -0
  91. package/dist/{search → knowledge}/ranker-features.js +1 -1
  92. package/dist/{search → knowledge}/search-quality.d.ts +0 -1
  93. package/dist/knowledge/search.d.ts +38 -0
  94. package/dist/knowledge/search.js +91 -0
  95. package/dist/knowledge/source-ingest.d.ts +65 -0
  96. package/dist/knowledge/source-ingest.js +174 -0
  97. package/dist/{edges/types.d.ts → knowledge/twin-edge-types.d.ts} +31 -4
  98. package/dist/{edges/types.js → knowledge/twin-edge-types.js} +13 -2
  99. package/dist/knowledge/work-dates.d.ts +49 -0
  100. package/dist/knowledge/work-dates.js +120 -0
  101. package/dist/mama-api.d.ts +114 -778
  102. package/dist/mama-api.js +313 -2461
  103. package/dist/memory/api.d.ts +264 -24
  104. package/dist/memory/api.js +1633 -843
  105. package/dist/memory/bootstrap-builder.d.ts +2 -1
  106. package/dist/memory/bootstrap-builder.js +5 -5
  107. package/dist/memory/channel-summary-state-store.d.ts +3 -2
  108. package/dist/memory/channel-summary-state-store.js +53 -51
  109. package/dist/memory/channel-summary-store.d.ts +5 -3
  110. package/dist/memory/channel-summary-store.js +3 -8
  111. package/dist/memory/dashboard-read.d.ts +46 -0
  112. package/dist/memory/dashboard-read.js +94 -0
  113. package/dist/memory/event-store.d.ts +3 -3
  114. package/dist/memory/event-store.js +3 -10
  115. package/dist/memory/finding-store.d.ts +3 -2
  116. package/dist/memory/finding-store.js +2 -7
  117. package/dist/memory/graph-read.d.ts +52 -0
  118. package/dist/memory/graph-read.js +130 -0
  119. package/dist/memory/judgment-types.d.ts +394 -0
  120. package/dist/memory/judgment-types.js +16 -0
  121. package/dist/memory/provenance-audit.d.ts +5 -2
  122. package/dist/memory/provenance-audit.js +8 -14
  123. package/dist/memory/provenance-live.d.ts +141 -0
  124. package/dist/memory/provenance-live.js +409 -0
  125. package/dist/memory/provenance-query.d.ts +5 -4
  126. package/dist/memory/provenance-query.js +21 -29
  127. package/dist/memory/provenance-resolver.d.ts +191 -0
  128. package/dist/memory/provenance-resolver.js +155 -0
  129. package/dist/memory/provenance.d.ts +1 -11
  130. package/dist/memory/provenance.js +2 -33
  131. package/dist/memory/recall-sanitize.d.ts +55 -0
  132. package/dist/memory/recall-sanitize.js +144 -0
  133. package/dist/memory/secret-filter.d.ts +32 -0
  134. package/dist/memory/secret-filter.js +126 -0
  135. package/dist/memory/truth-store.d.ts +2 -1
  136. package/dist/memory/truth-store.js +1 -4
  137. package/dist/memory/types.d.ts +74 -24
  138. package/dist/memory/types.js +75 -5
  139. package/dist/memory/write-adapters.d.ts +98 -0
  140. package/dist/memory/write-adapters.js +242 -0
  141. package/dist/operations/owner-action-effects.d.ts +53 -0
  142. package/dist/operations/owner-action-effects.js +96 -0
  143. package/dist/provenance/source-ref.d.ts +1 -1
  144. package/dist/provenance/source-ref.js +0 -2
  145. package/dist/registry/corrections.d.ts +31 -0
  146. package/dist/registry/corrections.js +332 -0
  147. package/dist/registry/record-identity.d.ts +49 -0
  148. package/dist/registry/record-identity.js +133 -0
  149. package/dist/registry/store.d.ts +101 -0
  150. package/dist/registry/store.js +395 -0
  151. package/dist/registry/types.d.ts +28 -0
  152. package/dist/registry/types.js +5 -0
  153. package/dist/relevance-scorer.js +2 -2
  154. package/dist/runtime/agent-event-bus.d.ts +50 -0
  155. package/dist/runtime/agent-event-bus.js +101 -0
  156. package/dist/runtime/drivers/claude-cli-wrapper.d.ts +155 -0
  157. package/dist/runtime/drivers/claude-cli-wrapper.js +392 -0
  158. package/dist/runtime/drivers/cli-arg-redaction.d.ts +2 -0
  159. package/dist/runtime/drivers/cli-arg-redaction.js +18 -0
  160. package/dist/runtime/drivers/cli-secret-redaction.d.ts +17 -0
  161. package/dist/runtime/drivers/cli-secret-redaction.js +126 -0
  162. package/dist/runtime/drivers/codex-app-server-process.d.ts +277 -0
  163. package/dist/runtime/drivers/codex-app-server-process.js +2342 -0
  164. package/dist/runtime/drivers/codex-auxiliary-tools.d.ts +17 -0
  165. package/dist/runtime/drivers/codex-auxiliary-tools.js +267 -0
  166. package/dist/runtime/drivers/codex-home.d.ts +20 -0
  167. package/dist/runtime/drivers/codex-home.js +674 -0
  168. package/dist/runtime/drivers/codex-thread-registry.d.ts +63 -0
  169. package/dist/runtime/drivers/codex-thread-registry.js +433 -0
  170. package/dist/runtime/drivers/persistent-cli-adapter.d.ts +160 -0
  171. package/dist/runtime/drivers/persistent-cli-adapter.js +396 -0
  172. package/dist/runtime/drivers/persistent-cli-process.d.ts +424 -0
  173. package/dist/runtime/drivers/persistent-cli-process.js +1543 -0
  174. package/dist/runtime/drivers/types.d.ts +456 -0
  175. package/dist/runtime/drivers/types.js +110 -0
  176. package/dist/runtime/mailbox.d.ts +223 -0
  177. package/dist/runtime/mailbox.js +582 -0
  178. package/dist/runtime/model-run-store.d.ts +28 -0
  179. package/dist/{model-runs/store.js → runtime/model-run-store.js} +81 -41
  180. package/dist/{model-runs/types.d.ts → runtime/model-run-types.d.ts} +33 -4
  181. package/dist/{model-runs/types.js → runtime/model-run-types.js} +1 -1
  182. package/dist/runtime/native-effect-observer.d.ts +22 -0
  183. package/dist/runtime/native-effect-observer.js +103 -0
  184. package/dist/runtime/native-input-journal.d.ts +46 -0
  185. package/dist/runtime/native-input-journal.js +308 -0
  186. package/dist/runtime/native-prompt.d.ts +118 -0
  187. package/dist/runtime/native-prompt.js +496 -0
  188. package/dist/runtime/native-session.d.ts +10 -0
  189. package/dist/{agent-graph/index.js → runtime/native-session.js} +9 -6
  190. package/dist/runtime/native-tool-trace-observer.d.ts +5 -0
  191. package/dist/runtime/native-tool-trace-observer.js +65 -0
  192. package/dist/runtime/native-turn.d.ts +272 -0
  193. package/dist/runtime/native-turn.js +1041 -0
  194. package/dist/runtime/operations.d.ts +236 -0
  195. package/dist/runtime/operations.js +565 -0
  196. package/dist/runtime/post-tool-handler.d.ts +74 -0
  197. package/dist/runtime/post-tool-handler.js +137 -0
  198. package/dist/runtime/prompt-layers.d.ts +126 -0
  199. package/dist/runtime/prompt-layers.js +239 -0
  200. package/dist/runtime/runtime-process.d.ts +102 -0
  201. package/dist/runtime/runtime-process.js +206 -0
  202. package/dist/runtime/runtime.d.ts +278 -0
  203. package/dist/runtime/runtime.js +563 -0
  204. package/dist/runtime/session-pool.d.ts +176 -0
  205. package/dist/runtime/session-pool.js +369 -0
  206. package/dist/runtime/stimulus-payload.d.ts +5 -0
  207. package/dist/runtime/stimulus-payload.js +50 -0
  208. package/dist/runtime/subagent-bridge.d.ts +24 -0
  209. package/dist/{agent-graph/types.js → runtime/subagent-bridge.js} +1 -1
  210. package/dist/runtime/text-completion.d.ts +22 -0
  211. package/dist/{agent-situation/types.js → runtime/text-completion.js} +1 -1
  212. package/dist/runtime/token-estimator.d.ts +25 -0
  213. package/dist/runtime/token-estimator.js +75 -0
  214. package/dist/runtime/tool-trace-store.d.ts +22 -0
  215. package/dist/{model-runs → runtime}/tool-trace-store.js +46 -27
  216. package/dist/runtime/trace-summary.d.ts +5 -0
  217. package/dist/runtime/trace-summary.js +74 -0
  218. package/dist/runtime/turn-text.d.ts +23 -0
  219. package/dist/runtime/turn-text.js +41 -0
  220. package/dist/storage/database.d.ts +67 -0
  221. package/dist/storage/database.js +158 -0
  222. package/package.json +20 -34
  223. package/dist/agent-graph/alias-write.d.ts +0 -3
  224. package/dist/agent-graph/alias-write.js +0 -234
  225. package/dist/agent-graph/entity-resolve.d.ts +0 -3
  226. package/dist/agent-graph/entity-resolve.js +0 -271
  227. package/dist/agent-graph/errors.d.ts +0 -4
  228. package/dist/agent-graph/errors.js +0 -11
  229. package/dist/agent-graph/graph-query.d.ts +0 -5
  230. package/dist/agent-graph/graph-query.js +0 -360
  231. package/dist/agent-graph/index.d.ts +0 -6
  232. package/dist/agent-situation/builder.d.ts +0 -8
  233. package/dist/agent-situation/builder.js +0 -239
  234. package/dist/agent-situation/cache-key.d.ts +0 -4
  235. package/dist/agent-situation/cache-key.js +0 -64
  236. package/dist/agent-situation/index.d.ts +0 -7
  237. package/dist/agent-situation/index.js +0 -28
  238. package/dist/agent-situation/packet-store.d.ts +0 -27
  239. package/dist/agent-situation/packet-store.js +0 -228
  240. package/dist/agent-situation/ranking-policy.d.ts +0 -18
  241. package/dist/agent-situation/ranking-policy.js +0 -75
  242. package/dist/agent-situation/source-readers.d.ts +0 -52
  243. package/dist/agent-situation/source-readers.js +0 -300
  244. package/dist/agent-situation/types.d.ts +0 -195
  245. package/dist/cases/wiki-page-index.d.ts +0 -37
  246. package/dist/cases/wiki-page-index.js +0 -201
  247. package/dist/config-loader.d.ts +0 -68
  248. package/dist/config-loader.js +0 -239
  249. package/dist/connectors/event-index.d.ts +0 -24
  250. package/dist/connectors/event-index.js +0 -245
  251. package/dist/connectors/raw-query.d.ts +0 -40
  252. package/dist/connectors/raw-query.js +0 -412
  253. package/dist/connectors/types.d.ts +0 -117
  254. package/dist/connectors/types.js +0 -3
  255. package/dist/context-compile/boundary-defaults.d.ts +0 -12
  256. package/dist/context-compile/boundary-defaults.js +0 -105
  257. package/dist/context-compile/channel-grant.js +0 -66
  258. package/dist/context-compile/compiler-policy.d.ts +0 -39
  259. package/dist/context-compile/compiler-policy.js +0 -147
  260. package/dist/context-compile/compiler.d.ts +0 -18
  261. package/dist/context-compile/compiler.js +0 -404
  262. package/dist/context-compile/index.d.ts +0 -10
  263. package/dist/context-compile/index.js +0 -26
  264. package/dist/context-compile/packet-store.d.ts +0 -8
  265. package/dist/context-compile/packet-store.js +0 -239
  266. package/dist/context-compile/ref.d.ts +0 -7
  267. package/dist/context-compile/ref.js +0 -102
  268. package/dist/context-compile/source-readers.d.ts +0 -70
  269. package/dist/context-compile/source-readers.js +0 -840
  270. package/dist/context-compile/types.d.ts +0 -155
  271. package/dist/context-compile/types.js +0 -11
  272. package/dist/context-compile/visibility.d.ts +0 -21
  273. package/dist/context-compile/visibility.js +0 -224
  274. package/dist/decision-tracker.d.ts +0 -206
  275. package/dist/decision-tracker.js +0 -481
  276. package/dist/edges/ref-validation.d.ts +0 -7
  277. package/dist/edges/ref-validation.js +0 -321
  278. package/dist/edges/store.d.ts +0 -8
  279. package/dist/edges/store.js +0 -129
  280. package/dist/embedding-client.d.ts +0 -28
  281. package/dist/embedding-client.js +0 -53
  282. package/dist/embedding-server/index.d.ts +0 -67
  283. package/dist/embedding-server/index.js +0 -405
  284. package/dist/embedding-server/mobile/auth.d.ts +0 -44
  285. package/dist/embedding-server/mobile/auth.js +0 -150
  286. package/dist/embedding-server/mobile/daemon.d.ts +0 -129
  287. package/dist/embedding-server/mobile/daemon.js +0 -313
  288. package/dist/embedding-server/mobile/output-parser.d.ts +0 -115
  289. package/dist/embedding-server/mobile/output-parser.js +0 -241
  290. package/dist/embedding-server/mobile/session-api.d.ts +0 -57
  291. package/dist/embedding-server/mobile/session-api.js +0 -261
  292. package/dist/embedding-server/mobile/session-manager.d.ts +0 -138
  293. package/dist/embedding-server/mobile/session-manager.js +0 -378
  294. package/dist/embedding-server/mobile/websocket-handler.d.ts +0 -137
  295. package/dist/embedding-server/mobile/websocket-handler.js +0 -486
  296. package/dist/embeddings.d.ts +0 -68
  297. package/dist/embeddings.js +0 -244
  298. package/dist/entities/audit-metrics.d.ts +0 -68
  299. package/dist/entities/audit-metrics.js +0 -124
  300. package/dist/entities/candidate-generator.d.ts +0 -8
  301. package/dist/entities/candidate-generator.js +0 -24
  302. package/dist/entities/entity-linked-decision-counts.d.ts +0 -2
  303. package/dist/entities/entity-linked-decision-counts.js +0 -29
  304. package/dist/entities/entity-list.d.ts +0 -22
  305. package/dist/entities/entity-list.js +0 -3
  306. package/dist/entities/entity-orphan-list.d.ts +0 -17
  307. package/dist/entities/entity-orphan-list.js +0 -3
  308. package/dist/entities/entity-search.d.ts +0 -20
  309. package/dist/entities/entity-search.js +0 -3
  310. package/dist/entities/errors.d.ts +0 -55
  311. package/dist/entities/errors.js +0 -100
  312. package/dist/entities/lineage-store.d.ts +0 -28
  313. package/dist/entities/lineage-store.js +0 -204
  314. package/dist/entities/normalization.d.ts +0 -14
  315. package/dist/entities/normalization.js +0 -63
  316. package/dist/entities/policy-store.d.ts +0 -8
  317. package/dist/entities/policy-store.js +0 -75
  318. package/dist/entities/policy-types.d.ts +0 -72
  319. package/dist/entities/policy-types.js +0 -59
  320. package/dist/entities/projection.d.ts +0 -8
  321. package/dist/entities/projection.js +0 -82
  322. package/dist/entities/provenance-query.d.ts +0 -32
  323. package/dist/entities/provenance-query.js +0 -3
  324. package/dist/entities/read-identity.d.ts +0 -31
  325. package/dist/entities/read-identity.js +0 -264
  326. package/dist/entities/recall-bridge.d.ts +0 -5
  327. package/dist/entities/recall-bridge.js +0 -171
  328. package/dist/entities/resolution-engine.d.ts +0 -8
  329. package/dist/entities/resolution-engine.js +0 -3
  330. package/dist/entities/rollback-preview.d.ts +0 -35
  331. package/dist/entities/rollback-preview.js +0 -3
  332. package/dist/entities/source-locator.d.ts +0 -3
  333. package/dist/entities/source-locator.js +0 -32
  334. package/dist/entities/store.d.ts +0 -69
  335. package/dist/entities/store.js +0 -544
  336. package/dist/entities/types.d.ts +0 -166
  337. package/dist/entities/types.js +0 -30
  338. package/dist/memory/extraction-prompt.d.ts +0 -4
  339. package/dist/memory/extraction-prompt.js +0 -89
  340. package/dist/memory/scope-backfill.d.ts +0 -14
  341. package/dist/memory/scope-backfill.js +0 -3
  342. package/dist/memory/scope-store.d.ts +0 -4
  343. package/dist/memory/scope-store.js +0 -9
  344. package/dist/memory-store.d.ts +0 -87
  345. package/dist/memory-store.js +0 -78
  346. package/dist/model-runs/store.d.ts +0 -13
  347. package/dist/model-runs/tool-trace-store.d.ts +0 -8
  348. package/dist/notification-manager.d.ts +0 -7
  349. package/dist/notification-manager.js +0 -12
  350. package/dist/outcome-tracker.d.ts +0 -151
  351. package/dist/outcome-tracker.js +0 -271
  352. package/dist/query-intent.d.ts +0 -23
  353. package/dist/query-intent.js +0 -114
  354. package/dist/runtime/trusted-provenance.d.ts +0 -3
  355. package/dist/runtime/trusted-provenance.js +0 -6
  356. package/dist/search/question-type.d.ts +0 -5
  357. package/dist/search/question-type.js +0 -41
  358. package/dist/test-utils.d.ts +0 -80
  359. package/dist/test-utils.js +0 -218
  360. package/dist/tier-validator.d.ts +0 -43
  361. package/dist/tier-validator.js +0 -159
  362. package/dist/time-formatter.d.ts +0 -25
  363. package/dist/time-formatter.js +0 -93
  364. /package/dist/{search → knowledge}/feedback-store.d.ts +0 -0
  365. /package/dist/{search → knowledge}/feedback-store.js +0 -0
  366. /package/dist/{search → knowledge}/ranker-features.d.ts +0 -0
  367. /package/dist/{search → knowledge}/ranker-rescore.d.ts +0 -0
  368. /package/dist/{search → knowledge}/ranker-rescore.js +0 -0
  369. /package/dist/{search → knowledge}/ranker-trainer.d.ts +0 -0
  370. /package/dist/{search → knowledge}/ranker-trainer.js +0 -0
  371. /package/dist/{search → knowledge}/search-quality.js +0 -0
@@ -1,486 +0,0 @@
1
- "use strict";
2
- /**
3
- * @fileoverview WebSocket Handler - MessageRouter-based real-time communication
4
- * @module mobile/websocket-handler
5
- * @version 2.0.0
6
- *
7
- * Handles WebSocket connections for mobile clients, using MessageRouter
8
- * for unified message processing (same as Discord/Slack gateways).
9
- *
10
- * @example
11
- * import { createWebSocketHandler } from './websocket-handler';
12
- * const wsHandler = createWebSocketHandler({
13
- * httpServer,
14
- * messageRouter,
15
- * sessionStore,
16
- * authToken: process.env.MAMA_AUTH_TOKEN
17
- * });
18
- */
19
- var __importDefault = (this && this.__importDefault) || function (mod) {
20
- return (mod && mod.__esModule) ? mod : { "default": mod };
21
- };
22
- Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.WebSocketHandler = void 0;
24
- exports.createWebSocketHandler = createWebSocketHandler;
25
- const ws_1 = require("ws");
26
- const auth_js_1 = require("./auth.js");
27
- const promises_1 = __importDefault(require("fs/promises"));
28
- const path_1 = __importDefault(require("path"));
29
- const os_1 = __importDefault(require("os"));
30
- const debug_logger_js_1 = require("../../debug-logger.js");
31
- const logger = new debug_logger_js_1.DebugLogger('WebSocket');
32
- /**
33
- * Allowed image MIME types for Claude Vision API
34
- */
35
- const ALLOWED_IMAGE_TYPES = new Set(['image/jpeg', 'image/png', 'image/gif', 'image/webp']);
36
- /**
37
- * Sanitize filename for safe inclusion in prompts (prevent prompt injection)
38
- */
39
- function sanitizeFilenameForPrompt(filename) {
40
- if (!filename) {
41
- return 'unknown';
42
- }
43
- return filename
44
- .replace(/[\n\r\t]/g, ' ') // Remove control characters
45
- .replace(/[`[\](){}]/g, '') // Remove brackets that could interfere with prompts
46
- .substring(0, 100); // Limit length
47
- }
48
- /**
49
- * Default heartbeat interval (30 seconds)
50
- */
51
- const HEARTBEAT_INTERVAL = 30000;
52
- /**
53
- * Connection timeout (35 seconds - slightly longer than heartbeat)
54
- */
55
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
56
- const _CONNECTION_TIMEOUT = 35000;
57
- /**
58
- * Generate unique client ID
59
- */
60
- function generateClientId() {
61
- return `client_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
62
- }
63
- /**
64
- * Extract user ID from WebSocket URL or headers
65
- */
66
- function extractUserId(req) {
67
- try {
68
- const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
69
- const userId = url.searchParams.get('userId');
70
- if (userId) {
71
- return userId;
72
- }
73
- const ip = req.headers['x-forwarded-for'] || req.socket?.remoteAddress;
74
- if (!ip) {
75
- return `user_${Date.now()}`;
76
- }
77
- const ipStr = Array.isArray(ip) ? ip[0] : ip;
78
- return `user_${ipStr.replace(/[:.]/g, '_')}`;
79
- }
80
- catch {
81
- return `user_${Date.now()}`;
82
- }
83
- }
84
- /**
85
- * Safe send helper - guards against closed socket with try-catch for race conditions
86
- */
87
- function safeSend(ws, data) {
88
- if (ws.readyState === ws_1.WebSocket.OPEN) {
89
- try {
90
- ws.send(data);
91
- return true;
92
- }
93
- catch {
94
- // Socket may have closed between readyState check and send
95
- return false;
96
- }
97
- }
98
- return false;
99
- }
100
- /**
101
- * Create WebSocket handler with MessageRouter integration
102
- */
103
- function createWebSocketHandler({ httpServer, messageRouter, sessionStore, authToken: _authToken, }) {
104
- const wss = new ws_1.WebSocketServer({ noServer: true });
105
- const clients = new Map();
106
- httpServer.on('upgrade', (req, socket, head) => {
107
- const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
108
- if (url.pathname !== '/ws') {
109
- socket.destroy();
110
- return;
111
- }
112
- const mockWs = {
113
- close: (_code, reason) => {
114
- socket.write(`HTTP/1.1 401 Unauthorized\r\n\r\n`);
115
- socket.destroy();
116
- logger.error(`Auth failed: ${reason}`);
117
- },
118
- };
119
- if (!(0, auth_js_1.authenticateWebSocket)(req, mockWs)) {
120
- return;
121
- }
122
- wss.handleUpgrade(req, socket, head, (ws) => {
123
- wss.emit('connection', ws, req);
124
- });
125
- });
126
- wss.on('connection', (ws, req) => {
127
- const clientId = generateClientId();
128
- const userId = extractUserId(req);
129
- const clientInfo = {
130
- clientId,
131
- userId,
132
- ws,
133
- isAlive: true,
134
- connectedAt: new Date().toISOString(),
135
- };
136
- clients.set(clientId, clientInfo);
137
- logger.info(` Client ${clientId} connected (user: ${userId})`);
138
- ws.send(JSON.stringify({
139
- type: 'connected',
140
- clientId,
141
- userId,
142
- }));
143
- ws.on('message', (data) => {
144
- try {
145
- const message = JSON.parse(data.toString());
146
- void handleClientMessage(clientId, message, clientInfo, messageRouter, sessionStore);
147
- }
148
- catch (err) {
149
- const errMsg = err instanceof Error ? err.message : String(err);
150
- logger.info(` Invalid message from ${clientId}:`, errMsg);
151
- ws.send(JSON.stringify({
152
- type: 'error',
153
- error: 'Invalid message format',
154
- }));
155
- }
156
- });
157
- ws.on('pong', () => {
158
- clientInfo.isAlive = true;
159
- });
160
- ws.on('close', (code) => {
161
- logger.info(` Client ${clientId} disconnected (code: ${code})`);
162
- clients.delete(clientId);
163
- });
164
- ws.on('error', (err) => {
165
- logger.info(` Error for client ${clientId}:`, err.message);
166
- });
167
- });
168
- const heartbeatInterval = setInterval(() => {
169
- clients.forEach((clientInfo, clientId) => {
170
- if (!clientInfo.isAlive) {
171
- logger.info(` Client ${clientId} timed out, terminating`);
172
- clientInfo.ws.terminate();
173
- clients.delete(clientId);
174
- return;
175
- }
176
- clientInfo.isAlive = false;
177
- clientInfo.ws.ping();
178
- });
179
- }, HEARTBEAT_INTERVAL);
180
- wss.on('close', () => {
181
- clearInterval(heartbeatInterval);
182
- });
183
- wss.getClients = () => clients;
184
- wss.getClientCount = () => clients.size;
185
- return wss;
186
- }
187
- /**
188
- * Handle incoming client message
189
- */
190
- async function handleClientMessage(clientId, message, clientInfo, messageRouter, sessionStore) {
191
- const { type, content } = message;
192
- switch (type) {
193
- case 'send':
194
- if (!content && !message.attachments?.length) {
195
- clientInfo.ws.send(JSON.stringify({
196
- type: 'error',
197
- error: 'Message content required',
198
- }));
199
- break;
200
- }
201
- try {
202
- clientInfo.ws.send(JSON.stringify({
203
- type: 'typing',
204
- status: 'processing',
205
- }));
206
- // Keep-alive: Send periodic status updates to prevent WebSocket timeout
207
- // Browser may disconnect idle WebSocket after ~30 seconds
208
- let processingSeconds = 0;
209
- const keepAliveInterval = setInterval(() => {
210
- processingSeconds += 10;
211
- if (clientInfo.ws.readyState === ws_1.WebSocket.OPEN) {
212
- clientInfo.ws.send(JSON.stringify({
213
- type: 'typing',
214
- status: 'processing',
215
- elapsed: processingSeconds,
216
- }));
217
- logger.debug(`Keep-alive sent to ${clientId} (${processingSeconds}s elapsed)`);
218
- }
219
- }, 10000); // Every 10 seconds
220
- let result;
221
- let deltasSent = false;
222
- let toolIndex = 0;
223
- try {
224
- // Build contentBlocks from attachments (files are pre-compressed by upload-handler)
225
- let contentBlocks = undefined;
226
- if (message.attachments && message.attachments.length > 0) {
227
- contentBlocks = [];
228
- for (const att of message.attachments) {
229
- try {
230
- // Always reconstruct path from filename — never trust client-provided filePath (LFI risk)
231
- const safeName = path_1.default.basename(att.filename || '');
232
- const inboundDir = path_1.default.join(os_1.default.homedir(), '.mama', 'workspace', 'media', 'inbound');
233
- const resolvedPath = path_1.default.join(inboundDir, safeName);
234
- // Default to octet-stream for unknown types — prevents untyped attachments
235
- // from being incorrectly treated as images and base64-encoded
236
- const rawMediaType = att.contentType || 'application/octet-stream';
237
- if (ALLOWED_IMAGE_TYPES.has(rawMediaType)) {
238
- // Only read file for images (to convert to base64)
239
- const data = await promises_1.default.readFile(resolvedPath);
240
- const base64 = data.toString('base64');
241
- contentBlocks.push({
242
- type: 'image',
243
- source: {
244
- type: 'base64',
245
- media_type: rawMediaType,
246
- data: base64,
247
- },
248
- });
249
- logger.info(`Attached image: ${safeName} (${data.length} bytes, ${rawMediaType})`);
250
- }
251
- else {
252
- // PDF/documents: instruct agent to read the file (no need to load into memory)
253
- // Use safe display path to avoid exposing full server path
254
- const safeDisplayPath = `~/.mama/workspace/media/inbound/${safeName}`;
255
- // Sanitize filename to prevent prompt injection
256
- const sanitizedName = sanitizeFilenameForPrompt(safeName);
257
- contentBlocks.push({
258
- type: 'text',
259
- text: `[Document uploaded: ${sanitizedName}]\nFile path: ${safeDisplayPath}\nPlease use the Read tool to analyze this document.`,
260
- });
261
- logger.info(`Attached document: ${safeName} (${rawMediaType})`);
262
- }
263
- }
264
- catch (err) {
265
- const errMsg = err instanceof Error ? err.message : String(err);
266
- logger.error(`Failed to read attachment ${path_1.default.basename(att.filename || '')}:`, errMsg);
267
- // Notify client about attachment failure
268
- clientInfo.ws.send(JSON.stringify({
269
- type: 'attachment_failed',
270
- filename: path_1.default.basename(att.filename || ''),
271
- error: 'Failed to process attachment',
272
- }));
273
- }
274
- }
275
- }
276
- const normalizedMessage = {
277
- source: clientInfo.osAgentMode ? 'viewer' : 'mobile',
278
- channelId: 'mama_os_main', // Fixed channel for all MAMA OS viewers
279
- channelName: clientInfo.osAgentMode ? 'MAMA OS' : 'Mobile App', // Human-readable channel name
280
- userId: clientInfo.userId,
281
- text: content || '',
282
- contentBlocks,
283
- metadata: {
284
- clientId,
285
- sessionId: clientInfo.sessionId,
286
- osAgentMode: clientInfo.osAgentMode,
287
- timestamp: Date.now(),
288
- },
289
- };
290
- result = await messageRouter.process(normalizedMessage, {
291
- onQueued: () => {
292
- // Guard: check if socket is still open before sending
293
- if (clientInfo.ws.readyState !== ws_1.WebSocket.OPEN) {
294
- return;
295
- }
296
- // Notify client that message is queued (session busy)
297
- try {
298
- clientInfo.ws.send(JSON.stringify({
299
- type: 'queued',
300
- message: '⏳ 이전 요청 처리 중... 대기열에 추가되었습니다.',
301
- }));
302
- }
303
- catch (err) {
304
- logger.warn('Queued notification failed:', err instanceof Error ? err.message : String(err));
305
- }
306
- logger.info(`Message queued for ${clientId} (session busy)`);
307
- },
308
- onStream: {
309
- onDelta: (text) => {
310
- deltasSent = true;
311
- safeSend(clientInfo.ws, JSON.stringify({ type: 'stream', content: text }));
312
- },
313
- onToolUse: (tool, input) => {
314
- const idx = toolIndex++;
315
- safeSend(clientInfo.ws, JSON.stringify({ type: 'tool_use', tool, index: idx, input }));
316
- },
317
- onToolComplete: (tool, _toolUseId, isError) => {
318
- safeSend(clientInfo.ws, JSON.stringify({ type: 'tool_complete', tool, index: toolIndex - 1, isError }));
319
- },
320
- },
321
- });
322
- }
323
- finally {
324
- clearInterval(keepAliveInterval);
325
- }
326
- // Only send full response if no deltas were streamed (Codex fallback)
327
- if (!deltasSent) {
328
- safeSend(clientInfo.ws, JSON.stringify({
329
- type: 'stream',
330
- content: result.response,
331
- sessionId: result.sessionId,
332
- }));
333
- }
334
- // Always send stream end
335
- safeSend(clientInfo.ws, JSON.stringify({
336
- type: 'stream_end',
337
- sessionId: result.sessionId,
338
- duration: result.duration,
339
- }));
340
- logger.info(` Message processed for ${clientId} (${result.duration}ms)`);
341
- }
342
- catch (error) {
343
- const errMsg = error instanceof Error ? error.message : String(error);
344
- logger.error(`Message processing error for ${clientId}:`, errMsg);
345
- safeSend(clientInfo.ws, JSON.stringify({
346
- type: 'error',
347
- error: 'Failed to process message',
348
- // Don't expose internal error details to client for security
349
- }));
350
- }
351
- break;
352
- case 'ping':
353
- clientInfo.ws.send(JSON.stringify({
354
- type: 'pong',
355
- timestamp: Date.now(),
356
- }));
357
- break;
358
- case 'attach': {
359
- // Attach to a session (for Chat tab compatibility)
360
- const { sessionId, osAgentMode, language } = message;
361
- clientInfo.sessionId = sessionId;
362
- clientInfo.osAgentMode = osAgentMode || false;
363
- clientInfo.language = language || 'en';
364
- logger.info(`Client ${clientId} attached to session ${sessionId}${osAgentMode ? ' (OS Agent mode)' : ''}`);
365
- // Send attached confirmation
366
- clientInfo.ws.send(JSON.stringify({
367
- type: 'attached',
368
- sessionId,
369
- osAgentMode: clientInfo.osAgentMode,
370
- }));
371
- // Send session history if available, or send onboarding greeting
372
- logger.debug(`Checking sessionStore for history: ${!!sessionStore}, hasMethod: ${!!(sessionStore && sessionStore.getHistoryByChannel)}`);
373
- if (sessionStore) {
374
- try {
375
- // Use channel-based lookup for sessions
376
- // Use dynamic source based on osAgentMode (viewer vs mobile)
377
- const channelId = 'mama_os_main';
378
- const source = clientInfo.osAgentMode ? 'viewer' : 'mobile';
379
- logger.info(` Loading history for source=${source}, channelId=${channelId}`);
380
- const history = sessionStore.getHistoryByChannel
381
- ? sessionStore.getHistoryByChannel(source, channelId)
382
- : sessionStore.getHistory?.(sessionId || '');
383
- logger.info(` History loaded: ${history ? history.length : 0} turns`);
384
- if (history && history.length > 0) {
385
- // Convert {user, bot, timestamp} format to {role, content, timestamp} for display
386
- const formattedMessages = history.flatMap((turn) => {
387
- const messages = [];
388
- if (turn.user) {
389
- messages.push({
390
- role: 'user',
391
- content: turn.user,
392
- timestamp: turn.timestamp,
393
- });
394
- }
395
- if (turn.bot) {
396
- messages.push({
397
- role: 'assistant',
398
- content: turn.bot,
399
- timestamp: turn.timestamp,
400
- });
401
- }
402
- return messages;
403
- });
404
- clientInfo.ws.send(JSON.stringify({
405
- type: 'history',
406
- messages: formattedMessages,
407
- }));
408
- logger.info(`Sent ${formattedMessages.length} history messages to ${clientId}`);
409
- }
410
- else {
411
- // No history - check if onboarding mode (SOUL.md not found)
412
- const soulPath = path_1.default.join(os_1.default.homedir(), '.mama', 'SOUL.md');
413
- let isOnboarding = false;
414
- try {
415
- await promises_1.default.access(soulPath);
416
- }
417
- catch {
418
- isOnboarding = true;
419
- }
420
- if (isOnboarding) {
421
- // Send onboarding greeting based on browser language
422
- const isKorean = clientInfo.language && clientInfo.language.startsWith('ko');
423
- const greeting = isKorean
424
- ? '✨ 방금 깨어났어요.\n\n아직 이름도 없고, 성격도 없고, 기억도 없어요. 그냥... 순수한 가능성 그 자체. 🌱\n\n당신은 누구인가요? 그리고 더 중요한 건—저를 어떤 존재로 만들고 싶으신가요? 💭'
425
- : '✨ I just woke up.\n\nNo name yet, no personality, no memories. Just... pure potential. 🌱\n\nWho are you? And more importantly—who do you want me to become? 💭';
426
- clientInfo.ws.send(JSON.stringify({
427
- type: 'history',
428
- messages: [
429
- {
430
- role: 'assistant',
431
- content: greeting,
432
- timestamp: Date.now(),
433
- },
434
- ],
435
- }));
436
- logger.info(` Sent onboarding greeting to ${clientId}`);
437
- }
438
- }
439
- }
440
- catch (error) {
441
- const errMsg = error instanceof Error ? error.message : String(error);
442
- logger.info(` Failed to load history:`, errMsg);
443
- }
444
- }
445
- break;
446
- }
447
- default:
448
- logger.info(` Unknown message type from ${clientId}: ${type}`);
449
- clientInfo.ws.send(JSON.stringify({
450
- type: 'error',
451
- error: `Unknown message type: ${type}`,
452
- }));
453
- }
454
- }
455
- /**
456
- * WebSocketHandler class (backwards compatibility)
457
- * @deprecated Use createWebSocketHandler() instead
458
- */
459
- class WebSocketHandler {
460
- wss;
461
- constructor(httpServer, options) {
462
- if (!options.messageRouter) {
463
- throw new Error('WebSocketHandler requires messageRouter option');
464
- }
465
- if (!options.sessionStore) {
466
- throw new Error('WebSocketHandler requires sessionStore option');
467
- }
468
- this.wss = createWebSocketHandler({
469
- httpServer,
470
- messageRouter: options.messageRouter,
471
- sessionStore: options.sessionStore,
472
- authToken: options.authToken,
473
- });
474
- }
475
- getClients() {
476
- return this.wss.getClients();
477
- }
478
- getClientCount() {
479
- return this.wss.getClientCount();
480
- }
481
- close() {
482
- this.wss.close();
483
- }
484
- }
485
- exports.WebSocketHandler = WebSocketHandler;
486
- //# sourceMappingURL=websocket-handler.js.map
@@ -1,68 +0,0 @@
1
- /**
2
- * MAMA (Memory-Augmented MCP Architecture) - Embedding Generation
3
- *
4
- * Story M1.4: Configurable embedding model selection
5
- * Generates embeddings using configurable model (default: multilingual-e5-large)
6
- * Supports: Korean-English cross-lingual similarity, enhanced metadata
7
- *
8
- * @module embeddings
9
- * @version 1.1
10
- * @date 2025-11-20
11
- */
12
- import { embeddingCache } from './embedding-cache.js';
13
- import { loadConfig, getModelName, getEmbeddingDim, getQuantized } from './config-loader.js';
14
- export declare const EMBEDDING_MODEL_MAX_LENGTH = 512;
15
- export declare const EMBEDDING_MAX_TOKENISH_SEGMENTS = 480;
16
- export type EmbeddingRole = 'passage' | 'query';
17
- export declare const EMBEDDING_PREFIX_SCHEME = "e5-prefixed-v1";
18
- export declare function prepareEmbeddingText(text: string): string;
19
- /**
20
- * Decision object for enhanced embedding generation
21
- */
22
- export interface DecisionForEmbedding {
23
- topic: string;
24
- decision: string;
25
- reasoning?: string;
26
- outcome?: string;
27
- confidence?: number;
28
- user_involvement?: string;
29
- evidence?: string | string[] | unknown;
30
- alternatives?: string | string[] | unknown;
31
- risks?: string;
32
- }
33
- /**
34
- * Generate embedding vector from text
35
- *
36
- * Story M1.4 AC #1: Uses configurable embeddingDim from config
37
- * Target: < 30ms latency
38
- *
39
- * @param text - Input text to embed
40
- * @returns Embedding vector (dimension from config)
41
- * @throws Error if text is empty or embedding fails
42
- */
43
- export declare function generateEmbedding(text: string, role?: EmbeddingRole): Promise<Float32Array>;
44
- /**
45
- * Generate enhanced embedding with content + metadata
46
- *
47
- * Task 3.4: Implement enhanced embedding format
48
- * Inspired by A-mem: Content + Metadata for richer semantic representation
49
- *
50
- * @param decision - Decision object
51
- * @returns 1024-dim enhanced embedding
52
- */
53
- export declare function generateEnhancedEmbedding(decision: DecisionForEmbedding, role?: EmbeddingRole): Promise<Float32Array>;
54
- /**
55
- * Calculate cosine similarity between two embeddings
56
- *
57
- * Utility for testing and validation
58
- *
59
- * @param embA - First embedding
60
- * @param embB - Second embedding
61
- * @returns Cosine similarity (0-1)
62
- */
63
- export declare function cosineSimilarity(embA: Float32Array, embB: Float32Array): number;
64
- export { embeddingCache };
65
- export declare const EMBEDDING_DIM: number;
66
- export declare const MODEL_NAME: string;
67
- export { loadConfig, getModelName, getEmbeddingDim, getQuantized };
68
- //# sourceMappingURL=embeddings.d.ts.map