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.
Files changed (50) hide show
  1. package/README.md +427 -0
  2. package/dist/d44f1fe8001e32f8e74d.svg +3056 -0
  3. package/dist/fonts/Phosphor.ttf +0 -0
  4. package/dist/fonts/Phosphor.woff +0 -0
  5. package/dist/fonts/Phosphor.woff2 +0 -0
  6. package/dist/handhold.min.js +1 -0
  7. package/package.json +114 -0
  8. package/src/HandHold.js +1599 -0
  9. package/src/agent/VENDOR.md +203 -0
  10. package/src/agent/agent/AgentLoop.js +366 -0
  11. package/src/agent/agent/prompts.js +163 -0
  12. package/src/agent/agent/tools.js +148 -0
  13. package/src/agent/controller.js +235 -0
  14. package/src/agent/dom/actions.js +456 -0
  15. package/src/agent/dom/domTree.js +1761 -0
  16. package/src/agent/dom/redact.js +98 -0
  17. package/src/agent/dom/serializer.js +332 -0
  18. package/src/agent/dom/utils.js +99 -0
  19. package/src/agent/index.js +169 -0
  20. package/src/agent/llm/connector.js +143 -0
  21. package/src/agent/package.json +3 -0
  22. package/src/agent/policy/PolicyGuard.js +172 -0
  23. package/src/agent/site/manifest.js +145 -0
  24. package/src/agent/ui/ChatWidget.js +219 -0
  25. package/src/agent-mode/AgentMode.js +429 -0
  26. package/src/api/APIClient.js +258 -0
  27. package/src/core/Config.js +207 -0
  28. package/src/core/UiState.js +83 -0
  29. package/src/core/defaults.js +20 -0
  30. package/src/events.js +59 -0
  31. package/src/index.js +77 -0
  32. package/src/intent/ActionVerbMap.js +324 -0
  33. package/src/intent/IntentExtractor.js +317 -0
  34. package/src/observers/ElementScanner.js +284 -0
  35. package/src/observers/NavigationObserver.js +182 -0
  36. package/src/observers/PageObserver.js +293 -0
  37. package/src/session/SessionManager.js +402 -0
  38. package/src/session/SessionStorage.js +148 -0
  39. package/src/ui/HelpWidget.js +1189 -0
  40. package/src/ui/UICoach.js +1725 -0
  41. package/src/ui/components/Button.css +137 -0
  42. package/src/ui/components/Button.js +102 -0
  43. package/src/ui/widget.css +599 -0
  44. package/src/utils/Logger.js +132 -0
  45. package/src/utils/MarkdownRenderer.js +39 -0
  46. package/src/utils/domUtils.js +350 -0
  47. package/src/utils/eventBus.js +102 -0
  48. package/src/utils/index.js +8 -0
  49. package/src/utils/stringUtils.js +202 -0
  50. 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;