@vibe-hero/server 0.1.0
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/LICENSE +190 -0
- package/README.md +151 -0
- package/dist/catalog/bundled/claude-code/.gitkeep +0 -0
- package/dist/catalog/bundled/claude-code/context-management.yaml +302 -0
- package/dist/catalog/bundled/claude-code/planning.yaml +313 -0
- package/dist/catalog/bundled/claude-code/subagents.yaml +357 -0
- package/dist/catalog/bundled/general/.gitkeep +0 -0
- package/dist/catalog/bundled/general/_placeholder.yaml +39 -0
- package/dist/catalog/bundled/general/task-decomposition.yaml +390 -0
- package/dist/catalog/bundled/index.d.ts +39 -0
- package/dist/catalog/bundled/index.d.ts.map +1 -0
- package/dist/catalog/bundled/index.js +41 -0
- package/dist/catalog/bundled/index.js.map +1 -0
- package/dist/catalog/fetcher.d.ts +201 -0
- package/dist/catalog/fetcher.d.ts.map +1 -0
- package/dist/catalog/fetcher.js +452 -0
- package/dist/catalog/fetcher.js.map +1 -0
- package/dist/catalog/loader.d.ts +165 -0
- package/dist/catalog/loader.d.ts.map +1 -0
- package/dist/catalog/loader.js +241 -0
- package/dist/catalog/loader.js.map +1 -0
- package/dist/catalog/resolve.d.ts +85 -0
- package/dist/catalog/resolve.d.ts.map +1 -0
- package/dist/catalog/resolve.js +103 -0
- package/dist/catalog/resolve.js.map +1 -0
- package/dist/cli/getOffer.d.ts +38 -0
- package/dist/cli/getOffer.d.ts.map +1 -0
- package/dist/cli/getOffer.js +150 -0
- package/dist/cli/getOffer.js.map +1 -0
- package/dist/cli/index.d.ts +46 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +88 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config.d.ts +34 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +63 -0
- package/dist/config.js.map +1 -0
- package/dist/engine/elo.d.ts +76 -0
- package/dist/engine/elo.d.ts.map +1 -0
- package/dist/engine/elo.js +79 -0
- package/dist/engine/elo.js.map +1 -0
- package/dist/engine/graduation.d.ts +108 -0
- package/dist/engine/graduation.d.ts.map +1 -0
- package/dist/engine/graduation.js +161 -0
- package/dist/engine/graduation.js.map +1 -0
- package/dist/engine/lapse.d.ts +80 -0
- package/dist/engine/lapse.d.ts.map +1 -0
- package/dist/engine/lapse.js +125 -0
- package/dist/engine/lapse.js.map +1 -0
- package/dist/engine/selection.d.ts +84 -0
- package/dist/engine/selection.d.ts.map +1 -0
- package/dist/engine/selection.js +119 -0
- package/dist/engine/selection.js.map +1 -0
- package/dist/grading/deterministic.d.ts +102 -0
- package/dist/grading/deterministic.d.ts.map +1 -0
- package/dist/grading/deterministic.js +118 -0
- package/dist/grading/deterministic.js.map +1 -0
- package/dist/grading/freeform.d.ts +64 -0
- package/dist/grading/freeform.d.ts.map +1 -0
- package/dist/grading/freeform.js +85 -0
- package/dist/grading/freeform.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/observation/hookEvents.d.ts +113 -0
- package/dist/observation/hookEvents.d.ts.map +1 -0
- package/dist/observation/hookEvents.js +170 -0
- package/dist/observation/hookEvents.js.map +1 -0
- package/dist/observation/offers.d.ts +215 -0
- package/dist/observation/offers.d.ts.map +1 -0
- package/dist/observation/offers.js +327 -0
- package/dist/observation/offers.js.map +1 -0
- package/dist/observation/source.d.ts +133 -0
- package/dist/observation/source.d.ts.map +1 -0
- package/dist/observation/source.js +105 -0
- package/dist/observation/source.js.map +1 -0
- package/dist/profile/migrate.d.ts +122 -0
- package/dist/profile/migrate.d.ts.map +1 -0
- package/dist/profile/migrate.js +147 -0
- package/dist/profile/migrate.js.map +1 -0
- package/dist/profile/store.d.ts +84 -0
- package/dist/profile/store.d.ts.map +1 -0
- package/dist/profile/store.js +267 -0
- package/dist/profile/store.js.map +1 -0
- package/dist/schemas/common.d.ts +95 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +106 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/content.d.ts +828 -0
- package/dist/schemas/content.d.ts.map +1 -0
- package/dist/schemas/content.js +219 -0
- package/dist/schemas/content.js.map +1 -0
- package/dist/schemas/profile.d.ts +599 -0
- package/dist/schemas/profile.d.ts.map +1 -0
- package/dist/schemas/profile.js +177 -0
- package/dist/schemas/profile.js.map +1 -0
- package/dist/schemas/tools.d.ts +1581 -0
- package/dist/schemas/tools.d.ts.map +1 -0
- package/dist/schemas/tools.js +286 -0
- package/dist/schemas/tools.js.map +1 -0
- package/dist/tools/config.d.ts +51 -0
- package/dist/tools/config.d.ts.map +1 -0
- package/dist/tools/config.js +104 -0
- package/dist/tools/config.js.map +1 -0
- package/dist/tools/gate.d.ts +50 -0
- package/dist/tools/gate.d.ts.map +1 -0
- package/dist/tools/gate.js +67 -0
- package/dist/tools/gate.js.map +1 -0
- package/dist/tools/guidance.d.ts +36 -0
- package/dist/tools/guidance.d.ts.map +1 -0
- package/dist/tools/guidance.js +117 -0
- package/dist/tools/guidance.js.map +1 -0
- package/dist/tools/listTopics.d.ts +55 -0
- package/dist/tools/listTopics.d.ts.map +1 -0
- package/dist/tools/listTopics.js +78 -0
- package/dist/tools/listTopics.js.map +1 -0
- package/dist/tools/offers.d.ts +60 -0
- package/dist/tools/offers.d.ts.map +1 -0
- package/dist/tools/offers.js +152 -0
- package/dist/tools/offers.js.map +1 -0
- package/dist/tools/placeholders.d.ts +27 -0
- package/dist/tools/placeholders.d.ts.map +1 -0
- package/dist/tools/placeholders.js +49 -0
- package/dist/tools/placeholders.js.map +1 -0
- package/dist/tools/recordObservation.d.ts +52 -0
- package/dist/tools/recordObservation.d.ts.map +1 -0
- package/dist/tools/recordObservation.js +87 -0
- package/dist/tools/recordObservation.js.map +1 -0
- package/dist/tools/startQuiz.d.ts +82 -0
- package/dist/tools/startQuiz.d.ts.map +1 -0
- package/dist/tools/startQuiz.js +180 -0
- package/dist/tools/startQuiz.js.map +1 -0
- package/dist/tools/status.d.ts +59 -0
- package/dist/tools/status.d.ts.map +1 -0
- package/dist/tools/status.js +133 -0
- package/dist/tools/status.js.map +1 -0
- package/dist/tools/submitAnswer.d.ts +156 -0
- package/dist/tools/submitAnswer.d.ts.map +1 -0
- package/dist/tools/submitAnswer.js +402 -0
- package/dist/tools/submitAnswer.js.map +1 -0
- package/dist/tools/types.d.ts +82 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +48 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/us2/standing.d.ts +111 -0
- package/dist/tools/us2/standing.d.ts.map +1 -0
- package/dist/tools/us2/standing.js +143 -0
- package/dist/tools/us2/standing.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Learner Profile schemas (read-write, per-user, local at ~/.vibe-hero/).
|
|
3
|
+
*
|
|
4
|
+
* The profile is a single Zod-validated JSON document. Privacy-critical: only
|
|
5
|
+
* derived grades/scores are persisted, never raw answer text (FR-018/024).
|
|
6
|
+
*
|
|
7
|
+
* Source of truth: specs/001-vibe-hero-mvp/data-model.md (§ Learner Profile).
|
|
8
|
+
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
/**
|
|
11
|
+
* User configuration written by the setup skill (FR-031). Absence of `config`
|
|
12
|
+
* on the root profile is the first-run setup gate (FR-032).
|
|
13
|
+
*/
|
|
14
|
+
export declare const ConfigSchema: z.ZodObject<{
|
|
15
|
+
toolsLearning: z.ZodArray<z.ZodEnum<["claude-code", "codex", "kiro-cli", "kiro-ide"]>, "many">;
|
|
16
|
+
offerCadence: z.ZodEnum<["off", "per_session", "per_topic"]>;
|
|
17
|
+
proactiveOffers: z.ZodBoolean;
|
|
18
|
+
quizLength: z.ZodDefault<z.ZodNumber>;
|
|
19
|
+
createdAt: z.ZodString;
|
|
20
|
+
updatedAt: z.ZodString;
|
|
21
|
+
}, "strip", z.ZodTypeAny, {
|
|
22
|
+
toolsLearning: ("claude-code" | "codex" | "kiro-cli" | "kiro-ide")[];
|
|
23
|
+
offerCadence: "off" | "per_session" | "per_topic";
|
|
24
|
+
proactiveOffers: boolean;
|
|
25
|
+
quizLength: number;
|
|
26
|
+
createdAt: string;
|
|
27
|
+
updatedAt: string;
|
|
28
|
+
}, {
|
|
29
|
+
toolsLearning: ("claude-code" | "codex" | "kiro-cli" | "kiro-ide")[];
|
|
30
|
+
offerCadence: "off" | "per_session" | "per_topic";
|
|
31
|
+
proactiveOffers: boolean;
|
|
32
|
+
createdAt: string;
|
|
33
|
+
updatedAt: string;
|
|
34
|
+
quizLength?: number | undefined;
|
|
35
|
+
}>;
|
|
36
|
+
/** User configuration. */
|
|
37
|
+
export type Config = z.infer<typeof ConfigSchema>;
|
|
38
|
+
/**
|
|
39
|
+
* Elo-style ability estimate for one {@link AbilityKey}. `itemsSeen` drives the
|
|
40
|
+
* provisional → settled K-factor; `lastItemIds` avoids back-to-back repeats.
|
|
41
|
+
*
|
|
42
|
+
* `dwell` is the consecutive count of recent graded items that satisfied the
|
|
43
|
+
* promotion-crossing condition (FR-008 / SC-014). It is the dwell counter the
|
|
44
|
+
* pure graduation engine threads across `submit_answer` calls so a single fluke
|
|
45
|
+
* item cannot promote — incremented while θ stays above the promotion bar and
|
|
46
|
+
* reset to 0 the moment an item fails it. Defaulted to `0` so profiles written
|
|
47
|
+
* before this field read forward without migration (additive, forward-compat).
|
|
48
|
+
*/
|
|
49
|
+
export declare const AbilityEstimateSchema: z.ZodObject<{
|
|
50
|
+
value: z.ZodNumber;
|
|
51
|
+
itemsSeen: z.ZodNumber;
|
|
52
|
+
lastAssessedAt: z.ZodString;
|
|
53
|
+
lastItemIds: z.ZodArray<z.ZodString, "many">;
|
|
54
|
+
dwell: z.ZodDefault<z.ZodNumber>;
|
|
55
|
+
}, "strip", z.ZodTypeAny, {
|
|
56
|
+
value: number;
|
|
57
|
+
itemsSeen: number;
|
|
58
|
+
lastAssessedAt: string;
|
|
59
|
+
lastItemIds: string[];
|
|
60
|
+
dwell: number;
|
|
61
|
+
}, {
|
|
62
|
+
value: number;
|
|
63
|
+
itemsSeen: number;
|
|
64
|
+
lastAssessedAt: string;
|
|
65
|
+
lastItemIds: string[];
|
|
66
|
+
dwell?: number | undefined;
|
|
67
|
+
}>;
|
|
68
|
+
/** An Elo-style ability estimate. */
|
|
69
|
+
export type AbilityEstimate = z.infer<typeof AbilityEstimateSchema>;
|
|
70
|
+
/**
|
|
71
|
+
* Per-key graduation state with hysteresis (FR-008/009). `currentTier` is 0
|
|
72
|
+
* until the learner first graduates.
|
|
73
|
+
*/
|
|
74
|
+
export declare const TierGraduationSchema: z.ZodObject<{
|
|
75
|
+
currentTier: z.ZodUnion<[z.ZodUnion<[z.ZodLiteral<100>, z.ZodLiteral<200>, z.ZodLiteral<300>, z.ZodLiteral<400>, z.ZodLiteral<500>]>, z.ZodLiteral<0>]>;
|
|
76
|
+
status: z.ZodEnum<["current", "due_for_review"]>;
|
|
77
|
+
graduatedAt: z.ZodString;
|
|
78
|
+
lastChangeReason: z.ZodEnum<["graduated", "demoted", "review_due"]>;
|
|
79
|
+
}, "strip", z.ZodTypeAny, {
|
|
80
|
+
status: "current" | "due_for_review";
|
|
81
|
+
currentTier: 0 | 400 | 300 | 200 | 100 | 500;
|
|
82
|
+
graduatedAt: string;
|
|
83
|
+
lastChangeReason: "graduated" | "demoted" | "review_due";
|
|
84
|
+
}, {
|
|
85
|
+
status: "current" | "due_for_review";
|
|
86
|
+
currentTier: 0 | 400 | 300 | 200 | 100 | 500;
|
|
87
|
+
graduatedAt: string;
|
|
88
|
+
lastChangeReason: "graduated" | "demoted" | "review_due";
|
|
89
|
+
}>;
|
|
90
|
+
/** Per-key tier graduation state. */
|
|
91
|
+
export type TierGraduation = z.infer<typeof TierGraduationSchema>;
|
|
92
|
+
/** An entry in the due-for-review queue. */
|
|
93
|
+
export declare const ReviewEntrySchema: z.ZodObject<{
|
|
94
|
+
key: z.ZodString;
|
|
95
|
+
dueAt: z.ZodString;
|
|
96
|
+
reason: z.ZodEnum<["spaced", "lapsed"]>;
|
|
97
|
+
}, "strip", z.ZodTypeAny, {
|
|
98
|
+
key: string;
|
|
99
|
+
dueAt: string;
|
|
100
|
+
reason: "spaced" | "lapsed";
|
|
101
|
+
}, {
|
|
102
|
+
key: string;
|
|
103
|
+
dueAt: string;
|
|
104
|
+
reason: "spaced" | "lapsed";
|
|
105
|
+
}>;
|
|
106
|
+
/** A spaced-repetition review entry. */
|
|
107
|
+
export type ReviewEntry = z.infer<typeof ReviewEntrySchema>;
|
|
108
|
+
/**
|
|
109
|
+
* One graded item inside a {@link QuizRecord}. Persists only the derived grade
|
|
110
|
+
* and continuous score — NO raw answer text (privacy, FR-018/024).
|
|
111
|
+
*/
|
|
112
|
+
export declare const AnsweredItemSchema: z.ZodObject<{
|
|
113
|
+
itemId: z.ZodString;
|
|
114
|
+
tier: z.ZodUnion<[z.ZodLiteral<100>, z.ZodLiteral<200>, z.ZodLiteral<300>, z.ZodLiteral<400>, z.ZodLiteral<500>]>;
|
|
115
|
+
difficulty: z.ZodNumber;
|
|
116
|
+
grade: z.ZodEnum<["correct", "incorrect"]>;
|
|
117
|
+
score: z.ZodNumber;
|
|
118
|
+
gradedBy: z.ZodEnum<["engine", "host_agent"]>;
|
|
119
|
+
answeredAt: z.ZodString;
|
|
120
|
+
}, "strip", z.ZodTypeAny, {
|
|
121
|
+
itemId: string;
|
|
122
|
+
tier: 400 | 300 | 200 | 100 | 500;
|
|
123
|
+
difficulty: number;
|
|
124
|
+
grade: "correct" | "incorrect";
|
|
125
|
+
score: number;
|
|
126
|
+
gradedBy: "engine" | "host_agent";
|
|
127
|
+
answeredAt: string;
|
|
128
|
+
}, {
|
|
129
|
+
itemId: string;
|
|
130
|
+
tier: 400 | 300 | 200 | 100 | 500;
|
|
131
|
+
difficulty: number;
|
|
132
|
+
grade: "correct" | "incorrect";
|
|
133
|
+
score: number;
|
|
134
|
+
gradedBy: "engine" | "host_agent";
|
|
135
|
+
answeredAt: string;
|
|
136
|
+
}>;
|
|
137
|
+
/** A graded quiz item (no raw answer text). */
|
|
138
|
+
export type AnsweredItem = z.infer<typeof AnsweredItemSchema>;
|
|
139
|
+
/**
|
|
140
|
+
* One quiz session. Only records with `completedAt` present count toward
|
|
141
|
+
* graduation; partial sessions are discarded.
|
|
142
|
+
*/
|
|
143
|
+
export declare const QuizRecordSchema: z.ZodObject<{
|
|
144
|
+
id: z.ZodString;
|
|
145
|
+
key: z.ZodString;
|
|
146
|
+
startedAt: z.ZodString;
|
|
147
|
+
completedAt: z.ZodOptional<z.ZodString>;
|
|
148
|
+
items: z.ZodArray<z.ZodObject<{
|
|
149
|
+
itemId: z.ZodString;
|
|
150
|
+
tier: z.ZodUnion<[z.ZodLiteral<100>, z.ZodLiteral<200>, z.ZodLiteral<300>, z.ZodLiteral<400>, z.ZodLiteral<500>]>;
|
|
151
|
+
difficulty: z.ZodNumber;
|
|
152
|
+
grade: z.ZodEnum<["correct", "incorrect"]>;
|
|
153
|
+
score: z.ZodNumber;
|
|
154
|
+
gradedBy: z.ZodEnum<["engine", "host_agent"]>;
|
|
155
|
+
answeredAt: z.ZodString;
|
|
156
|
+
}, "strip", z.ZodTypeAny, {
|
|
157
|
+
itemId: string;
|
|
158
|
+
tier: 400 | 300 | 200 | 100 | 500;
|
|
159
|
+
difficulty: number;
|
|
160
|
+
grade: "correct" | "incorrect";
|
|
161
|
+
score: number;
|
|
162
|
+
gradedBy: "engine" | "host_agent";
|
|
163
|
+
answeredAt: string;
|
|
164
|
+
}, {
|
|
165
|
+
itemId: string;
|
|
166
|
+
tier: 400 | 300 | 200 | 100 | 500;
|
|
167
|
+
difficulty: number;
|
|
168
|
+
grade: "correct" | "incorrect";
|
|
169
|
+
score: number;
|
|
170
|
+
gradedBy: "engine" | "host_agent";
|
|
171
|
+
answeredAt: string;
|
|
172
|
+
}>, "many">;
|
|
173
|
+
abilityBefore: z.ZodNumber;
|
|
174
|
+
abilityAfter: z.ZodNumber;
|
|
175
|
+
}, "strip", z.ZodTypeAny, {
|
|
176
|
+
key: string;
|
|
177
|
+
id: string;
|
|
178
|
+
startedAt: string;
|
|
179
|
+
items: {
|
|
180
|
+
itemId: string;
|
|
181
|
+
tier: 400 | 300 | 200 | 100 | 500;
|
|
182
|
+
difficulty: number;
|
|
183
|
+
grade: "correct" | "incorrect";
|
|
184
|
+
score: number;
|
|
185
|
+
gradedBy: "engine" | "host_agent";
|
|
186
|
+
answeredAt: string;
|
|
187
|
+
}[];
|
|
188
|
+
abilityBefore: number;
|
|
189
|
+
abilityAfter: number;
|
|
190
|
+
completedAt?: string | undefined;
|
|
191
|
+
}, {
|
|
192
|
+
key: string;
|
|
193
|
+
id: string;
|
|
194
|
+
startedAt: string;
|
|
195
|
+
items: {
|
|
196
|
+
itemId: string;
|
|
197
|
+
tier: 400 | 300 | 200 | 100 | 500;
|
|
198
|
+
difficulty: number;
|
|
199
|
+
grade: "correct" | "incorrect";
|
|
200
|
+
score: number;
|
|
201
|
+
gradedBy: "engine" | "host_agent";
|
|
202
|
+
answeredAt: string;
|
|
203
|
+
}[];
|
|
204
|
+
abilityBefore: number;
|
|
205
|
+
abilityAfter: number;
|
|
206
|
+
completedAt?: string | undefined;
|
|
207
|
+
}>;
|
|
208
|
+
/** A quiz session record. */
|
|
209
|
+
export type QuizRecord = z.infer<typeof QuizRecordSchema>;
|
|
210
|
+
/**
|
|
211
|
+
* Per-session offer accounting (anti-fatigue, FR-020/020a). Reset per session
|
|
212
|
+
* id. Under `per_session`: max 1 offer; a decline sets `declinedThisSession`
|
|
213
|
+
* and suppresses further offers. Under `per_topic`: at most one offer per
|
|
214
|
+
* distinct {@link AbilityKey} per session.
|
|
215
|
+
*
|
|
216
|
+
* `candidateKeys` is the per-session pool of topics that observed activity has
|
|
217
|
+
* flagged as offer-worthy (accumulated by `record_observation` as signals
|
|
218
|
+
* arrive). `get_offer` — which receives no signals of its own — resolves the
|
|
219
|
+
* surfaced offer from this pool. It is distinct from `offeredTopicKeys`, which
|
|
220
|
+
* records topics that have ALREADY surfaced (driving the `per_topic` cadence cap
|
|
221
|
+
* and the cross-session backoff). Defaulted to `[]` so older persisted profiles
|
|
222
|
+
* read forward without migration.
|
|
223
|
+
*/
|
|
224
|
+
export declare const OfferLedgerSchema: z.ZodObject<{
|
|
225
|
+
sessionId: z.ZodString;
|
|
226
|
+
offersThisSession: z.ZodNumber;
|
|
227
|
+
declinedThisSession: z.ZodBoolean;
|
|
228
|
+
offeredTopicKeys: z.ZodArray<z.ZodString, "many">;
|
|
229
|
+
candidateKeys: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
230
|
+
}, "strip", z.ZodTypeAny, {
|
|
231
|
+
sessionId: string;
|
|
232
|
+
offersThisSession: number;
|
|
233
|
+
declinedThisSession: boolean;
|
|
234
|
+
offeredTopicKeys: string[];
|
|
235
|
+
candidateKeys: string[];
|
|
236
|
+
}, {
|
|
237
|
+
sessionId: string;
|
|
238
|
+
offersThisSession: number;
|
|
239
|
+
declinedThisSession: boolean;
|
|
240
|
+
offeredTopicKeys: string[];
|
|
241
|
+
candidateKeys?: string[] | undefined;
|
|
242
|
+
}>;
|
|
243
|
+
/** Per-session offer ledger. */
|
|
244
|
+
export type OfferLedger = z.infer<typeof OfferLedgerSchema>;
|
|
245
|
+
/**
|
|
246
|
+
* Cross-session backoff (FR-020b). Each decline lengthens the next-eligible
|
|
247
|
+
* interval; after N consecutive declines offers are globally muted via
|
|
248
|
+
* `mutedUntil`. An accept resets `consecutiveDeclines`.
|
|
249
|
+
*/
|
|
250
|
+
export declare const OfferBackoffSchema: z.ZodObject<{
|
|
251
|
+
consecutiveDeclines: z.ZodNumber;
|
|
252
|
+
mutedUntil: z.ZodOptional<z.ZodString>;
|
|
253
|
+
perTopicNextEligibleAt: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
254
|
+
}, "strip", z.ZodTypeAny, {
|
|
255
|
+
consecutiveDeclines: number;
|
|
256
|
+
perTopicNextEligibleAt: Record<string, string>;
|
|
257
|
+
mutedUntil?: string | undefined;
|
|
258
|
+
}, {
|
|
259
|
+
consecutiveDeclines: number;
|
|
260
|
+
perTopicNextEligibleAt: Record<string, string>;
|
|
261
|
+
mutedUntil?: string | undefined;
|
|
262
|
+
}>;
|
|
263
|
+
/** Cross-session offer backoff state. */
|
|
264
|
+
export type OfferBackoff = z.infer<typeof OfferBackoffSchema>;
|
|
265
|
+
/**
|
|
266
|
+
* Transient, privacy-safe observation event derived from a hook payload and/or
|
|
267
|
+
* transcript record (correlated by `tool_use_id`, FR-017). Used only to
|
|
268
|
+
* populate offer candidates; never stored as raw prompt/tool I/O (FR-018).
|
|
269
|
+
*/
|
|
270
|
+
export declare const ObservationEventSchema: z.ZodObject<{
|
|
271
|
+
tool: z.ZodEnum<["claude-code", "codex", "kiro-cli", "kiro-ide"]>;
|
|
272
|
+
topicKeys: z.ZodArray<z.ZodString, "many">;
|
|
273
|
+
success: z.ZodBoolean;
|
|
274
|
+
timestamp: z.ZodString;
|
|
275
|
+
correlationId: z.ZodString;
|
|
276
|
+
}, "strip", z.ZodTypeAny, {
|
|
277
|
+
tool: "claude-code" | "codex" | "kiro-cli" | "kiro-ide";
|
|
278
|
+
topicKeys: string[];
|
|
279
|
+
success: boolean;
|
|
280
|
+
timestamp: string;
|
|
281
|
+
correlationId: string;
|
|
282
|
+
}, {
|
|
283
|
+
tool: "claude-code" | "codex" | "kiro-cli" | "kiro-ide";
|
|
284
|
+
topicKeys: string[];
|
|
285
|
+
success: boolean;
|
|
286
|
+
timestamp: string;
|
|
287
|
+
correlationId: string;
|
|
288
|
+
}>;
|
|
289
|
+
/** A transient observation event. */
|
|
290
|
+
export type ObservationEvent = z.infer<typeof ObservationEventSchema>;
|
|
291
|
+
/** Current profile document schema version (migration guard). */
|
|
292
|
+
export declare const PROFILE_SCHEMA_VERSION = 1;
|
|
293
|
+
/**
|
|
294
|
+
* The root learner profile document, persisted as a single JSON file. `config`
|
|
295
|
+
* absent ⇒ first-run setup gate (FR-032). `abilities`/`graduations` are keyed
|
|
296
|
+
* by {@link AbilityKeySchema} (`class|topic`).
|
|
297
|
+
*/
|
|
298
|
+
export declare const ProfileSchema: z.ZodObject<{
|
|
299
|
+
schemaVersion: z.ZodNumber;
|
|
300
|
+
createdAt: z.ZodString;
|
|
301
|
+
updatedAt: z.ZodString;
|
|
302
|
+
config: z.ZodOptional<z.ZodObject<{
|
|
303
|
+
toolsLearning: z.ZodArray<z.ZodEnum<["claude-code", "codex", "kiro-cli", "kiro-ide"]>, "many">;
|
|
304
|
+
offerCadence: z.ZodEnum<["off", "per_session", "per_topic"]>;
|
|
305
|
+
proactiveOffers: z.ZodBoolean;
|
|
306
|
+
quizLength: z.ZodDefault<z.ZodNumber>;
|
|
307
|
+
createdAt: z.ZodString;
|
|
308
|
+
updatedAt: z.ZodString;
|
|
309
|
+
}, "strip", z.ZodTypeAny, {
|
|
310
|
+
toolsLearning: ("claude-code" | "codex" | "kiro-cli" | "kiro-ide")[];
|
|
311
|
+
offerCadence: "off" | "per_session" | "per_topic";
|
|
312
|
+
proactiveOffers: boolean;
|
|
313
|
+
quizLength: number;
|
|
314
|
+
createdAt: string;
|
|
315
|
+
updatedAt: string;
|
|
316
|
+
}, {
|
|
317
|
+
toolsLearning: ("claude-code" | "codex" | "kiro-cli" | "kiro-ide")[];
|
|
318
|
+
offerCadence: "off" | "per_session" | "per_topic";
|
|
319
|
+
proactiveOffers: boolean;
|
|
320
|
+
createdAt: string;
|
|
321
|
+
updatedAt: string;
|
|
322
|
+
quizLength?: number | undefined;
|
|
323
|
+
}>>;
|
|
324
|
+
abilities: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
325
|
+
value: z.ZodNumber;
|
|
326
|
+
itemsSeen: z.ZodNumber;
|
|
327
|
+
lastAssessedAt: z.ZodString;
|
|
328
|
+
lastItemIds: z.ZodArray<z.ZodString, "many">;
|
|
329
|
+
dwell: z.ZodDefault<z.ZodNumber>;
|
|
330
|
+
}, "strip", z.ZodTypeAny, {
|
|
331
|
+
value: number;
|
|
332
|
+
itemsSeen: number;
|
|
333
|
+
lastAssessedAt: string;
|
|
334
|
+
lastItemIds: string[];
|
|
335
|
+
dwell: number;
|
|
336
|
+
}, {
|
|
337
|
+
value: number;
|
|
338
|
+
itemsSeen: number;
|
|
339
|
+
lastAssessedAt: string;
|
|
340
|
+
lastItemIds: string[];
|
|
341
|
+
dwell?: number | undefined;
|
|
342
|
+
}>>;
|
|
343
|
+
graduations: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
344
|
+
currentTier: z.ZodUnion<[z.ZodUnion<[z.ZodLiteral<100>, z.ZodLiteral<200>, z.ZodLiteral<300>, z.ZodLiteral<400>, z.ZodLiteral<500>]>, z.ZodLiteral<0>]>;
|
|
345
|
+
status: z.ZodEnum<["current", "due_for_review"]>;
|
|
346
|
+
graduatedAt: z.ZodString;
|
|
347
|
+
lastChangeReason: z.ZodEnum<["graduated", "demoted", "review_due"]>;
|
|
348
|
+
}, "strip", z.ZodTypeAny, {
|
|
349
|
+
status: "current" | "due_for_review";
|
|
350
|
+
currentTier: 0 | 400 | 300 | 200 | 100 | 500;
|
|
351
|
+
graduatedAt: string;
|
|
352
|
+
lastChangeReason: "graduated" | "demoted" | "review_due";
|
|
353
|
+
}, {
|
|
354
|
+
status: "current" | "due_for_review";
|
|
355
|
+
currentTier: 0 | 400 | 300 | 200 | 100 | 500;
|
|
356
|
+
graduatedAt: string;
|
|
357
|
+
lastChangeReason: "graduated" | "demoted" | "review_due";
|
|
358
|
+
}>>;
|
|
359
|
+
reviewSchedule: z.ZodArray<z.ZodObject<{
|
|
360
|
+
key: z.ZodString;
|
|
361
|
+
dueAt: z.ZodString;
|
|
362
|
+
reason: z.ZodEnum<["spaced", "lapsed"]>;
|
|
363
|
+
}, "strip", z.ZodTypeAny, {
|
|
364
|
+
key: string;
|
|
365
|
+
dueAt: string;
|
|
366
|
+
reason: "spaced" | "lapsed";
|
|
367
|
+
}, {
|
|
368
|
+
key: string;
|
|
369
|
+
dueAt: string;
|
|
370
|
+
reason: "spaced" | "lapsed";
|
|
371
|
+
}>, "many">;
|
|
372
|
+
quizHistory: z.ZodArray<z.ZodObject<{
|
|
373
|
+
id: z.ZodString;
|
|
374
|
+
key: z.ZodString;
|
|
375
|
+
startedAt: z.ZodString;
|
|
376
|
+
completedAt: z.ZodOptional<z.ZodString>;
|
|
377
|
+
items: z.ZodArray<z.ZodObject<{
|
|
378
|
+
itemId: z.ZodString;
|
|
379
|
+
tier: z.ZodUnion<[z.ZodLiteral<100>, z.ZodLiteral<200>, z.ZodLiteral<300>, z.ZodLiteral<400>, z.ZodLiteral<500>]>;
|
|
380
|
+
difficulty: z.ZodNumber;
|
|
381
|
+
grade: z.ZodEnum<["correct", "incorrect"]>;
|
|
382
|
+
score: z.ZodNumber;
|
|
383
|
+
gradedBy: z.ZodEnum<["engine", "host_agent"]>;
|
|
384
|
+
answeredAt: z.ZodString;
|
|
385
|
+
}, "strip", z.ZodTypeAny, {
|
|
386
|
+
itemId: string;
|
|
387
|
+
tier: 400 | 300 | 200 | 100 | 500;
|
|
388
|
+
difficulty: number;
|
|
389
|
+
grade: "correct" | "incorrect";
|
|
390
|
+
score: number;
|
|
391
|
+
gradedBy: "engine" | "host_agent";
|
|
392
|
+
answeredAt: string;
|
|
393
|
+
}, {
|
|
394
|
+
itemId: string;
|
|
395
|
+
tier: 400 | 300 | 200 | 100 | 500;
|
|
396
|
+
difficulty: number;
|
|
397
|
+
grade: "correct" | "incorrect";
|
|
398
|
+
score: number;
|
|
399
|
+
gradedBy: "engine" | "host_agent";
|
|
400
|
+
answeredAt: string;
|
|
401
|
+
}>, "many">;
|
|
402
|
+
abilityBefore: z.ZodNumber;
|
|
403
|
+
abilityAfter: z.ZodNumber;
|
|
404
|
+
}, "strip", z.ZodTypeAny, {
|
|
405
|
+
key: string;
|
|
406
|
+
id: string;
|
|
407
|
+
startedAt: string;
|
|
408
|
+
items: {
|
|
409
|
+
itemId: string;
|
|
410
|
+
tier: 400 | 300 | 200 | 100 | 500;
|
|
411
|
+
difficulty: number;
|
|
412
|
+
grade: "correct" | "incorrect";
|
|
413
|
+
score: number;
|
|
414
|
+
gradedBy: "engine" | "host_agent";
|
|
415
|
+
answeredAt: string;
|
|
416
|
+
}[];
|
|
417
|
+
abilityBefore: number;
|
|
418
|
+
abilityAfter: number;
|
|
419
|
+
completedAt?: string | undefined;
|
|
420
|
+
}, {
|
|
421
|
+
key: string;
|
|
422
|
+
id: string;
|
|
423
|
+
startedAt: string;
|
|
424
|
+
items: {
|
|
425
|
+
itemId: string;
|
|
426
|
+
tier: 400 | 300 | 200 | 100 | 500;
|
|
427
|
+
difficulty: number;
|
|
428
|
+
grade: "correct" | "incorrect";
|
|
429
|
+
score: number;
|
|
430
|
+
gradedBy: "engine" | "host_agent";
|
|
431
|
+
answeredAt: string;
|
|
432
|
+
}[];
|
|
433
|
+
abilityBefore: number;
|
|
434
|
+
abilityAfter: number;
|
|
435
|
+
completedAt?: string | undefined;
|
|
436
|
+
}>, "many">;
|
|
437
|
+
offers: z.ZodObject<{
|
|
438
|
+
sessionId: z.ZodString;
|
|
439
|
+
offersThisSession: z.ZodNumber;
|
|
440
|
+
declinedThisSession: z.ZodBoolean;
|
|
441
|
+
offeredTopicKeys: z.ZodArray<z.ZodString, "many">;
|
|
442
|
+
candidateKeys: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
443
|
+
}, "strip", z.ZodTypeAny, {
|
|
444
|
+
sessionId: string;
|
|
445
|
+
offersThisSession: number;
|
|
446
|
+
declinedThisSession: boolean;
|
|
447
|
+
offeredTopicKeys: string[];
|
|
448
|
+
candidateKeys: string[];
|
|
449
|
+
}, {
|
|
450
|
+
sessionId: string;
|
|
451
|
+
offersThisSession: number;
|
|
452
|
+
declinedThisSession: boolean;
|
|
453
|
+
offeredTopicKeys: string[];
|
|
454
|
+
candidateKeys?: string[] | undefined;
|
|
455
|
+
}>;
|
|
456
|
+
backoff: z.ZodObject<{
|
|
457
|
+
consecutiveDeclines: z.ZodNumber;
|
|
458
|
+
mutedUntil: z.ZodOptional<z.ZodString>;
|
|
459
|
+
perTopicNextEligibleAt: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
460
|
+
}, "strip", z.ZodTypeAny, {
|
|
461
|
+
consecutiveDeclines: number;
|
|
462
|
+
perTopicNextEligibleAt: Record<string, string>;
|
|
463
|
+
mutedUntil?: string | undefined;
|
|
464
|
+
}, {
|
|
465
|
+
consecutiveDeclines: number;
|
|
466
|
+
perTopicNextEligibleAt: Record<string, string>;
|
|
467
|
+
mutedUntil?: string | undefined;
|
|
468
|
+
}>;
|
|
469
|
+
}, "strip", z.ZodTypeAny, {
|
|
470
|
+
createdAt: string;
|
|
471
|
+
updatedAt: string;
|
|
472
|
+
schemaVersion: number;
|
|
473
|
+
abilities: Record<string, {
|
|
474
|
+
value: number;
|
|
475
|
+
itemsSeen: number;
|
|
476
|
+
lastAssessedAt: string;
|
|
477
|
+
lastItemIds: string[];
|
|
478
|
+
dwell: number;
|
|
479
|
+
}>;
|
|
480
|
+
graduations: Record<string, {
|
|
481
|
+
status: "current" | "due_for_review";
|
|
482
|
+
currentTier: 0 | 400 | 300 | 200 | 100 | 500;
|
|
483
|
+
graduatedAt: string;
|
|
484
|
+
lastChangeReason: "graduated" | "demoted" | "review_due";
|
|
485
|
+
}>;
|
|
486
|
+
reviewSchedule: {
|
|
487
|
+
key: string;
|
|
488
|
+
dueAt: string;
|
|
489
|
+
reason: "spaced" | "lapsed";
|
|
490
|
+
}[];
|
|
491
|
+
quizHistory: {
|
|
492
|
+
key: string;
|
|
493
|
+
id: string;
|
|
494
|
+
startedAt: string;
|
|
495
|
+
items: {
|
|
496
|
+
itemId: string;
|
|
497
|
+
tier: 400 | 300 | 200 | 100 | 500;
|
|
498
|
+
difficulty: number;
|
|
499
|
+
grade: "correct" | "incorrect";
|
|
500
|
+
score: number;
|
|
501
|
+
gradedBy: "engine" | "host_agent";
|
|
502
|
+
answeredAt: string;
|
|
503
|
+
}[];
|
|
504
|
+
abilityBefore: number;
|
|
505
|
+
abilityAfter: number;
|
|
506
|
+
completedAt?: string | undefined;
|
|
507
|
+
}[];
|
|
508
|
+
offers: {
|
|
509
|
+
sessionId: string;
|
|
510
|
+
offersThisSession: number;
|
|
511
|
+
declinedThisSession: boolean;
|
|
512
|
+
offeredTopicKeys: string[];
|
|
513
|
+
candidateKeys: string[];
|
|
514
|
+
};
|
|
515
|
+
backoff: {
|
|
516
|
+
consecutiveDeclines: number;
|
|
517
|
+
perTopicNextEligibleAt: Record<string, string>;
|
|
518
|
+
mutedUntil?: string | undefined;
|
|
519
|
+
};
|
|
520
|
+
config?: {
|
|
521
|
+
toolsLearning: ("claude-code" | "codex" | "kiro-cli" | "kiro-ide")[];
|
|
522
|
+
offerCadence: "off" | "per_session" | "per_topic";
|
|
523
|
+
proactiveOffers: boolean;
|
|
524
|
+
quizLength: number;
|
|
525
|
+
createdAt: string;
|
|
526
|
+
updatedAt: string;
|
|
527
|
+
} | undefined;
|
|
528
|
+
}, {
|
|
529
|
+
createdAt: string;
|
|
530
|
+
updatedAt: string;
|
|
531
|
+
schemaVersion: number;
|
|
532
|
+
abilities: Record<string, {
|
|
533
|
+
value: number;
|
|
534
|
+
itemsSeen: number;
|
|
535
|
+
lastAssessedAt: string;
|
|
536
|
+
lastItemIds: string[];
|
|
537
|
+
dwell?: number | undefined;
|
|
538
|
+
}>;
|
|
539
|
+
graduations: Record<string, {
|
|
540
|
+
status: "current" | "due_for_review";
|
|
541
|
+
currentTier: 0 | 400 | 300 | 200 | 100 | 500;
|
|
542
|
+
graduatedAt: string;
|
|
543
|
+
lastChangeReason: "graduated" | "demoted" | "review_due";
|
|
544
|
+
}>;
|
|
545
|
+
reviewSchedule: {
|
|
546
|
+
key: string;
|
|
547
|
+
dueAt: string;
|
|
548
|
+
reason: "spaced" | "lapsed";
|
|
549
|
+
}[];
|
|
550
|
+
quizHistory: {
|
|
551
|
+
key: string;
|
|
552
|
+
id: string;
|
|
553
|
+
startedAt: string;
|
|
554
|
+
items: {
|
|
555
|
+
itemId: string;
|
|
556
|
+
tier: 400 | 300 | 200 | 100 | 500;
|
|
557
|
+
difficulty: number;
|
|
558
|
+
grade: "correct" | "incorrect";
|
|
559
|
+
score: number;
|
|
560
|
+
gradedBy: "engine" | "host_agent";
|
|
561
|
+
answeredAt: string;
|
|
562
|
+
}[];
|
|
563
|
+
abilityBefore: number;
|
|
564
|
+
abilityAfter: number;
|
|
565
|
+
completedAt?: string | undefined;
|
|
566
|
+
}[];
|
|
567
|
+
offers: {
|
|
568
|
+
sessionId: string;
|
|
569
|
+
offersThisSession: number;
|
|
570
|
+
declinedThisSession: boolean;
|
|
571
|
+
offeredTopicKeys: string[];
|
|
572
|
+
candidateKeys?: string[] | undefined;
|
|
573
|
+
};
|
|
574
|
+
backoff: {
|
|
575
|
+
consecutiveDeclines: number;
|
|
576
|
+
perTopicNextEligibleAt: Record<string, string>;
|
|
577
|
+
mutedUntil?: string | undefined;
|
|
578
|
+
};
|
|
579
|
+
config?: {
|
|
580
|
+
toolsLearning: ("claude-code" | "codex" | "kiro-cli" | "kiro-ide")[];
|
|
581
|
+
offerCadence: "off" | "per_session" | "per_topic";
|
|
582
|
+
proactiveOffers: boolean;
|
|
583
|
+
createdAt: string;
|
|
584
|
+
updatedAt: string;
|
|
585
|
+
quizLength?: number | undefined;
|
|
586
|
+
} | undefined;
|
|
587
|
+
}>;
|
|
588
|
+
/** The root learner profile. */
|
|
589
|
+
export type Profile = z.infer<typeof ProfileSchema>;
|
|
590
|
+
/**
|
|
591
|
+
* Build a valid, empty profile for first-run / corrupted-file recovery
|
|
592
|
+
* (FR-023). `config` is intentionally omitted so the setup gate (FR-032)
|
|
593
|
+
* engages until the user runs setup.
|
|
594
|
+
*
|
|
595
|
+
* @param now - ISO timestamp to stamp `createdAt`/`updatedAt` and the empty
|
|
596
|
+
* per-session ledger; defaults to the current time.
|
|
597
|
+
*/
|
|
598
|
+
export declare const emptyProfile: (now?: string) => Profile;
|
|
599
|
+
//# sourceMappingURL=profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/schemas/profile.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;EAOvB,CAAC;AACH,0BAA0B;AAC1B,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;EAMhC,CAAC;AACH,qCAAqC;AACrC,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;EAK/B,CAAC;AACH,qCAAqC;AACrC,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,4CAA4C;AAC5C,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAI5B,CAAC;AACH,wCAAwC;AACxC,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;EAQ7B,CAAC;AACH,+CAA+C;AAC/C,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQ3B,CAAC;AACH,6BAA6B;AAC7B,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;EAQ5B,CAAC;AACH,gCAAgC;AAChC,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AACH,yCAAyC;AACzC,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;EAMjC,CAAC;AACH,qCAAqC;AACrC,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,iEAAiE;AACjE,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;;;GAIG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWxB,CAAC;AACH,gCAAgC;AAChC,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEpD;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,MAAK,MAAiC,KAAG,OAmBpE,CAAC"}
|