MCPcopy
hub / github.com/codeaashu/claude-code / useSkillImprovementSurvey

Function useSkillImprovementSurvey

src/hooks/useSkillImprovementSurvey.ts:21–105  ·  view source on GitHub ↗
(setMessages: SetMessages)

Source from the content-addressed store, hash-verified

19type SetMessages = (fn: (prev: Message[]) => Message[]) => void
20
21export function useSkillImprovementSurvey(setMessages: SetMessages): {
22 isOpen: boolean
23 suggestion: SkillImprovementSuggestion | null
24 handleSelect: (selected: FeedbackSurveyResponse) => void
25} {
26 const suggestion = useAppState(s => s.skillImprovement.suggestion)
27 const setAppState = useSetAppState()
28 const [isOpen, setIsOpen] = useState(false)
29 const lastSuggestionRef = useRef(suggestion)
30 const loggedAppearanceRef = useRef(false)
31
32 // Track the suggestion for display even after clearing AppState
33 if (suggestion) {
34 lastSuggestionRef.current = suggestion
35 }
36
37 // Open when a new suggestion arrives
38 if (suggestion && !isOpen) {
39 setIsOpen(true)
40 if (!loggedAppearanceRef.current) {
41 loggedAppearanceRef.current = true
42 logEvent('tengu_skill_improvement_survey', {
43 event_type:
44 'appeared' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
45 // _PROTO_skill_name routes to the privileged skill_name BQ column.
46 // Unredacted names don't go in additional_metadata.
47 _PROTO_skill_name: (suggestion.skillName ??
48 'unknown') as AnalyticsMetadata_I_VERIFIED_THIS_IS_PII_TAGGED,
49 })
50 }
51 }
52
53 const handleSelect = useCallback(
54 (selected: FeedbackSurveyResponse) => {
55 const current = lastSuggestionRef.current
56 if (!current) return
57
58 const applied = selected !== 'dismissed'
59
60 logEvent('tengu_skill_improvement_survey', {
61 event_type:
62 'responded' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
63 response: (applied
64 ? 'applied'
65 : 'dismissed') as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
66 // _PROTO_skill_name routes to the privileged skill_name BQ column.
67 // Unredacted names don't go in additional_metadata.
68 _PROTO_skill_name:
69 current.skillName as AnalyticsMetadata_I_VERIFIED_THIS_IS_PII_TAGGED,
70 })
71
72 if (applied) {
73 void applySkillImprovement(current.skillName, current.updates).then(
74 () => {
75 setMessages(prev => [
76 ...prev,
77 createSystemMessage(
78 `Skill "${current.skillName}" updated with improvements.`,

Callers 1

REPLFunction · 0.85

Calls 5

useAppStateFunction · 0.85
useSetAppStateFunction · 0.85
logEventFunction · 0.85
applySkillImprovementFunction · 0.85
createSystemMessageFunction · 0.85

Tested by

no test coverage detected