@burdenoff/microfe-buildmyiq 2026.725.1 → 2026.726.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/buildmyiq/components/TutorPanel.d.ts +17 -0
- package/dist/buildmyiq/components/TutorPanel.d.ts.map +1 -0
- package/dist/buildmyiq/components/TutorPanel.js +149 -0
- package/dist/buildmyiq/components/TutorPanel.js.map +1 -0
- package/dist/buildmyiq/components/index.d.ts +1 -0
- package/dist/buildmyiq/components/index.d.ts.map +1 -1
- package/dist/buildmyiq/components/index.js +1 -0
- package/dist/buildmyiq/hooks/useBuildmyiqApi.d.ts +16 -1
- package/dist/buildmyiq/hooks/useBuildmyiqApi.d.ts.map +1 -1
- package/dist/buildmyiq/hooks/useBuildmyiqApi.js +125 -91
- package/dist/buildmyiq/hooks/useBuildmyiqApi.js.map +1 -1
- package/dist/buildmyiq/pages/learning/LessonPlayerPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/learning/LessonPlayerPage.js +160 -153
- package/dist/buildmyiq/pages/learning/LessonPlayerPage.js.map +1 -1
- package/dist/buildmyiq/types/index.d.ts +31 -0
- package/dist/buildmyiq/types/index.d.ts.map +1 -1
- package/dist/buildmyiq/types/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TutorPanel — the 24/7 AI tutor chat for a lesson (BOFF-4426).
|
|
3
|
+
* @module buildmyiq/components/TutorPanel
|
|
4
|
+
*
|
|
5
|
+
* Grounded Q&A: every assistant answer comes from `buiTutorAsk`, which
|
|
6
|
+
* retrieves the actual lesson content server-side before calling the model
|
|
7
|
+
* (see `TutorService.retrieveGrounding` in wspace-buildmyiq-svc) — never an
|
|
8
|
+
* ungrounded chat completion. Continues the learner's own session for this
|
|
9
|
+
* lesson (multi-turn) via `useBuiMyTutorSessions` / `useBuiTutorAsk`.
|
|
10
|
+
*/
|
|
11
|
+
interface TutorPanelProps {
|
|
12
|
+
lessonId: string;
|
|
13
|
+
lessonTitle: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function TutorPanel({ lessonId, lessonTitle }: TutorPanelProps): import("react").JSX.Element;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=TutorPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TutorPanel.d.ts","sourceRoot":"","sources":["../../../src/buildmyiq/components/TutorPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAmBD,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,eAAe,+BA0IpE"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { useBuildmyiq as e } from "../context/BuildmyiqContext.js";
|
|
2
|
+
import "../context/index.js";
|
|
3
|
+
import { LoadingView as t } from "./StateViews.js";
|
|
4
|
+
import { useBuiMyTutorSessions as n, useBuiTutorAsk as r } from "../hooks/useBuildmyiqApi.js";
|
|
5
|
+
import "../hooks/index.js";
|
|
6
|
+
import { useEffect as i, useRef as a, useState as o } from "react";
|
|
7
|
+
import { Bot as s, Send as c, Sparkles as l } from "lucide-react";
|
|
8
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
9
|
+
import { Button as f, GlassCard as p, Textarea as m } from "@burdenoff/fe-libs/ui";
|
|
10
|
+
//#region src/buildmyiq/components/TutorPanel.tsx
|
|
11
|
+
function h(e) {
|
|
12
|
+
let t = e.trim();
|
|
13
|
+
return t ? t[0].toUpperCase() : "?";
|
|
14
|
+
}
|
|
15
|
+
var g = {
|
|
16
|
+
STRUGGLING: "Extra step-by-step help — based on your recent scores",
|
|
17
|
+
ON_TRACK: "Standard depth",
|
|
18
|
+
ADVANCED: "Deeper dive — based on your recent scores"
|
|
19
|
+
};
|
|
20
|
+
function _(e) {
|
|
21
|
+
if (!e) return "You";
|
|
22
|
+
let t = [e.firstName, e.lastName].filter(Boolean).join(" ").trim();
|
|
23
|
+
return e.name || t || e.username || e.email || "You";
|
|
24
|
+
}
|
|
25
|
+
function v({ lessonId: v, lessonTitle: y }) {
|
|
26
|
+
let { currentUser: b } = e(), x = n(v), S = r(), [C, w] = o(void 0), [T, E] = o(""), [D, O] = o(null), k = a(null), A = x.data?.[0], j = C ? x.data?.find((e) => e.id === C)?.messages ?? [] : A?.messages ?? [];
|
|
27
|
+
i(() => {
|
|
28
|
+
k.current?.scrollTo({
|
|
29
|
+
top: k.current.scrollHeight,
|
|
30
|
+
behavior: "smooth"
|
|
31
|
+
});
|
|
32
|
+
}, [j.length]);
|
|
33
|
+
let M = _(b), N = async () => {
|
|
34
|
+
let e = T.trim();
|
|
35
|
+
if (e) {
|
|
36
|
+
O(null), E("");
|
|
37
|
+
try {
|
|
38
|
+
w((await S.mutateAsync({
|
|
39
|
+
lessonId: v,
|
|
40
|
+
question: e,
|
|
41
|
+
sessionId: C ?? A?.id
|
|
42
|
+
})).session.id);
|
|
43
|
+
} catch (t) {
|
|
44
|
+
O(t instanceof Error ? t.message : "The AI tutor is temporarily unavailable."), E(e);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
return /* @__PURE__ */ d(p, {
|
|
49
|
+
treatment: "plain",
|
|
50
|
+
className: "flex flex-col overflow-hidden p-0",
|
|
51
|
+
children: [
|
|
52
|
+
/* @__PURE__ */ d("div", {
|
|
53
|
+
className: "flex items-center gap-2 border-b border-border-seam px-4 py-3",
|
|
54
|
+
children: [/* @__PURE__ */ u("span", {
|
|
55
|
+
className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-[var(--color-accent-soft)]",
|
|
56
|
+
children: /* @__PURE__ */ u(l, { className: "h-4 w-4 text-[var(--color-accent-teal)]" })
|
|
57
|
+
}), /* @__PURE__ */ d("div", {
|
|
58
|
+
className: "min-w-0",
|
|
59
|
+
children: [/* @__PURE__ */ u("p", {
|
|
60
|
+
className: "text-sm font-semibold text-text-primary",
|
|
61
|
+
children: "AI Tutor"
|
|
62
|
+
}), /* @__PURE__ */ d("p", {
|
|
63
|
+
className: "truncate text-xs text-text-secondary",
|
|
64
|
+
children: [
|
|
65
|
+
"Grounded in “",
|
|
66
|
+
y,
|
|
67
|
+
"”"
|
|
68
|
+
]
|
|
69
|
+
})]
|
|
70
|
+
})]
|
|
71
|
+
}),
|
|
72
|
+
/* @__PURE__ */ u("div", {
|
|
73
|
+
ref: k,
|
|
74
|
+
className: "max-h-96 min-h-40 flex-1 overflow-y-auto px-4 py-4",
|
|
75
|
+
children: x.isLoading ? /* @__PURE__ */ u(t, { label: "Loading your tutor conversation…" }) : j.length === 0 ? /* @__PURE__ */ d("div", {
|
|
76
|
+
className: "flex flex-col items-center gap-2 py-6 text-center",
|
|
77
|
+
children: [/* @__PURE__ */ u(s, { className: "h-8 w-8 text-text-tertiary" }), /* @__PURE__ */ u("p", {
|
|
78
|
+
className: "text-sm text-text-secondary",
|
|
79
|
+
children: "Ask a question about this lesson — the tutor answers from the lesson content, with hints first."
|
|
80
|
+
})]
|
|
81
|
+
}) : /* @__PURE__ */ d("ul", {
|
|
82
|
+
className: "flex flex-col gap-4",
|
|
83
|
+
children: [j.map((e) => {
|
|
84
|
+
let t = e.role === "ASSISTANT";
|
|
85
|
+
return /* @__PURE__ */ d("li", {
|
|
86
|
+
className: "flex gap-3",
|
|
87
|
+
children: [/* @__PURE__ */ u("div", {
|
|
88
|
+
className: t ? "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-[var(--color-accent-soft)]" : "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-bg-sunken text-sm font-semibold text-text-secondary",
|
|
89
|
+
children: t ? /* @__PURE__ */ u(s, { className: "h-4 w-4 text-[var(--color-accent-teal)]" }) : h(M)
|
|
90
|
+
}), /* @__PURE__ */ d("div", {
|
|
91
|
+
className: "min-w-0 flex-1",
|
|
92
|
+
children: [/* @__PURE__ */ d("div", {
|
|
93
|
+
className: "flex flex-wrap items-baseline gap-x-2",
|
|
94
|
+
children: [/* @__PURE__ */ u("span", {
|
|
95
|
+
className: "text-sm font-semibold text-text-primary",
|
|
96
|
+
children: t ? "AI Tutor" : M
|
|
97
|
+
}), t && e.adaptiveLevel && /* @__PURE__ */ u("span", {
|
|
98
|
+
className: "text-xs text-text-tertiary",
|
|
99
|
+
children: g[e.adaptiveLevel]
|
|
100
|
+
})]
|
|
101
|
+
}), /* @__PURE__ */ u("p", {
|
|
102
|
+
className: "mt-0.5 whitespace-pre-wrap break-words text-sm text-text-secondary",
|
|
103
|
+
children: e.content
|
|
104
|
+
})]
|
|
105
|
+
})]
|
|
106
|
+
}, e.id);
|
|
107
|
+
}), S.isPending && /* @__PURE__ */ d("li", {
|
|
108
|
+
className: "flex items-center gap-3",
|
|
109
|
+
children: [/* @__PURE__ */ u("span", {
|
|
110
|
+
className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-[var(--color-accent-soft)]",
|
|
111
|
+
children: /* @__PURE__ */ u(s, { className: "h-4 w-4 animate-pulse text-[var(--color-accent-teal)]" })
|
|
112
|
+
}), /* @__PURE__ */ u("span", {
|
|
113
|
+
className: "text-sm text-text-secondary",
|
|
114
|
+
children: "Thinking…"
|
|
115
|
+
})]
|
|
116
|
+
})]
|
|
117
|
+
})
|
|
118
|
+
}),
|
|
119
|
+
/* @__PURE__ */ d("div", {
|
|
120
|
+
className: "border-t border-border-seam p-3",
|
|
121
|
+
children: [/* @__PURE__ */ u(m, {
|
|
122
|
+
value: T,
|
|
123
|
+
onChange: (e) => E(e.target.value),
|
|
124
|
+
onKeyDown: (e) => {
|
|
125
|
+
e.key === "Enter" && !e.shiftKey && (e.preventDefault(), N());
|
|
126
|
+
},
|
|
127
|
+
placeholder: "Ask about this lesson…",
|
|
128
|
+
rows: 2,
|
|
129
|
+
disabled: S.isPending
|
|
130
|
+
}), /* @__PURE__ */ d("div", {
|
|
131
|
+
className: "mt-2 flex items-center justify-end gap-2",
|
|
132
|
+
children: [D && /* @__PURE__ */ u("span", {
|
|
133
|
+
className: "mr-auto text-xs text-status-error-text",
|
|
134
|
+
children: D
|
|
135
|
+
}), /* @__PURE__ */ d(f, {
|
|
136
|
+
size: "sm",
|
|
137
|
+
onClick: N,
|
|
138
|
+
disabled: !T.trim() || S.isPending,
|
|
139
|
+
children: [/* @__PURE__ */ u(c, { className: "mr-1.5 h-4 w-4" }), S.isPending ? "Asking…" : "Ask"]
|
|
140
|
+
})]
|
|
141
|
+
})]
|
|
142
|
+
})
|
|
143
|
+
]
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
//#endregion
|
|
147
|
+
export { v as TutorPanel };
|
|
148
|
+
|
|
149
|
+
//# sourceMappingURL=TutorPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TutorPanel.js","names":[],"sources":["../../../src/buildmyiq/components/TutorPanel.tsx"],"sourcesContent":["/**\n * TutorPanel — the 24/7 AI tutor chat for a lesson (BOFF-4426).\n * @module buildmyiq/components/TutorPanel\n *\n * Grounded Q&A: every assistant answer comes from `buiTutorAsk`, which\n * retrieves the actual lesson content server-side before calling the model\n * (see `TutorService.retrieveGrounding` in wspace-buildmyiq-svc) — never an\n * ungrounded chat completion. Continues the learner's own session for this\n * lesson (multi-turn) via `useBuiMyTutorSessions` / `useBuiTutorAsk`.\n */\n\nimport { useEffect, useRef, useState } from 'react';\nimport { Bot, Send, Sparkles } from 'lucide-react';\nimport { Button, GlassCard, Textarea } from '@burdenoff/fe-libs/ui';\nimport { LoadingView } from './StateViews';\nimport { useBuiMyTutorSessions, useBuiTutorAsk } from '../hooks';\nimport { useBuildmyiq } from '../context';\nimport type { BuiTutorAdaptiveLevel, BuiTutorMessage } from '../types';\n\ninterface TutorPanelProps {\n lessonId: string;\n lessonTitle: string;\n}\n\nfunction initialFor(label: string): string {\n const trimmed = label.trim();\n return trimmed ? trimmed[0]!.toUpperCase() : '?';\n}\n\nconst ADAPTIVE_LABEL: Record<BuiTutorAdaptiveLevel, string> = {\n STRUGGLING: 'Extra step-by-step help — based on your recent scores',\n ON_TRACK: 'Standard depth',\n ADVANCED: 'Deeper dive — based on your recent scores',\n};\n\nfunction displayName(user: ReturnType<typeof useBuildmyiq>['currentUser']): string {\n if (!user) return 'You';\n const full = [user.firstName, user.lastName].filter(Boolean).join(' ').trim();\n return user.name || full || user.username || user.email || 'You';\n}\n\nexport function TutorPanel({ lessonId, lessonTitle }: TutorPanelProps) {\n const { currentUser } = useBuildmyiq();\n const sessionsQuery = useBuiMyTutorSessions(lessonId);\n const ask = useBuiTutorAsk();\n\n const [sessionId, setSessionId] = useState<string | undefined>(undefined);\n const [draft, setDraft] = useState('');\n const [error, setError] = useState<string | null>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n\n // Resume the learner's most recently active session for this lesson, if any.\n const existingSession = sessionsQuery.data?.[0];\n const messages: BuiTutorMessage[] = sessionId\n ? (sessionsQuery.data?.find((s) => s.id === sessionId)?.messages ?? [])\n : (existingSession?.messages ?? []);\n\n useEffect(() => {\n scrollRef.current?.scrollTo({ top: scrollRef.current.scrollHeight, behavior: 'smooth' });\n }, [messages.length]);\n\n const selfName = displayName(currentUser);\n\n const handleAsk = async () => {\n const question = draft.trim();\n if (!question) return;\n setError(null);\n setDraft('');\n try {\n const result = await ask.mutateAsync({\n lessonId,\n question,\n sessionId: sessionId ?? existingSession?.id,\n });\n setSessionId(result.session.id);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'The AI tutor is temporarily unavailable.');\n setDraft(question);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n void handleAsk();\n }\n };\n\n return (\n <GlassCard treatment=\"plain\" className=\"flex flex-col overflow-hidden p-0\">\n <div className=\"flex items-center gap-2 border-b border-border-seam px-4 py-3\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-[var(--color-accent-soft)]\">\n <Sparkles className=\"h-4 w-4 text-[var(--color-accent-teal)]\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">AI Tutor</p>\n <p className=\"truncate text-xs text-text-secondary\">Grounded in “{lessonTitle}”</p>\n </div>\n </div>\n\n <div ref={scrollRef} className=\"max-h-96 min-h-40 flex-1 overflow-y-auto px-4 py-4\">\n {sessionsQuery.isLoading ? (\n <LoadingView label=\"Loading your tutor conversation…\" />\n ) : messages.length === 0 ? (\n <div className=\"flex flex-col items-center gap-2 py-6 text-center\">\n <Bot className=\"h-8 w-8 text-text-tertiary\" />\n <p className=\"text-sm text-text-secondary\">\n Ask a question about this lesson — the tutor answers from the lesson content, with\n hints first.\n </p>\n </div>\n ) : (\n <ul className=\"flex flex-col gap-4\">\n {messages.map((message) => {\n const isAssistant = message.role === 'ASSISTANT';\n return (\n <li key={message.id} className=\"flex gap-3\">\n <div\n className={\n isAssistant\n ? 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-[var(--color-accent-soft)]'\n : 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-bg-sunken text-sm font-semibold text-text-secondary'\n }\n >\n {isAssistant ? (\n <Bot className=\"h-4 w-4 text-[var(--color-accent-teal)]\" />\n ) : (\n initialFor(selfName)\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-baseline gap-x-2\">\n <span className=\"text-sm font-semibold text-text-primary\">\n {isAssistant ? 'AI Tutor' : selfName}\n </span>\n {isAssistant && message.adaptiveLevel && (\n <span className=\"text-xs text-text-tertiary\">\n {ADAPTIVE_LABEL[message.adaptiveLevel]}\n </span>\n )}\n </div>\n <p className=\"mt-0.5 whitespace-pre-wrap break-words text-sm text-text-secondary\">\n {message.content}\n </p>\n </div>\n </li>\n );\n })}\n {ask.isPending && (\n <li className=\"flex items-center gap-3\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-[var(--color-accent-soft)]\">\n <Bot className=\"h-4 w-4 animate-pulse text-[var(--color-accent-teal)]\" />\n </span>\n <span className=\"text-sm text-text-secondary\">Thinking…</span>\n </li>\n )}\n </ul>\n )}\n </div>\n\n <div className=\"border-t border-border-seam p-3\">\n <Textarea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Ask about this lesson…\"\n rows={2}\n disabled={ask.isPending}\n />\n <div className=\"mt-2 flex items-center justify-end gap-2\">\n {error && <span className=\"mr-auto text-xs text-status-error-text\">{error}</span>}\n <Button size=\"sm\" onClick={handleAsk} disabled={!draft.trim() || ask.isPending}>\n <Send className=\"mr-1.5 h-4 w-4\" />\n {ask.isPending ? 'Asking…' : 'Ask'}\n </Button>\n </div>\n </div>\n </GlassCard>\n );\n}\n"],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@ export { ProgressRing, Sparkline } from './Viz';
|
|
|
17
17
|
export { EvidenceUpload } from './EvidenceUpload';
|
|
18
18
|
export { FileLink } from './FileLink';
|
|
19
19
|
export { BuiDiscussion } from './BuiDiscussion';
|
|
20
|
+
export { TutorPanel } from './TutorPanel';
|
|
20
21
|
export { BuiTags } from './BuiTags';
|
|
21
22
|
export { BuiPermissionButton, type BuiPermissionButtonProps } from './BuiPermissionButton';
|
|
22
23
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/buildmyiq/components/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/buildmyiq/components/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BuiConnection, BuiCourse, BuiCourseLevel, BuiCourseStatus, BuiModule, BuiLesson, BuiAssessment, BuiAssessmentStatus, BuiQuestion, BuiSubmission, BuiSubmissionStatus, BuiEnrollment, BuiEnrollmentStatus, BuiCohort, BuiCohortStatus, BuiSkill, BuiSkillCategory, BuiCertificate, BuiLessonProgress, BuiCreateCourseInput, BuiUpdateCourseInput, BuiCreateModuleInput, BuiCreateLessonInput, BuiCreateAssessmentInput, BuiCreateQuestionInput, BuiCreateSkillInput, BuiCreateCohortInput, BuiEnrollInput, BuiRecordLessonProgressInput, BuiSubmitAssessmentInput, BuiGradeSubmissionInput, BuiIssueCertificateInput } from '../types';
|
|
1
|
+
import { BuiConnection, BuiCourse, BuiCourseLevel, BuiCourseStatus, BuiModule, BuiLesson, BuiAssessment, BuiAssessmentStatus, BuiQuestion, BuiSubmission, BuiSubmissionStatus, BuiEnrollment, BuiEnrollmentStatus, BuiCohort, BuiCohortStatus, BuiSkill, BuiSkillCategory, BuiCertificate, BuiLessonProgress, BuiCreateCourseInput, BuiUpdateCourseInput, BuiCreateModuleInput, BuiCreateLessonInput, BuiCreateAssessmentInput, BuiCreateQuestionInput, BuiCreateSkillInput, BuiCreateCohortInput, BuiEnrollInput, BuiRecordLessonProgressInput, BuiSubmitAssessmentInput, BuiGradeSubmissionInput, BuiIssueCertificateInput, BuiTutorAskInput, BuiTutorAskPayload, BuiTutorSession } from '../types';
|
|
2
2
|
|
|
3
3
|
export interface UseBuiCoursesArgs {
|
|
4
4
|
level?: BuiCourseLevel;
|
|
@@ -126,4 +126,19 @@ export declare const useBuiCreateSkill: () => import('@tanstack/react-query').Us
|
|
|
126
126
|
export declare const useBuiCertificates: (courseId?: string, learnerId?: string) => import('@tanstack/react-query').UseQueryResult<NoInfer<BuiCertificate[]>, Error>;
|
|
127
127
|
export declare const useBuiIssueCertificate: () => import('@tanstack/react-query').UseMutationResult<BuiCertificate, Error, BuiIssueCertificateInput, unknown>;
|
|
128
128
|
export declare const useBuiRevokeCertificate: () => import('@tanstack/react-query').UseMutationResult<BuiCertificate, Error, string, unknown>;
|
|
129
|
+
/**
|
|
130
|
+
* The calling learner's own tutor sessions for a lesson (Type-C self-scoped
|
|
131
|
+
* query — no `learnerId` arg on the wire; identity comes from the
|
|
132
|
+
* authenticated actor server-side). Sessions come back newest-first with
|
|
133
|
+
* their full message history, so the panel can restore an in-progress
|
|
134
|
+
* conversation on mount.
|
|
135
|
+
*/
|
|
136
|
+
export declare const useBuiMyTutorSessions: (lessonId: string | undefined) => import('@tanstack/react-query').UseQueryResult<NoInfer<BuiTutorSession[]>, Error>;
|
|
137
|
+
/**
|
|
138
|
+
* Ask the AI tutor a question about a lesson. Omit `sessionId` to start a
|
|
139
|
+
* new session for that lesson; pass the current session's id to continue
|
|
140
|
+
* the same conversation (multi-turn). Invalidates the lesson's tutor-session
|
|
141
|
+
* query so the panel picks up the new USER + ASSISTANT turns.
|
|
142
|
+
*/
|
|
143
|
+
export declare const useBuiTutorAsk: () => import('@tanstack/react-query').UseMutationResult<BuiTutorAskPayload, Error, BuiTutorAskInput, unknown>;
|
|
129
144
|
//# sourceMappingURL=useBuildmyiqApi.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBuildmyiqApi.d.ts","sourceRoot":"","sources":["../../../src/buildmyiq/hooks/useBuildmyiqApi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,cAAc,EACd,eAAe,EACf,SAAS,EACT,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EACnB,SAAS,EACT,eAAe,EACf,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,4BAA4B,EAC5B,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"useBuildmyiqApi.d.ts","sourceRoot":"","sources":["../../../src/buildmyiq/hooks/useBuildmyiqApi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,cAAc,EACd,eAAe,EACf,SAAS,EACT,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EACnB,SAAS,EACT,eAAe,EACf,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,4BAA4B,EAC5B,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,EACxB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EAEhB,MAAM,UAAU,CAAC;AAuOlB,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,aAAa,GAAI,OAAM,iBAAsB;;iBAoCT,SAAS,EAAE;iBACX,SAAS,EAAE;;;;;;;;;;;;;;;;;;;;;;UAM3D,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,IAAI,MAAM,GAAG,SAAS,qFAgBlD,CAAC;AAEF,eAAO,MAAM,kBAAkB,0GAgB9B,CAAC;AAEF,eAAO,MAAM,kBAAkB;QAII,MAAM;WAAS,oBAAoB;WAerE,CAAC;AAEF,eAAO,MAAM,mBAAmB,4FAmB/B,CAAC;AAEF,eAAO,MAAM,mBAAmB,0FAiB/B,CAAC;AAMF,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,GAAG,SAAS;;;;;;;;;;YAkBzD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,GAAG,SAAS,EAAE,WAAW,MAAM,gFAgB5E,CAAC;AAEF,eAAO,MAAM,kBAAkB,0GAmB9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,0GAoB9B,CAAC;AAMF,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,GAAG,SAAS,EAAE,SAAS,mBAAmB;eA8BzC,WAAW,EAAE;;;;;;;;;;;;;;YAI/D,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,IAAI,MAAM,GAAG,SAAS,yFAgBtD,CAAC;AAEF,eAAO,MAAM,sBAAsB,kHAgBlC,CAAC;AAEF,eAAO,MAAM,uBAAuB,gGAmBnC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB;QAID,MAAM;cAAY,MAAM;WAa1D,CAAC;AAEF,eAAO,MAAM,oBAAoB,8GAgBhC,CAAC;AAMF,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,iBAAiB,GAAI,OAAM,qBAA0B,iGAoBjE,CAAC;AAEF,kGAAkG;AAClG,eAAO,MAAM,gBAAgB,GAAI,IAAI,MAAM,GAAG,SAAS,yFAgBtD,CAAC;AAEF,eAAO,MAAM,sBAAsB,kHAgBlC,CAAC;AAEF,eAAO,MAAM,qBAAqB;QAIC,MAAM;WAAS,uBAAuB;WAYxE,CAAC;AAMF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,iBAAiB,GAAI,OAAM,qBAA0B,iGAoBjE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,IAAI,MAAM,GAAG,SAAS,yFAgBtD,CAAC;AAEF,eAAO,MAAM,YAAY,wGAgBxB,CAAC;AAEF,eAAO,MAAM,0BAA0B;QAIJ,MAAM;YAAU,mBAAmB;WAerE,CAAC;AAEF,eAAO,MAAM,0BAA0B,0HAmBtC,CAAC;AAMF,eAAO,MAAM,aAAa,GAAI,WAAW,MAAM,EAAE,SAAS,eAAe,gFAexE,CAAC;AAEF,eAAO,MAAM,kBAAkB,0GAgB9B,CAAC;AAMF,eAAO,MAAM,YAAY,GAAI,WAAW,gBAAgB,+EAevD,CAAC;AAEF,eAAO,MAAM,iBAAiB,wGAgB7B,CAAC;AAMF,eAAO,MAAM,kBAAkB,GAAI,WAAW,MAAM,EAAE,YAAY,MAAM,qFAevE,CAAC;AAEF,eAAO,MAAM,sBAAsB,mHAgBlC,CAAC;AAEF,eAAO,MAAM,uBAAuB,iGAgBnC,CAAC;AAMF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAAI,UAAU,MAAM,GAAG,SAAS,sFAgBjE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,+GAqB1B,CAAC"}
|