@superbuilders/primer-tives 0.5.0 → 0.8.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/README.md +294 -481
- package/dist/client/choice-state.d.ts.map +1 -0
- package/dist/client/consumed.d.ts.map +1 -0
- package/dist/client/content.d.ts.map +1 -0
- package/dist/{client.d.ts → client/create.d.ts} +7 -5
- package/dist/client/create.d.ts.map +1 -0
- package/dist/client/extended-text-state.d.ts.map +1 -0
- package/dist/client/feedback-state.d.ts.map +1 -0
- package/dist/{index.d.ts → client/index.d.ts} +7 -5
- package/dist/client/index.d.ts.map +1 -0
- package/dist/{index.js → client/index.js} +81 -47
- package/dist/client/index.js.map +24 -0
- package/dist/client/match-state.d.ts.map +1 -0
- package/dist/client/observation-state.d.ts.map +1 -0
- package/dist/client/order-state.d.ts.map +1 -0
- package/dist/client/pci-state.d.ts.map +1 -0
- package/dist/client/pci.d.ts.map +1 -0
- package/dist/{session-context.d.ts → client/session-context.d.ts} +4 -7
- package/dist/client/session-context.d.ts.map +1 -0
- package/dist/{session.d.ts → client/session.d.ts} +4 -2
- package/dist/client/session.d.ts.map +1 -0
- package/dist/client/text-entry-state.d.ts.map +1 -0
- package/dist/{transport.d.ts → client/transport.d.ts} +5 -4
- package/dist/client/transport.d.ts.map +1 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/errors.d.ts +8 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/grade-level.d.ts +5 -0
- package/dist/grade-level.d.ts.map +1 -0
- package/dist/logger.d.ts +8 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/server/create-server.d.ts +42 -0
- package/dist/server/create-server.d.ts.map +1 -0
- package/dist/server/exchange.d.ts +17 -0
- package/dist/server/exchange.d.ts.map +1 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +259 -0
- package/dist/server/index.js.map +14 -0
- package/dist/server/students.d.ts +14 -0
- package/dist/server/students.d.ts.map +1 -0
- package/dist/subject.d.ts +6 -0
- package/dist/subject.d.ts.map +1 -0
- package/package.json +8 -4
- package/dist/choice-state.d.ts.map +0 -1
- package/dist/client.d.ts.map +0 -1
- package/dist/consumed.d.ts.map +0 -1
- package/dist/content.d.ts.map +0 -1
- package/dist/extended-text-state.d.ts.map +0 -1
- package/dist/feedback-state.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -23
- package/dist/match-state.d.ts.map +0 -1
- package/dist/observation-state.d.ts.map +0 -1
- package/dist/order-state.d.ts.map +0 -1
- package/dist/pci-state.d.ts.map +0 -1
- package/dist/pci.d.ts.map +0 -1
- package/dist/session-context.d.ts.map +0 -1
- package/dist/session.d.ts.map +0 -1
- package/dist/text-entry-state.d.ts.map +0 -1
- package/dist/transport.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- /package/dist/{choice-state.d.ts → client/choice-state.d.ts} +0 -0
- /package/dist/{consumed.d.ts → client/consumed.d.ts} +0 -0
- /package/dist/{content.d.ts → client/content.d.ts} +0 -0
- /package/dist/{extended-text-state.d.ts → client/extended-text-state.d.ts} +0 -0
- /package/dist/{feedback-state.d.ts → client/feedback-state.d.ts} +0 -0
- /package/dist/{match-state.d.ts → client/match-state.d.ts} +0 -0
- /package/dist/{observation-state.d.ts → client/observation-state.d.ts} +0 -0
- /package/dist/{order-state.d.ts → client/order-state.d.ts} +0 -0
- /package/dist/{pci-state.d.ts → client/pci-state.d.ts} +0 -0
- /package/dist/{pci.d.ts → client/pci.d.ts} +0 -0
- /package/dist/{text-entry-state.d.ts → client/text-entry-state.d.ts} +0 -0
- /package/dist/{types.d.ts → client/types.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"choice-state.d.ts","sourceRoot":"","sources":["../../src/client/choice-state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAA;AACxF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAA;AACnE,OAAO,KAAK,EACX,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,MAAM,0CAA0C,CAAA;AA6CjD,iBAAS,WAAW,CAAC,IAAI,SAAS,KAAK,EACtC,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC,EACzB,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EACjC,WAAW,EAAE,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,EACnE,OAAO,EAAE,cAAc,EAAE,EACzB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAChB,WAAW,CAAC,IAAI,CAAC,CAsFnB;AAED,OAAO,EAAE,WAAW,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consumed.d.ts","sourceRoot":"","sources":["../../src/client/consumed.ts"],"names":[],"mappings":"AAEA,iBAAS,YAAY,IAAI,KAAK,CAG7B;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/client/content.ts"],"names":[],"mappings":"AAAA,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtF,KAAK,aAAa,GAAG,WAAW,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAEnE,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAA;CAAE,CAAA;AAEpE,iBAAS,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAgB1D;AAED,iBAAS,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAMzD;AAED,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAA"}
|
|
@@ -1,18 +1,20 @@
|
|
|
1
|
+
import type { PrimerLogger } from "../logger";
|
|
1
2
|
import type { PciId } from "./pci";
|
|
2
|
-
import type {
|
|
3
|
+
import type { SubjectScope } from "../subject";
|
|
3
4
|
import type { PrimerState } from "./types";
|
|
4
5
|
interface Config<Pcis extends PciId = PciId> {
|
|
5
|
-
readonly
|
|
6
|
+
readonly accessToken: string;
|
|
6
7
|
readonly supportedPcis: readonly Pcis[];
|
|
7
8
|
readonly origin: string;
|
|
9
|
+
readonly subject: SubjectScope;
|
|
8
10
|
readonly fetch?: typeof globalThis.fetch;
|
|
9
11
|
readonly abort?: AbortController;
|
|
10
12
|
readonly logger?: PrimerLogger;
|
|
11
13
|
}
|
|
12
14
|
interface Client<Pcis extends PciId = PciId> {
|
|
13
|
-
start(
|
|
15
|
+
start(): Promise<PrimerState<Pcis>>;
|
|
14
16
|
}
|
|
15
17
|
declare function create<const Pcis extends PciId>(config: Config<Pcis>): Client<Pcis>;
|
|
16
18
|
export { create };
|
|
17
|
-
export type { Client, Config
|
|
18
|
-
//# sourceMappingURL=
|
|
19
|
+
export type { Client, Config };
|
|
20
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/client/create.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAA;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAA;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAA;AAM3E,UAAU,MAAM,CAAC,IAAI,SAAS,KAAK,GAAG,KAAK;IAC1C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,aAAa,EAAE,SAAS,IAAI,EAAE,CAAA;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAA;CAC9B;AAED,UAAU,MAAM,CAAC,IAAI,SAAS,KAAK,GAAG,KAAK;IAC1C,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAA;CACnC;AAUD,iBAAS,MAAM,CAAC,KAAK,CAAC,IAAI,SAAS,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CA4C5E;AAED,OAAO,EAAE,MAAM,EAAE,CAAA;AACjB,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extended-text-state.d.ts","sourceRoot":"","sources":["../../src/client/extended-text-state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAA;AACxF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAA;AACnE,OAAO,KAAK,EACX,WAAW,EACX,gBAAgB,EAChB,2BAA2B,EAC3B,MAAM,0CAA0C,CAAA;AAoBjD,iBAAS,iBAAiB,CAAC,IAAI,SAAS,KAAK,EAC5C,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC,EACzB,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EACjC,WAAW,EAAE,OAAO,CAAC,2BAA2B,EAAE;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,CAAC,GAC1E,WAAW,CAAC,IAAI,CAAC,CA0JnB;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-state.d.ts","sourceRoot":"","sources":["../../src/client/feedback-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAA;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAA;AACxF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAA;AACnE,OAAO,KAAK,EACX,iBAAiB,EACjB,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,MAAM,0CAA0C,CAAA;AAEjD,iBAAS,aAAa,CAAC,IAAI,SAAS,KAAK,EACxC,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC,EACzB,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EACjC,WAAW,EAAE,mBAAmB,CAAC,IAAI,CAAC,EACtC,UAAU,EAAE,kBAAkB,CAAC,IAAI,CAAC,EACpC,SAAS,EAAE,OAAO,EAClB,eAAe,EAAE,aAAa,EAAE,EAChC,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC,GAAG,IAAI,GACpC,WAAW,CAAC,IAAI,CAAC,CAmBnB;AAED,OAAO,EAAE,aAAa,EAAE,CAAA"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
export { create } from "./
|
|
2
|
-
export type { Client, Config
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export type {
|
|
1
|
+
export { create } from "./create";
|
|
2
|
+
export type { Client, Config } from "./create";
|
|
3
|
+
export type { PrimerLogger } from "../logger";
|
|
4
|
+
export { SUBJECTS } from "../subject";
|
|
5
|
+
export type { Subject, SubjectScope } from "../subject";
|
|
6
|
+
export { ErrBadRequest, ErrConflict, ErrForbidden, ErrInvalidAccessToken, ErrInvalidSubmission, ErrJsonParse, ErrMalformedAccessToken, ErrNetwork, ErrNotFound, ErrNotSerializable, ErrRateLimited, ErrServerError, ErrServiceUnavailable, ErrTimeout, ErrTokenExpired, ErrUnsupportedPci } from "../errors";
|
|
7
|
+
export type { BodyStimulus, ChoiceReview, ChoiceState, CompletedState, ErroredState, ExtendedTextMultipleState, ExtendedTextReview, ExtendedTextSingleState, ExtendedTextState, FatalState, FeedbackState, ImageStimulus, InteractionReview, InteractionState, MatchPair, MatchReview, MatchState, NonSerializable, ObservationState, OrderReview, OrderState, PciInteraction, PciInteractionState, PciPendingRenderProps, PciRenderProps, PciReview, PciSubmission, PciSubmittedRenderProps, PrimerState, RendererChoice, RendererInteraction, RendererMatchChoice, RendererStimulus, RendererSubmission, ReviewRecordField, ReviewRecordFieldBaseType, ReviewScalarValue, StandardRendererInteraction, TextEntryReview, TextEntryState } from "./types";
|
|
6
8
|
export type { ContentBlock, ContentInline, ContentSpan } from "./content";
|
|
7
9
|
export { blocksToPlainText, inlinesToPlainText } from "./content";
|
|
8
10
|
export type { DivisionRemainderProps, DivisionRemainderSubmission, FractionAdditionProps, FractionAdditionSubmission, PciId, PciProps, PciRegistry, PciUrn, PciValue } from "./pci";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAClE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAE/E,YAAY,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AAEtE,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAA;AAC9D,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAA;AAEhF,OAAO,EACN,aAAa,EACb,WAAW,EACX,YAAY,EACZ,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACZ,uBAAuB,EACvB,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,MAAM,oCAAoC,CAAA;AAE3C,YAAY,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,EACd,YAAY,EACZ,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,SAAS,EACT,aAAa,EACb,uBAAuB,EACvB,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,EACzB,iBAAiB,EACjB,2BAA2B,EAC3B,eAAe,EACf,cAAc,EACd,MAAM,0CAA0C,CAAA;AAEjD,YAAY,EACX,YAAY,EACZ,aAAa,EACb,WAAW,EACX,MAAM,4CAA4C,CAAA;AACnD,OAAO,EACN,iBAAiB,EACjB,kBAAkB,EAClB,MAAM,4CAA4C,CAAA;AAEnD,YAAY,EACX,sBAAsB,EACtB,2BAA2B,EAC3B,qBAAqB,EACrB,0BAA0B,EAC1B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,MAAM,EACN,QAAQ,EACR,MAAM,wCAAwC,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// src/client.ts
|
|
1
|
+
// src/client/create.ts
|
|
2
2
|
import * as errors10 from "@superbuilders/errors";
|
|
3
3
|
|
|
4
4
|
// src/errors.ts
|
|
@@ -6,7 +6,9 @@ import * as errors from "@superbuilders/errors";
|
|
|
6
6
|
var ErrNetwork = errors.new("network");
|
|
7
7
|
var ErrJsonParse = errors.new("json parse");
|
|
8
8
|
var ErrUnsupportedPci = errors.new("unsupported pci");
|
|
9
|
-
var
|
|
9
|
+
var ErrInvalidAccessToken = errors.new("invalid access token");
|
|
10
|
+
var ErrMalformedAccessToken = errors.new("malformed access token");
|
|
11
|
+
var ErrTokenExpired = errors.new("access token expired");
|
|
10
12
|
var ErrBadRequest = errors.new("bad request");
|
|
11
13
|
var ErrServerError = errors.new("server error");
|
|
12
14
|
var ErrTimeout = errors.new("timeout");
|
|
@@ -17,9 +19,12 @@ var ErrRateLimited = errors.new("rate limited");
|
|
|
17
19
|
var ErrServiceUnavailable = errors.new("service unavailable");
|
|
18
20
|
var ErrNotSerializable = errors.new("PrimerState is live in-memory state and must not be serialized or stored");
|
|
19
21
|
var ErrInvalidSubmission = errors.new("invalid submission");
|
|
20
|
-
var
|
|
22
|
+
var ErrInvalidSecretKey = errors.new("invalid secret key");
|
|
23
|
+
var ErrStudentNotFound = errors.new("student not found");
|
|
24
|
+
var ErrUnsupportedGrade = errors.new("unsupported grade");
|
|
25
|
+
var ErrTimebackUnavailable = errors.new("timeback unavailable");
|
|
21
26
|
|
|
22
|
-
// src/transport.ts
|
|
27
|
+
// src/client/transport.ts
|
|
23
28
|
import * as errors2 from "@superbuilders/errors";
|
|
24
29
|
var ADVANCE_PATH = "/api/v0/advance";
|
|
25
30
|
function httpSentinel(status) {
|
|
@@ -27,7 +32,7 @@ function httpSentinel(status) {
|
|
|
27
32
|
return ErrBadRequest;
|
|
28
33
|
}
|
|
29
34
|
if (status === 401) {
|
|
30
|
-
return
|
|
35
|
+
return ErrInvalidAccessToken;
|
|
31
36
|
}
|
|
32
37
|
if (status === 403) {
|
|
33
38
|
return ErrForbidden;
|
|
@@ -66,15 +71,15 @@ function createTransport(tc) {
|
|
|
66
71
|
}
|
|
67
72
|
async function transport(body) {
|
|
68
73
|
log?.debug("transport request", {
|
|
69
|
-
|
|
70
|
-
|
|
74
|
+
intentKind: body.intent.kind,
|
|
75
|
+
subject: body.subject
|
|
71
76
|
});
|
|
72
77
|
const url = `${tc.origin}${ADVANCE_PATH}`;
|
|
73
78
|
const fetchResult = await fetchFn(url, {
|
|
74
79
|
method: "POST",
|
|
75
80
|
headers: {
|
|
76
81
|
"Content-Type": "application/json",
|
|
77
|
-
Authorization: `Bearer ${tc.
|
|
82
|
+
Authorization: `Bearer ${tc.accessToken}`
|
|
78
83
|
},
|
|
79
84
|
body: JSON.stringify(body),
|
|
80
85
|
signal: transportSignal()
|
|
@@ -86,13 +91,11 @@ function createTransport(tc) {
|
|
|
86
91
|
if (!fetchResult.ok) {
|
|
87
92
|
if (isAbortError(fetchResult.error)) {
|
|
88
93
|
log?.error("transport timeout", {
|
|
89
|
-
studentId: body.studentId,
|
|
90
94
|
intentKind: body.intent.kind
|
|
91
95
|
});
|
|
92
96
|
return { ok: false, error: errors2.wrap(ErrTimeout, fetchResult.error.message) };
|
|
93
97
|
}
|
|
94
98
|
log?.error("transport network error", {
|
|
95
|
-
studentId: body.studentId,
|
|
96
99
|
error: fetchResult.error
|
|
97
100
|
});
|
|
98
101
|
return { ok: false, error: errors2.wrap(ErrNetwork, fetchResult.error.message) };
|
|
@@ -104,7 +107,6 @@ function createTransport(tc) {
|
|
|
104
107
|
});
|
|
105
108
|
const sentinel = res.status === 422 ? ErrUnsupportedPci : httpSentinel(res.status);
|
|
106
109
|
log?.error("transport http error", {
|
|
107
|
-
studentId: body.studentId,
|
|
108
110
|
status: res.status
|
|
109
111
|
});
|
|
110
112
|
return { ok: false, error: errors2.wrap(sentinel, text) };
|
|
@@ -116,13 +118,11 @@ function createTransport(tc) {
|
|
|
116
118
|
});
|
|
117
119
|
if (!jsonResult.ok) {
|
|
118
120
|
log?.error("transport json parse failed", {
|
|
119
|
-
studentId: body.studentId,
|
|
120
121
|
error: jsonResult.error
|
|
121
122
|
});
|
|
122
123
|
return { ok: false, error: errors2.wrap(ErrJsonParse, jsonResult.error.message) };
|
|
123
124
|
}
|
|
124
125
|
log?.debug("transport success", {
|
|
125
|
-
studentId: body.studentId,
|
|
126
126
|
intentKind: body.intent.kind
|
|
127
127
|
});
|
|
128
128
|
return { ok: true, data: jsonResult.data };
|
|
@@ -130,15 +130,15 @@ function createTransport(tc) {
|
|
|
130
130
|
return transport;
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
-
// src/session.ts
|
|
133
|
+
// src/client/session.ts
|
|
134
134
|
import * as errors9 from "@superbuilders/errors";
|
|
135
135
|
|
|
136
|
-
// src/consumed.ts
|
|
136
|
+
// src/client/consumed.ts
|
|
137
137
|
function poisonToJSON() {
|
|
138
138
|
throw ErrNotSerializable;
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
-
// src/choice-state.ts
|
|
141
|
+
// src/client/choice-state.ts
|
|
142
142
|
import * as errors3 from "@superbuilders/errors";
|
|
143
143
|
function findUnknownKey(selectedKeys, options) {
|
|
144
144
|
const optionIds = new Set(options.map(function getId(o) {
|
|
@@ -226,7 +226,7 @@ function choiceState(ctx, stimulus, interaction, options, maxChoices, minChoices
|
|
|
226
226
|
};
|
|
227
227
|
}
|
|
228
228
|
|
|
229
|
-
// src/extended-text-state.ts
|
|
229
|
+
// src/client/extended-text-state.ts
|
|
230
230
|
import * as errors4 from "@superbuilders/errors";
|
|
231
231
|
function validateExtendedTextSubmission(log, values, minStrings, maxStrings) {
|
|
232
232
|
if (values.length < minStrings) {
|
|
@@ -340,7 +340,7 @@ function extendedTextState(ctx, stimulus, interaction) {
|
|
|
340
340
|
};
|
|
341
341
|
}
|
|
342
342
|
|
|
343
|
-
// src/feedback-state.ts
|
|
343
|
+
// src/client/feedback-state.ts
|
|
344
344
|
function feedbackState(ctx, stimulus, interaction, submission, isCorrect, feedbackContent, review) {
|
|
345
345
|
let pending;
|
|
346
346
|
return {
|
|
@@ -362,7 +362,7 @@ function feedbackState(ctx, stimulus, interaction, submission, isCorrect, feedba
|
|
|
362
362
|
};
|
|
363
363
|
}
|
|
364
364
|
|
|
365
|
-
// src/match-state.ts
|
|
365
|
+
// src/client/match-state.ts
|
|
366
366
|
import * as errors5 from "@superbuilders/errors";
|
|
367
367
|
function bumpCount(counts, key) {
|
|
368
368
|
const prev = counts.get(key);
|
|
@@ -505,7 +505,7 @@ function matchState(ctx, stimulus, interaction) {
|
|
|
505
505
|
};
|
|
506
506
|
}
|
|
507
507
|
|
|
508
|
-
// src/observation-state.ts
|
|
508
|
+
// src/client/observation-state.ts
|
|
509
509
|
function observationState(ctx, stimulus) {
|
|
510
510
|
let pending;
|
|
511
511
|
return {
|
|
@@ -522,7 +522,7 @@ function observationState(ctx, stimulus) {
|
|
|
522
522
|
};
|
|
523
523
|
}
|
|
524
524
|
|
|
525
|
-
// src/order-state.ts
|
|
525
|
+
// src/client/order-state.ts
|
|
526
526
|
import * as errors6 from "@superbuilders/errors";
|
|
527
527
|
function findUnknownKey2(orderedKeys, choices) {
|
|
528
528
|
const choiceIds = new Set(choices.map(function getId(c) {
|
|
@@ -610,7 +610,7 @@ function orderState(ctx, stimulus, interaction) {
|
|
|
610
610
|
};
|
|
611
611
|
}
|
|
612
612
|
|
|
613
|
-
// src/pci-state.ts
|
|
613
|
+
// src/client/pci-state.ts
|
|
614
614
|
import * as errors7 from "@superbuilders/errors";
|
|
615
615
|
function pciInteractionState(ctx, stimulus, interaction) {
|
|
616
616
|
let submitPending;
|
|
@@ -664,7 +664,7 @@ function pciInteractionState(ctx, stimulus, interaction) {
|
|
|
664
664
|
};
|
|
665
665
|
}
|
|
666
666
|
|
|
667
|
-
// src/text-entry-state.ts
|
|
667
|
+
// src/client/text-entry-state.ts
|
|
668
668
|
import * as errors8 from "@superbuilders/errors";
|
|
669
669
|
function textEntryState(ctx, stimulus, interaction) {
|
|
670
670
|
let submitPending;
|
|
@@ -713,10 +713,11 @@ function textEntryState(ctx, stimulus, interaction) {
|
|
|
713
713
|
};
|
|
714
714
|
}
|
|
715
715
|
|
|
716
|
-
// src/session.ts
|
|
716
|
+
// src/client/session.ts
|
|
717
717
|
var FATAL_SENTINELS = [
|
|
718
718
|
ErrBadRequest,
|
|
719
|
-
|
|
719
|
+
ErrInvalidAccessToken,
|
|
720
|
+
ErrTokenExpired,
|
|
720
721
|
ErrForbidden,
|
|
721
722
|
ErrNotFound,
|
|
722
723
|
ErrUnsupportedPci
|
|
@@ -734,9 +735,11 @@ function isRetriableError(err) {
|
|
|
734
735
|
}
|
|
735
736
|
function makeSession(sc) {
|
|
736
737
|
const log = sc.log;
|
|
738
|
+
let currentFrameContext = null;
|
|
737
739
|
function resolve(result) {
|
|
738
740
|
switch (result.outcome) {
|
|
739
741
|
case "advanced":
|
|
742
|
+
currentFrameContext = result.frameContext;
|
|
740
743
|
return fromAdvanced(result.stimulus, result.interaction);
|
|
741
744
|
case "submitted":
|
|
742
745
|
return feedbackState(ctx, result.stimulus, result.interaction, result.submission, result.isCorrect, result.feedbackContent, result.review);
|
|
@@ -768,11 +771,32 @@ function makeSession(sc) {
|
|
|
768
771
|
return state;
|
|
769
772
|
}
|
|
770
773
|
async function execute(intent, phase) {
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
774
|
+
let body;
|
|
775
|
+
if (intent.kind === "observation") {
|
|
776
|
+
body = {
|
|
777
|
+
supportedPcis: sc.supportedPcis,
|
|
778
|
+
intent,
|
|
779
|
+
subject: sc.subject
|
|
780
|
+
};
|
|
781
|
+
} else {
|
|
782
|
+
if (currentFrameContext === null) {
|
|
783
|
+
log?.error("missing frame context for non-observation intent", {
|
|
784
|
+
phase,
|
|
785
|
+
intentKind: intent.kind
|
|
786
|
+
});
|
|
787
|
+
return {
|
|
788
|
+
phase: "fatal",
|
|
789
|
+
error: ErrBadRequest,
|
|
790
|
+
retriable: false,
|
|
791
|
+
toJSON: poisonToJSON
|
|
792
|
+
};
|
|
793
|
+
}
|
|
794
|
+
body = {
|
|
795
|
+
supportedPcis: sc.supportedPcis,
|
|
796
|
+
intent: { ...intent, frameContext: currentFrameContext },
|
|
797
|
+
subject: sc.subject
|
|
798
|
+
};
|
|
799
|
+
}
|
|
776
800
|
const result = await sc.transport(body);
|
|
777
801
|
if (!result.ok) {
|
|
778
802
|
if (isFatalError(result.error)) {
|
|
@@ -828,16 +852,23 @@ function makeSession(sc) {
|
|
|
828
852
|
return { execute };
|
|
829
853
|
}
|
|
830
854
|
|
|
831
|
-
// src/client.ts
|
|
832
|
-
var
|
|
855
|
+
// src/client/create.ts
|
|
856
|
+
var ACCESS_TOKEN_PREFIX = "eyJ";
|
|
857
|
+
function isMalformedJws(token) {
|
|
858
|
+
if (!token.startsWith(ACCESS_TOKEN_PREFIX)) {
|
|
859
|
+
return true;
|
|
860
|
+
}
|
|
861
|
+
const dotCount = token.split(".").length - 1;
|
|
862
|
+
return dotCount !== 2;
|
|
863
|
+
}
|
|
833
864
|
function create(config) {
|
|
834
865
|
const log = config.logger;
|
|
835
|
-
if (
|
|
836
|
-
log?.error("malformed
|
|
837
|
-
throw errors10.wrap(
|
|
866
|
+
if (isMalformedJws(config.accessToken)) {
|
|
867
|
+
log?.error("malformed access token", { prefix: ACCESS_TOKEN_PREFIX });
|
|
868
|
+
throw errors10.wrap(ErrMalformedAccessToken, `token must start with '${ACCESS_TOKEN_PREFIX}' and contain two dots`);
|
|
838
869
|
}
|
|
839
870
|
const transport = createTransport({
|
|
840
|
-
|
|
871
|
+
accessToken: config.accessToken,
|
|
841
872
|
supportedPcis: config.supportedPcis,
|
|
842
873
|
origin: config.origin,
|
|
843
874
|
fetch: config.fetch,
|
|
@@ -845,28 +876,30 @@ function create(config) {
|
|
|
845
876
|
log
|
|
846
877
|
});
|
|
847
878
|
let startPromise;
|
|
848
|
-
async function doStart(
|
|
849
|
-
log?.debug("start", {
|
|
879
|
+
async function doStart() {
|
|
880
|
+
log?.debug("start", { subject: config.subject });
|
|
850
881
|
const s = makeSession({
|
|
851
|
-
studentId,
|
|
852
882
|
supportedPcis: config.supportedPcis,
|
|
883
|
+
subject: config.subject,
|
|
853
884
|
log,
|
|
854
885
|
transport
|
|
855
886
|
});
|
|
856
887
|
return s.execute({ kind: "observation" }, "observation");
|
|
857
888
|
}
|
|
858
889
|
return {
|
|
859
|
-
start(
|
|
890
|
+
start() {
|
|
860
891
|
if (startPromise) {
|
|
861
892
|
log?.debug("start already called");
|
|
862
893
|
return startPromise;
|
|
863
894
|
}
|
|
864
|
-
startPromise = doStart(
|
|
895
|
+
startPromise = doStart();
|
|
865
896
|
return startPromise;
|
|
866
897
|
}
|
|
867
898
|
};
|
|
868
899
|
}
|
|
869
|
-
// src/
|
|
900
|
+
// src/subject.ts
|
|
901
|
+
var SUBJECTS = ["math", "vocabulary", "science"];
|
|
902
|
+
// src/client/content.ts
|
|
870
903
|
function inlinesToPlainText(nodes) {
|
|
871
904
|
const parts = [];
|
|
872
905
|
for (const node of nodes) {
|
|
@@ -894,7 +927,9 @@ export {
|
|
|
894
927
|
inlinesToPlainText,
|
|
895
928
|
create,
|
|
896
929
|
blocksToPlainText,
|
|
930
|
+
SUBJECTS,
|
|
897
931
|
ErrUnsupportedPci,
|
|
932
|
+
ErrTokenExpired,
|
|
898
933
|
ErrTimeout,
|
|
899
934
|
ErrServiceUnavailable,
|
|
900
935
|
ErrServerError,
|
|
@@ -902,14 +937,13 @@ export {
|
|
|
902
937
|
ErrNotSerializable,
|
|
903
938
|
ErrNotFound,
|
|
904
939
|
ErrNetwork,
|
|
905
|
-
|
|
940
|
+
ErrMalformedAccessToken,
|
|
906
941
|
ErrJsonParse,
|
|
907
942
|
ErrInvalidSubmission,
|
|
908
|
-
|
|
943
|
+
ErrInvalidAccessToken,
|
|
909
944
|
ErrForbidden,
|
|
910
945
|
ErrConflict,
|
|
911
|
-
ErrBadRequest
|
|
912
|
-
ADVANCE_PATH
|
|
946
|
+
ErrBadRequest
|
|
913
947
|
};
|
|
914
948
|
|
|
915
|
-
//# debugId=
|
|
949
|
+
//# debugId=77F88432A1CED38764756E2164756E21
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/client/create.ts", "../src/errors.ts", "../src/client/transport.ts", "../src/client/session.ts", "../src/client/consumed.ts", "../src/client/choice-state.ts", "../src/client/extended-text-state.ts", "../src/client/feedback-state.ts", "../src/client/match-state.ts", "../src/client/observation-state.ts", "../src/client/order-state.ts", "../src/client/pci-state.ts", "../src/client/text-entry-state.ts", "../src/subject.ts", "../src/client/content.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import * as errors from \"@superbuilders/errors\"\nimport { ErrMalformedAccessToken } from \"@superbuilders/primer-tives/errors\"\nimport type { PrimerLogger } from \"@superbuilders/primer-tives/logger\"\nimport type { PciId } from \"@superbuilders/primer-tives/client/pci\"\nimport type { SubjectScope } from \"@superbuilders/primer-tives/subject\"\nimport type { PrimerState } from \"@superbuilders/primer-tives/client/types\"\nimport { createTransport } from \"@superbuilders/primer-tives/client/transport\"\nimport { makeSession } from \"@superbuilders/primer-tives/client/session\"\n\nconst ACCESS_TOKEN_PREFIX = \"eyJ\"\n\ninterface Config<Pcis extends PciId = PciId> {\n\treadonly accessToken: string\n\treadonly supportedPcis: readonly Pcis[]\n\treadonly origin: string\n\treadonly subject: SubjectScope\n\treadonly fetch?: typeof globalThis.fetch\n\treadonly abort?: AbortController\n\treadonly logger?: PrimerLogger\n}\n\ninterface Client<Pcis extends PciId = PciId> {\n\tstart(): Promise<PrimerState<Pcis>>\n}\n\nfunction isMalformedJws(token: string): boolean {\n\tif (!token.startsWith(ACCESS_TOKEN_PREFIX)) {\n\t\treturn true\n\t}\n\tconst dotCount = token.split(\".\").length - 1\n\treturn dotCount !== 2\n}\n\nfunction create<const Pcis extends PciId>(config: Config<Pcis>): Client<Pcis> {\n\tconst log = config.logger\n\n\tif (isMalformedJws(config.accessToken)) {\n\t\tlog?.error(\"malformed access token\", { prefix: ACCESS_TOKEN_PREFIX })\n\t\t// biome-ignore lint/plugin: client SDK — log is optional config.logger, not slog\n\t\tthrow errors.wrap(\n\t\t\tErrMalformedAccessToken,\n\t\t\t`token must start with '${ACCESS_TOKEN_PREFIX}' and contain two dots`\n\t\t)\n\t}\n\n\tconst transport = createTransport({\n\t\taccessToken: config.accessToken,\n\t\tsupportedPcis: config.supportedPcis,\n\t\torigin: config.origin,\n\t\tfetch: config.fetch,\n\t\tabort: config.abort,\n\t\tlog\n\t})\n\n\tlet startPromise: Promise<PrimerState<Pcis>> | undefined\n\n\tasync function doStart(): Promise<PrimerState<Pcis>> {\n\t\tlog?.debug(\"start\", { subject: config.subject })\n\t\tconst s = makeSession({\n\t\t\tsupportedPcis: config.supportedPcis,\n\t\t\tsubject: config.subject,\n\t\t\tlog,\n\t\t\ttransport\n\t\t})\n\t\treturn s.execute({ kind: \"observation\" }, \"observation\")\n\t}\n\n\treturn {\n\t\tstart(): Promise<PrimerState<Pcis>> {\n\t\t\tif (startPromise) {\n\t\t\t\tlog?.debug(\"start already called\")\n\t\t\t\treturn startPromise\n\t\t\t}\n\t\t\tstartPromise = doStart()\n\t\t\treturn startPromise\n\t\t}\n\t}\n}\n\nexport { create }\nexport type { Client, Config }\n",
|
|
6
|
+
"import * as errors from \"@superbuilders/errors\"\n\nconst ErrNetwork = errors.new(\"network\")\nconst ErrJsonParse = errors.new(\"json parse\")\nconst ErrUnsupportedPci = errors.new(\"unsupported pci\")\nconst ErrInvalidAccessToken = errors.new(\"invalid access token\")\nconst ErrMalformedAccessToken = errors.new(\"malformed access token\")\nconst ErrTokenExpired = errors.new(\"access token expired\")\nconst ErrBadRequest = errors.new(\"bad request\")\nconst ErrServerError = errors.new(\"server error\")\nconst ErrTimeout = errors.new(\"timeout\")\nconst ErrForbidden = errors.new(\"forbidden\")\nconst ErrNotFound = errors.new(\"not found\")\nconst ErrConflict = errors.new(\"conflict\")\nconst ErrRateLimited = errors.new(\"rate limited\")\nconst ErrServiceUnavailable = errors.new(\"service unavailable\")\nconst ErrNotSerializable = errors.new(\n\t\"PrimerState is live in-memory state and must not be serialized or stored\"\n)\nconst ErrInvalidSubmission = errors.new(\"invalid submission\")\n\nconst ErrInvalidSecretKey = errors.new(\"invalid secret key\")\nconst ErrStudentNotFound = errors.new(\"student not found\")\nconst ErrUnsupportedGrade = errors.new(\"unsupported grade\")\nconst ErrTimebackUnavailable = errors.new(\"timeback unavailable\")\n\nexport {\n\tErrBadRequest,\n\tErrConflict,\n\tErrForbidden,\n\tErrInvalidAccessToken,\n\tErrInvalidSecretKey,\n\tErrInvalidSubmission,\n\tErrJsonParse,\n\tErrMalformedAccessToken,\n\tErrNetwork,\n\tErrNotFound,\n\tErrNotSerializable,\n\tErrRateLimited,\n\tErrServerError,\n\tErrServiceUnavailable,\n\tErrStudentNotFound,\n\tErrTimebackUnavailable,\n\tErrTimeout,\n\tErrTokenExpired,\n\tErrUnsupportedGrade,\n\tErrUnsupportedPci\n}\n",
|
|
7
|
+
"import * as errors from \"@superbuilders/errors\"\nimport {\n\tErrBadRequest,\n\tErrConflict,\n\tErrForbidden,\n\tErrInvalidAccessToken,\n\tErrJsonParse,\n\tErrNetwork,\n\tErrNotFound,\n\tErrRateLimited,\n\tErrServerError,\n\tErrServiceUnavailable,\n\tErrTimeout,\n\tErrUnsupportedPci\n} from \"@superbuilders/primer-tives/errors\"\nimport type { PciId } from \"@superbuilders/primer-tives/client/pci\"\nimport type { SessionContext, WireIntent } from \"@superbuilders/primer-tives/client/session-context\"\nimport type { SubjectScope } from \"@superbuilders/primer-tives/subject\"\nimport type { ContentInline } from \"@superbuilders/primer-tives/client/content\"\nimport type {\n\tInteractionReview,\n\tRendererInteraction,\n\tRendererStimulus,\n\tRendererSubmission\n} from \"@superbuilders/primer-tives/client/types\"\n\nconst ADVANCE_PATH = \"/api/v0/advance\"\n\ntype WireResult<Pcis extends PciId = PciId> =\n\t| {\n\t\t\toutcome: \"advanced\"\n\t\t\tstimulus: RendererStimulus | null\n\t\t\tinteraction: RendererInteraction<Pcis> | null\n\t\t\tframeContext: string | null\n\t }\n\t| {\n\t\t\toutcome: \"submitted\"\n\t\t\tstimulus: RendererStimulus | null\n\t\t\tinteraction: RendererInteraction<Pcis>\n\t\t\tsubmission: RendererSubmission<Pcis>\n\t\t\tisCorrect: boolean\n\t\t\tfeedbackContent: ContentInline[]\n\t\t\treview: InteractionReview<Pcis> | null\n\t }\n\t| { outcome: \"completed\" }\n\ninterface WireRequestBody<Pcis extends PciId = PciId> {\n\tsupportedPcis: readonly PciId[]\n\tintent: WireIntent<Pcis>\n\tsubject: SubjectScope\n}\n\ntype TransportResult<Pcis extends PciId = PciId> =\n\t| { ok: true; data: WireResult<Pcis> }\n\t| { ok: false; error: Error }\n\ninterface TransportConfig<Pcis extends PciId = PciId> {\n\treadonly accessToken: string\n\treadonly supportedPcis: readonly Pcis[]\n\treadonly origin: string\n\treadonly fetch?: typeof globalThis.fetch\n\treadonly abort?: AbortController\n\treadonly log: SessionContext[\"log\"]\n}\n\nfunction httpSentinel(status: number): Error {\n\tif (status === 400) {\n\t\treturn ErrBadRequest\n\t}\n\tif (status === 401) {\n\t\treturn ErrInvalidAccessToken\n\t}\n\tif (status === 403) {\n\t\treturn ErrForbidden\n\t}\n\tif (status === 404) {\n\t\treturn ErrNotFound\n\t}\n\tif (status === 409) {\n\t\treturn ErrConflict\n\t}\n\tif (status === 429) {\n\t\treturn ErrRateLimited\n\t}\n\tif (status === 502 || status === 503 || status === 504) {\n\t\treturn ErrServiceUnavailable\n\t}\n\treturn ErrServerError\n}\n\nfunction isAbortError(err: unknown): boolean {\n\tif (err instanceof DOMException && err.name === \"AbortError\") {\n\t\treturn true\n\t}\n\tif (err instanceof DOMException && err.name === \"TimeoutError\") {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunction createTransport<Pcis extends PciId>(tc: TransportConfig<Pcis>) {\n\tconst fetchFn = tc.fetch ? tc.fetch : globalThis.fetch\n\tconst log = tc.log\n\n\tfunction transportSignal(): AbortSignal | undefined {\n\t\tif (tc.abort) {\n\t\t\treturn tc.abort.signal\n\t\t}\n\t\treturn undefined\n\t}\n\n\tasync function transport(body: WireRequestBody<Pcis>): Promise<TransportResult<Pcis>> {\n\t\tlog?.debug(\"transport request\", {\n\t\t\tintentKind: body.intent.kind,\n\t\t\tsubject: body.subject\n\t\t})\n\n\t\tconst url = `${tc.origin}${ADVANCE_PATH}`\n\t\tconst fetchResult = await fetchFn(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\tAuthorization: `Bearer ${tc.accessToken}`\n\t\t\t},\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: transportSignal()\n\t\t}).then(\n\t\t\tfunction ok(r: Response) {\n\t\t\t\treturn { ok: true, response: r } as const\n\t\t\t},\n\t\t\tfunction fail(err: Error) {\n\t\t\t\treturn { ok: false, error: err } as const\n\t\t\t}\n\t\t)\n\n\t\tif (!fetchResult.ok) {\n\t\t\tif (isAbortError(fetchResult.error)) {\n\t\t\t\tlog?.error(\"transport timeout\", {\n\t\t\t\t\tintentKind: body.intent.kind\n\t\t\t\t})\n\t\t\t\treturn { ok: false, error: errors.wrap(ErrTimeout, fetchResult.error.message) }\n\t\t\t}\n\t\t\tlog?.error(\"transport network error\", {\n\t\t\t\terror: fetchResult.error\n\t\t\t})\n\t\t\treturn { ok: false, error: errors.wrap(ErrNetwork, fetchResult.error.message) }\n\t\t}\n\n\t\tconst res = fetchResult.response\n\n\t\tif (!res.ok) {\n\t\t\tconst text = await res.text().catch(function fallback() {\n\t\t\t\treturn \"\"\n\t\t\t})\n\t\t\tconst sentinel = res.status === 422 ? ErrUnsupportedPci : httpSentinel(res.status)\n\t\t\tlog?.error(\"transport http error\", {\n\t\t\t\tstatus: res.status\n\t\t\t})\n\t\t\treturn { ok: false, error: errors.wrap(sentinel, text) }\n\t\t}\n\n\t\tconst jsonResult = await res.json().then(\n\t\t\tfunction ok(data: WireResult<Pcis>) {\n\t\t\t\treturn { ok: true, data } as const\n\t\t\t},\n\t\t\tfunction fail(err: Error) {\n\t\t\t\treturn { ok: false, error: err } as const\n\t\t\t}\n\t\t)\n\n\t\tif (!jsonResult.ok) {\n\t\t\tlog?.error(\"transport json parse failed\", {\n\t\t\t\terror: jsonResult.error\n\t\t\t})\n\t\t\treturn { ok: false, error: errors.wrap(ErrJsonParse, jsonResult.error.message) }\n\t\t}\n\n\t\tlog?.debug(\"transport success\", {\n\t\t\tintentKind: body.intent.kind\n\t\t})\n\n\t\treturn { ok: true, data: jsonResult.data }\n\t}\n\n\treturn transport\n}\n\nexport { createTransport, httpSentinel, isAbortError }\nexport type { TransportConfig, TransportResult, WireRequestBody, WireResult }\n",
|
|
8
|
+
"import * as errors from \"@superbuilders/errors\"\nimport { poisonToJSON } from \"@superbuilders/primer-tives/client/consumed\"\nimport {\n\tErrBadRequest,\n\tErrForbidden,\n\tErrInvalidAccessToken,\n\tErrInvalidSubmission,\n\tErrNotFound,\n\tErrTokenExpired,\n\tErrUnsupportedPci\n} from \"@superbuilders/primer-tives/errors\"\nimport type { PrimerLogger } from \"@superbuilders/primer-tives/logger\"\nimport type { PciId } from \"@superbuilders/primer-tives/client/pci\"\nimport type {\n\tSessionContext,\n\tTransitionPhase,\n\tWireIntent\n} from \"@superbuilders/primer-tives/client/session-context\"\nimport type { SubjectScope } from \"@superbuilders/primer-tives/subject\"\nimport type {\n\tTransportResult,\n\tWireRequestBody,\n\tWireResult\n} from \"@superbuilders/primer-tives/client/transport\"\nimport type {\n\tErroredState,\n\tPrimerState,\n\tRendererInteraction,\n\tRendererStimulus\n} from \"@superbuilders/primer-tives/client/types\"\nimport { choiceState } from \"@superbuilders/primer-tives/client/choice-state\"\nimport { extendedTextState } from \"@superbuilders/primer-tives/client/extended-text-state\"\nimport { feedbackState } from \"@superbuilders/primer-tives/client/feedback-state\"\nimport { matchState } from \"@superbuilders/primer-tives/client/match-state\"\nimport { observationState } from \"@superbuilders/primer-tives/client/observation-state\"\nimport { orderState } from \"@superbuilders/primer-tives/client/order-state\"\nimport { pciInteractionState } from \"@superbuilders/primer-tives/client/pci-state\"\nimport { textEntryState } from \"@superbuilders/primer-tives/client/text-entry-state\"\n\ninterface SessionConfig<Pcis extends PciId = PciId> {\n\treadonly supportedPcis: readonly Pcis[]\n\treadonly subject: SubjectScope\n\treadonly log: PrimerLogger | undefined\n\treadonly transport: (body: WireRequestBody<Pcis>) => Promise<TransportResult<Pcis>>\n}\n\nconst FATAL_SENTINELS = [\n\tErrBadRequest,\n\tErrInvalidAccessToken,\n\tErrTokenExpired,\n\tErrForbidden,\n\tErrNotFound,\n\tErrUnsupportedPci\n]\n\nfunction isFatalError(err: Error): boolean {\n\tfor (const sentinel of FATAL_SENTINELS) {\n\t\tif (errors.is(err, sentinel)) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunction isRetriableError(err: Error): boolean {\n\treturn !errors.is(err, ErrInvalidSubmission)\n}\n\nfunction makeSession<Pcis extends PciId>(sc: SessionConfig<Pcis>) {\n\tconst log = sc.log\n\tlet currentFrameContext: string | null = null\n\n\tfunction resolve(result: WireResult<Pcis>): PrimerState<Pcis> {\n\t\tswitch (result.outcome) {\n\t\t\tcase \"advanced\":\n\t\t\t\tcurrentFrameContext = result.frameContext\n\t\t\t\treturn fromAdvanced(result.stimulus, result.interaction)\n\t\t\tcase \"submitted\":\n\t\t\t\treturn feedbackState(\n\t\t\t\t\tctx,\n\t\t\t\t\tresult.stimulus,\n\t\t\t\t\tresult.interaction,\n\t\t\t\t\tresult.submission,\n\t\t\t\t\tresult.isCorrect,\n\t\t\t\t\tresult.feedbackContent,\n\t\t\t\t\tresult.review\n\t\t\t\t)\n\t\t\tcase \"completed\":\n\t\t\t\treturn { phase: \"completed\", toJSON: poisonToJSON }\n\t\t}\n\t}\n\n\tfunction errored(\n\t\terror: Error,\n\t\tfailedPhase: TransitionPhase,\n\t\tintent: WireIntent<Pcis>\n\t): ErroredState<Pcis> {\n\t\tlet pending: Promise<PrimerState<Pcis>> | undefined\n\t\tconst retriable = isRetriableError(error)\n\t\tconst state: ErroredState<Pcis> = {\n\t\t\tphase: \"errored\",\n\t\t\terror,\n\t\t\tretriable,\n\t\t\tretry: function retry() {\n\t\t\t\tif (!retriable) {\n\t\t\t\t\tlog?.debug(\"retry ignored for non-retriable error\", { failedPhase })\n\t\t\t\t\treturn Promise.resolve(state)\n\t\t\t\t}\n\t\t\t\tif (pending) {\n\t\t\t\t\treturn pending\n\t\t\t\t}\n\t\t\t\tlog?.debug(\"retrying from errored state\", { failedPhase })\n\t\t\t\tpending = execute(intent, failedPhase)\n\t\t\t\treturn pending\n\t\t\t},\n\t\t\ttoJSON: poisonToJSON\n\t\t}\n\t\treturn state\n\t}\n\n\tasync function execute(\n\t\tintent: WireIntent<Pcis>,\n\t\tphase: TransitionPhase\n\t): Promise<PrimerState<Pcis>> {\n\t\tlet body: WireRequestBody<Pcis>\n\t\tif (intent.kind === \"observation\") {\n\t\t\tbody = {\n\t\t\t\tsupportedPcis: sc.supportedPcis,\n\t\t\t\tintent,\n\t\t\t\tsubject: sc.subject\n\t\t\t}\n\t\t} else {\n\t\t\tif (currentFrameContext === null) {\n\t\t\t\tlog?.error(\"missing frame context for non-observation intent\", {\n\t\t\t\t\tphase,\n\t\t\t\t\tintentKind: intent.kind\n\t\t\t\t})\n\t\t\t\treturn {\n\t\t\t\t\tphase: \"fatal\",\n\t\t\t\t\terror: ErrBadRequest,\n\t\t\t\t\tretriable: false,\n\t\t\t\t\ttoJSON: poisonToJSON\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbody = {\n\t\t\t\tsupportedPcis: sc.supportedPcis,\n\t\t\t\tintent: { ...intent, frameContext: currentFrameContext },\n\t\t\t\tsubject: sc.subject\n\t\t\t}\n\t\t}\n\n\t\tconst result = await sc.transport(body)\n\t\tif (!result.ok) {\n\t\t\tif (isFatalError(result.error)) {\n\t\t\t\tlog?.error(\"fatal transport error\", { error: result.error, phase })\n\t\t\t\treturn { phase: \"fatal\", error: result.error, retriable: false, toJSON: poisonToJSON }\n\t\t\t}\n\t\t\treturn errored(result.error, phase, intent)\n\t\t}\n\n\t\treturn resolve(result.data)\n\t}\n\n\tfunction isPciSupported(pciId: string): boolean {\n\t\tfor (const id of sc.supportedPcis) {\n\t\t\tif (id === pciId) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\n\tfunction fromAdvanced(\n\t\tstimulus: RendererStimulus | null,\n\t\tinteraction: RendererInteraction<Pcis> | null\n\t): PrimerState<Pcis> {\n\t\tif (interaction === null) {\n\t\t\treturn observationState(ctx, stimulus)\n\t\t}\n\t\tif (interaction.type === \"portable-custom\") {\n\t\t\tif (!isPciSupported(interaction.pciId)) {\n\t\t\t\tlog?.error(\"unsupported pci in frame\", { pciId: interaction.pciId })\n\t\t\t\treturn {\n\t\t\t\t\tphase: \"fatal\",\n\t\t\t\t\terror: errors.wrap(ErrUnsupportedPci, `pci '${interaction.pciId}'`),\n\t\t\t\t\tretriable: false,\n\t\t\t\t\ttoJSON: poisonToJSON\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn pendingInteractionState(stimulus, interaction)\n\t}\n\n\tfunction pendingInteractionState(\n\t\tstimulus: RendererStimulus | null,\n\t\tinteraction: RendererInteraction<Pcis>\n\t): PrimerState<Pcis> {\n\t\tswitch (interaction.type) {\n\t\t\tcase \"choice\":\n\t\t\t\treturn choiceState(\n\t\t\t\t\tctx,\n\t\t\t\t\tstimulus,\n\t\t\t\t\tinteraction,\n\t\t\t\t\tinteraction.options,\n\t\t\t\t\tinteraction.maxChoices,\n\t\t\t\t\tinteraction.minChoices\n\t\t\t\t)\n\t\t\tcase \"text-entry\":\n\t\t\t\treturn textEntryState(ctx, stimulus, interaction)\n\t\t\tcase \"extended-text\":\n\t\t\t\treturn extendedTextState(ctx, stimulus, interaction)\n\t\t\tcase \"order\":\n\t\t\t\treturn orderState(ctx, stimulus, interaction)\n\t\t\tcase \"match\":\n\t\t\t\treturn matchState(ctx, stimulus, interaction)\n\t\t\tcase \"portable-custom\":\n\t\t\t\treturn pciInteractionState(ctx, stimulus, interaction)\n\t\t}\n\t}\n\n\tconst ctx: SessionContext<Pcis> = { log, execute, errored }\n\n\treturn { execute }\n}\n\nexport { makeSession }\nexport type { SessionConfig }\n",
|
|
9
|
+
"import { ErrNotSerializable } from \"@superbuilders/primer-tives/errors\"\n\nfunction poisonToJSON(): never {\n\t// biome-ignore lint/plugin: intentional toJSON trap — logging here would spam on every accidental serialize attempt\n\tthrow ErrNotSerializable\n}\n\nexport { poisonToJSON }\n",
|
|
10
|
+
"import { poisonToJSON } from \"@superbuilders/primer-tives/client/consumed\"\nimport { ErrConflict, ErrInvalidSubmission } from \"@superbuilders/primer-tives/errors\"\nimport type { SessionContext } from \"@superbuilders/primer-tives/client/session-context\"\nimport type { PciId } from \"@superbuilders/primer-tives/client/pci\"\nimport type {\n\tPrimerState,\n\tRendererChoice,\n\tRendererInteraction,\n\tRendererStimulus\n} from \"@superbuilders/primer-tives/client/types\"\nimport * as errors from \"@superbuilders/errors\"\n\nfunction findUnknownKey(selectedKeys: string[], options: RendererChoice[]): string | null {\n\tconst optionIds = new Set(\n\t\toptions.map(function getId(o) {\n\t\t\treturn o.identifier\n\t\t})\n\t)\n\tfor (const key of selectedKeys) {\n\t\tif (!optionIds.has(key)) {\n\t\t\treturn key\n\t\t}\n\t}\n\treturn null\n}\n\nfunction validateChoiceSubmission(\n\tlog: SessionContext[\"log\"],\n\tselectedKeys: string[],\n\toptions: RendererChoice[],\n\tmaxChoices: number,\n\tminChoices: number\n): Error | null {\n\tif (selectedKeys.length < minChoices) {\n\t\tlog?.error(\"choice submit below minChoices\", { selectedKeys, minChoices })\n\t\treturn errors.wrap(ErrInvalidSubmission, `need at least ${minChoices} selections`)\n\t}\n\tif (selectedKeys.length > maxChoices) {\n\t\tlog?.error(\"choice submit above maxChoices\", { selectedKeys, maxChoices })\n\t\treturn errors.wrap(ErrInvalidSubmission, `at most ${maxChoices} selections`)\n\t}\n\tconst uniqueKeys = new Set(selectedKeys)\n\tif (uniqueKeys.size !== selectedKeys.length) {\n\t\tlog?.error(\"choice submit has duplicates\", { selectedKeys })\n\t\treturn errors.wrap(ErrInvalidSubmission, \"duplicate selections\")\n\t}\n\tconst unknownKey = findUnknownKey(selectedKeys, options)\n\tif (unknownKey) {\n\t\tlog?.error(\"choice submit has unknown key\", { key: unknownKey })\n\t\treturn errors.wrap(ErrInvalidSubmission, `unknown option '${unknownKey}'`)\n\t}\n\treturn null\n}\n\nfunction choiceState<Pcis extends PciId>(\n\tctx: SessionContext<Pcis>,\n\tstimulus: RendererStimulus | null,\n\tinteraction: Extract<RendererInteraction<Pcis>, { type: \"choice\" }>,\n\toptions: RendererChoice[],\n\tmaxChoices: number,\n\tminChoices: number\n): PrimerState<Pcis> {\n\tlet submitPending: Promise<PrimerState<Pcis>> | undefined\n\tlet submitKey: string | undefined\n\tlet timeoutPending: Promise<PrimerState<Pcis>> | undefined\n\n\tfunction beginSubmit(selectedKeys: string[]): Promise<PrimerState<Pcis>> {\n\t\tconst submission = { type: \"choice\" as const, selectedKeys }\n\t\tconst key = JSON.stringify(submission)\n\t\tif (timeoutPending) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(ErrConflict, \"cannot submit while timeout is in flight\"),\n\t\t\t\t\t\"interaction\",\n\t\t\t\t\t{ kind: \"interaction\", submission }\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tif (submitPending) {\n\t\t\tif (submitKey === key) {\n\t\t\t\treturn submitPending\n\t\t\t}\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(\n\t\t\t\t\t\tErrConflict,\n\t\t\t\t\t\t\"cannot submit a different choice payload while submit is in flight\"\n\t\t\t\t\t),\n\t\t\t\t\t\"interaction\",\n\t\t\t\t\t{ kind: \"interaction\", submission }\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tconst validationError = validateChoiceSubmission(\n\t\t\tctx.log,\n\t\t\tselectedKeys,\n\t\t\toptions,\n\t\t\tmaxChoices,\n\t\t\tminChoices\n\t\t)\n\t\tif (validationError) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(validationError, \"interaction\", { kind: \"interaction\", submission })\n\t\t\t)\n\t\t}\n\t\tsubmitKey = key\n\t\tsubmitPending = ctx\n\t\t\t.execute({ kind: \"interaction\", submission }, \"interaction\")\n\t\t\t.finally(function clearPending() {\n\t\t\t\tsubmitPending = undefined\n\t\t\t\tsubmitKey = undefined\n\t\t\t})\n\t\treturn submitPending\n\t}\n\n\tfunction beginTimeout(): Promise<PrimerState<Pcis>> {\n\t\tconst intent = { kind: \"timeout\" as const }\n\t\tif (submitPending) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(ErrConflict, \"cannot timeout while submission is in flight\"),\n\t\t\t\t\t\"timeout\",\n\t\t\t\t\tintent\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tif (timeoutPending) {\n\t\t\treturn timeoutPending\n\t\t}\n\t\ttimeoutPending = ctx.execute(intent, \"timeout\").finally(function clearPending() {\n\t\t\ttimeoutPending = undefined\n\t\t})\n\t\treturn timeoutPending\n\t}\n\n\treturn {\n\t\tphase: \"interaction\",\n\t\tkind: \"choice\",\n\t\tstimulus,\n\t\tinteraction,\n\t\toptions,\n\t\tmaxChoices,\n\t\tminChoices,\n\t\tsubmitChoice: beginSubmit,\n\t\ttimeout: beginTimeout,\n\t\ttoJSON: poisonToJSON\n\t}\n}\n\nexport { choiceState }\n",
|
|
11
|
+
"import { poisonToJSON } from \"@superbuilders/primer-tives/client/consumed\"\nimport { ErrConflict, ErrInvalidSubmission } from \"@superbuilders/primer-tives/errors\"\nimport type { SessionContext } from \"@superbuilders/primer-tives/client/session-context\"\nimport type { PciId } from \"@superbuilders/primer-tives/client/pci\"\nimport type {\n\tPrimerState,\n\tRendererStimulus,\n\tStandardRendererInteraction\n} from \"@superbuilders/primer-tives/client/types\"\nimport * as errors from \"@superbuilders/errors\"\n\nfunction validateExtendedTextSubmission(\n\tlog: SessionContext[\"log\"],\n\tvalues: string[],\n\tminStrings: number,\n\tmaxStrings: number\n): Error | null {\n\tif (values.length < minStrings) {\n\t\tlog?.error(\"extended-text submit below minStrings\", { count: values.length, minStrings })\n\t\treturn errors.wrap(ErrInvalidSubmission, `need at least ${minStrings} values`)\n\t}\n\tif (values.length > maxStrings) {\n\t\tlog?.error(\"extended-text submit above maxStrings\", { count: values.length, maxStrings })\n\t\treturn errors.wrap(ErrInvalidSubmission, `at most ${maxStrings} values`)\n\t}\n\treturn null\n}\n\nfunction extendedTextState<Pcis extends PciId>(\n\tctx: SessionContext<Pcis>,\n\tstimulus: RendererStimulus | null,\n\tinteraction: Extract<StandardRendererInteraction, { type: \"extended-text\" }>\n): PrimerState<Pcis> {\n\tif (interaction.cardinality === \"single\") {\n\t\tlet submitPending: Promise<PrimerState<Pcis>> | undefined\n\t\tlet submitKey: string | undefined\n\t\tlet timeoutPending: Promise<PrimerState<Pcis>> | undefined\n\t\tfunction submitText(value: string): Promise<PrimerState<Pcis>> {\n\t\t\tconst submission = { type: \"extended-text\" as const, values: [value] }\n\t\t\tconst key = JSON.stringify(submission)\n\t\t\tif (timeoutPending) {\n\t\t\t\treturn Promise.resolve(\n\t\t\t\t\tctx.errored(\n\t\t\t\t\t\terrors.wrap(ErrConflict, \"cannot submit while timeout is in flight\"),\n\t\t\t\t\t\t\"interaction\",\n\t\t\t\t\t\t{ kind: \"interaction\", submission }\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (submitPending) {\n\t\t\t\tif (submitKey === key) {\n\t\t\t\t\treturn submitPending\n\t\t\t\t}\n\t\t\t\treturn Promise.resolve(\n\t\t\t\t\tctx.errored(\n\t\t\t\t\t\terrors.wrap(\n\t\t\t\t\t\t\tErrConflict,\n\t\t\t\t\t\t\t\"cannot submit a different extended-text payload while submit is in flight\"\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\"interaction\",\n\t\t\t\t\t\t{ kind: \"interaction\", submission }\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t}\n\t\t\tsubmitKey = key\n\t\t\tsubmitPending = ctx\n\t\t\t\t.execute({ kind: \"interaction\", submission }, \"interaction\")\n\t\t\t\t.finally(function clearPending() {\n\t\t\t\t\tsubmitPending = undefined\n\t\t\t\t\tsubmitKey = undefined\n\t\t\t\t})\n\t\t\treturn submitPending\n\t\t}\n\t\tfunction timeout(): Promise<PrimerState<Pcis>> {\n\t\t\tconst intent = { kind: \"timeout\" as const }\n\t\t\tif (submitPending) {\n\t\t\t\treturn Promise.resolve(\n\t\t\t\t\tctx.errored(\n\t\t\t\t\t\terrors.wrap(ErrConflict, \"cannot timeout while submission is in flight\"),\n\t\t\t\t\t\t\"timeout\",\n\t\t\t\t\t\tintent\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (timeoutPending) {\n\t\t\t\treturn timeoutPending\n\t\t\t}\n\t\t\ttimeoutPending = ctx.execute(intent, \"timeout\").finally(function clearPending() {\n\t\t\t\ttimeoutPending = undefined\n\t\t\t})\n\t\t\treturn timeoutPending\n\t\t}\n\t\treturn {\n\t\t\tphase: \"interaction\",\n\t\t\tkind: \"extended-text\",\n\t\t\tcardinality: \"single\",\n\t\t\tstimulus,\n\t\t\tinteraction,\n\t\t\tsubmitText,\n\t\t\ttimeout,\n\t\t\ttoJSON: poisonToJSON\n\t\t}\n\t}\n\n\tconst multi = interaction\n\tlet submitPending: Promise<PrimerState<Pcis>> | undefined\n\tlet submitKey: string | undefined\n\tlet timeoutPending: Promise<PrimerState<Pcis>> | undefined\n\tfunction submitTexts(values: string[]): Promise<PrimerState<Pcis>> {\n\t\tconst submission = { type: \"extended-text\" as const, values }\n\t\tconst key = JSON.stringify(submission)\n\t\tif (timeoutPending) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(ErrConflict, \"cannot submit while timeout is in flight\"),\n\t\t\t\t\t\"interaction\",\n\t\t\t\t\t{ kind: \"interaction\", submission }\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tif (submitPending) {\n\t\t\tif (submitKey === key) {\n\t\t\t\treturn submitPending\n\t\t\t}\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(\n\t\t\t\t\t\tErrConflict,\n\t\t\t\t\t\t\"cannot submit a different extended-text payload while submit is in flight\"\n\t\t\t\t\t),\n\t\t\t\t\t\"interaction\",\n\t\t\t\t\t{ kind: \"interaction\", submission }\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tconst validationError = validateExtendedTextSubmission(\n\t\t\tctx.log,\n\t\t\tvalues,\n\t\t\tmulti.minStrings,\n\t\t\tmulti.maxStrings\n\t\t)\n\t\tif (validationError) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(validationError, \"interaction\", { kind: \"interaction\", submission })\n\t\t\t)\n\t\t}\n\t\tsubmitKey = key\n\t\tsubmitPending = ctx\n\t\t\t.execute({ kind: \"interaction\", submission }, \"interaction\")\n\t\t\t.finally(function clearPending() {\n\t\t\t\tsubmitPending = undefined\n\t\t\t\tsubmitKey = undefined\n\t\t\t})\n\t\treturn submitPending\n\t}\n\tfunction timeout(): Promise<PrimerState<Pcis>> {\n\t\tconst intent = { kind: \"timeout\" as const }\n\t\tif (submitPending) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(ErrConflict, \"cannot timeout while submission is in flight\"),\n\t\t\t\t\t\"timeout\",\n\t\t\t\t\tintent\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tif (timeoutPending) {\n\t\t\treturn timeoutPending\n\t\t}\n\t\ttimeoutPending = ctx.execute(intent, \"timeout\").finally(function clearPending() {\n\t\t\ttimeoutPending = undefined\n\t\t})\n\t\treturn timeoutPending\n\t}\n\treturn {\n\t\tphase: \"interaction\",\n\t\tkind: \"extended-text\",\n\t\tcardinality: \"multiple\",\n\t\tstimulus,\n\t\tinteraction: multi,\n\t\tmaxStrings: multi.maxStrings,\n\t\tminStrings: multi.minStrings,\n\t\tsubmitTexts,\n\t\ttimeout,\n\t\ttoJSON: poisonToJSON\n\t}\n}\n\nexport { extendedTextState }\n",
|
|
12
|
+
"import { poisonToJSON } from \"@superbuilders/primer-tives/client/consumed\"\nimport type { ContentInline } from \"@superbuilders/primer-tives/client/content\"\nimport type { SessionContext } from \"@superbuilders/primer-tives/client/session-context\"\nimport type { PciId } from \"@superbuilders/primer-tives/client/pci\"\nimport type {\n\tInteractionReview,\n\tPrimerState,\n\tRendererInteraction,\n\tRendererStimulus,\n\tRendererSubmission\n} from \"@superbuilders/primer-tives/client/types\"\n\nfunction feedbackState<Pcis extends PciId>(\n\tctx: SessionContext<Pcis>,\n\tstimulus: RendererStimulus | null,\n\tinteraction: RendererInteraction<Pcis>,\n\tsubmission: RendererSubmission<Pcis>,\n\tisCorrect: boolean,\n\tfeedbackContent: ContentInline[],\n\treview: InteractionReview<Pcis> | null\n): PrimerState<Pcis> {\n\tlet pending: Promise<PrimerState<Pcis>> | undefined\n\treturn {\n\t\tphase: \"feedback\",\n\t\tstimulus,\n\t\tinteraction,\n\t\tsubmission,\n\t\tisCorrect,\n\t\tfeedbackContent,\n\t\treview,\n\t\tadvance: function advance() {\n\t\t\tif (pending) {\n\t\t\t\treturn pending\n\t\t\t}\n\t\t\tpending = ctx.execute({ kind: \"observation\" }, \"observation\")\n\t\t\treturn pending\n\t\t},\n\t\ttoJSON: poisonToJSON\n\t}\n}\n\nexport { feedbackState }\n",
|
|
13
|
+
"import * as errors from \"@superbuilders/errors\"\nimport { poisonToJSON } from \"@superbuilders/primer-tives/client/consumed\"\nimport { ErrConflict, ErrInvalidSubmission } from \"@superbuilders/primer-tives/errors\"\nimport type { SessionContext } from \"@superbuilders/primer-tives/client/session-context\"\nimport type { PciId } from \"@superbuilders/primer-tives/client/pci\"\nimport type {\n\tMatchPair,\n\tPrimerState,\n\tRendererMatchChoice,\n\tRendererStimulus,\n\tStandardRendererInteraction\n} from \"@superbuilders/primer-tives/client/types\"\n\nfunction bumpCount(counts: Map<string, number>, key: string): void {\n\tconst prev = counts.get(key)\n\tconst next = prev === undefined ? 1 : prev + 1\n\tcounts.set(key, next)\n}\n\nfunction getCount(counts: Map<string, number>, key: string): number {\n\tconst recorded = counts.get(key)\n\treturn recorded === undefined ? 0 : recorded\n}\n\nfunction validateAssociationBounds(\n\tlog: SessionContext[\"log\"],\n\tpairs: MatchPair[],\n\tminAssociations: number,\n\tmaxAssociations: number\n): Error | null {\n\tif (pairs.length < minAssociations) {\n\t\tlog?.error(\"match submit below minAssociations\", { pairs, minAssociations })\n\t\treturn errors.wrap(ErrInvalidSubmission, `need at least ${minAssociations} associations`)\n\t}\n\tif (pairs.length > maxAssociations) {\n\t\tlog?.error(\"match submit above maxAssociations\", { pairs, maxAssociations })\n\t\treturn errors.wrap(ErrInvalidSubmission, `at most ${maxAssociations} associations`)\n\t}\n\treturn null\n}\n\nfunction validatePairsReferToKnownChoices(\n\tlog: SessionContext[\"log\"],\n\tpairs: MatchPair[],\n\tsourceIds: ReadonlySet<string>,\n\ttargetIds: ReadonlySet<string>\n): Error | null {\n\tfor (const pair of pairs) {\n\t\tif (!sourceIds.has(pair.source)) {\n\t\t\tlog?.error(\"match submit has unknown source\", { source: pair.source })\n\t\t\treturn errors.wrap(ErrInvalidSubmission, `unknown source '${pair.source}'`)\n\t\t}\n\t\tif (!targetIds.has(pair.target)) {\n\t\t\tlog?.error(\"match submit has unknown target\", { target: pair.target })\n\t\t\treturn errors.wrap(ErrInvalidSubmission, `unknown target '${pair.target}'`)\n\t\t}\n\t}\n\treturn null\n}\n\nfunction validateChoiceCaps(\n\tlog: SessionContext[\"log\"],\n\tside: \"source\" | \"target\",\n\tchoices: RendererMatchChoice[],\n\tcounts: Map<string, number>\n): Error | null {\n\tfor (const choice of choices) {\n\t\tconst count = getCount(counts, choice.identifier)\n\t\tif (choice.matchMax !== 0 && count > choice.matchMax) {\n\t\t\tlog?.error(`match submit exceeds ${side} matchMax`, {\n\t\t\t\tidentifier: choice.identifier,\n\t\t\t\tcount,\n\t\t\t\tmatchMax: choice.matchMax\n\t\t\t})\n\t\t\treturn errors.wrap(\n\t\t\t\tErrInvalidSubmission,\n\t\t\t\t`${side} '${choice.identifier}' used ${count} times, max ${choice.matchMax}`\n\t\t\t)\n\t\t}\n\t\tif (count < choice.matchMin) {\n\t\t\tlog?.error(`match submit below ${side} matchMin`, {\n\t\t\t\tidentifier: choice.identifier,\n\t\t\t\tcount,\n\t\t\t\tmatchMin: choice.matchMin\n\t\t\t})\n\t\t\treturn errors.wrap(\n\t\t\t\tErrInvalidSubmission,\n\t\t\t\t`${side} '${choice.identifier}' used ${count} times, min ${choice.matchMin}`\n\t\t\t)\n\t\t}\n\t}\n\treturn null\n}\n\nfunction validateMatchSubmission(\n\tlog: SessionContext[\"log\"],\n\tpairs: MatchPair[],\n\tsourceChoices: RendererMatchChoice[],\n\ttargetChoices: RendererMatchChoice[],\n\tminAssociations: number,\n\tmaxAssociations: number\n): Error | null {\n\tconst boundsError = validateAssociationBounds(log, pairs, minAssociations, maxAssociations)\n\tif (boundsError) {\n\t\treturn boundsError\n\t}\n\tconst sourceIds = new Set(\n\t\tsourceChoices.map(function getId(c) {\n\t\t\treturn c.identifier\n\t\t})\n\t)\n\tconst targetIds = new Set(\n\t\ttargetChoices.map(function getId(c) {\n\t\t\treturn c.identifier\n\t\t})\n\t)\n\tconst referenceError = validatePairsReferToKnownChoices(log, pairs, sourceIds, targetIds)\n\tif (referenceError) {\n\t\treturn referenceError\n\t}\n\tconst sourceCounts = new Map<string, number>()\n\tconst targetCounts = new Map<string, number>()\n\tfor (const pair of pairs) {\n\t\tbumpCount(sourceCounts, pair.source)\n\t\tbumpCount(targetCounts, pair.target)\n\t}\n\tconst sourceCapError = validateChoiceCaps(log, \"source\", sourceChoices, sourceCounts)\n\tif (sourceCapError) {\n\t\treturn sourceCapError\n\t}\n\tconst targetCapError = validateChoiceCaps(log, \"target\", targetChoices, targetCounts)\n\tif (targetCapError) {\n\t\treturn targetCapError\n\t}\n\treturn null\n}\n\nfunction matchState<Pcis extends PciId>(\n\tctx: SessionContext<Pcis>,\n\tstimulus: RendererStimulus | null,\n\tinteraction: Extract<StandardRendererInteraction, { type: \"match\" }>\n): PrimerState<Pcis> {\n\tlet submitPending: Promise<PrimerState<Pcis>> | undefined\n\tlet submitKey: string | undefined\n\tlet timeoutPending: Promise<PrimerState<Pcis>> | undefined\n\n\tfunction submitMatch(pairs: MatchPair[]): Promise<PrimerState<Pcis>> {\n\t\tconst submission = { type: \"match\" as const, pairs }\n\t\tconst key = JSON.stringify(submission)\n\t\tif (timeoutPending) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(ErrConflict, \"cannot submit while timeout is in flight\"),\n\t\t\t\t\t\"interaction\",\n\t\t\t\t\t{ kind: \"interaction\", submission }\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tif (submitPending) {\n\t\t\tif (submitKey === key) {\n\t\t\t\treturn submitPending\n\t\t\t}\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(\n\t\t\t\t\t\tErrConflict,\n\t\t\t\t\t\t\"cannot submit a different match payload while submit is in flight\"\n\t\t\t\t\t),\n\t\t\t\t\t\"interaction\",\n\t\t\t\t\t{ kind: \"interaction\", submission }\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tconst validationError = validateMatchSubmission(\n\t\t\tctx.log,\n\t\t\tpairs,\n\t\t\tinteraction.sourceChoices,\n\t\t\tinteraction.targetChoices,\n\t\t\tinteraction.minAssociations,\n\t\t\tinteraction.maxAssociations\n\t\t)\n\t\tif (validationError) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(validationError, \"interaction\", { kind: \"interaction\", submission })\n\t\t\t)\n\t\t}\n\t\tsubmitKey = key\n\t\tsubmitPending = ctx\n\t\t\t.execute({ kind: \"interaction\", submission }, \"interaction\")\n\t\t\t.finally(function clearPending() {\n\t\t\t\tsubmitPending = undefined\n\t\t\t\tsubmitKey = undefined\n\t\t\t})\n\t\treturn submitPending\n\t}\n\n\tfunction timeout(): Promise<PrimerState<Pcis>> {\n\t\tconst intent = { kind: \"timeout\" as const }\n\t\tif (submitPending) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(ErrConflict, \"cannot timeout while submission is in flight\"),\n\t\t\t\t\t\"timeout\",\n\t\t\t\t\tintent\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tif (timeoutPending) {\n\t\t\treturn timeoutPending\n\t\t}\n\t\ttimeoutPending = ctx.execute(intent, \"timeout\").finally(function clearPending() {\n\t\t\ttimeoutPending = undefined\n\t\t})\n\t\treturn timeoutPending\n\t}\n\n\treturn {\n\t\tphase: \"interaction\",\n\t\tkind: \"match\",\n\t\tstimulus,\n\t\tinteraction,\n\t\tsourceChoices: interaction.sourceChoices,\n\t\ttargetChoices: interaction.targetChoices,\n\t\tminAssociations: interaction.minAssociations,\n\t\tmaxAssociations: interaction.maxAssociations,\n\t\tsubmitMatch,\n\t\ttimeout,\n\t\ttoJSON: poisonToJSON\n\t}\n}\n\nexport { matchState }\n",
|
|
14
|
+
"import { poisonToJSON } from \"@superbuilders/primer-tives/client/consumed\"\nimport type { SessionContext } from \"@superbuilders/primer-tives/client/session-context\"\nimport type { PciId } from \"@superbuilders/primer-tives/client/pci\"\nimport type { PrimerState, RendererStimulus } from \"@superbuilders/primer-tives/client/types\"\n\nfunction observationState<Pcis extends PciId>(\n\tctx: SessionContext<Pcis>,\n\tstimulus: RendererStimulus | null\n): PrimerState<Pcis> {\n\tlet pending: Promise<PrimerState<Pcis>> | undefined\n\treturn {\n\t\tphase: \"observation\",\n\t\tstimulus,\n\t\tadvance: function advance() {\n\t\t\tif (pending) {\n\t\t\t\treturn pending\n\t\t\t}\n\t\t\tpending = ctx.execute({ kind: \"observation\" }, \"observation\")\n\t\t\treturn pending\n\t\t},\n\t\ttoJSON: poisonToJSON\n\t}\n}\n\nexport { observationState }\n",
|
|
15
|
+
"import * as errors from \"@superbuilders/errors\"\nimport { poisonToJSON } from \"@superbuilders/primer-tives/client/consumed\"\nimport { ErrConflict, ErrInvalidSubmission } from \"@superbuilders/primer-tives/errors\"\nimport type { SessionContext } from \"@superbuilders/primer-tives/client/session-context\"\nimport type { PciId } from \"@superbuilders/primer-tives/client/pci\"\nimport type {\n\tPrimerState,\n\tRendererChoice,\n\tRendererStimulus,\n\tStandardRendererInteraction\n} from \"@superbuilders/primer-tives/client/types\"\n\nfunction findUnknownKey(orderedKeys: string[], choices: RendererChoice[]): string | null {\n\tconst choiceIds = new Set(\n\t\tchoices.map(function getId(c) {\n\t\t\treturn c.identifier\n\t\t})\n\t)\n\tfor (const key of orderedKeys) {\n\t\tif (!choiceIds.has(key)) {\n\t\t\treturn key\n\t\t}\n\t}\n\treturn null\n}\n\nfunction validateOrderSubmission(\n\tlog: SessionContext[\"log\"],\n\torderedKeys: string[],\n\tchoices: RendererChoice[],\n\tminChoices: number,\n\tmaxChoices: number\n): Error | null {\n\tif (orderedKeys.length < minChoices) {\n\t\tlog?.error(\"order submit below minChoices\", { orderedKeys, minChoices })\n\t\treturn errors.wrap(ErrInvalidSubmission, `need at least ${minChoices} selections`)\n\t}\n\tif (orderedKeys.length > maxChoices) {\n\t\tlog?.error(\"order submit above maxChoices\", { orderedKeys, maxChoices })\n\t\treturn errors.wrap(ErrInvalidSubmission, `at most ${maxChoices} selections`)\n\t}\n\tconst uniqueKeys = new Set(orderedKeys)\n\tif (uniqueKeys.size !== orderedKeys.length) {\n\t\tlog?.error(\"order submit has duplicates\", { orderedKeys })\n\t\treturn errors.wrap(ErrInvalidSubmission, \"duplicate selections\")\n\t}\n\tconst unknownKey = findUnknownKey(orderedKeys, choices)\n\tif (unknownKey) {\n\t\tlog?.error(\"order submit has unknown key\", { key: unknownKey })\n\t\treturn errors.wrap(ErrInvalidSubmission, `unknown choice '${unknownKey}'`)\n\t}\n\treturn null\n}\n\nfunction orderState<Pcis extends PciId>(\n\tctx: SessionContext<Pcis>,\n\tstimulus: RendererStimulus | null,\n\tinteraction: Extract<StandardRendererInteraction, { type: \"order\" }>\n): PrimerState<Pcis> {\n\tlet submitPending: Promise<PrimerState<Pcis>> | undefined\n\tlet submitKey: string | undefined\n\tlet timeoutPending: Promise<PrimerState<Pcis>> | undefined\n\n\tfunction submitOrder(orderedKeys: string[]): Promise<PrimerState<Pcis>> {\n\t\tconst submission = { type: \"order\" as const, orderedKeys }\n\t\tconst key = JSON.stringify(submission)\n\t\tif (timeoutPending) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(ErrConflict, \"cannot submit while timeout is in flight\"),\n\t\t\t\t\t\"interaction\",\n\t\t\t\t\t{ kind: \"interaction\", submission }\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tif (submitPending) {\n\t\t\tif (submitKey === key) {\n\t\t\t\treturn submitPending\n\t\t\t}\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(\n\t\t\t\t\t\tErrConflict,\n\t\t\t\t\t\t\"cannot submit a different order payload while submit is in flight\"\n\t\t\t\t\t),\n\t\t\t\t\t\"interaction\",\n\t\t\t\t\t{ kind: \"interaction\", submission }\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tconst validationError = validateOrderSubmission(\n\t\t\tctx.log,\n\t\t\torderedKeys,\n\t\t\tinteraction.choices,\n\t\t\tinteraction.minChoices,\n\t\t\tinteraction.maxChoices\n\t\t)\n\t\tif (validationError) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(validationError, \"interaction\", { kind: \"interaction\", submission })\n\t\t\t)\n\t\t}\n\t\tsubmitKey = key\n\t\tsubmitPending = ctx\n\t\t\t.execute({ kind: \"interaction\", submission }, \"interaction\")\n\t\t\t.finally(function clearPending() {\n\t\t\t\tsubmitPending = undefined\n\t\t\t\tsubmitKey = undefined\n\t\t\t})\n\t\treturn submitPending\n\t}\n\n\tfunction timeout(): Promise<PrimerState<Pcis>> {\n\t\tconst intent = { kind: \"timeout\" as const }\n\t\tif (submitPending) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(ErrConflict, \"cannot timeout while submission is in flight\"),\n\t\t\t\t\t\"timeout\",\n\t\t\t\t\tintent\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tif (timeoutPending) {\n\t\t\treturn timeoutPending\n\t\t}\n\t\ttimeoutPending = ctx.execute(intent, \"timeout\").finally(function clearPending() {\n\t\t\ttimeoutPending = undefined\n\t\t})\n\t\treturn timeoutPending\n\t}\n\n\treturn {\n\t\tphase: \"interaction\",\n\t\tkind: \"order\",\n\t\tstimulus,\n\t\tinteraction,\n\t\tchoices: interaction.choices,\n\t\tminChoices: interaction.minChoices,\n\t\tmaxChoices: interaction.maxChoices,\n\t\tsubmitOrder,\n\t\ttimeout,\n\t\ttoJSON: poisonToJSON\n\t}\n}\n\nexport { orderState }\n",
|
|
16
|
+
"import * as errors from \"@superbuilders/errors\"\nimport { poisonToJSON } from \"@superbuilders/primer-tives/client/consumed\"\nimport { ErrConflict } from \"@superbuilders/primer-tives/errors\"\nimport type { PciId, PciValue } from \"@superbuilders/primer-tives/client/pci\"\nimport type { SessionContext } from \"@superbuilders/primer-tives/client/session-context\"\nimport type {\n\tPciInteraction,\n\tPciInteractionState,\n\tPrimerState,\n\tRendererStimulus\n} from \"@superbuilders/primer-tives/client/types\"\n\nfunction pciInteractionState<Pcis extends PciId>(\n\tctx: SessionContext<Pcis>,\n\tstimulus: RendererStimulus | null,\n\tinteraction: PciInteraction<Pcis>\n): PciInteractionState<Pcis> {\n\tlet submitPending: Promise<PrimerState<Pcis>> | undefined\n\tlet submitKey: string | undefined\n\tlet timeoutPending: Promise<PrimerState<Pcis>> | undefined\n\tconst { pciId, properties } = interaction\n\n\tfunction submit(value: PciValue<typeof pciId>): Promise<PrimerState<Pcis>> {\n\t\tconst submission = { type: \"portable-custom\" as const, pciId, value }\n\t\tconst key = JSON.stringify(submission)\n\t\tif (timeoutPending) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(ErrConflict, \"cannot submit while timeout is in flight\"),\n\t\t\t\t\t\"interaction\",\n\t\t\t\t\t{ kind: \"interaction\", submission }\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tif (submitPending) {\n\t\t\tif (submitKey === key) {\n\t\t\t\treturn submitPending\n\t\t\t}\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(\n\t\t\t\t\t\tErrConflict,\n\t\t\t\t\t\t\"cannot submit a different pci payload while submit is in flight\"\n\t\t\t\t\t),\n\t\t\t\t\t\"interaction\",\n\t\t\t\t\t{ kind: \"interaction\", submission }\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tctx.log?.debug(\"pci submit\", { pciId })\n\t\tsubmitKey = key\n\t\tsubmitPending = ctx\n\t\t\t.execute({ kind: \"interaction\", submission }, \"interaction\")\n\t\t\t.finally(function clearPending() {\n\t\t\t\tsubmitPending = undefined\n\t\t\t\tsubmitKey = undefined\n\t\t\t})\n\t\treturn submitPending\n\t}\n\n\tfunction timeout(): Promise<PrimerState<Pcis>> {\n\t\tconst intent = { kind: \"timeout\" as const }\n\t\tif (submitPending) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(ErrConflict, \"cannot timeout while submission is in flight\"),\n\t\t\t\t\t\"timeout\",\n\t\t\t\t\tintent\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tif (timeoutPending) {\n\t\t\treturn timeoutPending\n\t\t}\n\t\tctx.log?.debug(\"pci timeout\", { pciId })\n\t\ttimeoutPending = ctx.execute(intent, \"timeout\").finally(function clearPending() {\n\t\t\ttimeoutPending = undefined\n\t\t})\n\t\treturn timeoutPending\n\t}\n\n\t// biome-ignore lint/plugin: TS cannot verify mapped-union construction from generic Pcis — pciId↔properties correlation preserved by input\n\treturn {\n\t\tphase: \"interaction\",\n\t\tkind: \"portable-custom\",\n\t\tstimulus,\n\t\tinteraction,\n\t\tpciId,\n\t\tproperties,\n\t\tsubmit,\n\t\ttimeout,\n\t\ttoJSON: poisonToJSON\n\t} as PciInteractionState<Pcis>\n}\n\nexport { pciInteractionState }\n",
|
|
17
|
+
"import * as errors from \"@superbuilders/errors\"\nimport { poisonToJSON } from \"@superbuilders/primer-tives/client/consumed\"\nimport { ErrConflict } from \"@superbuilders/primer-tives/errors\"\nimport type { SessionContext } from \"@superbuilders/primer-tives/client/session-context\"\nimport type { PciId } from \"@superbuilders/primer-tives/client/pci\"\nimport type {\n\tPrimerState,\n\tRendererInteraction,\n\tRendererStimulus\n} from \"@superbuilders/primer-tives/client/types\"\n\nfunction textEntryState<Pcis extends PciId>(\n\tctx: SessionContext<Pcis>,\n\tstimulus: RendererStimulus | null,\n\tinteraction: Extract<RendererInteraction<Pcis>, { type: \"text-entry\" }>\n): PrimerState<Pcis> {\n\tlet submitPending: Promise<PrimerState<Pcis>> | undefined\n\tlet submitKey: string | undefined\n\tlet timeoutPending: Promise<PrimerState<Pcis>> | undefined\n\n\tfunction submitText(value: string): Promise<PrimerState<Pcis>> {\n\t\tconst submission = { type: \"text-entry\" as const, value }\n\t\tconst key = JSON.stringify(submission)\n\t\tif (timeoutPending) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(ErrConflict, \"cannot submit while timeout is in flight\"),\n\t\t\t\t\t\"interaction\",\n\t\t\t\t\t{ kind: \"interaction\", submission }\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tif (submitPending) {\n\t\t\tif (submitKey === key) {\n\t\t\t\treturn submitPending\n\t\t\t}\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(\n\t\t\t\t\t\tErrConflict,\n\t\t\t\t\t\t\"cannot submit a different text payload while submit is in flight\"\n\t\t\t\t\t),\n\t\t\t\t\t\"interaction\",\n\t\t\t\t\t{ kind: \"interaction\", submission }\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tsubmitKey = key\n\t\tsubmitPending = ctx\n\t\t\t.execute({ kind: \"interaction\", submission }, \"interaction\")\n\t\t\t.finally(function clearPending() {\n\t\t\t\tsubmitPending = undefined\n\t\t\t\tsubmitKey = undefined\n\t\t\t})\n\t\treturn submitPending\n\t}\n\n\tfunction timeout(): Promise<PrimerState<Pcis>> {\n\t\tconst intent = { kind: \"timeout\" as const }\n\t\tif (submitPending) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tctx.errored(\n\t\t\t\t\terrors.wrap(ErrConflict, \"cannot timeout while submission is in flight\"),\n\t\t\t\t\t\"timeout\",\n\t\t\t\t\tintent\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tif (timeoutPending) {\n\t\t\treturn timeoutPending\n\t\t}\n\t\ttimeoutPending = ctx.execute(intent, \"timeout\").finally(function clearPending() {\n\t\t\ttimeoutPending = undefined\n\t\t})\n\t\treturn timeoutPending\n\t}\n\n\treturn {\n\t\tphase: \"interaction\",\n\t\tkind: \"text-entry\",\n\t\tstimulus,\n\t\tinteraction,\n\t\tsubmitText,\n\t\ttimeout,\n\t\ttoJSON: poisonToJSON\n\t}\n}\n\nexport { textEntryState }\n",
|
|
18
|
+
"const SUBJECTS = [\"math\", \"vocabulary\", \"science\"] as const\n\ntype Subject = (typeof SUBJECTS)[number]\n\ntype SubjectScope = Subject | \"all\"\n\nexport { SUBJECTS }\nexport type { Subject, SubjectScope }\n",
|
|
19
|
+
"type ContentSpan = { type: \"text\"; value: string } | { type: \"italic\"; value: string }\n\ntype ContentInline = ContentSpan | { type: \"latex\"; value: string }\n\ntype ContentBlock = { type: \"paragraph\"; children: ContentInline[] }\n\nfunction inlinesToPlainText(nodes: ContentInline[]): string {\n\tconst parts: string[] = []\n\tfor (const node of nodes) {\n\t\tswitch (node.type) {\n\t\t\tcase \"text\":\n\t\t\t\tparts.push(node.value)\n\t\t\t\tbreak\n\t\t\tcase \"italic\":\n\t\t\t\tparts.push(node.value)\n\t\t\t\tbreak\n\t\t\tcase \"latex\":\n\t\t\t\tparts.push(node.value)\n\t\t\t\tbreak\n\t\t}\n\t}\n\treturn parts.join(\"\")\n}\n\nfunction blocksToPlainText(blocks: ContentBlock[]): string {\n\treturn blocks\n\t\t.map(function blockText(block) {\n\t\t\treturn inlinesToPlainText(block.children)\n\t\t})\n\t\t.join(\"\\n\")\n}\n\nexport type { ContentBlock, ContentInline, ContentSpan }\nexport { blocksToPlainText, inlinesToPlainText }\n"
|
|
20
|
+
],
|
|
21
|
+
"mappings": "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",
|
|
22
|
+
"debugId": "77F88432A1CED38764756E2164756E21",
|
|
23
|
+
"names": []
|
|
24
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match-state.d.ts","sourceRoot":"","sources":["../../src/client/match-state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAA;AACxF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAA;AACnE,OAAO,KAAK,EAEX,WAAW,EAEX,gBAAgB,EAChB,2BAA2B,EAC3B,MAAM,0CAA0C,CAAA;AA8HjD,iBAAS,UAAU,CAAC,IAAI,SAAS,KAAK,EACrC,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC,EACzB,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EACjC,WAAW,EAAE,OAAO,CAAC,2BAA2B,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,GAClE,WAAW,CAAC,IAAI,CAAC,CAwFnB;AAED,OAAO,EAAE,UAAU,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observation-state.d.ts","sourceRoot":"","sources":["../../src/client/observation-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAA;AACxF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAA;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAA;AAE7F,iBAAS,gBAAgB,CAAC,IAAI,SAAS,KAAK,EAC3C,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC,EACzB,QAAQ,EAAE,gBAAgB,GAAG,IAAI,GAC/B,WAAW,CAAC,IAAI,CAAC,CAcnB;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-state.d.ts","sourceRoot":"","sources":["../../src/client/order-state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAA;AACxF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAA;AACnE,OAAO,KAAK,EACX,WAAW,EAEX,gBAAgB,EAChB,2BAA2B,EAC3B,MAAM,0CAA0C,CAAA;AA4CjD,iBAAS,UAAU,CAAC,IAAI,SAAS,KAAK,EACrC,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC,EACzB,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EACjC,WAAW,EAAE,OAAO,CAAC,2BAA2B,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,GAClE,WAAW,CAAC,IAAI,CAAC,CAsFnB;AAED,OAAO,EAAE,UAAU,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pci-state.d.ts","sourceRoot":"","sources":["../../src/client/pci-state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAY,MAAM,wCAAwC,CAAA;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAA;AACxF,OAAO,KAAK,EACX,cAAc,EACd,mBAAmB,EAEnB,gBAAgB,EAChB,MAAM,0CAA0C,CAAA;AAEjD,iBAAS,mBAAmB,CAAC,IAAI,SAAS,KAAK,EAC9C,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC,EACzB,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EACjC,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,GAC/B,mBAAmB,CAAC,IAAI,CAAC,CA6E3B;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pci.d.ts","sourceRoot":"","sources":["../../src/client/pci.ts"],"names":[],"mappings":"AAAA,UAAU,sBAAsB;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CACf;AAED,UAAU,2BAA2B;IACpC,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CACjB;AAED,UAAU,qBAAqB;IAC9B,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;IAChD,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;CACjD;AAED,UAAU,0BAA0B;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;CACnB;AAED,KAAK,MAAM,GAAG,kBAAkB,MAAM,EAAE,CAAA;AAExC,UAAU,WAAW;IACpB,mCAAmC,EAAE;QACpC,KAAK,EAAE,sBAAsB,CAAA;QAC7B,KAAK,EAAE,2BAA2B,CAAA;KAClC,CAAA;IACD,kCAAkC,EAAE;QACnC,KAAK,EAAE,qBAAqB,CAAA;QAC5B,KAAK,EAAE,0BAA0B,CAAA;KACjC,CAAA;CACD;AAMD,KAAK,KAAK,GAAG,MAAM,WAAW,GAAG,MAAM,CAAA;AACvC,KAAK,QAAQ,CAAC,CAAC,SAAS,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;AACxD,KAAK,QAAQ,CAAC,CAAC,SAAS,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;AAExD,YAAY,EACX,sBAAsB,EACtB,2BAA2B,EAC3B,qBAAqB,EACrB,0BAA0B,EAC1B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,MAAM,EACN,QAAQ,EACR,CAAA"}
|