handhold-sdk 1.0.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 +427 -0
- package/dist/d44f1fe8001e32f8e74d.svg +3056 -0
- package/dist/fonts/Phosphor.ttf +0 -0
- package/dist/fonts/Phosphor.woff +0 -0
- package/dist/fonts/Phosphor.woff2 +0 -0
- package/dist/handhold.min.js +1 -0
- package/package.json +114 -0
- package/src/HandHold.js +1599 -0
- package/src/agent/VENDOR.md +203 -0
- package/src/agent/agent/AgentLoop.js +366 -0
- package/src/agent/agent/prompts.js +163 -0
- package/src/agent/agent/tools.js +148 -0
- package/src/agent/controller.js +235 -0
- package/src/agent/dom/actions.js +456 -0
- package/src/agent/dom/domTree.js +1761 -0
- package/src/agent/dom/redact.js +98 -0
- package/src/agent/dom/serializer.js +332 -0
- package/src/agent/dom/utils.js +99 -0
- package/src/agent/index.js +169 -0
- package/src/agent/llm/connector.js +143 -0
- package/src/agent/package.json +3 -0
- package/src/agent/policy/PolicyGuard.js +172 -0
- package/src/agent/site/manifest.js +145 -0
- package/src/agent/ui/ChatWidget.js +219 -0
- package/src/agent-mode/AgentMode.js +429 -0
- package/src/api/APIClient.js +258 -0
- package/src/core/Config.js +207 -0
- package/src/core/UiState.js +83 -0
- package/src/core/defaults.js +20 -0
- package/src/events.js +59 -0
- package/src/index.js +77 -0
- package/src/intent/ActionVerbMap.js +324 -0
- package/src/intent/IntentExtractor.js +317 -0
- package/src/observers/ElementScanner.js +284 -0
- package/src/observers/NavigationObserver.js +182 -0
- package/src/observers/PageObserver.js +293 -0
- package/src/session/SessionManager.js +402 -0
- package/src/session/SessionStorage.js +148 -0
- package/src/ui/HelpWidget.js +1189 -0
- package/src/ui/UICoach.js +1725 -0
- package/src/ui/components/Button.css +137 -0
- package/src/ui/components/Button.js +102 -0
- package/src/ui/widget.css +599 -0
- package/src/utils/Logger.js +132 -0
- package/src/utils/MarkdownRenderer.js +39 -0
- package/src/utils/domUtils.js +350 -0
- package/src/utils/eventBus.js +102 -0
- package/src/utils/index.js +8 -0
- package/src/utils/stringUtils.js +202 -0
- package/types/index.d.ts +538 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hand Hold SDK - SessionStorage Wrapper
|
|
3
|
+
* Safe wrapper around browser's sessionStorage with fallback
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
class SessionStorageWrapper {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.prefix = 'handhold_';
|
|
9
|
+
this.memoryFallback = {};
|
|
10
|
+
this.useMemory = !this._isSessionStorageAvailable();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Check if sessionStorage is available
|
|
15
|
+
*/
|
|
16
|
+
_isSessionStorageAvailable() {
|
|
17
|
+
try {
|
|
18
|
+
const testKey = '__handhold_test__';
|
|
19
|
+
window.sessionStorage.setItem(testKey, 'test');
|
|
20
|
+
window.sessionStorage.removeItem(testKey);
|
|
21
|
+
return true;
|
|
22
|
+
} catch (e) {
|
|
23
|
+
console.warn('[HandHold] sessionStorage not available, using memory fallback');
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Get prefixed key
|
|
30
|
+
*/
|
|
31
|
+
_getKey(key) {
|
|
32
|
+
return `${this.prefix}${key}`;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Set item
|
|
37
|
+
* @param {string} key - Storage key
|
|
38
|
+
* @param {*} value - Value to store (will be JSON serialized)
|
|
39
|
+
*/
|
|
40
|
+
set(key, value) {
|
|
41
|
+
const prefixedKey = this._getKey(key);
|
|
42
|
+
const serialized = JSON.stringify(value);
|
|
43
|
+
|
|
44
|
+
if (this.useMemory) {
|
|
45
|
+
this.memoryFallback[prefixedKey] = serialized;
|
|
46
|
+
} else {
|
|
47
|
+
try {
|
|
48
|
+
window.sessionStorage.setItem(prefixedKey, serialized);
|
|
49
|
+
} catch (e) {
|
|
50
|
+
// Quota exceeded or other error - fall back to memory
|
|
51
|
+
console.warn('[HandHold] sessionStorage.setItem failed, using memory');
|
|
52
|
+
this.memoryFallback[prefixedKey] = serialized;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Get item
|
|
59
|
+
* @param {string} key - Storage key
|
|
60
|
+
* @returns {*} - Parsed value or null
|
|
61
|
+
*/
|
|
62
|
+
get(key) {
|
|
63
|
+
const prefixedKey = this._getKey(key);
|
|
64
|
+
let value;
|
|
65
|
+
|
|
66
|
+
if (this.useMemory) {
|
|
67
|
+
value = this.memoryFallback[prefixedKey];
|
|
68
|
+
} else {
|
|
69
|
+
value = window.sessionStorage.getItem(prefixedKey);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (value === null || value === undefined) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
try {
|
|
77
|
+
return JSON.parse(value);
|
|
78
|
+
} catch (e) {
|
|
79
|
+
return value;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Remove item
|
|
85
|
+
* @param {string} key - Storage key
|
|
86
|
+
*/
|
|
87
|
+
remove(key) {
|
|
88
|
+
const prefixedKey = this._getKey(key);
|
|
89
|
+
|
|
90
|
+
if (this.useMemory) {
|
|
91
|
+
delete this.memoryFallback[prefixedKey];
|
|
92
|
+
} else {
|
|
93
|
+
window.sessionStorage.removeItem(prefixedKey);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Check if key exists
|
|
99
|
+
* @param {string} key - Storage key
|
|
100
|
+
* @returns {boolean}
|
|
101
|
+
*/
|
|
102
|
+
has(key) {
|
|
103
|
+
return this.get(key) !== null;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Clear all Hand Hold items
|
|
108
|
+
*/
|
|
109
|
+
clear() {
|
|
110
|
+
if (this.useMemory) {
|
|
111
|
+
this.memoryFallback = {};
|
|
112
|
+
} else {
|
|
113
|
+
const keysToRemove = [];
|
|
114
|
+
for (let i = 0; i < window.sessionStorage.length; i++) {
|
|
115
|
+
const key = window.sessionStorage.key(i);
|
|
116
|
+
if (key && key.startsWith(this.prefix)) {
|
|
117
|
+
keysToRemove.push(key);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
keysToRemove.forEach(key => window.sessionStorage.removeItem(key));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Get all Hand Hold keys
|
|
126
|
+
* @returns {string[]}
|
|
127
|
+
*/
|
|
128
|
+
keys() {
|
|
129
|
+
const keys = [];
|
|
130
|
+
|
|
131
|
+
if (this.useMemory) {
|
|
132
|
+
Object.keys(this.memoryFallback)
|
|
133
|
+
.filter(k => k.startsWith(this.prefix))
|
|
134
|
+
.forEach(k => keys.push(k.replace(this.prefix, '')));
|
|
135
|
+
} else {
|
|
136
|
+
for (let i = 0; i < window.sessionStorage.length; i++) {
|
|
137
|
+
const key = window.sessionStorage.key(i);
|
|
138
|
+
if (key && key.startsWith(this.prefix)) {
|
|
139
|
+
keys.push(key.replace(this.prefix, ''));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return keys;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export default SessionStorageWrapper;
|