@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
@@ -0,0 +1,424 @@
1
+ /**
2
+ * Persistent Claude CLI Process - Keeps Claude alive for multi-turn conversations
3
+ *
4
+ * WHY THIS EXISTS:
5
+ * - Previous approach spawned new Claude CLI process for each message
6
+ * - Each spawn required ~20K system prompt to be sent every time
7
+ * - Result: Slow responses (16-30 seconds per message)
8
+ *
9
+ * NEW ARCHITECTURE:
10
+ * - Keep Claude process alive using stream-json input/output
11
+ * - Send messages via stdin, receive responses via stdout
12
+ * - Session memory preserved in Claude's context
13
+ * - System prompt sent only once at process start
14
+ *
15
+ * STREAM-JSON PROTOCOL:
16
+ * Input (stdin):
17
+ * User message: {"type":"user","message":{"role":"user","content":"..."}}
18
+ * Tool result: {"type":"user","message":{"role":"user","content":[{"type":"tool_result","tool_use_id":"xxx","content":"...","is_error":false}]}}
19
+ *
20
+ * Output (stdout):
21
+ * Init: {"type":"system","subtype":"init",...}
22
+ * Assistant: {"type":"assistant","message":{...}}
23
+ * Tool use: Content block with type="tool_use" in assistant message
24
+ * Result: {"type":"result","subtype":"success",...}
25
+ */
26
+ import { EventEmitter } from 'events';
27
+ import { type SessionPolicyStatus } from './types.js';
28
+ import { type PromptCallbacks, type PromptResult, type TokenUsageRecord } from './types.js';
29
+ export interface PersistentProcessOptions {
30
+ sessionId: string;
31
+ /**
32
+ * Timeouts the product states. A driver does not read a config file: the
33
+ * numbers arrive with the options, and the defaults below are what a caller
34
+ * that states nothing gets.
35
+ */
36
+ /**
37
+ * The isolated workspace this process runs in, and the empty plugin
38
+ * directory that keeps the host's global plugins out of every turn. The
39
+ * product states both; the driver only creates and uses them. The values
40
+ * are a product decision recorded in its CLAUDE.md — a driver that invented
41
+ * them would be deciding where another system keeps its files.
42
+ */
43
+ /**
44
+ * Where this run keeps its files. Required: a driver does not know a product's
45
+ * directory name, and the default it used to compute spelled one out.
46
+ */
47
+ workspaceDir: string;
48
+ timeouts?: {
49
+ requestMs?: number;
50
+ idleMs?: number;
51
+ sessionMs?: number;
52
+ cleanupMs?: number;
53
+ pendingToolMs?: number;
54
+ };
55
+ /** Host-computed authority fingerprint bound to this process generation. */
56
+ policyFingerprint?: string;
57
+ model?: string;
58
+ systemPrompt?: string;
59
+ mcpConfigPath?: string;
60
+ /**
61
+ * Skip permission prompts for tool execution
62
+ *
63
+ * @warning SECURITY RISK: Bypasses all permission checks.
64
+ * Only enable in trusted environments where agent actions are pre-approved.
65
+ */
66
+ dangerouslySkipPermissions?: boolean;
67
+ /** Noninteractive consumers use dontAsk with explicit permission rules. */
68
+ permissionMode?: 'default' | 'acceptEdits' | 'dontAsk' | 'plan';
69
+ useGatewayTools?: boolean;
70
+ /** Timeout for each request in ms (default: 120000) */
71
+ requestTimeout?: number;
72
+ /** Idle timeout for pooled persistent processes in ms (default: session_ms) */
73
+ idleTimeoutMs?: number;
74
+ /** Cleanup interval for pooled persistent processes in ms (default: session_cleanup_ms) */
75
+ cleanupIntervalMs?: number;
76
+ /** Maximum time to keep a process waiting for host-side tool results (default: max(4 * idleTimeoutMs, 30m)) */
77
+ pendingToolUseTimeoutMs?: number;
78
+ /** Environment variables to pass to the Claude CLI process */
79
+ env?: Record<string, string>;
80
+ /** Complete inherited environment supplied by the consumer; env is applied afterward. */
81
+ processEnv?: NodeJS.ProcessEnv;
82
+ /** Structurally allowed tools (--allowedTools CLI flag) */
83
+ allowedTools?: string[];
84
+ /** Structurally disallowed tools (--disallowedTools CLI flag) */
85
+ disallowedTools?: string[];
86
+ /** Override built-in tool set (--tools CLI flag). Use "" to disable all tools. */
87
+ tools?: string;
88
+ /** Override plugin directory (--plugin-dir CLI flag). Use empty dir to disable plugins. */
89
+ pluginDir?: string;
90
+ /** Optional callback for recording token usage */
91
+ onTokenUsage?: (record: TokenUsageRecord) => void;
92
+ /** Channel key for token usage tracking */
93
+ channelKey?: string;
94
+ /** Agent ID for token usage tracking */
95
+ agentId?: string;
96
+ /** Effort level for Claude 4.6 adaptive thinking */
97
+ effort?: 'low' | 'medium' | 'high' | 'max';
98
+ }
99
+ export interface PersistentProcessAcquireResult {
100
+ process: PersistentClaudeProcess;
101
+ created: boolean;
102
+ }
103
+ export type { ToolUseBlock } from './types.js';
104
+ export interface ContentBlock {
105
+ type: 'text' | 'tool_use' | 'tool_result';
106
+ text?: string;
107
+ id?: string;
108
+ name?: string;
109
+ input?: Record<string, unknown>;
110
+ tool_use_id?: string;
111
+ content?: string | Array<{
112
+ type: string;
113
+ text?: string;
114
+ }>;
115
+ is_error?: boolean;
116
+ }
117
+ export interface StreamMessage {
118
+ type: 'system' | 'assistant' | 'result' | 'error' | 'user';
119
+ subtype?: string;
120
+ uuid?: string;
121
+ origin?: {
122
+ kind: string;
123
+ };
124
+ /**
125
+ * Set by the CLI on events produced INSIDE a subagent (the Agent tool_use id that
126
+ * started it). It is the only non-heuristic way to tell a child's tool calls from the
127
+ * parent's on one stream; absent/null means "this stream position", not "parent".
128
+ */
129
+ parent_tool_use_id?: string | null;
130
+ /** Background-task identity on `system` task_* events; field name varies by CLI build. */
131
+ task_id?: string;
132
+ taskId?: string;
133
+ task?: {
134
+ id?: string;
135
+ status?: string;
136
+ description?: string;
137
+ agentId?: string;
138
+ };
139
+ agent_id?: string;
140
+ agentId?: string;
141
+ message?: {
142
+ role: string;
143
+ content: ContentBlock[] | string;
144
+ model?: string;
145
+ id?: string;
146
+ usage?: {
147
+ input_tokens: number;
148
+ output_tokens: number;
149
+ cache_read_input_tokens?: number;
150
+ cache_creation_input_tokens?: number;
151
+ };
152
+ };
153
+ result?: string;
154
+ session_id?: string;
155
+ total_cost_usd?: number;
156
+ usage?: {
157
+ input_tokens: number;
158
+ output_tokens: number;
159
+ cache_read_input_tokens?: number;
160
+ cache_creation_input_tokens?: number;
161
+ };
162
+ duration_ms?: number;
163
+ num_turns?: number;
164
+ is_error?: boolean;
165
+ error?: string;
166
+ }
167
+ export type { PromptCallbacks, PromptResult };
168
+ type ProcessState = 'idle' | 'busy' | 'starting' | 'dead';
169
+ /** Host-visible spawn/finish of a native background Agent on the Claude stream. */
170
+ export interface ClaudeSubagentStreamEvent {
171
+ kind: 'started' | 'completed';
172
+ agentThreadId: string;
173
+ agentPath: string;
174
+ itemId: string;
175
+ status?: 'completed' | 'unknown';
176
+ finalText?: string;
177
+ /**
178
+ * False when the CLI opened its own follow-up turn for the notification: that turn IS
179
+ * the owner reacting, so the host must not enqueue a second one.
180
+ */
181
+ wakeRequired: boolean;
182
+ }
183
+ /** A turn the CLI begins on its own after a background task notification (no stdin). */
184
+ export interface ClaudeAutonomousTurnEvent {
185
+ agentThreadId: string;
186
+ agentPath: string;
187
+ itemId: string;
188
+ }
189
+ export interface ClaudeAutonomousTurnResultEvent extends ClaudeAutonomousTurnEvent {
190
+ text: string;
191
+ isError: boolean;
192
+ }
193
+ /**
194
+ * PersistentClaudeProcess - Manages a single long-lived Claude CLI process
195
+ *
196
+ * Features:
197
+ * - Keeps Claude process alive for multiple messages
198
+ * - Uses stream-json for bidirectional communication
199
+ * - Handles tool execution via Gateway Tools
200
+ * - Auto-restarts on process death
201
+ */
202
+ export declare class PersistentClaudeProcess extends EventEmitter {
203
+ private process;
204
+ private options;
205
+ private state;
206
+ private outputBuffer;
207
+ private currentCallbacks;
208
+ /**
209
+ * The most recent request that offered a follow-up sink. A CLI turn that no stdin request
210
+ * and no tracked child explains (a grandchild's task notification, measured 2026-09-10)
211
+ * still answers SOMEONE: the last request that asked.
212
+ */
213
+ private lastFollowUp;
214
+ private currentResolve;
215
+ private currentReject;
216
+ private currentInputUuid;
217
+ private inputAcknowledged;
218
+ private requestTimeoutHandle;
219
+ private toolUseBlocks;
220
+ private readonly promptToolExchanges;
221
+ private completedToolExchanges;
222
+ private awaitingToolResults;
223
+ private pendingToolUseStartedAt;
224
+ private accumulatedText;
225
+ private startPromise;
226
+ private onTokenUsage?;
227
+ /** Live + just-finished native background Agents, keyed by their `Agent` tool_use id. */
228
+ private readonly backgroundAgents;
229
+ /**
230
+ * True once a turn's `result` resolved while a background child was still running. From
231
+ * then until the next stdin request, unattributed assistant/user events on the stream
232
+ * belong to that child, not to a parent turn that no longer exists.
233
+ */
234
+ private parentTurnEnded;
235
+ /** Set between a `task_notification` and the CLI's own follow-up turn. */
236
+ private pendingNotification;
237
+ /** The CLI-initiated turn currently running with no stdin request behind it. */
238
+ private autonomousTurn;
239
+ /**
240
+ * Resolve the effective request timeout in ms.
241
+ * 0 = unlimited (no timeout). Returns the configured or default value.
242
+ */
243
+ private _getRequestTimeoutMs;
244
+ constructor(options: PersistentProcessOptions);
245
+ /**
246
+ * Start the Claude CLI process
247
+ *
248
+ * Note: The CLI only emits the 'init' event after receiving the first user message.
249
+ * So we don't wait for init here - we just start the process and let it run.
250
+ * The first sendMessage() call will handle init as part of its response flow.
251
+ */
252
+ start(): Promise<void>;
253
+ private doStart;
254
+ /**
255
+ * Build CLI arguments for stream-json mode
256
+ */
257
+ private buildArgs;
258
+ /**
259
+ * Send a user message to Claude
260
+ */
261
+ sendMessage(content: string, callbacks?: PromptCallbacks, nativeInputId?: string): Promise<PromptResult>;
262
+ /**
263
+ * Send a tool result back to Claude
264
+ */
265
+ sendToolResult(toolUseId: string, result: string, isError?: boolean, callbacks?: PromptCallbacks): Promise<PromptResult>;
266
+ /**
267
+ * Send multiple tool results back to Claude in a single message.
268
+ * Required when Claude requests multiple tools in one turn.
269
+ */
270
+ sendToolResults(results: Array<{
271
+ tool_use_id: string;
272
+ content: string;
273
+ is_error: boolean;
274
+ }>, callbacks?: PromptCallbacks): Promise<PromptResult>;
275
+ /**
276
+ * Handle stdout data
277
+ */
278
+ private handleStdout;
279
+ /**
280
+ * Process a parsed event from stdout
281
+ */
282
+ private processEvent;
283
+ private recordToolUse;
284
+ private trackBackgroundAgent;
285
+ private pruneBackgroundAgents;
286
+ /** The newest tracked agent matching a predicate; `system` task events carry no item id. */
287
+ private latestBackgroundAgent;
288
+ private taskIdentityOf;
289
+ private recordBackgroundTaskStarted;
290
+ /** Lift the child's id out of the "Async agent launched" tool_result text. */
291
+ private recordBackgroundLaunchResult;
292
+ private fireSubagentStart;
293
+ /**
294
+ * Which background child an assistant/user event belongs to, or null for the parent.
295
+ *
296
+ * `parent_tool_use_id` is authoritative when the CLI stamps it. Without it the only
297
+ * honest signal is position: the parent turn already ended and exactly one child is
298
+ * live. Two live children and no stamp is ambiguous, so the event stays with the parent
299
+ * and says so rather than being silently attributed.
300
+ */
301
+ private childAgentFor;
302
+ private absorbChildAssistant;
303
+ private recordBackgroundTaskNotification;
304
+ private beginAutonomousTurn;
305
+ private finishAutonomousTurn;
306
+ private completeBackgroundAgent;
307
+ /** Whether a spawned background child has not been reported finished yet. */
308
+ hasLiveBackgroundAgents(): boolean;
309
+ private recordToolResult;
310
+ private failToolStreamProtocol;
311
+ /**
312
+ * Handle process close
313
+ */
314
+ private handleClose;
315
+ /**
316
+ * Handle process error
317
+ */
318
+ private handleError;
319
+ /**
320
+ * Handle request timeout
321
+ */
322
+ private handleTimeout;
323
+ /**
324
+ * Clear request timeout
325
+ */
326
+ private clearRequestTimeout;
327
+ /**
328
+ * Reset request state
329
+ */
330
+ private resetRequestState;
331
+ /**
332
+ * Stop the process
333
+ */
334
+ stop(): void;
335
+ /**
336
+ * Check if process is alive
337
+ */
338
+ isAlive(): boolean;
339
+ /**
340
+ * Check if process is ready for new messages
341
+ */
342
+ isReady(): boolean;
343
+ /**
344
+ * True while Claude has requested tools and the host has not sent tool_result yet.
345
+ * The process is technically idle during host-side tool execution, but it must not
346
+ * be reclaimed because the next prompt depends on this live Claude context.
347
+ */
348
+ hasPendingToolUse(): boolean;
349
+ getPendingToolUseStartedAt(): number | null;
350
+ /**
351
+ * Get current state
352
+ */
353
+ getState(): ProcessState;
354
+ /**
355
+ * Get session ID
356
+ */
357
+ getSessionId(): string;
358
+ }
359
+ export declare function formatClaudeArgsForLog(args: readonly string[]): string[];
360
+ /**
361
+ * PersistentProcessPool - Manages multiple persistent Claude processes
362
+ *
363
+ * Features:
364
+ * - One process per channel/session
365
+ * - Automatic process lifecycle management
366
+ * - Process reuse for multi-turn conversations
367
+ */
368
+ export declare class PersistentProcessPool {
369
+ private processes;
370
+ private defaultOptions;
371
+ private idleTimeoutMs;
372
+ private cleanupIntervalMs;
373
+ private pendingToolUseTimeoutMs;
374
+ private cleanupTimer;
375
+ constructor(defaultOptions: Partial<PersistentProcessOptions> & {
376
+ workspaceDir: string;
377
+ });
378
+ private resolveIdleTimeoutMs;
379
+ private resolveCleanupIntervalMs;
380
+ private resolvePendingToolUseTimeoutMs;
381
+ private startCleanupTimer;
382
+ /**
383
+ * Get or create a process for a channel
384
+ */
385
+ getProcess(channelKey: string, options?: Partial<PersistentProcessOptions>): Promise<PersistentClaudeProcess>;
386
+ /**
387
+ * Get or create a process for a channel and report whether this call created it.
388
+ */
389
+ getProcessWithStatus(channelKey: string, options?: Partial<PersistentProcessOptions>): Promise<PersistentProcessAcquireResult>;
390
+ /**
391
+ * Stop idle ready processes that have outlived the configured idle timeout.
392
+ */
393
+ cleanupIdleProcesses(now?: number): number;
394
+ /**
395
+ * Stop a specific process
396
+ */
397
+ stopProcess(channelKey: string): void;
398
+ getSessionPolicyStatus(channelKey: string, policyFingerprint: string | undefined): SessionPolicyStatus;
399
+ /**
400
+ * Stop the exact process generation acquired by the caller. Only remove the pool entry when it
401
+ * still points at that generation, so stale cleanup cannot stop or evict a replacement. The
402
+ * expected process may already be absent after its error listener ran; it still must be stopped
403
+ * or the child would remain alive outside pool lifecycle management.
404
+ */
405
+ retireProcess(channelKey: string, expectedProcess: PersistentClaudeProcess): boolean;
406
+ /**
407
+ * Stop all processes
408
+ */
409
+ stopAll(): void;
410
+ /**
411
+ * Get number of active processes
412
+ */
413
+ getActiveCount(): number;
414
+ /**
415
+ * Get all channel keys with active processes
416
+ */
417
+ getActiveChannels(): string[];
418
+ /**
419
+ * Get states of all active processes
420
+ * @returns Map of channelKey → ProcessState
421
+ */
422
+ getProcessStates(): Map<string, string>;
423
+ }
424
+ //# sourceMappingURL=persistent-cli-process.d.ts.map