neotoma 0.20.0 → 0.21.2
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.
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +129 -47
- package/dist/actions.js.map +1 -1
- package/dist/cli/commands/db_migrate_env_split.d.ts.map +1 -1
- package/dist/cli/commands/db_migrate_env_split.js +5 -10
- package/dist/cli/commands/db_migrate_env_split.js.map +1 -1
- package/dist/cli/discovery.d.ts.map +1 -1
- package/dist/cli/discovery.js +34 -1
- package/dist/cli/discovery.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +329 -144
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/instance_scripts.d.ts +104 -0
- package/dist/cli/instance_scripts.d.ts.map +1 -0
- package/dist/cli/instance_scripts.js +189 -0
- package/dist/cli/instance_scripts.js.map +1 -0
- package/dist/cli/instance_skills.d.ts +85 -0
- package/dist/cli/instance_skills.d.ts.map +1 -0
- package/dist/cli/instance_skills.js +199 -0
- package/dist/cli/instance_skills.js.map +1 -0
- package/dist/cli/instance_skills_client.d.ts +75 -0
- package/dist/cli/instance_skills_client.d.ts.map +1 -0
- package/dist/cli/instance_skills_client.js +141 -0
- package/dist/cli/instance_skills_client.js.map +1 -0
- package/dist/cli/instance_skills_sync.d.ts +72 -0
- package/dist/cli/instance_skills_sync.d.ts.map +1 -0
- package/dist/cli/instance_skills_sync.js +147 -0
- package/dist/cli/instance_skills_sync.js.map +1 -0
- package/dist/cli/onboarding_transcript_import.d.ts +18 -0
- package/dist/cli/onboarding_transcript_import.d.ts.map +1 -1
- package/dist/cli/onboarding_transcript_import.js +98 -0
- package/dist/cli/onboarding_transcript_import.js.map +1 -1
- package/dist/cli/skills_mirror.d.ts +26 -0
- package/dist/cli/skills_mirror.d.ts.map +1 -1
- package/dist/cli/skills_mirror.js +10 -2
- package/dist/cli/skills_mirror.js.map +1 -1
- package/dist/cli/transcript_parser.d.ts +29 -1
- package/dist/cli/transcript_parser.d.ts.map +1 -1
- package/dist/cli/transcript_parser.js +117 -3
- package/dist/cli/transcript_parser.js.map +1 -1
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +23 -0
- package/dist/config.js.map +1 -1
- package/dist/docs/developer/cli/transcript_ingestion.md +90 -0
- package/dist/docs/developer/cli_agent_instructions.md +2 -0
- package/dist/docs/developer/cli_reference.md +80 -11
- package/dist/docs/developer/mcp/instructions.md +1 -0
- package/dist/docs/developer/schema_initialization.md +64 -9
- package/dist/docs/infrastructure/deployment.md +13 -5
- package/dist/docs/infrastructure/multi_tenant_deployment_topology.md +10 -3
- package/dist/docs/operations/configuration.md +13 -0
- package/dist/docs/skills/skill_strategy.md +129 -40
- package/dist/docs/testing/automated_test_catalog.md +37 -12
- package/dist/inspector/assets/{access_policies-6-6DPI39.js → access_policies-B0S0qvu_.js} +1 -1
- package/dist/inspector/assets/{agent_badge-CXSO0sXJ.js → agent_badge-BkdvFESY.js} +1 -1
- package/dist/inspector/assets/{agent_detail-Cr7iqdye.js → agent_detail-DP0gQW2Q.js} +1 -1
- package/dist/inspector/assets/{agent_filter-DQvQyxMp.js → agent_filter-COKVxYFV.js} +1 -1
- package/dist/inspector/assets/{agent_grant_detail-DRRM7KWw.js → agent_grant_detail-Dx9XnxQF.js} +1 -1
- package/dist/inspector/assets/{agent_grant_form-DNfWiVBQ.js → agent_grant_form-c_cKOS1t.js} +1 -1
- package/dist/inspector/assets/{agent_grants-BWgOPiOe.js → agent_grants-2kUpLoVa.js} +1 -1
- package/dist/inspector/assets/{agents-CPLAQelS.js → agents-CGacc5go.js} +1 -1
- package/dist/inspector/assets/{api_not_configured_state-DHesochj.js → api_not_configured_state-D3-Y7f4P.js} +1 -1
- package/dist/inspector/assets/{attribution_card-CCINKjRY.js → attribution_card-DHSwBDvm.js} +1 -1
- package/dist/inspector/assets/{attribution_summary-Dkwz1aNS.js → attribution_summary-BDb76qdA.js} +1 -1
- package/dist/inspector/assets/{bundles-f-bRlQYm.js → bundles-BrZCSKdE.js} +1 -1
- package/dist/inspector/assets/{card-18-eZw0x.js → card-HLZ7P9gv.js} +1 -1
- package/dist/inspector/assets/{checkbox-DUu6AMCH.js → checkbox-X0LhUk54.js} +1 -1
- package/dist/inspector/assets/{compliance-C1iqMRYK.js → compliance-B-vHY0Mj.js} +1 -1
- package/dist/inspector/assets/{confirm-dialog-KIPuwTQR.js → confirm-dialog-BZhGXjGp.js} +1 -1
- package/dist/inspector/assets/{conversation_common-aPvd5zmX.js → conversation_common-CqwsnXcN.js} +1 -1
- package/dist/inspector/assets/{conversation_detail-nJDDMCfc.js → conversation_detail-BmH4sCju.js} +1 -1
- package/dist/inspector/assets/{copy_id_button-BwaRGKNA.js → copy_id_button-CDok7EQV.js} +1 -1
- package/dist/inspector/assets/{copyable_code_block-DDi03yAz.js → copyable_code_block-j3QB0aQg.js} +1 -1
- package/dist/inspector/assets/{corrections-Dz2v9ju9.js → corrections-BnjNBaly.js} +1 -1
- package/dist/inspector/assets/{dashboard-CZOdnoJJ.js → dashboard-BulD_nUh.js} +1 -1
- package/dist/inspector/assets/{data-table-5i_gqEfj.js → data-table-B-mxpOia.js} +1 -1
- package/dist/inspector/assets/{design-BdKBUVmX.js → design-DnQ02ply.js} +2 -2
- package/dist/inspector/assets/{dialog-CNJoZoQS.js → dialog-CsNugp51.js} +1 -1
- package/dist/inspector/assets/{docs-sXzc0LTz.js → docs-BSpGmuZ2.js} +1 -1
- package/dist/inspector/assets/{docs_page_layout-CGg8ubQX.js → docs_page_layout-Ej9dnRro.js} +1 -1
- package/dist/inspector/assets/{embed_graph-BpLLD_vX.js → embed_graph-Dbg37Xuy.js} +1 -1
- package/dist/inspector/assets/{empty_state-DNk61WLW.js → empty_state-Y44G8LC3.js} +1 -1
- package/dist/inspector/assets/entities-DkBCXibK.js +5 -0
- package/dist/inspector/assets/{entity_correct-CfSggXgT.js → entity_correct-CSa6U1Nk.js} +2 -2
- package/dist/inspector/assets/{entity_history-CGila0eu.js → entity_history-CxmrR_9X.js} +1 -1
- package/dist/inspector/assets/{entity_history_sections-CXYX1gph.js → entity_history_sections-DEWV31Ot.js} +1 -1
- package/dist/inspector/assets/{entity_link-DUdsaj-A.js → entity_link-oDivxz85.js} +1 -1
- package/dist/inspector/assets/entity_relationships_by_type-DY0Ld1rw.js +1 -0
- package/dist/inspector/assets/{entity_segment_page-DRYjT1AU.js → entity_segment_page-WT6IOAC6.js} +1 -1
- package/dist/inspector/assets/{entity_table_column_toggle-DwwHY7Y8.js → entity_table_column_toggle-CBgWmzQl.js} +1 -1
- package/dist/inspector/assets/{entity_timeline-B4XYY56n.js → entity_timeline-Dq38UOgV.js} +1 -1
- package/dist/inspector/assets/{entity_types-ByB2PWZM.js → entity_types-CN-WOauu.js} +1 -1
- package/dist/inspector/assets/{faq-B-PEHwkf.js → faq-SK87sez6.js} +1 -1
- package/dist/inspector/assets/{graph_auto_fit-ClZnIOoR.js → graph_auto_fit-BMOrV_D2.js} +1 -1
- package/dist/inspector/assets/{graph_explorer-C-Xo8VWP.js → graph_explorer-DEu_WyZ2.js} +1 -1
- package/dist/inspector/assets/{home-D1UVMr6_.js → home-kfu3wSXt.js} +1 -1
- package/dist/inspector/assets/{index-MnCv_KTr.js → index-CnTUFeBn.js} +1 -1
- package/dist/inspector/assets/{index-C6fxoS_Z.js → index-D6jp2NN2.js} +1588 -1588
- package/dist/inspector/assets/{index-Cp0BQ57U.js → index-afk3dCXk.js} +1 -1
- package/dist/inspector/assets/interpretations-8w33Il_Q.js +1 -0
- package/dist/inspector/assets/{interpretations-DG5kUN-V.js → interpretations-DbtcIPBS.js} +1 -1
- package/dist/inspector/assets/{issue_author_attribution-D7_vwrHJ.js → issue_author_attribution-C_Uvk4F5.js} +1 -1
- package/dist/inspector/assets/{issue_detail-DKYUwKt_.js → issue_detail-Ct1G2hyw.js} +1 -1
- package/dist/inspector/assets/{issues-DcSMjt-p.js → issues-CUiar649.js} +1 -1
- package/dist/inspector/assets/{json_viewer-BKa7wwrs.js → json_viewer-DPC1DsaT.js} +1 -1
- package/dist/inspector/assets/{label-BO-aVMjO.js → label-BQ8-xKUC.js} +1 -1
- package/dist/inspector/assets/{live_relative_time-Dx00M9I6.js → live_relative_time-D1kEqQ4i.js} +1 -1
- package/dist/inspector/assets/{mobile_filter_popover-I9fJvTGr.js → mobile_filter_popover-Bvj6GSAo.js} +1 -1
- package/dist/inspector/assets/{not_found-DuCJouBh.js → not_found-0bIlvlSX.js} +1 -1
- package/dist/inspector/assets/{oauth_callback-w0kyGAb4.js → oauth_callback-BWXd9Wge.js} +1 -1
- package/dist/inspector/assets/{oauth_signin-3LQrxsKz.js → oauth_signin-CZO_QVYB.js} +1 -1
- package/dist/inspector/assets/{observations-Bq6mvl5m.js → observations-CikFMfEg.js} +1 -1
- package/dist/inspector/assets/{page_shell-BoTb5of6.js → page_shell-BosAA9Zi.js} +1 -1
- package/dist/inspector/assets/{pagination-BJtT1Wgy.js → pagination-9hSWjJSM.js} +1 -1
- package/dist/inspector/assets/{peer_detail-BM1jhSS2.js → peer_detail-BkQDnYWW.js} +1 -1
- package/dist/inspector/assets/{peers-CYSx-jAx.js → peers-BCBT6Ylr.js} +1 -1
- package/dist/inspector/assets/{pin_primitive_button-BdAR3e5K.js → pin_primitive_button-DDwdBrpd.js} +1 -1
- package/dist/inspector/assets/{recent_activity-Dio9UBCA.js → recent_activity-D8ZzUMMQ.js} +1 -1
- package/dist/inspector/assets/{recent_conversations-Be7S63h9.js → recent_conversations-DCgvsODD.js} +1 -1
- package/dist/inspector/assets/recent_conversations-Drio7WK-.js +1 -0
- package/dist/inspector/assets/{recent_records_feed-ZxHjVjQ6.js → recent_records_feed-BtPgzGjQ.js} +1 -1
- package/dist/inspector/assets/record_activity-OPIQqbxs.js +1 -0
- package/dist/inspector/assets/{relationship_detail-i9rsGxA6.js → relationship_detail-Bib84abm.js} +1 -1
- package/dist/inspector/assets/{relationship_panel_groups-CXFlrRHU.js → relationship_panel_groups-DLZtyWmB.js} +1 -1
- package/dist/inspector/assets/relationships-C6AMAVnt.js +1 -0
- package/dist/inspector/assets/{relationships-DqAzfnlB.js → relationships-CbmaLg1w.js} +1 -1
- package/dist/inspector/assets/{sandbox-Cn4vq2Pz.js → sandbox-CDn_AfpW.js} +1 -1
- package/dist/inspector/assets/{schema_detail-BdORXewP.js → schema_detail-rdHCdMiO.js} +1 -1
- package/dist/inspector/assets/{schemas-HYsBtoHT.js → schemas-BGFS1NIU.js} +2 -2
- package/dist/inspector/assets/search-D0mISNIp.js +1 -0
- package/dist/inspector/assets/{segmented_control-CHJO5zMt.js → segmented_control-Dh4asumQ.js} +1 -1
- package/dist/inspector/assets/{select-DFzP9laV.js → select-CGgVNBJP.js} +1 -1
- package/dist/inspector/assets/{settings-Bm0jNa4p.js → settings-WrB7DH64.js} +1 -1
- package/dist/inspector/assets/{source_content-PwVSPaIU.js → source_content-CdneU5cC.js} +1 -1
- package/dist/inspector/assets/{source_content_open_button-C7NKRG7q.js → source_content_open_button-DdwQmqei.js} +1 -1
- package/dist/inspector/assets/{source_detail-C2D885Zy.js → source_detail-BGV8BTSk.js} +5 -5
- package/dist/inspector/assets/source_link-3OE0LIxN.js +1 -0
- package/dist/inspector/assets/{sources-BvGo5OZp.js → sources-MQzjTQPU.js} +1 -1
- package/dist/inspector/assets/{subscriptions-BGYmtTLV.js → subscriptions-DSSlZgxQ.js} +1 -1
- package/dist/inspector/assets/{switch-DkusEYsE.js → switch-CE4bL5sC.js} +1 -1
- package/dist/inspector/assets/{tabs-hkbPHxT0.js → tabs-ZrN5u0Y9.js} +1 -1
- package/dist/inspector/assets/{textarea-BhC7xtLk.js → textarea-CBYe0AAK.js} +1 -1
- package/dist/inspector/assets/{timeline-DmjoODDd.js → timeline-Ad0NUrF_.js} +1 -1
- package/dist/inspector/assets/{timeline-CHi-lYcV.js → timeline-uLYAndU3.js} +1 -1
- package/dist/inspector/assets/{timeline_event_detail-BfKrsQih.js → timeline_event_detail-BfgHJ0XR.js} +1 -1
- package/dist/inspector/assets/{turn_detail-DGj1lT0k.js → turn_detail-CUBCiCcq.js} +1 -1
- package/dist/inspector/assets/{turns-CHfOIg9X.js → turns-B1PAnWxV.js} +1 -1
- package/dist/inspector/assets/use_agents-Kr_qThpq.js +1 -0
- package/dist/inspector/assets/{use_entities-DeIlqnzx.js → use_entities-zE9adlzL.js} +1 -1
- package/dist/inspector/assets/use_interpretations-CD0-ZgOr.js +1 -0
- package/dist/inspector/assets/{use_mutations-CQ3_5Ppg.js → use_mutations-D4WoExI4.js} +1 -1
- package/dist/inspector/assets/use_peers-k2UDs1Pi.js +1 -0
- package/dist/inspector/assets/{use_relationships-Dbtmx8X8.js → use_relationships-DVVjD-SH.js} +1 -1
- package/dist/inspector/assets/{use_stats-OyHBzetJ.js → use_stats-Cmjbd4x1.js} +1 -1
- package/dist/inspector/assets/{use_timeline-FINsibXm.js → use_timeline-De1q_UCR.js} +1 -1
- package/dist/inspector/assets/{use_turns-D4AhGAvM.js → use_turns-B4g1lTlJ.js} +1 -1
- package/dist/inspector/assets/{world_time_event_timeline-F0elR7Vc.js → world_time_event_timeline-CLue1xiu.js} +1 -1
- package/dist/inspector/index.html +1 -1
- package/dist/openclaw_entry.js +2 -2
- package/dist/openclaw_entry.js.map +1 -1
- package/dist/repositories/db/connection.d.ts +47 -0
- package/dist/repositories/db/connection.d.ts.map +1 -0
- package/dist/repositories/db/connection.js +153 -0
- package/dist/repositories/db/connection.js.map +1 -0
- package/dist/repositories/db/driver.d.ts +85 -0
- package/dist/repositories/db/driver.d.ts.map +1 -0
- package/dist/repositories/db/driver.js +89 -0
- package/dist/repositories/db/driver.js.map +1 -0
- package/dist/repositories/libsql/libsql_driver.d.ts +62 -0
- package/dist/repositories/libsql/libsql_driver.d.ts.map +1 -0
- package/dist/repositories/libsql/libsql_driver.js +170 -0
- package/dist/repositories/libsql/libsql_driver.js.map +1 -0
- package/dist/repositories/sqlite/local_db_adapter.d.ts +23 -0
- package/dist/repositories/sqlite/local_db_adapter.d.ts.map +1 -1
- package/dist/repositories/sqlite/local_db_adapter.js +192 -46
- package/dist/repositories/sqlite/local_db_adapter.js.map +1 -1
- package/dist/repositories/sqlite/sqlite_client.d.ts +6 -11
- package/dist/repositories/sqlite/sqlite_client.d.ts.map +1 -1
- package/dist/repositories/sqlite/sqlite_client.js +110 -130
- package/dist/repositories/sqlite/sqlite_client.js.map +1 -1
- package/dist/repositories/sqlite/sqlite_driver.d.ts +20 -0
- package/dist/repositories/sqlite/sqlite_driver.d.ts.map +1 -1
- package/dist/repositories/sqlite/sqlite_driver.js +129 -6
- package/dist/repositories/sqlite/sqlite_driver.js.map +1 -1
- package/dist/repositories/worker/worker_file_database.d.ts +81 -0
- package/dist/repositories/worker/worker_file_database.d.ts.map +1 -0
- package/dist/repositories/worker/worker_file_database.js +403 -0
- package/dist/repositories/worker/worker_file_database.js.map +1 -0
- package/dist/seed_schemas_entry.d.ts +14 -6
- package/dist/seed_schemas_entry.d.ts.map +1 -1
- package/dist/seed_schemas_entry.js +41 -32
- package/dist/seed_schemas_entry.js.map +1 -1
- package/dist/server.js +5 -5
- package/dist/server.js.map +1 -1
- package/dist/services/agents_directory.d.ts +4 -4
- package/dist/services/agents_directory.d.ts.map +1 -1
- package/dist/services/agents_directory.js +8 -8
- package/dist/services/agents_directory.js.map +1 -1
- package/dist/services/compliance/scorecard.d.ts +1 -1
- package/dist/services/compliance/scorecard.d.ts.map +1 -1
- package/dist/services/compliance/scorecard.js +4 -4
- package/dist/services/compliance/scorecard.js.map +1 -1
- package/dist/services/conversation_turn.d.ts +4 -4
- package/dist/services/conversation_turn.d.ts.map +1 -1
- package/dist/services/conversation_turn.js +21 -21
- package/dist/services/conversation_turn.js.map +1 -1
- package/dist/services/entity_merge.d.ts +5 -3
- package/dist/services/entity_merge.d.ts.map +1 -1
- package/dist/services/entity_merge.js +21 -19
- package/dist/services/entity_merge.js.map +1 -1
- package/dist/services/entity_queries.d.ts +16 -1
- package/dist/services/entity_queries.d.ts.map +1 -1
- package/dist/services/entity_queries.js +27 -0
- package/dist/services/entity_queries.js.map +1 -1
- package/dist/services/entity_semantic_search.js +1 -1
- package/dist/services/entity_semantic_search.js.map +1 -1
- package/dist/services/entity_snapshot_embedding.js +1 -1
- package/dist/services/entity_snapshot_embedding.js.map +1 -1
- package/dist/services/local_auth.d.ts +9 -9
- package/dist/services/local_auth.d.ts.map +1 -1
- package/dist/services/local_auth.js +48 -36
- package/dist/services/local_auth.js.map +1 -1
- package/dist/services/local_entity_embedding.d.ts +4 -4
- package/dist/services/local_entity_embedding.d.ts.map +1 -1
- package/dist/services/local_entity_embedding.js +38 -21
- package/dist/services/local_entity_embedding.js.map +1 -1
- package/dist/services/mcp_auth.js +5 -5
- package/dist/services/mcp_auth.js.map +1 -1
- package/dist/services/mcp_oauth.d.ts.map +1 -1
- package/dist/services/mcp_oauth.js +70 -58
- package/dist/services/mcp_oauth.js.map +1 -1
- package/dist/services/raw_storage.d.ts +9 -0
- package/dist/services/raw_storage.d.ts.map +1 -1
- package/dist/services/raw_storage.js +32 -19
- package/dist/services/raw_storage.js.map +1 -1
- package/dist/services/recent_conversations.d.ts +3 -3
- package/dist/services/recent_conversations.d.ts.map +1 -1
- package/dist/services/recent_conversations.js +17 -17
- package/dist/services/recent_conversations.js.map +1 -1
- package/dist/services/recent_record_activity.d.ts +2 -2
- package/dist/services/recent_record_activity.d.ts.map +1 -1
- package/dist/services/recent_record_activity.js +5 -5
- package/dist/services/recent_record_activity.js.map +1 -1
- package/dist/services/sandbox/sessions.d.ts +7 -7
- package/dist/services/sandbox/sessions.d.ts.map +1 -1
- package/dist/services/sandbox/sessions.js +50 -41
- package/dist/services/sandbox/sessions.js.map +1 -1
- package/dist/services/schema_registry.d.ts +7 -0
- package/dist/services/schema_registry.d.ts.map +1 -1
- package/dist/services/schema_registry.js +13 -0
- package/dist/services/schema_registry.js.map +1 -1
- package/dist/services/schema_registry_bootstrap.d.ts +71 -0
- package/dist/services/schema_registry_bootstrap.d.ts.map +1 -0
- package/dist/services/schema_registry_bootstrap.js +108 -0
- package/dist/services/schema_registry_bootstrap.js.map +1 -0
- package/dist/services/sessions/seed_schema.d.ts +25 -0
- package/dist/services/sessions/seed_schema.d.ts.map +1 -0
- package/dist/services/sessions/seed_schema.js +139 -0
- package/dist/services/sessions/seed_schema.js.map +1 -0
- package/dist/services/subscriptions/event_log.d.ts +10 -9
- package/dist/services/subscriptions/event_log.d.ts.map +1 -1
- package/dist/services/subscriptions/event_log.js +21 -20
- package/dist/services/subscriptions/event_log.js.map +1 -1
- package/dist/services/subscriptions/install_subscription_bridge.d.ts.map +1 -1
- package/dist/services/subscriptions/install_subscription_bridge.js +5 -5
- package/dist/services/subscriptions/install_subscription_bridge.js.map +1 -1
- package/dist/services/subscriptions/subscription_bridge.js +1 -1
- package/dist/services/subscriptions/subscription_bridge.js.map +1 -1
- package/dist/shared/action_handlers/entity_handlers.d.ts +1 -1
- package/dist/shared/action_handlers/entity_handlers.d.ts.map +1 -1
- package/dist/shared/action_schemas.d.ts +26 -26
- package/dist/shared/action_schemas.js +1 -1
- package/dist/shared/action_schemas.js.map +1 -1
- package/dist/shared/entity_display_name.d.ts +11 -1
- package/dist/shared/entity_display_name.d.ts.map +1 -1
- package/dist/shared/entity_display_name.js +24 -5
- package/dist/shared/entity_display_name.js.map +1 -1
- package/dist/shared/openapi_types.d.ts +13 -1
- package/dist/shared/openapi_types.d.ts.map +1 -1
- package/dist/tool_definitions.d.ts.map +1 -1
- package/dist/tool_definitions.js +12 -2
- package/dist/tool_definitions.js.map +1 -1
- package/docs/developer/mcp/instructions.md +1 -0
- package/openapi.yaml +13 -0
- package/package.json +3 -1
- package/dist/inspector/assets/entities-Cexhp3qr.js +0 -5
- package/dist/inspector/assets/entity_relationships_by_type-B_PH1APK.js +0 -1
- package/dist/inspector/assets/interpretations-BCs9qtw0.js +0 -1
- package/dist/inspector/assets/recent_conversations-iJTSJf5e.js +0 -1
- package/dist/inspector/assets/record_activity-BmMC7Q7l.js +0 -1
- package/dist/inspector/assets/relationships-DvWtOU7W.js +0 -1
- package/dist/inspector/assets/search-LzJnqvTB.js +0 -1
- package/dist/inspector/assets/source_link-6lMlhQnK.js +0 -1
- package/dist/inspector/assets/use_agents-6sUtEOpZ.js +0 -1
- package/dist/inspector/assets/use_interpretations-DvfzvGu3.js +0 -1
- package/dist/inspector/assets/use_peers-CW3OAs41.js +0 -1
package/dist/actions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAuC9B,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;AAkDpC,OAAO,EAGL,oBAAoB,EACrB,MAAM,8BAA8B,CAAC;AAWtC,OAAO,EAiCL,KAAK,wBAAwB,EAE9B,MAAM,4BAA4B,CAAC;AA8CpC,6FAA6F;AAC7F,wBAAgB,qBAAqB,IAAI,sBAAsB,GAAG,IAAI,CAErE;AAED,eAAO,MAAM,GAAG,6CAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
|
package/dist/actions.js
CHANGED
|
@@ -51,7 +51,7 @@ import { installInspectorLegacyRedirect, installInspectorRootStaticAssets, insta
|
|
|
51
51
|
import { EMBED_ALLOWED_ORIGINS_ENV, applyFrameAncestorsToCsp, buildFrameAncestorsDirective, embedCorsHeaders, isEmbedReadEndpoint, isEmbedShellPath, isOriginAllowed, parseAllowedEmbedOrigins, } from "./services/embed_cross_origin.js";
|
|
52
52
|
import { getSandboxTermsResponse } from "./services/sandbox/terms.js";
|
|
53
53
|
import { resolveSandboxReportTransport } from "./services/sandbox/transport.js";
|
|
54
|
-
import {
|
|
54
|
+
import { getDb } from "./repositories/db/connection.js";
|
|
55
55
|
import { getMcpAuthToken } from "./crypto/mcp_auth_token.js";
|
|
56
56
|
import { isOauthKeyCredentialValid, normalizeOauthNextPath, OAuthKeySessionStore, } from "./services/oauth_key_gate.js";
|
|
57
57
|
import { buildGoogleAuthorizeUrl, createGoogleSigninNonce, consumeGoogleSigninNonce, exchangeGoogleAuthorizationCode, getSharedGraphUserId, GoogleIdTokenError, isGoogleSigninEnabled, verifyGoogleIdToken, } from "./services/google_oidc.js";
|
|
@@ -251,7 +251,7 @@ if (isSandboxMode()) {
|
|
|
251
251
|
validate: { trustProxy: false },
|
|
252
252
|
});
|
|
253
253
|
const createAndSeedSession = async (packId) => {
|
|
254
|
-
const session = createSandboxSession(packId);
|
|
254
|
+
const session = await createSandboxSession(packId);
|
|
255
255
|
const pack = getSandboxPack(session.packId);
|
|
256
256
|
// Packs with seedPolicy "none" (e.g. the empty pack) legitimately seed
|
|
257
257
|
// nothing — that is "skipped", not a failure.
|
|
@@ -298,14 +298,14 @@ if (isSandboxMode()) {
|
|
|
298
298
|
.json({ error_code: "SESSION_CREATE_FAILED", message: err.message });
|
|
299
299
|
}
|
|
300
300
|
});
|
|
301
|
-
app.post("/sandbox/session/redeem", (req, res) => {
|
|
301
|
+
app.post("/sandbox/session/redeem", async (req, res) => {
|
|
302
302
|
try {
|
|
303
303
|
const code = typeof req.body?.code === "string" ? req.body.code : "";
|
|
304
304
|
if (!code) {
|
|
305
305
|
res.status(400).json({ error_code: "MISSING_CODE", message: "code is required" });
|
|
306
306
|
return;
|
|
307
307
|
}
|
|
308
|
-
const result = redeemOneTimeCode(code);
|
|
308
|
+
const result = await redeemOneTimeCode(code);
|
|
309
309
|
if (!result) {
|
|
310
310
|
res
|
|
311
311
|
.status(404)
|
|
@@ -332,8 +332,8 @@ if (isSandboxMode()) {
|
|
|
332
332
|
.json({ error_code: "SESSION_REDEEM_FAILED", message: err.message });
|
|
333
333
|
}
|
|
334
334
|
});
|
|
335
|
-
app.get("/sandbox/session", (req, res) => {
|
|
336
|
-
const session = resolveSessionFromRequest(req);
|
|
335
|
+
app.get("/sandbox/session", async (req, res) => {
|
|
336
|
+
const session = await resolveSessionFromRequest(req);
|
|
337
337
|
if (!session) {
|
|
338
338
|
res.status(401).json({ error_code: "NO_SESSION", message: "No active sandbox session" });
|
|
339
339
|
return;
|
|
@@ -346,13 +346,13 @@ if (isSandboxMode()) {
|
|
|
346
346
|
});
|
|
347
347
|
});
|
|
348
348
|
app.post("/sandbox/session/reset", async (req, res) => {
|
|
349
|
-
const session = resolveSessionFromRequest(req);
|
|
349
|
+
const session = await resolveSessionFromRequest(req);
|
|
350
350
|
if (!session) {
|
|
351
351
|
res.status(401).json({ error_code: "NO_SESSION", message: "No active sandbox session" });
|
|
352
352
|
return;
|
|
353
353
|
}
|
|
354
354
|
const packId = typeof req.body?.pack_id === "string" ? req.body.pack_id : undefined;
|
|
355
|
-
purgeSessionUserData(session.userId);
|
|
355
|
+
await purgeSessionUserData(session.userId);
|
|
356
356
|
const { session: newSession, seedStatus } = await createAndSeedSession(packId ?? session.packId);
|
|
357
357
|
res.cookie(SESSION_COOKIE_NAME, newSession.bearerToken, {
|
|
358
358
|
httpOnly: true,
|
|
@@ -367,22 +367,27 @@ if (isSandboxMode()) {
|
|
|
367
367
|
seed_status: seedStatus,
|
|
368
368
|
});
|
|
369
369
|
});
|
|
370
|
-
app.delete("/sandbox/session", (req, res) => {
|
|
371
|
-
const session = resolveSessionFromRequest(req);
|
|
370
|
+
app.delete("/sandbox/session", async (req, res) => {
|
|
371
|
+
const session = await resolveSessionFromRequest(req);
|
|
372
372
|
if (!session) {
|
|
373
373
|
res.status(401).json({ error_code: "NO_SESSION", message: "No active sandbox session" });
|
|
374
374
|
return;
|
|
375
375
|
}
|
|
376
|
-
revokeSession(session.userId);
|
|
377
|
-
purgeSessionUserData(session.userId);
|
|
376
|
+
await revokeSession(session.userId);
|
|
377
|
+
await purgeSessionUserData(session.userId);
|
|
378
378
|
res.clearCookie(SESSION_COOKIE_NAME, { path: "/" });
|
|
379
379
|
res.json({ ok: true });
|
|
380
380
|
});
|
|
381
381
|
setInterval(() => {
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
382
|
+
sweepExpiredSessions()
|
|
383
|
+
.then((purged) => {
|
|
384
|
+
if (purged > 0) {
|
|
385
|
+
logger.info(`[Sandbox] Swept ${purged} expired session(s)`);
|
|
386
|
+
}
|
|
387
|
+
})
|
|
388
|
+
.catch((err) => {
|
|
389
|
+
logger.error(`[Sandbox] session sweep failed: ${err.message}`);
|
|
390
|
+
});
|
|
386
391
|
}, 15 * 60 * 1000);
|
|
387
392
|
logger.info("[Sandbox] Session endpoints registered");
|
|
388
393
|
}
|
|
@@ -2372,7 +2377,7 @@ app.get("/mcp/oauth/google/callback", async (req, res) => {
|
|
|
2372
2377
|
// with it) — generate an unguessable throwaway so createLocalAuthUser's
|
|
2373
2378
|
// shared code path is satisfied without weakening any other account.
|
|
2374
2379
|
const throwawayPassword = randomBytes(32).toString("hex");
|
|
2375
|
-
const perEmailUser = createLocalAuthUser(email, throwawayPassword);
|
|
2380
|
+
const perEmailUser = await createLocalAuthUser(email, throwawayPassword);
|
|
2376
2381
|
// Shared-graph opt-in: when NEOTOMA_SHARED_GRAPH_USER_ID is set, an
|
|
2377
2382
|
// approved teammate (the email already passed the allowlist inside
|
|
2378
2383
|
// verifyGoogleIdToken) is bound to the shared graph's user_id instead of
|
|
@@ -2579,7 +2584,7 @@ app.get("/mcp/oauth/local-login", async (req, res) => {
|
|
|
2579
2584
|
// (no Google session on this cookie — the default, and the only
|
|
2580
2585
|
// possibility when the Google feature flag is off) is unchanged.
|
|
2581
2586
|
const googleUserId = getGoogleVerifiedUserId(req);
|
|
2582
|
-
const resolvedUserId = googleUserId ?? ensureLocalDevUser().id;
|
|
2587
|
+
const resolvedUserId = googleUserId ?? (await ensureLocalDevUser()).id;
|
|
2583
2588
|
const { completeLocalAuthorization } = await import("./services/mcp_oauth.js");
|
|
2584
2589
|
const { connectionId, redirectUri, clientState } = await completeLocalAuthorization(state, resolvedUserId);
|
|
2585
2590
|
const frontendBase = process.env.NEOTOMA_FRONTEND_URL || process.env.FRONTEND_URL || "http://localhost:5195";
|
|
@@ -2789,10 +2794,10 @@ app.get("/mcp/oauth/authorization-details", async (req, res) => {
|
|
|
2789
2794
|
// Validate token and get user (ensures user is authenticated)
|
|
2790
2795
|
const { validateSessionToken } = await import("./services/mcp_auth.js");
|
|
2791
2796
|
await validateSessionToken(token);
|
|
2792
|
-
const db =
|
|
2793
|
-
const stateData = db
|
|
2797
|
+
const db = await getDb();
|
|
2798
|
+
const stateData = (await db
|
|
2794
2799
|
.prepare("SELECT redirect_uri FROM mcp_oauth_state WHERE state = ?")
|
|
2795
|
-
.get(authorization_id);
|
|
2800
|
+
.get(authorization_id));
|
|
2796
2801
|
if (!stateData?.redirect_uri) {
|
|
2797
2802
|
return res.status(404).json({
|
|
2798
2803
|
error: "Authorization not found",
|
|
@@ -3030,7 +3035,9 @@ async function resolveRoutePrincipal(req, accept) {
|
|
|
3030
3035
|
if (routeAllowsLocalIssueWriteFallback(req) &&
|
|
3031
3036
|
isLocalRequest(req) &&
|
|
3032
3037
|
!headerAuth.startsWith("Bearer ")) {
|
|
3033
|
-
const userId = _localSandboxActive
|
|
3038
|
+
const userId = _localSandboxActive
|
|
3039
|
+
? (await ensureLocalSandboxUser()).id
|
|
3040
|
+
: (await ensureLocalDevUser()).id;
|
|
3034
3041
|
// Stamp the principal so a later `getAuthenticatedUserId` in the handler
|
|
3035
3042
|
// resolves the same local user without re-tripping the missing-Bearer gate.
|
|
3036
3043
|
stampUserPrincipal(req, userId);
|
|
@@ -3086,9 +3093,9 @@ export async function resolveGuestUserId(req, principal) {
|
|
|
3086
3093
|
// shared nil-UUID LOCAL_DEV_USER_ID. Outside local_sandbox mode (e.g. pure
|
|
3087
3094
|
// dev with explicit auth configured) continue to use the nil-UUID fallback.
|
|
3088
3095
|
if (_localSandboxActive) {
|
|
3089
|
-
return ensureLocalSandboxUser().id;
|
|
3096
|
+
return (await ensureLocalSandboxUser()).id;
|
|
3090
3097
|
}
|
|
3091
|
-
return ensureLocalDevUser().id;
|
|
3098
|
+
return (await ensureLocalDevUser()).id;
|
|
3092
3099
|
}
|
|
3093
3100
|
throw new Error("Not authenticated - guest principal cannot resolve a user_id: no valid token grant and not a local request");
|
|
3094
3101
|
}
|
|
@@ -3215,12 +3222,12 @@ app.use(async (req, res, next) => {
|
|
|
3215
3222
|
return next();
|
|
3216
3223
|
}
|
|
3217
3224
|
if (_localSandboxActive) {
|
|
3218
|
-
const sandboxUser = ensureLocalSandboxUser();
|
|
3225
|
+
const sandboxUser = await ensureLocalSandboxUser();
|
|
3219
3226
|
stampUserPrincipal(req, sandboxUser.id);
|
|
3220
3227
|
logger.info(`[Auth] ${req.method} ${req.path} auth_method=local_sandbox user_id=${sandboxUser.id}`);
|
|
3221
3228
|
return next();
|
|
3222
3229
|
}
|
|
3223
|
-
const devUser = ensureLocalDevUser();
|
|
3230
|
+
const devUser = await ensureLocalDevUser();
|
|
3224
3231
|
stampUserPrincipal(req, devUser.id);
|
|
3225
3232
|
logger.info(`[Auth] ${req.method} ${req.path} auth_method=local_no_bearer user_id=${devUser.id}`);
|
|
3226
3233
|
return next();
|
|
@@ -3228,7 +3235,7 @@ app.use(async (req, res, next) => {
|
|
|
3228
3235
|
// Sandbox ephemeral session: resolve from cookie or Bearer token before
|
|
3229
3236
|
// falling back to the shared public user. Expired/revoked sessions 401.
|
|
3230
3237
|
if (isSandboxMode()) {
|
|
3231
|
-
const sessionInfo = resolveSessionFromRequest(req);
|
|
3238
|
+
const sessionInfo = await resolveSessionFromRequest(req);
|
|
3232
3239
|
if (sessionInfo) {
|
|
3233
3240
|
stampUserPrincipal(req, sessionInfo.userId);
|
|
3234
3241
|
logger.info(`[Auth] ${req.method} ${req.path} auth_method=sandbox_session user_id=${sessionInfo.userId}`);
|
|
@@ -3250,12 +3257,12 @@ app.use(async (req, res, next) => {
|
|
|
3250
3257
|
// queries by req.authenticatedUserId.
|
|
3251
3258
|
const aauthCtx = req.aauth;
|
|
3252
3259
|
if (aauthCtx?.verified === true && typeof aauthCtx.thumbprint === "string") {
|
|
3253
|
-
const aauthUser = ensureSandboxAauthUser(aauthCtx.thumbprint);
|
|
3260
|
+
const aauthUser = await ensureSandboxAauthUser(aauthCtx.thumbprint);
|
|
3254
3261
|
stampUserPrincipal(req, aauthUser.id);
|
|
3255
3262
|
logger.info(`[Auth] ${req.method} ${req.path} auth_method=sandbox_aauth user_id=${aauthUser.id} thumbprint=${aauthCtx.thumbprint}`);
|
|
3256
3263
|
return next();
|
|
3257
3264
|
}
|
|
3258
|
-
const sandboxUser = ensureSandboxPublicUser();
|
|
3265
|
+
const sandboxUser = await ensureSandboxPublicUser();
|
|
3259
3266
|
stampUserPrincipal(req, sandboxUser.id);
|
|
3260
3267
|
logger.info(`[Auth] ${req.method} ${req.path} auth_method=sandbox_public user_id=${sandboxUser.id}`);
|
|
3261
3268
|
return next();
|
|
@@ -3268,7 +3275,7 @@ app.use(async (req, res, next) => {
|
|
|
3268
3275
|
if (headerAuth.startsWith("Bearer ") && mcpExpectedToken) {
|
|
3269
3276
|
const token = headerAuth.slice(7).trim();
|
|
3270
3277
|
if (safeCompareTokens(token, mcpExpectedToken)) {
|
|
3271
|
-
const devUser = ensureLocalDevUser();
|
|
3278
|
+
const devUser = await ensureLocalDevUser();
|
|
3272
3279
|
stampUserPrincipal(req, devUser.id);
|
|
3273
3280
|
logger.info(`[Auth] ${req.method} ${req.path} auth_method=bearer_mcp_token user_id=${devUser.id}`);
|
|
3274
3281
|
return next();
|
|
@@ -3285,12 +3292,12 @@ app.use(async (req, res, next) => {
|
|
|
3285
3292
|
}
|
|
3286
3293
|
if (isLocalRequest(req)) {
|
|
3287
3294
|
if (_localSandboxActive) {
|
|
3288
|
-
const sandboxUser = ensureLocalSandboxUser();
|
|
3295
|
+
const sandboxUser = await ensureLocalSandboxUser();
|
|
3289
3296
|
stampUserPrincipal(req, sandboxUser.id);
|
|
3290
3297
|
logger.info(`[Auth] ${req.method} ${req.path} auth_method=local_sandbox user_id=${sandboxUser.id}`);
|
|
3291
3298
|
return next();
|
|
3292
3299
|
}
|
|
3293
|
-
const devUser = ensureLocalDevUser();
|
|
3300
|
+
const devUser = await ensureLocalDevUser();
|
|
3294
3301
|
stampUserPrincipal(req, devUser.id);
|
|
3295
3302
|
logger.info(`[Auth] ${req.method} ${req.path} auth_method=local_no_bearer user_id=${devUser.id}`);
|
|
3296
3303
|
return next();
|
|
@@ -3299,7 +3306,7 @@ app.use(async (req, res, next) => {
|
|
|
3299
3306
|
if (headerAuth.startsWith("Bearer ") && process.env.NEOTOMA_BEARER_TOKEN) {
|
|
3300
3307
|
const token = headerAuth.slice(7).trim();
|
|
3301
3308
|
if (safeCompareTokens(token, process.env.NEOTOMA_BEARER_TOKEN)) {
|
|
3302
|
-
const devUser = ensureLocalDevUser();
|
|
3309
|
+
const devUser = await ensureLocalDevUser();
|
|
3303
3310
|
stampUserPrincipal(req, devUser.id);
|
|
3304
3311
|
logger.info(`[Auth] ${req.method} ${req.path} auth_method=bearer_env user_id=${devUser.id}`);
|
|
3305
3312
|
return next();
|
|
@@ -3403,7 +3410,7 @@ app.use(async (req, res, next) => {
|
|
|
3403
3410
|
// sandboxDestructiveGuard, and AAuth-only routes by aauthRequired.
|
|
3404
3411
|
if (isSandboxMode()) {
|
|
3405
3412
|
res.clearCookie(SESSION_COOKIE_NAME, { path: "/" });
|
|
3406
|
-
const sandboxUser = ensureSandboxPublicUser();
|
|
3413
|
+
const sandboxUser = await ensureSandboxPublicUser();
|
|
3407
3414
|
stampUserPrincipal(req, sandboxUser.id);
|
|
3408
3415
|
logger.info(`[Auth] ${req.method} ${req.path} auth_method=sandbox_public_stale_bearer user_id=${sandboxUser.id}`);
|
|
3409
3416
|
return next();
|
|
@@ -4575,7 +4582,7 @@ app.get("/record_activity", async (req, res) => {
|
|
|
4575
4582
|
const limit = parseInt(String(req.query.limit ?? "50"), 10) || 50;
|
|
4576
4583
|
const offset = parseInt(String(req.query.offset ?? "0"), 10) || 0;
|
|
4577
4584
|
const recordTypes = parseRecordActivityTypesQuery(req.query.record_types);
|
|
4578
|
-
const result = listRecentRecordActivity(userId, {
|
|
4585
|
+
const result = await listRecentRecordActivity(userId, {
|
|
4579
4586
|
limit,
|
|
4580
4587
|
offset,
|
|
4581
4588
|
...(recordTypes?.length ? { recordTypes } : {}),
|
|
@@ -4591,7 +4598,7 @@ app.get("/record_activity", async (req, res) => {
|
|
|
4591
4598
|
app.get("/agents", async (req, res) => {
|
|
4592
4599
|
try {
|
|
4593
4600
|
const userId = await getAuthenticatedUserId(req, req.query.user_id);
|
|
4594
|
-
const result = listAgents(userId);
|
|
4601
|
+
const result = await listAgents(userId);
|
|
4595
4602
|
return res.json(result);
|
|
4596
4603
|
}
|
|
4597
4604
|
catch (error) {
|
|
@@ -4737,7 +4744,7 @@ app.get("/agents/:key", async (req, res) => {
|
|
|
4737
4744
|
try {
|
|
4738
4745
|
const userId = await getAuthenticatedUserId(req, req.query.user_id);
|
|
4739
4746
|
const agentKey = decodeURIComponent(req.params.key);
|
|
4740
|
-
const agent = getAgent(userId, agentKey);
|
|
4747
|
+
const agent = await getAgent(userId, agentKey);
|
|
4741
4748
|
if (!agent) {
|
|
4742
4749
|
return sendError(res, 404, "RESOURCE_NOT_FOUND", `Agent not found: ${agentKey}`);
|
|
4743
4750
|
}
|
|
@@ -4757,7 +4764,7 @@ app.get("/agents/:key/records", async (req, res) => {
|
|
|
4757
4764
|
const agentKey = decodeURIComponent(req.params.key);
|
|
4758
4765
|
const limit = parseInt(String(req.query.limit ?? "50"), 10) || 50;
|
|
4759
4766
|
const offset = parseInt(String(req.query.offset ?? "0"), 10) || 0;
|
|
4760
|
-
const result = listAgentRecords(userId, agentKey, limit, offset);
|
|
4767
|
+
const result = await listAgentRecords(userId, agentKey, limit, offset);
|
|
4761
4768
|
return res.json(result);
|
|
4762
4769
|
}
|
|
4763
4770
|
catch (error) {
|
|
@@ -4769,7 +4776,7 @@ app.get("/recent_conversations/:conversation_id", async (req, res) => {
|
|
|
4769
4776
|
try {
|
|
4770
4777
|
const userId = await getAuthenticatedUserId(req, req.query.user_id);
|
|
4771
4778
|
const conversationId = String(req.params.conversation_id ?? "").trim();
|
|
4772
|
-
const item = getRecentConversationById(userId, conversationId);
|
|
4779
|
+
const item = await getRecentConversationById(userId, conversationId);
|
|
4773
4780
|
if (!item) {
|
|
4774
4781
|
return sendError(res, 404, "RESOURCE_NOT_FOUND", "Conversation not found");
|
|
4775
4782
|
}
|
|
@@ -4792,7 +4799,7 @@ app.get("/recent_conversations", async (req, res) => {
|
|
|
4792
4799
|
const agentKeyRaw = typeof req.query.agent_key === "string" ? req.query.agent_key.trim() : "";
|
|
4793
4800
|
// UI and bookmarks may send agent_key=all; never treat that as a real deriveAgentKey value.
|
|
4794
4801
|
const agent_key = agentKeyRaw.length > 0 && agentKeyRaw.toLowerCase() !== "all" ? agentKeyRaw : null;
|
|
4795
|
-
const result = listRecentConversations(userId, limit, offset, {
|
|
4802
|
+
const result = await listRecentConversations(userId, limit, offset, {
|
|
4796
4803
|
activity_after,
|
|
4797
4804
|
activity_before,
|
|
4798
4805
|
agent_key,
|
|
@@ -4851,7 +4858,7 @@ app.get("/turns", async (req, res) => {
|
|
|
4851
4858
|
const activity_before = typeof req.query.activity_before === "string"
|
|
4852
4859
|
? req.query.activity_before.trim() || null
|
|
4853
4860
|
: null;
|
|
4854
|
-
const result = listConversationTurns(userId, limit, offset, {
|
|
4861
|
+
const result = await listConversationTurns(userId, limit, offset, {
|
|
4855
4862
|
harness,
|
|
4856
4863
|
status,
|
|
4857
4864
|
activity_after,
|
|
@@ -4868,7 +4875,7 @@ app.get("/turns/:turn_key", async (req, res) => {
|
|
|
4868
4875
|
try {
|
|
4869
4876
|
const userId = await getAuthenticatedUserId(req, req.query.user_id);
|
|
4870
4877
|
const turnKey = decodeURIComponent(req.params.turn_key);
|
|
4871
|
-
const result = getConversationTurn(userId, turnKey);
|
|
4878
|
+
const result = await getConversationTurn(userId, turnKey);
|
|
4872
4879
|
if (!result) {
|
|
4873
4880
|
return res.status(404).json({ error: "Turn not found", code: "NOT_FOUND" });
|
|
4874
4881
|
}
|
|
@@ -4890,7 +4897,7 @@ app.get("/admin/compliance/scorecard", async (req, res) => {
|
|
|
4890
4897
|
const top_missed_steps = parseInt(String(req.query.top_missed_steps ?? ""), 10);
|
|
4891
4898
|
const include_synthetic = req.query.include_synthetic === "1" ||
|
|
4892
4899
|
String(req.query.include_synthetic).toLowerCase() === "true";
|
|
4893
|
-
const result = buildComplianceScorecard(userId, {
|
|
4900
|
+
const result = await buildComplianceScorecard(userId, {
|
|
4894
4901
|
since,
|
|
4895
4902
|
until,
|
|
4896
4903
|
group_by,
|
|
@@ -8152,7 +8159,7 @@ const handleIssuesSubmitHttp = async (req, res) => {
|
|
|
8152
8159
|
parsed.data.local_issue_id ||
|
|
8153
8160
|
parsed.data.submission_timestamp);
|
|
8154
8161
|
const userId = principal.kind === "guest" && !principal.accessToken
|
|
8155
|
-
? ensureLocalDevUser().id
|
|
8162
|
+
? (await ensureLocalDevUser()).id
|
|
8156
8163
|
: principal.kind === "guest" || guestSubmitPayload
|
|
8157
8164
|
? ((await resolveGuestUserId(req, principal)) ??
|
|
8158
8165
|
(await getAuthenticatedUserId(req, parsed.data.user_id)))
|
|
@@ -9129,7 +9136,7 @@ app.get("/events/stream", async (req, res) => {
|
|
|
9129
9136
|
};
|
|
9130
9137
|
if (lastEventId !== undefined && !ringHasId(lastEventId)) {
|
|
9131
9138
|
const cursorSeq = Number(lastEventId);
|
|
9132
|
-
if (Number.isFinite(cursorSeq) && hasDurableCursor(userId, cursorSeq)) {
|
|
9139
|
+
if (Number.isFinite(cursorSeq) && (await hasDurableCursor(userId, cursorSeq))) {
|
|
9133
9140
|
// Recoverable from durable storage: replay from the log, paging until
|
|
9134
9141
|
// drained, then continue from the ring tail for anything newer.
|
|
9135
9142
|
// Push the subscription's column-backed predicates into SQL so a narrow
|
|
@@ -9142,7 +9149,7 @@ app.get("/events/stream", async (req, res) => {
|
|
|
9142
9149
|
};
|
|
9143
9150
|
let after = cursorSeq;
|
|
9144
9151
|
for (;;) {
|
|
9145
|
-
const batch = getEventsAfterSeq(userId, after, 1000, durableFilter);
|
|
9152
|
+
const batch = await getEventsAfterSeq(userId, after, 1000, durableFilter);
|
|
9146
9153
|
if (batch.length === 0)
|
|
9147
9154
|
break;
|
|
9148
9155
|
for (const d of batch) {
|
|
@@ -9554,6 +9561,36 @@ export async function startHTTPServer() {
|
|
|
9554
9561
|
}
|
|
9555
9562
|
// Initialize encryption service
|
|
9556
9563
|
await initServerKeys();
|
|
9564
|
+
// Seed the built-in schema registry from ENTITY_SCHEMAS (issue #1968).
|
|
9565
|
+
//
|
|
9566
|
+
// Runs FIRST among the boot-time seeders so an unseeded instance has its
|
|
9567
|
+
// core types registered before the service-specific seeders below extend
|
|
9568
|
+
// them. `loadActiveSchema` is DB-only with no code fallback, so without this
|
|
9569
|
+
// a fresh instance silently loses store-time auto-linking. Seeding here (as
|
|
9570
|
+
// opposed to only in a Fly `release_command` or the RC redeploy script)
|
|
9571
|
+
// covers every deploy path, including ones not yet written.
|
|
9572
|
+
//
|
|
9573
|
+
// Strictly additive: entity types that already have an active global schema
|
|
9574
|
+
// are left untouched, so an operator's custom schema is never reverted.
|
|
9575
|
+
try {
|
|
9576
|
+
const { seedSchemaRegistryIfEmpty } = await import("./services/schema_registry_bootstrap.js");
|
|
9577
|
+
const summary = await seedSchemaRegistryIfEmpty();
|
|
9578
|
+
if (summary.registered.length > 0) {
|
|
9579
|
+
logger.info(`[SchemaRegistry] registry empty for ${summary.registered.length} type(s) → seeding: ` +
|
|
9580
|
+
`${summary.registered.join(", ")} (preserved ${summary.preserved.length} existing)`);
|
|
9581
|
+
}
|
|
9582
|
+
else {
|
|
9583
|
+
logger.info(`[SchemaRegistry] all ${summary.preserved.length} built-in schema(s) already registered; nothing to seed`);
|
|
9584
|
+
}
|
|
9585
|
+
if (summary.failed.length > 0) {
|
|
9586
|
+
logger.warn(`[SchemaRegistry] ${summary.failed.length} schema(s) failed to seed: ` +
|
|
9587
|
+
summary.failed.map((f) => `${f.entity_type} (${f.error})`).join("; "));
|
|
9588
|
+
}
|
|
9589
|
+
}
|
|
9590
|
+
catch (err) {
|
|
9591
|
+
// Never block boot — a briefly-unavailable DB must not stop the server.
|
|
9592
|
+
logger.warn(`[SchemaRegistry] failed to seed built-in schemas: ${err.message}`);
|
|
9593
|
+
}
|
|
9557
9594
|
// Seed `issue` schema for the GitHub Issues integration.
|
|
9558
9595
|
try {
|
|
9559
9596
|
const { seedIssueSchema } = await import("./services/issues/seed_schema.js");
|
|
@@ -9572,6 +9609,15 @@ export async function startHTTPServer() {
|
|
|
9572
9609
|
catch (err) {
|
|
9573
9610
|
logger.warn(`[Plans] failed to seed plan schema: ${err.message}`);
|
|
9574
9611
|
}
|
|
9612
|
+
// Seed `agent_session` + `session_transcript` schemas (transcript ingest).
|
|
9613
|
+
try {
|
|
9614
|
+
const { seedSessionSchemas } = await import("./services/sessions/seed_schema.js");
|
|
9615
|
+
await seedSessionSchemas();
|
|
9616
|
+
logger.info("[Sessions] agent_session + session_transcript schemas seeded");
|
|
9617
|
+
}
|
|
9618
|
+
catch (err) {
|
|
9619
|
+
logger.warn(`[Sessions] failed to seed session schemas: ${err.message}`);
|
|
9620
|
+
}
|
|
9575
9621
|
// Seed `skill` schema (harness-mirrored skills, slash-command palette).
|
|
9576
9622
|
try {
|
|
9577
9623
|
const { seedSkillSchema } = await import("./services/skills/seed_schema.js");
|
|
@@ -9683,7 +9729,7 @@ export async function startHTTPServer() {
|
|
|
9683
9729
|
// user rather than the shared nil-UUID LOCAL_DEV_USER_ID fallback.
|
|
9684
9730
|
_localSandboxActive = true;
|
|
9685
9731
|
try {
|
|
9686
|
-
const sandboxUser = ensureLocalSandboxUser();
|
|
9732
|
+
const sandboxUser = await ensureLocalSandboxUser();
|
|
9687
9733
|
logger.info(`[sandbox_mode] local_sandbox principal provisioned: ${sandboxUser.id}`);
|
|
9688
9734
|
}
|
|
9689
9735
|
catch (err) {
|
|
@@ -9738,6 +9784,42 @@ export async function startHTTPServer() {
|
|
|
9738
9784
|
// Only auto-start if not disabled AND if this is the main module
|
|
9739
9785
|
const isMainModule = import.meta.url === `file://${process.argv[1]}`;
|
|
9740
9786
|
if (process.env.NEOTOMA_ACTIONS_DISABLE_AUTOSTART !== "1" && isMainModule) {
|
|
9787
|
+
// Exit diagnostics. A long-running server should never reach `beforeExit`:
|
|
9788
|
+
// that event only fires when the event loop has drained, i.e. nothing is
|
|
9789
|
+
// left holding the process open. In production this happened silently and
|
|
9790
|
+
// repeatedly — the process exited with code 0 every ~12 minutes with no
|
|
9791
|
+
// error and no signal, and because the exit was CLEAN the platform read it
|
|
9792
|
+
// as success and declined to restart, turning it into an outage
|
|
9793
|
+
// (neotoma#2094).
|
|
9794
|
+
//
|
|
9795
|
+
// Logging the active resources at that moment names what the loop was (and
|
|
9796
|
+
// was no longer) waiting on, which is the one piece of evidence needed to
|
|
9797
|
+
// find the handle that stops holding the server up. `exit` is logged too so
|
|
9798
|
+
// the code and reason are attributable even when the cause is external.
|
|
9799
|
+
process.on("beforeExit", (code) => {
|
|
9800
|
+
let resources = [];
|
|
9801
|
+
try {
|
|
9802
|
+
const getResources = process
|
|
9803
|
+
.getActiveResourcesInfo;
|
|
9804
|
+
if (typeof getResources === "function")
|
|
9805
|
+
resources = getResources.call(process);
|
|
9806
|
+
}
|
|
9807
|
+
catch {
|
|
9808
|
+
/* diagnostics must never themselves throw */
|
|
9809
|
+
}
|
|
9810
|
+
console.error(`[neotoma] beforeExit code=${code} — event loop drained; a long-running ` +
|
|
9811
|
+
`server should not reach here. activeResources=${JSON.stringify(resources)} ` +
|
|
9812
|
+
`uptime=${process.uptime().toFixed(1)}s`);
|
|
9813
|
+
});
|
|
9814
|
+
process.on("exit", (code) => {
|
|
9815
|
+
console.error(`[neotoma] exit code=${code} uptime=${process.uptime().toFixed(1)}s`);
|
|
9816
|
+
});
|
|
9817
|
+
for (const sig of ["SIGTERM", "SIGINT", "SIGHUP"]) {
|
|
9818
|
+
process.on(sig, () => {
|
|
9819
|
+
console.error(`[neotoma] received ${sig} uptime=${process.uptime().toFixed(1)}s`);
|
|
9820
|
+
process.exit(0);
|
|
9821
|
+
});
|
|
9822
|
+
}
|
|
9741
9823
|
startHTTPServer().catch((err) => {
|
|
9742
9824
|
console.error("Failed to start HTTP server:", err);
|
|
9743
9825
|
process.exit(1);
|