@happyvertical/smrt-education 0.57.32 → 0.57.34
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/AGENTS.md +8 -1
- package/README.md +117 -13
- package/agents/catalog-sync.md +46 -0
- package/agents/photo-intake.md +249 -0
- package/agents/workbook-service.md +355 -0
- package/agents/workbook-test-matrix.md +74 -0
- package/dist/catalog-acquisition-service.d.ts.map +1 -1
- package/dist/catalog-capability.d.ts +21 -0
- package/dist/catalog-capability.d.ts.map +1 -0
- package/dist/catalog-contracts.d.ts +40 -0
- package/dist/catalog-contracts.d.ts.map +1 -1
- package/dist/catalog-database-sync-store.d.ts.map +1 -1
- package/dist/catalog-models.d.ts +5 -1
- package/dist/catalog-models.d.ts.map +1 -1
- package/dist/catalog-read-service.d.ts +2 -1
- package/dist/catalog-read-service.d.ts.map +1 -1
- package/dist/catalog-service.d.ts +5 -0
- package/dist/catalog-service.d.ts.map +1 -1
- package/dist/chunks/workbook-photo-service-1wcnf-Xf.js +27359 -0
- package/dist/chunks/workbook-photo-service-1wcnf-Xf.js.map +1 -0
- package/dist/index.d.ts +11 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +339 -24864
- package/dist/index.js.map +1 -1
- package/dist/ingestion.d.ts +37 -0
- package/dist/ingestion.d.ts.map +1 -1
- package/dist/ingestion.js +829 -20
- package/dist/ingestion.js.map +1 -1
- package/dist/learner-service.d.ts +15 -0
- package/dist/learner-service.d.ts.map +1 -1
- package/dist/manifest.json +4735 -6
- package/dist/smrt-knowledge.json +1760 -26
- package/dist/sources/public-illustrative-mathematics-adapter.d.ts.map +1 -1
- package/dist/sources/public-illustrative-mathematics-parser.d.ts.map +1 -1
- package/dist/submission-service.d.ts +38 -11
- package/dist/submission-service.d.ts.map +1 -1
- package/dist/workbook-answer-regions.d.ts +11 -0
- package/dist/workbook-answer-regions.d.ts.map +1 -0
- package/dist/workbook-contracts.d.ts +224 -0
- package/dist/workbook-contracts.d.ts.map +1 -0
- package/dist/workbook-layout.d.ts +13 -0
- package/dist/workbook-layout.d.ts.map +1 -0
- package/dist/workbook-models.d.ts +129 -0
- package/dist/workbook-models.d.ts.map +1 -0
- package/dist/workbook-photo-contracts.d.ts +56 -0
- package/dist/workbook-photo-contracts.d.ts.map +1 -0
- package/dist/workbook-photo-ingestion.d.ts +70 -0
- package/dist/workbook-photo-ingestion.d.ts.map +1 -0
- package/dist/workbook-photo-models.d.ts +63 -0
- package/dist/workbook-photo-models.d.ts.map +1 -0
- package/dist/workbook-photo-service.d.ts +72 -0
- package/dist/workbook-photo-service.d.ts.map +1 -0
- package/dist/workbook-service.d.ts +158 -0
- package/dist/workbook-service.d.ts.map +1 -0
- package/package.json +8 -8
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
# Physical workbook contract
|
|
2
|
+
|
|
3
|
+
`WorkbookService` extends `SubmissionService` with the same actor-bound authorization,
|
|
4
|
+
private asset runtime, transaction executor and guardian Grade boundary. Both
|
|
5
|
+
LearnerAuthorizer and CatalogAuthorizer receive the active executor. Host session
|
|
6
|
+
heartbeats and current permission checks must use that supplied executor, including
|
|
7
|
+
nested guardian review; a captured outer pool can wait on its own transaction.
|
|
8
|
+
CatalogService obtains the executor through the public collection.db getter and
|
|
9
|
+
fails closed when its four catalog collections do not share the same handle. It is an
|
|
10
|
+
additive API; existing Submission/Grade consumers retain their contracts. The six
|
|
11
|
+
closed `Workbook*` models are package-manifest models. Apply normal application
|
|
12
|
+
schema migrations before using them; the service never creates runtime schema.
|
|
13
|
+
|
|
14
|
+
A guardian calls `resolveWorkbookActivity` with an explicit learner, workbook key,
|
|
15
|
+
title, edition (empty means unknown), page key and printed page label. Keys identify
|
|
16
|
+
the physical copy/edition and page occurrence, including section/side where needed.
|
|
17
|
+
Names and photo hashes do not establish identity. A conflicting reuse fails. One
|
|
18
|
+
private personal-use-copy course/enrollment per learner/workbook supplies internal
|
|
19
|
+
submission scaffolding. The public page API needs no course-building workflow.
|
|
20
|
+
|
|
21
|
+
`captureWorkbookWork` owns original files through SubmissionAsset and creates an
|
|
22
|
+
immutable attempt with source SHA-256 hashes, actual page bounds, actor, capture
|
|
23
|
+
time, assistance, correction predecessor/episode, policy version and effective
|
|
24
|
+
review-required flag. Assistance defaults to `unknown`. Capture retries reuse the
|
|
25
|
+
same Submission/attempt and reject changed bytes or help claims. A correction
|
|
26
|
+
requires the same learner/activity/current predecessor and stays in the same
|
|
27
|
+
practice episode. Analysis/reanalysis adds revisions, never practice attempts.
|
|
28
|
+
Existing LessonProgress.attempts remains a compatibility capture counter.
|
|
29
|
+
|
|
30
|
+
The workbook review-required policy defaults on and is shared by its pages.
|
|
31
|
+
`setWorkbookFeedbackPolicy` uses expected policy version; existing capture snapshots
|
|
32
|
+
remain unchanged. Policy changes cannot erase prior disclosure. Guarded capture,
|
|
33
|
+
policy and decision writes serialize on the learner within the active transaction.
|
|
34
|
+
Ingestion target resolution acquires that learner lock before the enrollment lock,
|
|
35
|
+
matching capture/review order. Guardian apply follows authorized timeline cursors
|
|
36
|
+
when locating a preserved assessment on an older attempt.
|
|
37
|
+
Composite mutations also use the education transaction's serialized composite
|
|
38
|
+
queue, allowing inherited queued capture/review writes without queue recursion.
|
|
39
|
+
Any swallowed mutation error still aborts the complete transaction and file rollback
|
|
40
|
+
uses the inherited fresh-file compensation ledger.
|
|
41
|
+
|
|
42
|
+
## Structured assessment and real ingestion
|
|
43
|
+
|
|
44
|
+
`WorkbookAssessment` version 1 has stable question IDs, original/corrected prompt
|
|
45
|
+
and answer text, explicit result/reason, nullable points, feedback, retained source
|
|
46
|
+
anchors and curated concept mappings. An anchor names an owned asset plus SHA-256,
|
|
47
|
+
one-based verified page (or null for a whole-file PDF source) and normalized
|
|
48
|
+
x/y/width/height rectangle. Ingestion proposals never generate rectangles: the
|
|
49
|
+
service uses [0,0,1,1] and explicit source/page grounding with limitations. The provider wire contract
|
|
50
|
+
contains evidenceId only, with no page/rect selector. An image is a known single
|
|
51
|
+
page; PDF questions retain a whole original-file anchor with page:null, not a
|
|
52
|
+
claim about page 1. Extraction metadata remains provenance, never a model page
|
|
53
|
+
localization grant. Fictitious PDF
|
|
54
|
+
pages and foreign files fail. Missing, illegible, unsupported and absent questions
|
|
55
|
+
are unassessed; unassessed points stay null. Marking certainty, mapping certainty,
|
|
56
|
+
mapping review provenance and evidence limitations are distinct; absent certainty
|
|
57
|
+
is explicitly persisted as unknown. Reviewed overrides append new bodies and keep
|
|
58
|
+
original AI text inspectable.
|
|
59
|
+
|
|
60
|
+
The configurable vocabulary is trusted server configuration, not AI-created labels.
|
|
61
|
+
The default `WORKBOOK_MATH_VOCABULARY` has addition, subtraction and place value.
|
|
62
|
+
Other subjects may use an explicit curated `workbookVocabulary` on WorkbookService,
|
|
63
|
+
the ingestion handler factory and preservation helper. Unknown concept IDs fail;
|
|
64
|
+
zero mapped concepts is valid. AI mappings are proposed, guardian mappings reviewed.
|
|
65
|
+
Known question IDs are pinned across captures; exact prompts are pinned within a
|
|
66
|
+
capture's reanalysis only. Correction transcriptions come from the new capture,
|
|
67
|
+
so earlier answer-bearing prompts cannot override corrected work. Immutable
|
|
68
|
+
historical prompts remain unchanged. The public `getWorkbookQuestionIdentity`
|
|
69
|
+
returns IDs only: historical prompt text can itself include a learner response.
|
|
70
|
+
Handlers use printed number/occurrence/subpart when present; unnumbered tasks use
|
|
71
|
+
answer-free printed-task slugs with visible-task occurrence/subpart, never output
|
|
72
|
+
array position or learner answers. They
|
|
73
|
+
read prompt, answer, feedback and marks exclusively from current evidence. New
|
|
74
|
+
prompts should contain printed task text without the learner response. An absent
|
|
75
|
+
or ambiguously matched known question is unassessed/not_present with an explicit
|
|
76
|
+
limitation. Missing, duplicate, invented or foreign IDs reject the proposal; a
|
|
77
|
+
changed question order does not change identity. The ID check does not establish
|
|
78
|
+
semantic equivalence of printed tasks; uncertain correspondence requires human
|
|
79
|
+
review rather than an invented match.
|
|
80
|
+
A different page/question requires explicit new activity identity, never AI retargeting.
|
|
81
|
+
|
|
82
|
+
`captureEducationIntake` accepts optional `workbookActivityId`/`assistance` when its
|
|
83
|
+
service is WorkbookService. It preserves the existing return SubmissionView and
|
|
84
|
+
binds the workbook attempt/policy before the host queues processing.
|
|
85
|
+
`educationIntakeHandlers({workbookActivityId,...})` advertises a bounded JSON question
|
|
86
|
+
schema to real ingestion generation. Assessed results require reason none;
|
|
87
|
+
unassessed reasons require null points. Per-question outcomes must agree with
|
|
88
|
+
points. Correctness is independent of scoring: readable objectively solvable
|
|
89
|
+
arithmetic may be assessed without a printed rubric. When no point allocation is
|
|
90
|
+
evidenced, both `points` and `possiblePoints` remain null for every result,
|
|
91
|
+
including incorrect; never invent weights or mix null/numeric values. The
|
|
92
|
+
aggregate still counts correct/incorrect results while its score remains null.
|
|
93
|
+
Incorrect earns zero only when the possible-point allocation is known.
|
|
94
|
+
Model aggregate scores/narratives are not requested or trusted: exact
|
|
95
|
+
count summaries and points scores are computed from validated questions without
|
|
96
|
+
rounding or invented partial credit. Default legacy handlers remain compatible.
|
|
97
|
+
`preserveWorkbookIntakeAnalysis` reads the public immutable completed generation,
|
|
98
|
+
checks its exact submission and offered workbook schema, maps cited original
|
|
99
|
+
ingestion evidence by hash/order to retained education-owned files and imports one
|
|
100
|
+
validated proposal. Provider/model/version, configuration/rubric, source analysis
|
|
101
|
+
pin and proposal digest are durable provenance. Pending/failed processing produces
|
|
102
|
+
no assessment. Malformed/ambiguous/foreign-source proposals return typed needs_review with no
|
|
103
|
+
education revision or Grade. The host can offer retry/review without a route 500.
|
|
104
|
+
Authorization, durable-source integrity and database failures still throw. Repeated
|
|
105
|
+
transfer is idempotent by analysis attempt. Preservation must complete before host
|
|
106
|
+
scratch retention cleanup; there is no automatic retention bypass in this API.
|
|
107
|
+
The ingestion handler can apply only an exact previously preserved proposal through
|
|
108
|
+
guardian review; it never grants AI grade authority. No prose parsing is used. The generation configuration carries bounded source
|
|
109
|
+
hash/page-support provenance from the completed extraction before it ceases to be
|
|
110
|
+
the current analysis. This uses public ingestion APIs and is pinned by its
|
|
111
|
+
configuration digest; question anchors always use honest source-only grounding.
|
|
112
|
+
|
|
113
|
+
## Authority, visibility and history
|
|
114
|
+
|
|
115
|
+
`recordWorkbookAnalysis` accepts authorized submit context and writes provisional
|
|
116
|
+
AI revisions only. `reviewWorkbookAssessment` requires guardian authority, exact
|
|
117
|
+
source revision, expected current guardian head and stable request key. It appends
|
|
118
|
+
an immutable guardian revision recording sourceRevisionId, superseded head, actor,
|
|
119
|
+
time and decision reason. Changed retries conflict. Review of the current capture
|
|
120
|
+
uses the existing guardian Grade/progress boundary. Historical annotation changes
|
|
121
|
+
its evidence authority only and cannot grade or reopen its successor. Reanalysis
|
|
122
|
+
after a guardian decision remains provisional. A guardian can invalidate an outcome
|
|
123
|
+
with an unassessed replacement and a stated reason; old AI does not regain authority.
|
|
124
|
+
|
|
125
|
+
`releaseWorkbookFeedback` separately releases an exact revision using expected
|
|
126
|
+
current guardian head. New stale releases fail; accepted retry requests replay their
|
|
127
|
+
original result after later decisions. Release creates no Grade. With the gate off,
|
|
128
|
+
AI feedback is visible as provisional while authoritative grading still requires a
|
|
129
|
+
guardian. Gate-on learners receive no unreleased assessment payloads, scores or
|
|
130
|
+
hints. WorkbookService's ordinary getSubmission also redacts Grade for own learners;
|
|
131
|
+
hosts must route workbook reads through this service and prevent legacy routes from
|
|
132
|
+
serving workbook grades. Guardian history is complete; learners see only their own
|
|
133
|
+
work and visible revisions. Answer keys/source storage URIs never enter these DTOs.
|
|
134
|
+
|
|
135
|
+
`acknowledgeWorkbookFeedbackDelivery` is an authenticated own-learner acknowledgment
|
|
136
|
+
for an exact currently visible feedback revision. It deduplicates per actor/revision
|
|
137
|
+
and rejects withheld, foreign, sibling and guardian acknowledgments. Immutable
|
|
138
|
+
delivery events record actor/time and mean rendered/delivered, never read or understood.
|
|
139
|
+
|
|
140
|
+
`getWorkbookTimeline` uses education rows/assets without reading ingestion. It lists
|
|
141
|
+
newest captures/revisions first, includes all releases/delivery events and provides
|
|
142
|
+
cursor pagination (1–100, default 25). A guardian revisionId selector locates its
|
|
143
|
+
containing capture for evidence links. Guardian source IDs/actors/reasons remain
|
|
144
|
+
inspectable. Released historical revisions remain visible after supersession.
|
|
145
|
+
|
|
146
|
+
`getConceptEvidenceSummary` is guardian-only for this milestone. It recomputes from
|
|
147
|
+
current guardian revisions, separates provisional observations, and reports independent,
|
|
148
|
+
assisted and unknown evidence. Correction captures remain one episode; they cannot
|
|
149
|
+
be extra independent demonstrations. Every observation cites capture, question,
|
|
150
|
+
revision, episode, result, assistance and time. Unassessed work is excluded from
|
|
151
|
+
error/correct counts. Descriptive cues cite actual evidence: needs practice, improving
|
|
152
|
+
on this item, needs a fresh independent check, not enough evidence. No mastery
|
|
153
|
+
percentage, generic score comparison, hidden threshold or predictive label is used.
|
|
154
|
+
|
|
155
|
+
## Preserved processing status and retention
|
|
156
|
+
|
|
157
|
+
`getWorkbookPreservationState` authorizes exact actor/learner/activity/submission
|
|
158
|
+
and returns only the intake ID plus retained assessment/analysis IDs and the
|
|
159
|
+
interpretation revision. It contains no questions, scores, feedback or hidden
|
|
160
|
+
assessment payloads. New AI provenance records `analysisRevision` from the
|
|
161
|
+
completed interpretation snapshot, separately from its extraction-source pin.
|
|
162
|
+
|
|
163
|
+
`preserveWorkbookIntakeAnalysis` checks this education-owned state and the public
|
|
164
|
+
content-free ingestion item revision before requesting raw completed analysis.
|
|
165
|
+
An exact already-preserved revision returns `retained` immediately. Guardian
|
|
166
|
+
review, release, corrections and receipt expiry therefore do not force a stale
|
|
167
|
+
proposal reread or prevent durable education history from loading. The public
|
|
168
|
+
ingestion stale-snapshot guard remains unchanged and still rejects the old raw
|
|
169
|
+
snapshot after guardian grading. A genuinely new valid analysis can append a new
|
|
170
|
+
provisional revision; a novel stale analysis returns `needs_review/stale_analysis`
|
|
171
|
+
and creates no mark. Legacy retained rows without interpretation revision remain
|
|
172
|
+
readable when scratch is stale/unavailable or the public
|
|
173
|
+
ProposalsNotConfiguredError reports removed provider read configuration. A novel
|
|
174
|
+
analysis with no provider read configuration returns unavailable without import; an authorized current snapshot whose
|
|
175
|
+
attempt ID is already retained is also skipped before retry reconstruction.
|
|
176
|
+
|
|
177
|
+
Only the exact public scratch `Intake unavailable` response is translated to
|
|
178
|
+
retained history, or `unavailable` for a capture with no retained assessment,
|
|
179
|
+
after independent education authorization. Missing/pending current analysis may
|
|
180
|
+
return pending or retained. Unexpected configuration, integrity and database
|
|
181
|
+
failures still throw. This does not widen scratch access: no stale or unavailable
|
|
182
|
+
raw proposal is read, imported or used as grade authority. Hosts must also render
|
|
183
|
+
the authorized education timeline independently of optional scratch processing.
|
|
184
|
+
|
|
185
|
+
## Compatibility API privacy boundary
|
|
186
|
+
|
|
187
|
+
Workbook feedback is projected only from the revision/release workflow. The base
|
|
188
|
+
`SubmissionService` recognizes authoritative `WorkbookActivity` lesson ownership,
|
|
189
|
+
including calls through a plain service instance. Own-learner compatibility views
|
|
190
|
+
withhold Grade and grade-derived status; learner progress projections withhold
|
|
191
|
+
bestScore/completedAt and do not let completion alter next-lesson selection.
|
|
192
|
+
Guardian and ordinary non-workbook projections retain their existing behavior.
|
|
193
|
+
This applies in both feedback policy modes; direct feedback remains provisional
|
|
194
|
+
and does not authorize compatibility Grade disclosure.
|
|
195
|
+
|
|
196
|
+
Generic capture/resubmission rejects workbook enrollment or lesson scaffolding,
|
|
197
|
+
including idempotent retries. Only the protected exact-activity owning workflow
|
|
198
|
+
can capture workbook work. Hosts must call public
|
|
199
|
+
`assertNonWorkbookSubmissionScope` before legacy intake receipt creation and when
|
|
200
|
+
reading an old legacy binding, using authoritative enrollment, lesson and
|
|
201
|
+
predecessor selectors. `WorkbookWorkflowRequiredError` is a controlled denial.
|
|
202
|
+
The browser's optional workbook flag is never authority. Authenticated original
|
|
203
|
+
asset delivery remains a separate read authorization path.
|
|
204
|
+
|
|
205
|
+
## Validation and limits
|
|
206
|
+
|
|
207
|
+
`src/__tests__/workbook-workflows.ts` is the shared SQLite/PostgreSQL contract suite;
|
|
208
|
+
`workbook-service.test.ts` runs SQLite, and `workbook.optional.test.ts` runs against
|
|
209
|
+
an available isolated PostgreSQL database. Workers never provision service stacks.
|
|
210
|
+
Run package test/typecheck/build; the integration owner runs test:postgres and the
|
|
211
|
+
integrated review. Synthetic provider DTO tests establish transfer integrity, not
|
|
212
|
+
real handwriting accuracy. Actual provider/sample and app restart/retention
|
|
213
|
+
acceptance remain separate integration evidence. Family deletion/export/backup
|
|
214
|
+
policy and automatic lesson generation are not implemented by this milestone.
|
|
215
|
+
|
|
216
|
+
## Identity-independent work
|
|
217
|
+
|
|
218
|
+
[Photo intake](photo-intake.md#marking-before-filing) may own an explicit unfiled
|
|
219
|
+
work unit. Its nullable workbook FK is constrained to an exact retained receipt;
|
|
220
|
+
private enrollment/worksheet routing is technical rather than bibliographic.
|
|
221
|
+
The same attempt/assessment/review/release and concept-evidence contracts apply.
|
|
222
|
+
`filing` is optional on legacy-shaped DTOs and explicit on current projections.
|
|
223
|
+
Append-only filing changes display association only; it never moves immutable
|
|
224
|
+
learning evidence or changes captured review policy. Ordinary identified workbook
|
|
225
|
+
identity and generated-surface restrictions remain unchanged.
|
|
226
|
+
|
|
227
|
+
### Unnumbered visible questions
|
|
228
|
+
|
|
229
|
+
A printed question number is not required for marking. On the first valid
|
|
230
|
+
assessment, an unnumbered task may use `u:<short printed-task slug>:<occurrence/subpart>`
|
|
231
|
+
from current answer-free task text and unambiguous visible task identity. The
|
|
232
|
+
occurrence distinguishes tasks in the source, never positions in a generated
|
|
233
|
+
questions array. Responses, computed solutions and changing evidence UUIDs cannot
|
|
234
|
+
supply identity. Printed IDs remain useful where present; both forms share the
|
|
235
|
+
existing nonempty/unique ID schema and 200-character bound.
|
|
236
|
+
|
|
237
|
+
Once preserved, the exact ID set remains pinned on reanalysis and correction.
|
|
238
|
+
Reordering output does not renumber tasks. A cropped, duplicate or illegible task
|
|
239
|
+
whose correspondence cannot be established remains `unassessed/not_present` with
|
|
240
|
+
a limitation on its known ID; it cannot be silently relabeled as another task.
|
|
241
|
+
Historical IDs are correspondence hints, not evidence of current responses.
|
|
242
|
+
Missing IDs, collisions, changed ID sets and same-capture prompt remapping still
|
|
243
|
+
fail closed. The framework never inserts omitted provider IDs or parses prose to
|
|
244
|
+
repair malformed proposals.
|
|
245
|
+
|
|
246
|
+
### Semantic identity visibility
|
|
247
|
+
|
|
248
|
+
Question IDs can contain printed task text. Own-learner identity reads and
|
|
249
|
+
operation discovery therefore require release of the **selected exact revision**
|
|
250
|
+
on a guardian-origin source attempt. An unrelated revision or another attempt's
|
|
251
|
+
release is insufficient. Ordinary own-origin IDs remain available for legitimate
|
|
252
|
+
current-work marking and corrections without exposing withheld grades/feedback.
|
|
253
|
+
|
|
254
|
+
Correction ancestry is checked completely under the same tenant, learner,
|
|
255
|
+
activity and practice episode. Each guardian-origin ancestor must have an exact
|
|
256
|
+
released revision publishing the compatible immutable ID set before a descendant
|
|
257
|
+
can expose those semantic IDs. Matching published ID sets preserve already public
|
|
258
|
+
historical snapshots after a later private head, without aliases or rewritten IDs.
|
|
259
|
+
Missing, corrupt or cyclic ancestry fails closed; there is no depth cutoff that
|
|
260
|
+
silently skips earlier source guards. Current descendant release never grants
|
|
261
|
+
rights to a hidden ancestor.
|
|
262
|
+
|
|
263
|
+
The same boundary governs child correction capture, timeline payloads and delivery
|
|
264
|
+
acknowledgments, including legacy/trusted-produced descendants. Raw provisional
|
|
265
|
+
revision writes/returns cannot probe or replay guardian-origin private content;
|
|
266
|
+
authorized guardians retain processing/history access, and own-origin correction
|
|
267
|
+
marking remains supported once ancestral source identity is published. Schema,
|
|
268
|
+
ID collision/remapping rules and immutable stored history remain unchanged.
|
|
269
|
+
|
|
270
|
+
The offered marking schema mirrors the assessment validator: assessed results use
|
|
271
|
+
`markingCertainty` clear/unknown; `uncertain` marking requires `unassessed`, an
|
|
272
|
+
allowed non-none reason and both point fields null. This is not a conversion of
|
|
273
|
+
provider output: contradictory results remain refused. Mapping certainty remains
|
|
274
|
+
independent. Visible but overwritten/ambiguous responses can stay unassessed while
|
|
275
|
+
other clearly visible questions are assessed in the same valid proposal.
|
|
276
|
+
|
|
277
|
+
### Observed assessment layout
|
|
278
|
+
|
|
279
|
+
Optional `WorkbookAssessment.layout` version 1 describes observed sections in source
|
|
280
|
+
order and zero-based row/column question placements. It is advisory, with fixed
|
|
281
|
+
`provenance: 'observed'`; it never establishes identity or verified geometry.
|
|
282
|
+
Sections reference a retained source asset and a physical one-based observed page,
|
|
283
|
+
or null when unknown. A whole-file PDF anchor may support an observed page within
|
|
284
|
+
its retained page count while keeping its original anchor page null. Every placed
|
|
285
|
+
question must anchor the section's exact source. Multiple question IDs may share a
|
|
286
|
+
cell. When every placement in a cell has an explicit `part`, sort by part then
|
|
287
|
+
original question array index for ties. If any placement in that cell omits
|
|
288
|
+
`part`, the whole cell follows original question array order. Partial placement is valid. Missing `readingOrder` preserves original
|
|
289
|
+
question order for a flattened display.
|
|
290
|
+
|
|
291
|
+
The browser-safe `normalizeWorkbookObservedLayout` copies only bounded known
|
|
292
|
+
fields: at most 32 sections and 200 placements, 1–8 columns, rows 0–199, parts
|
|
293
|
+
0–31, section IDs up to 64 characters and labels up to 200. Duplicate section IDs
|
|
294
|
+
or question placements, invalid source/page/placement references and malformed
|
|
295
|
+
metadata discard the complete optional layout and retain `layoutOmission: 'invalid'`.
|
|
296
|
+
Valid answers and normal assessment validation remain independent. Owning analysis
|
|
297
|
+
and guardian writes both normalize against the current capture's source hashes;
|
|
298
|
+
a correction cannot inherit a previous capture's source layout. Default guardian
|
|
299
|
+
copies retain valid layout and safe omission markers. Bodies remain immutable JSON
|
|
300
|
+
inside existing revision privacy and exact release boundaries; no migration or
|
|
301
|
+
additional learner visibility is introduced.
|
|
302
|
+
|
|
303
|
+
Focused shared SQLite/PostgreSQL cases live in
|
|
304
|
+
`src/__tests__/workbook-layout-workflows.ts`, with SQLite in
|
|
305
|
+
`workbook-layout-service.test.ts` and isolated PostgreSQL in
|
|
306
|
+
`workbook-layout.optional.test.ts`. Pure bounds/reference cases are in
|
|
307
|
+
`workbook-layout.test.ts`. Integration runs the PostgreSQL wrapper under its
|
|
308
|
+
existing isolated database lifecycle.
|
|
309
|
+
|
|
310
|
+
Generation carries optional `layout` as advisory JSON so malformed presentation
|
|
311
|
+
cannot make valid question answers fail the generic schema. Its described wire
|
|
312
|
+
shape uses original evidence IDs; the bridge maps those IDs to retained assets
|
|
313
|
+
and then calls the strict owner normalizer. Within existing transport/JSON resource
|
|
314
|
+
limits, wrong types, unknown versions and conflicting metadata are omitted with
|
|
315
|
+
only the safe marker, while answers retain their normal strict validation. Layout
|
|
316
|
+
never establishes a question ID, a source authorization or a verified region.
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
### Same-capture reread context
|
|
320
|
+
|
|
321
|
+
`getWorkbookQuestionContext` returns authorized canonical `{id,prompt}` only
|
|
322
|
+
from the exact current attempt's identity revision. Generation preserves those
|
|
323
|
+
strings verbatim for the existing strict same-capture prompt invariant, while
|
|
324
|
+
rereading learner responses and any observed layout from current evidence. This
|
|
325
|
+
context is not an answer key or authority for answers. A correction without its
|
|
326
|
+
own revision receives predecessor IDs only; predecessor prompts are never copied.
|
|
327
|
+
Exact source/revision and full correction-ancestry visibility apply to both paths,
|
|
328
|
+
including own-learner reads. No historical rows are rewritten and absent layout
|
|
329
|
+
remains valid. `getWorkbookQuestionIdentity` remains the IDs-only public API.
|
|
330
|
+
|
|
331
|
+
Canonical prompts follow ordinary assessment payload visibility, including
|
|
332
|
+
captured review policy and exact guardian revision release even for learner-owned
|
|
333
|
+
sources; source/ancestry authorization alone does not publish guardian edits.
|
|
334
|
+
For ingestion callbacks only, the engine supplies current `analysisRevision` from
|
|
335
|
+
its owned item row. Context selection ignores AI materialized by that exact
|
|
336
|
+
current-attempt revision, so preserving a proposal does not invalidate its own
|
|
337
|
+
completed snapshot or preview. It never ignores guardian decisions, predecessor
|
|
338
|
+
revisions or another interpretation. Direct reads omit this engine pin and retain
|
|
339
|
+
normal current revision visibility; browser/upload fields cannot supply the pin.
|
|
340
|
+
|
|
341
|
+
### Observed answer-region overlays
|
|
342
|
+
|
|
343
|
+
Optional `answerRegions` version1/provenance observed/coordinateSpace
|
|
344
|
+
`display-oriented` carries one approximate rect `[x,y,width,height]` per question,
|
|
345
|
+
with exact retained asset/page1 and observationId. Rects are normalized to the
|
|
346
|
+
whole EXIF-oriented image; they never change question IDs, grading, anchors or
|
|
347
|
+
layout, and never claim verified geometry. Images only in this version; PDFs or
|
|
348
|
+
unknown positions omit regions. Direct malformed metadata is omitted with safe
|
|
349
|
+
`answerRegionsOmission: invalid`; marking/layout survive independently.
|
|
350
|
+
|
|
351
|
+
Vision catalogs originate in the existing opt-in extraction call. Generation
|
|
352
|
+
references exact evidence/observation IDs, never supplies coordinates. The bridge
|
|
353
|
+
copies catalog rectangles from the extraction-pinned configuration with matching
|
|
354
|
+
source hash. Guardian copies retain them; correction sources must match current
|
|
355
|
+
anchors. Existing exact release and ancestry privacy apply to the complete body.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Workbook behavior/test matrix
|
|
2
|
+
|
|
3
|
+
Design derived from the approved Hearth workbook plan (2026-10-22), learning-record
|
|
4
|
+
contract and WB-001–WB-019 preparation packet (2026-10-23). Feature-class additive
|
|
5
|
+
schema/API change, Refs #4334. Named risk: private learner evidence, authorization,
|
|
6
|
+
concurrency and structured external model output. Compatibility workbook captures now require their owning workflow; ordinary non-workbook Submission/Grade behavior is unchanged.
|
|
7
|
+
|
|
8
|
+
Every row uses current actor-bound service context, exact tenant/learner resources,
|
|
9
|
+
and the same authorization callback executor as persistence. Shared command C:
|
|
10
|
+
`pnpm --filter @happyvertical/smrt-education exec vitest run workbook-service.test.ts`.
|
|
11
|
+
Shared command P: `pnpm --filter @happyvertical/smrt-education test:postgres` (integration
|
|
12
|
+
owner provisions PostgreSQL). Source assertions live in `workbook-workflows.ts` and
|
|
13
|
+
are shared without dialect-dependent logic. Worker evidence is SQLite/Node26;
|
|
14
|
+
PostgreSQL execution is explicitly pending integration, never inferred from skips.
|
|
15
|
+
|
|
16
|
+
| Behavior/invariant | Reachable trigger | Positive case | Negative/failure case | Actor/context | Data executor/transaction | Supported runtime/dialect | External contract edge | Test level | Validation command |
|
|
17
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
18
|
+
| Explicit workbook/page identity | Guardian resolves named physical workbook | Same keys return same activity; repeated label in different section and edition stays distinct; pages share workbook enrollment | Changed title/edition on same key rejected; learner cannot plan | Guardian allowed; learner, sibling, foreign denied | Serialized composite write, learner row lock and unique key; rollback test | Node26 SQLite/PostgreSQL | User-confirmed keys, no photo matching | Service integration | C, P |
|
|
19
|
+
| Durable capture and policy snapshots | Own learner uploads/corrects | Private assets/hashes/page bounds, retained policyVersion; correction retains episode | Changed retry bytes/help; wrong predecessor; transaction abort leaves no authoritative workbook activity | Own learner/guardian allowed; exact ownership rechecked | Existing capture/storage compensation inside education transaction | Node26 SQLite/PostgreSQL | SubmissionPage MIME/bytes; absent assistance defaults unknown | Service integration | C, P; inherited submission rollback suite |
|
|
20
|
+
| Immutable review/authority | Guardian confirms/overrides exact revision | Immutable AI + guardian revisions; source revision, reason, actor/time retained; current review makes Grade | Learner grading; stale expected head; update/delete immutable history rejected; historical review cannot grade successor | Guardian grade required | Both queues serialized; same-scope concurrent decisions; swallowed failure rolls back Grade/revision | Node26 SQLite/PostgreSQL | Unknown result enum, malformed points/JSON, foreign sources fail | Service integration | C, P |
|
|
21
|
+
| Feedback policy/release/delivery | Timeline, explicit release, authenticated render acknowledgment | Gate-off AI provisional; gate-on exact release; historical availability retained; render dedup per actor/revision | Withheld payload absent; ordinary getSubmission grade redacted; stale release/head/changed retry; guardian cannot attest learner delivery | Guardian full history; own learner projected; sibling/foreign denied | Immutable release/delivery transaction; no Grade on release/direct mode | Node26 SQLite/PostgreSQL | Missing optional certainty defaults unknown, request keys bounded | Service integration | C, P |
|
|
22
|
+
| Durable timeline and evidence locator | Education activity read after new service instance | Full history loads without ingestion reference, cursor and exact revision selector | Unknown cursor/revision and learner selector denied; no source URI | Exact tenant/learner; guardian revision locator | Read projection from education rows/assets only | Node26 SQLite/PostgreSQL | Ingestion service absent entirely for history | Service integration; actual restart/retention remains app acceptance | C, P |
|
|
23
|
+
| Real question DTO transfer | Public completed generation preservation helper | Provider/model/config/source pin retained; evidence IDs mapped by retained original hash; duplicate import reuses revision, reanalysis keeps attempt | Pending/failed creates no assessment; malformed unsupported+incorrect and unassessed/zero return typed needs_review; contradicted model totals are ignored and exact2of4 yields0.5; hallucinated rectangles discarded; foreign evidence or changed source rejected | Authorized submit bound exact activity/submission/intake | Ingestion read before education transaction, append-only education revision | Node26 SQLite/PostgreSQL | Strict handler JSON schema; no prose parser; model vocabulary cannot mint concepts | Contract + real education persistence; provider accuracy N/A here (synthetic DTO) | C, P; real provider QA integration separately |
|
|
24
|
+
| Unknown is not wrong | Unreadable, unanswered, absent or context-free question | Explicit unassessed/null points, unknown help | Unknown enum/concept, out-of-page anchor, uncertain marking with score, unanswered zero rejected | Authorized submit; guardian confirms evidence | Validated immutable body before save | Node26 SQLite/PostgreSQL | Bounded schema/anchors/concepts; original asset hash and actual PDF page bound | Service integration | C, P |
|
|
25
|
+
| Descriptive learning evidence | Guardian summary after wrong→assisted correction | Independent first incorrect separated from assisted correct; one episode; exact question/revision citations | Retry/reanalysis does not create practice; unassessed excluded from error counts; corrections never independent | Guardian-only first milestone | Deterministic fresh reduction over effective guardian revisions; provisional separate | Node26 SQLite/PostgreSQL | Curated server vocabulary; mapping proposed until guardian review | Reducer exercised through persisted service | C, P |
|
|
26
|
+
|
|
27
|
+
Evidence outputs are external to source:
|
|
28
|
+
`/Users/will/Work/tmp/hearth-upgrade-20261025/evidence/education-workbook/`.
|
|
29
|
+
The coordinator records exact final commit and integrated review/PG/app/provider
|
|
30
|
+
results. These synthetic contract tests do not establish handwriting accuracy,
|
|
31
|
+
actual device camera quality, deliberate deletion/export or backup/restore policy.
|
|
32
|
+
|
|
33
|
+
Real synthetic provider regression (2026-10-25): unsupported+incorrect is rejected,
|
|
34
|
+
model score0.75/three-correct narrative is ignored when question evidence is2of4,
|
|
35
|
+
whole-source geometry replaces unverified generated rectangles and PDF source-only
|
|
36
|
+
anchors have page:null. The shared workbook suite covers these as executable
|
|
37
|
+
regressions. A completed structured proposal rejected on educational semantics
|
|
38
|
+
remains in ingestion history. Malformed wire responses may retain only safe
|
|
39
|
+
diagnostics; without raw values a page-minimum failure cannot identify null
|
|
40
|
+
versus zero or prove a generic validator defect.
|
|
41
|
+
|
|
42
|
+
The source-only wire regression uses the public IngestionService preview API
|
|
43
|
+
and its generic handler schema validator on a real retained workbook receipt.
|
|
44
|
+
A JSON-roundtripped evidenceId-only proposal is accepted; malformed result/reason
|
|
45
|
+
and an extra page selector are rejected. Image anchors are page1; PDF source-only
|
|
46
|
+
anchors remain page:null. No conclusion about the unknown malformed provider
|
|
47
|
+
page value is inferred from the earlier minimum diagnostic.
|
|
48
|
+
|
|
49
|
+
Executor affinity regression: direct catalog read/private/answer-key callbacks
|
|
50
|
+
receive the exact shared public collection.db executor. Mixed catalog executors
|
|
51
|
+
fail before host authorization. Nested workbook guardian review asserts catalog
|
|
52
|
+
and learner callbacks share the same active transaction. A real PostgreSQL plus
|
|
53
|
+
SessionService heartbeat regression belongs to the host integration lane; synthetic
|
|
54
|
+
SQLite affinity alone is not proof that a pooled session lock can never deadlock.
|
|
55
|
+
|
|
56
|
+
Preservation regression uses actual public IngestionService generation with an
|
|
57
|
+
injected synthetic generator and actual WorkbookService persistence. It proves
|
|
58
|
+
the raw stale-snapshot guard still rejects after grading while preservation skips
|
|
59
|
+
the imported revision, allows a genuinely new provisional reanalysis, and keeps
|
|
60
|
+
review/release/correction history and child feedback gates intact after public
|
|
61
|
+
receipt expiry. Legacy stale/unavailable scratch is retained; novel stale analysis
|
|
62
|
+
is not imported; unexpected database errors propagate. This is service-integrity
|
|
63
|
+
evidence, not live-provider accuracy evidence.
|
|
64
|
+
|
|
65
|
+
Independent-review privacy regression (WB-PRIVACY-1/2): the shared suite exercises
|
|
66
|
+
plain LearnerService/SubmissionService and WorkbookService after guardian review
|
|
67
|
+
before release, in both policy modes. getSubmission, capture retry, listProgress,
|
|
68
|
+
assignmentLessons, startLesson and nextLessons do not disclose Grade, score or
|
|
69
|
+
grade-derived completion to the own learner. Generic capture/resubmission and
|
|
70
|
+
legacy preflight reject workbook enrollment/lesson/predecessor scopes without
|
|
71
|
+
creating submissions or grades; legitimate owning-workflow retries and corrections
|
|
72
|
+
still work. Guardian projections and ordinary non-workbook captures/retries remain
|
|
73
|
+
unchanged. The app signed-session PostgreSQL lane separately exercises legacy
|
|
74
|
+
host/upload/review routes and asserts no new receipts, submissions or grades.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-acquisition-service.d.ts","sourceRoot":"","sources":["../src/catalog-acquisition-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"catalog-acquisition-service.d.ts","sourceRoot":"","sources":["../src/catalog-acquisition-service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,qBAAqB,EAErB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,CACT,UAAU,EAAE,MAAM,GACjB,OAAO,CACR,CAAC,mBAAmB,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAA;KAAE,CAAC,GAAG,SAAS,CAC7E,CAAC;IACF,YAAY,CAAC,KAAK,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAAC;IAChD,eAAe,CAAC,KAAK,EAAE;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAC;IAClD,iBAAiB,CACf,KAAK,EAAE,IAAI,CAAC,wBAAwB,EAAE,IAAI,CAAC,GAAG;QAAE,KAAK,EAAE,UAAU,CAAA;KAAE,GAClE,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AASD,gGAAgG;AAChG,qBAAa,yBAAyB;IAElC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,KAAK,EAAE,uBAAuB,EAC9B,OAAO,EAAE,qBAAqB,EAC9B,MAAM,gBAAsB;IAGzC,OAAO,CACX,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC;CAgFrC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CatalogAcquisitionCapabilityDecision, CatalogResourceRepresentation, CatalogSourceRecord } from './catalog-contracts.js';
|
|
2
|
+
/** Closed observed MIME mapping; icons and file names never establish a format. */
|
|
3
|
+
export declare const CATALOG_REPRESENTATION_MEDIA_TYPES: {
|
|
4
|
+
readonly pdf: "application/pdf";
|
|
5
|
+
readonly zip: "application/zip";
|
|
6
|
+
readonly docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
|
|
7
|
+
};
|
|
8
|
+
/** Bound and validate a complete Content-Type before retaining its canonical token. */
|
|
9
|
+
export declare function catalogRepresentationMediaType(value: string): string;
|
|
10
|
+
export declare function catalogRepresentationFormat(mediaType: string): keyof typeof CATALOG_REPRESENTATION_MEDIA_TYPES | undefined;
|
|
11
|
+
export declare class CatalogRepresentationError extends Error {
|
|
12
|
+
readonly code = "invalid-representation-metadata";
|
|
13
|
+
constructor();
|
|
14
|
+
}
|
|
15
|
+
/** Missing/null is legacy; malformed present data always throws, never becomes absence. */
|
|
16
|
+
export declare function normalizeCatalogRepresentation(value: unknown): CatalogResourceRepresentation | undefined;
|
|
17
|
+
/** Read-only preselection guard for NEW downloads. It does not authorize legal use or pinned-byte printing. */
|
|
18
|
+
export declare function evaluateCatalogAcquisitionCapability(resource: Pick<CatalogSourceRecord, 'availableFormats' | 'representation'>, format: string, limits?: {
|
|
19
|
+
maxBytes?: number;
|
|
20
|
+
}): CatalogAcquisitionCapabilityDecision;
|
|
21
|
+
//# sourceMappingURL=catalog-capability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-capability.d.ts","sourceRoot":"","sources":["../src/catalog-capability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oCAAoC,EACpC,6BAA6B,EAC7B,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAEhC,mFAAmF;AACnF,eAAO,MAAM,kCAAkC;;;;CAIrC,CAAC;AACX,uFAAuF;AACvF,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASpE;AACD,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,GAChB,MAAM,OAAO,kCAAkC,GAAG,SAAS,CAK7D;AAED,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,IAAI,qCAAqC;;CAKnD;AAiBD,2FAA2F;AAC3F,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,OAAO,GACb,6BAA6B,GAAG,SAAS,CA4F3C;AAED,+GAA+G;AAC/G,wBAAgB,oCAAoC,CAClD,QAAQ,EAAE,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,GAAG,gBAAgB,CAAC,EAC1E,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,oCAAoC,CA4CtC"}
|
|
@@ -14,6 +14,44 @@ export interface CatalogLicenseEvidence {
|
|
|
14
14
|
/** Operations expressly authorized by the source evidence. */
|
|
15
15
|
permittedOperations?: CatalogOperation[];
|
|
16
16
|
}
|
|
17
|
+
/** Observed bytes and NEW acquisition support; independent of legal permissions. */
|
|
18
|
+
interface CatalogRepresentationMetadata {
|
|
19
|
+
byteLength: number;
|
|
20
|
+
validators: {
|
|
21
|
+
etag: string;
|
|
22
|
+
lastModified: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export type CatalogResourceRepresentation = CatalogRepresentationMetadata & ({
|
|
26
|
+
format: 'pdf' | 'zip' | 'docx';
|
|
27
|
+
mediaType: 'application/pdf' | 'application/zip' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
|
|
28
|
+
acquisition: {
|
|
29
|
+
status: 'supported';
|
|
30
|
+
maxBytes: number;
|
|
31
|
+
} | {
|
|
32
|
+
status: 'unsupported-format';
|
|
33
|
+
} | {
|
|
34
|
+
status: 'size-limit';
|
|
35
|
+
maxBytes: number;
|
|
36
|
+
};
|
|
37
|
+
} | {
|
|
38
|
+
format: 'unknown';
|
|
39
|
+
/** Null records an absent header; otherwise the observed canonical MIME token. */
|
|
40
|
+
mediaType: string | null;
|
|
41
|
+
acquisition: {
|
|
42
|
+
status: 'unknown-format';
|
|
43
|
+
reason: 'missing-content-type' | 'unrecognized-content-type';
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
export type CatalogAcquisitionCapabilityDecision = {
|
|
47
|
+
allowed: true;
|
|
48
|
+
verification: 'observed' | 'legacy';
|
|
49
|
+
} | {
|
|
50
|
+
allowed: false;
|
|
51
|
+
reason: 'format-unavailable' | 'unsupported-format' | 'unknown-format' | 'size-limit' | 'invalid-representation-metadata';
|
|
52
|
+
maxBytes?: number;
|
|
53
|
+
byteLength?: number;
|
|
54
|
+
};
|
|
17
55
|
/** A provider's durable source record. It remains distinct after deduplication. */
|
|
18
56
|
export interface CatalogSourceRecord {
|
|
19
57
|
providerId: string;
|
|
@@ -32,6 +70,7 @@ export interface CatalogSourceRecord {
|
|
|
32
70
|
resourceType?: string;
|
|
33
71
|
parentStableId?: string;
|
|
34
72
|
availableFormats?: string[];
|
|
73
|
+
representation?: CatalogResourceRepresentation;
|
|
35
74
|
licenseEvidence: CatalogLicenseEvidence;
|
|
36
75
|
visibility: CatalogVisibility;
|
|
37
76
|
}
|
|
@@ -92,4 +131,5 @@ export interface CatalogActor {
|
|
|
92
131
|
actorUserId: string;
|
|
93
132
|
roles: readonly string[];
|
|
94
133
|
}
|
|
134
|
+
export {};
|
|
95
135
|
//# sourceMappingURL=catalog-contracts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-contracts.d.ts","sourceRoot":"","sources":["../src/catalog-contracts.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"catalog-contracts.d.ts","sourceRoot":"","sources":["../src/catalog-contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-database-sync-store.d.ts","sourceRoot":"","sources":["../src/catalog-database-sync-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog-database-sync-store.d.ts","sourceRoot":"","sources":["../src/catalog-database-sync-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAM5D,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AA2ClE,wEAAwE;AACxE,qBAAa,wBAAyB,YAAW,gBAAgB;IACnD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,iBAAiB;IAE5C,aAAa,CACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAQvC,cAAc,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB3D,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCjE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAazE"}
|
package/dist/catalog-models.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SmrtObject } from '@happyvertical/smrt-core';
|
|
2
|
-
import type { CatalogLicenseState, CatalogVisibility } from './catalog-contracts.js';
|
|
2
|
+
import type { CatalogLicenseState, CatalogResourceRepresentation, CatalogVisibility } from './catalog-contracts.js';
|
|
3
3
|
/** Globally visible provider registration. Hosts configure adapters and credentials out of band. */
|
|
4
4
|
export declare class CatalogProvider extends SmrtObject {
|
|
5
5
|
providerId: string;
|
|
@@ -21,6 +21,10 @@ export declare class CatalogResource extends SmrtObject {
|
|
|
21
21
|
resourceType: string;
|
|
22
22
|
parentStableId: string;
|
|
23
23
|
availableFormats: string;
|
|
24
|
+
/** Serialized observed representation; JSON null is legacy absence. */
|
|
25
|
+
representation: string;
|
|
26
|
+
getRepresentation(): CatalogResourceRepresentation | undefined;
|
|
27
|
+
setRepresentation(value: CatalogResourceRepresentation | undefined): void;
|
|
24
28
|
licenseEvidence: string;
|
|
25
29
|
licenseState: CatalogLicenseState;
|
|
26
30
|
visibility: CatalogVisibility;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-models.d.ts","sourceRoot":"","sources":["../src/catalog-models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,UAAU,EAAQ,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog-models.d.ts","sourceRoot":"","sources":["../src/catalog-models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,UAAU,EAAQ,MAAM,0BAA0B,CAAC;AAG/E,OAAO,KAAK,EACV,mBAAmB,EACnB,6BAA6B,EAC7B,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAIhC,oGAAoG;AACpG,qBACa,eAAgB,SAAQ,UAAU;IAClB,UAAU,SAAM;IAChB,IAAI,SAAM;IACrC,MAAM,UAAQ;CACf;AAED,oFAAoF;AACpF,qBACa,eAAgB,SAAQ,UAAU;IAClB,UAAU,SAAM;IAChB,QAAQ,SAAM;IACd,QAAQ,SAAM;IACzC,YAAY,SAAM;IACS,KAAK,SAAM;IACtC,mBAAmB,SAAM;IACzB,MAAM,SAAM;IACZ,QAAQ,SAAQ;IAChB,MAAM,SAAQ;IACd,QAAQ,SAAM;IACd,YAAY,SAAM;IAClB,cAAc,SAAM;IACpB,gBAAgB,SAAQ;IACxB,uEAAuE;IACvE,cAAc,SAAU;IAExB,iBAAiB,IAAI,6BAA6B,GAAG,SAAS;IAG9D,iBAAiB,CAAC,KAAK,EAAE,6BAA6B,GAAG,SAAS,GAAG,IAAI;IAKzE,eAAe,SAAQ;IACvB,YAAY,EAAE,mBAAmB,CAAa;IAC9C,UAAU,EAAE,iBAAiB,CAAa;IAC1C,8EAA8E;IAC9E,aAAa,SAAM;IACnB,WAAW,SAAM;CAClB;AAED,0FAA0F;AAC1F,qBACa,gBAAiB,SAAQ,UAAU;IAC9C,kEAAkE;IACvC,UAAU,SAAM;IAC3C,MAAM,SAAM;IACZ,kFAAkF;IAClF,KAAK,SAAM;IACX,QAAQ,UAAS;IACjB,MAAM,UAAS;IACf,WAAW,SAAM;IACjB,aAAa,SAAK;IAClB,QAAQ,SAAQ;IAChB,gBAAgB,SAAM;CACvB;AAED,mFAAmF;AACnF,qBAEa,gBAAiB,SAAQ,UAAU;IAClC,QAAQ,SAAM;IACyB,UAAU,SAAM;IACxC,gBAAgB,SAAM;IACtB,gBAAgB,SAAM;CAClD;AAED,yFAAyF;AACzF,qBAEa,kBAAmB,SAAQ,UAAU;IACpC,QAAQ,SAAM;IACyB,UAAU,SAAM;IACf,WAAW,SAAM;IAC1C,QAAQ,SAAM;IACd,MAAM,SAAM;IACZ,MAAM,SAAM;IACvC,WAAW,SAAM;IACjB,OAAO,SAAM;CACd"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CatalogActor, CatalogLicenseEvidence, CatalogSourceRecord } from './catalog-contracts.js';
|
|
1
|
+
import type { CatalogActor, CatalogLicenseEvidence, CatalogResourceRepresentation, CatalogSourceRecord } from './catalog-contracts.js';
|
|
2
2
|
import { CatalogPolicy } from './catalog-policy.js';
|
|
3
3
|
export interface CatalogReadStore {
|
|
4
4
|
search(input: {
|
|
@@ -28,6 +28,7 @@ export interface CatalogResourceView {
|
|
|
28
28
|
resourceType?: string;
|
|
29
29
|
parentStableId?: string;
|
|
30
30
|
availableFormats?: string[];
|
|
31
|
+
representation?: CatalogResourceRepresentation;
|
|
31
32
|
license: Pick<CatalogLicenseEvidence, 'state' | 'identifier' | 'version' | 'attribution' | 'exceptions' | 'retrievedAt'>;
|
|
32
33
|
}
|
|
33
34
|
export declare class CatalogReadService {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-read-service.d.ts","sourceRoot":"","sources":["../src/catalog-read-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"catalog-read-service.d.ts","sourceRoot":"","sources":["../src/catalog-read-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,sBAAsB,EACtB,6BAA6B,EAC7B,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,KAAK,EAAE;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,SAAS,CAAC,mBAAmB,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC,CAAC;CAChE;AAED,yGAAyG;AACzG,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,6BAA6B,CAAC;IAC/C,OAAO,EAAE,IAAI,CACX,sBAAsB,EACpB,OAAO,GACP,YAAY,GACZ,SAAS,GACT,aAAa,GACb,YAAY,GACZ,aAAa,CAChB,CAAC;CACH;AAED,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,KAAK,EAAE,gBAAgB,EACvB,MAAM,gBAAsB;IAGzC,MAAM,CACV,KAAK,EAAE,YAAY,EACnB,MAAM,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAChE,OAAO,CAAC,mBAAmB,EAAE,CAAC;IASjC,OAAO,CAAC,IAAI;CAiDb"}
|