diff --git a/.faim/axioms.sha256 b/.faim/axioms.sha256 index 5eccbd1..65ad660 100644 --- a/.faim/axioms.sha256 +++ b/.faim/axioms.sha256 @@ -1 +1 @@ -51dc4dfd2916d1c7714d21f9325a1e85b6838c1411d1c2a668b3512413aaf05e +0cc75494ae7622332fe1f66cccbb1a3f5f845af7a98b10f78ea8683ce54c4a27 diff --git a/.faim/axioms/decisions.pl b/.faim/axioms/decisions.pl index 1c8b344..3169d0a 100644 --- a/.faim/axioms/decisions.pl +++ b/.faim/axioms/decisions.pl @@ -9,3 +9,60 @@ prop(project, orm, prisma). prop(project, runtime, node24). prop(project, realtime, sse). +prop(project, summary, 'Team Lunch coordinates office lunch decisions: poll menus, pick a winner, collect food orders, and improve recommendations from history.'). +prop(project, primary_goal, 'Help authenticated office users decide and order lunch with retained history for analytics and recommendation learning.'). + +% --- product blueprint --- +entity(admin_user, actor). +prop(admin_user, summary, 'Approves users and manages local accounts, access, menus, and operational setup.'). + +entity(approved_user, actor). +prop(approved_user, summary, 'Authenticated team member who votes in polls, places food orders, sets preferences, and receives recommendations.'). + +entity(auth_system, actor). +prop(auth_system, summary, 'Backend session and access-control boundary for local and Entra-authenticated users.'). + +entity(polls, domain). +prop(polls, summary, 'Menu voting phase that determines the restaurant/menu winner or a tie needing resolution.'). + +entity(menus, domain). +prop(menus, summary, 'Imported or manually managed restaurant menus and menu items.'). + +entity(food_selections, domain). +prop(food_selections, summary, 'Post-poll ordering phase where users submit line-item lunch orders for the winning menu.'). + +entity(recommendations, domain). +prop(recommendations, summary, 'Meal ranking and explanation layer using preferences, allergies, ratings, order history, and optional AI wording.'). + +entity(auth_access, domain). +prop(auth_access, summary, 'Authentication, approval, session versioning, roles, and audit history.'). + +entity(lunch_decision_flow, workflow). +prop(lunch_decision_flow, summary, 'Poll menus, finish or resolve tie, open food selection, collect orders, then retain outcomes for future recommendations.'). +prop(lunch_decision_flow, stateful, true). + +entity(menu_polling, workflow). +prop(menu_polling, summary, 'Users vote on available menus until one wins or the poll ties.'). +prop(menu_polling, stateful, true). + +entity(food_ordering, workflow). +prop(food_ordering, summary, 'Users order line items from the winning menu before the food-selection timer closes.'). +prop(food_ordering, stateful, true). + +entity(meal_recommendation, workflow). +prop(meal_recommendation, summary, 'System scores current menu items for a user and persists recommendation impressions for learning/audit.'). +prop(meal_recommendation, stateful, true). + +rel(lunch_decision_flow, uses, polls). +rel(lunch_decision_flow, uses, menus). +rel(lunch_decision_flow, uses, food_selections). +rel(lunch_decision_flow, uses, recommendations). +rel(lunch_decision_flow, uses, auth_access). +rel(menu_polling, precedes, food_ordering). +rel(food_ordering, precedes, meal_recommendation). +rel(admin_user, owns, auth_access). +rel(admin_user, owns, menus). +rel(approved_user, participates_in, menu_polling). +rel(approved_user, participates_in, food_ordering). +rel(approved_user, participates_in, meal_recommendation). +rel(auth_system, participates_in, lunch_decision_flow). diff --git a/.faim/axioms/schema.pl b/.faim/axioms/schema.pl index a82883e..196bdb9 100644 --- a/.faim/axioms/schema.pl +++ b/.faim/axioms/schema.pl @@ -13,6 +13,9 @@ kind(module). % other source module (db singleton, shared lib, util) kind(event). % an SSE event name broadcast through src/server/sse.ts kind(type). % a shared request/response/domain type in src/lib +kind(domain). % durable product/business area +kind(actor). % user/system role participating in the product +kind(workflow). % core product flow or phase % --- attributes --- attr(project, language, atom). @@ -21,6 +24,8 @@ attr(project, orm, atom). attr(project, runtime, atom). attr(project, realtime, atom). +attr(project, summary, string). +attr(project, primary_goal, string). attr(endpoint, method, atom). attr(endpoint, path, string). @@ -31,12 +36,21 @@ attr(event, scoped_by, atom). % e.g. office_location (multi-office isolation) +attr(domain, summary, string). +attr(actor, summary, string). +attr(workflow, summary, string). +attr(workflow, stateful, boolean). + % --- relationship types --- reltype(depends_on, any, any). reltype(emits, one_of([service, route]), event). reltype(consumes, any, event). reltype(exposes, route, endpoint). reltype(declares, one_of([service, module, route]), type). +reltype(uses, any, any). +reltype(owns, actor, domain). +reltype(precedes, workflow, workflow). +reltype(participates_in, actor, workflow). % --- temporal event types (for requirement triggers) --- event_type(deployment). diff --git a/.faim/derived/provenance.pl b/.faim/derived/provenance.pl deleted file mode 100644 index 6164279..0000000 --- a/.faim/derived/provenance.pl +++ /dev/null @@ -1,504 +0,0 @@ -% provenance.pl — Tier 2 trust layer. One group per derived fact. -% Kept separate so structure.pl stays readable. -% -% derived_from(Fact, Source). Source: scanner_scan | agent_scan | user_attested -% source_files(Fact, [Path, ...]). EVERY file consulted — completeness = trust. -% source_hash(Fact, Sha256). content hash for cheap staleness detection -% derivation_query(Fact, Question). the question answered (re-derivation key) -% derived_at(Fact, Timestamp, Agent). -% -% Example: -% derived_from(prop('/abc', requires_auth, true), agent_scan). -% source_files(prop('/abc', requires_auth, true), ['src/routes/abc.rs']). -% source_hash(prop('/abc', requires_auth, true), 'sha256:...'). -% derivation_query(prop('/abc', requires_auth, true), 'does /abc require auth'). -derived_from(entity(mealRecommendation,service), agent_scan). -source_files(entity(mealRecommendation,service), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(entity(mealRecommendation,service), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(entity(mealRecommendation,service), "recommender feature dependency spine for blast-radius queries"). -derived_at(entity(mealRecommendation,service), '2026-06-24T05:07:35Z', agent). -derived_from(entity(mealRecommendationModel,service), agent_scan). -source_files(entity(mealRecommendationModel,service), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(entity(mealRecommendationModel,service), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(entity(mealRecommendationModel,service), "recommender feature dependency spine for blast-radius queries"). -derived_at(entity(mealRecommendationModel,service), '2026-06-24T05:07:35Z', agent). -derived_from(entity(mealRecommendationAi,service), agent_scan). -source_files(entity(mealRecommendationAi,service), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(entity(mealRecommendationAi,service), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(entity(mealRecommendationAi,service), "recommender feature dependency spine for blast-radius queries"). -derived_at(entity(mealRecommendationAi,service), '2026-06-24T05:07:35Z', agent). -derived_from(entity(mealRecommendationEval,service), agent_scan). -source_files(entity(mealRecommendationEval,service), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(entity(mealRecommendationEval,service), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(entity(mealRecommendationEval,service), "recommender feature dependency spine for blast-radius queries"). -derived_at(entity(mealRecommendationEval,service), '2026-06-24T05:07:36Z', agent). -derived_from(entity(mealFeatures,service), agent_scan). -source_files(entity(mealFeatures,service), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(entity(mealFeatures,service), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(entity(mealFeatures,service), "recommender feature dependency spine for blast-radius queries"). -derived_at(entity(mealFeatures,service), '2026-06-24T05:07:36Z', agent). -derived_from(entity(mealItemIdentity,service), agent_scan). -source_files(entity(mealItemIdentity,service), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(entity(mealItemIdentity,service), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(entity(mealItemIdentity,service), "recommender feature dependency spine for blast-radius queries"). -derived_at(entity(mealItemIdentity,service), '2026-06-24T05:07:36Z', agent). -derived_from(entity(officeRecommenderSettings,service), agent_scan). -source_files(entity(officeRecommenderSettings,service), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(entity(officeRecommenderSettings,service), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(entity(officeRecommenderSettings,service), "recommender feature dependency spine for blast-radius queries"). -derived_at(entity(officeRecommenderSettings,service), '2026-06-24T05:07:36Z', agent). -derived_from(entity(userPreferences,service), agent_scan). -source_files(entity(userPreferences,service), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(entity(userPreferences,service), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(entity(userPreferences,service), "recommender feature dependency spine for blast-radius queries"). -derived_at(entity(userPreferences,service), '2026-06-24T05:07:37Z', agent). -derived_from(entity(db,module), agent_scan). -source_files(entity(db,module), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(entity(db,module), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(entity(db,module), "recommender feature dependency spine for blast-radius queries"). -derived_at(entity(db,module), '2026-06-24T05:07:37Z', agent). -derived_from(entity(lib_types,module), agent_scan). -source_files(entity(lib_types,module), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(entity(lib_types,module), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(entity(lib_types,module), "recommender feature dependency spine for blast-radius queries"). -derived_at(entity(lib_types,module), '2026-06-24T05:07:37Z', agent). -derived_from(entity(routeUtils,module), agent_scan). -source_files(entity(routeUtils,module), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(entity(routeUtils,module), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(entity(routeUtils,module), "recommender feature dependency spine for blast-radius queries"). -derived_at(entity(routeUtils,module), '2026-06-24T05:07:37Z', agent). -derived_from(entity(authIdentity,module), agent_scan). -source_files(entity(authIdentity,module), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(entity(authIdentity,module), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(entity(authIdentity,module), "recommender feature dependency spine for blast-radius queries"). -derived_at(entity(authIdentity,module), '2026-06-24T05:07:38Z', agent). -derived_from(entity(recommenderAdmin,route), agent_scan). -source_files(entity(recommenderAdmin,route), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(entity(recommenderAdmin,route), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(entity(recommenderAdmin,route), "recommender feature dependency spine for blast-radius queries"). -derived_at(entity(recommenderAdmin,route), '2026-06-24T05:07:38Z', agent). -derived_from(rel(mealRecommendation,depends_on,db), agent_scan). -source_files(rel(mealRecommendation,depends_on,db), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(rel(mealRecommendation,depends_on,db), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(rel(mealRecommendation,depends_on,db), "recommender feature dependency spine for blast-radius queries"). -derived_at(rel(mealRecommendation,depends_on,db), '2026-06-24T05:07:38Z', agent). -derived_from(rel(mealRecommendation,depends_on,mealRecommendationAi), agent_scan). -source_files(rel(mealRecommendation,depends_on,mealRecommendationAi), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(rel(mealRecommendation,depends_on,mealRecommendationAi), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(rel(mealRecommendation,depends_on,mealRecommendationAi), "recommender feature dependency spine for blast-radius queries"). -derived_at(rel(mealRecommendation,depends_on,mealRecommendationAi), '2026-06-24T05:07:38Z', agent). -derived_from(rel(mealRecommendation,depends_on,mealFeatures), agent_scan). -source_files(rel(mealRecommendation,depends_on,mealFeatures), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(rel(mealRecommendation,depends_on,mealFeatures), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(rel(mealRecommendation,depends_on,mealFeatures), "recommender feature dependency spine for blast-radius queries"). -derived_at(rel(mealRecommendation,depends_on,mealFeatures), '2026-06-24T05:07:39Z', agent). -derived_from(rel(mealRecommendation,depends_on,mealRecommendationModel), agent_scan). -source_files(rel(mealRecommendation,depends_on,mealRecommendationModel), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(rel(mealRecommendation,depends_on,mealRecommendationModel), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(rel(mealRecommendation,depends_on,mealRecommendationModel), "recommender feature dependency spine for blast-radius queries"). -derived_at(rel(mealRecommendation,depends_on,mealRecommendationModel), '2026-06-24T05:07:39Z', agent). -derived_from(rel(mealRecommendation,depends_on,mealItemIdentity), agent_scan). -source_files(rel(mealRecommendation,depends_on,mealItemIdentity), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(rel(mealRecommendation,depends_on,mealItemIdentity), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(rel(mealRecommendation,depends_on,mealItemIdentity), "recommender feature dependency spine for blast-radius queries"). -derived_at(rel(mealRecommendation,depends_on,mealItemIdentity), '2026-06-24T05:07:39Z', agent). -derived_from(rel(mealRecommendation,depends_on,userPreferences), agent_scan). -source_files(rel(mealRecommendation,depends_on,userPreferences), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(rel(mealRecommendation,depends_on,userPreferences), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(rel(mealRecommendation,depends_on,userPreferences), "recommender feature dependency spine for blast-radius queries"). -derived_at(rel(mealRecommendation,depends_on,userPreferences), '2026-06-24T05:07:39Z', agent). -derived_from(rel(mealRecommendation,depends_on,lib_types), agent_scan). -source_files(rel(mealRecommendation,depends_on,lib_types), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(rel(mealRecommendation,depends_on,lib_types), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(rel(mealRecommendation,depends_on,lib_types), "recommender feature dependency spine for blast-radius queries"). -derived_at(rel(mealRecommendation,depends_on,lib_types), '2026-06-24T05:07:40Z', agent). -derived_from(rel(recommenderAdmin,depends_on,routeUtils), agent_scan). -source_files(rel(recommenderAdmin,depends_on,routeUtils), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(rel(recommenderAdmin,depends_on,routeUtils), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(rel(recommenderAdmin,depends_on,routeUtils), "recommender feature dependency spine for blast-radius queries"). -derived_at(rel(recommenderAdmin,depends_on,routeUtils), '2026-06-24T05:07:40Z', agent). -derived_from(rel(recommenderAdmin,depends_on,authIdentity), agent_scan). -source_files(rel(recommenderAdmin,depends_on,authIdentity), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(rel(recommenderAdmin,depends_on,authIdentity), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(rel(recommenderAdmin,depends_on,authIdentity), "recommender feature dependency spine for blast-radius queries"). -derived_at(rel(recommenderAdmin,depends_on,authIdentity), '2026-06-24T05:07:40Z', agent). -derived_from(rel(recommenderAdmin,depends_on,mealRecommendationEval), agent_scan). -source_files(rel(recommenderAdmin,depends_on,mealRecommendationEval), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(rel(recommenderAdmin,depends_on,mealRecommendationEval), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(rel(recommenderAdmin,depends_on,mealRecommendationEval), "recommender feature dependency spine for blast-radius queries"). -derived_at(rel(recommenderAdmin,depends_on,mealRecommendationEval), '2026-06-24T05:07:40Z', agent). -derived_from(rel(recommenderAdmin,depends_on,officeRecommenderSettings), agent_scan). -source_files(rel(recommenderAdmin,depends_on,officeRecommenderSettings), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(rel(recommenderAdmin,depends_on,officeRecommenderSettings), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(rel(recommenderAdmin,depends_on,officeRecommenderSettings), "recommender feature dependency spine for blast-radius queries"). -derived_at(rel(recommenderAdmin,depends_on,officeRecommenderSettings), '2026-06-24T05:07:40Z', agent). -derived_from(rel(recommenderAdmin,depends_on,mealRecommendationModel), agent_scan). -source_files(rel(recommenderAdmin,depends_on,mealRecommendationModel), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(rel(recommenderAdmin,depends_on,mealRecommendationModel), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(rel(recommenderAdmin,depends_on,mealRecommendationModel), "recommender feature dependency spine for blast-radius queries"). -derived_at(rel(recommenderAdmin,depends_on,mealRecommendationModel), '2026-06-24T05:07:41Z', agent). -derived_from(rel(recommenderAdmin,depends_on,lib_types), agent_scan). -source_files(rel(recommenderAdmin,depends_on,lib_types), ['src/server/services/mealRecommendation.ts', 'src/server/routes/recommenderAdmin.ts']). -source_hash(rel(recommenderAdmin,depends_on,lib_types), 'sha256:571e9c41161a653f75763d59e5cc5db19d358e256a0e148978259ca9ae5256e9'). -derivation_query(rel(recommenderAdmin,depends_on,lib_types), "recommender feature dependency spine for blast-radius queries"). -derived_at(rel(recommenderAdmin,depends_on,lib_types), '2026-06-24T05:07:41Z', agent). -derived_from(entity('POST:/api/menus',endpoint), agent_scan). -source_files(entity('POST:/api/menus',endpoint), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(entity('POST:/api/menus',endpoint), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(entity('POST:/api/menus',endpoint), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(entity('POST:/api/menus',endpoint), '2026-06-24T05:26:54Z', agent). -derived_from(prop('POST:/api/menus',method,post), agent_scan). -source_files(prop('POST:/api/menus',method,post), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('POST:/api/menus',method,post), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('POST:/api/menus',method,post), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('POST:/api/menus',method,post), '2026-06-24T05:26:55Z', agent). -derived_from(prop('POST:/api/menus',path,'/api/menus'), agent_scan). -source_files(prop('POST:/api/menus',path,'/api/menus'), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('POST:/api/menus',path,'/api/menus'), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('POST:/api/menus',path,'/api/menus'), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('POST:/api/menus',path,'/api/menus'), '2026-06-24T05:26:55Z', agent). -derived_from(prop('POST:/api/menus',mutates_state,true), agent_scan). -source_files(prop('POST:/api/menus',mutates_state,true), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('POST:/api/menus',mutates_state,true), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('POST:/api/menus',mutates_state,true), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('POST:/api/menus',mutates_state,true), '2026-06-24T05:26:55Z', agent). -derived_from(entity('POST:/api/menus/import',endpoint), agent_scan). -source_files(entity('POST:/api/menus/import',endpoint), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(entity('POST:/api/menus/import',endpoint), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(entity('POST:/api/menus/import',endpoint), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(entity('POST:/api/menus/import',endpoint), '2026-06-24T05:26:56Z', agent). -derived_from(prop('POST:/api/menus/import',method,post), agent_scan). -source_files(prop('POST:/api/menus/import',method,post), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('POST:/api/menus/import',method,post), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('POST:/api/menus/import',method,post), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('POST:/api/menus/import',method,post), '2026-06-24T05:26:56Z', agent). -derived_from(prop('POST:/api/menus/import',path,'/api/menus/import'), agent_scan). -source_files(prop('POST:/api/menus/import',path,'/api/menus/import'), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('POST:/api/menus/import',path,'/api/menus/import'), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('POST:/api/menus/import',path,'/api/menus/import'), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('POST:/api/menus/import',path,'/api/menus/import'), '2026-06-24T05:26:56Z', agent). -derived_from(prop('POST:/api/menus/import',mutates_state,true), agent_scan). -source_files(prop('POST:/api/menus/import',mutates_state,true), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('POST:/api/menus/import',mutates_state,true), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('POST:/api/menus/import',mutates_state,true), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('POST:/api/menus/import',mutates_state,true), '2026-06-24T05:26:57Z', agent). -derived_from(entity('PUT:/api/menus/:id',endpoint), agent_scan). -source_files(entity('PUT:/api/menus/:id',endpoint), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(entity('PUT:/api/menus/:id',endpoint), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(entity('PUT:/api/menus/:id',endpoint), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(entity('PUT:/api/menus/:id',endpoint), '2026-06-24T05:26:57Z', agent). -derived_from(prop('PUT:/api/menus/:id',method,put), agent_scan). -source_files(prop('PUT:/api/menus/:id',method,put), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('PUT:/api/menus/:id',method,put), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('PUT:/api/menus/:id',method,put), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('PUT:/api/menus/:id',method,put), '2026-06-24T05:26:57Z', agent). -derived_from(prop('PUT:/api/menus/:id',path,'/api/menus/:id'), agent_scan). -source_files(prop('PUT:/api/menus/:id',path,'/api/menus/:id'), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('PUT:/api/menus/:id',path,'/api/menus/:id'), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('PUT:/api/menus/:id',path,'/api/menus/:id'), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('PUT:/api/menus/:id',path,'/api/menus/:id'), '2026-06-24T05:26:58Z', agent). -derived_from(prop('PUT:/api/menus/:id',mutates_state,true), agent_scan). -source_files(prop('PUT:/api/menus/:id',mutates_state,true), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('PUT:/api/menus/:id',mutates_state,true), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('PUT:/api/menus/:id',mutates_state,true), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('PUT:/api/menus/:id',mutates_state,true), '2026-06-24T05:26:58Z', agent). -derived_from(entity('DELETE:/api/menus/:id',endpoint), agent_scan). -source_files(entity('DELETE:/api/menus/:id',endpoint), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(entity('DELETE:/api/menus/:id',endpoint), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(entity('DELETE:/api/menus/:id',endpoint), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(entity('DELETE:/api/menus/:id',endpoint), '2026-06-24T05:26:59Z', agent). -derived_from(prop('DELETE:/api/menus/:id',method,delete), agent_scan). -source_files(prop('DELETE:/api/menus/:id',method,delete), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('DELETE:/api/menus/:id',method,delete), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('DELETE:/api/menus/:id',method,delete), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('DELETE:/api/menus/:id',method,delete), '2026-06-24T05:26:59Z', agent). -derived_from(prop('DELETE:/api/menus/:id',path,'/api/menus/:id'), agent_scan). -source_files(prop('DELETE:/api/menus/:id',path,'/api/menus/:id'), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('DELETE:/api/menus/:id',path,'/api/menus/:id'), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('DELETE:/api/menus/:id',path,'/api/menus/:id'), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('DELETE:/api/menus/:id',path,'/api/menus/:id'), '2026-06-24T05:26:59Z', agent). -derived_from(prop('DELETE:/api/menus/:id',mutates_state,true), agent_scan). -source_files(prop('DELETE:/api/menus/:id',mutates_state,true), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('DELETE:/api/menus/:id',mutates_state,true), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('DELETE:/api/menus/:id',mutates_state,true), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('DELETE:/api/menus/:id',mutates_state,true), '2026-06-24T05:26:59Z', agent). -derived_from(entity('POST:/api/menus/:menuId/items',endpoint), agent_scan). -source_files(entity('POST:/api/menus/:menuId/items',endpoint), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(entity('POST:/api/menus/:menuId/items',endpoint), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(entity('POST:/api/menus/:menuId/items',endpoint), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(entity('POST:/api/menus/:menuId/items',endpoint), '2026-06-24T05:27:00Z', agent). -derived_from(prop('POST:/api/menus/:menuId/items',method,post), agent_scan). -source_files(prop('POST:/api/menus/:menuId/items',method,post), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('POST:/api/menus/:menuId/items',method,post), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('POST:/api/menus/:menuId/items',method,post), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('POST:/api/menus/:menuId/items',method,post), '2026-06-24T05:27:00Z', agent). -derived_from(prop('POST:/api/menus/:menuId/items',path,'/api/menus/:menuId/items'), agent_scan). -source_files(prop('POST:/api/menus/:menuId/items',path,'/api/menus/:menuId/items'), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('POST:/api/menus/:menuId/items',path,'/api/menus/:menuId/items'), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('POST:/api/menus/:menuId/items',path,'/api/menus/:menuId/items'), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('POST:/api/menus/:menuId/items',path,'/api/menus/:menuId/items'), '2026-06-24T05:27:01Z', agent). -derived_from(prop('POST:/api/menus/:menuId/items',mutates_state,true), agent_scan). -source_files(prop('POST:/api/menus/:menuId/items',mutates_state,true), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('POST:/api/menus/:menuId/items',mutates_state,true), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('POST:/api/menus/:menuId/items',mutates_state,true), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('POST:/api/menus/:menuId/items',mutates_state,true), '2026-06-24T05:27:01Z', agent). -derived_from(entity('PUT:/api/menus/:menuId/items/:id',endpoint), agent_scan). -source_files(entity('PUT:/api/menus/:menuId/items/:id',endpoint), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(entity('PUT:/api/menus/:menuId/items/:id',endpoint), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(entity('PUT:/api/menus/:menuId/items/:id',endpoint), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(entity('PUT:/api/menus/:menuId/items/:id',endpoint), '2026-06-24T05:27:01Z', agent). -derived_from(prop('PUT:/api/menus/:menuId/items/:id',method,put), agent_scan). -source_files(prop('PUT:/api/menus/:menuId/items/:id',method,put), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('PUT:/api/menus/:menuId/items/:id',method,put), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('PUT:/api/menus/:menuId/items/:id',method,put), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('PUT:/api/menus/:menuId/items/:id',method,put), '2026-06-24T05:27:02Z', agent). -derived_from(prop('PUT:/api/menus/:menuId/items/:id',path,'/api/menus/:menuId/items/:id'), agent_scan). -source_files(prop('PUT:/api/menus/:menuId/items/:id',path,'/api/menus/:menuId/items/:id'), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('PUT:/api/menus/:menuId/items/:id',path,'/api/menus/:menuId/items/:id'), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('PUT:/api/menus/:menuId/items/:id',path,'/api/menus/:menuId/items/:id'), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('PUT:/api/menus/:menuId/items/:id',path,'/api/menus/:menuId/items/:id'), '2026-06-24T05:27:02Z', agent). -derived_from(prop('PUT:/api/menus/:menuId/items/:id',mutates_state,true), agent_scan). -source_files(prop('PUT:/api/menus/:menuId/items/:id',mutates_state,true), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('PUT:/api/menus/:menuId/items/:id',mutates_state,true), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('PUT:/api/menus/:menuId/items/:id',mutates_state,true), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('PUT:/api/menus/:menuId/items/:id',mutates_state,true), '2026-06-24T05:27:02Z', agent). -derived_from(entity('DELETE:/api/menus/:menuId/items/:id',endpoint), agent_scan). -source_files(entity('DELETE:/api/menus/:menuId/items/:id',endpoint), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(entity('DELETE:/api/menus/:menuId/items/:id',endpoint), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(entity('DELETE:/api/menus/:menuId/items/:id',endpoint), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(entity('DELETE:/api/menus/:menuId/items/:id',endpoint), '2026-06-24T05:27:03Z', agent). -derived_from(prop('DELETE:/api/menus/:menuId/items/:id',method,delete), agent_scan). -source_files(prop('DELETE:/api/menus/:menuId/items/:id',method,delete), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('DELETE:/api/menus/:menuId/items/:id',method,delete), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('DELETE:/api/menus/:menuId/items/:id',method,delete), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('DELETE:/api/menus/:menuId/items/:id',method,delete), '2026-06-24T05:27:03Z', agent). -derived_from(prop('DELETE:/api/menus/:menuId/items/:id',path,'/api/menus/:menuId/items/:id'), agent_scan). -source_files(prop('DELETE:/api/menus/:menuId/items/:id',path,'/api/menus/:menuId/items/:id'), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('DELETE:/api/menus/:menuId/items/:id',path,'/api/menus/:menuId/items/:id'), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('DELETE:/api/menus/:menuId/items/:id',path,'/api/menus/:menuId/items/:id'), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('DELETE:/api/menus/:menuId/items/:id',path,'/api/menus/:menuId/items/:id'), '2026-06-24T05:27:03Z', agent). -derived_from(prop('DELETE:/api/menus/:menuId/items/:id',mutates_state,true), agent_scan). -source_files(prop('DELETE:/api/menus/:menuId/items/:id',mutates_state,true), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('DELETE:/api/menus/:menuId/items/:id',mutates_state,true), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('DELETE:/api/menus/:menuId/items/:id',mutates_state,true), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('DELETE:/api/menus/:menuId/items/:id',mutates_state,true), '2026-06-24T05:27:04Z', agent). -derived_from(entity('GET:/api/menus',endpoint), agent_scan). -source_files(entity('GET:/api/menus',endpoint), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(entity('GET:/api/menus',endpoint), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(entity('GET:/api/menus',endpoint), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(entity('GET:/api/menus',endpoint), '2026-06-24T05:27:04Z', agent). -derived_from(prop('GET:/api/menus',method,get), agent_scan). -source_files(prop('GET:/api/menus',method,get), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/menus',method,get), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/menus',method,get), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/menus',method,get), '2026-06-24T05:27:05Z', agent). -derived_from(prop('GET:/api/menus',path,'/api/menus'), agent_scan). -source_files(prop('GET:/api/menus',path,'/api/menus'), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/menus',path,'/api/menus'), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/menus',path,'/api/menus'), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/menus',path,'/api/menus'), '2026-06-24T05:27:05Z', agent). -derived_from(prop('GET:/api/menus',mutates_state,false), agent_scan). -source_files(prop('GET:/api/menus',mutates_state,false), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/menus',mutates_state,false), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/menus',mutates_state,false), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/menus',mutates_state,false), '2026-06-24T05:27:05Z', agent). -derived_from(entity('GET:/api/food-selections/active',endpoint), agent_scan). -source_files(entity('GET:/api/food-selections/active',endpoint), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(entity('GET:/api/food-selections/active',endpoint), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(entity('GET:/api/food-selections/active',endpoint), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(entity('GET:/api/food-selections/active',endpoint), '2026-06-24T05:27:06Z', agent). -derived_from(prop('GET:/api/food-selections/active',method,get), agent_scan). -source_files(prop('GET:/api/food-selections/active',method,get), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/food-selections/active',method,get), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/food-selections/active',method,get), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/food-selections/active',method,get), '2026-06-24T05:27:06Z', agent). -derived_from(prop('GET:/api/food-selections/active',path,'/api/food-selections/active'), agent_scan). -source_files(prop('GET:/api/food-selections/active',path,'/api/food-selections/active'), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/food-selections/active',path,'/api/food-selections/active'), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/food-selections/active',path,'/api/food-selections/active'), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/food-selections/active',path,'/api/food-selections/active'), '2026-06-24T05:27:06Z', agent). -derived_from(prop('GET:/api/food-selections/active',mutates_state,false), agent_scan). -source_files(prop('GET:/api/food-selections/active',mutates_state,false), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/food-selections/active',mutates_state,false), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/food-selections/active',mutates_state,false), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/food-selections/active',mutates_state,false), '2026-06-24T05:27:07Z', agent). -derived_from(entity('GET:/api/food-selections/history',endpoint), agent_scan). -source_files(entity('GET:/api/food-selections/history',endpoint), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(entity('GET:/api/food-selections/history',endpoint), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(entity('GET:/api/food-selections/history',endpoint), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(entity('GET:/api/food-selections/history',endpoint), '2026-06-24T05:27:07Z', agent). -derived_from(prop('GET:/api/food-selections/history',method,get), agent_scan). -source_files(prop('GET:/api/food-selections/history',method,get), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/food-selections/history',method,get), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/food-selections/history',method,get), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/food-selections/history',method,get), '2026-06-24T05:27:07Z', agent). -derived_from(prop('GET:/api/food-selections/history',path,'/api/food-selections/history'), agent_scan). -source_files(prop('GET:/api/food-selections/history',path,'/api/food-selections/history'), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/food-selections/history',path,'/api/food-selections/history'), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/food-selections/history',path,'/api/food-selections/history'), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/food-selections/history',path,'/api/food-selections/history'), '2026-06-24T05:27:08Z', agent). -derived_from(prop('GET:/api/food-selections/history',mutates_state,false), agent_scan). -source_files(prop('GET:/api/food-selections/history',mutates_state,false), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/food-selections/history',mutates_state,false), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/food-selections/history',mutates_state,false), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/food-selections/history',mutates_state,false), '2026-06-24T05:27:08Z', agent). -derived_from(entity('GET:/api/food-selections/:id/fallback-candidates',endpoint), agent_scan). -source_files(entity('GET:/api/food-selections/:id/fallback-candidates',endpoint), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(entity('GET:/api/food-selections/:id/fallback-candidates',endpoint), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(entity('GET:/api/food-selections/:id/fallback-candidates',endpoint), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(entity('GET:/api/food-selections/:id/fallback-candidates',endpoint), '2026-06-24T05:27:09Z', agent). -derived_from(prop('GET:/api/food-selections/:id/fallback-candidates',method,get), agent_scan). -source_files(prop('GET:/api/food-selections/:id/fallback-candidates',method,get), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/food-selections/:id/fallback-candidates',method,get), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/food-selections/:id/fallback-candidates',method,get), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/food-selections/:id/fallback-candidates',method,get), '2026-06-24T05:27:09Z', agent). -derived_from(prop('GET:/api/food-selections/:id/fallback-candidates',path,'/api/food-selections/:id/fallback-candidates'), agent_scan). -source_files(prop('GET:/api/food-selections/:id/fallback-candidates',path,'/api/food-selections/:id/fallback-candidates'), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/food-selections/:id/fallback-candidates',path,'/api/food-selections/:id/fallback-candidates'), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/food-selections/:id/fallback-candidates',path,'/api/food-selections/:id/fallback-candidates'), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/food-selections/:id/fallback-candidates',path,'/api/food-selections/:id/fallback-candidates'), '2026-06-24T05:27:09Z', agent). -derived_from(prop('GET:/api/food-selections/:id/fallback-candidates',mutates_state,false), agent_scan). -source_files(prop('GET:/api/food-selections/:id/fallback-candidates',mutates_state,false), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/food-selections/:id/fallback-candidates',mutates_state,false), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/food-selections/:id/fallback-candidates',mutates_state,false), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/food-selections/:id/fallback-candidates',mutates_state,false), '2026-06-24T05:27:09Z', agent). -derived_from(entity('GET:/api/polls/active',endpoint), agent_scan). -source_files(entity('GET:/api/polls/active',endpoint), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(entity('GET:/api/polls/active',endpoint), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(entity('GET:/api/polls/active',endpoint), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(entity('GET:/api/polls/active',endpoint), '2026-06-24T05:27:10Z', agent). -derived_from(prop('GET:/api/polls/active',method,get), agent_scan). -source_files(prop('GET:/api/polls/active',method,get), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/polls/active',method,get), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/polls/active',method,get), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/polls/active',method,get), '2026-06-24T05:27:10Z', agent). -derived_from(prop('GET:/api/polls/active',path,'/api/polls/active'), agent_scan). -source_files(prop('GET:/api/polls/active',path,'/api/polls/active'), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/polls/active',path,'/api/polls/active'), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/polls/active',path,'/api/polls/active'), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/polls/active',path,'/api/polls/active'), '2026-06-24T05:27:11Z', agent). -derived_from(prop('GET:/api/polls/active',mutates_state,false), agent_scan). -source_files(prop('GET:/api/polls/active',mutates_state,false), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/polls/active',mutates_state,false), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/polls/active',mutates_state,false), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/polls/active',mutates_state,false), '2026-06-24T05:27:11Z', agent). -derived_from(entity('GET:/api/polls/:id',endpoint), agent_scan). -source_files(entity('GET:/api/polls/:id',endpoint), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(entity('GET:/api/polls/:id',endpoint), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(entity('GET:/api/polls/:id',endpoint), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(entity('GET:/api/polls/:id',endpoint), '2026-06-24T05:27:11Z', agent). -derived_from(prop('GET:/api/polls/:id',method,get), agent_scan). -source_files(prop('GET:/api/polls/:id',method,get), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/polls/:id',method,get), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/polls/:id',method,get), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/polls/:id',method,get), '2026-06-24T05:27:12Z', agent). -derived_from(prop('GET:/api/polls/:id',path,'/api/polls/:id'), agent_scan). -source_files(prop('GET:/api/polls/:id',path,'/api/polls/:id'), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/polls/:id',path,'/api/polls/:id'), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/polls/:id',path,'/api/polls/:id'), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/polls/:id',path,'/api/polls/:id'), '2026-06-24T05:27:12Z', agent). -derived_from(prop('GET:/api/polls/:id',mutates_state,false), agent_scan). -source_files(prop('GET:/api/polls/:id',mutates_state,false), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/polls/:id',mutates_state,false), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/polls/:id',mutates_state,false), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/polls/:id',mutates_state,false), '2026-06-24T05:27:12Z', agent). -derived_from(entity('GET:/api/shopping-list',endpoint), agent_scan). -source_files(entity('GET:/api/shopping-list',endpoint), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(entity('GET:/api/shopping-list',endpoint), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(entity('GET:/api/shopping-list',endpoint), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(entity('GET:/api/shopping-list',endpoint), '2026-06-24T05:27:13Z', agent). -derived_from(prop('GET:/api/shopping-list',method,get), agent_scan). -source_files(prop('GET:/api/shopping-list',method,get), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/shopping-list',method,get), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/shopping-list',method,get), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/shopping-list',method,get), '2026-06-24T05:27:13Z', agent). -derived_from(prop('GET:/api/shopping-list',path,'/api/shopping-list'), agent_scan). -source_files(prop('GET:/api/shopping-list',path,'/api/shopping-list'), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/shopping-list',path,'/api/shopping-list'), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/shopping-list',path,'/api/shopping-list'), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/shopping-list',path,'/api/shopping-list'), '2026-06-24T05:27:13Z', agent). -derived_from(prop('GET:/api/shopping-list',mutates_state,false), agent_scan). -source_files(prop('GET:/api/shopping-list',mutates_state,false), ['src/server/routes/menus.ts', 'src/server/routes/foodSelections.ts', 'src/server/routes/polls.ts', 'src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/shopping-list',mutates_state,false), 'sha256:6a4b6000c4a49325f50014924688918ff7d87f0608235c318e7d36f813b056ed'). -derivation_query(prop('GET:/api/shopping-list',mutates_state,false), "security audit: which HTTP endpoints are reachable without authentication (requires_auth=false)"). -derived_at(prop('GET:/api/shopping-list',mutates_state,false), '2026-06-24T05:27:14Z', agent). -derived_from(prop('POST:/api/menus',requires_auth,true), agent_scan). -source_files(prop('POST:/api/menus',requires_auth,true), ['src/server/routes/menus.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('POST:/api/menus',requires_auth,true), 'sha256:51eff26a6d06fbe3f7703d91f59ba0d3202d2b99a0ea743df3f891364b5f8f9a'). -derivation_query(prop('POST:/api/menus',requires_auth,true), "security audit: menu mutations now require auth (requireAuthenticatedActor)"). -derived_at(prop('POST:/api/menus',requires_auth,true), '2026-06-24T05:40:05Z', agent). -derived_from(prop('POST:/api/menus/import',requires_auth,true), agent_scan). -source_files(prop('POST:/api/menus/import',requires_auth,true), ['src/server/routes/menus.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('POST:/api/menus/import',requires_auth,true), 'sha256:51eff26a6d06fbe3f7703d91f59ba0d3202d2b99a0ea743df3f891364b5f8f9a'). -derivation_query(prop('POST:/api/menus/import',requires_auth,true), "security audit: menu mutations now require auth (requireAuthenticatedActor)"). -derived_at(prop('POST:/api/menus/import',requires_auth,true), '2026-06-24T05:40:05Z', agent). -derived_from(prop('PUT:/api/menus/:id',requires_auth,true), agent_scan). -source_files(prop('PUT:/api/menus/:id',requires_auth,true), ['src/server/routes/menus.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('PUT:/api/menus/:id',requires_auth,true), 'sha256:51eff26a6d06fbe3f7703d91f59ba0d3202d2b99a0ea743df3f891364b5f8f9a'). -derivation_query(prop('PUT:/api/menus/:id',requires_auth,true), "security audit: menu mutations now require auth (requireAuthenticatedActor)"). -derived_at(prop('PUT:/api/menus/:id',requires_auth,true), '2026-06-24T05:40:06Z', agent). -derived_from(prop('DELETE:/api/menus/:id',requires_auth,true), agent_scan). -source_files(prop('DELETE:/api/menus/:id',requires_auth,true), ['src/server/routes/menus.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('DELETE:/api/menus/:id',requires_auth,true), 'sha256:51eff26a6d06fbe3f7703d91f59ba0d3202d2b99a0ea743df3f891364b5f8f9a'). -derivation_query(prop('DELETE:/api/menus/:id',requires_auth,true), "security audit: menu mutations now require auth (requireAuthenticatedActor)"). -derived_at(prop('DELETE:/api/menus/:id',requires_auth,true), '2026-06-24T05:40:07Z', agent). -derived_from(prop('POST:/api/menus/:menuId/items',requires_auth,true), agent_scan). -source_files(prop('POST:/api/menus/:menuId/items',requires_auth,true), ['src/server/routes/menus.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('POST:/api/menus/:menuId/items',requires_auth,true), 'sha256:51eff26a6d06fbe3f7703d91f59ba0d3202d2b99a0ea743df3f891364b5f8f9a'). -derivation_query(prop('POST:/api/menus/:menuId/items',requires_auth,true), "security audit: menu mutations now require auth (requireAuthenticatedActor)"). -derived_at(prop('POST:/api/menus/:menuId/items',requires_auth,true), '2026-06-24T05:40:07Z', agent). -derived_from(prop('PUT:/api/menus/:menuId/items/:id',requires_auth,true), agent_scan). -source_files(prop('PUT:/api/menus/:menuId/items/:id',requires_auth,true), ['src/server/routes/menus.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('PUT:/api/menus/:menuId/items/:id',requires_auth,true), 'sha256:51eff26a6d06fbe3f7703d91f59ba0d3202d2b99a0ea743df3f891364b5f8f9a'). -derivation_query(prop('PUT:/api/menus/:menuId/items/:id',requires_auth,true), "security audit: menu mutations now require auth (requireAuthenticatedActor)"). -derived_at(prop('PUT:/api/menus/:menuId/items/:id',requires_auth,true), '2026-06-24T05:40:08Z', agent). -derived_from(prop('DELETE:/api/menus/:menuId/items/:id',requires_auth,true), agent_scan). -source_files(prop('DELETE:/api/menus/:menuId/items/:id',requires_auth,true), ['src/server/routes/menus.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('DELETE:/api/menus/:menuId/items/:id',requires_auth,true), 'sha256:51eff26a6d06fbe3f7703d91f59ba0d3202d2b99a0ea743df3f891364b5f8f9a'). -derivation_query(prop('DELETE:/api/menus/:menuId/items/:id',requires_auth,true), "security audit: menu mutations now require auth (requireAuthenticatedActor)"). -derived_at(prop('DELETE:/api/menus/:menuId/items/:id',requires_auth,true), '2026-06-24T05:40:09Z', agent). -derived_from(prop('GET:/api/menus',requires_auth,true), agent_scan). -source_files(prop('GET:/api/menus',requires_auth,true), ['src/server/routes/menus.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/menus',requires_auth,true), 'sha256:51eff26a6d06fbe3f7703d91f59ba0d3202d2b99a0ea743df3f891364b5f8f9a'). -derivation_query(prop('GET:/api/menus',requires_auth,true), "security audit: all data-read endpoints now require auth"). -derived_at(prop('GET:/api/menus',requires_auth,true), '2026-06-24T06:04:15Z', agent). -derived_from(prop('GET:/api/food-selections/active',requires_auth,true), agent_scan). -source_files(prop('GET:/api/food-selections/active',requires_auth,true), ['src/server/routes/foodSelections.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/food-selections/active',requires_auth,true), 'sha256:0871efc794133ef18c6788d561b876ab169b07ff43989753e11c82d4cdfa4382'). -derivation_query(prop('GET:/api/food-selections/active',requires_auth,true), "security audit: all data-read endpoints now require auth"). -derived_at(prop('GET:/api/food-selections/active',requires_auth,true), '2026-06-24T06:04:17Z', agent). -derived_from(prop('GET:/api/food-selections/history',requires_auth,true), agent_scan). -source_files(prop('GET:/api/food-selections/history',requires_auth,true), ['src/server/routes/foodSelections.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/food-selections/history',requires_auth,true), 'sha256:0871efc794133ef18c6788d561b876ab169b07ff43989753e11c82d4cdfa4382'). -derivation_query(prop('GET:/api/food-selections/history',requires_auth,true), "security audit: all data-read endpoints now require auth"). -derived_at(prop('GET:/api/food-selections/history',requires_auth,true), '2026-06-24T06:04:18Z', agent). -derived_from(prop('GET:/api/food-selections/:id/fallback-candidates',requires_auth,true), agent_scan). -source_files(prop('GET:/api/food-selections/:id/fallback-candidates',requires_auth,true), ['src/server/routes/foodSelections.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/food-selections/:id/fallback-candidates',requires_auth,true), 'sha256:0871efc794133ef18c6788d561b876ab169b07ff43989753e11c82d4cdfa4382'). -derivation_query(prop('GET:/api/food-selections/:id/fallback-candidates',requires_auth,true), "security audit: all data-read endpoints now require auth"). -derived_at(prop('GET:/api/food-selections/:id/fallback-candidates',requires_auth,true), '2026-06-24T06:04:20Z', agent). -derived_from(prop('GET:/api/polls/active',requires_auth,true), agent_scan). -source_files(prop('GET:/api/polls/active',requires_auth,true), ['src/server/routes/polls.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/polls/active',requires_auth,true), 'sha256:416e87546a7f8e99d0e8198d69eceebf9c3fdbd12c98e048a6baa4dc32154ffe'). -derivation_query(prop('GET:/api/polls/active',requires_auth,true), "security audit: all data-read endpoints now require auth"). -derived_at(prop('GET:/api/polls/active',requires_auth,true), '2026-06-24T06:04:21Z', agent). -derived_from(prop('GET:/api/polls/:id',requires_auth,true), agent_scan). -source_files(prop('GET:/api/polls/:id',requires_auth,true), ['src/server/routes/polls.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/polls/:id',requires_auth,true), 'sha256:416e87546a7f8e99d0e8198d69eceebf9c3fdbd12c98e048a6baa4dc32154ffe'). -derivation_query(prop('GET:/api/polls/:id',requires_auth,true), "security audit: all data-read endpoints now require auth"). -derived_at(prop('GET:/api/polls/:id',requires_auth,true), '2026-06-24T06:04:23Z', agent). -derived_from(prop('GET:/api/shopping-list',requires_auth,true), agent_scan). -source_files(prop('GET:/api/shopping-list',requires_auth,true), ['src/server/routes/shoppingList.ts', 'src/server/routes/authIdentity.ts']). -source_hash(prop('GET:/api/shopping-list',requires_auth,true), 'sha256:64d12384b0a190e70bf8ba64bfb9a790c82d9c43682928d314050b2cde5eb72c'). -derivation_query(prop('GET:/api/shopping-list',requires_auth,true), "security audit: all data-read endpoints now require auth"). -derived_at(prop('GET:/api/shopping-list',requires_auth,true), '2026-06-24T06:04:24Z', agent). -derived_from(entity(faim,tool), agent_scan). -source_files(entity(faim,tool), ['.faim/faim.conf']). -source_hash(entity(faim,tool), 'sha256:8ae104d29c49aabbb0962eb5d9363308620a71462df0e0aab262688e1f9a7e98'). -derivation_query(entity(faim,tool), "FAIM project metadata version"). -derived_at(entity(faim,tool), '2026-06-30T07:58:46Z', agent). -derived_from(prop(faim,version,'0.4.0'), agent_scan). -source_files(prop(faim,version,'0.4.0'), ['.faim/faim.conf']). -source_hash(prop(faim,version,'0.4.0'), 'sha256:8ae104d29c49aabbb0962eb5d9363308620a71462df0e0aab262688e1f9a7e98'). -derivation_query(prop(faim,version,'0.4.0'), "FAIM project metadata version"). -derived_at(prop(faim,version,'0.4.0'), '2026-06-30T07:58:46Z', agent). diff --git a/.faim/derived/sources.pl b/.faim/derived/sources.pl new file mode 100644 index 0000000..2444576 --- /dev/null +++ b/.faim/derived/sources.pl @@ -0,0 +1,1194 @@ +derived_from(entity(authAccess,service), agent_scan). +source_files(entity(authAccess,service), ['src/server/services/authAccess.ts']). +source_hash(entity(authAccess,service), 'sha256:f1f1e4ed2d4dd6d5742eb84db269c260d71c992c66f022d86529f6ebb874b179'). +source_file_hashes(entity(authAccess,service), ['sha256:f1f1e4ed2d4dd6d5742eb84db269c260d71c992c66f022d86529f6ebb874b179']). +derivation_query(entity(authAccess,service), "What are the import dependencies between server modules?"). +derived_at(entity(authAccess,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(authAudit,service), agent_scan). +source_files(entity(authAudit,service), ['src/server/services/authAudit.ts']). +source_hash(entity(authAudit,service), 'sha256:63da05a5d0cf55660fa25d975076e8058fde7ebb555a3d835eef43023520b173'). +source_file_hashes(entity(authAudit,service), ['sha256:63da05a5d0cf55660fa25d975076e8058fde7ebb555a3d835eef43023520b173']). +derivation_query(entity(authAudit,service), "What are the import dependencies between server modules?"). +derived_at(entity(authAudit,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(authAvatar,service), agent_scan). +source_files(entity(authAvatar,service), ['src/server/services/authAvatar.ts']). +source_hash(entity(authAvatar,service), 'sha256:f614528d11f3764228cf841e09ee23402651c248428ad896aa9579010b5ebb35'). +source_file_hashes(entity(authAvatar,service), ['sha256:f614528d11f3764228cf841e09ee23402651c248428ad896aa9579010b5ebb35']). +derivation_query(entity(authAvatar,service), "What are the import dependencies between server modules?"). +derived_at(entity(authAvatar,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(authSession,service), agent_scan). +source_files(entity(authSession,service), ['src/server/services/authSession.ts']). +source_hash(entity(authSession,service), 'sha256:68010d96e45b8cba9a087228e52570c33d7e878ebacfa03f4aa200434bcf64c5'). +source_file_hashes(entity(authSession,service), ['sha256:68010d96e45b8cba9a087228e52570c33d7e878ebacfa03f4aa200434bcf64c5']). +derivation_query(entity(authSession,service), "What are the import dependencies between server modules?"). +derived_at(entity(authSession,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(dbConnectivity,service), agent_scan). +source_files(entity(dbConnectivity,service), ['src/server/services/dbConnectivity.ts']). +source_hash(entity(dbConnectivity,service), 'sha256:3bddd021f9200bcabe506fd0bad66d5b2eec92307dbb6b7a73a801e5adabeada'). +source_file_hashes(entity(dbConnectivity,service), ['sha256:3bddd021f9200bcabe506fd0bad66d5b2eec92307dbb6b7a73a801e5adabeada']). +derivation_query(entity(dbConnectivity,service), "What are the import dependencies between server modules?"). +derived_at(entity(dbConnectivity,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(displayName,service), agent_scan). +source_files(entity(displayName,service), ['src/server/services/displayName.ts']). +source_hash(entity(displayName,service), 'sha256:4e45a8878b7b493aa7b53f02f721342cf10659edf7e2f952cc8db6b861bcff03'). +source_file_hashes(entity(displayName,service), ['sha256:4e45a8878b7b493aa7b53f02f721342cf10659edf7e2f952cc8db6b861bcff03']). +derivation_query(entity(displayName,service), "What are the import dependencies between server modules?"). +derived_at(entity(displayName,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(entraOidc,service), agent_scan). +source_files(entity(entraOidc,service), ['src/server/services/entraOidc.ts']). +source_hash(entity(entraOidc,service), 'sha256:bcd171daf9de595e304b23e8f334c27c121e08ffb9aab5a3c0cfb97752164e47'). +source_file_hashes(entity(entraOidc,service), ['sha256:bcd171daf9de595e304b23e8f334c27c121e08ffb9aab5a3c0cfb97752164e47']). +derivation_query(entity(entraOidc,service), "What are the import dependencies between server modules?"). +derived_at(entity(entraOidc,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(foodSelection,service), agent_scan). +source_files(entity(foodSelection,service), ['src/server/services/foodSelection.ts']). +source_hash(entity(foodSelection,service), 'sha256:64feccc3cdeb3e88701c0c5dd390364938c30c3d6572978db71bce0344926476'). +source_file_hashes(entity(foodSelection,service), ['sha256:64feccc3cdeb3e88701c0c5dd390364938c30c3d6572978db71bce0344926476']). +derivation_query(entity(foodSelection,service), "What are the import dependencies between server modules?"). +derived_at(entity(foodSelection,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(localAuth,service), agent_scan). +source_files(entity(localAuth,service), ['src/server/services/localAuth.ts']). +source_hash(entity(localAuth,service), 'sha256:de80203e2ade729f099feffe7c866227c77899e5298caf69d4b2abd9fced838c'). +source_file_hashes(entity(localAuth,service), ['sha256:de80203e2ade729f099feffe7c866227c77899e5298caf69d4b2abd9fced838c']). +derivation_query(entity(localAuth,service), "What are the import dependencies between server modules?"). +derived_at(entity(localAuth,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(localLoginProtection,service), agent_scan). +source_files(entity(localLoginProtection,service), ['src/server/services/localLoginProtection.ts']). +source_hash(entity(localLoginProtection,service), 'sha256:82bc1066f70b1d36e8df7637e34e583443ce915b2230f841563a138d5c39b8b8'). +source_file_hashes(entity(localLoginProtection,service), ['sha256:82bc1066f70b1d36e8df7637e34e583443ce915b2230f841563a138d5c39b8b8']). +derivation_query(entity(localLoginProtection,service), "What are the import dependencies between server modules?"). +derived_at(entity(localLoginProtection,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(mealAnticipatedLikes,service), agent_scan). +source_files(entity(mealAnticipatedLikes,service), ['src/server/services/mealAnticipatedLikes.ts']). +source_hash(entity(mealAnticipatedLikes,service), 'sha256:c4dd7f0a8e1d5a28572a5379a4364e5f90323bb68739b56e8cf9eeaf7ca82379'). +source_file_hashes(entity(mealAnticipatedLikes,service), ['sha256:c4dd7f0a8e1d5a28572a5379a4364e5f90323bb68739b56e8cf9eeaf7ca82379']). +derivation_query(entity(mealAnticipatedLikes,service), "What are the import dependencies between server modules?"). +derived_at(entity(mealAnticipatedLikes,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(mealRecommendationExplore,service), agent_scan). +source_files(entity(mealRecommendationExplore,service), ['src/server/services/mealRecommendationExplore.ts']). +source_hash(entity(mealRecommendationExplore,service), 'sha256:0d20406a3645ba36034bf20b3c4d2719dc486cc52eea15db3052ede1b5af37d2'). +source_file_hashes(entity(mealRecommendationExplore,service), ['sha256:0d20406a3645ba36034bf20b3c4d2719dc486cc52eea15db3052ede1b5af37d2']). +derivation_query(entity(mealRecommendationExplore,service), "What are the import dependencies between server modules?"). +derived_at(entity(mealRecommendationExplore,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(mealRecommendationModelXlearn,service), agent_scan). +source_files(entity(mealRecommendationModelXlearn,service), ['src/server/services/mealRecommendationModelXlearn.ts']). +source_hash(entity(mealRecommendationModelXlearn,service), 'sha256:35a259799ca8c7c8a0573f7d69447e150d9be739722363437240e5bc00f71dc7'). +source_file_hashes(entity(mealRecommendationModelXlearn,service), ['sha256:35a259799ca8c7c8a0573f7d69447e150d9be739722363437240e5bc00f71dc7']). +derivation_query(entity(mealRecommendationModelXlearn,service), "What are the import dependencies between server modules?"). +derived_at(entity(mealRecommendationModelXlearn,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(mealRecommendationPreVote,service), agent_scan). +source_files(entity(mealRecommendationPreVote,service), ['src/server/services/mealRecommendationPreVote.ts']). +source_hash(entity(mealRecommendationPreVote,service), 'sha256:756bc1e596ccd4e17b7c4898ef685f6000a439b6cf227b8a6d34fed0378484b6'). +source_file_hashes(entity(mealRecommendationPreVote,service), ['sha256:756bc1e596ccd4e17b7c4898ef685f6000a439b6cf227b8a6d34fed0378484b6']). +derivation_query(entity(mealRecommendationPreVote,service), "What are the import dependencies between server modules?"). +derived_at(entity(mealRecommendationPreVote,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(menu,service), agent_scan). +source_files(entity(menu,service), ['src/server/services/menu.ts']). +source_hash(entity(menu,service), 'sha256:1a3d9899108229a23dc7b49cff0332a1eb6993fbd9effe84db2ca955c723024b'). +source_file_hashes(entity(menu,service), ['sha256:1a3d9899108229a23dc7b49cff0332a1eb6993fbd9effe84db2ca955c723024b']). +derivation_query(entity(menu,service), "What are the import dependencies between server modules?"). +derived_at(entity(menu,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(notificationEmail,service), agent_scan). +source_files(entity(notificationEmail,service), ['src/server/services/notificationEmail.ts']). +source_hash(entity(notificationEmail,service), 'sha256:8d39d8f17abc3022831f9cfdc132545112f2601bebc02a720b3382702bc7a332'). +source_file_hashes(entity(notificationEmail,service), ['sha256:8d39d8f17abc3022831f9cfdc132545112f2601bebc02a720b3382702bc7a332']). +derivation_query(entity(notificationEmail,service), "What are the import dependencies between server modules?"). +derived_at(entity(notificationEmail,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(officeContext,service), agent_scan). +source_files(entity(officeContext,service), ['src/server/services/officeContext.ts']). +source_hash(entity(officeContext,service), 'sha256:0c7fd471cb37c785a4f3854d4f126b15a7a65e79de374eccbc79cefe24522b8d'). +source_file_hashes(entity(officeContext,service), ['sha256:0c7fd471cb37c785a4f3854d4f126b15a7a65e79de374eccbc79cefe24522b8d']). +derivation_query(entity(officeContext,service), "What are the import dependencies between server modules?"). +derived_at(entity(officeContext,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(officeLocation,service), agent_scan). +source_files(entity(officeLocation,service), ['src/server/services/officeLocation.ts']). +source_hash(entity(officeLocation,service), 'sha256:70c68a3df551bd343a7f67fe3bacaf221b0809b4218b20aec6d64e8044ca1b50'). +source_file_hashes(entity(officeLocation,service), ['sha256:70c68a3df551bd343a7f67fe3bacaf221b0809b4218b20aec6d64e8044ca1b50']). +derivation_query(entity(officeLocation,service), "What are the import dependencies between server modules?"). +derived_at(entity(officeLocation,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(officePollSchedule,service), agent_scan). +source_files(entity(officePollSchedule,service), ['src/server/services/officePollSchedule.ts']). +source_hash(entity(officePollSchedule,service), 'sha256:ea250028fedb9a81528356c0db5af4e3689daf87e335fe5f6d0b9c314837b514'). +source_file_hashes(entity(officePollSchedule,service), ['sha256:ea250028fedb9a81528356c0db5af4e3689daf87e335fe5f6d0b9c314837b514']). +derivation_query(entity(officePollSchedule,service), "What are the import dependencies between server modules?"). +derived_at(entity(officePollSchedule,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(poll,service), agent_scan). +source_files(entity(poll,service), ['src/server/services/poll.ts']). +source_hash(entity(poll,service), 'sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318'). +source_file_hashes(entity(poll,service), ['sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318']). +derivation_query(entity(poll,service), "What are the import dependencies between server modules?"). +derived_at(entity(poll,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(seededRng,service), agent_scan). +source_files(entity(seededRng,service), ['src/server/services/seededRng.ts']). +source_hash(entity(seededRng,service), 'sha256:066c291175ebb04e89a19f18403f23f64bbb1baaac5f8bfda19099c53ebd21fd'). +source_file_hashes(entity(seededRng,service), ['sha256:066c291175ebb04e89a19f18403f23f64bbb1baaac5f8bfda19099c53ebd21fd']). +derivation_query(entity(seededRng,service), "What are the import dependencies between server modules?"). +derived_at(entity(seededRng,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(shoppingList,service), agent_scan). +source_files(entity(shoppingList,service), ['src/server/services/shoppingList.ts']). +source_hash(entity(shoppingList,service), 'sha256:d063917fb9724446a59bbfe141dcaa7d65e056c90ab5e05fcfb1f732b563a6c2'). +source_file_hashes(entity(shoppingList,service), ['sha256:d063917fb9724446a59bbfe141dcaa7d65e056c90ab5e05fcfb1f732b563a6c2']). +derivation_query(entity(shoppingList,service), "What are the import dependencies between server modules?"). +derived_at(entity(shoppingList,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(userMenuDefaults,service), agent_scan). +source_files(entity(userMenuDefaults,service), ['src/server/services/userMenuDefaults.ts']). +source_hash(entity(userMenuDefaults,service), 'sha256:ae3522c5e6505c698ecb43509df7b94f73080e20bc4579e82cd3800db5e1bf6e'). +source_file_hashes(entity(userMenuDefaults,service), ['sha256:ae3522c5e6505c698ecb43509df7b94f73080e20bc4579e82cd3800db5e1bf6e']). +derivation_query(entity(userMenuDefaults,service), "What are the import dependencies between server modules?"). +derived_at(entity(userMenuDefaults,service), '2026-07-01T05:51:27Z', agent). +derived_from(entity(sse,module), agent_scan). +source_files(entity(sse,module), ['src/server/sse.ts']). +source_hash(entity(sse,module), 'sha256:642ae7d389f05e1f5f7791fe787b799b4c64a6af88e4cfc26a1b8ca670a98348'). +source_file_hashes(entity(sse,module), ['sha256:642ae7d389f05e1f5f7791fe787b799b4c64a6af88e4cfc26a1b8ca670a98348']). +derivation_query(entity(sse,module), "What are the import dependencies between server modules?"). +derived_at(entity(sse,module), '2026-07-01T05:51:27Z', agent). +derived_from(entity(auth_route,route), agent_scan). +source_files(entity(auth_route,route), ['src/server/routes/auth.ts']). +source_hash(entity(auth_route,route), 'sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25'). +source_file_hashes(entity(auth_route,route), ['sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25']). +derivation_query(entity(auth_route,route), "What are the import dependencies between server modules?"). +derived_at(entity(auth_route,route), '2026-07-01T05:51:27Z', agent). +derived_from(entity(authIdentity,route), agent_scan). +source_files(entity(authIdentity,route), ['src/server/routes/authIdentity.ts']). +source_hash(entity(authIdentity,route), 'sha256:30a4da6b02c665a7fd85a085734fb09427c0c2502bb68b3a6c07c5a72c12f062'). +source_file_hashes(entity(authIdentity,route), ['sha256:30a4da6b02c665a7fd85a085734fb09427c0c2502bb68b3a6c07c5a72c12f062']). +derivation_query(entity(authIdentity,route), "What are the import dependencies between server modules?"). +derived_at(entity(authIdentity,route), '2026-07-01T05:51:27Z', agent). +derived_from(entity(foodSelections_route,route), agent_scan). +source_files(entity(foodSelections_route,route), ['src/server/routes/foodSelections.ts']). +source_hash(entity(foodSelections_route,route), 'sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2'). +source_file_hashes(entity(foodSelections_route,route), ['sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2']). +derivation_query(entity(foodSelections_route,route), "What are the import dependencies between server modules?"). +derived_at(entity(foodSelections_route,route), '2026-07-01T05:51:27Z', agent). +derived_from(entity(menus_route,route), agent_scan). +source_files(entity(menus_route,route), ['src/server/routes/menus.ts']). +source_hash(entity(menus_route,route), 'sha256:47189b1728d230ac272c798e43b11c3cc398e88437d66c53f3719aef3785ba80'). +source_file_hashes(entity(menus_route,route), ['sha256:47189b1728d230ac272c798e43b11c3cc398e88437d66c53f3719aef3785ba80']). +derivation_query(entity(menus_route,route), "What are the import dependencies between server modules?"). +derived_at(entity(menus_route,route), '2026-07-01T05:51:27Z', agent). +derived_from(entity(polls_route,route), agent_scan). +source_files(entity(polls_route,route), ['src/server/routes/polls.ts']). +source_hash(entity(polls_route,route), 'sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451'). +source_file_hashes(entity(polls_route,route), ['sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451']). +derivation_query(entity(polls_route,route), "What are the import dependencies between server modules?"). +derived_at(entity(polls_route,route), '2026-07-01T05:51:27Z', agent). +derived_from(entity(shoppingList_route,route), agent_scan). +source_files(entity(shoppingList_route,route), ['src/server/routes/shoppingList.ts']). +source_hash(entity(shoppingList_route,route), 'sha256:e34aec52bcea6173e3637e82622b3e3f69f88f7e152963c16680f33c1a1a875c'). +source_file_hashes(entity(shoppingList_route,route), ['sha256:e34aec52bcea6173e3637e82622b3e3f69f88f7e152963c16680f33c1a1a875c']). +derivation_query(entity(shoppingList_route,route), "What are the import dependencies between server modules?"). +derived_at(entity(shoppingList_route,route), '2026-07-01T05:51:27Z', agent). +derived_from(entity(userPreferences_route,route), agent_scan). +source_files(entity(userPreferences_route,route), ['src/server/routes/userPreferences.ts']). +source_hash(entity(userPreferences_route,route), 'sha256:0cf355e397895ebf072e460e4b500a9ffa9b4cdad9716284eb2e245cd1affbf1'). +source_file_hashes(entity(userPreferences_route,route), ['sha256:0cf355e397895ebf072e460e4b500a9ffa9b4cdad9716284eb2e245cd1affbf1']). +derivation_query(entity(userPreferences_route,route), "What are the import dependencies between server modules?"). +derived_at(entity(userPreferences_route,route), '2026-07-01T05:51:27Z', agent). +derived_from(rel(entraOidc,depends_on,routeUtils), agent_scan). +source_files(rel(entraOidc,depends_on,routeUtils), ['src/server/services/entraOidc.ts']). +source_hash(rel(entraOidc,depends_on,routeUtils), 'sha256:bcd171daf9de595e304b23e8f334c27c121e08ffb9aab5a3c0cfb97752164e47'). +source_file_hashes(rel(entraOidc,depends_on,routeUtils), ['sha256:bcd171daf9de595e304b23e8f334c27c121e08ffb9aab5a3c0cfb97752164e47']). +derivation_query(rel(entraOidc,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(entraOidc,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(localLoginProtection,depends_on,routeUtils), agent_scan). +source_files(rel(localLoginProtection,depends_on,routeUtils), ['src/server/services/localLoginProtection.ts']). +source_hash(rel(localLoginProtection,depends_on,routeUtils), 'sha256:82bc1066f70b1d36e8df7637e34e583443ce915b2230f841563a138d5c39b8b8'). +source_file_hashes(rel(localLoginProtection,depends_on,routeUtils), ['sha256:82bc1066f70b1d36e8df7637e34e583443ce915b2230f841563a138d5c39b8b8']). +derivation_query(rel(localLoginProtection,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(localLoginProtection,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(displayName,depends_on,routeUtils), agent_scan). +source_files(rel(displayName,depends_on,routeUtils), ['src/server/services/displayName.ts']). +source_hash(rel(displayName,depends_on,routeUtils), 'sha256:4e45a8878b7b493aa7b53f02f721342cf10659edf7e2f952cc8db6b861bcff03'). +source_file_hashes(rel(displayName,depends_on,routeUtils), ['sha256:4e45a8878b7b493aa7b53f02f721342cf10659edf7e2f952cc8db6b861bcff03']). +derivation_query(rel(displayName,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(displayName,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(dbConnectivity,depends_on,db), agent_scan). +source_files(rel(dbConnectivity,depends_on,db), ['src/server/services/dbConnectivity.ts']). +source_hash(rel(dbConnectivity,depends_on,db), 'sha256:3bddd021f9200bcabe506fd0bad66d5b2eec92307dbb6b7a73a801e5adabeada'). +source_file_hashes(rel(dbConnectivity,depends_on,db), ['sha256:3bddd021f9200bcabe506fd0bad66d5b2eec92307dbb6b7a73a801e5adabeada']). +derivation_query(rel(dbConnectivity,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(dbConnectivity,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(localAuth,depends_on,db), agent_scan). +source_files(rel(localAuth,depends_on,db), ['src/server/services/localAuth.ts']). +source_hash(rel(localAuth,depends_on,db), 'sha256:de80203e2ade729f099feffe7c866227c77899e5298caf69d4b2abd9fced838c'). +source_file_hashes(rel(localAuth,depends_on,db), ['sha256:de80203e2ade729f099feffe7c866227c77899e5298caf69d4b2abd9fced838c']). +derivation_query(rel(localAuth,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(localAuth,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(localAuth,depends_on,routeUtils), agent_scan). +source_files(rel(localAuth,depends_on,routeUtils), ['src/server/services/localAuth.ts']). +source_hash(rel(localAuth,depends_on,routeUtils), 'sha256:de80203e2ade729f099feffe7c866227c77899e5298caf69d4b2abd9fced838c'). +source_file_hashes(rel(localAuth,depends_on,routeUtils), ['sha256:de80203e2ade729f099feffe7c866227c77899e5298caf69d4b2abd9fced838c']). +derivation_query(rel(localAuth,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(localAuth,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelection,depends_on,db), agent_scan). +source_files(rel(foodSelection,depends_on,db), ['src/server/services/foodSelection.ts']). +source_hash(rel(foodSelection,depends_on,db), 'sha256:64feccc3cdeb3e88701c0c5dd390364938c30c3d6572978db71bce0344926476'). +source_file_hashes(rel(foodSelection,depends_on,db), ['sha256:64feccc3cdeb3e88701c0c5dd390364938c30c3d6572978db71bce0344926476']). +derivation_query(rel(foodSelection,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelection,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelection,depends_on,sse), agent_scan). +source_files(rel(foodSelection,depends_on,sse), ['src/server/services/foodSelection.ts']). +source_hash(rel(foodSelection,depends_on,sse), 'sha256:64feccc3cdeb3e88701c0c5dd390364938c30c3d6572978db71bce0344926476'). +source_file_hashes(rel(foodSelection,depends_on,sse), ['sha256:64feccc3cdeb3e88701c0c5dd390364938c30c3d6572978db71bce0344926476']). +derivation_query(rel(foodSelection,depends_on,sse), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelection,depends_on,sse), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelection,depends_on,lib_types), agent_scan). +source_files(rel(foodSelection,depends_on,lib_types), ['src/server/services/foodSelection.ts']). +source_hash(rel(foodSelection,depends_on,lib_types), 'sha256:64feccc3cdeb3e88701c0c5dd390364938c30c3d6572978db71bce0344926476'). +source_file_hashes(rel(foodSelection,depends_on,lib_types), ['sha256:64feccc3cdeb3e88701c0c5dd390364938c30c3d6572978db71bce0344926476']). +derivation_query(rel(foodSelection,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelection,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelection,depends_on,notificationEmail), agent_scan). +source_files(rel(foodSelection,depends_on,notificationEmail), ['src/server/services/foodSelection.ts']). +source_hash(rel(foodSelection,depends_on,notificationEmail), 'sha256:64feccc3cdeb3e88701c0c5dd390364938c30c3d6572978db71bce0344926476'). +source_file_hashes(rel(foodSelection,depends_on,notificationEmail), ['sha256:64feccc3cdeb3e88701c0c5dd390364938c30c3d6572978db71bce0344926476']). +derivation_query(rel(foodSelection,depends_on,notificationEmail), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelection,depends_on,notificationEmail), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelection,depends_on,officeLocation), agent_scan). +source_files(rel(foodSelection,depends_on,officeLocation), ['src/server/services/foodSelection.ts']). +source_hash(rel(foodSelection,depends_on,officeLocation), 'sha256:64feccc3cdeb3e88701c0c5dd390364938c30c3d6572978db71bce0344926476'). +source_file_hashes(rel(foodSelection,depends_on,officeLocation), ['sha256:64feccc3cdeb3e88701c0c5dd390364938c30c3d6572978db71bce0344926476']). +derivation_query(rel(foodSelection,depends_on,officeLocation), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelection,depends_on,officeLocation), '2026-07-01T05:51:27Z', agent). +derived_from(rel(authAudit,depends_on,db), agent_scan). +source_files(rel(authAudit,depends_on,db), ['src/server/services/authAudit.ts']). +source_hash(rel(authAudit,depends_on,db), 'sha256:63da05a5d0cf55660fa25d975076e8058fde7ebb555a3d835eef43023520b173'). +source_file_hashes(rel(authAudit,depends_on,db), ['sha256:63da05a5d0cf55660fa25d975076e8058fde7ebb555a3d835eef43023520b173']). +derivation_query(rel(authAudit,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(authAudit,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(authAudit,depends_on,localAuth), agent_scan). +source_files(rel(authAudit,depends_on,localAuth), ['src/server/services/authAudit.ts']). +source_hash(rel(authAudit,depends_on,localAuth), 'sha256:63da05a5d0cf55660fa25d975076e8058fde7ebb555a3d835eef43023520b173'). +source_file_hashes(rel(authAudit,depends_on,localAuth), ['sha256:63da05a5d0cf55660fa25d975076e8058fde7ebb555a3d835eef43023520b173']). +derivation_query(rel(authAudit,depends_on,localAuth), "What are the import dependencies between server modules?"). +derived_at(rel(authAudit,depends_on,localAuth), '2026-07-01T05:51:27Z', agent). +derived_from(rel(authAccess,depends_on,db), agent_scan). +source_files(rel(authAccess,depends_on,db), ['src/server/services/authAccess.ts']). +source_hash(rel(authAccess,depends_on,db), 'sha256:f1f1e4ed2d4dd6d5742eb84db269c260d71c992c66f022d86529f6ebb874b179'). +source_file_hashes(rel(authAccess,depends_on,db), ['sha256:f1f1e4ed2d4dd6d5742eb84db269c260d71c992c66f022d86529f6ebb874b179']). +derivation_query(rel(authAccess,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(authAccess,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(authAccess,depends_on,routeUtils), agent_scan). +source_files(rel(authAccess,depends_on,routeUtils), ['src/server/services/authAccess.ts']). +source_hash(rel(authAccess,depends_on,routeUtils), 'sha256:f1f1e4ed2d4dd6d5742eb84db269c260d71c992c66f022d86529f6ebb874b179'). +source_file_hashes(rel(authAccess,depends_on,routeUtils), ['sha256:f1f1e4ed2d4dd6d5742eb84db269c260d71c992c66f022d86529f6ebb874b179']). +derivation_query(rel(authAccess,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(authAccess,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(authAccess,depends_on,localAuth), agent_scan). +source_files(rel(authAccess,depends_on,localAuth), ['src/server/services/authAccess.ts']). +source_hash(rel(authAccess,depends_on,localAuth), 'sha256:f1f1e4ed2d4dd6d5742eb84db269c260d71c992c66f022d86529f6ebb874b179'). +source_file_hashes(rel(authAccess,depends_on,localAuth), ['sha256:f1f1e4ed2d4dd6d5742eb84db269c260d71c992c66f022d86529f6ebb874b179']). +derivation_query(rel(authAccess,depends_on,localAuth), "What are the import dependencies between server modules?"). +derived_at(rel(authAccess,depends_on,localAuth), '2026-07-01T05:51:27Z', agent). +derived_from(rel(authAccess,depends_on,notificationEmail), agent_scan). +source_files(rel(authAccess,depends_on,notificationEmail), ['src/server/services/authAccess.ts']). +source_hash(rel(authAccess,depends_on,notificationEmail), 'sha256:f1f1e4ed2d4dd6d5742eb84db269c260d71c992c66f022d86529f6ebb874b179'). +source_file_hashes(rel(authAccess,depends_on,notificationEmail), ['sha256:f1f1e4ed2d4dd6d5742eb84db269c260d71c992c66f022d86529f6ebb874b179']). +derivation_query(rel(authAccess,depends_on,notificationEmail), "What are the import dependencies between server modules?"). +derived_at(rel(authAccess,depends_on,notificationEmail), '2026-07-01T05:51:27Z', agent). +derived_from(rel(authAccess,depends_on,officeLocation), agent_scan). +source_files(rel(authAccess,depends_on,officeLocation), ['src/server/services/authAccess.ts']). +source_hash(rel(authAccess,depends_on,officeLocation), 'sha256:f1f1e4ed2d4dd6d5742eb84db269c260d71c992c66f022d86529f6ebb874b179'). +source_file_hashes(rel(authAccess,depends_on,officeLocation), ['sha256:f1f1e4ed2d4dd6d5742eb84db269c260d71c992c66f022d86529f6ebb874b179']). +derivation_query(rel(authAccess,depends_on,officeLocation), "What are the import dependencies between server modules?"). +derived_at(rel(authAccess,depends_on,officeLocation), '2026-07-01T05:51:27Z', agent). +derived_from(rel(authAccess,depends_on,displayName), agent_scan). +source_files(rel(authAccess,depends_on,displayName), ['src/server/services/authAccess.ts']). +source_hash(rel(authAccess,depends_on,displayName), 'sha256:f1f1e4ed2d4dd6d5742eb84db269c260d71c992c66f022d86529f6ebb874b179'). +source_file_hashes(rel(authAccess,depends_on,displayName), ['sha256:f1f1e4ed2d4dd6d5742eb84db269c260d71c992c66f022d86529f6ebb874b179']). +derivation_query(rel(authAccess,depends_on,displayName), "What are the import dependencies between server modules?"). +derived_at(rel(authAccess,depends_on,displayName), '2026-07-01T05:51:27Z', agent). +derived_from(rel(authAccess,depends_on,authAudit), agent_scan). +source_files(rel(authAccess,depends_on,authAudit), ['src/server/services/authAccess.ts']). +source_hash(rel(authAccess,depends_on,authAudit), 'sha256:f1f1e4ed2d4dd6d5742eb84db269c260d71c992c66f022d86529f6ebb874b179'). +source_file_hashes(rel(authAccess,depends_on,authAudit), ['sha256:f1f1e4ed2d4dd6d5742eb84db269c260d71c992c66f022d86529f6ebb874b179']). +derivation_query(rel(authAccess,depends_on,authAudit), "What are the import dependencies between server modules?"). +derived_at(rel(authAccess,depends_on,authAudit), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealItemIdentity,depends_on,db), agent_scan). +source_files(rel(mealItemIdentity,depends_on,db), ['src/server/services/mealItemIdentity.ts']). +source_hash(rel(mealItemIdentity,depends_on,db), 'sha256:f935d69c551ba4e476c59d0b9f223f9b55f60c4256cd08cc28ffe32f777de872'). +source_file_hashes(rel(mealItemIdentity,depends_on,db), ['sha256:f935d69c551ba4e476c59d0b9f223f9b55f60c4256cd08cc28ffe32f777de872']). +derivation_query(rel(mealItemIdentity,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(mealItemIdentity,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealItemIdentity,depends_on,routeUtils), agent_scan). +source_files(rel(mealItemIdentity,depends_on,routeUtils), ['src/server/services/mealItemIdentity.ts']). +source_hash(rel(mealItemIdentity,depends_on,routeUtils), 'sha256:f935d69c551ba4e476c59d0b9f223f9b55f60c4256cd08cc28ffe32f777de872'). +source_file_hashes(rel(mealItemIdentity,depends_on,routeUtils), ['sha256:f935d69c551ba4e476c59d0b9f223f9b55f60c4256cd08cc28ffe32f777de872']). +derivation_query(rel(mealItemIdentity,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(mealItemIdentity,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendation,depends_on,db), agent_scan). +source_files(rel(mealRecommendation,depends_on,db), ['src/server/services/mealRecommendation.ts']). +source_hash(rel(mealRecommendation,depends_on,db), 'sha256:857f266a578b6bc2777a0fc478c98193378a13f4560f5e8a8c47e82e3664b6e1'). +source_file_hashes(rel(mealRecommendation,depends_on,db), ['sha256:857f266a578b6bc2777a0fc478c98193378a13f4560f5e8a8c47e82e3664b6e1']). +derivation_query(rel(mealRecommendation,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendation,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendation,depends_on,routeUtils), agent_scan). +source_files(rel(mealRecommendation,depends_on,routeUtils), ['src/server/services/mealRecommendation.ts']). +source_hash(rel(mealRecommendation,depends_on,routeUtils), 'sha256:857f266a578b6bc2777a0fc478c98193378a13f4560f5e8a8c47e82e3664b6e1'). +source_file_hashes(rel(mealRecommendation,depends_on,routeUtils), ['sha256:857f266a578b6bc2777a0fc478c98193378a13f4560f5e8a8c47e82e3664b6e1']). +derivation_query(rel(mealRecommendation,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendation,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendation,depends_on,lib_types), agent_scan). +source_files(rel(mealRecommendation,depends_on,lib_types), ['src/server/services/mealRecommendation.ts']). +source_hash(rel(mealRecommendation,depends_on,lib_types), 'sha256:857f266a578b6bc2777a0fc478c98193378a13f4560f5e8a8c47e82e3664b6e1'). +source_file_hashes(rel(mealRecommendation,depends_on,lib_types), ['sha256:857f266a578b6bc2777a0fc478c98193378a13f4560f5e8a8c47e82e3664b6e1']). +derivation_query(rel(mealRecommendation,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendation,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendation,depends_on,mealRecommendationAi), agent_scan). +source_files(rel(mealRecommendation,depends_on,mealRecommendationAi), ['src/server/services/mealRecommendation.ts']). +source_hash(rel(mealRecommendation,depends_on,mealRecommendationAi), 'sha256:857f266a578b6bc2777a0fc478c98193378a13f4560f5e8a8c47e82e3664b6e1'). +source_file_hashes(rel(mealRecommendation,depends_on,mealRecommendationAi), ['sha256:857f266a578b6bc2777a0fc478c98193378a13f4560f5e8a8c47e82e3664b6e1']). +derivation_query(rel(mealRecommendation,depends_on,mealRecommendationAi), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendation,depends_on,mealRecommendationAi), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendation,depends_on,mealFeatures), agent_scan). +source_files(rel(mealRecommendation,depends_on,mealFeatures), ['src/server/services/mealRecommendation.ts']). +source_hash(rel(mealRecommendation,depends_on,mealFeatures), 'sha256:857f266a578b6bc2777a0fc478c98193378a13f4560f5e8a8c47e82e3664b6e1'). +source_file_hashes(rel(mealRecommendation,depends_on,mealFeatures), ['sha256:857f266a578b6bc2777a0fc478c98193378a13f4560f5e8a8c47e82e3664b6e1']). +derivation_query(rel(mealRecommendation,depends_on,mealFeatures), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendation,depends_on,mealFeatures), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendation,depends_on,mealRecommendationModel), agent_scan). +source_files(rel(mealRecommendation,depends_on,mealRecommendationModel), ['src/server/services/mealRecommendation.ts']). +source_hash(rel(mealRecommendation,depends_on,mealRecommendationModel), 'sha256:857f266a578b6bc2777a0fc478c98193378a13f4560f5e8a8c47e82e3664b6e1'). +source_file_hashes(rel(mealRecommendation,depends_on,mealRecommendationModel), ['sha256:857f266a578b6bc2777a0fc478c98193378a13f4560f5e8a8c47e82e3664b6e1']). +derivation_query(rel(mealRecommendation,depends_on,mealRecommendationModel), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendation,depends_on,mealRecommendationModel), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendation,depends_on,mealItemIdentity), agent_scan). +source_files(rel(mealRecommendation,depends_on,mealItemIdentity), ['src/server/services/mealRecommendation.ts']). +source_hash(rel(mealRecommendation,depends_on,mealItemIdentity), 'sha256:857f266a578b6bc2777a0fc478c98193378a13f4560f5e8a8c47e82e3664b6e1'). +source_file_hashes(rel(mealRecommendation,depends_on,mealItemIdentity), ['sha256:857f266a578b6bc2777a0fc478c98193378a13f4560f5e8a8c47e82e3664b6e1']). +derivation_query(rel(mealRecommendation,depends_on,mealItemIdentity), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendation,depends_on,mealItemIdentity), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendation,depends_on,userPreferences), agent_scan). +source_files(rel(mealRecommendation,depends_on,userPreferences), ['src/server/services/mealRecommendation.ts']). +source_hash(rel(mealRecommendation,depends_on,userPreferences), 'sha256:857f266a578b6bc2777a0fc478c98193378a13f4560f5e8a8c47e82e3664b6e1'). +source_file_hashes(rel(mealRecommendation,depends_on,userPreferences), ['sha256:857f266a578b6bc2777a0fc478c98193378a13f4560f5e8a8c47e82e3664b6e1']). +derivation_query(rel(mealRecommendation,depends_on,userPreferences), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendation,depends_on,userPreferences), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationAi,depends_on,lib_types), agent_scan). +source_files(rel(mealRecommendationAi,depends_on,lib_types), ['src/server/services/mealRecommendationAi.ts']). +source_hash(rel(mealRecommendationAi,depends_on,lib_types), 'sha256:cbc955de85f7b6fcdd054b665a5a0bd004d29f3415e2f1b298f3f2bef1e180b8'). +source_file_hashes(rel(mealRecommendationAi,depends_on,lib_types), ['sha256:cbc955de85f7b6fcdd054b665a5a0bd004d29f3415e2f1b298f3f2bef1e180b8']). +derivation_query(rel(mealRecommendationAi,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationAi,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationEval,depends_on,db), agent_scan). +source_files(rel(mealRecommendationEval,depends_on,db), ['src/server/services/mealRecommendationEval.ts']). +source_hash(rel(mealRecommendationEval,depends_on,db), 'sha256:60f3a8b628e42e5ae479f2822bb80ad19e485835b476a1d003e389cc5eef55e1'). +source_file_hashes(rel(mealRecommendationEval,depends_on,db), ['sha256:60f3a8b628e42e5ae479f2822bb80ad19e485835b476a1d003e389cc5eef55e1']). +derivation_query(rel(mealRecommendationEval,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationEval,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationEval,depends_on,routeUtils), agent_scan). +source_files(rel(mealRecommendationEval,depends_on,routeUtils), ['src/server/services/mealRecommendationEval.ts']). +source_hash(rel(mealRecommendationEval,depends_on,routeUtils), 'sha256:60f3a8b628e42e5ae479f2822bb80ad19e485835b476a1d003e389cc5eef55e1'). +source_file_hashes(rel(mealRecommendationEval,depends_on,routeUtils), ['sha256:60f3a8b628e42e5ae479f2822bb80ad19e485835b476a1d003e389cc5eef55e1']). +derivation_query(rel(mealRecommendationEval,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationEval,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationEval,depends_on,mealFeatures), agent_scan). +source_files(rel(mealRecommendationEval,depends_on,mealFeatures), ['src/server/services/mealRecommendationEval.ts']). +source_hash(rel(mealRecommendationEval,depends_on,mealFeatures), 'sha256:60f3a8b628e42e5ae479f2822bb80ad19e485835b476a1d003e389cc5eef55e1'). +source_file_hashes(rel(mealRecommendationEval,depends_on,mealFeatures), ['sha256:60f3a8b628e42e5ae479f2822bb80ad19e485835b476a1d003e389cc5eef55e1']). +derivation_query(rel(mealRecommendationEval,depends_on,mealFeatures), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationEval,depends_on,mealFeatures), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationEval,depends_on,mealRecommendationModel), agent_scan). +source_files(rel(mealRecommendationEval,depends_on,mealRecommendationModel), ['src/server/services/mealRecommendationEval.ts']). +source_hash(rel(mealRecommendationEval,depends_on,mealRecommendationModel), 'sha256:60f3a8b628e42e5ae479f2822bb80ad19e485835b476a1d003e389cc5eef55e1'). +source_file_hashes(rel(mealRecommendationEval,depends_on,mealRecommendationModel), ['sha256:60f3a8b628e42e5ae479f2822bb80ad19e485835b476a1d003e389cc5eef55e1']). +derivation_query(rel(mealRecommendationEval,depends_on,mealRecommendationModel), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationEval,depends_on,mealRecommendationModel), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationEval,depends_on,lib_types), agent_scan). +source_files(rel(mealRecommendationEval,depends_on,lib_types), ['src/server/services/mealRecommendationEval.ts']). +source_hash(rel(mealRecommendationEval,depends_on,lib_types), 'sha256:60f3a8b628e42e5ae479f2822bb80ad19e485835b476a1d003e389cc5eef55e1'). +source_file_hashes(rel(mealRecommendationEval,depends_on,lib_types), ['sha256:60f3a8b628e42e5ae479f2822bb80ad19e485835b476a1d003e389cc5eef55e1']). +derivation_query(rel(mealRecommendationEval,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationEval,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationExplore,depends_on,db), agent_scan). +source_files(rel(mealRecommendationExplore,depends_on,db), ['src/server/services/mealRecommendationExplore.ts']). +source_hash(rel(mealRecommendationExplore,depends_on,db), 'sha256:0d20406a3645ba36034bf20b3c4d2719dc486cc52eea15db3052ede1b5af37d2'). +source_file_hashes(rel(mealRecommendationExplore,depends_on,db), ['sha256:0d20406a3645ba36034bf20b3c4d2719dc486cc52eea15db3052ede1b5af37d2']). +derivation_query(rel(mealRecommendationExplore,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationExplore,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationExplore,depends_on,lib_types), agent_scan). +source_files(rel(mealRecommendationExplore,depends_on,lib_types), ['src/server/services/mealRecommendationExplore.ts']). +source_hash(rel(mealRecommendationExplore,depends_on,lib_types), 'sha256:0d20406a3645ba36034bf20b3c4d2719dc486cc52eea15db3052ede1b5af37d2'). +source_file_hashes(rel(mealRecommendationExplore,depends_on,lib_types), ['sha256:0d20406a3645ba36034bf20b3c4d2719dc486cc52eea15db3052ede1b5af37d2']). +derivation_query(rel(mealRecommendationExplore,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationExplore,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationExplore,depends_on,seededRng), agent_scan). +source_files(rel(mealRecommendationExplore,depends_on,seededRng), ['src/server/services/mealRecommendationExplore.ts']). +source_hash(rel(mealRecommendationExplore,depends_on,seededRng), 'sha256:0d20406a3645ba36034bf20b3c4d2719dc486cc52eea15db3052ede1b5af37d2'). +source_file_hashes(rel(mealRecommendationExplore,depends_on,seededRng), ['sha256:0d20406a3645ba36034bf20b3c4d2719dc486cc52eea15db3052ede1b5af37d2']). +derivation_query(rel(mealRecommendationExplore,depends_on,seededRng), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationExplore,depends_on,seededRng), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationExplore,depends_on,mealFeatures), agent_scan). +source_files(rel(mealRecommendationExplore,depends_on,mealFeatures), ['src/server/services/mealRecommendationExplore.ts']). +source_hash(rel(mealRecommendationExplore,depends_on,mealFeatures), 'sha256:0d20406a3645ba36034bf20b3c4d2719dc486cc52eea15db3052ede1b5af37d2'). +source_file_hashes(rel(mealRecommendationExplore,depends_on,mealFeatures), ['sha256:0d20406a3645ba36034bf20b3c4d2719dc486cc52eea15db3052ede1b5af37d2']). +derivation_query(rel(mealRecommendationExplore,depends_on,mealFeatures), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationExplore,depends_on,mealFeatures), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationExplore,depends_on,mealRecommendation), agent_scan). +source_files(rel(mealRecommendationExplore,depends_on,mealRecommendation), ['src/server/services/mealRecommendationExplore.ts']). +source_hash(rel(mealRecommendationExplore,depends_on,mealRecommendation), 'sha256:0d20406a3645ba36034bf20b3c4d2719dc486cc52eea15db3052ede1b5af37d2'). +source_file_hashes(rel(mealRecommendationExplore,depends_on,mealRecommendation), ['sha256:0d20406a3645ba36034bf20b3c4d2719dc486cc52eea15db3052ede1b5af37d2']). +derivation_query(rel(mealRecommendationExplore,depends_on,mealRecommendation), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationExplore,depends_on,mealRecommendation), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationExplore,depends_on,userPreferences), agent_scan). +source_files(rel(mealRecommendationExplore,depends_on,userPreferences), ['src/server/services/mealRecommendationExplore.ts']). +source_hash(rel(mealRecommendationExplore,depends_on,userPreferences), 'sha256:0d20406a3645ba36034bf20b3c4d2719dc486cc52eea15db3052ede1b5af37d2'). +source_file_hashes(rel(mealRecommendationExplore,depends_on,userPreferences), ['sha256:0d20406a3645ba36034bf20b3c4d2719dc486cc52eea15db3052ede1b5af37d2']). +derivation_query(rel(mealRecommendationExplore,depends_on,userPreferences), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationExplore,depends_on,userPreferences), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationModel,depends_on,db), agent_scan). +source_files(rel(mealRecommendationModel,depends_on,db), ['src/server/services/mealRecommendationModel.ts']). +source_hash(rel(mealRecommendationModel,depends_on,db), 'sha256:dbf5c230fbf580d5cc84310e76e38269a95fdb3679e30ab1bcc5c53338e6b869'). +source_file_hashes(rel(mealRecommendationModel,depends_on,db), ['sha256:dbf5c230fbf580d5cc84310e76e38269a95fdb3679e30ab1bcc5c53338e6b869']). +derivation_query(rel(mealRecommendationModel,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationModel,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationModel,depends_on,routeUtils), agent_scan). +source_files(rel(mealRecommendationModel,depends_on,routeUtils), ['src/server/services/mealRecommendationModel.ts']). +source_hash(rel(mealRecommendationModel,depends_on,routeUtils), 'sha256:dbf5c230fbf580d5cc84310e76e38269a95fdb3679e30ab1bcc5c53338e6b869'). +source_file_hashes(rel(mealRecommendationModel,depends_on,routeUtils), ['sha256:dbf5c230fbf580d5cc84310e76e38269a95fdb3679e30ab1bcc5c53338e6b869']). +derivation_query(rel(mealRecommendationModel,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationModel,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationModel,depends_on,seededRng), agent_scan). +source_files(rel(mealRecommendationModel,depends_on,seededRng), ['src/server/services/mealRecommendationModel.ts']). +source_hash(rel(mealRecommendationModel,depends_on,seededRng), 'sha256:dbf5c230fbf580d5cc84310e76e38269a95fdb3679e30ab1bcc5c53338e6b869'). +source_file_hashes(rel(mealRecommendationModel,depends_on,seededRng), ['sha256:dbf5c230fbf580d5cc84310e76e38269a95fdb3679e30ab1bcc5c53338e6b869']). +derivation_query(rel(mealRecommendationModel,depends_on,seededRng), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationModel,depends_on,seededRng), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationModel,depends_on,mealFeatures), agent_scan). +source_files(rel(mealRecommendationModel,depends_on,mealFeatures), ['src/server/services/mealRecommendationModel.ts']). +source_hash(rel(mealRecommendationModel,depends_on,mealFeatures), 'sha256:dbf5c230fbf580d5cc84310e76e38269a95fdb3679e30ab1bcc5c53338e6b869'). +source_file_hashes(rel(mealRecommendationModel,depends_on,mealFeatures), ['sha256:dbf5c230fbf580d5cc84310e76e38269a95fdb3679e30ab1bcc5c53338e6b869']). +derivation_query(rel(mealRecommendationModel,depends_on,mealFeatures), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationModel,depends_on,mealFeatures), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationModel,depends_on,mealItemIdentity), agent_scan). +source_files(rel(mealRecommendationModel,depends_on,mealItemIdentity), ['src/server/services/mealRecommendationModel.ts']). +source_hash(rel(mealRecommendationModel,depends_on,mealItemIdentity), 'sha256:dbf5c230fbf580d5cc84310e76e38269a95fdb3679e30ab1bcc5c53338e6b869'). +source_file_hashes(rel(mealRecommendationModel,depends_on,mealItemIdentity), ['sha256:dbf5c230fbf580d5cc84310e76e38269a95fdb3679e30ab1bcc5c53338e6b869']). +derivation_query(rel(mealRecommendationModel,depends_on,mealItemIdentity), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationModel,depends_on,mealItemIdentity), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationModel,depends_on,lib_types), agent_scan). +source_files(rel(mealRecommendationModel,depends_on,lib_types), ['src/server/services/mealRecommendationModel.ts']). +source_hash(rel(mealRecommendationModel,depends_on,lib_types), 'sha256:dbf5c230fbf580d5cc84310e76e38269a95fdb3679e30ab1bcc5c53338e6b869'). +source_file_hashes(rel(mealRecommendationModel,depends_on,lib_types), ['sha256:dbf5c230fbf580d5cc84310e76e38269a95fdb3679e30ab1bcc5c53338e6b869']). +derivation_query(rel(mealRecommendationModel,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationModel,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationModelXlearn,depends_on,mealRecommendationModel), agent_scan). +source_files(rel(mealRecommendationModelXlearn,depends_on,mealRecommendationModel), ['src/server/services/mealRecommendationModelXlearn.ts']). +source_hash(rel(mealRecommendationModelXlearn,depends_on,mealRecommendationModel), 'sha256:35a259799ca8c7c8a0573f7d69447e150d9be739722363437240e5bc00f71dc7'). +source_file_hashes(rel(mealRecommendationModelXlearn,depends_on,mealRecommendationModel), ['sha256:35a259799ca8c7c8a0573f7d69447e150d9be739722363437240e5bc00f71dc7']). +derivation_query(rel(mealRecommendationModelXlearn,depends_on,mealRecommendationModel), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationModelXlearn,depends_on,mealRecommendationModel), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationPreVote,depends_on,db), agent_scan). +source_files(rel(mealRecommendationPreVote,depends_on,db), ['src/server/services/mealRecommendationPreVote.ts']). +source_hash(rel(mealRecommendationPreVote,depends_on,db), 'sha256:756bc1e596ccd4e17b7c4898ef685f6000a439b6cf227b8a6d34fed0378484b6'). +source_file_hashes(rel(mealRecommendationPreVote,depends_on,db), ['sha256:756bc1e596ccd4e17b7c4898ef685f6000a439b6cf227b8a6d34fed0378484b6']). +derivation_query(rel(mealRecommendationPreVote,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationPreVote,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationPreVote,depends_on,routeUtils), agent_scan). +source_files(rel(mealRecommendationPreVote,depends_on,routeUtils), ['src/server/services/mealRecommendationPreVote.ts']). +source_hash(rel(mealRecommendationPreVote,depends_on,routeUtils), 'sha256:756bc1e596ccd4e17b7c4898ef685f6000a439b6cf227b8a6d34fed0378484b6'). +source_file_hashes(rel(mealRecommendationPreVote,depends_on,routeUtils), ['sha256:756bc1e596ccd4e17b7c4898ef685f6000a439b6cf227b8a6d34fed0378484b6']). +derivation_query(rel(mealRecommendationPreVote,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationPreVote,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationPreVote,depends_on,lib_types), agent_scan). +source_files(rel(mealRecommendationPreVote,depends_on,lib_types), ['src/server/services/mealRecommendationPreVote.ts']). +source_hash(rel(mealRecommendationPreVote,depends_on,lib_types), 'sha256:756bc1e596ccd4e17b7c4898ef685f6000a439b6cf227b8a6d34fed0378484b6'). +source_file_hashes(rel(mealRecommendationPreVote,depends_on,lib_types), ['sha256:756bc1e596ccd4e17b7c4898ef685f6000a439b6cf227b8a6d34fed0378484b6']). +derivation_query(rel(mealRecommendationPreVote,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationPreVote,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationPreVote,depends_on,mealRecommendation), agent_scan). +source_files(rel(mealRecommendationPreVote,depends_on,mealRecommendation), ['src/server/services/mealRecommendationPreVote.ts']). +source_hash(rel(mealRecommendationPreVote,depends_on,mealRecommendation), 'sha256:756bc1e596ccd4e17b7c4898ef685f6000a439b6cf227b8a6d34fed0378484b6'). +source_file_hashes(rel(mealRecommendationPreVote,depends_on,mealRecommendation), ['sha256:756bc1e596ccd4e17b7c4898ef685f6000a439b6cf227b8a6d34fed0378484b6']). +derivation_query(rel(mealRecommendationPreVote,depends_on,mealRecommendation), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationPreVote,depends_on,mealRecommendation), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationPreVote,depends_on,mealFeatures), agent_scan). +source_files(rel(mealRecommendationPreVote,depends_on,mealFeatures), ['src/server/services/mealRecommendationPreVote.ts']). +source_hash(rel(mealRecommendationPreVote,depends_on,mealFeatures), 'sha256:756bc1e596ccd4e17b7c4898ef685f6000a439b6cf227b8a6d34fed0378484b6'). +source_file_hashes(rel(mealRecommendationPreVote,depends_on,mealFeatures), ['sha256:756bc1e596ccd4e17b7c4898ef685f6000a439b6cf227b8a6d34fed0378484b6']). +derivation_query(rel(mealRecommendationPreVote,depends_on,mealFeatures), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationPreVote,depends_on,mealFeatures), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationPreVote,depends_on,mealRecommendationModel), agent_scan). +source_files(rel(mealRecommendationPreVote,depends_on,mealRecommendationModel), ['src/server/services/mealRecommendationPreVote.ts']). +source_hash(rel(mealRecommendationPreVote,depends_on,mealRecommendationModel), 'sha256:756bc1e596ccd4e17b7c4898ef685f6000a439b6cf227b8a6d34fed0378484b6'). +source_file_hashes(rel(mealRecommendationPreVote,depends_on,mealRecommendationModel), ['sha256:756bc1e596ccd4e17b7c4898ef685f6000a439b6cf227b8a6d34fed0378484b6']). +derivation_query(rel(mealRecommendationPreVote,depends_on,mealRecommendationModel), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationPreVote,depends_on,mealRecommendationModel), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealRecommendationPreVote,depends_on,mealItemIdentity), agent_scan). +source_files(rel(mealRecommendationPreVote,depends_on,mealItemIdentity), ['src/server/services/mealRecommendationPreVote.ts']). +source_hash(rel(mealRecommendationPreVote,depends_on,mealItemIdentity), 'sha256:756bc1e596ccd4e17b7c4898ef685f6000a439b6cf227b8a6d34fed0378484b6'). +source_file_hashes(rel(mealRecommendationPreVote,depends_on,mealItemIdentity), ['sha256:756bc1e596ccd4e17b7c4898ef685f6000a439b6cf227b8a6d34fed0378484b6']). +derivation_query(rel(mealRecommendationPreVote,depends_on,mealItemIdentity), "What are the import dependencies between server modules?"). +derived_at(rel(mealRecommendationPreVote,depends_on,mealItemIdentity), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealAnticipatedLikes,depends_on,db), agent_scan). +source_files(rel(mealAnticipatedLikes,depends_on,db), ['src/server/services/mealAnticipatedLikes.ts']). +source_hash(rel(mealAnticipatedLikes,depends_on,db), 'sha256:c4dd7f0a8e1d5a28572a5379a4364e5f90323bb68739b56e8cf9eeaf7ca82379'). +source_file_hashes(rel(mealAnticipatedLikes,depends_on,db), ['sha256:c4dd7f0a8e1d5a28572a5379a4364e5f90323bb68739b56e8cf9eeaf7ca82379']). +derivation_query(rel(mealAnticipatedLikes,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(mealAnticipatedLikes,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealAnticipatedLikes,depends_on,routeUtils), agent_scan). +source_files(rel(mealAnticipatedLikes,depends_on,routeUtils), ['src/server/services/mealAnticipatedLikes.ts']). +source_hash(rel(mealAnticipatedLikes,depends_on,routeUtils), 'sha256:c4dd7f0a8e1d5a28572a5379a4364e5f90323bb68739b56e8cf9eeaf7ca82379'). +source_file_hashes(rel(mealAnticipatedLikes,depends_on,routeUtils), ['sha256:c4dd7f0a8e1d5a28572a5379a4364e5f90323bb68739b56e8cf9eeaf7ca82379']). +derivation_query(rel(mealAnticipatedLikes,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(mealAnticipatedLikes,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealAnticipatedLikes,depends_on,mealFeatures), agent_scan). +source_files(rel(mealAnticipatedLikes,depends_on,mealFeatures), ['src/server/services/mealAnticipatedLikes.ts']). +source_hash(rel(mealAnticipatedLikes,depends_on,mealFeatures), 'sha256:c4dd7f0a8e1d5a28572a5379a4364e5f90323bb68739b56e8cf9eeaf7ca82379'). +source_file_hashes(rel(mealAnticipatedLikes,depends_on,mealFeatures), ['sha256:c4dd7f0a8e1d5a28572a5379a4364e5f90323bb68739b56e8cf9eeaf7ca82379']). +derivation_query(rel(mealAnticipatedLikes,depends_on,mealFeatures), "What are the import dependencies between server modules?"). +derived_at(rel(mealAnticipatedLikes,depends_on,mealFeatures), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealAnticipatedLikes,depends_on,mealItemIdentity), agent_scan). +source_files(rel(mealAnticipatedLikes,depends_on,mealItemIdentity), ['src/server/services/mealAnticipatedLikes.ts']). +source_hash(rel(mealAnticipatedLikes,depends_on,mealItemIdentity), 'sha256:c4dd7f0a8e1d5a28572a5379a4364e5f90323bb68739b56e8cf9eeaf7ca82379'). +source_file_hashes(rel(mealAnticipatedLikes,depends_on,mealItemIdentity), ['sha256:c4dd7f0a8e1d5a28572a5379a4364e5f90323bb68739b56e8cf9eeaf7ca82379']). +derivation_query(rel(mealAnticipatedLikes,depends_on,mealItemIdentity), "What are the import dependencies between server modules?"). +derived_at(rel(mealAnticipatedLikes,depends_on,mealItemIdentity), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealAnticipatedLikes,depends_on,lib_types), agent_scan). +source_files(rel(mealAnticipatedLikes,depends_on,lib_types), ['src/server/services/mealAnticipatedLikes.ts']). +source_hash(rel(mealAnticipatedLikes,depends_on,lib_types), 'sha256:c4dd7f0a8e1d5a28572a5379a4364e5f90323bb68739b56e8cf9eeaf7ca82379'). +source_file_hashes(rel(mealAnticipatedLikes,depends_on,lib_types), ['sha256:c4dd7f0a8e1d5a28572a5379a4364e5f90323bb68739b56e8cf9eeaf7ca82379']). +derivation_query(rel(mealAnticipatedLikes,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(mealAnticipatedLikes,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(mealFeatures,depends_on,db), agent_scan). +source_files(rel(mealFeatures,depends_on,db), ['src/server/services/mealFeatures.ts']). +source_hash(rel(mealFeatures,depends_on,db), 'sha256:6162e0410b9e506efc31e2e223a866ad463e744f372ef0cdeff32c7bdfa8aec0'). +source_file_hashes(rel(mealFeatures,depends_on,db), ['sha256:6162e0410b9e506efc31e2e223a866ad463e744f372ef0cdeff32c7bdfa8aec0']). +derivation_query(rel(mealFeatures,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(mealFeatures,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(menu,depends_on,db), agent_scan). +source_files(rel(menu,depends_on,db), ['src/server/services/menu.ts']). +source_hash(rel(menu,depends_on,db), 'sha256:1a3d9899108229a23dc7b49cff0332a1eb6993fbd9effe84db2ca955c723024b'). +source_file_hashes(rel(menu,depends_on,db), ['sha256:1a3d9899108229a23dc7b49cff0332a1eb6993fbd9effe84db2ca955c723024b']). +derivation_query(rel(menu,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(menu,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(menu,depends_on,sse), agent_scan). +source_files(rel(menu,depends_on,sse), ['src/server/services/menu.ts']). +source_hash(rel(menu,depends_on,sse), 'sha256:1a3d9899108229a23dc7b49cff0332a1eb6993fbd9effe84db2ca955c723024b'). +source_file_hashes(rel(menu,depends_on,sse), ['sha256:1a3d9899108229a23dc7b49cff0332a1eb6993fbd9effe84db2ca955c723024b']). +derivation_query(rel(menu,depends_on,sse), "What are the import dependencies between server modules?"). +derived_at(rel(menu,depends_on,sse), '2026-07-01T05:51:27Z', agent). +derived_from(rel(menu,depends_on,officeLocation), agent_scan). +source_files(rel(menu,depends_on,officeLocation), ['src/server/services/menu.ts']). +source_hash(rel(menu,depends_on,officeLocation), 'sha256:1a3d9899108229a23dc7b49cff0332a1eb6993fbd9effe84db2ca955c723024b'). +source_file_hashes(rel(menu,depends_on,officeLocation), ['sha256:1a3d9899108229a23dc7b49cff0332a1eb6993fbd9effe84db2ca955c723024b']). +derivation_query(rel(menu,depends_on,officeLocation), "What are the import dependencies between server modules?"). +derived_at(rel(menu,depends_on,officeLocation), '2026-07-01T05:51:27Z', agent). +derived_from(rel(menu,depends_on,mealItemIdentity), agent_scan). +source_files(rel(menu,depends_on,mealItemIdentity), ['src/server/services/menu.ts']). +source_hash(rel(menu,depends_on,mealItemIdentity), 'sha256:1a3d9899108229a23dc7b49cff0332a1eb6993fbd9effe84db2ca955c723024b'). +source_file_hashes(rel(menu,depends_on,mealItemIdentity), ['sha256:1a3d9899108229a23dc7b49cff0332a1eb6993fbd9effe84db2ca955c723024b']). +derivation_query(rel(menu,depends_on,mealItemIdentity), "What are the import dependencies between server modules?"). +derived_at(rel(menu,depends_on,mealItemIdentity), '2026-07-01T05:51:27Z', agent). +derived_from(rel(menu,depends_on,mealFeatures), agent_scan). +source_files(rel(menu,depends_on,mealFeatures), ['src/server/services/menu.ts']). +source_hash(rel(menu,depends_on,mealFeatures), 'sha256:1a3d9899108229a23dc7b49cff0332a1eb6993fbd9effe84db2ca955c723024b'). +source_file_hashes(rel(menu,depends_on,mealFeatures), ['sha256:1a3d9899108229a23dc7b49cff0332a1eb6993fbd9effe84db2ca955c723024b']). +derivation_query(rel(menu,depends_on,mealFeatures), "What are the import dependencies between server modules?"). +derived_at(rel(menu,depends_on,mealFeatures), '2026-07-01T05:51:27Z', agent). +derived_from(rel(menu,depends_on,mealRecommendationAi), agent_scan). +source_files(rel(menu,depends_on,mealRecommendationAi), ['src/server/services/menu.ts']). +source_hash(rel(menu,depends_on,mealRecommendationAi), 'sha256:1a3d9899108229a23dc7b49cff0332a1eb6993fbd9effe84db2ca955c723024b'). +source_file_hashes(rel(menu,depends_on,mealRecommendationAi), ['sha256:1a3d9899108229a23dc7b49cff0332a1eb6993fbd9effe84db2ca955c723024b']). +derivation_query(rel(menu,depends_on,mealRecommendationAi), "What are the import dependencies between server modules?"). +derived_at(rel(menu,depends_on,mealRecommendationAi), '2026-07-01T05:51:27Z', agent). +derived_from(rel(menu,depends_on,lib_types), agent_scan). +source_files(rel(menu,depends_on,lib_types), ['src/server/services/menu.ts']). +source_hash(rel(menu,depends_on,lib_types), 'sha256:1a3d9899108229a23dc7b49cff0332a1eb6993fbd9effe84db2ca955c723024b'). +source_file_hashes(rel(menu,depends_on,lib_types), ['sha256:1a3d9899108229a23dc7b49cff0332a1eb6993fbd9effe84db2ca955c723024b']). +derivation_query(rel(menu,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(menu,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(officeLocation,depends_on,db), agent_scan). +source_files(rel(officeLocation,depends_on,db), ['src/server/services/officeLocation.ts']). +source_hash(rel(officeLocation,depends_on,db), 'sha256:70c68a3df551bd343a7f67fe3bacaf221b0809b4218b20aec6d64e8044ca1b50'). +source_file_hashes(rel(officeLocation,depends_on,db), ['sha256:70c68a3df551bd343a7f67fe3bacaf221b0809b4218b20aec6d64e8044ca1b50']). +derivation_query(rel(officeLocation,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(officeLocation,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(officeLocation,depends_on,routeUtils), agent_scan). +source_files(rel(officeLocation,depends_on,routeUtils), ['src/server/services/officeLocation.ts']). +source_hash(rel(officeLocation,depends_on,routeUtils), 'sha256:70c68a3df551bd343a7f67fe3bacaf221b0809b4218b20aec6d64e8044ca1b50'). +source_file_hashes(rel(officeLocation,depends_on,routeUtils), ['sha256:70c68a3df551bd343a7f67fe3bacaf221b0809b4218b20aec6d64e8044ca1b50']). +derivation_query(rel(officeLocation,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(officeLocation,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(officeLocation,depends_on,lib_types), agent_scan). +source_files(rel(officeLocation,depends_on,lib_types), ['src/server/services/officeLocation.ts']). +source_hash(rel(officeLocation,depends_on,lib_types), 'sha256:70c68a3df551bd343a7f67fe3bacaf221b0809b4218b20aec6d64e8044ca1b50'). +source_file_hashes(rel(officeLocation,depends_on,lib_types), ['sha256:70c68a3df551bd343a7f67fe3bacaf221b0809b4218b20aec6d64e8044ca1b50']). +derivation_query(rel(officeLocation,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(officeLocation,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(officeContext,depends_on,authSession), agent_scan). +source_files(rel(officeContext,depends_on,authSession), ['src/server/services/officeContext.ts']). +source_hash(rel(officeContext,depends_on,authSession), 'sha256:0c7fd471cb37c785a4f3854d4f126b15a7a65e79de374eccbc79cefe24522b8d'). +source_file_hashes(rel(officeContext,depends_on,authSession), ['sha256:0c7fd471cb37c785a4f3854d4f126b15a7a65e79de374eccbc79cefe24522b8d']). +derivation_query(rel(officeContext,depends_on,authSession), "What are the import dependencies between server modules?"). +derived_at(rel(officeContext,depends_on,authSession), '2026-07-01T05:51:27Z', agent). +derived_from(rel(officeContext,depends_on,authAccess), agent_scan). +source_files(rel(officeContext,depends_on,authAccess), ['src/server/services/officeContext.ts']). +source_hash(rel(officeContext,depends_on,authAccess), 'sha256:0c7fd471cb37c785a4f3854d4f126b15a7a65e79de374eccbc79cefe24522b8d'). +source_file_hashes(rel(officeContext,depends_on,authAccess), ['sha256:0c7fd471cb37c785a4f3854d4f126b15a7a65e79de374eccbc79cefe24522b8d']). +derivation_query(rel(officeContext,depends_on,authAccess), "What are the import dependencies between server modules?"). +derived_at(rel(officeContext,depends_on,authAccess), '2026-07-01T05:51:27Z', agent). +derived_from(rel(officeContext,depends_on,officeLocation), agent_scan). +source_files(rel(officeContext,depends_on,officeLocation), ['src/server/services/officeContext.ts']). +source_hash(rel(officeContext,depends_on,officeLocation), 'sha256:0c7fd471cb37c785a4f3854d4f126b15a7a65e79de374eccbc79cefe24522b8d'). +source_file_hashes(rel(officeContext,depends_on,officeLocation), ['sha256:0c7fd471cb37c785a4f3854d4f126b15a7a65e79de374eccbc79cefe24522b8d']). +derivation_query(rel(officeContext,depends_on,officeLocation), "What are the import dependencies between server modules?"). +derived_at(rel(officeContext,depends_on,officeLocation), '2026-07-01T05:51:27Z', agent). +derived_from(rel(officeContext,depends_on,routeUtils), agent_scan). +source_files(rel(officeContext,depends_on,routeUtils), ['src/server/services/officeContext.ts']). +source_hash(rel(officeContext,depends_on,routeUtils), 'sha256:0c7fd471cb37c785a4f3854d4f126b15a7a65e79de374eccbc79cefe24522b8d'). +source_file_hashes(rel(officeContext,depends_on,routeUtils), ['sha256:0c7fd471cb37c785a4f3854d4f126b15a7a65e79de374eccbc79cefe24522b8d']). +derivation_query(rel(officeContext,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(officeContext,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(officePollSchedule,depends_on,db), agent_scan). +source_files(rel(officePollSchedule,depends_on,db), ['src/server/services/officePollSchedule.ts']). +source_hash(rel(officePollSchedule,depends_on,db), 'sha256:ea250028fedb9a81528356c0db5af4e3689daf87e335fe5f6d0b9c314837b514'). +source_file_hashes(rel(officePollSchedule,depends_on,db), ['sha256:ea250028fedb9a81528356c0db5af4e3689daf87e335fe5f6d0b9c314837b514']). +derivation_query(rel(officePollSchedule,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(officePollSchedule,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(officePollSchedule,depends_on,officeLocation), agent_scan). +source_files(rel(officePollSchedule,depends_on,officeLocation), ['src/server/services/officePollSchedule.ts']). +source_hash(rel(officePollSchedule,depends_on,officeLocation), 'sha256:ea250028fedb9a81528356c0db5af4e3689daf87e335fe5f6d0b9c314837b514'). +source_file_hashes(rel(officePollSchedule,depends_on,officeLocation), ['sha256:ea250028fedb9a81528356c0db5af4e3689daf87e335fe5f6d0b9c314837b514']). +derivation_query(rel(officePollSchedule,depends_on,officeLocation), "What are the import dependencies between server modules?"). +derived_at(rel(officePollSchedule,depends_on,officeLocation), '2026-07-01T05:51:27Z', agent). +derived_from(rel(officePollSchedule,depends_on,lib_types), agent_scan). +source_files(rel(officePollSchedule,depends_on,lib_types), ['src/server/services/officePollSchedule.ts']). +source_hash(rel(officePollSchedule,depends_on,lib_types), 'sha256:ea250028fedb9a81528356c0db5af4e3689daf87e335fe5f6d0b9c314837b514'). +source_file_hashes(rel(officePollSchedule,depends_on,lib_types), ['sha256:ea250028fedb9a81528356c0db5af4e3689daf87e335fe5f6d0b9c314837b514']). +derivation_query(rel(officePollSchedule,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(officePollSchedule,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(officeRecommenderSettings,depends_on,db), agent_scan). +source_files(rel(officeRecommenderSettings,depends_on,db), ['src/server/services/officeRecommenderSettings.ts']). +source_hash(rel(officeRecommenderSettings,depends_on,db), 'sha256:984a5583b9ccc6c3e83c361cc6f32412aa2dd2596c31c81d0c1ed45c494b6fe7'). +source_file_hashes(rel(officeRecommenderSettings,depends_on,db), ['sha256:984a5583b9ccc6c3e83c361cc6f32412aa2dd2596c31c81d0c1ed45c494b6fe7']). +derivation_query(rel(officeRecommenderSettings,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(officeRecommenderSettings,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(officeRecommenderSettings,depends_on,routeUtils), agent_scan). +source_files(rel(officeRecommenderSettings,depends_on,routeUtils), ['src/server/services/officeRecommenderSettings.ts']). +source_hash(rel(officeRecommenderSettings,depends_on,routeUtils), 'sha256:984a5583b9ccc6c3e83c361cc6f32412aa2dd2596c31c81d0c1ed45c494b6fe7'). +source_file_hashes(rel(officeRecommenderSettings,depends_on,routeUtils), ['sha256:984a5583b9ccc6c3e83c361cc6f32412aa2dd2596c31c81d0c1ed45c494b6fe7']). +derivation_query(rel(officeRecommenderSettings,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(officeRecommenderSettings,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(officeRecommenderSettings,depends_on,lib_types), agent_scan). +source_files(rel(officeRecommenderSettings,depends_on,lib_types), ['src/server/services/officeRecommenderSettings.ts']). +source_hash(rel(officeRecommenderSettings,depends_on,lib_types), 'sha256:984a5583b9ccc6c3e83c361cc6f32412aa2dd2596c31c81d0c1ed45c494b6fe7'). +source_file_hashes(rel(officeRecommenderSettings,depends_on,lib_types), ['sha256:984a5583b9ccc6c3e83c361cc6f32412aa2dd2596c31c81d0c1ed45c494b6fe7']). +derivation_query(rel(officeRecommenderSettings,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(officeRecommenderSettings,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(officeRecommenderSettings,depends_on,mealRecommendationModel), agent_scan). +source_files(rel(officeRecommenderSettings,depends_on,mealRecommendationModel), ['src/server/services/officeRecommenderSettings.ts']). +source_hash(rel(officeRecommenderSettings,depends_on,mealRecommendationModel), 'sha256:984a5583b9ccc6c3e83c361cc6f32412aa2dd2596c31c81d0c1ed45c494b6fe7'). +source_file_hashes(rel(officeRecommenderSettings,depends_on,mealRecommendationModel), ['sha256:984a5583b9ccc6c3e83c361cc6f32412aa2dd2596c31c81d0c1ed45c494b6fe7']). +derivation_query(rel(officeRecommenderSettings,depends_on,mealRecommendationModel), "What are the import dependencies between server modules?"). +derived_at(rel(officeRecommenderSettings,depends_on,mealRecommendationModel), '2026-07-01T05:51:27Z', agent). +derived_from(rel(poll,depends_on,db), agent_scan). +source_files(rel(poll,depends_on,db), ['src/server/services/poll.ts']). +source_hash(rel(poll,depends_on,db), 'sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318'). +source_file_hashes(rel(poll,depends_on,db), ['sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318']). +derivation_query(rel(poll,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(poll,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(poll,depends_on,sse), agent_scan). +source_files(rel(poll,depends_on,sse), ['src/server/services/poll.ts']). +source_hash(rel(poll,depends_on,sse), 'sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318'). +source_file_hashes(rel(poll,depends_on,sse), ['sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318']). +derivation_query(rel(poll,depends_on,sse), "What are the import dependencies between server modules?"). +derived_at(rel(poll,depends_on,sse), '2026-07-01T05:51:27Z', agent). +derived_from(rel(poll,depends_on,lib_types), agent_scan). +source_files(rel(poll,depends_on,lib_types), ['src/server/services/poll.ts']). +source_hash(rel(poll,depends_on,lib_types), 'sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318'). +source_file_hashes(rel(poll,depends_on,lib_types), ['sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318']). +derivation_query(rel(poll,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(poll,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(poll,depends_on,authAccess), agent_scan). +source_files(rel(poll,depends_on,authAccess), ['src/server/services/poll.ts']). +source_hash(rel(poll,depends_on,authAccess), 'sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318'). +source_file_hashes(rel(poll,depends_on,authAccess), ['sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318']). +derivation_query(rel(poll,depends_on,authAccess), "What are the import dependencies between server modules?"). +derived_at(rel(poll,depends_on,authAccess), '2026-07-01T05:51:27Z', agent). +derived_from(rel(poll,depends_on,notificationEmail), agent_scan). +source_files(rel(poll,depends_on,notificationEmail), ['src/server/services/poll.ts']). +source_hash(rel(poll,depends_on,notificationEmail), 'sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318'). +source_file_hashes(rel(poll,depends_on,notificationEmail), ['sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318']). +derivation_query(rel(poll,depends_on,notificationEmail), "What are the import dependencies between server modules?"). +derived_at(rel(poll,depends_on,notificationEmail), '2026-07-01T05:51:27Z', agent). +derived_from(rel(poll,depends_on,officeLocation), agent_scan). +source_files(rel(poll,depends_on,officeLocation), ['src/server/services/poll.ts']). +source_hash(rel(poll,depends_on,officeLocation), 'sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318'). +source_file_hashes(rel(poll,depends_on,officeLocation), ['sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318']). +derivation_query(rel(poll,depends_on,officeLocation), "What are the import dependencies between server modules?"). +derived_at(rel(poll,depends_on,officeLocation), '2026-07-01T05:51:27Z', agent). +derived_from(rel(shoppingList,depends_on,db), agent_scan). +source_files(rel(shoppingList,depends_on,db), ['src/server/services/shoppingList.ts']). +source_hash(rel(shoppingList,depends_on,db), 'sha256:d063917fb9724446a59bbfe141dcaa7d65e056c90ab5e05fcfb1f732b563a6c2'). +source_file_hashes(rel(shoppingList,depends_on,db), ['sha256:d063917fb9724446a59bbfe141dcaa7d65e056c90ab5e05fcfb1f732b563a6c2']). +derivation_query(rel(shoppingList,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(shoppingList,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(shoppingList,depends_on,sse), agent_scan). +source_files(rel(shoppingList,depends_on,sse), ['src/server/services/shoppingList.ts']). +source_hash(rel(shoppingList,depends_on,sse), 'sha256:d063917fb9724446a59bbfe141dcaa7d65e056c90ab5e05fcfb1f732b563a6c2'). +source_file_hashes(rel(shoppingList,depends_on,sse), ['sha256:d063917fb9724446a59bbfe141dcaa7d65e056c90ab5e05fcfb1f732b563a6c2']). +derivation_query(rel(shoppingList,depends_on,sse), "What are the import dependencies between server modules?"). +derived_at(rel(shoppingList,depends_on,sse), '2026-07-01T05:51:27Z', agent). +derived_from(rel(shoppingList,depends_on,lib_types), agent_scan). +source_files(rel(shoppingList,depends_on,lib_types), ['src/server/services/shoppingList.ts']). +source_hash(rel(shoppingList,depends_on,lib_types), 'sha256:d063917fb9724446a59bbfe141dcaa7d65e056c90ab5e05fcfb1f732b563a6c2'). +source_file_hashes(rel(shoppingList,depends_on,lib_types), ['sha256:d063917fb9724446a59bbfe141dcaa7d65e056c90ab5e05fcfb1f732b563a6c2']). +derivation_query(rel(shoppingList,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(shoppingList,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(shoppingList,depends_on,officeLocation), agent_scan). +source_files(rel(shoppingList,depends_on,officeLocation), ['src/server/services/shoppingList.ts']). +source_hash(rel(shoppingList,depends_on,officeLocation), 'sha256:d063917fb9724446a59bbfe141dcaa7d65e056c90ab5e05fcfb1f732b563a6c2'). +source_file_hashes(rel(shoppingList,depends_on,officeLocation), ['sha256:d063917fb9724446a59bbfe141dcaa7d65e056c90ab5e05fcfb1f732b563a6c2']). +derivation_query(rel(shoppingList,depends_on,officeLocation), "What are the import dependencies between server modules?"). +derived_at(rel(shoppingList,depends_on,officeLocation), '2026-07-01T05:51:27Z', agent). +derived_from(rel(userPreferences,depends_on,db), agent_scan). +source_files(rel(userPreferences,depends_on,db), ['src/server/services/userPreferences.ts']). +source_hash(rel(userPreferences,depends_on,db), 'sha256:2d6ad691a2136f8559e30842e2e35c7f69eb46d517cfe40bd7adc1c64eb15009'). +source_file_hashes(rel(userPreferences,depends_on,db), ['sha256:2d6ad691a2136f8559e30842e2e35c7f69eb46d517cfe40bd7adc1c64eb15009']). +derivation_query(rel(userPreferences,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(userPreferences,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(userPreferences,depends_on,lib_types), agent_scan). +source_files(rel(userPreferences,depends_on,lib_types), ['src/server/services/userPreferences.ts']). +source_hash(rel(userPreferences,depends_on,lib_types), 'sha256:2d6ad691a2136f8559e30842e2e35c7f69eb46d517cfe40bd7adc1c64eb15009'). +source_file_hashes(rel(userPreferences,depends_on,lib_types), ['sha256:2d6ad691a2136f8559e30842e2e35c7f69eb46d517cfe40bd7adc1c64eb15009']). +derivation_query(rel(userPreferences,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(userPreferences,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(userMenuDefaults,depends_on,db), agent_scan). +source_files(rel(userMenuDefaults,depends_on,db), ['src/server/services/userMenuDefaults.ts']). +source_hash(rel(userMenuDefaults,depends_on,db), 'sha256:ae3522c5e6505c698ecb43509df7b94f73080e20bc4579e82cd3800db5e1bf6e'). +source_file_hashes(rel(userMenuDefaults,depends_on,db), ['sha256:ae3522c5e6505c698ecb43509df7b94f73080e20bc4579e82cd3800db5e1bf6e']). +derivation_query(rel(userMenuDefaults,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(userMenuDefaults,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(userMenuDefaults,depends_on,lib_types), agent_scan). +source_files(rel(userMenuDefaults,depends_on,lib_types), ['src/server/services/userMenuDefaults.ts']). +source_hash(rel(userMenuDefaults,depends_on,lib_types), 'sha256:ae3522c5e6505c698ecb43509df7b94f73080e20bc4579e82cd3800db5e1bf6e'). +source_file_hashes(rel(userMenuDefaults,depends_on,lib_types), ['sha256:ae3522c5e6505c698ecb43509df7b94f73080e20bc4579e82cd3800db5e1bf6e']). +derivation_query(rel(userMenuDefaults,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(userMenuDefaults,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(sse,depends_on,db), agent_scan). +source_files(rel(sse,depends_on,db), ['src/server/sse.ts']). +source_hash(rel(sse,depends_on,db), 'sha256:642ae7d389f05e1f5f7791fe787b799b4c64a6af88e4cfc26a1b8ca670a98348'). +source_file_hashes(rel(sse,depends_on,db), ['sha256:642ae7d389f05e1f5f7791fe787b799b4c64a6af88e4cfc26a1b8ca670a98348']). +derivation_query(rel(sse,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(sse,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(sse,depends_on,lib_types), agent_scan). +source_files(rel(sse,depends_on,lib_types), ['src/server/sse.ts']). +source_hash(rel(sse,depends_on,lib_types), 'sha256:642ae7d389f05e1f5f7791fe787b799b4c64a6af88e4cfc26a1b8ca670a98348'). +source_file_hashes(rel(sse,depends_on,lib_types), ['sha256:642ae7d389f05e1f5f7791fe787b799b4c64a6af88e4cfc26a1b8ca670a98348']). +derivation_query(rel(sse,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(sse,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(sse,depends_on,officeLocation), agent_scan). +source_files(rel(sse,depends_on,officeLocation), ['src/server/sse.ts']). +source_hash(rel(sse,depends_on,officeLocation), 'sha256:642ae7d389f05e1f5f7791fe787b799b4c64a6af88e4cfc26a1b8ca670a98348'). +source_file_hashes(rel(sse,depends_on,officeLocation), ['sha256:642ae7d389f05e1f5f7791fe787b799b4c64a6af88e4cfc26a1b8ca670a98348']). +derivation_query(rel(sse,depends_on,officeLocation), "What are the import dependencies between server modules?"). +derived_at(rel(sse,depends_on,officeLocation), '2026-07-01T05:51:27Z', agent). +derived_from(rel(auth_route,depends_on,lib_types), agent_scan). +source_files(rel(auth_route,depends_on,lib_types), ['src/server/routes/auth.ts']). +source_hash(rel(auth_route,depends_on,lib_types), 'sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25'). +source_file_hashes(rel(auth_route,depends_on,lib_types), ['sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25']). +derivation_query(rel(auth_route,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(auth_route,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(auth_route,depends_on,routeUtils), agent_scan). +source_files(rel(auth_route,depends_on,routeUtils), ['src/server/routes/auth.ts']). +source_hash(rel(auth_route,depends_on,routeUtils), 'sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25'). +source_file_hashes(rel(auth_route,depends_on,routeUtils), ['sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25']). +derivation_query(rel(auth_route,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(auth_route,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(auth_route,depends_on,authSession), agent_scan). +source_files(rel(auth_route,depends_on,authSession), ['src/server/routes/auth.ts']). +source_hash(rel(auth_route,depends_on,authSession), 'sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25'). +source_file_hashes(rel(auth_route,depends_on,authSession), ['sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25']). +derivation_query(rel(auth_route,depends_on,authSession), "What are the import dependencies between server modules?"). +derived_at(rel(auth_route,depends_on,authSession), '2026-07-01T05:51:27Z', agent). +derived_from(rel(auth_route,depends_on,localAuth), agent_scan). +source_files(rel(auth_route,depends_on,localAuth), ['src/server/routes/auth.ts']). +source_hash(rel(auth_route,depends_on,localAuth), 'sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25'). +source_file_hashes(rel(auth_route,depends_on,localAuth), ['sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25']). +derivation_query(rel(auth_route,depends_on,localAuth), "What are the import dependencies between server modules?"). +derived_at(rel(auth_route,depends_on,localAuth), '2026-07-01T05:51:27Z', agent). +derived_from(rel(auth_route,depends_on,entraOidc), agent_scan). +source_files(rel(auth_route,depends_on,entraOidc), ['src/server/routes/auth.ts']). +source_hash(rel(auth_route,depends_on,entraOidc), 'sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25'). +source_file_hashes(rel(auth_route,depends_on,entraOidc), ['sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25']). +derivation_query(rel(auth_route,depends_on,entraOidc), "What are the import dependencies between server modules?"). +derived_at(rel(auth_route,depends_on,entraOidc), '2026-07-01T05:51:27Z', agent). +derived_from(rel(auth_route,depends_on,localLoginProtection), agent_scan). +source_files(rel(auth_route,depends_on,localLoginProtection), ['src/server/routes/auth.ts']). +source_hash(rel(auth_route,depends_on,localLoginProtection), 'sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25'). +source_file_hashes(rel(auth_route,depends_on,localLoginProtection), ['sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25']). +derivation_query(rel(auth_route,depends_on,localLoginProtection), "What are the import dependencies between server modules?"). +derived_at(rel(auth_route,depends_on,localLoginProtection), '2026-07-01T05:51:27Z', agent). +derived_from(rel(auth_route,depends_on,authAccess), agent_scan). +source_files(rel(auth_route,depends_on,authAccess), ['src/server/routes/auth.ts']). +source_hash(rel(auth_route,depends_on,authAccess), 'sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25'). +source_file_hashes(rel(auth_route,depends_on,authAccess), ['sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25']). +derivation_query(rel(auth_route,depends_on,authAccess), "What are the import dependencies between server modules?"). +derived_at(rel(auth_route,depends_on,authAccess), '2026-07-01T05:51:27Z', agent). +derived_from(rel(auth_route,depends_on,sse), agent_scan). +source_files(rel(auth_route,depends_on,sse), ['src/server/routes/auth.ts']). +source_hash(rel(auth_route,depends_on,sse), 'sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25'). +source_file_hashes(rel(auth_route,depends_on,sse), ['sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25']). +derivation_query(rel(auth_route,depends_on,sse), "What are the import dependencies between server modules?"). +derived_at(rel(auth_route,depends_on,sse), '2026-07-01T05:51:27Z', agent). +derived_from(rel(auth_route,depends_on,officeLocation), agent_scan). +source_files(rel(auth_route,depends_on,officeLocation), ['src/server/routes/auth.ts']). +source_hash(rel(auth_route,depends_on,officeLocation), 'sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25'). +source_file_hashes(rel(auth_route,depends_on,officeLocation), ['sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25']). +derivation_query(rel(auth_route,depends_on,officeLocation), "What are the import dependencies between server modules?"). +derived_at(rel(auth_route,depends_on,officeLocation), '2026-07-01T05:51:27Z', agent). +derived_from(rel(auth_route,depends_on,authAudit), agent_scan). +source_files(rel(auth_route,depends_on,authAudit), ['src/server/routes/auth.ts']). +source_hash(rel(auth_route,depends_on,authAudit), 'sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25'). +source_file_hashes(rel(auth_route,depends_on,authAudit), ['sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25']). +derivation_query(rel(auth_route,depends_on,authAudit), "What are the import dependencies between server modules?"). +derived_at(rel(auth_route,depends_on,authAudit), '2026-07-01T05:51:27Z', agent). +derived_from(rel(auth_route,depends_on,authAvatar), agent_scan). +source_files(rel(auth_route,depends_on,authAvatar), ['src/server/routes/auth.ts']). +source_hash(rel(auth_route,depends_on,authAvatar), 'sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25'). +source_file_hashes(rel(auth_route,depends_on,authAvatar), ['sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25']). +derivation_query(rel(auth_route,depends_on,authAvatar), "What are the import dependencies between server modules?"). +derived_at(rel(auth_route,depends_on,authAvatar), '2026-07-01T05:51:27Z', agent). +derived_from(rel(auth_route,depends_on,dbConnectivity), agent_scan). +source_files(rel(auth_route,depends_on,dbConnectivity), ['src/server/routes/auth.ts']). +source_hash(rel(auth_route,depends_on,dbConnectivity), 'sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25'). +source_file_hashes(rel(auth_route,depends_on,dbConnectivity), ['sha256:1dc8c0c337a69c750aff42070311b8686af13a0258fa9fca091919eb474c4d25']). +derivation_query(rel(auth_route,depends_on,dbConnectivity), "What are the import dependencies between server modules?"). +derived_at(rel(auth_route,depends_on,dbConnectivity), '2026-07-01T05:51:27Z', agent). +derived_from(rel(authIdentity,depends_on,authSession), agent_scan). +source_files(rel(authIdentity,depends_on,authSession), ['src/server/routes/authIdentity.ts']). +source_hash(rel(authIdentity,depends_on,authSession), 'sha256:30a4da6b02c665a7fd85a085734fb09427c0c2502bb68b3a6c07c5a72c12f062'). +source_file_hashes(rel(authIdentity,depends_on,authSession), ['sha256:30a4da6b02c665a7fd85a085734fb09427c0c2502bb68b3a6c07c5a72c12f062']). +derivation_query(rel(authIdentity,depends_on,authSession), "What are the import dependencies between server modules?"). +derived_at(rel(authIdentity,depends_on,authSession), '2026-07-01T05:51:27Z', agent). +derived_from(rel(authIdentity,depends_on,authAccess), agent_scan). +source_files(rel(authIdentity,depends_on,authAccess), ['src/server/routes/authIdentity.ts']). +source_hash(rel(authIdentity,depends_on,authAccess), 'sha256:30a4da6b02c665a7fd85a085734fb09427c0c2502bb68b3a6c07c5a72c12f062'). +source_file_hashes(rel(authIdentity,depends_on,authAccess), ['sha256:30a4da6b02c665a7fd85a085734fb09427c0c2502bb68b3a6c07c5a72c12f062']). +derivation_query(rel(authIdentity,depends_on,authAccess), "What are the import dependencies between server modules?"). +derived_at(rel(authIdentity,depends_on,authAccess), '2026-07-01T05:51:27Z', agent). +derived_from(rel(authIdentity,depends_on,localAuth), agent_scan). +source_files(rel(authIdentity,depends_on,localAuth), ['src/server/routes/authIdentity.ts']). +source_hash(rel(authIdentity,depends_on,localAuth), 'sha256:30a4da6b02c665a7fd85a085734fb09427c0c2502bb68b3a6c07c5a72c12f062'). +source_file_hashes(rel(authIdentity,depends_on,localAuth), ['sha256:30a4da6b02c665a7fd85a085734fb09427c0c2502bb68b3a6c07c5a72c12f062']). +derivation_query(rel(authIdentity,depends_on,localAuth), "What are the import dependencies between server modules?"). +derived_at(rel(authIdentity,depends_on,localAuth), '2026-07-01T05:51:27Z', agent). +derived_from(rel(authIdentity,depends_on,routeUtils), agent_scan). +source_files(rel(authIdentity,depends_on,routeUtils), ['src/server/routes/authIdentity.ts']). +source_hash(rel(authIdentity,depends_on,routeUtils), 'sha256:30a4da6b02c665a7fd85a085734fb09427c0c2502bb68b3a6c07c5a72c12f062'). +source_file_hashes(rel(authIdentity,depends_on,routeUtils), ['sha256:30a4da6b02c665a7fd85a085734fb09427c0c2502bb68b3a6c07c5a72c12f062']). +derivation_query(rel(authIdentity,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(authIdentity,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(recommenderAdmin,depends_on,routeUtils), agent_scan). +source_files(rel(recommenderAdmin,depends_on,routeUtils), ['src/server/routes/recommenderAdmin.ts']). +source_hash(rel(recommenderAdmin,depends_on,routeUtils), 'sha256:5259d224fac9eca4adc374c9670e213a731d2de66d7c39fc23dbd62ebcb5788f'). +source_file_hashes(rel(recommenderAdmin,depends_on,routeUtils), ['sha256:5259d224fac9eca4adc374c9670e213a731d2de66d7c39fc23dbd62ebcb5788f']). +derivation_query(rel(recommenderAdmin,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(recommenderAdmin,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(recommenderAdmin,depends_on,authIdentity), agent_scan). +source_files(rel(recommenderAdmin,depends_on,authIdentity), ['src/server/routes/recommenderAdmin.ts']). +source_hash(rel(recommenderAdmin,depends_on,authIdentity), 'sha256:5259d224fac9eca4adc374c9670e213a731d2de66d7c39fc23dbd62ebcb5788f'). +source_file_hashes(rel(recommenderAdmin,depends_on,authIdentity), ['sha256:5259d224fac9eca4adc374c9670e213a731d2de66d7c39fc23dbd62ebcb5788f']). +derivation_query(rel(recommenderAdmin,depends_on,authIdentity), "What are the import dependencies between server modules?"). +derived_at(rel(recommenderAdmin,depends_on,authIdentity), '2026-07-01T05:51:27Z', agent). +derived_from(rel(recommenderAdmin,depends_on,mealRecommendationEval), agent_scan). +source_files(rel(recommenderAdmin,depends_on,mealRecommendationEval), ['src/server/routes/recommenderAdmin.ts']). +source_hash(rel(recommenderAdmin,depends_on,mealRecommendationEval), 'sha256:5259d224fac9eca4adc374c9670e213a731d2de66d7c39fc23dbd62ebcb5788f'). +source_file_hashes(rel(recommenderAdmin,depends_on,mealRecommendationEval), ['sha256:5259d224fac9eca4adc374c9670e213a731d2de66d7c39fc23dbd62ebcb5788f']). +derivation_query(rel(recommenderAdmin,depends_on,mealRecommendationEval), "What are the import dependencies between server modules?"). +derived_at(rel(recommenderAdmin,depends_on,mealRecommendationEval), '2026-07-01T05:51:27Z', agent). +derived_from(rel(recommenderAdmin,depends_on,officeRecommenderSettings), agent_scan). +source_files(rel(recommenderAdmin,depends_on,officeRecommenderSettings), ['src/server/routes/recommenderAdmin.ts']). +source_hash(rel(recommenderAdmin,depends_on,officeRecommenderSettings), 'sha256:5259d224fac9eca4adc374c9670e213a731d2de66d7c39fc23dbd62ebcb5788f'). +source_file_hashes(rel(recommenderAdmin,depends_on,officeRecommenderSettings), ['sha256:5259d224fac9eca4adc374c9670e213a731d2de66d7c39fc23dbd62ebcb5788f']). +derivation_query(rel(recommenderAdmin,depends_on,officeRecommenderSettings), "What are the import dependencies between server modules?"). +derived_at(rel(recommenderAdmin,depends_on,officeRecommenderSettings), '2026-07-01T05:51:27Z', agent). +derived_from(rel(recommenderAdmin,depends_on,mealRecommendationModel), agent_scan). +source_files(rel(recommenderAdmin,depends_on,mealRecommendationModel), ['src/server/routes/recommenderAdmin.ts']). +source_hash(rel(recommenderAdmin,depends_on,mealRecommendationModel), 'sha256:5259d224fac9eca4adc374c9670e213a731d2de66d7c39fc23dbd62ebcb5788f'). +source_file_hashes(rel(recommenderAdmin,depends_on,mealRecommendationModel), ['sha256:5259d224fac9eca4adc374c9670e213a731d2de66d7c39fc23dbd62ebcb5788f']). +derivation_query(rel(recommenderAdmin,depends_on,mealRecommendationModel), "What are the import dependencies between server modules?"). +derived_at(rel(recommenderAdmin,depends_on,mealRecommendationModel), '2026-07-01T05:51:27Z', agent). +derived_from(rel(recommenderAdmin,depends_on,lib_types), agent_scan). +source_files(rel(recommenderAdmin,depends_on,lib_types), ['src/server/routes/recommenderAdmin.ts']). +source_hash(rel(recommenderAdmin,depends_on,lib_types), 'sha256:5259d224fac9eca4adc374c9670e213a731d2de66d7c39fc23dbd62ebcb5788f'). +source_file_hashes(rel(recommenderAdmin,depends_on,lib_types), ['sha256:5259d224fac9eca4adc374c9670e213a731d2de66d7c39fc23dbd62ebcb5788f']). +derivation_query(rel(recommenderAdmin,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(recommenderAdmin,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(userPreferences_route,depends_on,routeUtils), agent_scan). +source_files(rel(userPreferences_route,depends_on,routeUtils), ['src/server/routes/userPreferences.ts']). +source_hash(rel(userPreferences_route,depends_on,routeUtils), 'sha256:0cf355e397895ebf072e460e4b500a9ffa9b4cdad9716284eb2e245cd1affbf1'). +source_file_hashes(rel(userPreferences_route,depends_on,routeUtils), ['sha256:0cf355e397895ebf072e460e4b500a9ffa9b4cdad9716284eb2e245cd1affbf1']). +derivation_query(rel(userPreferences_route,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(userPreferences_route,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(userPreferences_route,depends_on,userPreferences), agent_scan). +source_files(rel(userPreferences_route,depends_on,userPreferences), ['src/server/routes/userPreferences.ts']). +source_hash(rel(userPreferences_route,depends_on,userPreferences), 'sha256:0cf355e397895ebf072e460e4b500a9ffa9b4cdad9716284eb2e245cd1affbf1'). +source_file_hashes(rel(userPreferences_route,depends_on,userPreferences), ['sha256:0cf355e397895ebf072e460e4b500a9ffa9b4cdad9716284eb2e245cd1affbf1']). +derivation_query(rel(userPreferences_route,depends_on,userPreferences), "What are the import dependencies between server modules?"). +derived_at(rel(userPreferences_route,depends_on,userPreferences), '2026-07-01T05:51:27Z', agent). +derived_from(rel(userPreferences_route,depends_on,userMenuDefaults), agent_scan). +source_files(rel(userPreferences_route,depends_on,userMenuDefaults), ['src/server/routes/userPreferences.ts']). +source_hash(rel(userPreferences_route,depends_on,userMenuDefaults), 'sha256:0cf355e397895ebf072e460e4b500a9ffa9b4cdad9716284eb2e245cd1affbf1'). +source_file_hashes(rel(userPreferences_route,depends_on,userMenuDefaults), ['sha256:0cf355e397895ebf072e460e4b500a9ffa9b4cdad9716284eb2e245cd1affbf1']). +derivation_query(rel(userPreferences_route,depends_on,userMenuDefaults), "What are the import dependencies between server modules?"). +derived_at(rel(userPreferences_route,depends_on,userMenuDefaults), '2026-07-01T05:51:27Z', agent). +derived_from(rel(userPreferences_route,depends_on,authIdentity), agent_scan). +source_files(rel(userPreferences_route,depends_on,authIdentity), ['src/server/routes/userPreferences.ts']). +source_hash(rel(userPreferences_route,depends_on,authIdentity), 'sha256:0cf355e397895ebf072e460e4b500a9ffa9b4cdad9716284eb2e245cd1affbf1'). +source_file_hashes(rel(userPreferences_route,depends_on,authIdentity), ['sha256:0cf355e397895ebf072e460e4b500a9ffa9b4cdad9716284eb2e245cd1affbf1']). +derivation_query(rel(userPreferences_route,depends_on,authIdentity), "What are the import dependencies between server modules?"). +derived_at(rel(userPreferences_route,depends_on,authIdentity), '2026-07-01T05:51:27Z', agent). +derived_from(rel(userPreferences_route,depends_on,lib_types), agent_scan). +source_files(rel(userPreferences_route,depends_on,lib_types), ['src/server/routes/userPreferences.ts']). +source_hash(rel(userPreferences_route,depends_on,lib_types), 'sha256:0cf355e397895ebf072e460e4b500a9ffa9b4cdad9716284eb2e245cd1affbf1'). +source_file_hashes(rel(userPreferences_route,depends_on,lib_types), ['sha256:0cf355e397895ebf072e460e4b500a9ffa9b4cdad9716284eb2e245cd1affbf1']). +derivation_query(rel(userPreferences_route,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(userPreferences_route,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(menus_route,depends_on,menu), agent_scan). +source_files(rel(menus_route,depends_on,menu), ['src/server/routes/menus.ts']). +source_hash(rel(menus_route,depends_on,menu), 'sha256:47189b1728d230ac272c798e43b11c3cc398e88437d66c53f3719aef3785ba80'). +source_file_hashes(rel(menus_route,depends_on,menu), ['sha256:47189b1728d230ac272c798e43b11c3cc398e88437d66c53f3719aef3785ba80']). +derivation_query(rel(menus_route,depends_on,menu), "What are the import dependencies between server modules?"). +derived_at(rel(menus_route,depends_on,menu), '2026-07-01T05:51:27Z', agent). +derived_from(rel(menus_route,depends_on,routeUtils), agent_scan). +source_files(rel(menus_route,depends_on,routeUtils), ['src/server/routes/menus.ts']). +source_hash(rel(menus_route,depends_on,routeUtils), 'sha256:47189b1728d230ac272c798e43b11c3cc398e88437d66c53f3719aef3785ba80'). +source_file_hashes(rel(menus_route,depends_on,routeUtils), ['sha256:47189b1728d230ac272c798e43b11c3cc398e88437d66c53f3719aef3785ba80']). +derivation_query(rel(menus_route,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(menus_route,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(menus_route,depends_on,officeContext), agent_scan). +source_files(rel(menus_route,depends_on,officeContext), ['src/server/routes/menus.ts']). +source_hash(rel(menus_route,depends_on,officeContext), 'sha256:47189b1728d230ac272c798e43b11c3cc398e88437d66c53f3719aef3785ba80'). +source_file_hashes(rel(menus_route,depends_on,officeContext), ['sha256:47189b1728d230ac272c798e43b11c3cc398e88437d66c53f3719aef3785ba80']). +derivation_query(rel(menus_route,depends_on,officeContext), "What are the import dependencies between server modules?"). +derived_at(rel(menus_route,depends_on,officeContext), '2026-07-01T05:51:27Z', agent). +derived_from(rel(menus_route,depends_on,authIdentity), agent_scan). +source_files(rel(menus_route,depends_on,authIdentity), ['src/server/routes/menus.ts']). +source_hash(rel(menus_route,depends_on,authIdentity), 'sha256:47189b1728d230ac272c798e43b11c3cc398e88437d66c53f3719aef3785ba80'). +source_file_hashes(rel(menus_route,depends_on,authIdentity), ['sha256:47189b1728d230ac272c798e43b11c3cc398e88437d66c53f3719aef3785ba80']). +derivation_query(rel(menus_route,depends_on,authIdentity), "What are the import dependencies between server modules?"). +derived_at(rel(menus_route,depends_on,authIdentity), '2026-07-01T05:51:27Z', agent). +derived_from(rel(menus_route,depends_on,lib_types), agent_scan). +source_files(rel(menus_route,depends_on,lib_types), ['src/server/routes/menus.ts']). +source_hash(rel(menus_route,depends_on,lib_types), 'sha256:47189b1728d230ac272c798e43b11c3cc398e88437d66c53f3719aef3785ba80'). +source_file_hashes(rel(menus_route,depends_on,lib_types), ['sha256:47189b1728d230ac272c798e43b11c3cc398e88437d66c53f3719aef3785ba80']). +derivation_query(rel(menus_route,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(menus_route,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(polls_route,depends_on,poll), agent_scan). +source_files(rel(polls_route,depends_on,poll), ['src/server/routes/polls.ts']). +source_hash(rel(polls_route,depends_on,poll), 'sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451'). +source_file_hashes(rel(polls_route,depends_on,poll), ['sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451']). +derivation_query(rel(polls_route,depends_on,poll), "What are the import dependencies between server modules?"). +derived_at(rel(polls_route,depends_on,poll), '2026-07-01T05:51:27Z', agent). +derived_from(rel(polls_route,depends_on,db), agent_scan). +source_files(rel(polls_route,depends_on,db), ['src/server/routes/polls.ts']). +source_hash(rel(polls_route,depends_on,db), 'sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451'). +source_file_hashes(rel(polls_route,depends_on,db), ['sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451']). +derivation_query(rel(polls_route,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(polls_route,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(polls_route,depends_on,routeUtils), agent_scan). +source_files(rel(polls_route,depends_on,routeUtils), ['src/server/routes/polls.ts']). +source_hash(rel(polls_route,depends_on,routeUtils), 'sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451'). +source_file_hashes(rel(polls_route,depends_on,routeUtils), ['sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451']). +derivation_query(rel(polls_route,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(polls_route,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(polls_route,depends_on,authSession), agent_scan). +source_files(rel(polls_route,depends_on,authSession), ['src/server/routes/polls.ts']). +source_hash(rel(polls_route,depends_on,authSession), 'sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451'). +source_file_hashes(rel(polls_route,depends_on,authSession), ['sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451']). +derivation_query(rel(polls_route,depends_on,authSession), "What are the import dependencies between server modules?"). +derived_at(rel(polls_route,depends_on,authSession), '2026-07-01T05:51:27Z', agent). +derived_from(rel(polls_route,depends_on,authAccess), agent_scan). +source_files(rel(polls_route,depends_on,authAccess), ['src/server/routes/polls.ts']). +source_hash(rel(polls_route,depends_on,authAccess), 'sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451'). +source_file_hashes(rel(polls_route,depends_on,authAccess), ['sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451']). +derivation_query(rel(polls_route,depends_on,authAccess), "What are the import dependencies between server modules?"). +derived_at(rel(polls_route,depends_on,authAccess), '2026-07-01T05:51:27Z', agent). +derived_from(rel(polls_route,depends_on,officeContext), agent_scan). +source_files(rel(polls_route,depends_on,officeContext), ['src/server/routes/polls.ts']). +source_hash(rel(polls_route,depends_on,officeContext), 'sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451'). +source_file_hashes(rel(polls_route,depends_on,officeContext), ['sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451']). +derivation_query(rel(polls_route,depends_on,officeContext), "What are the import dependencies between server modules?"). +derived_at(rel(polls_route,depends_on,officeContext), '2026-07-01T05:51:27Z', agent). +derived_from(rel(polls_route,depends_on,authIdentity), agent_scan). +source_files(rel(polls_route,depends_on,authIdentity), ['src/server/routes/polls.ts']). +source_hash(rel(polls_route,depends_on,authIdentity), 'sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451'). +source_file_hashes(rel(polls_route,depends_on,authIdentity), ['sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451']). +derivation_query(rel(polls_route,depends_on,authIdentity), "What are the import dependencies between server modules?"). +derived_at(rel(polls_route,depends_on,authIdentity), '2026-07-01T05:51:27Z', agent). +derived_from(rel(polls_route,depends_on,lib_types), agent_scan). +source_files(rel(polls_route,depends_on,lib_types), ['src/server/routes/polls.ts']). +source_hash(rel(polls_route,depends_on,lib_types), 'sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451'). +source_file_hashes(rel(polls_route,depends_on,lib_types), ['sha256:c7b0b8fcec71f5bf92f5e583e578f019f5b63f6dcf29b6dff2945dbc73046451']). +derivation_query(rel(polls_route,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(polls_route,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(shoppingList_route,depends_on,shoppingList), agent_scan). +source_files(rel(shoppingList_route,depends_on,shoppingList), ['src/server/routes/shoppingList.ts']). +source_hash(rel(shoppingList_route,depends_on,shoppingList), 'sha256:e34aec52bcea6173e3637e82622b3e3f69f88f7e152963c16680f33c1a1a875c'). +source_file_hashes(rel(shoppingList_route,depends_on,shoppingList), ['sha256:e34aec52bcea6173e3637e82622b3e3f69f88f7e152963c16680f33c1a1a875c']). +derivation_query(rel(shoppingList_route,depends_on,shoppingList), "What are the import dependencies between server modules?"). +derived_at(rel(shoppingList_route,depends_on,shoppingList), '2026-07-01T05:51:27Z', agent). +derived_from(rel(shoppingList_route,depends_on,routeUtils), agent_scan). +source_files(rel(shoppingList_route,depends_on,routeUtils), ['src/server/routes/shoppingList.ts']). +source_hash(rel(shoppingList_route,depends_on,routeUtils), 'sha256:e34aec52bcea6173e3637e82622b3e3f69f88f7e152963c16680f33c1a1a875c'). +source_file_hashes(rel(shoppingList_route,depends_on,routeUtils), ['sha256:e34aec52bcea6173e3637e82622b3e3f69f88f7e152963c16680f33c1a1a875c']). +derivation_query(rel(shoppingList_route,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(shoppingList_route,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(shoppingList_route,depends_on,officeContext), agent_scan). +source_files(rel(shoppingList_route,depends_on,officeContext), ['src/server/routes/shoppingList.ts']). +source_hash(rel(shoppingList_route,depends_on,officeContext), 'sha256:e34aec52bcea6173e3637e82622b3e3f69f88f7e152963c16680f33c1a1a875c'). +source_file_hashes(rel(shoppingList_route,depends_on,officeContext), ['sha256:e34aec52bcea6173e3637e82622b3e3f69f88f7e152963c16680f33c1a1a875c']). +derivation_query(rel(shoppingList_route,depends_on,officeContext), "What are the import dependencies between server modules?"). +derived_at(rel(shoppingList_route,depends_on,officeContext), '2026-07-01T05:51:27Z', agent). +derived_from(rel(shoppingList_route,depends_on,authIdentity), agent_scan). +source_files(rel(shoppingList_route,depends_on,authIdentity), ['src/server/routes/shoppingList.ts']). +source_hash(rel(shoppingList_route,depends_on,authIdentity), 'sha256:e34aec52bcea6173e3637e82622b3e3f69f88f7e152963c16680f33c1a1a875c'). +source_file_hashes(rel(shoppingList_route,depends_on,authIdentity), ['sha256:e34aec52bcea6173e3637e82622b3e3f69f88f7e152963c16680f33c1a1a875c']). +derivation_query(rel(shoppingList_route,depends_on,authIdentity), "What are the import dependencies between server modules?"). +derived_at(rel(shoppingList_route,depends_on,authIdentity), '2026-07-01T05:51:27Z', agent). +derived_from(rel(shoppingList_route,depends_on,lib_types), agent_scan). +source_files(rel(shoppingList_route,depends_on,lib_types), ['src/server/routes/shoppingList.ts']). +source_hash(rel(shoppingList_route,depends_on,lib_types), 'sha256:e34aec52bcea6173e3637e82622b3e3f69f88f7e152963c16680f33c1a1a875c'). +source_file_hashes(rel(shoppingList_route,depends_on,lib_types), ['sha256:e34aec52bcea6173e3637e82622b3e3f69f88f7e152963c16680f33c1a1a875c']). +derivation_query(rel(shoppingList_route,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(shoppingList_route,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelections_route,depends_on,foodSelection), agent_scan). +source_files(rel(foodSelections_route,depends_on,foodSelection), ['src/server/routes/foodSelections.ts']). +source_hash(rel(foodSelections_route,depends_on,foodSelection), 'sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2'). +source_file_hashes(rel(foodSelections_route,depends_on,foodSelection), ['sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2']). +derivation_query(rel(foodSelections_route,depends_on,foodSelection), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelections_route,depends_on,foodSelection), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelections_route,depends_on,poll), agent_scan). +source_files(rel(foodSelections_route,depends_on,poll), ['src/server/routes/foodSelections.ts']). +source_hash(rel(foodSelections_route,depends_on,poll), 'sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2'). +source_file_hashes(rel(foodSelections_route,depends_on,poll), ['sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2']). +derivation_query(rel(foodSelections_route,depends_on,poll), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelections_route,depends_on,poll), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelections_route,depends_on,mealRecommendation), agent_scan). +source_files(rel(foodSelections_route,depends_on,mealRecommendation), ['src/server/routes/foodSelections.ts']). +source_hash(rel(foodSelections_route,depends_on,mealRecommendation), 'sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2'). +source_file_hashes(rel(foodSelections_route,depends_on,mealRecommendation), ['sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2']). +derivation_query(rel(foodSelections_route,depends_on,mealRecommendation), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelections_route,depends_on,mealRecommendation), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelections_route,depends_on,mealRecommendationExplore), agent_scan). +source_files(rel(foodSelections_route,depends_on,mealRecommendationExplore), ['src/server/routes/foodSelections.ts']). +source_hash(rel(foodSelections_route,depends_on,mealRecommendationExplore), 'sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2'). +source_file_hashes(rel(foodSelections_route,depends_on,mealRecommendationExplore), ['sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2']). +derivation_query(rel(foodSelections_route,depends_on,mealRecommendationExplore), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelections_route,depends_on,mealRecommendationExplore), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelections_route,depends_on,mealRecommendationPreVote), agent_scan). +source_files(rel(foodSelections_route,depends_on,mealRecommendationPreVote), ['src/server/routes/foodSelections.ts']). +source_hash(rel(foodSelections_route,depends_on,mealRecommendationPreVote), 'sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2'). +source_file_hashes(rel(foodSelections_route,depends_on,mealRecommendationPreVote), ['sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2']). +derivation_query(rel(foodSelections_route,depends_on,mealRecommendationPreVote), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelections_route,depends_on,mealRecommendationPreVote), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelections_route,depends_on,mealAnticipatedLikes), agent_scan). +source_files(rel(foodSelections_route,depends_on,mealAnticipatedLikes), ['src/server/routes/foodSelections.ts']). +source_hash(rel(foodSelections_route,depends_on,mealAnticipatedLikes), 'sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2'). +source_file_hashes(rel(foodSelections_route,depends_on,mealAnticipatedLikes), ['sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2']). +derivation_query(rel(foodSelections_route,depends_on,mealAnticipatedLikes), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelections_route,depends_on,mealAnticipatedLikes), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelections_route,depends_on,db), agent_scan). +source_files(rel(foodSelections_route,depends_on,db), ['src/server/routes/foodSelections.ts']). +source_hash(rel(foodSelections_route,depends_on,db), 'sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2'). +source_file_hashes(rel(foodSelections_route,depends_on,db), ['sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2']). +derivation_query(rel(foodSelections_route,depends_on,db), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelections_route,depends_on,db), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelections_route,depends_on,routeUtils), agent_scan). +source_files(rel(foodSelections_route,depends_on,routeUtils), ['src/server/routes/foodSelections.ts']). +source_hash(rel(foodSelections_route,depends_on,routeUtils), 'sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2'). +source_file_hashes(rel(foodSelections_route,depends_on,routeUtils), ['sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2']). +derivation_query(rel(foodSelections_route,depends_on,routeUtils), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelections_route,depends_on,routeUtils), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelections_route,depends_on,authAccess), agent_scan). +source_files(rel(foodSelections_route,depends_on,authAccess), ['src/server/routes/foodSelections.ts']). +source_hash(rel(foodSelections_route,depends_on,authAccess), 'sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2'). +source_file_hashes(rel(foodSelections_route,depends_on,authAccess), ['sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2']). +derivation_query(rel(foodSelections_route,depends_on,authAccess), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelections_route,depends_on,authAccess), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelections_route,depends_on,officeContext), agent_scan). +source_files(rel(foodSelections_route,depends_on,officeContext), ['src/server/routes/foodSelections.ts']). +source_hash(rel(foodSelections_route,depends_on,officeContext), 'sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2'). +source_file_hashes(rel(foodSelections_route,depends_on,officeContext), ['sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2']). +derivation_query(rel(foodSelections_route,depends_on,officeContext), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelections_route,depends_on,officeContext), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelections_route,depends_on,authIdentity), agent_scan). +source_files(rel(foodSelections_route,depends_on,authIdentity), ['src/server/routes/foodSelections.ts']). +source_hash(rel(foodSelections_route,depends_on,authIdentity), 'sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2'). +source_file_hashes(rel(foodSelections_route,depends_on,authIdentity), ['sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2']). +derivation_query(rel(foodSelections_route,depends_on,authIdentity), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelections_route,depends_on,authIdentity), '2026-07-01T05:51:27Z', agent). +derived_from(rel(foodSelections_route,depends_on,lib_types), agent_scan). +source_files(rel(foodSelections_route,depends_on,lib_types), ['src/server/routes/foodSelections.ts']). +source_hash(rel(foodSelections_route,depends_on,lib_types), 'sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2'). +source_file_hashes(rel(foodSelections_route,depends_on,lib_types), ['sha256:6847ee0160f00efbc80b5ee04cc781005f54e2df2d97923bb0ed4b5ba51212c2']). +derivation_query(rel(foodSelections_route,depends_on,lib_types), "What are the import dependencies between server modules?"). +derived_at(rel(foodSelections_route,depends_on,lib_types), '2026-07-01T05:51:27Z', agent). +derived_from(entity(pollCreation,service), agent_scan). +source_files(entity(pollCreation,service), ['src/server/services/pollCreation.ts']). +source_hash(entity(pollCreation,service), 'sha256:e000e1abec40e1856662c109807b9456470d616ca46e3aa305036d3af2337569'). +source_file_hashes(entity(pollCreation,service), ['sha256:e000e1abec40e1856662c109807b9456470d616ca46e3aa305036d3af2337569']). +derivation_query(entity(pollCreation,service), "what service does pollCreation.ts define?"). +derived_at(entity(pollCreation,service), '2026-07-01T11:07:28Z', agent). +derived_from(rel(pollCreation,depends_on,db), agent_scan). +source_files(rel(pollCreation,depends_on,db), ['src/server/services/pollCreation.ts']). +source_hash(rel(pollCreation,depends_on,db), 'sha256:e000e1abec40e1856662c109807b9456470d616ca46e3aa305036d3af2337569'). +source_file_hashes(rel(pollCreation,depends_on,db), ['sha256:e000e1abec40e1856662c109807b9456470d616ca46e3aa305036d3af2337569']). +derivation_query(rel(pollCreation,depends_on,db), "what does pollCreation import?"). +derived_at(rel(pollCreation,depends_on,db), '2026-07-01T11:07:34Z', agent). +derived_from(rel(pollCreation,depends_on,officeLocation), agent_scan). +source_files(rel(pollCreation,depends_on,officeLocation), ['src/server/services/pollCreation.ts']). +source_hash(rel(pollCreation,depends_on,officeLocation), 'sha256:e000e1abec40e1856662c109807b9456470d616ca46e3aa305036d3af2337569'). +source_file_hashes(rel(pollCreation,depends_on,officeLocation), ['sha256:e000e1abec40e1856662c109807b9456470d616ca46e3aa305036d3af2337569']). +derivation_query(rel(pollCreation,depends_on,officeLocation), "what does pollCreation import?"). +derived_at(rel(pollCreation,depends_on,officeLocation), '2026-07-01T11:07:34Z', agent). +derived_from(rel(pollCreation,depends_on,lib_types), agent_scan). +source_files(rel(pollCreation,depends_on,lib_types), ['src/server/services/pollCreation.ts']). +source_hash(rel(pollCreation,depends_on,lib_types), 'sha256:e000e1abec40e1856662c109807b9456470d616ca46e3aa305036d3af2337569'). +source_file_hashes(rel(pollCreation,depends_on,lib_types), ['sha256:e000e1abec40e1856662c109807b9456470d616ca46e3aa305036d3af2337569']). +derivation_query(rel(pollCreation,depends_on,lib_types), "what does pollCreation import?"). +derived_at(rel(pollCreation,depends_on,lib_types), '2026-07-01T11:07:35Z', agent). +derived_from(rel(poll,depends_on,pollCreation), agent_scan). +source_files(rel(poll,depends_on,pollCreation), ['src/server/services/poll.ts']). +source_hash(rel(poll,depends_on,pollCreation), 'sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318'). +source_file_hashes(rel(poll,depends_on,pollCreation), ['sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318']). +derivation_query(rel(poll,depends_on,pollCreation), "what does poll.ts import from pollCreation?"). +derived_at(rel(poll,depends_on,pollCreation), '2026-07-01T11:07:36Z', agent). +derived_from(rel(officePollSchedule,depends_on,pollCreation), agent_scan). +source_files(rel(officePollSchedule,depends_on,pollCreation), ['src/server/services/officePollSchedule.ts']). +source_hash(rel(officePollSchedule,depends_on,pollCreation), 'sha256:ea250028fedb9a81528356c0db5af4e3689daf87e335fe5f6d0b9c314837b514'). +source_file_hashes(rel(officePollSchedule,depends_on,pollCreation), ['sha256:ea250028fedb9a81528356c0db5af4e3689daf87e335fe5f6d0b9c314837b514']). +derivation_query(rel(officePollSchedule,depends_on,pollCreation), "what does officePollSchedule import?"). +derived_at(rel(officePollSchedule,depends_on,pollCreation), '2026-07-01T11:07:45Z', agent). +derived_from(rel(sse,depends_on,pollCreation), agent_scan). +source_files(rel(sse,depends_on,pollCreation), ['src/server/sse.ts']). +source_hash(rel(sse,depends_on,pollCreation), 'sha256:642ae7d389f05e1f5f7791fe787b799b4c64a6af88e4cfc26a1b8ca670a98348'). +source_file_hashes(rel(sse,depends_on,pollCreation), ['sha256:642ae7d389f05e1f5f7791fe787b799b4c64a6af88e4cfc26a1b8ca670a98348']). +derivation_query(rel(sse,depends_on,pollCreation), "what does sse.ts import from pollCreation?"). +derived_at(rel(sse,depends_on,pollCreation), '2026-07-01T11:08:10Z', agent). +derived_from(rel(officePollSchedule,depends_on,pollCreation), agent_scan). +source_files(rel(officePollSchedule,depends_on,pollCreation), ['src/server/services/officePollSchedule.ts']). +source_hash(rel(officePollSchedule,depends_on,pollCreation), 'sha256:ea250028fedb9a81528356c0db5af4e3689daf87e335fe5f6d0b9c314837b514'). +source_file_hashes(rel(officePollSchedule,depends_on,pollCreation), ['sha256:ea250028fedb9a81528356c0db5af4e3689daf87e335fe5f6d0b9c314837b514']). +derivation_query(rel(officePollSchedule,depends_on,pollCreation), "What are the import dependencies between server modules?"). +derived_at(rel(officePollSchedule,depends_on,pollCreation), '2026-07-01T12:01:04Z', agent). +derived_from(rel(poll,depends_on,pollCreation), agent_scan). +source_files(rel(poll,depends_on,pollCreation), ['src/server/services/poll.ts']). +source_hash(rel(poll,depends_on,pollCreation), 'sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318'). +source_file_hashes(rel(poll,depends_on,pollCreation), ['sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318']). +derivation_query(rel(poll,depends_on,pollCreation), "What are the import dependencies between server modules?"). +derived_at(rel(poll,depends_on,pollCreation), '2026-07-01T12:01:06Z', agent). +derived_from(rel(poll,depends_on,officeLocation), agent_scan). +source_files(rel(poll,depends_on,officeLocation), ['src/server/services/poll.ts']). +source_hash(rel(poll,depends_on,officeLocation), 'sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318'). +source_file_hashes(rel(poll,depends_on,officeLocation), ['sha256:3a3739224796c9850b4fb35b1f5348485a2bb4ebcb6ff44b005e46d0431fa318']). +derivation_query(rel(poll,depends_on,officeLocation), "What are the import dependencies between server modules?"). +derived_at(rel(poll,depends_on,officeLocation), '2026-07-01T12:01:08Z', agent). +derived_from(rel(sse,depends_on,pollCreation), agent_scan). +source_files(rel(sse,depends_on,pollCreation), ['src/server/sse.ts']). +source_hash(rel(sse,depends_on,pollCreation), 'sha256:642ae7d389f05e1f5f7791fe787b799b4c64a6af88e4cfc26a1b8ca670a98348'). +source_file_hashes(rel(sse,depends_on,pollCreation), ['sha256:642ae7d389f05e1f5f7791fe787b799b4c64a6af88e4cfc26a1b8ca670a98348']). +derivation_query(rel(sse,depends_on,pollCreation), "What are the import dependencies between server modules?"). +derived_at(rel(sse,depends_on,pollCreation), '2026-07-01T12:01:09Z', agent). diff --git a/.faim/derived/structure.pl b/.faim/derived/structure.pl index 3d1971c..183c5f3 100644 --- a/.faim/derived/structure.pl +++ b/.faim/derived/structure.pl @@ -16,7 +16,6 @@ entity(db,module). entity(lib_types,module). entity(routeUtils,module). -entity(authIdentity,module). entity(recommenderAdmin,route). rel(mealRecommendation,depends_on,db). rel(mealRecommendation,depends_on,mealRecommendationAi). @@ -104,3 +103,202 @@ entity(faim,tool). entity(faim,tool). prop(faim,version,'0.4.0'). +entity(authAccess,service). +entity(authAudit,service). +entity(authAvatar,service). +entity(authSession,service). +entity(dbConnectivity,service). +entity(displayName,service). +entity(entraOidc,service). +entity(foodSelection,service). +entity(localAuth,service). +entity(localLoginProtection,service). +entity(mealAnticipatedLikes,service). +entity(mealRecommendationExplore,service). +entity(mealRecommendationModelXlearn,service). +entity(mealRecommendationPreVote,service). +entity(menu,service). +entity(notificationEmail,service). +entity(officeContext,service). +entity(officeLocation,service). +entity(officePollSchedule,service). +entity(poll,service). +entity(seededRng,service). +entity(shoppingList,service). +entity(userMenuDefaults,service). +entity(sse,module). +entity(auth_route,route). +entity(authIdentity,route). +entity(foodSelections_route,route). +entity(menus_route,route). +entity(polls_route,route). +entity(shoppingList_route,route). +entity(userPreferences_route,route). +rel(entraOidc,depends_on,routeUtils). +rel(localLoginProtection,depends_on,routeUtils). +rel(displayName,depends_on,routeUtils). +rel(dbConnectivity,depends_on,db). +rel(localAuth,depends_on,db). +rel(localAuth,depends_on,routeUtils). +rel(foodSelection,depends_on,db). +rel(foodSelection,depends_on,sse). +rel(foodSelection,depends_on,lib_types). +rel(foodSelection,depends_on,notificationEmail). +rel(foodSelection,depends_on,officeLocation). +rel(authAudit,depends_on,db). +rel(authAudit,depends_on,localAuth). +rel(authAccess,depends_on,db). +rel(authAccess,depends_on,routeUtils). +rel(authAccess,depends_on,localAuth). +rel(authAccess,depends_on,notificationEmail). +rel(authAccess,depends_on,officeLocation). +rel(authAccess,depends_on,displayName). +rel(authAccess,depends_on,authAudit). +rel(mealItemIdentity,depends_on,db). +rel(mealItemIdentity,depends_on,routeUtils). +rel(mealRecommendation,depends_on,db). +rel(mealRecommendation,depends_on,routeUtils). +rel(mealRecommendation,depends_on,lib_types). +rel(mealRecommendation,depends_on,mealRecommendationAi). +rel(mealRecommendation,depends_on,mealFeatures). +rel(mealRecommendation,depends_on,mealRecommendationModel). +rel(mealRecommendation,depends_on,mealItemIdentity). +rel(mealRecommendation,depends_on,userPreferences). +rel(mealRecommendationAi,depends_on,lib_types). +rel(mealRecommendationEval,depends_on,db). +rel(mealRecommendationEval,depends_on,routeUtils). +rel(mealRecommendationEval,depends_on,mealFeatures). +rel(mealRecommendationEval,depends_on,mealRecommendationModel). +rel(mealRecommendationEval,depends_on,lib_types). +rel(mealRecommendationExplore,depends_on,db). +rel(mealRecommendationExplore,depends_on,lib_types). +rel(mealRecommendationExplore,depends_on,seededRng). +rel(mealRecommendationExplore,depends_on,mealFeatures). +rel(mealRecommendationExplore,depends_on,mealRecommendation). +rel(mealRecommendationExplore,depends_on,userPreferences). +rel(mealRecommendationModel,depends_on,db). +rel(mealRecommendationModel,depends_on,routeUtils). +rel(mealRecommendationModel,depends_on,seededRng). +rel(mealRecommendationModel,depends_on,mealFeatures). +rel(mealRecommendationModel,depends_on,mealItemIdentity). +rel(mealRecommendationModel,depends_on,lib_types). +rel(mealRecommendationModelXlearn,depends_on,mealRecommendationModel). +rel(mealRecommendationPreVote,depends_on,db). +rel(mealRecommendationPreVote,depends_on,routeUtils). +rel(mealRecommendationPreVote,depends_on,lib_types). +rel(mealRecommendationPreVote,depends_on,mealRecommendation). +rel(mealRecommendationPreVote,depends_on,mealFeatures). +rel(mealRecommendationPreVote,depends_on,mealRecommendationModel). +rel(mealRecommendationPreVote,depends_on,mealItemIdentity). +rel(mealAnticipatedLikes,depends_on,db). +rel(mealAnticipatedLikes,depends_on,routeUtils). +rel(mealAnticipatedLikes,depends_on,mealFeatures). +rel(mealAnticipatedLikes,depends_on,mealItemIdentity). +rel(mealAnticipatedLikes,depends_on,lib_types). +rel(mealFeatures,depends_on,db). +rel(menu,depends_on,db). +rel(menu,depends_on,sse). +rel(menu,depends_on,officeLocation). +rel(menu,depends_on,mealItemIdentity). +rel(menu,depends_on,mealFeatures). +rel(menu,depends_on,mealRecommendationAi). +rel(menu,depends_on,lib_types). +rel(officeLocation,depends_on,db). +rel(officeLocation,depends_on,routeUtils). +rel(officeLocation,depends_on,lib_types). +rel(officeContext,depends_on,authSession). +rel(officeContext,depends_on,authAccess). +rel(officeContext,depends_on,officeLocation). +rel(officeContext,depends_on,routeUtils). +rel(officePollSchedule,depends_on,db). +rel(officePollSchedule,depends_on,officeLocation). +rel(officePollSchedule,depends_on,lib_types). +rel(officeRecommenderSettings,depends_on,db). +rel(officeRecommenderSettings,depends_on,routeUtils). +rel(officeRecommenderSettings,depends_on,lib_types). +rel(officeRecommenderSettings,depends_on,mealRecommendationModel). +rel(poll,depends_on,db). +rel(poll,depends_on,sse). +rel(poll,depends_on,lib_types). +rel(poll,depends_on,authAccess). +rel(poll,depends_on,notificationEmail). +rel(poll,depends_on,officeLocation). +rel(shoppingList,depends_on,db). +rel(shoppingList,depends_on,sse). +rel(shoppingList,depends_on,lib_types). +rel(shoppingList,depends_on,officeLocation). +rel(userPreferences,depends_on,db). +rel(userPreferences,depends_on,lib_types). +rel(userMenuDefaults,depends_on,db). +rel(userMenuDefaults,depends_on,lib_types). +rel(sse,depends_on,db). +rel(sse,depends_on,lib_types). +rel(sse,depends_on,officeLocation). +rel(auth_route,depends_on,lib_types). +rel(auth_route,depends_on,routeUtils). +rel(auth_route,depends_on,authSession). +rel(auth_route,depends_on,localAuth). +rel(auth_route,depends_on,entraOidc). +rel(auth_route,depends_on,localLoginProtection). +rel(auth_route,depends_on,authAccess). +rel(auth_route,depends_on,sse). +rel(auth_route,depends_on,officeLocation). +rel(auth_route,depends_on,authAudit). +rel(auth_route,depends_on,authAvatar). +rel(auth_route,depends_on,dbConnectivity). +rel(authIdentity,depends_on,authSession). +rel(authIdentity,depends_on,authAccess). +rel(authIdentity,depends_on,localAuth). +rel(authIdentity,depends_on,routeUtils). +rel(recommenderAdmin,depends_on,routeUtils). +rel(recommenderAdmin,depends_on,authIdentity). +rel(recommenderAdmin,depends_on,mealRecommendationEval). +rel(recommenderAdmin,depends_on,officeRecommenderSettings). +rel(recommenderAdmin,depends_on,mealRecommendationModel). +rel(recommenderAdmin,depends_on,lib_types). +rel(userPreferences_route,depends_on,routeUtils). +rel(userPreferences_route,depends_on,userPreferences). +rel(userPreferences_route,depends_on,userMenuDefaults). +rel(userPreferences_route,depends_on,authIdentity). +rel(userPreferences_route,depends_on,lib_types). +rel(menus_route,depends_on,menu). +rel(menus_route,depends_on,routeUtils). +rel(menus_route,depends_on,officeContext). +rel(menus_route,depends_on,authIdentity). +rel(menus_route,depends_on,lib_types). +rel(polls_route,depends_on,poll). +rel(polls_route,depends_on,db). +rel(polls_route,depends_on,routeUtils). +rel(polls_route,depends_on,authSession). +rel(polls_route,depends_on,authAccess). +rel(polls_route,depends_on,officeContext). +rel(polls_route,depends_on,authIdentity). +rel(polls_route,depends_on,lib_types). +rel(shoppingList_route,depends_on,shoppingList). +rel(shoppingList_route,depends_on,routeUtils). +rel(shoppingList_route,depends_on,officeContext). +rel(shoppingList_route,depends_on,authIdentity). +rel(shoppingList_route,depends_on,lib_types). +rel(foodSelections_route,depends_on,foodSelection). +rel(foodSelections_route,depends_on,poll). +rel(foodSelections_route,depends_on,mealRecommendation). +rel(foodSelections_route,depends_on,mealRecommendationExplore). +rel(foodSelections_route,depends_on,mealRecommendationPreVote). +rel(foodSelections_route,depends_on,mealAnticipatedLikes). +rel(foodSelections_route,depends_on,db). +rel(foodSelections_route,depends_on,routeUtils). +rel(foodSelections_route,depends_on,authAccess). +rel(foodSelections_route,depends_on,officeContext). +rel(foodSelections_route,depends_on,authIdentity). +rel(foodSelections_route,depends_on,lib_types). +entity(pollCreation,service). +rel(pollCreation,depends_on,db). +rel(pollCreation,depends_on,officeLocation). +rel(pollCreation,depends_on,lib_types). +rel(poll,depends_on,pollCreation). +rel(officePollSchedule,depends_on,pollCreation). +rel(sse,depends_on,pollCreation). +rel(officePollSchedule,depends_on,pollCreation). +rel(poll,depends_on,pollCreation). +rel(poll,depends_on,officeLocation). +rel(sse,depends_on,pollCreation). diff --git a/.faim/reasoning/decouple.lp b/.faim/reasoning/decouple.lp new file mode 100644 index 0000000..8bb0ea3 --- /dev/null +++ b/.faim/reasoning/decouple.lp @@ -0,0 +1,45 @@ +% Find minimal dependency cuts to lower a target entity to a given max layer. +% faim-mode: optimize +% faim-description: find minimal cuts to lower a target entity below a layer threshold + +#const target = officePollSchedule. +#const max_layer = 4. +#const nlayers = 6. + +target_entity(X) :- entity(X, service). +target_entity(X) :- entity(X, route). +target_entity(X) :- entity(X, module). + +dep(X,Y) :- rel(X, depends_on, Y), target_entity(X), target_entity(Y). +layer(1..nlayers). + +% --- Allow cutting deps only in target's transitive cone --- +reachable_from_target(target). +reachable_from_target(Y) :- reachable_from_target(X), dep(X, Y). +cuttable(X,Y) :- dep(X,Y), reachable_from_target(X). +{ cut(X,Y) } :- cuttable(X,Y). +active_dep(X,Y) :- dep(X,Y), not cut(X,Y). + +% --- Pin leaves to layer 1 --- +leaf(X) :- target_entity(X), not dep(X, _). +assign(X, 1) :- leaf(X). + +% --- Free entities get one layer --- +pinned(X) :- leaf(X). +1 { assign(X,L) : layer(L) } 1 :- target_entity(X), not pinned(X). + +% --- Strict ordering on active deps only --- +:- active_dep(X,Y), assign(X,LX), assign(Y,LY), LX <= LY. + +% --- The goal --- +:- assign(target, L), L > max_layer. + +% --- Symmetry breaking --- +used(L) :- assign(_, L). +:- layer(L), L > 1, not used(L-1), used(L). + +% --- Minimize cuts only --- +#minimize { 1,X,Y : cut(X,Y) }. + +#show cut/2. +#show assign(target, L) : assign(target, L). diff --git a/.faim/reasoning/layer_all.lp b/.faim/reasoning/layer_all.lp new file mode 100644 index 0000000..8ba853b --- /dev/null +++ b/.faim/reasoning/layer_all.lp @@ -0,0 +1,42 @@ +% Layer assignment across all code entities (service + route + module). +% faim-mode: optimize +% faim-description: assign all code entities to layers with fewest upward dependencies + +#const nlayers = 5. + +target(X) :- entity(X, service). +target(X) :- entity(X, route). +target(X) :- entity(X, module). +dep(X,Y) :- rel(X, depends_on, Y), target(X), target(Y). + +leaf(X) :- target(X), not dep(X, _). +route_dep_target(Y) :- entity(X, route), dep(X, Y), entity(Y, route). +top_route(X) :- entity(X, route), not route_dep_target(X). + +pinned(X) :- leaf(X). +pinned(X) :- top_route(X). +free(X) :- target(X), not pinned(X). + +layer(1..nlayers). + +% --- Pin leaves to layer 1, leaf routes to top --- +assign(X, 1) :- leaf(X), not entity(X, route). +assign(X, 1) :- leaf(X), route_dep_target(X). +assign(X, nlayers) :- top_route(X). + +% --- Free entities get one layer --- +1 { assign(X,L) : layer(L) } 1 :- free(X). + +% --- Strict ordering: if X depends on Y, X must be above Y --- +:- dep(X,Y), assign(X,LX), assign(Y,LY), LX <= LY. + +% --- Symmetry breaking: layers used in order --- +:- layer(L), L > 1, not used(L-1), used(L). +used(L) :- assign(_, L). + +upward_dep(X,Y) :- dep(X,Y), assign(X,LX), assign(Y,LY), LX < LY. + +#minimize { 1@1,X,Y : upward_dep(X,Y) }. + +#show assign/2. +#show upward_dep/2. diff --git a/src/server/services/officePollSchedule.ts b/src/server/services/officePollSchedule.ts index 536df94..90ed2fa 100644 --- a/src/server/services/officePollSchedule.ts +++ b/src/server/services/officePollSchedule.ts @@ -1,6 +1,6 @@ import prisma from '../db.js'; import { listOfficeLocations } from './officeLocation.js'; -import { startPoll } from './poll.js'; +import { announcePollStarted, createPollRecord } from './pollCreation.js'; import type { OfficeLocation, OfficeWeekday } from '../../lib/types.js'; const AUTO_POLL_DESCRIPTION = 'Scheduled lunch poll'; @@ -110,13 +110,14 @@ export async function runOfficePollScheduleCheck(now = new Date()): Promise>(); -const pollInclude = { votes: true, excludedMenus: true } as const; - -export function getActiveTimers(): Map> { - return activeTimers; -} - -function scheduleTimer(pollId: string, endsAt: Date): void { - clearTimer(pollId); - const delay = endsAt.getTime() - Date.now(); - if (delay <= 0) { - // Already expired — run immediately - void endPoll(pollId); - return; - } - const timer = setTimeout(() => { - activeTimers.delete(pollId); - void endPoll(pollId); - }, delay); - // Unref so the timer doesn't keep the process alive in tests - if (typeof timer === 'object' && 'unref' in timer) { - timer.unref(); - } - activeTimers.set(pollId, timer); -} - -export function clearTimer(pollId: string): void { - const existing = activeTimers.get(pollId); - if (existing) { - clearTimeout(existing); - activeTimers.delete(pollId); - } -} - -export function clearAllTimers(): void { - for (const [id, timer] of activeTimers) { - clearTimeout(timer); - activeTimers.delete(id); - } -} - -// ─── Validation helpers ──────────────────────────────────── - -function validateDuration(durationMinutes: number): void { - if ( - !Number.isInteger(durationMinutes) || - durationMinutes < 5 || - durationMinutes > 720 || - durationMinutes % 5 !== 0 - ) { - throw Object.assign( - new Error('Duration must be a multiple of 5 between 5 and 720 minutes'), - { statusCode: 400 }, - ); - } -} + pollInclude, + formatPoll, + validateDuration, + normalizeCreatorKey, + resolvePollOfficeLocationId, + ensureNoPollInProgress, + validateAndNormalizeExcludedMenus, + scheduleTimer, + clearTimer, + clearAllTimers, + getActiveTimers, + createPollRecord, + registerPollExpiryHandler, + registerPollStartedHandler, + announcePollStarted, +} from './pollCreation.js'; + +export { clearTimer, clearAllTimers, getActiveTimers, formatPoll }; + +// ─── Validation helpers (poll.ts-only) ──────────────────── function validateExtension(extensionMinutes: number): void { const allowed = [5, 10, 15, 30]; @@ -112,11 +70,6 @@ function resolveVoteIdentity(label: string, actor?: VoteActor): { return { actorKey, actorEmail, displayNameSnapshot }; } -function normalizeCreatorKey(createdBy?: string | null): string | null { - const normalized = createdBy?.trim().toLowerCase() ?? ''; - return normalized.length > 0 ? normalized : null; -} - function parseGlobalAutoStartFoodSelectionMinutesFallback(): number { const raw = (process.env.DEFAULT_FOOD_SELECTION_DURATION_MINUTES ?? '').trim(); if (!raw) { @@ -167,13 +120,6 @@ type PollWithVotes = Awaited> & excludedMenus: Awaited>; }; -async function resolvePollOfficeLocationId(officeLocationId?: string): Promise { - if (officeLocationId?.trim()) { - return (await validateOfficeLocationId(officeLocationId)).id; - } - return (await ensureDefaultOfficeLocation()).id; -} - async function fetchPollOrThrow(pollId: string, officeLocationId?: string): Promise { const resolvedOfficeLocationId = officeLocationId ? await resolvePollOfficeLocationId(officeLocationId) @@ -200,80 +146,6 @@ function requireActive(poll: PollWithVotes): void { } } -type ExcludedMenuInput = Array<{ menuId: string; reason: string }> | undefined; - -async function validateAndNormalizeExcludedMenus( - excludedMenuJustifications: ExcludedMenuInput, - officeLocationId?: string, -): Promise> { - const resolvedOfficeLocationId = await resolvePollOfficeLocationId(officeLocationId); - const availableMenus = await prisma.menu.findMany({ - where: { officeLocationId: resolvedOfficeLocationId }, - select: { id: true, name: true }, - }); - - const byId = new Map( - availableMenus.map((menu: { id: string; name: string }) => [menu.id, menu.name]), - ); - const rows = excludedMenuJustifications ?? []; - const seen = new Set(); - const normalized: Array<{ menuId: string; menuName: string; reason: string }> = []; - - for (const row of rows) { - const menuId = row.menuId; - const reason = row.reason.trim(); - - if (!menuId || !byId.has(menuId)) { - throw Object.assign(new Error('Excluded menu must be a valid poll option'), { statusCode: 400 }); - } - if (seen.has(menuId)) { - throw Object.assign(new Error('Duplicate excluded menu is not allowed'), { statusCode: 400 }); - } - if (!reason || reason.length > 240) { - throw Object.assign( - new Error('A justification of 1-240 characters is required for each excluded menu'), - { statusCode: 400 }, - ); - } - - seen.add(menuId); - normalized.push({ menuId, menuName: byId.get(menuId) as string, reason }); - } - - if (availableMenus.length > 0 && normalized.length >= availableMenus.length) { - throw Object.assign(new Error('At least one menu option must remain in the poll'), { - statusCode: 400, - }); - } - - return normalized; -} - -async function ensureNoPollInProgress(officeLocationId?: string): Promise { - const resolvedOfficeLocationId = await resolvePollOfficeLocationId(officeLocationId); - const existing = await prisma.poll.findFirst({ - where: { - officeLocationId: resolvedOfficeLocationId, - status: { in: ['active', 'tied'] }, - }, - }); - if (existing) { - throw Object.assign(new Error('A poll is already in progress'), { statusCode: 409 }); - } - - const ongoingDelivery = await prisma.foodSelection.findFirst({ - where: { - officeLocationId: resolvedOfficeLocationId, - status: { in: ['ordering', 'delivering', 'delivery_due'] }, - }, - }); - if (ongoingDelivery) { - throw Object.assign(new Error('Cannot start a new team lunch while an order is ongoing'), { - statusCode: 409, - }); - } -} - function countVotesPerMenu(votes: { menuId: string; menuName: string }[]): { voteCounts: Record; menuNames: Record; @@ -368,6 +240,17 @@ async function notifyRegisteredUsersAboutPollStart( } } +// ─── Register expiry handler ────────────────────────────── + +registerPollExpiryHandler((pollId: string) => { + void endPoll(pollId); +}); + +registerPollStartedHandler(async (poll: Poll, officeLocationId: string) => { + broadcast('poll_started', { poll }, officeLocationId); + await notifyRegisteredUsersAboutPollStart(poll, officeLocationId); +}); + // ─── Poll operations ─────────────────────────────────────── export async function startPoll( @@ -377,49 +260,17 @@ export async function startPoll( officeLocationId?: string, createdBy?: string | null, ): Promise { - const trimmed = description.trim(); - if (!trimmed || trimmed.length > 120) { - throw Object.assign(new Error('Description must be 1–120 characters'), { statusCode: 400 }); - } - - validateDuration(durationMinutes); - const resolvedOfficeLocationId = await resolvePollOfficeLocationId(officeLocationId); - await ensureNoPollInProgress(resolvedOfficeLocationId); - const normalizedExclusions = await validateAndNormalizeExcludedMenus( + const { poll, resolvedOfficeLocationId } = await createPollRecord( + description, + durationMinutes, excludedMenuJustifications, - resolvedOfficeLocationId, + officeLocationId, + createdBy, ); - const now = new Date(); - const endsAt = new Date(now.getTime() + durationMinutes * 60 * 1000); + await announcePollStarted(poll, resolvedOfficeLocationId); - const poll = await prisma.poll.create({ - data: { - officeLocationId: resolvedOfficeLocationId, - createdBy: normalizeCreatorKey(createdBy), - description: trimmed, - status: 'active', - startedAt: now, - endsAt, - excludedMenus: { - create: normalizedExclusions.map((entry) => ({ - menuId: entry.menuId, - menuName: entry.menuName, - reason: entry.reason, - })), - }, - }, - include: pollInclude, - }); - - const formatted = formatPoll(poll); - broadcast('poll_started', { poll: formatted }, resolvedOfficeLocationId); - await notifyRegisteredUsersAboutPollStart(formatted, resolvedOfficeLocationId); - - // Schedule expiry timer - scheduleTimer(poll.id, endsAt); - - return formatted; + return poll; } export async function castVote( @@ -834,4 +685,3 @@ export async function abortPoll( broadcast('poll_ended', { pollId, status: 'aborted' as const }, poll.officeLocationId); return formatted; } - diff --git a/src/server/services/pollCreation.ts b/src/server/services/pollCreation.ts new file mode 100644 index 0000000..33db3d0 --- /dev/null +++ b/src/server/services/pollCreation.ts @@ -0,0 +1,287 @@ +import prisma from '../db.js'; +import type { Poll, PollVote } from '../../lib/types.js'; +import { + ensureDefaultOfficeLocation, + validateOfficeLocationId, +} from './officeLocation.js'; + +export const pollInclude = { votes: true, excludedMenus: true } as const; + +// ponytail: late-bound callback so timer management stays in this low-layer module +let onPollExpired: (pollId: string) => void = () => {}; +let onPollStarted: (poll: Poll, officeLocationId: string) => void | Promise = () => {}; + +export function registerPollExpiryHandler(handler: (pollId: string) => void): void { + onPollExpired = handler; +} + +export function registerPollStartedHandler( + handler: (poll: Poll, officeLocationId: string) => void | Promise, +): void { + onPollStarted = handler; +} + +export async function announcePollStarted(poll: Poll, officeLocationId: string): Promise { + await onPollStarted(poll, officeLocationId); +} + +// ─── Timer management ────────────────────────────────────── + +const activeTimers = new Map>(); + +export function getActiveTimers(): Map> { + return activeTimers; +} + +export function scheduleTimer(pollId: string, endsAt: Date): void { + clearTimer(pollId); + const delay = endsAt.getTime() - Date.now(); + if (delay <= 0) { + onPollExpired(pollId); + return; + } + const timer = setTimeout(() => { + activeTimers.delete(pollId); + onPollExpired(pollId); + }, delay); + if (typeof timer === 'object' && 'unref' in timer) { + timer.unref(); + } + activeTimers.set(pollId, timer); +} + +export function clearTimer(pollId: string): void { + const existing = activeTimers.get(pollId); + if (existing) { + clearTimeout(existing); + activeTimers.delete(pollId); + } +} + +export function clearAllTimers(): void { + for (const [, timer] of activeTimers) { + clearTimeout(timer); + } + activeTimers.clear(); +} + +// ─── Validation helpers ──────────────────────────────────── + +export function validateDuration(durationMinutes: number): void { + if ( + !Number.isInteger(durationMinutes) || + durationMinutes < 5 || + durationMinutes > 720 || + durationMinutes % 5 !== 0 + ) { + throw Object.assign( + new Error('Duration must be a multiple of 5 between 5 and 720 minutes'), + { statusCode: 400 }, + ); + } +} + +export function normalizeCreatorKey(createdBy?: string | null): string | null { + const normalized = createdBy?.trim().toLowerCase() ?? ''; + return normalized.length > 0 ? normalized : null; +} + +export async function resolvePollOfficeLocationId(officeLocationId?: string): Promise { + if (officeLocationId?.trim()) { + return (await validateOfficeLocationId(officeLocationId)).id; + } + return (await ensureDefaultOfficeLocation()).id; +} + +export async function ensureNoPollInProgress(officeLocationId?: string): Promise { + const resolvedOfficeLocationId = await resolvePollOfficeLocationId(officeLocationId); + const existing = await prisma.poll.findFirst({ + where: { + officeLocationId: resolvedOfficeLocationId, + status: { in: ['active', 'tied'] }, + }, + }); + if (existing) { + throw Object.assign(new Error('A poll is already in progress'), { statusCode: 409 }); + } + + const ongoingDelivery = await prisma.foodSelection.findFirst({ + where: { + officeLocationId: resolvedOfficeLocationId, + status: { in: ['ordering', 'delivering', 'delivery_due'] }, + }, + }); + if (ongoingDelivery) { + throw Object.assign(new Error('Cannot start a new team lunch while an order is ongoing'), { + statusCode: 409, + }); + } +} + +type ExcludedMenuInput = Array<{ menuId: string; reason: string }> | undefined; + +export async function validateAndNormalizeExcludedMenus( + excludedMenuJustifications: ExcludedMenuInput, + officeLocationId?: string, +): Promise> { + const resolvedOfficeLocationId = await resolvePollOfficeLocationId(officeLocationId); + const availableMenus = await prisma.menu.findMany({ + where: { officeLocationId: resolvedOfficeLocationId }, + select: { id: true, name: true }, + }); + + const byId = new Map( + availableMenus.map((menu: { id: string; name: string }) => [menu.id, menu.name]), + ); + const rows = excludedMenuJustifications ?? []; + const seen = new Set(); + const normalized: Array<{ menuId: string; menuName: string; reason: string }> = []; + + for (const row of rows) { + const menuId = row.menuId; + const reason = row.reason.trim(); + + if (!menuId || !byId.has(menuId)) { + throw Object.assign(new Error('Excluded menu must be a valid poll option'), { statusCode: 400 }); + } + if (seen.has(menuId)) { + throw Object.assign(new Error('Duplicate excluded menu is not allowed'), { statusCode: 400 }); + } + if (!reason || reason.length > 240) { + throw Object.assign( + new Error('A justification of 1-240 characters is required for each excluded menu'), + { statusCode: 400 }, + ); + } + + seen.add(menuId); + normalized.push({ menuId, menuName: byId.get(menuId) as string, reason }); + } + + if (availableMenus.length > 0 && normalized.length >= availableMenus.length) { + throw Object.assign(new Error('At least one menu option must remain in the poll'), { + statusCode: 400, + }); + } + + return normalized; +} + +// ─── Format helper ──────────────────────────────────────── + +export function formatPoll(poll: { + id: string; + createdBy: string | null; + description: string; + status: string; + startedAt: Date; + endsAt: Date; + endedPrematurely: boolean; + winnerMenuId: string | null; + winnerMenuName: string | null; + winnerSelectedRandomly: boolean; + createdAt: Date; + excludedMenus?: Array<{ + menuId: string; + menuName: string; + reason: string; + }>; + votes: Array<{ + id: string; + pollId: string; + menuId: string; + menuName: string; + nickname: string; + actorKey?: string | null; + actorEmail?: string | null; + displayNameSnapshot?: string | null; + castAt: Date; + }>; +}): Poll { + const voteCounts: Record = {}; + for (const vote of poll.votes) { + voteCounts[vote.menuId] = (voteCounts[vote.menuId] || 0) + 1; + } + + return { + id: poll.id, + createdBy: poll.createdBy, + description: poll.description, + status: poll.status as Poll['status'], + startedAt: poll.startedAt.toISOString(), + endsAt: poll.endsAt.toISOString(), + endedPrematurely: poll.endedPrematurely, + winnerMenuId: poll.winnerMenuId, + winnerMenuName: poll.winnerMenuName, + winnerSelectedRandomly: poll.winnerSelectedRandomly, + createdAt: poll.createdAt.toISOString(), + excludedMenuJustifications: (poll.excludedMenus ?? []).map((entry) => ({ + menuId: entry.menuId, + menuName: entry.menuName, + reason: entry.reason, + })), + votes: poll.votes.map( + (v): PollVote => ({ + id: v.id, + pollId: v.pollId, + menuId: v.menuId, + menuName: v.menuName, + nickname: v.displayNameSnapshot ?? v.nickname, + actorKey: v.actorKey ?? null, + actorEmail: v.actorEmail ?? null, + displayNameSnapshot: v.displayNameSnapshot ?? v.nickname, + castAt: v.castAt.toISOString(), + }), + ), + voteCounts, + }; +} + +// ─── Poll creation (no SSE, no auth, no email) ─────────── + +export async function createPollRecord( + description: string, + durationMinutes: number, + excludedMenuJustifications?: Array<{ menuId: string; reason: string }>, + officeLocationId?: string, + createdBy?: string | null, +): Promise<{ poll: Poll; resolvedOfficeLocationId: string }> { + const trimmed = description.trim(); + if (!trimmed || trimmed.length > 120) { + throw Object.assign(new Error('Description must be 1–120 characters'), { statusCode: 400 }); + } + + validateDuration(durationMinutes); + const resolvedOfficeLocationId = await resolvePollOfficeLocationId(officeLocationId); + await ensureNoPollInProgress(resolvedOfficeLocationId); + const normalizedExclusions = await validateAndNormalizeExcludedMenus( + excludedMenuJustifications, + resolvedOfficeLocationId, + ); + + const now = new Date(); + const endsAt = new Date(now.getTime() + durationMinutes * 60 * 1000); + + const poll = await prisma.poll.create({ + data: { + officeLocationId: resolvedOfficeLocationId, + createdBy: normalizeCreatorKey(createdBy), + description: trimmed, + status: 'active', + startedAt: now, + endsAt, + excludedMenus: { + create: normalizedExclusions.map((entry) => ({ + menuId: entry.menuId, + menuName: entry.menuName, + reason: entry.reason, + })), + }, + }, + include: pollInclude, + }); + + scheduleTimer(poll.id, endsAt); + + return { poll: formatPoll(poll), resolvedOfficeLocationId }; +} diff --git a/src/server/sse.ts b/src/server/sse.ts index 4a936b0..2a75ac6 100644 --- a/src/server/sse.ts +++ b/src/server/sse.ts @@ -1,7 +1,8 @@ import type { ServerResponse } from 'node:http'; import prisma from './db.js'; -import type { InitialStatePayload, Poll, PollVote, FoodSelection, FoodOrder } from '../lib/types.js'; +import type { InitialStatePayload, FoodSelection, FoodOrder } from '../lib/types.js'; import { getOfficeDefaultFoodSelectionDurationMinutes } from './services/officeLocation.js'; +import { formatPoll } from './services/pollCreation.js'; const clients = new Map(); @@ -47,74 +48,6 @@ export function getClientCount(): number { // ─── Helpers to format DB models into API shapes ─────────── -function formatPoll(poll: { - id: string; - createdBy: string | null; - description: string; - status: string; - startedAt: Date; - endsAt: Date; - endedPrematurely: boolean; - winnerMenuId: string | null; - winnerMenuName: string | null; - winnerSelectedRandomly: boolean; - createdAt: Date; - excludedMenus?: Array<{ - menuId: string; - menuName: string; - reason: string; - }>; - votes: Array<{ - id: string; - pollId: string; - menuId: string; - menuName: string; - nickname: string; - actorKey?: string | null; - actorEmail?: string | null; - displayNameSnapshot?: string | null; - castAt: Date; - }>; -}): Poll { - const voteCounts: Record = {}; - for (const vote of poll.votes) { - voteCounts[vote.menuId] = (voteCounts[vote.menuId] || 0) + 1; - } - - return { - id: poll.id, - createdBy: poll.createdBy, - description: poll.description, - status: poll.status as Poll['status'], - startedAt: poll.startedAt.toISOString(), - endsAt: poll.endsAt.toISOString(), - endedPrematurely: poll.endedPrematurely, - winnerMenuId: poll.winnerMenuId, - winnerMenuName: poll.winnerMenuName, - winnerSelectedRandomly: poll.winnerSelectedRandomly, - createdAt: poll.createdAt.toISOString(), - excludedMenuJustifications: (poll.excludedMenus ?? []).map((entry) => ({ - menuId: entry.menuId, - menuName: entry.menuName, - reason: entry.reason, - })), - votes: poll.votes.map( - (v): PollVote => ({ - id: v.id, - pollId: v.pollId, - menuId: v.menuId, - menuName: v.menuName, - nickname: v.displayNameSnapshot ?? v.nickname, - actorKey: v.actorKey ?? null, - actorEmail: v.actorEmail ?? null, - displayNameSnapshot: v.displayNameSnapshot ?? v.nickname, - castAt: v.castAt.toISOString(), - }), - ), - voteCounts, - }; -} - function formatFoodSelection(fs: { id: string; createdBy: string | null; @@ -262,3 +195,4 @@ export async function sendInitialState(res: ServerResponse, officeLocationId: st // Export formatters for reuse in services export { formatPoll, formatFoodSelection }; +// ponytail: formatPoll re-exported from pollCreation.ts for backwards compat with existing imports diff --git a/tests/server/auth-approval-gate.test.ts b/tests/server/auth-approval-gate.test.ts index 6e3f376..f795c4d 100644 --- a/tests/server/auth-approval-gate.test.ts +++ b/tests/server/auth-approval-gate.test.ts @@ -100,6 +100,20 @@ describe('auth approval gate', () => { iat: Math.floor(Date.now() / 1000), }); + // Give the user an active session first so the block takes the + // version-incrementing update path (rather than creating a fresh row at + // version 0, which would still match the pre-block cookie on a clean DB). + const preBlockSession = createSessionCookieValue({ + username: 'blocked@company.com', + method: 'entra', + iat: Math.floor(Date.now() / 1000), + }); + await app.inject({ + method: 'GET', + url: '/api/auth/config', + headers: { cookie: `team_lunch_auth_session=${preBlockSession}` }, + }); + await app.inject({ method: 'POST', url: '/api/auth/users/block', @@ -119,15 +133,18 @@ describe('auth approval gate', () => { headers: { cookie: `team_lunch_auth_session=${blockedSession}` }, }); + // Blocking bumps the user's session version, so the pre-block cookie is + // invalidated: the user is logged out but the config still surfaces the + // blocked state. expect(res.statusCode).toBe(200); expect(res.json()).toMatchObject({ auth: { - authenticated: true, + authenticated: false, approvalRequired: true, approved: false, blocked: true, isAdmin: false, - role: 'user', + role: null, accessibleOfficeLocations: [], }, }); diff --git a/tests/server/office-poll-schedule.test.ts b/tests/server/office-poll-schedule.test.ts index 624ae53..513cf9d 100644 --- a/tests/server/office-poll-schedule.test.ts +++ b/tests/server/office-poll-schedule.test.ts @@ -1,16 +1,23 @@ import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest'; +import { broadcast } from '../../src/server/sse.js'; import prisma from '../../src/server/db.js'; import { cleanDatabase, disconnectDatabase } from './helpers/db.js'; import { createOfficeLocation, updateOfficeLocationSettings, } from '../../src/server/services/officeLocation.js'; +import '../../src/server/services/poll.js'; import { runOfficePollScheduleCheck } from '../../src/server/services/officePollSchedule.js'; +vi.mock('../../src/server/sse.js', () => ({ + broadcast: vi.fn(), +})); + describe('office poll scheduler', () => { beforeEach(async () => { await cleanDatabase(); vi.restoreAllMocks(); + vi.clearAllMocks(); }); afterAll(async () => { @@ -38,6 +45,13 @@ describe('office poll scheduler', () => { expect(poll?.description).toBe('Scheduled lunch poll'); expect(poll?.createdBy).toBe(`office-scheduler:${office.id}:2026-03-11`); expect(Math.round((poll!.endsAt.getTime() - poll!.startedAt.getTime()) / 60_000)).toBe(50); + expect(broadcast).toHaveBeenCalledWith( + 'poll_started', + expect.objectContaining({ + poll: expect.objectContaining({ id: poll?.id }), + }), + office.id, + ); }); it('does not create a duplicate scheduled poll for the same office and date', async () => {