@pie-players/pie-assessment-toolkit 0.3.25 → 0.3.27
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 +70 -17
- package/dist/components/ItemToolBar.custom-element.js +116 -9
- package/dist/components/PieAssessmentToolkit.custom-element.js +302 -7
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/services/HighlightCoordinator.d.ts +3 -2
- package/dist/services/HighlightCoordinator.d.ts.map +1 -1
- package/dist/services/HighlightCoordinator.js +6 -3
- package/dist/services/HighlightCoordinator.js.map +1 -1
- package/dist/services/TTSService.d.ts +3 -0
- package/dist/services/TTSService.d.ts.map +1 -1
- package/dist/services/TTSService.js +66 -5
- package/dist/services/TTSService.js.map +1 -1
- package/dist/services/ToolRegistry.d.ts +10 -1
- package/dist/services/ToolRegistry.d.ts.map +1 -1
- package/dist/services/ToolRegistry.js.map +1 -1
- package/dist/services/ToolkitCoordinator.d.ts +37 -5
- package/dist/services/ToolkitCoordinator.d.ts.map +1 -1
- package/dist/services/ToolkitCoordinator.js +114 -35
- package/dist/services/ToolkitCoordinator.js.map +1 -1
- package/dist/services/create-tools-config.d.ts +15 -0
- package/dist/services/create-tools-config.d.ts.map +1 -0
- package/dist/services/create-tools-config.js +13 -0
- package/dist/services/create-tools-config.js.map +1 -0
- package/dist/services/framework-error.d.ts +34 -0
- package/dist/services/framework-error.d.ts.map +1 -0
- package/dist/services/framework-error.js +43 -0
- package/dist/services/framework-error.js.map +1 -0
- package/dist/services/tool-config-validation.d.ts +31 -0
- package/dist/services/tool-config-validation.d.ts.map +1 -0
- package/dist/services/tool-config-validation.js +242 -0
- package/dist/services/tool-config-validation.js.map +1 -0
- package/dist/services/toolbar-items.d.ts +1 -0
- package/dist/services/toolbar-items.d.ts.map +1 -1
- package/dist/services/toolbar-items.js +28 -2
- package/dist/services/toolbar-items.js.map +1 -1
- package/dist/services/tts/visual-line-ranges.d.ts +19 -0
- package/dist/services/tts/visual-line-ranges.d.ts.map +1 -0
- package/dist/services/tts/visual-line-ranges.js +227 -0
- package/dist/services/tts/visual-line-ranges.js.map +1 -0
- package/dist/services/tts-runtime-config.d.ts +29 -0
- package/dist/services/tts-runtime-config.d.ts.map +1 -1
- package/dist/services/tts-runtime-config.js +101 -9
- package/dist/services/tts-runtime-config.js.map +1 -1
- package/dist/tools/registrations/accessibility-tools.js +1 -1
- package/dist/tools/registrations/accessibility-tools.js.map +1 -1
- package/dist/tools/registrations/measurement-tools.js +4 -4
- package/dist/tools/registrations/measurement-tools.js.map +1 -1
- package/dist/tools/registrations/tts.d.ts +1 -0
- package/dist/tools/registrations/tts.d.ts.map +1 -1
- package/dist/tools/registrations/tts.js +52 -21
- package/dist/tools/registrations/tts.js.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ToolConfigDiagnostic } from "./tool-config-validation.js";
|
|
2
|
+
export type FrameworkErrorKind = "tool-config" | "runtime-init" | "runtime-dispose" | "coordinator-init" | "provider-init" | "provider-register" | "tts-init" | "unknown";
|
|
3
|
+
export type FrameworkErrorSeverity = "warning" | "error";
|
|
4
|
+
export interface FrameworkErrorModel {
|
|
5
|
+
kind: FrameworkErrorKind;
|
|
6
|
+
severity: FrameworkErrorSeverity;
|
|
7
|
+
source: string;
|
|
8
|
+
message: string;
|
|
9
|
+
details: string[];
|
|
10
|
+
recoverable: boolean;
|
|
11
|
+
cause?: unknown;
|
|
12
|
+
}
|
|
13
|
+
export declare function toFrameworkErrorModel(args: {
|
|
14
|
+
kind: FrameworkErrorKind;
|
|
15
|
+
severity?: FrameworkErrorSeverity;
|
|
16
|
+
source: string;
|
|
17
|
+
message: string;
|
|
18
|
+
details?: string[];
|
|
19
|
+
recoverable?: boolean;
|
|
20
|
+
cause?: unknown;
|
|
21
|
+
}): FrameworkErrorModel;
|
|
22
|
+
export declare function frameworkErrorFromUnknown(args: {
|
|
23
|
+
kind: FrameworkErrorKind;
|
|
24
|
+
source: string;
|
|
25
|
+
error: unknown;
|
|
26
|
+
recoverable?: boolean;
|
|
27
|
+
}): FrameworkErrorModel;
|
|
28
|
+
export declare function frameworkErrorFromToolConfigDiagnostics(args: {
|
|
29
|
+
source: string;
|
|
30
|
+
diagnostics: ToolConfigDiagnostic[];
|
|
31
|
+
recoverable?: boolean;
|
|
32
|
+
}): FrameworkErrorModel;
|
|
33
|
+
export declare function formatFrameworkErrorForConsole(error: FrameworkErrorModel): string;
|
|
34
|
+
//# sourceMappingURL=framework-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-error.d.ts","sourceRoot":"","sources":["../../src/services/framework-error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAExE,MAAM,MAAM,kBAAkB,GAC3B,aAAa,GACb,cAAc,GACd,iBAAiB,GACjB,kBAAkB,GAClB,eAAe,GACf,mBAAmB,GACnB,UAAU,GACV,SAAS,CAAC;AAEb,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,sBAAsB,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC3C,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,mBAAmB,CAUtB;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC/C,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,mBAAmB,CAYtB;AAED,wBAAgB,uCAAuC,CAAC,IAAI,EAAE;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,mBAAmB,CAetB;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAIjF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export function toFrameworkErrorModel(args) {
|
|
2
|
+
return {
|
|
3
|
+
kind: args.kind,
|
|
4
|
+
severity: args.severity ?? "error",
|
|
5
|
+
source: args.source,
|
|
6
|
+
message: args.message,
|
|
7
|
+
details: [...(args.details || [])],
|
|
8
|
+
recoverable: args.recoverable === true,
|
|
9
|
+
cause: args.cause,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function frameworkErrorFromUnknown(args) {
|
|
13
|
+
const message = args.error instanceof Error && args.error.message.trim().length > 0
|
|
14
|
+
? args.error.message
|
|
15
|
+
: String(args.error || "Unknown framework error");
|
|
16
|
+
return toFrameworkErrorModel({
|
|
17
|
+
kind: args.kind,
|
|
18
|
+
source: args.source,
|
|
19
|
+
message,
|
|
20
|
+
recoverable: args.recoverable,
|
|
21
|
+
cause: args.error,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export function frameworkErrorFromToolConfigDiagnostics(args) {
|
|
25
|
+
const details = args.diagnostics.map((diagnostic) => `${diagnostic.path}: ${diagnostic.message}`);
|
|
26
|
+
const message = details.length > 0
|
|
27
|
+
? "Invalid tools config."
|
|
28
|
+
: "Invalid tools config (no diagnostics details were provided).";
|
|
29
|
+
return toFrameworkErrorModel({
|
|
30
|
+
kind: "tool-config",
|
|
31
|
+
source: args.source,
|
|
32
|
+
message,
|
|
33
|
+
details,
|
|
34
|
+
recoverable: args.recoverable,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export function formatFrameworkErrorForConsole(error) {
|
|
38
|
+
const prefix = `[pie-framework:${error.kind}:${error.source}]`;
|
|
39
|
+
if (error.details.length === 0)
|
|
40
|
+
return `${prefix} ${error.message}`;
|
|
41
|
+
return `${prefix} ${error.message}\n- ${error.details.join("\n- ")}`;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=framework-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-error.js","sourceRoot":"","sources":["../../src/services/framework-error.ts"],"names":[],"mappings":"AAwBA,MAAM,UAAU,qBAAqB,CAAC,IAQrC;IACA,OAAO;QACN,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,OAAO;QAClC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAClC,WAAW,EAAE,IAAI,CAAC,WAAW,KAAK,IAAI;QACtC,KAAK,EAAE,IAAI,CAAC,KAAK;KACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAKzC;IACA,MAAM,OAAO,GACZ,IAAI,CAAC,KAAK,YAAY,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAClE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;QACpB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,yBAAyB,CAAC,CAAC;IACpD,OAAO,qBAAqB,CAAC;QAC5B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO;QACP,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;KACjB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uCAAuC,CAAC,IAIvD;IACA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CACnC,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,OAAO,EAAE,CAC3D,CAAC;IACF,MAAM,OAAO,GACZ,OAAO,CAAC,MAAM,GAAG,CAAC;QACjB,CAAC,CAAC,uBAAuB;QACzB,CAAC,CAAC,8DAA8D,CAAC;IACnE,OAAO,qBAAqB,CAAC;QAC5B,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO;QACP,OAAO;QACP,WAAW,EAAE,IAAI,CAAC,WAAW;KAC7B,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAA0B;IACxE,MAAM,MAAM,GAAG,kBAAkB,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;IAC/D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;IACpE,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type CanonicalToolsConfig } from "./tools-config-normalizer.js";
|
|
2
|
+
import { type FrameworkErrorModel } from "./framework-error.js";
|
|
3
|
+
import type { ToolRegistry } from "./ToolRegistry.js";
|
|
4
|
+
export type ToolConfigStrictness = "off" | "warn" | "error";
|
|
5
|
+
export type ToolConfigDiagnosticSeverity = "warning" | "error";
|
|
6
|
+
export interface ToolConfigDiagnostic {
|
|
7
|
+
code: "tools.unknownToolId" | "tools.unsupportedLevel" | "tools.unknownProviderKey" | "tools.deprecatedProviderKey" | "tools.providerSanitizeFailed" | "tools.providerValidateFailed" | "tools.invalidProviderValidation";
|
|
8
|
+
severity: ToolConfigDiagnosticSeverity;
|
|
9
|
+
path: string;
|
|
10
|
+
message: string;
|
|
11
|
+
toolId?: string;
|
|
12
|
+
providerId?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ToolConfigValidationOptions {
|
|
15
|
+
strictness?: ToolConfigStrictness;
|
|
16
|
+
source?: string;
|
|
17
|
+
toolRegistry?: ToolRegistry | null;
|
|
18
|
+
}
|
|
19
|
+
export interface ToolConfigValidationResult {
|
|
20
|
+
config: CanonicalToolsConfig;
|
|
21
|
+
diagnostics: ToolConfigDiagnostic[];
|
|
22
|
+
}
|
|
23
|
+
export declare function frameworkErrorFromToolConfigValidation(args: {
|
|
24
|
+
source: string;
|
|
25
|
+
diagnostics?: ToolConfigDiagnostic[] | null;
|
|
26
|
+
error?: unknown;
|
|
27
|
+
recoverable?: boolean;
|
|
28
|
+
}): FrameworkErrorModel;
|
|
29
|
+
export declare function normalizeToolConfigStrictness(value: unknown): ToolConfigStrictness;
|
|
30
|
+
export declare function normalizeAndValidateToolsConfig(input?: Partial<CanonicalToolsConfig> | null, options?: ToolConfigValidationOptions): ToolConfigValidationResult;
|
|
31
|
+
//# sourceMappingURL=tool-config-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-config-validation.d.ts","sourceRoot":"","sources":["../../src/services/tool-config-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,oBAAoB,EAGzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAGN,KAAK,mBAAmB,EACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGxE,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5D,MAAM,MAAM,4BAA4B,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACpC,IAAI,EACD,qBAAqB,GACrB,wBAAwB,GACxB,0BAA0B,GAC1B,6BAA6B,GAC7B,8BAA8B,GAC9B,8BAA8B,GAC9B,iCAAiC,CAAC;IACrC,QAAQ,EAAE,4BAA4B,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,2BAA2B;IAC3C,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,0BAA0B;IAC1C,MAAM,EAAE,oBAAoB,CAAC;IAC7B,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACpC;AAED,wBAAgB,sCAAsC,CAAC,IAAI,EAAE;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,oBAAoB,EAAE,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,mBAAmB,CActB;AAID,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,OAAO,GACZ,oBAAoB,CAKtB;AA6OD,wBAAgB,+BAA+B,CAC9C,KAAK,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI,EAC5C,OAAO,GAAE,2BAAgC,GACvC,0BAA0B,CA+D5B"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { normalizeToolsConfig, } from "./tools-config-normalizer.js";
|
|
2
|
+
import { frameworkErrorFromToolConfigDiagnostics, frameworkErrorFromUnknown, } from "./framework-error.js";
|
|
3
|
+
import { createPackagedToolRegistry } from "./createDefaultToolRegistry.js";
|
|
4
|
+
export function frameworkErrorFromToolConfigValidation(args) {
|
|
5
|
+
if (Array.isArray(args.diagnostics) && args.diagnostics.length > 0) {
|
|
6
|
+
return frameworkErrorFromToolConfigDiagnostics({
|
|
7
|
+
source: args.source,
|
|
8
|
+
diagnostics: args.diagnostics,
|
|
9
|
+
recoverable: args.recoverable,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
return frameworkErrorFromUnknown({
|
|
13
|
+
kind: "tool-config",
|
|
14
|
+
source: args.source,
|
|
15
|
+
error: args.error ?? new Error("Invalid tools config"),
|
|
16
|
+
recoverable: args.recoverable,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
const DEFAULT_STRICTNESS = "error";
|
|
20
|
+
export function normalizeToolConfigStrictness(value) {
|
|
21
|
+
if (value === "off" || value === "warn" || value === "error") {
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
return DEFAULT_STRICTNESS;
|
|
25
|
+
}
|
|
26
|
+
function createDiagnostic(diagnostic) {
|
|
27
|
+
return diagnostic;
|
|
28
|
+
}
|
|
29
|
+
function getRegistryToolMap(toolRegistry) {
|
|
30
|
+
if (!toolRegistry)
|
|
31
|
+
return new Map();
|
|
32
|
+
return new Map(toolRegistry
|
|
33
|
+
.getAllTools()
|
|
34
|
+
.slice()
|
|
35
|
+
.sort((left, right) => left.toolId.localeCompare(right.toolId))
|
|
36
|
+
.map((tool) => [tool.toolId, tool]));
|
|
37
|
+
}
|
|
38
|
+
function sanitizeProviderConfig(providerId, providerConfig, tool, diagnostics) {
|
|
39
|
+
if (!providerConfig || !tool?.provider?.sanitizeConfig)
|
|
40
|
+
return providerConfig;
|
|
41
|
+
try {
|
|
42
|
+
const sanitized = tool.provider.sanitizeConfig(providerConfig);
|
|
43
|
+
if (!sanitized || typeof sanitized !== "object" || Array.isArray(sanitized)) {
|
|
44
|
+
diagnostics.push(createDiagnostic({
|
|
45
|
+
code: "tools.providerSanitizeFailed",
|
|
46
|
+
severity: "error",
|
|
47
|
+
path: `providers.${providerId}`,
|
|
48
|
+
message: `Provider sanitizer for "${providerId}" must return an object.`,
|
|
49
|
+
providerId,
|
|
50
|
+
toolId: providerId,
|
|
51
|
+
}));
|
|
52
|
+
return providerConfig;
|
|
53
|
+
}
|
|
54
|
+
return sanitized;
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
diagnostics.push(createDiagnostic({
|
|
58
|
+
code: "tools.providerSanitizeFailed",
|
|
59
|
+
severity: "error",
|
|
60
|
+
path: `providers.${providerId}`,
|
|
61
|
+
message: `Provider sanitizer failed for "${providerId}": ${error instanceof Error ? error.message : String(error)}`,
|
|
62
|
+
providerId,
|
|
63
|
+
toolId: providerId,
|
|
64
|
+
}));
|
|
65
|
+
return providerConfig;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function validateProviderConfig(providerId, providerConfig, tool, diagnostics) {
|
|
69
|
+
if (!providerConfig || !tool?.provider?.validateConfig)
|
|
70
|
+
return;
|
|
71
|
+
try {
|
|
72
|
+
const providerDiagnostics = tool.provider.validateConfig(providerConfig);
|
|
73
|
+
if (!Array.isArray(providerDiagnostics)) {
|
|
74
|
+
diagnostics.push(createDiagnostic({
|
|
75
|
+
code: "tools.invalidProviderValidation",
|
|
76
|
+
severity: "error",
|
|
77
|
+
path: `providers.${providerId}`,
|
|
78
|
+
message: `Provider validator for "${providerId}" must return an array.`,
|
|
79
|
+
providerId,
|
|
80
|
+
toolId: providerId,
|
|
81
|
+
}));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
for (const diagnostic of providerDiagnostics) {
|
|
85
|
+
diagnostics.push({
|
|
86
|
+
...diagnostic,
|
|
87
|
+
path: diagnostic.path || `providers.${providerId}`,
|
|
88
|
+
providerId: diagnostic.providerId || providerId,
|
|
89
|
+
toolId: diagnostic.toolId || providerId,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
diagnostics.push(createDiagnostic({
|
|
95
|
+
code: "tools.providerValidateFailed",
|
|
96
|
+
severity: "error",
|
|
97
|
+
path: `providers.${providerId}`,
|
|
98
|
+
message: `Provider validator failed for "${providerId}": ${error instanceof Error ? error.message : String(error)}`,
|
|
99
|
+
providerId,
|
|
100
|
+
toolId: providerId,
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function collectPlacementDiagnostics(config, toolMap, diagnostics) {
|
|
105
|
+
if (toolMap.size === 0)
|
|
106
|
+
return;
|
|
107
|
+
const levelOrder = ["section", "item", "passage"];
|
|
108
|
+
for (const level of levelOrder) {
|
|
109
|
+
for (const toolId of config.placement[level]) {
|
|
110
|
+
const tool = toolMap.get(toolId);
|
|
111
|
+
if (!tool) {
|
|
112
|
+
diagnostics.push(createDiagnostic({
|
|
113
|
+
code: "tools.unknownToolId",
|
|
114
|
+
severity: "error",
|
|
115
|
+
path: `placement.${level}`,
|
|
116
|
+
message: `Unknown tool id "${toolId}" in placement.${level}.`,
|
|
117
|
+
toolId,
|
|
118
|
+
}));
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const supportsLevel = tool.supportedLevels.includes(level);
|
|
122
|
+
// Leniency policy: section-capable tools are tolerated in item placement.
|
|
123
|
+
// This avoids strict failures for common host config patterns while still
|
|
124
|
+
// enforcing upward-invalid placements (for example item-only -> section).
|
|
125
|
+
const allowSectionToolInItemPlacement = level === "item" && tool.supportedLevels.includes("section");
|
|
126
|
+
if (!supportsLevel && !allowSectionToolInItemPlacement) {
|
|
127
|
+
diagnostics.push(createDiagnostic({
|
|
128
|
+
code: "tools.unsupportedLevel",
|
|
129
|
+
severity: "error",
|
|
130
|
+
path: `placement.${level}`,
|
|
131
|
+
message: `Tool "${toolId}" does not support level "${level}".`,
|
|
132
|
+
toolId,
|
|
133
|
+
}));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function collectPolicyDiagnostics(config, toolMap, diagnostics) {
|
|
139
|
+
if (toolMap.size === 0)
|
|
140
|
+
return;
|
|
141
|
+
for (const toolId of config.policy.allowed || []) {
|
|
142
|
+
if (toolMap.has(toolId))
|
|
143
|
+
continue;
|
|
144
|
+
diagnostics.push(createDiagnostic({
|
|
145
|
+
code: "tools.unknownToolId",
|
|
146
|
+
severity: "error",
|
|
147
|
+
path: "policy.allowed",
|
|
148
|
+
message: `Unknown tool id "${toolId}" in policy.allowed.`,
|
|
149
|
+
toolId,
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
for (const toolId of config.policy.blocked || []) {
|
|
153
|
+
if (toolMap.has(toolId))
|
|
154
|
+
continue;
|
|
155
|
+
diagnostics.push(createDiagnostic({
|
|
156
|
+
code: "tools.unknownToolId",
|
|
157
|
+
severity: "error",
|
|
158
|
+
path: "policy.blocked",
|
|
159
|
+
message: `Unknown tool id "${toolId}" in policy.blocked.`,
|
|
160
|
+
toolId,
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function collectProviderKeyDiagnostics(config, toolMap, hasDeprecatedTtsKey, diagnostics) {
|
|
165
|
+
if (hasDeprecatedTtsKey) {
|
|
166
|
+
diagnostics.push(createDiagnostic({
|
|
167
|
+
code: "tools.deprecatedProviderKey",
|
|
168
|
+
severity: "error",
|
|
169
|
+
path: "providers.tts",
|
|
170
|
+
message: `Provider key "tts" is no longer supported. Use "providers.textToSpeech".`,
|
|
171
|
+
providerId: "tts",
|
|
172
|
+
toolId: "textToSpeech",
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
for (const providerId of Object.keys(config.providers).sort()) {
|
|
176
|
+
if (toolMap.size === 0 || toolMap.has(providerId))
|
|
177
|
+
continue;
|
|
178
|
+
diagnostics.push(createDiagnostic({
|
|
179
|
+
code: "tools.unknownProviderKey",
|
|
180
|
+
severity: "error",
|
|
181
|
+
path: `providers.${providerId}`,
|
|
182
|
+
message: `Unknown provider key "${providerId}".`,
|
|
183
|
+
providerId,
|
|
184
|
+
toolId: providerId,
|
|
185
|
+
}));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function emitWarnings(diagnostics, source) {
|
|
189
|
+
if (diagnostics.length === 0)
|
|
190
|
+
return;
|
|
191
|
+
for (const diagnostic of diagnostics) {
|
|
192
|
+
const prefix = `[tool-config-validation:${source}]`;
|
|
193
|
+
console.warn(`${prefix} ${diagnostic.path} - ${diagnostic.message}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function throwValidationError(diagnostics, source) {
|
|
197
|
+
const formatted = diagnostics
|
|
198
|
+
.map((diagnostic) => `- ${diagnostic.path}: ${diagnostic.message}`)
|
|
199
|
+
.join("\n");
|
|
200
|
+
throw new Error(`[tool-config-validation:${source}] Invalid tools config:\n${formatted}`);
|
|
201
|
+
}
|
|
202
|
+
export function normalizeAndValidateToolsConfig(input, options = {}) {
|
|
203
|
+
const strictness = normalizeToolConfigStrictness(options.strictness);
|
|
204
|
+
const source = options.source ?? "tools";
|
|
205
|
+
const registryTools = getRegistryToolMap(options.toolRegistry ?? createPackagedToolRegistry());
|
|
206
|
+
const normalized = normalizeToolsConfig(input);
|
|
207
|
+
const diagnostics = [];
|
|
208
|
+
const hasDeprecatedTtsKey = Object.prototype.hasOwnProperty.call(normalized.providers, "tts");
|
|
209
|
+
const nextProviders = {
|
|
210
|
+
...(normalized.providers || {}),
|
|
211
|
+
};
|
|
212
|
+
for (const providerId of Object.keys(nextProviders).sort()) {
|
|
213
|
+
if (providerId === "tts") {
|
|
214
|
+
delete nextProviders.tts;
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
const tool = registryTools.get(providerId);
|
|
218
|
+
nextProviders[providerId] = sanitizeProviderConfig(providerId, nextProviders[providerId], tool, diagnostics);
|
|
219
|
+
validateProviderConfig(providerId, nextProviders[providerId], tool, diagnostics);
|
|
220
|
+
}
|
|
221
|
+
const nextConfig = {
|
|
222
|
+
...normalized,
|
|
223
|
+
providers: nextProviders,
|
|
224
|
+
};
|
|
225
|
+
collectPlacementDiagnostics(nextConfig, registryTools, diagnostics);
|
|
226
|
+
collectPolicyDiagnostics(nextConfig, registryTools, diagnostics);
|
|
227
|
+
collectProviderKeyDiagnostics(nextConfig, registryTools, hasDeprecatedTtsKey, diagnostics);
|
|
228
|
+
if (hasDeprecatedTtsKey) {
|
|
229
|
+
throwValidationError(diagnostics.filter((entry) => entry.code === "tools.deprecatedProviderKey"), source);
|
|
230
|
+
}
|
|
231
|
+
if (strictness === "warn") {
|
|
232
|
+
emitWarnings(diagnostics, source);
|
|
233
|
+
}
|
|
234
|
+
if (strictness === "error" && diagnostics.length > 0) {
|
|
235
|
+
throwValidationError(diagnostics, source);
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
config: nextConfig,
|
|
239
|
+
diagnostics,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=tool-config-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-config-validation.js","sourceRoot":"","sources":["../../src/services/tool-config-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,7 @@ export interface ToolbarLinkItem extends ToolbarItemBase {
|
|
|
21
21
|
}
|
|
22
22
|
export type ToolbarItem = ToolbarButtonItem | ToolbarLinkItem;
|
|
23
23
|
export declare function isToolbarLinkItem(item: ToolbarItem): item is ToolbarLinkItem;
|
|
24
|
+
export declare function isValidToolbarItemShape(value: unknown): value is ToolbarItem;
|
|
24
25
|
export declare function isInlineSvgIcon(icon: string | undefined): boolean;
|
|
25
26
|
export declare function isExternalIconUrl(icon: string | undefined): boolean;
|
|
26
27
|
//# sourceMappingURL=toolbar-items.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolbar-items.d.ts","sourceRoot":"","sources":["../../src/services/toolbar-items.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAkB,SAAQ,eAAe;IACzD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,GAAG,CAAC,EAAE,KAAK,CAAC;CACZ;AAED,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,KAAK,CAAC;CAChB;AAED,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,eAAe,CAAC;AAE9D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,IAAI,eAAe,CAE5E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEjE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEnE"}
|
|
1
|
+
{"version":3,"file":"toolbar-items.d.ts","sourceRoot":"","sources":["../../src/services/toolbar-items.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAkB,SAAQ,eAAe;IACzD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,GAAG,CAAC,EAAE,KAAK,CAAC;CACZ;AAED,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,KAAK,CAAC;CAChB;AAED,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,eAAe,CAAC;AAE9D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,IAAI,eAAe,CAE5E;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAgB5E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEjE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEnE"}
|
|
@@ -1,10 +1,36 @@
|
|
|
1
1
|
export function isToolbarLinkItem(item) {
|
|
2
2
|
return typeof item.href === "string";
|
|
3
3
|
}
|
|
4
|
+
export function isValidToolbarItemShape(value) {
|
|
5
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
6
|
+
return false;
|
|
7
|
+
const item = value;
|
|
8
|
+
if (typeof item.id !== "string" || item.id.trim().length === 0)
|
|
9
|
+
return false;
|
|
10
|
+
if (typeof item.label !== "string" || item.label.trim().length === 0)
|
|
11
|
+
return false;
|
|
12
|
+
if (item.ariaLabel !== undefined && typeof item.ariaLabel !== "string")
|
|
13
|
+
return false;
|
|
14
|
+
if (item.icon !== undefined && typeof item.icon !== "string")
|
|
15
|
+
return false;
|
|
16
|
+
if (item.tooltip !== undefined && typeof item.tooltip !== "string")
|
|
17
|
+
return false;
|
|
18
|
+
if (item.active !== undefined && typeof item.active !== "boolean")
|
|
19
|
+
return false;
|
|
20
|
+
if (item.disabled !== undefined && typeof item.disabled !== "boolean")
|
|
21
|
+
return false;
|
|
22
|
+
const hasHref = typeof item.href === "string";
|
|
23
|
+
const hasOnClick = typeof item.onClick === "function";
|
|
24
|
+
if (hasHref === hasOnClick)
|
|
25
|
+
return false;
|
|
26
|
+
if (hasHref)
|
|
27
|
+
return true;
|
|
28
|
+
return hasOnClick;
|
|
29
|
+
}
|
|
4
30
|
export function isInlineSvgIcon(icon) {
|
|
5
|
-
return typeof icon === "string" && icon.startsWith("<svg");
|
|
31
|
+
return typeof icon === "string" && icon.trimStart().startsWith("<svg");
|
|
6
32
|
}
|
|
7
33
|
export function isExternalIconUrl(icon) {
|
|
8
|
-
return typeof icon === "string" && icon.startsWith("http");
|
|
34
|
+
return typeof icon === "string" && icon.trimStart().startsWith("http");
|
|
9
35
|
}
|
|
10
36
|
//# sourceMappingURL=toolbar-items.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolbar-items.js","sourceRoot":"","sources":["../../src/services/toolbar-items.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IAClD,OAAO,OAAQ,IAAwB,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAwB;IACvD,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"toolbar-items.js","sourceRoot":"","sources":["../../src/services/toolbar-items.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IAClD,OAAO,OAAQ,IAAwB,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACrD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9E,MAAM,IAAI,GAAG,KAAgC,CAAC;IAC9C,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7E,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnF,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACrF,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC3E,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACjF,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAChF,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAEpF,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;IAC9C,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU,CAAC;IACtD,IAAI,OAAO,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,OAAO;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,UAAU,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAwB;IACvD,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAwB;IACzD,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derive visual line box ranges inside a root element for TTS read-along.
|
|
3
|
+
*
|
|
4
|
+
* Cloud TTS (Polly, Google, etc.) only provides word/sentence character offsets.
|
|
5
|
+
* “Lines” are layout-dependent (wrap, zoom, font size), so we compute them in
|
|
6
|
+
* the browser from the same DOM Range already used for word highlighting.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Intersect `range` with the contents of `root` (document order).
|
|
10
|
+
* Returns null if there is no non-empty intersection.
|
|
11
|
+
*/
|
|
12
|
+
export declare function intersectRangeWithElement(range: Range, root: Element): Range | null;
|
|
13
|
+
/**
|
|
14
|
+
* Returns one Range per visual line that intersects `focus`, expanded to the
|
|
15
|
+
* full width of each line within `root`. Falls back to `[intersectedFocus]`
|
|
16
|
+
* when layout or caret APIs are unavailable.
|
|
17
|
+
*/
|
|
18
|
+
export declare function visualLineRangesForFocusInRoot(root: Element, focus: Range): Range[];
|
|
19
|
+
//# sourceMappingURL=visual-line-ranges.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-line-ranges.d.ts","sourceRoot":"","sources":["../../../src/services/tts/visual-line-ranges.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgDH;;;GAGG;AACH,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,OAAO,GACX,KAAK,GAAG,IAAI,CA+Bd;AA6DD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC7C,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,KAAK,GACV,KAAK,EAAE,CA0GT"}
|