dsh-diagnostic-tutor 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 +21 -0
- package/README.md +658 -0
- package/cordis.patch.yml +23 -0
- package/lib/api.js +413 -0
- package/lib/api.js.map +1 -0
- package/lib/client.js +2029 -0
- package/lib/client.js.map +1 -0
- package/lib/contract.js +14 -0
- package/lib/contract.js.map +1 -0
- package/lib/diagnosis.js +224 -0
- package/lib/diagnosis.js.map +1 -0
- package/lib/handoff.js +194 -0
- package/lib/handoff.js.map +1 -0
- package/lib/index.js +186 -0
- package/lib/index.js.map +1 -0
- package/lib/lesson.js +285 -0
- package/lib/lesson.js.map +1 -0
- package/lib/prompt.js +96 -0
- package/lib/prompt.js.map +1 -0
- package/lib/state.js +500 -0
- package/lib/state.js.map +1 -0
- package/lib/tools.js +994 -0
- package/lib/tools.js.map +1 -0
- package/lib/trust-fence.js +101 -0
- package/lib/trust-fence.js.map +1 -0
- package/lib/types/api.d.ts +62 -0
- package/lib/types/api.d.ts.map +1 -0
- package/lib/types/contract.d.ts +147 -0
- package/lib/types/contract.d.ts.map +1 -0
- package/lib/types/diagnosis.d.ts +116 -0
- package/lib/types/diagnosis.d.ts.map +1 -0
- package/lib/types/handoff.d.ts +141 -0
- package/lib/types/handoff.d.ts.map +1 -0
- package/lib/types/index.d.ts +71 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/lesson.d.ts +295 -0
- package/lib/types/lesson.d.ts.map +1 -0
- package/lib/types/prompt.d.ts +85 -0
- package/lib/types/prompt.d.ts.map +1 -0
- package/lib/types/state.d.ts +627 -0
- package/lib/types/state.d.ts.map +1 -0
- package/lib/types/tools.d.ts +38 -0
- package/lib/types/tools.d.ts.map +1 -0
- package/lib/types/trust-fence.d.ts +53 -0
- package/lib/types/trust-fence.d.ts.map +1 -0
- package/lib/types/udt.d.ts +95 -0
- package/lib/types/udt.d.ts.map +1 -0
- package/lib/types/vocabulary.d.ts +162 -0
- package/lib/types/vocabulary.d.ts.map +1 -0
- package/lib/udt.js +141 -0
- package/lib/udt.js.map +1 -0
- package/lib/vocabulary.js +182 -0
- package/lib/vocabulary.js.map +1 -0
- package/package.json +104 -0
package/lib/tools.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser trust fence for this plugin's HTTP surface.
|
|
3
|
+
*
|
|
4
|
+
* A bare `ctx.webServer.register()` route inherits **no authentication** — the
|
|
5
|
+
* framework does not wrap third-party routes, and its own gateway fence is
|
|
6
|
+
* package-internal. Every published plugin therefore re-implements the same
|
|
7
|
+
* behaviour, and so does this one.
|
|
8
|
+
*
|
|
9
|
+
* What it defends against: a page on another origin (or a DNS-rebound hostname)
|
|
10
|
+
* reaching these routes from the user's browser. The rule is that a request
|
|
11
|
+
* must arrive at a **loopback** host, from a **loopback** origin, and must not
|
|
12
|
+
* be marked cross-site.
|
|
13
|
+
*
|
|
14
|
+
* Deliberately a *behavioural* replica of
|
|
15
|
+
* `@deepseek-ai/dsh-client-connection`'s `api-request-trust.ts` /
|
|
16
|
+
* `loopback-hostname.ts`, not an import: those are not exported for third
|
|
17
|
+
* parties, and importing across a harness cohort is exactly what this project's
|
|
18
|
+
* cross-version discipline forbids.
|
|
19
|
+
*
|
|
20
|
+
* Anything that fails the fence gets 403 and no body, so a rejected caller
|
|
21
|
+
* learns nothing about what is behind it.
|
|
22
|
+
*/
|
|
23
|
+
function header(headers, name) {
|
|
24
|
+
const value = headers[name];
|
|
25
|
+
return typeof value === 'string' ? value : undefined;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Whether a hostname is this machine.
|
|
29
|
+
*
|
|
30
|
+
* `localhost`, IPv6 loopback, and any `127.0.0.0/8` address. Everything else —
|
|
31
|
+
* including a public name that resolves to 127.0.0.1 through DNS rebinding — is
|
|
32
|
+
* rejected, because the *name* is what an attacker controls.
|
|
33
|
+
*
|
|
34
|
+
* @param hostname - the hostname from a Host or Origin header.
|
|
35
|
+
* @returns whether it denotes the local machine.
|
|
36
|
+
*/
|
|
37
|
+
export function isLoopbackHostname(hostname) {
|
|
38
|
+
if (hostname === 'localhost' || hostname === '[::1]')
|
|
39
|
+
return true;
|
|
40
|
+
const parts = hostname.split('.');
|
|
41
|
+
return (parts.length === 4 &&
|
|
42
|
+
parts[0] === '127' &&
|
|
43
|
+
parts.every((part) => /^\d{1,3}$/.test(part) && Number(part) <= 255));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Whether a request may reach the plugin API.
|
|
47
|
+
*
|
|
48
|
+
* @param request - the incoming request (only `headers` is read).
|
|
49
|
+
* @returns whether the request is same-origin and local.
|
|
50
|
+
*/
|
|
51
|
+
export function isTrustedApiRequest(request) {
|
|
52
|
+
const host = header(request.headers, 'host');
|
|
53
|
+
if (host === undefined)
|
|
54
|
+
return false;
|
|
55
|
+
let hostUrl;
|
|
56
|
+
try {
|
|
57
|
+
hostUrl = new URL(`http://${host}`);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
if (!isLoopbackHostname(hostUrl.hostname))
|
|
63
|
+
return false;
|
|
64
|
+
const origin = header(request.headers, 'origin');
|
|
65
|
+
if (origin !== undefined) {
|
|
66
|
+
let originUrl;
|
|
67
|
+
try {
|
|
68
|
+
originUrl = new URL(origin);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
if (!isLoopbackHostname(originUrl.hostname))
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
// `same-origin` is a normal fetch from the page; `none` is a direct
|
|
77
|
+
// navigation or a non-browser client. Anything else is cross-site.
|
|
78
|
+
const fetchSite = header(request.headers, 'sec-fetch-site');
|
|
79
|
+
if (fetchSite !== undefined && fetchSite !== 'same-origin' && fetchSite !== 'none') {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Wrap a handler so it only runs for trusted requests.
|
|
86
|
+
*
|
|
87
|
+
* @param handler - the route body.
|
|
88
|
+
* @returns a handler that answers 403 without a body when the fence rejects.
|
|
89
|
+
*/
|
|
90
|
+
export function guarded(handler) {
|
|
91
|
+
return async (req, res) => {
|
|
92
|
+
if (!isTrustedApiRequest(req)) {
|
|
93
|
+
res.statusCode = 403;
|
|
94
|
+
res.setHeader('content-type', 'application/json; charset=utf-8');
|
|
95
|
+
res.end(JSON.stringify({ ok: false, error: { code: 'forbidden' } }));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
await handler(req, res);
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=trust-fence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust-fence.js","sourceRoot":"","sources":["../src/trust-fence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AASH,SAAS,MAAM,CAAC,OAA4B,EAAE,IAAY;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AACtD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,IAAI,CAAA;IACjE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACjC,OAAO,CACL,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK;QAClB,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CACrE,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAwB;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC5C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IAEpC,IAAI,OAAY,CAAA;IAChB,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAA;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAA;IAEvD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAChD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,SAAc,CAAA;QAClB,IAAI,CAAC;YACH,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAA;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAA;IAC3D,CAAC;IAED,oEAAoE;IACpE,mEAAmE;IACnE,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAA;IAC3D,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,aAAa,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACnF,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CACrB,OAA4E;IAE5E,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACxB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,UAAU,GAAG,GAAG,CAAA;YACpB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAA;YAChE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,CAAA;YACpE,OAAM;QACR,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACzB,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The plugin's browser-facing HTTP surface.
|
|
3
|
+
*
|
|
4
|
+
* Three rules shape everything here:
|
|
5
|
+
*
|
|
6
|
+
* 1. **Only what the UI needs.** The panel asks for an overview, one node's
|
|
7
|
+
* detail, and a lesson. There is no general query surface.
|
|
8
|
+
* 2. **Views, never storage internals.** The browser receives a projection —
|
|
9
|
+
* ids, titles, relations, states, evidence — and never a raw record, a
|
|
10
|
+
* domain handle, a file path, or anything that would let it reason about
|
|
11
|
+
* where state lives. `storageDomain` is not reachable from the browser,
|
|
12
|
+
* by construction: this module is the only thing that touches it.
|
|
13
|
+
* 3. **Every request passes the trust fence**, and every body is parsed and
|
|
14
|
+
* validated here. A rejected caller gets 403 and learns nothing.
|
|
15
|
+
*
|
|
16
|
+
* Registered lazily on `webServer`, because a profile without a web surface
|
|
17
|
+
* should lose the UI rather than fail to load the plugin.
|
|
18
|
+
*/
|
|
19
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
20
|
+
import type { FocusPromptResult } from './prompt.js';
|
|
21
|
+
import type { UdState } from './state.js';
|
|
22
|
+
/** The slice of `webServer` this module uses, declared structurally. */
|
|
23
|
+
export interface WebServerLike {
|
|
24
|
+
register(route: {
|
|
25
|
+
kind: 'prefix';
|
|
26
|
+
path: string;
|
|
27
|
+
handler: (req: IncomingMessage, res: ServerResponse) => Promise<void> | void;
|
|
28
|
+
}): () => void;
|
|
29
|
+
}
|
|
30
|
+
/** Largest request body accepted, in bytes. */
|
|
31
|
+
export declare const MAX_BODY_BYTES: number;
|
|
32
|
+
/** Route prefix owned by this plugin. */
|
|
33
|
+
export declare const API_PREFIX = "/diagnostic-tutor/api";
|
|
34
|
+
export interface ApiDeps {
|
|
35
|
+
readonly state: UdState;
|
|
36
|
+
/**
|
|
37
|
+
* Wake the tutor for a session. Injected rather than reached for, so the API
|
|
38
|
+
* can be exercised without an agent registry.
|
|
39
|
+
*/
|
|
40
|
+
readonly prompt: (sessionId: string | undefined, text: string) => FocusPromptResult;
|
|
41
|
+
/**
|
|
42
|
+
* Whether a teaching brain was detected. Defaults to `true` so a caller that
|
|
43
|
+
* does not model one is not made to claim it is missing.
|
|
44
|
+
*/
|
|
45
|
+
readonly teachingBrain?: boolean | null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Build the request handler.
|
|
49
|
+
*
|
|
50
|
+
* @param deps - the open state handle and the prompt hook.
|
|
51
|
+
* @returns a handler suitable for `webServer.register`.
|
|
52
|
+
*/
|
|
53
|
+
export declare function createApiHandler(deps: ApiDeps): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Mount the API on the web server.
|
|
56
|
+
*
|
|
57
|
+
* @param server - the `webServer` service taken from `ctx`.
|
|
58
|
+
* @param deps - the open state handle and the prompt hook.
|
|
59
|
+
* @returns the route disposer.
|
|
60
|
+
*/
|
|
61
|
+
export declare function registerApi(server: WebServerLike, deps: ApiDeps): () => void;
|
|
62
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAYhE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,KAAK,EAAyC,OAAO,EAAE,MAAM,YAAY,CAAA;AAGhF,wEAAwE;AACxE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE;QACd,IAAI,EAAE,QAAQ,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;KAC7E,GAAG,MAAM,IAAI,CAAA;CACf;AAED,+CAA+C;AAC/C,eAAO,MAAM,cAAc,QAAY,CAAA;AAEvC,yCAAyC;AACzC,eAAO,MAAM,UAAU,0BAA0B,CAAA;AAiXjD,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,KAAK,iBAAiB,CAAA;IACnF;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;CACxC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,IAE9B,KAAK,eAAe,EAAE,KAAK,cAAc,KAAG,OAAO,CAAC,IAAI,CAAC,CA4BxE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,IAAI,CAM5E"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The host↔browser contract.
|
|
3
|
+
*
|
|
4
|
+
* Types only — this module has **no runtime imports at all**, so the client
|
|
5
|
+
* bundle can pull from it freely without dragging host code (or zod) into the
|
|
6
|
+
* browser. That separation is deliberate: the data schema lives in
|
|
7
|
+
* `lesson.ts` and `state.ts`, the renderers live in `client/`, and this file is
|
|
8
|
+
* the shape they agree on.
|
|
9
|
+
*
|
|
10
|
+
* These are **views**, not records. The browser never receives a storage
|
|
11
|
+
* record, a domain handle or a path; it receives exactly what the panel draws.
|
|
12
|
+
*/
|
|
13
|
+
export type { Block, BlockType, LessonRecord } from './lesson.js';
|
|
14
|
+
/** One node as the map draws it. */
|
|
15
|
+
export interface NodeView {
|
|
16
|
+
id: string;
|
|
17
|
+
title: string;
|
|
18
|
+
/** `goal | part-of | prerequisite | related` */
|
|
19
|
+
relation: string;
|
|
20
|
+
/**
|
|
21
|
+
* The skill's seven status terms. There is no numeric field here and there
|
|
22
|
+
* never will be: no percentage, no score, no stars.
|
|
23
|
+
*/
|
|
24
|
+
state: string;
|
|
25
|
+
parentId: string | null;
|
|
26
|
+
evidenceCount: number;
|
|
27
|
+
updatedAt: string;
|
|
28
|
+
}
|
|
29
|
+
/** One recorded observation. */
|
|
30
|
+
export interface EvidenceView {
|
|
31
|
+
kind: string;
|
|
32
|
+
at: string;
|
|
33
|
+
note?: string;
|
|
34
|
+
readiness?: string;
|
|
35
|
+
}
|
|
36
|
+
/** The goal the panel is showing. */
|
|
37
|
+
export interface CourseView {
|
|
38
|
+
id: string;
|
|
39
|
+
title: string;
|
|
40
|
+
goal: string;
|
|
41
|
+
status: string;
|
|
42
|
+
createdAt: string;
|
|
43
|
+
updatedAt: string;
|
|
44
|
+
}
|
|
45
|
+
/** The node the learner pressed Start learning on. A pointer, not a measure. */
|
|
46
|
+
export interface FocusView {
|
|
47
|
+
courseId: string;
|
|
48
|
+
nodeId: string;
|
|
49
|
+
nodeTitle: string;
|
|
50
|
+
startedAt: string;
|
|
51
|
+
status: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The tutor's recommendation, as the panel shows it.
|
|
55
|
+
*
|
|
56
|
+
* `targetNodeId` null means **stay on the current node** — the only encoding of
|
|
57
|
+
* "stay", so the panel never has to guess what a decision meant.
|
|
58
|
+
*/
|
|
59
|
+
export interface NextStepView {
|
|
60
|
+
fromNodeId: string;
|
|
61
|
+
fromNodeTitle: string;
|
|
62
|
+
targetNodeId: string | null;
|
|
63
|
+
targetNodeTitle: string | null;
|
|
64
|
+
/** One of the skill's six readiness outcomes. */
|
|
65
|
+
action: string;
|
|
66
|
+
reason: string;
|
|
67
|
+
createdAt: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* How a handoff is going, as a surface renders it.
|
|
71
|
+
*
|
|
72
|
+
* Every field is derived from the stored record and the clock; nothing here is
|
|
73
|
+
* written to the store as a progress state.
|
|
74
|
+
*/
|
|
75
|
+
export interface HandoffView {
|
|
76
|
+
/** The node being moved to — what a retry asks for again. */
|
|
77
|
+
targetNodeId: string;
|
|
78
|
+
phase: 'focus-recorded' | 'tutor-requested' | 'tutor-working' | 'lesson-ready' | 'failed' | 'stalled';
|
|
79
|
+
label: string;
|
|
80
|
+
elapsedMs: number;
|
|
81
|
+
attempts: number;
|
|
82
|
+
/** Per-stage durations so far, in milliseconds. Absent stages are omitted. */
|
|
83
|
+
stages: Record<string, number>;
|
|
84
|
+
detail?: string;
|
|
85
|
+
}
|
|
86
|
+
/** `GET /overview` — `course: null` means the learner has no goal yet. */
|
|
87
|
+
export interface OverviewResponse {
|
|
88
|
+
ok: true;
|
|
89
|
+
course: CourseView | null;
|
|
90
|
+
nodes: NodeView[];
|
|
91
|
+
focus: FocusView | null;
|
|
92
|
+
/** A decision the learner has not acted on yet, if there is one. */
|
|
93
|
+
nextStep: NextStepView | null;
|
|
94
|
+
/** The handoff for the focused node, so a reload rebuilds the progress line. */
|
|
95
|
+
handoff: HandoffView | null;
|
|
96
|
+
/**
|
|
97
|
+
* Whether the teaching brain is installed.
|
|
98
|
+
*
|
|
99
|
+
* `true` found, `false` confidently absent, `null` **cannot tell** — the
|
|
100
|
+
* registry reads the global layer alone without a viewing scope, and the
|
|
101
|
+
* standard web profile mounts skills per agent, so an empty catalog from a
|
|
102
|
+
* root-scope plugin means nothing. A surface must only warn on `false`.
|
|
103
|
+
*
|
|
104
|
+
* A tri-state rather than a name or version: the skill's own protocol forbids
|
|
105
|
+
* naming its files or versions in learner-facing text.
|
|
106
|
+
*/
|
|
107
|
+
teachingBrain: boolean | null;
|
|
108
|
+
lessonCount: number;
|
|
109
|
+
}
|
|
110
|
+
/** `GET /node?id=` */
|
|
111
|
+
export interface NodeDetailResponse {
|
|
112
|
+
ok: true;
|
|
113
|
+
node: NodeView & {
|
|
114
|
+
evidence: EvidenceView[];
|
|
115
|
+
};
|
|
116
|
+
parent: NodeView | null;
|
|
117
|
+
children: NodeView[];
|
|
118
|
+
lessonExists: boolean;
|
|
119
|
+
}
|
|
120
|
+
/** `GET /lesson?nodeId=` — `lesson: null` until the tutor has written one. */
|
|
121
|
+
export interface LessonResponse {
|
|
122
|
+
ok: true;
|
|
123
|
+
lesson: import('./lesson.js').LessonRecord | null;
|
|
124
|
+
}
|
|
125
|
+
/** `POST /focus { nodeId, sessionId? }` — the result of pressing Start learning. */
|
|
126
|
+
export interface FocusResponse {
|
|
127
|
+
ok: true;
|
|
128
|
+
focus: FocusView;
|
|
129
|
+
/** Whether the tutor was actually woken. */
|
|
130
|
+
prompted: boolean;
|
|
131
|
+
/** Why it was not, when it was not. The focus is recorded either way. */
|
|
132
|
+
promptReason?: string;
|
|
133
|
+
/** The progress record for this target. */
|
|
134
|
+
handoff: HandoffView | null;
|
|
135
|
+
/** True when an identical request was already in flight. */
|
|
136
|
+
deduped?: boolean;
|
|
137
|
+
}
|
|
138
|
+
/** Every failure shape the API produces. */
|
|
139
|
+
export interface ApiErrorResponse {
|
|
140
|
+
ok: false;
|
|
141
|
+
error: {
|
|
142
|
+
code: string;
|
|
143
|
+
message?: string;
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
export type ApiResponse<T> = T | ApiErrorResponse;
|
|
147
|
+
//# sourceMappingURL=contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diagnosis-map rules.
|
|
3
|
+
*
|
|
4
|
+
* Everything here is a pure function over records: no IO, no `ctx`, no clock.
|
|
5
|
+
* That is deliberate — this is the module that decides what the runtime is
|
|
6
|
+
* *allowed* to store, so it must be trivially testable and impossible to
|
|
7
|
+
* bypass from the tool layer.
|
|
8
|
+
*
|
|
9
|
+
* The rules exist to make two failures structurally impossible:
|
|
10
|
+
*
|
|
11
|
+
* 1. **Unverified mastery.** `confirmed` is unreachable without evidence the
|
|
12
|
+
* skill itself considers strong enough. A model cannot simply assert it.
|
|
13
|
+
* 2. **A curriculum in disguise.** Nodes must attach to a node that already
|
|
14
|
+
* exists, batches are small, and a course is capped. There is no call that
|
|
15
|
+
* plants a finished syllabus.
|
|
16
|
+
*
|
|
17
|
+
* These are floors, not pedagogy. Clearing them makes a state *permissible*;
|
|
18
|
+
* whether it is *right* remains the skill's judgement.
|
|
19
|
+
*/
|
|
20
|
+
import type { Evidence, NodeRecord } from './state.js';
|
|
21
|
+
import type { NodeState } from './vocabulary.js';
|
|
22
|
+
/**
|
|
23
|
+
* Most nodes one `udt_map_update` call may add.
|
|
24
|
+
*
|
|
25
|
+
* A diagnosis reveals a small cluster near the blocker, not a term's worth of
|
|
26
|
+
* material. The skill's own guidance for a broad goal is "the first one to
|
|
27
|
+
* three nodes"; eight leaves room for a genuine cluster while making a
|
|
28
|
+
* thirty-node dump impossible in one call.
|
|
29
|
+
*/
|
|
30
|
+
export declare const MAX_NODES_PER_UPDATE = 8;
|
|
31
|
+
/** Most nodes one course may accumulate. A map is a diagnosis aid, not a textbook. */
|
|
32
|
+
export declare const MAX_NODES_PER_COURSE = 40;
|
|
33
|
+
export type ViolationCode = 'confirmed-without-evidence' | 'goal-node-confirmed' | 'goal-node-has-parent' | 'goal-node-not-root' | 'multiple-goal-nodes' | 'missing-parent' | 'parent-in-other-course' | 'self-parent' | 'parent-cycle' | 'batch-too-large' | 'course-too-large' | 'duplicate-node-id';
|
|
34
|
+
export interface Violation {
|
|
35
|
+
readonly code: ViolationCode;
|
|
36
|
+
/** Learner-safe-ish explanation, aimed at the model that made the call. */
|
|
37
|
+
readonly message: string;
|
|
38
|
+
readonly nodeId?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Whether this node's state is permitted by its evidence.
|
|
42
|
+
*
|
|
43
|
+
* @param node - the record to check.
|
|
44
|
+
* @returns a violation, or `undefined` when the state is permissible.
|
|
45
|
+
*/
|
|
46
|
+
export declare function checkNodeState(node: NodeRecord): Violation | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* Validate one course's map as a whole.
|
|
49
|
+
*
|
|
50
|
+
* @param nodes - the nodes that would exist after the proposed change.
|
|
51
|
+
* @returns every violation found, in node order.
|
|
52
|
+
*/
|
|
53
|
+
export declare function validateMap(nodes: readonly NodeRecord[]): Violation[];
|
|
54
|
+
/**
|
|
55
|
+
* Build the record for a proposed new node and check it against the map.
|
|
56
|
+
*
|
|
57
|
+
* @param existing - the course's current nodes.
|
|
58
|
+
* @param proposed - the node as supplied, already shaped by `newNode`.
|
|
59
|
+
* @returns either the accepted record or the violations that rejected it.
|
|
60
|
+
*/
|
|
61
|
+
export declare function acceptNewNodes(existing: readonly NodeRecord[], proposed: readonly NodeRecord[]): {
|
|
62
|
+
ok: true;
|
|
63
|
+
nodes: NodeRecord[];
|
|
64
|
+
} | {
|
|
65
|
+
ok: false;
|
|
66
|
+
violations: Violation[];
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Move a node to a new state without recording new evidence.
|
|
70
|
+
*
|
|
71
|
+
* Used when the *reading* of existing evidence changes — the skill re-grades
|
|
72
|
+
* what it already saw. The resulting record is validated by the same rule as
|
|
73
|
+
* everything else, so this is not a bypass: a bare assertion still cannot
|
|
74
|
+
* promote a node to `confirmed`.
|
|
75
|
+
*
|
|
76
|
+
* @param node - the node being updated.
|
|
77
|
+
* @param next - the proposed state.
|
|
78
|
+
* @param now - ISO timestamp for `updatedAt`.
|
|
79
|
+
* @returns either the updated record or the violation that rejected it.
|
|
80
|
+
*/
|
|
81
|
+
export declare function setNodeState(node: NodeRecord, next: NodeState, now: string): {
|
|
82
|
+
ok: true;
|
|
83
|
+
node: NodeRecord;
|
|
84
|
+
} | {
|
|
85
|
+
ok: false;
|
|
86
|
+
violations: Violation[];
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Append one evidence entry and optionally move the node's state.
|
|
90
|
+
*
|
|
91
|
+
* A state change that is not permitted by the resulting evidence is refused
|
|
92
|
+
* outright, so the stored record can never be inconsistent.
|
|
93
|
+
*
|
|
94
|
+
* @param node - the node being updated.
|
|
95
|
+
* @param evidence - the observation to record.
|
|
96
|
+
* @param options.now - ISO timestamp for `updatedAt`.
|
|
97
|
+
* @param options.state - optional new state.
|
|
98
|
+
* @returns either the updated record or the violation that rejected it.
|
|
99
|
+
*/
|
|
100
|
+
export declare function recordEvidence(node: NodeRecord, evidence: Evidence, options: {
|
|
101
|
+
now: string;
|
|
102
|
+
state?: NodeState;
|
|
103
|
+
}): {
|
|
104
|
+
ok: true;
|
|
105
|
+
node: NodeRecord;
|
|
106
|
+
} | {
|
|
107
|
+
ok: false;
|
|
108
|
+
violations: Violation[];
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* The state a node is allowed to be created in when the caller supplies none.
|
|
112
|
+
*
|
|
113
|
+
* @returns the born state.
|
|
114
|
+
*/
|
|
115
|
+
export declare function bornState(): NodeState;
|
|
116
|
+
//# sourceMappingURL=diagnosis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnosis.d.ts","sourceRoot":"","sources":["../../src/diagnosis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAMhD;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,IAAI,CAAA;AAErC,sFAAsF;AACtF,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAMtC,MAAM,MAAM,aAAa,GACrB,4BAA4B,GAC5B,qBAAqB,GACrB,sBAAsB,GACtB,oBAAoB,GACpB,qBAAqB,GACrB,gBAAgB,GAChB,wBAAwB,GACxB,aAAa,GACb,cAAc,GACd,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,CAAA;AAEvB,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAUD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAsBtE;AAMD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,EAAE,CAqFrE;AAMD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,SAAS,UAAU,EAAE,EAC/B,QAAQ,EAAE,SAAS,UAAU,EAAE,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,SAAS,EAAE,CAAA;CAAE,CAwC5E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,MAAM,GACV;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,SAAS,EAAE,CAAA;CAAE,CAKzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,GAC1C;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,SAAS,EAAE,CAAA;CAAE,CAYzE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAErC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The handoff: what happens between pressing Continue and seeing a lesson.
|
|
3
|
+
*
|
|
4
|
+
* Moving from one node to another is not instant — the runtime records a focus,
|
|
5
|
+
* an agent is woken, a model turn runs, and only then does a lesson exist. That
|
|
6
|
+
* gap used to be silent, which is the worst thing a gap can be: the learner
|
|
7
|
+
* cannot tell "working" from "broken", and a seven-minute turn is
|
|
8
|
+
* indistinguishable from a dead button.
|
|
9
|
+
*
|
|
10
|
+
* So the handoff is a **persisted record with timestamps**, and everything the
|
|
11
|
+
* UI shows about progress is derived from it. Persisting it is what makes the
|
|
12
|
+
* behaviours that matter possible at all:
|
|
13
|
+
*
|
|
14
|
+
* - **idempotent** — keyed by target node, so pressing Continue twice is one
|
|
15
|
+
* handoff, not two;
|
|
16
|
+
* - **refresh-proof** — a reload re-reads the same record;
|
|
17
|
+
* - **restart-proof** — the record outlives the process;
|
|
18
|
+
* - **retryable** — the attempt count and timestamps say whether the tutor
|
|
19
|
+
* ever answered, so a retry is informed rather than blind;
|
|
20
|
+
* - **non-destructive on timeout** — a timeout is a statement about the
|
|
21
|
+
* *wait*, never about the focus. The record goes stale; the focus stands.
|
|
22
|
+
*
|
|
23
|
+
* The timestamps are also the measurement. `requestedAt → focusRecordedAt →
|
|
24
|
+
* promptedAt → firstActivityAt → lessonAt → observedAt` is the whole chain, so
|
|
25
|
+
* "where did the time go" is a question with an answer rather than an
|
|
26
|
+
* argument.
|
|
27
|
+
*/
|
|
28
|
+
import { z } from 'zod';
|
|
29
|
+
/**
|
|
30
|
+
* Where a handoff has got to.
|
|
31
|
+
*
|
|
32
|
+
* `requested` the button was pressed; nothing has been persisted yet
|
|
33
|
+
* `prompted` the focus is recorded and the tutor was woken
|
|
34
|
+
* `working` the agent has produced its first event since being woken
|
|
35
|
+
* `ready` a lesson exists for the target node
|
|
36
|
+
* `failed` the tutor could not be reached
|
|
37
|
+
*
|
|
38
|
+
* There is deliberately no `timeout` status: a timeout is the *reader's*
|
|
39
|
+
* judgement about a record that has stopped moving, and storing it would mean
|
|
40
|
+
* writing to a record because time passed. The UI derives it from `updatedAt`.
|
|
41
|
+
*/
|
|
42
|
+
export declare const HANDOFF_STATUSES: readonly ["requested", "prompted", "working", "ready", "failed"];
|
|
43
|
+
export declare const HandoffStatusSchema: z.ZodEnum<{
|
|
44
|
+
requested: "requested";
|
|
45
|
+
prompted: "prompted";
|
|
46
|
+
working: "working";
|
|
47
|
+
ready: "ready";
|
|
48
|
+
failed: "failed";
|
|
49
|
+
}>;
|
|
50
|
+
export type HandoffStatus = z.infer<typeof HandoffStatusSchema>;
|
|
51
|
+
export declare const HandoffSchema: z.ZodObject<{
|
|
52
|
+
targetNodeId: z.ZodString;
|
|
53
|
+
courseId: z.ZodString;
|
|
54
|
+
fromNodeId: z.ZodString;
|
|
55
|
+
status: z.ZodEnum<{
|
|
56
|
+
requested: "requested";
|
|
57
|
+
prompted: "prompted";
|
|
58
|
+
working: "working";
|
|
59
|
+
ready: "ready";
|
|
60
|
+
failed: "failed";
|
|
61
|
+
}>;
|
|
62
|
+
attempts: z.ZodNumber;
|
|
63
|
+
sessionId: z.ZodOptional<z.ZodString>;
|
|
64
|
+
requestedAt: z.ZodString;
|
|
65
|
+
focusRecordedAt: z.ZodOptional<z.ZodString>;
|
|
66
|
+
promptedAt: z.ZodOptional<z.ZodString>;
|
|
67
|
+
firstActivityAt: z.ZodOptional<z.ZodString>;
|
|
68
|
+
lessonAt: z.ZodOptional<z.ZodString>;
|
|
69
|
+
observedAt: z.ZodOptional<z.ZodString>;
|
|
70
|
+
failedAt: z.ZodOptional<z.ZodString>;
|
|
71
|
+
failureReason: z.ZodOptional<z.ZodString>;
|
|
72
|
+
updatedAt: z.ZodString;
|
|
73
|
+
}, z.core.$strip>;
|
|
74
|
+
export type HandoffRecord = z.infer<typeof HandoffSchema>;
|
|
75
|
+
export type HandoffKey = string;
|
|
76
|
+
/** Start (or restart) a handoff for a target node. */
|
|
77
|
+
export declare function beginHandoff(input: {
|
|
78
|
+
courseId: string;
|
|
79
|
+
fromNodeId: string;
|
|
80
|
+
targetNodeId: string;
|
|
81
|
+
now: string;
|
|
82
|
+
sessionId?: string | undefined;
|
|
83
|
+
/** A previous record for this node, when this is a retry. */
|
|
84
|
+
previous?: HandoffRecord | undefined;
|
|
85
|
+
}): HandoffRecord;
|
|
86
|
+
export declare function withFocusRecorded(record: HandoffRecord, now: string): HandoffRecord;
|
|
87
|
+
export declare function withPrompted(record: HandoffRecord, now: string): HandoffRecord;
|
|
88
|
+
export declare function withPromptFailure(record: HandoffRecord, now: string, reason: string): HandoffRecord;
|
|
89
|
+
/**
|
|
90
|
+
* Record the tutor's first sign of activity.
|
|
91
|
+
*
|
|
92
|
+
* Only the first one is kept: this answers "how long until it started", and a
|
|
93
|
+
* later event would answer a different question.
|
|
94
|
+
*/
|
|
95
|
+
export declare function withActivity(record: HandoffRecord, now: string): HandoffRecord;
|
|
96
|
+
export declare function withLesson(record: HandoffRecord, now: string): HandoffRecord;
|
|
97
|
+
export declare function withObserved(record: HandoffRecord, now: string): HandoffRecord;
|
|
98
|
+
/** What the UI should say. */
|
|
99
|
+
export type HandoffPhase = 'focus-recorded' | 'tutor-requested' | 'tutor-working' | 'lesson-ready' | 'failed' | 'stalled';
|
|
100
|
+
/**
|
|
101
|
+
* How long a surface waits before calling a quiet handoff stalled.
|
|
102
|
+
*
|
|
103
|
+
* Long, on purpose: a real model turn on a large node has taken minutes here,
|
|
104
|
+
* and telling a learner the tutor is broken while it is still thinking is worse
|
|
105
|
+
* than a longer wait. A stall is a prompt to retry, never a verdict.
|
|
106
|
+
*/
|
|
107
|
+
export declare const STALL_AFTER_MS = 150000;
|
|
108
|
+
export interface HandoffView {
|
|
109
|
+
/** The node being moved to — what a retry asks for again. */
|
|
110
|
+
targetNodeId: string;
|
|
111
|
+
phase: HandoffPhase;
|
|
112
|
+
/** Plain-language line for the learner. */
|
|
113
|
+
label: string;
|
|
114
|
+
/** Milliseconds since the request, for the timing readout. */
|
|
115
|
+
elapsedMs: number;
|
|
116
|
+
attempts: number;
|
|
117
|
+
/**
|
|
118
|
+
* How long after the request each stage was reached, in milliseconds.
|
|
119
|
+
*
|
|
120
|
+
* Cumulative from `requestedAt`, not deltas: the question a learner and a
|
|
121
|
+
* maintainer both ask is "when did it get here", and cumulative numbers stay
|
|
122
|
+
* readable when a stage is skipped.
|
|
123
|
+
*/
|
|
124
|
+
stages: Record<string, number>;
|
|
125
|
+
/** Present when the phase is `failed` or `stalled`. */
|
|
126
|
+
detail?: string;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Derive what a surface should show.
|
|
130
|
+
*
|
|
131
|
+
* `stalled` is computed, not stored: a record that has stopped moving is not a
|
|
132
|
+
* different record, and writing to it because time passed would make the store
|
|
133
|
+
* a clock.
|
|
134
|
+
*
|
|
135
|
+
* @param record - the handoff.
|
|
136
|
+
* @param nowMs - current time, injected so this is testable.
|
|
137
|
+
* @param hasLesson - whether a lesson for the target node already exists.
|
|
138
|
+
* @returns the phase, a label, the elapsed time and the stage breakdown.
|
|
139
|
+
*/
|
|
140
|
+
export declare function handoffView(record: HandoffRecord, nowMs: number, hasLesson: boolean): HandoffView;
|
|
141
|
+
//# sourceMappingURL=handoff.d.ts.map
|