@khorsheed/dsh-library 0.0.0-stage → 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/CHANGELOG.md +14 -0
- package/README.en.md +49 -0
- package/README.i18n.yaml +6 -0
- package/README.md +48 -2
- package/cordis.patch.yml +17 -0
- package/lib/client.js +66276 -0
- package/lib/index.js +3318 -0
- package/lib/profiles-BXM8xNUf.js +1608 -0
- package/lib/profiles-BrbeM-bi.js +1635 -0
- package/lib/profiles-CFrPQdfO.js +1692 -0
- package/lib/profiles-DxtzIUvd.js +1632 -0
- package/lib/profiles-O0ddEit3.js +1631 -0
- package/lib/profiles-Oj-zBAY9.js +1692 -0
- package/lib/profiles-gIEviEuO.js +1610 -0
- package/lib/store-CIcZgTsg.js +1456 -0
- package/lib/store-DfYOmS44.js +1418 -0
- package/lib/tool.js +1597 -0
- package/lib/typert.host.d.ts +3 -0
- package/lib/typert.host.js +3811 -0
- package/lib/typert.remote-client.d.ts +137 -0
- package/lib/typert.remote-client.js +3077 -0
- package/lib/types/cards.d.ts +41 -0
- package/lib/types/cards.js +111 -0
- package/lib/types/client/LibraryPane.d.ts +26 -0
- package/lib/types/client/LibraryPane.js +117 -0
- package/lib/types/client/bind/BindChip.d.ts +33 -0
- package/lib/types/client/bind/BindChip.js +102 -0
- package/lib/types/client/contract.d.ts +164 -0
- package/lib/types/client/contract.js +1 -0
- package/lib/types/client/covers.d.ts +36 -0
- package/lib/types/client/covers.js +66 -0
- package/lib/types/client/definition.d.ts +27 -0
- package/lib/types/client/definition.js +32 -0
- package/lib/types/client/icons-local.d.ts +41 -0
- package/lib/types/client/icons-local.js +25 -0
- package/lib/types/client/icons.d.ts +27 -0
- package/lib/types/client/icons.js +11 -0
- package/lib/types/client/index.d.ts +35 -0
- package/lib/types/client/index.js +219 -0
- package/lib/types/client/judge.d.ts +70 -0
- package/lib/types/client/judge.js +262 -0
- package/lib/types/client/locales.d.ts +553 -0
- package/lib/types/client/locales.js +1076 -0
- package/lib/types/client/look.d.ts +63 -0
- package/lib/types/client/look.js +64 -0
- package/lib/types/client/math.d.ts +24 -0
- package/lib/types/client/math.js +47 -0
- package/lib/types/client/mistakes.d.ts +21 -0
- package/lib/types/client/mistakes.js +28 -0
- package/lib/types/client/preset-visibility.d.ts +109 -0
- package/lib/types/client/preset-visibility.js +123 -0
- package/lib/types/client/quiz-drafts.d.ts +29 -0
- package/lib/types/client/quiz-drafts.js +50 -0
- package/lib/types/client/store.d.ts +109 -0
- package/lib/types/client/store.js +44 -0
- package/lib/types/client/titles.d.ts +17 -0
- package/lib/types/client/titles.js +23 -0
- package/lib/types/client/ui.d.ts +96 -0
- package/lib/types/client/ui.js +124 -0
- package/lib/types/client/views/book.d.ts +57 -0
- package/lib/types/client/views/book.js +164 -0
- package/lib/types/client/views/cards.d.ts +17 -0
- package/lib/types/client/views/cards.js +53 -0
- package/lib/types/client/views/home.d.ts +26 -0
- package/lib/types/client/views/home.js +263 -0
- package/lib/types/client/views/lesson.d.ts +42 -0
- package/lib/types/client/views/lesson.js +146 -0
- package/lib/types/client/views/path.d.ts +32 -0
- package/lib/types/client/views/path.js +64 -0
- package/lib/types/client/views/quiz.d.ts +42 -0
- package/lib/types/client/views/quiz.js +366 -0
- package/lib/types/client/views/station-quiz.d.ts +43 -0
- package/lib/types/client/views/station-quiz.js +203 -0
- package/lib/types/client/views/station.d.ts +18 -0
- package/lib/types/client/views/station.js +142 -0
- package/lib/types/image-refs.d.ts +35 -0
- package/lib/types/image-refs.js +71 -0
- package/lib/types/index.d.ts +51 -0
- package/lib/types/index.js +31 -0
- package/lib/types/mastery.d.ts +81 -0
- package/lib/types/mastery.js +110 -0
- package/lib/types/profiles.d.ts +31 -0
- package/lib/types/profiles.js +25 -0
- package/lib/types/remote.d.ts +355 -0
- package/lib/types/remote.js +332 -0
- package/lib/types/service/assess.d.ts +144 -0
- package/lib/types/service/assess.js +773 -0
- package/lib/types/service/bindings.d.ts +92 -0
- package/lib/types/service/bindings.js +198 -0
- package/lib/types/service/cards.d.ts +85 -0
- package/lib/types/service/cards.js +320 -0
- package/lib/types/service/core.d.ts +124 -0
- package/lib/types/service/core.js +169 -0
- package/lib/types/service/pages.d.ts +60 -0
- package/lib/types/service/pages.js +125 -0
- package/lib/types/service/roadmap.d.ts +99 -0
- package/lib/types/service/roadmap.js +284 -0
- package/lib/types/service/rules.d.ts +63 -0
- package/lib/types/service/rules.js +245 -0
- package/lib/types/service/shelf.d.ts +136 -0
- package/lib/types/service/shelf.js +422 -0
- package/lib/types/service.d.ts +42 -0
- package/lib/types/service.js +41 -0
- package/lib/types/store.d.ts +257 -0
- package/lib/types/store.js +1376 -0
- package/lib/types/tool-definition.d.ts +49 -0
- package/lib/types/tool-definition.js +49 -0
- package/lib/types/tool.d.ts +71 -0
- package/lib/types/tool.js +174 -0
- package/lib/types/tools/assess.d.ts +11 -0
- package/lib/types/tools/assess.js +82 -0
- package/lib/types/tools/binding.d.ts +11 -0
- package/lib/types/tools/binding.js +46 -0
- package/lib/types/tools/cards.d.ts +11 -0
- package/lib/types/tools/cards.js +100 -0
- package/lib/types/tools/kit.d.ts +215 -0
- package/lib/types/tools/kit.js +281 -0
- package/lib/types/tools/notes.d.ts +11 -0
- package/lib/types/tools/notes.js +40 -0
- package/lib/types/tools/page.d.ts +11 -0
- package/lib/types/tools/page.js +59 -0
- package/lib/types/tools/project.d.ts +11 -0
- package/lib/types/tools/project.js +67 -0
- package/lib/types/tools/quiz.d.ts +11 -0
- package/lib/types/tools/quiz.js +74 -0
- package/lib/types/tools/read.d.ts +11 -0
- package/lib/types/tools/read.js +127 -0
- package/lib/types/tools/resource.d.ts +11 -0
- package/lib/types/tools/resource.js +147 -0
- package/lib/types/tools/roadmap.d.ts +11 -0
- package/lib/types/tools/roadmap.js +102 -0
- package/lib/types/types.d.ts +752 -0
- package/lib/types/types.js +159 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +135 -3
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The library's domain vocabulary: projects, resources, roadmaps, nodes,
|
|
3
|
+
* assessments, attempts, photo pages, knowledge cards and session bindings.
|
|
4
|
+
* Everything here is plain serializable data — the store (`store.ts`)
|
|
5
|
+
* persists exactly these shapes under `$DSH_HOME/state/dsh-library/`, and the
|
|
6
|
+
* Remote face (`remote.ts`) and the model tools (`tool-definition.ts`) both
|
|
7
|
+
* speak them.
|
|
8
|
+
*
|
|
9
|
+
* The shapes follow the proposal `2026-10-16-library-v5-model` (v5: the
|
|
10
|
+
* six-layer core — Project → Resource → Roadmap → Node → Assessment →
|
|
11
|
+
* Attempt, with Card / Page / Event as the trace layer):
|
|
12
|
+
*
|
|
13
|
+
* - a RESOURCE is anything on the project's shelf. Its `toc` is the
|
|
14
|
+
* thick/thin switch: a resource WITH a contents (a book, a course with
|
|
15
|
+
* episodes) can carry a roadmap, be covered by chapter, be quizzed and be
|
|
16
|
+
* photographed; one without is a thin link (an article, a video, a tool)
|
|
17
|
+
* that only enters a path whole. Nothing is ever uploaded — a thick
|
|
18
|
+
* resource registers title, kind and a contents the coach verified on the
|
|
19
|
+
* web (or took from a photo);
|
|
20
|
+
* - a ROADMAP belongs to exactly one thick resource — a TEXTBOOK (proposal
|
|
21
|
+
* `2026-10-19-library-book-paths`: the project carries no path of its
|
|
22
|
+
* own). Textbooks sit on the shelf in study order (`seq`), and come from
|
|
23
|
+
* the learner, from the coach's pick, or from the coach's own pen
|
|
24
|
+
* (`origin`). A node draws on COVERS in one shape — `{ ref, locator? }`,
|
|
25
|
+
* where ref is a resource id, a bare url, or `topic:…` (plain coached
|
|
26
|
+
* teaching) and locator counts contents rows ("1-5,7"); the path's own
|
|
27
|
+
* textbook is the main cover, anything else rides along as a side
|
|
28
|
+
* reference. A path need not cover the whole contents. The coach writes DRAFTS, the
|
|
29
|
+
* learner adopts one, and the adopted path's state machine has three edges
|
|
30
|
+
* only (`locked → current → done`);
|
|
31
|
+
* - a NODE's `gate` says how it completes: `quiz` (an assessed quiz at the
|
|
32
|
+
* pass ratio), `acceptance` (a hands-on station — the learner submits
|
|
33
|
+
* evidence, the coach judges one verdict per rubric line), `read` (an
|
|
34
|
+
* optional side stop that 「读完」 completes and never gates);
|
|
35
|
+
* - an ASSESSMENT is the graded thing: `quiz` carries questions, `practice`
|
|
36
|
+
* carries a station's materialized rubric (stable line ids; a line may
|
|
37
|
+
* reference another assessment that machine-checks it). Hung on a node, on
|
|
38
|
+
* a resource (a book-level paper), or on nothing (free practice). A
|
|
39
|
+
* station's paper history chains by `supersededBy`;
|
|
40
|
+
* - an ATTEMPT is one graded sitting and names only its `assessmentId` (a
|
|
41
|
+
* verdict's `task` is a question id or a rubric line id, so rewording never
|
|
42
|
+
* orphans history);
|
|
43
|
+
* - a PAGE is one photographed page of a thick resource: its recognized text
|
|
44
|
+
* plus the learner's marks;
|
|
45
|
+
* - a CARD (知识卡片) is the learner's own memory: a word or a concept met in a
|
|
46
|
+
* photo, asked about in a chat, or missed in an assessment — one card per
|
|
47
|
+
* thing, sources stacked, with a weakness score (0–3) beside its Leitner
|
|
48
|
+
* mastery;
|
|
49
|
+
* - an EVENT is the append-only audit trail.
|
|
50
|
+
*
|
|
51
|
+
* @module @khorsheed/dsh-library/types
|
|
52
|
+
*/
|
|
53
|
+
/** The state-root directory name under `$DSH_HOME/state`. */
|
|
54
|
+
export const STATE_ROOT_SEGMENT = 'dsh-library';
|
|
55
|
+
/**
|
|
56
|
+
* The on-disk schema version of `state.json`. v1 (uploaded books, project
|
|
57
|
+
* roadmaps, the vocab book) was never deployed; a v1 root reads as empty. v2
|
|
58
|
+
* roots (per-book roadmaps with `chapterRanges`) and v3/v4 roots (the
|
|
59
|
+
* book/resource split, cover unions, quiz entities) all read tolerantly —
|
|
60
|
+
* every normalize* function reads the old shapes — and rewrite to v5 on their
|
|
61
|
+
* next write. There is no offline migration pass.
|
|
62
|
+
*/
|
|
63
|
+
export const LIBRARY_STATE_VERSION = 5;
|
|
64
|
+
/** The Leitner intervals in days, indexed by box (box 5 reuses the last rung). */
|
|
65
|
+
export const LEITNER_INTERVAL_DAYS = [1, 2, 4, 7, 15];
|
|
66
|
+
/** The highest Leitner box. */
|
|
67
|
+
export const MAX_BOX = 5;
|
|
68
|
+
/** The highest weakness score (three bars in the UI). */
|
|
69
|
+
export const MAX_WEAKNESS = 3;
|
|
70
|
+
/** The default node pass threshold (an assessment ratio at or above it completes the node). */
|
|
71
|
+
export const DEFAULT_PASS_RATIO = 0.8;
|
|
72
|
+
/** The preset project colors (the sidebar maps each to a light and a dark tone). */
|
|
73
|
+
export const LIBRARY_COLORS = ['ember', 'amber', 'moss', 'teal', 'sky', 'indigo', 'plum', 'rose'];
|
|
74
|
+
/** The preset project icons. */
|
|
75
|
+
export const LIBRARY_ICONS = ['globe', 'brain', 'book', 'flask', 'atom', 'leaf', 'pen', 'music', 'scale', 'chart', 'code', 'compass'];
|
|
76
|
+
/** A template's default look, until the learner picks another. */
|
|
77
|
+
export const TEMPLATE_LOOK = {
|
|
78
|
+
language: { color: 'ember', icon: 'globe' },
|
|
79
|
+
subject: { color: 'indigo', icon: 'brain' },
|
|
80
|
+
custom: { color: 'teal', icon: 'compass' },
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Where a shelf entry came from: `learner` — the learner's own (a book they
|
|
84
|
+
* hold, a link they handed over); `picked` — an existing book / course / link
|
|
85
|
+
* the coach chose; `authored` — a textbook the coach wrote itself (its
|
|
86
|
+
* contents are the coach's own outline, its 讲义 are the text). Legacy
|
|
87
|
+
* `addedBy` reads as learner / picked.
|
|
88
|
+
*/
|
|
89
|
+
export const LIBRARY_RESOURCE_ORIGINS = ['learner', 'picked', 'authored'];
|
|
90
|
+
/** What a shelf entry IS: the shape of the thing it is or points at. */
|
|
91
|
+
export const LIBRARY_RESOURCE_KINDS = ['book', 'article', 'video', 'repo', 'tool', 'course', 'hardware'];
|
|
92
|
+
/** Whether a resource is thick (routable, coverable by chapter, quizzable, photographable). */
|
|
93
|
+
export function isThickResource(resource) {
|
|
94
|
+
return resource.toc !== undefined && resource.toc.length > 0;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The locator's text form: comma-joined spans ("1-5,7,9-12" — a one-row span
|
|
98
|
+
* is the bare number). Contents-row spans are what cover locators count.
|
|
99
|
+
*/
|
|
100
|
+
export function formatLocator(ranges) {
|
|
101
|
+
return ranges.map(range => range.from === range.to ? String(range.from) : `${range.from}-${range.to}`).join(',');
|
|
102
|
+
}
|
|
103
|
+
/** Parse a locator ("1-5,7") into spans; bad segments drop out. */
|
|
104
|
+
export function parseLocator(locator) {
|
|
105
|
+
return locator.split(',').flatMap(segment => {
|
|
106
|
+
const match = /^\s*(\d+)\s*(?:[-–—]\s*(\d+)\s*)?$/.exec(segment);
|
|
107
|
+
if (match === null)
|
|
108
|
+
return [];
|
|
109
|
+
const from = Number.parseInt(match[1], 10);
|
|
110
|
+
const to = match[2] === undefined ? from : Number.parseInt(match[2], 10);
|
|
111
|
+
return from >= 1 && to >= from ? [{ from, to }] : [];
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/** Discriminate a cover by its ref's form (a resource id resolves against the shelf). */
|
|
115
|
+
export function coverKind(cover) {
|
|
116
|
+
if (cover.ref.startsWith('topic:'))
|
|
117
|
+
return 'topic';
|
|
118
|
+
if (/^https?:\/\//.test(cover.ref))
|
|
119
|
+
return 'url';
|
|
120
|
+
return 'resource';
|
|
121
|
+
}
|
|
122
|
+
/** A topic cover's teaching text (the ref minus its `topic:` prefix). */
|
|
123
|
+
export function coverTopic(cover) {
|
|
124
|
+
return cover.ref.startsWith('topic:') ? cover.ref.slice('topic:'.length) : undefined;
|
|
125
|
+
}
|
|
126
|
+
/** An acceptance station's rubric: its acceptance lines with stable positional ids (L1, L2, …). */
|
|
127
|
+
export function acceptanceLines(node) {
|
|
128
|
+
return (node.acceptance ?? []).map((entry, index) => typeof entry === 'string'
|
|
129
|
+
? { id: `L${index + 1}`, line: entry }
|
|
130
|
+
: { id: `L${index + 1}`, line: entry.line, ...(entry.ref === undefined ? {} : { ref: entry.ref }) });
|
|
131
|
+
}
|
|
132
|
+
/** The event vocabulary, for tests and for writers who must not invent types. */
|
|
133
|
+
export const LIBRARY_EVENT_TYPES = [
|
|
134
|
+
'resource.added',
|
|
135
|
+
'roadmap.drafted',
|
|
136
|
+
'roadmap.adopted',
|
|
137
|
+
'page.recorded',
|
|
138
|
+
'cards.recorded',
|
|
139
|
+
'card.edited',
|
|
140
|
+
'quiz.created',
|
|
141
|
+
'attempt.assessed',
|
|
142
|
+
'node.completed',
|
|
143
|
+
'node.unlocked',
|
|
144
|
+
'node.noted',
|
|
145
|
+
'point.changed',
|
|
146
|
+
];
|
|
147
|
+
/* ------------------------------------------------------------- id minting */
|
|
148
|
+
/** Ids become path segments — keep them inside a safe alphabet (mission rule). */
|
|
149
|
+
export const LIBRARY_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
|
|
150
|
+
/** Whether an id is usable as a path segment. */
|
|
151
|
+
export function isLibraryId(id) {
|
|
152
|
+
return LIBRARY_ID_PATTERN.test(id);
|
|
153
|
+
}
|
|
154
|
+
/** A native fs failure's message, with its code, for the wire. */
|
|
155
|
+
export function libraryErrorMessage(error) {
|
|
156
|
+
const code = error?.code;
|
|
157
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
158
|
+
return code === undefined ? message : `${code}: ${message}`;
|
|
159
|
+
}
|
package/locale/en.json
ADDED
package/locale/zh.json
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,138 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@khorsheed/dsh-library",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"description": "Library and learning engine: project-organized close reading of registered books (no upload) — a per-book roadmap the coach drafts and the learner adopts, photographed pages whose marks become knowledge cards, cards that dedupe and track weakness, two-axis quizzes (what they target × what they rest on) and verdict-led unlocking — a Typert Remote data face, a right-Sidebar page tab, and the ./tool composition entry (library_read + one library_<noun> tool per write + library_assess) for agent presets",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "lib/index.js",
|
|
7
|
+
"types": "lib/types/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./lib/types/index.d.ts",
|
|
11
|
+
"default": "./lib/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./types": {
|
|
14
|
+
"types": "./lib/types/types.d.ts",
|
|
15
|
+
"default": "./lib/types.js"
|
|
16
|
+
},
|
|
17
|
+
"./tool": {
|
|
18
|
+
"types": "./lib/types/tool.d.ts",
|
|
19
|
+
"default": "./lib/tool.js"
|
|
20
|
+
},
|
|
21
|
+
"./client": {
|
|
22
|
+
"types": "./lib/types/client/index.d.ts",
|
|
23
|
+
"default": "./lib/client.js"
|
|
24
|
+
},
|
|
25
|
+
"./typert": {
|
|
26
|
+
"types": "./lib/typert.host.d.ts",
|
|
27
|
+
"default": "./lib/typert.host.js"
|
|
28
|
+
},
|
|
29
|
+
"./remote": {
|
|
30
|
+
"types": "./lib/typert.remote-client.d.ts",
|
|
31
|
+
"default": "./lib/typert.remote-client.js"
|
|
32
|
+
},
|
|
33
|
+
"./src/*": "./src/*",
|
|
34
|
+
"./locale/*.json": "./locale/*.json",
|
|
35
|
+
"./tool/locale/*.json": "./locale/*.json",
|
|
36
|
+
"./package.json": "./package.json"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"lib",
|
|
40
|
+
"lib/typert.host.d.ts",
|
|
41
|
+
"lib/typert.host.js",
|
|
42
|
+
"lib/typert.remote-client.d.ts",
|
|
43
|
+
"lib/typert.remote-client.js",
|
|
44
|
+
"cordis.patch.yml",
|
|
45
|
+
"locale/*.json",
|
|
46
|
+
"CHANGELOG.md"
|
|
47
|
+
],
|
|
48
|
+
"license": "MIT",
|
|
49
|
+
"engines": {
|
|
50
|
+
"dsh": ">=0.1.7-rc.1 <0.3.0-0"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"zod": "^4.4.3"
|
|
54
|
+
},
|
|
55
|
+
"peerDependencies": {
|
|
56
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
57
|
+
"@deepseek-ai/dsh-agent": "^0.1.0-rc.6 || ^0.2.0-rc.1 || ^0.2.1-rc.1",
|
|
58
|
+
"@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.6 || ^0.2.0-rc.1 || ^0.2.1-rc.1",
|
|
59
|
+
"@deepseek-ai/dsh-client-locale": "^0.1.0-rc.6 || ^0.2.0-rc.1 || ^0.2.1-rc.1",
|
|
60
|
+
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.6 || ^0.2.0-rc.1 || ^0.2.1-rc.1",
|
|
61
|
+
"@deepseek-ai/dsh-client-ui-session": "^0.1.0-rc.6 || ^0.2.0-rc.1 || ^0.2.1-rc.1",
|
|
62
|
+
"@deepseek-ai/dsh-client-ui-sidebar-right": "^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-rc.1",
|
|
63
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6 || ^0.2.0-rc.1 || ^0.2.1-rc.1",
|
|
64
|
+
"@deepseek-ai/dsh-session": "^0.1.0-rc.6 || ^0.2.0-rc.1 || ^0.2.1-rc.1",
|
|
65
|
+
"@deepseek-ai/dsh-tools": "^0.1.0-rc.6 || ^0.2.0-rc.1 || ^0.2.1-rc.1",
|
|
66
|
+
"@deepseek-ai/dsh-typert-protocol": "^0.1.0-rc.6 || ^0.2.0-rc.1 || ^0.2.1-rc.1",
|
|
67
|
+
"@deepseek-ai/schemastery": "^3.18.1",
|
|
68
|
+
"react": "^18.2.0"
|
|
69
|
+
},
|
|
70
|
+
"peerDependenciesMeta": {
|
|
71
|
+
"@deepseek-ai/dsh-agent": {
|
|
72
|
+
"optional": true
|
|
73
|
+
},
|
|
74
|
+
"@deepseek-ai/dsh-api-remotes": {
|
|
75
|
+
"optional": true
|
|
76
|
+
},
|
|
77
|
+
"@deepseek-ai/dsh-client-locale": {
|
|
78
|
+
"optional": true
|
|
79
|
+
},
|
|
80
|
+
"@deepseek-ai/dsh-client-ui-primitives": {
|
|
81
|
+
"optional": true
|
|
82
|
+
},
|
|
83
|
+
"@deepseek-ai/dsh-client-ui-session": {
|
|
84
|
+
"optional": true
|
|
85
|
+
},
|
|
86
|
+
"@deepseek-ai/dsh-client-ui-sidebar-right": {
|
|
87
|
+
"optional": true
|
|
88
|
+
},
|
|
89
|
+
"@deepseek-ai/dsh-client-ui-slots": {
|
|
90
|
+
"optional": true
|
|
91
|
+
},
|
|
92
|
+
"@deepseek-ai/dsh-session": {
|
|
93
|
+
"optional": true
|
|
94
|
+
},
|
|
95
|
+
"@deepseek-ai/dsh-tools": {
|
|
96
|
+
"optional": true
|
|
97
|
+
},
|
|
98
|
+
"@deepseek-ai/schemastery": {
|
|
99
|
+
"optional": true
|
|
100
|
+
},
|
|
101
|
+
"react": {
|
|
102
|
+
"optional": true
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"keywords": [
|
|
106
|
+
"dsh",
|
|
107
|
+
"dsh-plugin",
|
|
108
|
+
"cordis",
|
|
109
|
+
"library",
|
|
110
|
+
"learning",
|
|
111
|
+
"reading",
|
|
112
|
+
"epub",
|
|
113
|
+
"vocab",
|
|
114
|
+
"quiz",
|
|
115
|
+
"sidebar"
|
|
116
|
+
],
|
|
117
|
+
"dsh": {
|
|
118
|
+
"bundle": {
|
|
119
|
+
"patch": "./cordis.patch.yml"
|
|
120
|
+
},
|
|
121
|
+
"client": {
|
|
122
|
+
"inject": [
|
|
123
|
+
"@deepseek-ai/dsh-api-remotes",
|
|
124
|
+
"@deepseek-ai/dsh-client-locale",
|
|
125
|
+
"@deepseek-ai/dsh-client-ui-primitives",
|
|
126
|
+
"@deepseek-ai/dsh-client-ui-sidebar-right",
|
|
127
|
+
"@deepseek-ai/dsh-client-ui-session",
|
|
128
|
+
"@deepseek-ai/dsh-client-ui-slots"
|
|
129
|
+
],
|
|
130
|
+
"platform": "web"
|
|
131
|
+
},
|
|
132
|
+
"compat": {
|
|
133
|
+
"minHost": "0.1.7-rc.1",
|
|
134
|
+
"notes": "A page-type right-Sidebar tab (minted kind `library`) over a Typert Remote data face, plus the `./tool` composition entry (library_read / library_write / library_assess, the coaching prompt section and a per-turn bound-context line via systemPrompt.context) an agent preset names. Books are registered, never uploaded: the coach verifies the edition's contents on the web; nothing is parsed. State is plain `node:fs` under `$DSH_HOME/state/dsh-library` (atomic temp+rename, per-project lock, append-only JSONL ledgers) — never `ctx.fs`, the session-fenced sandbox (the reader precedent). Session bindings (project / book) are keyed by the calling agent's session id. The tab type self-hides on the preset-composition criterion (the canvas double check: root rows ∪ the current session's preset rows, `@khorsheed/dsh-library/tool`), fail-open on every unreadable path. Photos go through the probed `attachments` service (saveImage for sidebar uploads; readImage only for pages the project recorded), degrading to `unavailable` without it. The tool row's optional hideSections / denyTools quiet a focused preset's scope through scoped prompt sections and tools.restrict, skipping any name the composition does not hold.",
|
|
135
|
+
"verifiedHost": "0.2.1-rc.1"
|
|
136
|
+
}
|
|
137
|
+
}
|
|
6
138
|
}
|