neotoma 0.18.2 → 0.18.4

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 (321) hide show
  1. package/dist/actions.d.ts +10 -0
  2. package/dist/actions.d.ts.map +1 -1
  3. package/dist/actions.js +134 -9
  4. package/dist/actions.js.map +1 -1
  5. package/dist/cli/bootstrap.js +0 -0
  6. package/dist/cli/index.d.ts +3 -0
  7. package/dist/cli/index.d.ts.map +1 -1
  8. package/dist/cli/index.js +22 -8
  9. package/dist/cli/index.js.map +1 -1
  10. package/dist/docs/developer/cli_reference.md +2 -1
  11. package/dist/docs/developer/fleet_onboarding.md +23 -0
  12. package/dist/docs/subsystems/conflict_resolution.md +72 -30
  13. package/dist/docs/testing/automated_test_catalog.md +13 -6
  14. package/dist/inspector/assets/{access_policies-Bgx-SZYe.js → access_policies-BN-34iPu.js} +1 -1
  15. package/dist/inspector/assets/{agent_badge-C33tCpxh.js → agent_badge-CpLLrPir.js} +1 -1
  16. package/dist/inspector/assets/{agent_detail-gfDjvyWc.js → agent_detail-Brp-tB8X.js} +1 -1
  17. package/dist/inspector/assets/{agent_filter-D4laqYjo.js → agent_filter-s5rgofFz.js} +1 -1
  18. package/dist/inspector/assets/{agent_grant_detail-YHMN0I36.js → agent_grant_detail-xAlGjTk8.js} +1 -1
  19. package/dist/inspector/assets/{agent_grant_form-COhga3hy.js → agent_grant_form-bwLmrrpe.js} +1 -1
  20. package/dist/inspector/assets/{agent_grants-D6A_JuS2.js → agent_grants-BR5ZiW9X.js} +1 -1
  21. package/dist/inspector/assets/{agents-BOoOc4bq.js → agents-BxvOd8g7.js} +1 -1
  22. package/dist/inspector/assets/{api_not_configured_state-DTvBRhie.js → api_not_configured_state-C_AknY0i.js} +1 -1
  23. package/dist/inspector/assets/{attribution_card-BkbIJSjc.js → attribution_card-V7RwrLTr.js} +1 -1
  24. package/dist/inspector/assets/{attribution_summary-BbMRTGON.js → attribution_summary-BQnfxTcJ.js} +1 -1
  25. package/dist/inspector/assets/{bundles-C1Vbryad.js → bundles-sJa73Dcv.js} +1 -1
  26. package/dist/inspector/assets/{card-VEtVMpk8.js → card-Caif065r.js} +1 -1
  27. package/dist/inspector/assets/{checkbox-DUWnf3Dc.js → checkbox-B28sWZdk.js} +1 -1
  28. package/dist/inspector/assets/{compliance-LGZJfcc4.js → compliance-KDW54hEE.js} +1 -1
  29. package/dist/inspector/assets/{confirm-dialog-KxqCxG3b.js → confirm-dialog-bdJnFa6d.js} +1 -1
  30. package/dist/inspector/assets/{conversation_common-Dxo8dRpw.js → conversation_common-CNh4V-VM.js} +1 -1
  31. package/dist/inspector/assets/{conversation_detail-BWJ2Ip15.js → conversation_detail-Bt2IXE7y.js} +1 -1
  32. package/dist/inspector/assets/{copy_id_button-SJ2sUMK1.js → copy_id_button-cUFHxvIp.js} +1 -1
  33. package/dist/inspector/assets/{copyable_code_block-xMzp8G09.js → copyable_code_block-D0ytL1p9.js} +1 -1
  34. package/dist/inspector/assets/{corrections-BJD1E6Zx.js → corrections-CbZliqBi.js} +1 -1
  35. package/dist/inspector/assets/{dashboard-BOnx6ZyM.js → dashboard-BZSEFRQ9.js} +1 -1
  36. package/dist/inspector/assets/{data-table-DW3TzIhP.js → data-table-CGnZkL3S.js} +1 -1
  37. package/dist/inspector/assets/{design-C1T-vnFH.js → design-CQy32Vpd.js} +1 -1
  38. package/dist/inspector/assets/{dialog-DH8W3l6O.js → dialog-BL53sB1T.js} +1 -1
  39. package/dist/inspector/assets/{docs-D1LVDpcM.js → docs-DnlLpLpj.js} +1 -1
  40. package/dist/inspector/assets/{docs_page_layout-D3eBLbl8.js → docs_page_layout-BjrKZD9G.js} +1 -1
  41. package/dist/inspector/assets/embed_graph-BO-onTk4.js +1 -0
  42. package/dist/inspector/assets/{empty_state-BGnkG3yO.js → empty_state-DrwUUQcO.js} +1 -1
  43. package/dist/inspector/assets/{entities-Bm3dkUFI.js → entities-BeHutS_W.js} +1 -1
  44. package/dist/inspector/assets/{entity_correct-D5WJNaFc.js → entity_correct-Bk2kmwFT.js} +1 -1
  45. package/dist/inspector/assets/{entity_history-Ci7GWHy5.js → entity_history-CwjZH9Xo.js} +1 -1
  46. package/dist/inspector/assets/{entity_history_sections-u3aV-Lc9.js → entity_history_sections-W0K_zYQb.js} +1 -1
  47. package/dist/inspector/assets/{entity_link-CNldR-lq.js → entity_link-CnrSK4Tx.js} +1 -1
  48. package/dist/inspector/assets/{entity_relationships_by_type-C0Gk2BTQ.js → entity_relationships_by_type-X5VsJD6e.js} +1 -1
  49. package/dist/inspector/assets/{entity_segment_page-Df2iD87C.js → entity_segment_page-BvKqG1OE.js} +1 -1
  50. package/dist/inspector/assets/{entity_table_column_toggle-DZ1xAV_m.js → entity_table_column_toggle-ZJYlmPjQ.js} +1 -1
  51. package/dist/inspector/assets/{entity_timeline-BZ-s73b8.js → entity_timeline-B3ZI68ZE.js} +1 -1
  52. package/dist/inspector/assets/{entity_types-Ba5ZqBUc.js → entity_types-CoH5Fjo7.js} +1 -1
  53. package/dist/inspector/assets/{faq-BbETwvzl.js → faq-FmlzGyjZ.js} +1 -1
  54. package/dist/inspector/assets/{graph_explorer-Bc3BPsM8.js → graph_explorer-CnNtKaQr.js} +1 -1
  55. package/dist/inspector/assets/{graph_layout-BQDyyZaT.js → graph_layout-WbLRe5Nt.js} +2 -2
  56. package/dist/inspector/assets/{home-BXy-o49i.js → home-DSZwpZKh.js} +1 -1
  57. package/dist/inspector/assets/{index-BCtrS-q-.js → index-CUZJ9Hf7.js} +2 -2
  58. package/dist/inspector/assets/{index-Cjh2Ys9W.js → index-DKrPgz7x.js} +1 -1
  59. package/dist/inspector/assets/index-Dg7MFz-4.css +1 -0
  60. package/dist/inspector/assets/{index-C4dL6o71.js → index-Lm-STP_w.js} +1 -1
  61. package/dist/inspector/assets/{interpretations-BJVBv-H1.js → interpretations-BKBLcnx3.js} +1 -1
  62. package/dist/inspector/assets/interpretations-BooFLurj.js +1 -0
  63. package/dist/inspector/assets/{issue_author_attribution-Drv6KlfY.js → issue_author_attribution-CNHPR51J.js} +1 -1
  64. package/dist/inspector/assets/{issue_detail-DrT4ikoJ.js → issue_detail--Omb6RAl.js} +1 -1
  65. package/dist/inspector/assets/{issues-EjgDHAP9.js → issues-C_x9y7E2.js} +1 -1
  66. package/dist/inspector/assets/{json_viewer-CYiMb-da.js → json_viewer-Buv8J9uH.js} +1 -1
  67. package/dist/inspector/assets/{label-SnZK36YD.js → label-BOSmi_Ry.js} +1 -1
  68. package/dist/inspector/assets/{live_relative_time-Cz6uD0Gt.js → live_relative_time-BRhUEOAQ.js} +1 -1
  69. package/dist/inspector/assets/{mobile_filter_popover-B_m6VwNq.js → mobile_filter_popover-1rufw_SI.js} +1 -1
  70. package/dist/inspector/assets/{not_found-DnFt1jGz.js → not_found-CBUznHi6.js} +1 -1
  71. package/dist/inspector/assets/{observations-iCGEnajZ.js → observations-BOSfD-Fe.js} +1 -1
  72. package/dist/inspector/assets/{page_shell-Cn1X2P68.js → page_shell-Cnle3Z6i.js} +1 -1
  73. package/dist/inspector/assets/{pagination-CAf0CpCi.js → pagination-DiMq7Q_R.js} +1 -1
  74. package/dist/inspector/assets/{peer_detail-D-TsrPmb.js → peer_detail-CstWSgyC.js} +1 -1
  75. package/dist/inspector/assets/{peers-CIrAlrYe.js → peers-_iHT4uU0.js} +1 -1
  76. package/dist/inspector/assets/{pin_primitive_button-C7-VInsd.js → pin_primitive_button-CAvdxlvk.js} +1 -1
  77. package/dist/inspector/assets/{recent_activity-BkKsy8bS.js → recent_activity-DXzg9-dM.js} +1 -1
  78. package/dist/inspector/assets/{recent_conversations-DgVeHt13.js → recent_conversations-BykmPg9E.js} +1 -1
  79. package/dist/inspector/assets/{recent_conversations-CgO3k-zb.js → recent_conversations-DBke3tlZ.js} +1 -1
  80. package/dist/inspector/assets/{recent_records_feed-DsdMzXJY.js → recent_records_feed-x0Ny5gdj.js} +1 -1
  81. package/dist/inspector/assets/record_activity-CPWJ-_Ou.js +1 -0
  82. package/dist/inspector/assets/{relationship_detail-D5O0XvAg.js → relationship_detail-CEFggwIN.js} +1 -1
  83. package/dist/inspector/assets/{relationship_panel_groups-C4Ye9XdG.js → relationship_panel_groups-DCUcDTDW.js} +1 -1
  84. package/dist/inspector/assets/{relationships-Ctq6oof6.js → relationships-Dmz_G7SH.js} +1 -1
  85. package/dist/inspector/assets/{relationships-DicnNnZA.js → relationships-kDc-KN9Q.js} +1 -1
  86. package/dist/inspector/assets/{sandbox-BO0DD_0f.js → sandbox-DJoN6BdY.js} +1 -1
  87. package/dist/inspector/assets/{schema_detail-innLJRVT.js → schema_detail-D-dw9TlR.js} +1 -1
  88. package/dist/inspector/assets/{schemas-AGqfE4h0.js → schemas-kKjHI5LR.js} +1 -1
  89. package/dist/inspector/assets/{search-DySMNkgQ.js → search-DGRluy5K.js} +1 -1
  90. package/dist/inspector/assets/{segmented_control-DAeqcNHU.js → segmented_control-BeikqDNV.js} +1 -1
  91. package/dist/inspector/assets/{select-Dj5oFvji.js → select-vrMqzpPI.js} +1 -1
  92. package/dist/inspector/assets/{settings-DPSc-MsQ.js → settings-B31enQzQ.js} +1 -1
  93. package/dist/inspector/assets/{source_content-Biuq250n.js → source_content-COUM6IUs.js} +1 -1
  94. package/dist/inspector/assets/{source_content_open_button-BjEDZifP.js → source_content_open_button-CMPAYirb.js} +1 -1
  95. package/dist/inspector/assets/{source_detail-ToF80297.js → source_detail-2r_dQ1DI.js} +1 -1
  96. package/dist/inspector/assets/{source_link-UvbCS8kH.js → source_link-Ce1_Zy0p.js} +1 -1
  97. package/dist/inspector/assets/{sources-BdAjTWrY.js → sources-foH7eq0Y.js} +1 -1
  98. package/dist/inspector/assets/{subscriptions-BdisK-yb.js → subscriptions-EhpD8tpi.js} +1 -1
  99. package/dist/inspector/assets/{switch-BVOxcgUR.js → switch-DFfyJgPw.js} +1 -1
  100. package/dist/inspector/assets/{tabs-9eXcV6jq.js → tabs-CO1AKqKS.js} +1 -1
  101. package/dist/inspector/assets/{textarea-d76JXYw-.js → textarea-BNtVyu5K.js} +1 -1
  102. package/dist/inspector/assets/{timeline-ChTEisvC.js → timeline-BOzyKBqR.js} +1 -1
  103. package/dist/inspector/assets/{timeline-CWLYDyds.js → timeline-BvBqBcK9.js} +1 -1
  104. package/dist/inspector/assets/{timeline_event_detail-w1-wRXce.js → timeline_event_detail-D-9hzPWs.js} +1 -1
  105. package/dist/inspector/assets/{turn_detail-CrvvkrfX.js → turn_detail-JZv-2Evd.js} +1 -1
  106. package/dist/inspector/assets/{turns-C0TSjy95.js → turns-D5W7NC-n.js} +1 -1
  107. package/dist/inspector/assets/{use_agents-CRv6rDsh.js → use_agents-DNelJZjI.js} +1 -1
  108. package/dist/inspector/assets/{use_entities-Dxdt9oGZ.js → use_entities-Chw8OIMK.js} +1 -1
  109. package/dist/inspector/assets/use_interpretations-DyEjBp7X.js +1 -0
  110. package/dist/inspector/assets/{use_mutations-lnvzn8c8.js → use_mutations-A-QC7q0k.js} +1 -1
  111. package/dist/inspector/assets/{use_peers-D1YPXbCo.js → use_peers-D6YlqmoY.js} +1 -1
  112. package/dist/inspector/assets/{use_relationships-BIacD5VK.js → use_relationships-BPE1-rrt.js} +1 -1
  113. package/dist/inspector/assets/{use_stats-pecBajli.js → use_stats-B9WT45FM.js} +1 -1
  114. package/dist/inspector/assets/{use_timeline-7rcIc6M4.js → use_timeline-BmW6jH0T.js} +1 -1
  115. package/dist/inspector/assets/{use_turns-C1_j8N2Q.js → use_turns-DwOsaQPo.js} +1 -1
  116. package/dist/inspector/assets/{world_time_event_timeline-CBDb4DzY.js → world_time_event_timeline-WucES8kD.js} +1 -1
  117. package/dist/inspector/index.html +2 -2
  118. package/dist/server.d.ts.map +1 -1
  119. package/dist/server.js +80 -0
  120. package/dist/server.js.map +1 -1
  121. package/dist/services/null_cleared_field_warning.d.ts +71 -0
  122. package/dist/services/null_cleared_field_warning.d.ts.map +1 -0
  123. package/dist/services/null_cleared_field_warning.js +77 -0
  124. package/dist/services/null_cleared_field_warning.js.map +1 -0
  125. package/dist/services/observation_storage.d.ts.map +1 -1
  126. package/dist/services/observation_storage.js +20 -0
  127. package/dist/services/observation_storage.js.map +1 -1
  128. package/dist/services/source_priority_warning.d.ts +57 -0
  129. package/dist/services/source_priority_warning.d.ts.map +1 -1
  130. package/dist/services/source_priority_warning.js +84 -0
  131. package/dist/services/source_priority_warning.js.map +1 -1
  132. package/dist/shared/action_schemas.d.ts +11 -0
  133. package/dist/shared/action_schemas.d.ts.map +1 -1
  134. package/dist/shared/action_schemas.js +7 -0
  135. package/dist/shared/action_schemas.js.map +1 -1
  136. package/package.json +2 -1
  137. package/dist/__fixtures__/helpers.d.ts +0 -91
  138. package/dist/__fixtures__/helpers.d.ts.map +0 -1
  139. package/dist/__fixtures__/helpers.js +0 -384
  140. package/dist/__fixtures__/helpers.js.map +0 -1
  141. package/dist/__fixtures__/types.d.ts +0 -285
  142. package/dist/__fixtures__/types.d.ts.map +0 -1
  143. package/dist/__fixtures__/types.js +0 -7
  144. package/dist/__fixtures__/types.js.map +0 -1
  145. package/dist/__fixtures__/validation.d.ts +0 -45
  146. package/dist/__fixtures__/validation.d.ts.map +0 -1
  147. package/dist/__fixtures__/validation.js +0 -311
  148. package/dist/__fixtures__/validation.js.map +0 -1
  149. package/dist/cli/digest.d.ts +0 -53
  150. package/dist/cli/digest.d.ts.map +0 -1
  151. package/dist/cli/digest.js +0 -218
  152. package/dist/cli/digest.js.map +0 -1
  153. package/dist/config/plaid.d.ts +0 -21
  154. package/dist/config/plaid.d.ts.map +0 -1
  155. package/dist/config/plaid.js +0 -48
  156. package/dist/config/plaid.js.map +0 -1
  157. package/dist/events/event_emitter.d.ts +0 -24
  158. package/dist/events/event_emitter.d.ts.map +0 -1
  159. package/dist/events/event_emitter.js +0 -85
  160. package/dist/events/event_emitter.js.map +0 -1
  161. package/dist/events/event_log.d.ts +0 -23
  162. package/dist/events/event_log.d.ts.map +0 -1
  163. package/dist/events/event_log.js +0 -77
  164. package/dist/events/event_log.js.map +0 -1
  165. package/dist/events/event_schema.d.ts +0 -58
  166. package/dist/events/event_schema.d.ts.map +0 -1
  167. package/dist/events/event_schema.js +0 -43
  168. package/dist/events/event_schema.js.map +0 -1
  169. package/dist/events/event_validator.d.ts +0 -23
  170. package/dist/events/event_validator.d.ts.map +0 -1
  171. package/dist/events/event_validator.js +0 -90
  172. package/dist/events/event_validator.js.map +0 -1
  173. package/dist/events/index.d.ts +0 -9
  174. package/dist/events/index.d.ts.map +0 -1
  175. package/dist/events/index.js +0 -9
  176. package/dist/events/index.js.map +0 -1
  177. package/dist/events/replay.d.ts +0 -27
  178. package/dist/events/replay.d.ts.map +0 -1
  179. package/dist/events/replay.js +0 -62
  180. package/dist/events/replay.js.map +0 -1
  181. package/dist/hashing/hash_chain.d.ts +0 -31
  182. package/dist/hashing/hash_chain.d.ts.map +0 -1
  183. package/dist/hashing/hash_chain.js +0 -45
  184. package/dist/hashing/hash_chain.js.map +0 -1
  185. package/dist/inspector/assets/embed_graph-yijK3iWa.js +0 -1
  186. package/dist/inspector/assets/index-CzD1hfqq.css +0 -1
  187. package/dist/inspector/assets/interpretations-D2v1BxEQ.js +0 -1
  188. package/dist/inspector/assets/record_activity-Dwe8CUqj.js +0 -1
  189. package/dist/inspector/assets/use_interpretations-uhU4isO3.js +0 -1
  190. package/dist/integrations/plaid/client.d.ts +0 -53
  191. package/dist/integrations/plaid/client.d.ts.map +0 -1
  192. package/dist/integrations/plaid/client.js +0 -224
  193. package/dist/integrations/plaid/client.js.map +0 -1
  194. package/dist/integrations/plaid/normalizers.d.ts +0 -26
  195. package/dist/integrations/plaid/normalizers.d.ts.map +0 -1
  196. package/dist/integrations/plaid/normalizers.js +0 -166
  197. package/dist/integrations/plaid/normalizers.js.map +0 -1
  198. package/dist/integrations/providers/asana.d.ts +0 -9
  199. package/dist/integrations/providers/asana.d.ts.map +0 -1
  200. package/dist/integrations/providers/asana.js +0 -62
  201. package/dist/integrations/providers/asana.js.map +0 -1
  202. package/dist/integrations/providers/base.d.ts +0 -17
  203. package/dist/integrations/providers/base.d.ts.map +0 -1
  204. package/dist/integrations/providers/base.js +0 -64
  205. package/dist/integrations/providers/base.js.map +0 -1
  206. package/dist/integrations/providers/facebook.d.ts +0 -9
  207. package/dist/integrations/providers/facebook.d.ts.map +0 -1
  208. package/dist/integrations/providers/facebook.js +0 -58
  209. package/dist/integrations/providers/facebook.js.map +0 -1
  210. package/dist/integrations/providers/gmail.d.ts +0 -10
  211. package/dist/integrations/providers/gmail.d.ts.map +0 -1
  212. package/dist/integrations/providers/gmail.js +0 -67
  213. package/dist/integrations/providers/gmail.js.map +0 -1
  214. package/dist/integrations/providers/index.d.ts +0 -6
  215. package/dist/integrations/providers/index.d.ts.map +0 -1
  216. package/dist/integrations/providers/index.js +0 -25
  217. package/dist/integrations/providers/index.js.map +0 -1
  218. package/dist/integrations/providers/instagram.d.ts +0 -9
  219. package/dist/integrations/providers/instagram.d.ts.map +0 -1
  220. package/dist/integrations/providers/instagram.js +0 -47
  221. package/dist/integrations/providers/instagram.js.map +0 -1
  222. package/dist/integrations/providers/metadata.d.ts +0 -25
  223. package/dist/integrations/providers/metadata.d.ts.map +0 -1
  224. package/dist/integrations/providers/metadata.js +0 -407
  225. package/dist/integrations/providers/metadata.js.map +0 -1
  226. package/dist/integrations/providers/types.d.ts +0 -39
  227. package/dist/integrations/providers/types.d.ts.map +0 -1
  228. package/dist/integrations/providers/types.js +0 -2
  229. package/dist/integrations/providers/types.js.map +0 -1
  230. package/dist/integrations/providers/x.d.ts +0 -9
  231. package/dist/integrations/providers/x.d.ts.map +0 -1
  232. package/dist/integrations/providers/x.js +0 -78
  233. package/dist/integrations/providers/x.js.map +0 -1
  234. package/dist/reducers/record_reducer.d.ts +0 -25
  235. package/dist/reducers/record_reducer.d.ts.map +0 -1
  236. package/dist/reducers/record_reducer.js +0 -93
  237. package/dist/reducers/record_reducer.js.map +0 -1
  238. package/dist/reducers/reducer_registry.d.ts +0 -47
  239. package/dist/reducers/reducer_registry.d.ts.map +0 -1
  240. package/dist/reducers/reducer_registry.js +0 -82
  241. package/dist/reducers/reducer_registry.js.map +0 -1
  242. package/dist/repositories/db/event_repo.d.ts +0 -14
  243. package/dist/repositories/db/event_repo.d.ts.map +0 -1
  244. package/dist/repositories/db/event_repo.js +0 -67
  245. package/dist/repositories/db/event_repo.js.map +0 -1
  246. package/dist/repositories/db/state_repo.d.ts +0 -14
  247. package/dist/repositories/db/state_repo.d.ts.map +0 -1
  248. package/dist/repositories/db/state_repo.js +0 -61
  249. package/dist/repositories/db/state_repo.js.map +0 -1
  250. package/dist/repositories/file/event_repo.d.ts +0 -18
  251. package/dist/repositories/file/event_repo.d.ts.map +0 -1
  252. package/dist/repositories/file/event_repo.js +0 -148
  253. package/dist/repositories/file/event_repo.js.map +0 -1
  254. package/dist/repositories/file/state_repo.d.ts +0 -21
  255. package/dist/repositories/file/state_repo.d.ts.map +0 -1
  256. package/dist/repositories/file/state_repo.js +0 -89
  257. package/dist/repositories/file/state_repo.js.map +0 -1
  258. package/dist/services/connectors.d.ts +0 -89
  259. package/dist/services/connectors.d.ts.map +0 -1
  260. package/dist/services/connectors.js +0 -251
  261. package/dist/services/connectors.js.map +0 -1
  262. package/dist/services/event_generation.d.ts +0 -37
  263. package/dist/services/event_generation.d.ts.map +0 -1
  264. package/dist/services/event_generation.js +0 -236
  265. package/dist/services/event_generation.js.map +0 -1
  266. package/dist/services/extraction/rules.d.ts +0 -26
  267. package/dist/services/extraction/rules.d.ts.map +0 -1
  268. package/dist/services/extraction/rules.js +0 -679
  269. package/dist/services/extraction/rules.js.map +0 -1
  270. package/dist/services/file_analysis.d.ts +0 -32
  271. package/dist/services/file_analysis.d.ts.map +0 -1
  272. package/dist/services/file_analysis.js +0 -261
  273. package/dist/services/file_analysis.js.map +0 -1
  274. package/dist/services/graph_builder.d.ts +0 -47
  275. package/dist/services/graph_builder.d.ts.map +0 -1
  276. package/dist/services/graph_builder.js +0 -285
  277. package/dist/services/graph_builder.js.map +0 -1
  278. package/dist/services/importers.d.ts +0 -28
  279. package/dist/services/importers.d.ts.map +0 -1
  280. package/dist/services/importers.js +0 -174
  281. package/dist/services/importers.js.map +0 -1
  282. package/dist/services/llm_extraction.d.ts +0 -82
  283. package/dist/services/llm_extraction.d.ts.map +0 -1
  284. package/dist/services/llm_extraction.js +0 -435
  285. package/dist/services/llm_extraction.js.map +0 -1
  286. package/dist/services/observation_ingestion.d.ts +0 -26
  287. package/dist/services/observation_ingestion.d.ts.map +0 -1
  288. package/dist/services/observation_ingestion.js +0 -348
  289. package/dist/services/observation_ingestion.js.map +0 -1
  290. package/dist/services/payload_compiler.d.ts +0 -36
  291. package/dist/services/payload_compiler.d.ts.map +0 -1
  292. package/dist/services/payload_compiler.js +0 -121
  293. package/dist/services/payload_compiler.js.map +0 -1
  294. package/dist/services/payload_identity.d.ts +0 -35
  295. package/dist/services/payload_identity.d.ts.map +0 -1
  296. package/dist/services/payload_identity.js +0 -101
  297. package/dist/services/payload_identity.js.map +0 -1
  298. package/dist/services/payload_schema.d.ts +0 -104
  299. package/dist/services/payload_schema.d.ts.map +0 -1
  300. package/dist/services/payload_schema.js +0 -46
  301. package/dist/services/payload_schema.js.map +0 -1
  302. package/dist/services/plaid_sync.d.ts +0 -77
  303. package/dist/services/plaid_sync.d.ts.map +0 -1
  304. package/dist/services/plaid_sync.js +0 -273
  305. package/dist/services/plaid_sync.js.map +0 -1
  306. package/dist/services/record_comparison.d.ts +0 -29
  307. package/dist/services/record_comparison.d.ts.map +0 -1
  308. package/dist/services/record_comparison.js +0 -84
  309. package/dist/services/record_comparison.js.map +0 -1
  310. package/dist/services/records.d.ts +0 -31
  311. package/dist/services/records.d.ts.map +0 -1
  312. package/dist/services/records.js +0 -184
  313. package/dist/services/records.js.map +0 -1
  314. package/dist/services/search.d.ts +0 -15
  315. package/dist/services/search.d.ts.map +0 -1
  316. package/dist/services/search.js +0 -80
  317. package/dist/services/search.js.map +0 -1
  318. package/dist/services/summary.d.ts +0 -5
  319. package/dist/services/summary.d.ts.map +0 -1
  320. package/dist/services/summary.js +0 -118
  321. package/dist/services/summary.js.map +0 -1
package/dist/actions.d.ts CHANGED
@@ -97,6 +97,16 @@ type GuestPrincipal = {
97
97
  type RoutePrincipal = UserPrincipal | GuestPrincipal;
98
98
  /** Exported for unit tests: routes where guest (AAuth / guest token) may be stamped before handlers run. */
99
99
  export declare function routeAcceptsGuestPrincipal(req: Pick<express.Request, "method" | "path">): boolean;
100
+ /**
101
+ * Exported for unit tests: the two issue-write routes that extend local-loopback
102
+ * trust to unauthenticated requests. A local request to `/issues/submit` or
103
+ * `/issues/add_message` with no `Authorization: Bearer` header falls through to
104
+ * the local dev user — the same offline-developer trust the entity-read routes
105
+ * already grant (see `resolveGuestUserId`). This is the ONLY place that trust is
106
+ * widened; every other route still requires a Bearer token, and remote requests
107
+ * (non-loopback / untrusted XFF) get AUTH_REQUIRED on these routes too.
108
+ */
109
+ export declare function routeAllowsLocalIssueWriteFallback(req: Pick<express.Request, "method" | "path">): boolean;
100
110
  /** Exported for unit tests: guest-capable routes that mutate state and should consume a guest write-rate budget. */
101
111
  export declare function routeConsumesGuestWriteBudget(req: Pick<express.Request, "method" | "path">): boolean;
102
112
  /** Exported for unit tests: guest-rate-limit key precedence is thumbprint -> guest token -> IP. */
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAsC9B,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AAarC,OAAO,EAGL,KAAK,aAAa,EAGnB,MAAM,4BAA4B,CAAC;AA4BpC,OAAO,EAQL,KAAK,sBAAsB,EAC5B,MAAM,4BAA4B,CAAC;AA6CpC,OAAO,EAiCL,KAAK,wBAAwB,EAE9B,MAAM,4BAA4B,CAAC;AA8CpC,6FAA6F;AAC7F,wBAAgB,qBAAqB,IAAI,sBAAsB,GAAG,IAAI,CAErE;AAED,eAAO,MAAM,GAAG,6CAAY,CAAC;AA4rB7B,kFAAkF;AAClF,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAEnD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAMtE;AAoBD,uFAAuF;AACvF,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAE9C;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAMlE;AAID;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,OAAO,CAAC,OAAO,EACpB,GAAG,EAAE,OAAO,CAAC,QAAQ,EACrB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAA;CAAE,GAC7F,IAAI,CA4IN;AAuBD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CA+B1F;AAmCD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CA2B5D;AA4PD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CA2BhD;AA47CD,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,aAAa,CAAC;IACvB,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,KAAK,cAAc,GAAG,aAAa,GAAG,cAAc,CAAC;AA2CrD,4GAA4G;AAC5G,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,GAAG,OAAO,CAqBjG;AAED,oHAAoH;AACpH,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,GAC5C,OAAO,CAWT;AAED,mGAAmG;AACnG,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,GAAG,MAAM,CAanE;AA2FD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,OAAO,CAAC,OAAO,EACpB,SAAS,EAAE,cAAc,GACxB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoCxB;AA69FD,KAAK,oBAAoB,GAAG;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAuDF,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,4BAA4B,EAAE,iBAAiB,CAAC;IAC3E,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACvC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;;;;;;;;;;;;;;qBA84BgB,MAAM;eACZ,MAAM;2BACM,MAAM;;;;;;cAlBnB,MAAM;iBACH,MAAM;2BACI,MAAM;qBACZ,MAAM;mBACR,MAAM;;;cA/BX,MAAM;gBACJ,MAAM;2BACK,MAAM;qBACZ,MAAM;mBACR,MAAM;wBACD,MAAM;uBACP,MAAM;;;;;mBAvPV,MAAM;qBACJ,MAAM;wBACH,MAAM,GAAG,IAAI;2BACV,MAAM;;wBAET,MAAM;uBACP,MAAM,EAAE;wBACP,MAAM;uBACP,MAAM;;kBAxYX,MAAM;oBACJ,MAAM;yBACD,MAAM;4BACH,MAAM;2BACP,MAAM;;;kBAQf,MAAM;yBACC,MAAM;iCACE,MAAM;sCACD,MAAM;;+BA4Xb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;;;2BA+JlC,MAAM;0BACP,MAAM;0BACN,MAAM;;;;;;;;GAkZ3B;AAg9GD,wBAAsB,eAAe;;;eAmOpC"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
package/dist/actions.js CHANGED
@@ -2611,6 +2611,23 @@ export function routeAcceptsGuestPrincipal(req) {
2611
2611
  }
2612
2612
  return false;
2613
2613
  }
2614
+ /**
2615
+ * Exported for unit tests: the two issue-write routes that extend local-loopback
2616
+ * trust to unauthenticated requests. A local request to `/issues/submit` or
2617
+ * `/issues/add_message` with no `Authorization: Bearer` header falls through to
2618
+ * the local dev user — the same offline-developer trust the entity-read routes
2619
+ * already grant (see `resolveGuestUserId`). This is the ONLY place that trust is
2620
+ * widened; every other route still requires a Bearer token, and remote requests
2621
+ * (non-loopback / untrusted XFF) get AUTH_REQUIRED on these routes too.
2622
+ */
2623
+ export function routeAllowsLocalIssueWriteFallback(req) {
2624
+ const path = req.path;
2625
+ return (req.method === "POST" &&
2626
+ (path === "/issues/submit" ||
2627
+ path === "/api/issues/submit" ||
2628
+ path === "/issues/add_message" ||
2629
+ path === "/api/issues/add_message"));
2630
+ }
2614
2631
  /** Exported for unit tests: guest-capable routes that mutate state and should consume a guest write-rate budget. */
2615
2632
  export function routeConsumesGuestWriteBudget(req) {
2616
2633
  const path = req.path;
@@ -2704,6 +2721,24 @@ async function resolveRoutePrincipal(req, accept) {
2704
2721
  }
2705
2722
  }
2706
2723
  if (accept.includes("user")) {
2724
+ // Local-loopback trust for the two issue-write routes: a local request with
2725
+ // no Bearer token resolves to the local dev user instead of failing
2726
+ // AUTH_REQUIRED. This mirrors the existing local fallback in
2727
+ // `resolveGuestUserId` and keeps `neotoma issues create` working offline
2728
+ // (gh-CLI auth alone does not configure a Neotoma Bearer token). Scoped as
2729
+ // narrowly as possible: ONLY these routes, ONLY local requests, ONLY when
2730
+ // no Bearer header is present — remote/Bearer requests fall through to the
2731
+ // normal `getAuthenticatedUserId` gate below.
2732
+ const headerAuth = (req.headers.authorization || req.headers.Authorization || "");
2733
+ if (routeAllowsLocalIssueWriteFallback(req) &&
2734
+ isLocalRequest(req) &&
2735
+ !headerAuth.startsWith("Bearer ")) {
2736
+ const userId = _localSandboxActive ? ensureLocalSandboxUser().id : ensureLocalDevUser().id;
2737
+ // Stamp the principal so a later `getAuthenticatedUserId` in the handler
2738
+ // resolves the same local user without re-tripping the missing-Bearer gate.
2739
+ stampUserPrincipal(req, userId);
2740
+ return { kind: "user", userId };
2741
+ }
2707
2742
  const userId = await getAuthenticatedUserId(req, (req.body?.user_id ??
2708
2743
  req.query.user_id));
2709
2744
  return { kind: "user", userId };
@@ -5704,6 +5739,12 @@ export async function storeStructuredForApi(params) {
5704
5739
  }
5705
5740
  }
5706
5741
  const createdEntities = [];
5742
+ // Issue #1839: capture each entity's prior and post-reduction snapshot so the
5743
+ // store_warnings loop below can detect a NULL_CLEARED_FIELD event (an incoming
5744
+ // null clearing a prior non-null value under highest_priority). Keyed by
5745
+ // entity_id.
5746
+ const priorSnapshotByEntityId = new Map();
5747
+ const newSnapshotByEntityId = new Map();
5707
5748
  for (const r of resolved) {
5708
5749
  let observation_id = null;
5709
5750
  let snapshotAfter = null;
@@ -5715,6 +5756,7 @@ export async function storeStructuredForApi(params) {
5715
5756
  .eq("user_id", userId)
5716
5757
  .maybeSingle();
5717
5758
  const priorSnapshot = priorSnapRow?.snapshot ?? {};
5759
+ priorSnapshotByEntityId.set(r.entity_id, priorSnapshot);
5718
5760
  const obsData = await createObservation({
5719
5761
  entity_id: r.entity_id,
5720
5762
  entity_type: r.entity_type,
@@ -5737,6 +5779,8 @@ export async function storeStructuredForApi(params) {
5737
5779
  const snap = await recomputeSnapshot(r.entity_id, userId);
5738
5780
  snapshotAfter =
5739
5781
  snap?.snapshot ?? null;
5782
+ if (snapshotAfter)
5783
+ newSnapshotByEntityId.set(r.entity_id, snapshotAfter);
5740
5784
  }
5741
5785
  catch (snapshotErr) {
5742
5786
  logger.warn(`Snapshot recompute failed for ${r.entity_id}: ${snapshotErr}`);
@@ -6076,6 +6120,48 @@ export async function storeStructuredForApi(params) {
6076
6120
  });
6077
6121
  if (spWarn)
6078
6122
  schemaStoreWarnings.push(spWarn);
6123
+ // Issue #1838: SOURCE_PRIORITY_ESCALATION — mirror-image advisory. A
6124
+ // write at the DEFAULT source_priority (100) into a `highest_priority`
6125
+ // field silently OUTRANKS any prior observation written with an
6126
+ // explicit lower priority. Non-blocking; reuses the same import.
6127
+ const { buildSourcePriorityEscalationWarning } = await import("./services/source_priority_warning.js");
6128
+ const spEsc = buildSourcePriorityEscalationWarning({
6129
+ sourcePriority,
6130
+ writtenFields: r.fields,
6131
+ mergePolicies: schemaEntry?.reducer_config?.merge_policies,
6132
+ observationIndex: r.observation_index,
6133
+ entityType: r.entity_type,
6134
+ entityId: r.entity_id,
6135
+ });
6136
+ if (spEsc)
6137
+ schemaStoreWarnings.push(spEsc);
6138
+ }
6139
+ // Issue #1839: NULL_CLEARED_FIELD — non-blocking advisory warning when an
6140
+ // incoming null clears a prior non-null value under a `highest_priority`
6141
+ // field. The clear is by design (null is an explicit tombstone), but it
6142
+ // is silent today; this surfaces the data-loss vector. Warn-only: no
6143
+ // change to snapshot computation or clearing semantics.
6144
+ {
6145
+ const mergePolicies = schemaEntry?.reducer_config?.merge_policies;
6146
+ if (mergePolicies) {
6147
+ const priorSnapshot = priorSnapshotByEntityId.get(r.entity_id) ?? {};
6148
+ const newSnapshot = newSnapshotByEntityId.get(r.entity_id) ?? {};
6149
+ const { buildNullClearedFieldWarning } = await import("./services/null_cleared_field_warning.js");
6150
+ for (const field of Object.keys(r.fields)) {
6151
+ const nullWarn = buildNullClearedFieldWarning({
6152
+ field,
6153
+ strategy: mergePolicies[field]?.strategy,
6154
+ prior_value: priorSnapshot[field],
6155
+ incoming_value: r.fields[field],
6156
+ new_value: newSnapshot[field],
6157
+ observation_index: r.observation_index,
6158
+ entity_type: r.entity_type,
6159
+ entity_id: r.entity_id,
6160
+ });
6161
+ if (nullWarn)
6162
+ schemaStoreWarnings.push(nullWarn);
6163
+ }
6164
+ }
6079
6165
  }
6080
6166
  }
6081
6167
  }
@@ -6191,10 +6277,35 @@ export async function storeStructuredForApi(params) {
6191
6277
  };
6192
6278
  }
6193
6279
  async function storeUnstructuredForApi(params) {
6194
- const { fileContent, fileBuffer, mimeType, idempotencyKey, originalFilename, sourceType, userId, } = params;
6280
+ const { fileContent, fileBuffer, filePath, mimeType, idempotencyKey, originalFilename, sourceType, userId, storageMode = "inline", } = params;
6195
6281
  const resolvedFileBuffer = fileBuffer ?? (fileContent !== undefined ? Buffer.from(fileContent, "base64") : undefined);
6196
- if (!resolvedFileBuffer) {
6197
- throw new Error("fileContent or fileBuffer is required for unstructured storage");
6282
+ if (!resolvedFileBuffer && storageMode !== "reference") {
6283
+ throw new Error("fileContent or fileBuffer is required for inline storage");
6284
+ }
6285
+ if (storageMode === "reference") {
6286
+ if (!filePath) {
6287
+ throw new Error("filePath is required for reference storage mode");
6288
+ }
6289
+ const absolutePath = path.isAbsolute(filePath)
6290
+ ? filePath
6291
+ : path.resolve(process.cwd(), filePath);
6292
+ const { storeRawReference } = await import("./services/raw_storage.js");
6293
+ const referenceResult = await storeRawReference({
6294
+ userId,
6295
+ absolutePath,
6296
+ mimeType,
6297
+ originalFilename: originalFilename?.trim() || undefined,
6298
+ idempotencyKey,
6299
+ provenance: { upload_method: "api_store_reference", client: "api" },
6300
+ });
6301
+ return {
6302
+ source_id: referenceResult.sourceId,
6303
+ content_hash: referenceResult.contentHash,
6304
+ storage_mode: "reference",
6305
+ reference_path: referenceResult.path,
6306
+ file_size: referenceResult.sizeBytes,
6307
+ mime_type: referenceResult.mimeType,
6308
+ };
6198
6309
  }
6199
6310
  const resolvedIdempotencyKey = idempotencyKey ??
6200
6311
  (await import("node:crypto")).createHash("sha256").update(resolvedFileBuffer).digest("hex");
@@ -6247,14 +6358,26 @@ async function handleStorePost(req, res) {
6247
6358
  const resolvedPath = path.isAbsolute(parsed.data.file_path)
6248
6359
  ? parsed.data.file_path
6249
6360
  : path.resolve(process.cwd(), parsed.data.file_path);
6250
- resolvedFileBuffer = fs.readFileSync(resolvedPath);
6251
- if (!mimeType) {
6252
- const ext = path.extname(resolvedPath).toLowerCase();
6253
- mimeType = getMimeTypeFromExtension(ext) || "application/octet-stream";
6361
+ if (parsed.data.source_storage === "reference") {
6362
+ // For reference mode, don't read the file buffer, just use the path
6363
+ if (!mimeType) {
6364
+ const ext = path.extname(resolvedPath).toLowerCase();
6365
+ mimeType = getMimeTypeFromExtension(ext) || "application/octet-stream";
6366
+ }
6367
+ originalFilename = originalFilename || path.basename(resolvedPath);
6368
+ }
6369
+ else {
6370
+ // For inline mode, read the file buffer
6371
+ resolvedFileBuffer = fs.readFileSync(resolvedPath);
6372
+ if (!mimeType) {
6373
+ const ext = path.extname(resolvedPath).toLowerCase();
6374
+ mimeType = getMimeTypeFromExtension(ext) || "application/octet-stream";
6375
+ }
6376
+ originalFilename = originalFilename || path.basename(resolvedPath);
6254
6377
  }
6255
- originalFilename = originalFilename || path.basename(resolvedPath);
6256
6378
  }
6257
- if ((!fileContent && !resolvedFileBuffer) || !mimeType) {
6379
+ if ((!fileContent && !resolvedFileBuffer && parsed.data.source_storage !== "reference") ||
6380
+ !mimeType) {
6258
6381
  sendError(res, 400, "VALIDATION_ERROR", "Unstructured store requires file_content+mime_type or file_path");
6259
6382
  return null;
6260
6383
  }
@@ -6262,11 +6385,13 @@ async function handleStorePost(req, res) {
6262
6385
  userId,
6263
6386
  fileContent,
6264
6387
  fileBuffer: resolvedFileBuffer,
6388
+ filePath: parsed.data.file_path,
6265
6389
  mimeType,
6266
6390
  idempotencyKey: parsed.data.file_idempotency_key ??
6267
6391
  (!hasEntities ? parsed.data.idempotency_key : undefined),
6268
6392
  originalFilename,
6269
6393
  sourceType: parsed.data.source_type,
6394
+ storageMode: parsed.data.source_storage,
6270
6395
  });
6271
6396
  };
6272
6397
  if (hasUnstructured && parsed.data.interpretation?.source_ref === "unstructured") {