@myscheme/voice-navigation-sdk 0.1.0 → 0.1.3
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 +587 -134
- package/dist/actions.d.ts +3 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +37 -97
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/navigation-controller.d.ts +3 -0
- package/dist/navigation-controller.d.ts.map +1 -1
- package/dist/navigation-controller.js +57 -8
- package/dist/services/bedrock.d.ts +4 -0
- package/dist/services/bedrock.d.ts.map +1 -1
- package/dist/services/bedrock.js +76 -21
- package/dist/services/page-registry.d.ts +25 -0
- package/dist/services/page-registry.d.ts.map +1 -0
- package/dist/services/page-registry.js +82 -0
- package/dist/services/xml-parser.d.ts +9 -0
- package/dist/services/xml-parser.d.ts.map +1 -0
- package/dist/services/xml-parser.js +60 -0
- package/dist/types.d.ts +14 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export class PageRegistry {
|
|
2
|
+
constructor(pages = []) {
|
|
3
|
+
this.pages = new Map();
|
|
4
|
+
this.pathToId = new Map();
|
|
5
|
+
this.keywordIndex = new Map();
|
|
6
|
+
this.loadPages(pages);
|
|
7
|
+
}
|
|
8
|
+
loadPages(pages) {
|
|
9
|
+
this.pages.clear();
|
|
10
|
+
this.pathToId.clear();
|
|
11
|
+
this.keywordIndex.clear();
|
|
12
|
+
for (const page of pages) {
|
|
13
|
+
this.addPage(page);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
addPage(page) {
|
|
17
|
+
this.pages.set(page.id, page);
|
|
18
|
+
this.pathToId.set(page.path, page.id);
|
|
19
|
+
const keywords = page.keywords || [];
|
|
20
|
+
const allKeywords = [
|
|
21
|
+
page.name.toLowerCase(),
|
|
22
|
+
page.id.toLowerCase(),
|
|
23
|
+
...keywords.map((k) => k.toLowerCase()),
|
|
24
|
+
];
|
|
25
|
+
for (const keyword of allKeywords) {
|
|
26
|
+
if (!this.keywordIndex.has(keyword)) {
|
|
27
|
+
this.keywordIndex.set(keyword, new Set());
|
|
28
|
+
}
|
|
29
|
+
this.keywordIndex.get(keyword).add(page.id);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
getPageById(id) {
|
|
33
|
+
return this.pages.get(id);
|
|
34
|
+
}
|
|
35
|
+
getPageByPath(path) {
|
|
36
|
+
const id = this.pathToId.get(path);
|
|
37
|
+
return id ? this.pages.get(id) : undefined;
|
|
38
|
+
}
|
|
39
|
+
findPageByKeyword(keyword) {
|
|
40
|
+
const normalized = keyword.toLowerCase().trim();
|
|
41
|
+
const pageIds = this.keywordIndex.get(normalized);
|
|
42
|
+
if (pageIds && pageIds.size > 0) {
|
|
43
|
+
const firstId = Array.from(pageIds)[0];
|
|
44
|
+
return this.pages.get(firstId);
|
|
45
|
+
}
|
|
46
|
+
for (const [key, ids] of this.keywordIndex.entries()) {
|
|
47
|
+
if (key.includes(normalized) || normalized.includes(key)) {
|
|
48
|
+
const firstId = Array.from(ids)[0];
|
|
49
|
+
return this.pages.get(firstId);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
getAllPages() {
|
|
55
|
+
return Array.from(this.pages.values());
|
|
56
|
+
}
|
|
57
|
+
getNavigationActions() {
|
|
58
|
+
return Array.from(this.pages.keys()).map((id) => `navigate_${id}`);
|
|
59
|
+
}
|
|
60
|
+
isPageNavigationAction(action) {
|
|
61
|
+
if (!action.startsWith("navigate_")) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
const pageId = action.replace(/^navigate_/, "");
|
|
65
|
+
return this.pages.has(pageId);
|
|
66
|
+
}
|
|
67
|
+
getPageIdFromAction(action) {
|
|
68
|
+
if (!action.startsWith("navigate_")) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
const pageId = action.replace(/^navigate_/, "");
|
|
72
|
+
return this.pages.has(pageId) ? pageId : null;
|
|
73
|
+
}
|
|
74
|
+
clear() {
|
|
75
|
+
this.pages.clear();
|
|
76
|
+
this.pathToId.clear();
|
|
77
|
+
this.keywordIndex.clear();
|
|
78
|
+
}
|
|
79
|
+
get size() {
|
|
80
|
+
return this.pages.size;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { NavigablePage } from "./page-registry.js";
|
|
2
|
+
export interface PageXMLConfig {
|
|
3
|
+
source: string | URL;
|
|
4
|
+
type: "url" | "string";
|
|
5
|
+
}
|
|
6
|
+
export declare function parseNavigationXML(xmlString: string): NavigablePage[];
|
|
7
|
+
export declare function fetchNavigationXML(url: string): Promise<NavigablePage[]>;
|
|
8
|
+
export declare function loadNavigationPages(config: PageXMLConfig): Promise<NavigablePage[]>;
|
|
9
|
+
//# sourceMappingURL=xml-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-parser.d.ts","sourceRoot":"","sources":["../../src/services/xml-parser.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;IACrB,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;CACxB;AAKD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,EAAE,CAsDrE;AAKD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,aAAa,EAAE,CAAC,CAgB1B;AAKD,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,EAAE,CAAC,CAM1B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export function parseNavigationXML(xmlString) {
|
|
2
|
+
if (typeof DOMParser === "undefined") {
|
|
3
|
+
throw new Error("XML parsing requires browser DOMParser");
|
|
4
|
+
}
|
|
5
|
+
const parser = new DOMParser();
|
|
6
|
+
const doc = parser.parseFromString(xmlString, "text/xml");
|
|
7
|
+
const parserError = doc.querySelector("parsererror");
|
|
8
|
+
if (parserError) {
|
|
9
|
+
throw new Error(`XML parsing failed: ${parserError.textContent || "Unknown error"}`);
|
|
10
|
+
}
|
|
11
|
+
const pages = [];
|
|
12
|
+
const pageElements = doc.querySelectorAll("page");
|
|
13
|
+
for (const element of Array.from(pageElements)) {
|
|
14
|
+
const id = element.getAttribute("id");
|
|
15
|
+
const name = element.getAttribute("name");
|
|
16
|
+
const path = element.getAttribute("path");
|
|
17
|
+
if (!id || !name || !path) {
|
|
18
|
+
console.warn("Skipping page with missing required attributes:", element.outerHTML);
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
const keywordsAttr = element.getAttribute("keywords");
|
|
22
|
+
const keywords = keywordsAttr
|
|
23
|
+
? keywordsAttr
|
|
24
|
+
.split(",")
|
|
25
|
+
.map((k) => k.trim())
|
|
26
|
+
.filter(Boolean)
|
|
27
|
+
: [];
|
|
28
|
+
const description = element.getAttribute("description") || undefined;
|
|
29
|
+
pages.push({
|
|
30
|
+
id,
|
|
31
|
+
name,
|
|
32
|
+
path,
|
|
33
|
+
keywords,
|
|
34
|
+
description,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return pages;
|
|
38
|
+
}
|
|
39
|
+
export async function fetchNavigationXML(url) {
|
|
40
|
+
try {
|
|
41
|
+
const response = await fetch(url);
|
|
42
|
+
if (!response.ok) {
|
|
43
|
+
throw new Error(`Failed to fetch XML from ${url}: ${response.status} ${response.statusText}`);
|
|
44
|
+
}
|
|
45
|
+
const xmlString = await response.text();
|
|
46
|
+
return parseNavigationXML(xmlString);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
console.error("Error fetching navigation XML:", error);
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export async function loadNavigationPages(config) {
|
|
54
|
+
if (config.type === "url") {
|
|
55
|
+
return fetchNavigationXML(config.source.toString());
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
return parseNavigationXML(config.source.toString());
|
|
59
|
+
}
|
|
60
|
+
}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export type CoreNavigationAction = "zoom_in" | "zoom_out" | "scroll_up" | "scroll_down" | "scroll_left" | "scroll_right" | "page_up" | "page_down" | "scroll_top" | "scroll_bottom" | "go_back" | "go_forward" | "reload_page" | "print_page" | "copy_url" | "open_menu" | "close_menu" | "focus_search" | "toggle_fullscreen" | "exit_fullscreen" | "play_media" | "pause_media" | "mute_media" | "unmute_media" | "search_content" | "stop" | "unknown";
|
|
2
|
+
export type NavigationAction = CoreNavigationAction | `navigate_${string}`;
|
|
2
3
|
export interface NavigationConfig {
|
|
3
4
|
aws?: {
|
|
4
5
|
region?: string;
|
|
@@ -16,6 +17,18 @@ export interface NavigationConfig {
|
|
|
16
17
|
actionHandlers?: Partial<Record<NavigationAction, (context?: ActionContext) => void>>;
|
|
17
18
|
opensearch?: OpenSearchConfig;
|
|
18
19
|
openSearch?: OpenSearchConfig;
|
|
20
|
+
pages?: NavigationPagesConfig;
|
|
21
|
+
}
|
|
22
|
+
export interface NavigationPagesConfig {
|
|
23
|
+
xml?: string;
|
|
24
|
+
xmlType?: "url" | "string";
|
|
25
|
+
pages?: Array<{
|
|
26
|
+
id: string;
|
|
27
|
+
name: string;
|
|
28
|
+
path: string;
|
|
29
|
+
keywords?: string[];
|
|
30
|
+
description?: string;
|
|
31
|
+
}>;
|
|
19
32
|
}
|
|
20
33
|
export interface OpenSearchConfig {
|
|
21
34
|
node: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|