Coverage for integrations / agent_engine / onboarding_routes.py: 88.9%

45 statements  

« prev     ^ index     » next       coverage.py v7.14.0, created at 2026-05-12 04:49 +0000

1""" 

2Onboarding API Routes — "Light Your HART" ceremony endpoints. 

3 

4Provides REST endpoints for any frontend (web, mobile, GTK4) to drive 

5the onboarding state machine. 

6 

7 POST /api/onboarding/start — Start or resume a session 

8 POST /api/onboarding/advance — Advance to next phase 

9 GET /api/onboarding/status — Current phase for a user 

10 GET /api/onboarding/profile — Get sealed HART identity 

11""" 

12 

13import logging 

14 

15logger = logging.getLogger(__name__) 

16 

17 

18def register_onboarding_routes(app): 

19 """Register onboarding ceremony routes on a Flask app.""" 

20 

21 @app.route('/api/onboarding/start', methods=['POST']) 

22 def _onboarding_start(): 

23 from flask import request, jsonify 

24 from hart_onboarding import ( 

25 get_or_create_session, has_hart_name, get_hart_profile, 

26 CONVERSATION_SCRIPT, 

27 ) 

28 

29 data = request.get_json(silent=True) or {} 

30 user_id = data.get('user_id', '1') 

31 

32 # Already onboarded? 

33 if has_hart_name(user_id): 

34 profile = get_hart_profile(user_id) 

35 return jsonify({ 

36 'success': True, 

37 'already_onboarded': True, 

38 'profile': profile, 

39 }) 

40 

41 session = get_or_create_session(user_id) 

42 

43 # Return the language prompt in all languages 

44 return jsonify({ 

45 'success': True, 

46 'already_onboarded': False, 

47 'phase': session.phase, 

48 'language_prompt': CONVERSATION_SCRIPT['language_prompt'], 

49 }) 

50 

51 @app.route('/api/onboarding/advance', methods=['POST']) 

52 def _onboarding_advance(): 

53 from flask import request, jsonify 

54 from hart_onboarding import get_or_create_session, remove_session 

55 

56 data = request.get_json(silent=True) or {} 

57 user_id = data.get('user_id', '1') 

58 action = data.get('action') 

59 action_data = data.get('data', {}) 

60 

61 session = get_or_create_session(user_id) 

62 result = session.advance(action=action, data=action_data) 

63 

64 # Clean up completed sessions 

65 if result.get('sealed'): 

66 remove_session(user_id) 

67 

68 return jsonify({'success': True, **result}) 

69 

70 @app.route('/api/onboarding/status', methods=['GET']) 

71 def _onboarding_status(): 

72 from flask import request, jsonify 

73 from hart_onboarding import has_hart_name, get_hart_profile 

74 

75 user_id = request.args.get('user_id', '1') 

76 

77 if has_hart_name(user_id): 

78 return jsonify({ 

79 'success': True, 

80 'onboarded': True, 

81 'profile': get_hart_profile(user_id), 

82 }) 

83 

84 return jsonify({ 

85 'success': True, 

86 'onboarded': False, 

87 }) 

88 

89 @app.route('/api/onboarding/profile', methods=['GET']) 

90 def _onboarding_profile(): 

91 from flask import request, jsonify 

92 from hart_onboarding import get_hart_profile 

93 

94 user_id = request.args.get('user_id', '1') 

95 profile = get_hart_profile(user_id) 

96 

97 if profile: 

98 return jsonify({'success': True, 'profile': profile}) 

99 return jsonify({'success': False, 'error': 'Not onboarded'}), 404 

100 

101 logger.info("Registered HART onboarding API routes")