self-evolve-framework 1.1.0 → 1.2.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 (220) hide show
  1. package/package.json +1 -1
  2. package/template/skills/impeccable/SKILL.md +174 -47
  3. package/template/skills/impeccable/agents/impeccable_asset_producer.toml +92 -0
  4. package/template/skills/impeccable/agents/impeccable_manual_edit_applier.toml +95 -0
  5. package/template/skills/impeccable/agents/openai.yaml +4 -0
  6. package/template/skills/impeccable/reference/adapt.md +311 -0
  7. package/template/skills/impeccable/reference/animate.md +201 -0
  8. package/template/skills/impeccable/reference/audit.md +133 -0
  9. package/template/skills/impeccable/reference/bolder.md +113 -0
  10. package/template/skills/impeccable/reference/brand.md +108 -0
  11. package/template/skills/impeccable/reference/clarify.md +288 -0
  12. package/template/skills/impeccable/reference/codex.md +105 -0
  13. package/template/skills/impeccable/reference/colorize.md +257 -0
  14. package/template/skills/impeccable/reference/craft.md +123 -0
  15. package/template/skills/impeccable/reference/critique.md +790 -0
  16. package/template/skills/impeccable/reference/delight.md +302 -0
  17. package/template/skills/impeccable/reference/distill.md +111 -0
  18. package/template/skills/impeccable/reference/document.md +429 -0
  19. package/template/skills/impeccable/reference/extract.md +69 -0
  20. package/template/skills/impeccable/reference/harden.md +347 -0
  21. package/template/skills/impeccable/reference/hooks.md +90 -0
  22. package/template/skills/impeccable/reference/init.md +172 -0
  23. package/template/skills/impeccable/reference/interaction-design.md +189 -0
  24. package/template/skills/impeccable/reference/layout.md +161 -0
  25. package/template/skills/impeccable/reference/live.md +720 -0
  26. package/template/skills/impeccable/reference/onboard.md +234 -0
  27. package/template/skills/impeccable/reference/optimize.md +258 -0
  28. package/template/skills/impeccable/reference/overdrive.md +130 -0
  29. package/template/skills/impeccable/reference/polish.md +241 -0
  30. package/template/skills/impeccable/reference/product.md +60 -0
  31. package/template/skills/impeccable/reference/quieter.md +99 -0
  32. package/template/skills/impeccable/reference/shape.md +165 -0
  33. package/template/skills/impeccable/reference/typeset.md +279 -0
  34. package/template/skills/impeccable/scripts/command-metadata.json +94 -0
  35. package/template/skills/impeccable/scripts/context-signals.mjs +225 -0
  36. package/template/skills/impeccable/scripts/context.mjs +961 -0
  37. package/template/skills/impeccable/scripts/critique-storage.mjs +242 -0
  38. package/template/skills/impeccable/scripts/detect-csp.mjs +198 -0
  39. package/template/skills/impeccable/scripts/detect.mjs +21 -0
  40. package/template/skills/impeccable/scripts/detector/browser/injected/index.mjs +1937 -0
  41. package/template/skills/impeccable/scripts/detector/cli/main.mjs +290 -0
  42. package/template/skills/impeccable/scripts/detector/design-system.mjs +750 -0
  43. package/template/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +5138 -0
  44. package/template/skills/impeccable/scripts/detector/detect-antipatterns.mjs +50 -0
  45. package/template/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +277 -0
  46. package/template/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +568 -0
  47. package/template/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +1015 -0
  48. package/template/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +234 -0
  49. package/template/skills/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +189 -0
  50. package/template/skills/impeccable/scripts/detector/findings.mjs +12 -0
  51. package/template/skills/impeccable/scripts/detector/node/file-system.mjs +198 -0
  52. package/template/skills/impeccable/scripts/detector/profile/profiler.mjs +166 -0
  53. package/template/skills/impeccable/scripts/detector/registry/antipatterns.mjs +448 -0
  54. package/template/skills/impeccable/scripts/detector/rules/checks.mjs +2671 -0
  55. package/template/skills/impeccable/scripts/detector/shared/color.mjs +124 -0
  56. package/template/skills/impeccable/scripts/detector/shared/constants.mjs +101 -0
  57. package/template/skills/impeccable/scripts/detector/shared/inline-ignores.mjs +148 -0
  58. package/template/skills/impeccable/scripts/detector/shared/page.mjs +7 -0
  59. package/template/skills/impeccable/scripts/hook-admin.mjs +661 -0
  60. package/template/skills/impeccable/scripts/hook-before-edit.mjs +476 -0
  61. package/template/skills/impeccable/scripts/hook-lib.mjs +1632 -0
  62. package/template/skills/impeccable/scripts/hook.mjs +61 -0
  63. package/template/skills/impeccable/scripts/lib/design-parser.mjs +842 -0
  64. package/template/skills/impeccable/scripts/lib/impeccable-config.mjs +638 -0
  65. package/template/skills/impeccable/scripts/lib/impeccable-paths.mjs +128 -0
  66. package/template/skills/impeccable/scripts/lib/is-generated.mjs +69 -0
  67. package/template/skills/impeccable/scripts/lib/target-args.mjs +42 -0
  68. package/template/skills/impeccable/scripts/live/browser-script-parts.mjs +49 -0
  69. package/template/skills/impeccable/scripts/live/completion.mjs +19 -0
  70. package/template/skills/impeccable/scripts/live/event-validation.mjs +137 -0
  71. package/template/skills/impeccable/scripts/live/insert-ui.mjs +458 -0
  72. package/template/skills/impeccable/scripts/live/manual-apply.mjs +939 -0
  73. package/template/skills/impeccable/scripts/live/manual-edit-routes.mjs +357 -0
  74. package/template/skills/impeccable/scripts/live/manual-edits-buffer.mjs +152 -0
  75. package/template/skills/impeccable/scripts/live/session-store.mjs +289 -0
  76. package/template/skills/impeccable/scripts/live/svelte-component.mjs +826 -0
  77. package/template/skills/impeccable/scripts/live/sveltekit-adapter.mjs +274 -0
  78. package/template/skills/impeccable/scripts/live/ui-core.mjs +180 -0
  79. package/template/skills/impeccable/scripts/live/vocabulary.mjs +36 -0
  80. package/template/skills/impeccable/scripts/live-accept.mjs +812 -0
  81. package/template/skills/impeccable/scripts/live-browser-dom.js +146 -0
  82. package/template/skills/impeccable/scripts/live-browser-session.js +123 -0
  83. package/template/skills/impeccable/scripts/live-browser.js +11173 -0
  84. package/template/skills/impeccable/scripts/live-commit-manual-edits.mjs +1241 -0
  85. package/template/skills/impeccable/scripts/live-complete.mjs +75 -0
  86. package/template/skills/impeccable/scripts/live-copy-edit-agent.mjs +683 -0
  87. package/template/skills/impeccable/scripts/live-discard-manual-edits.mjs +51 -0
  88. package/template/skills/impeccable/scripts/live-inject.mjs +583 -0
  89. package/template/skills/impeccable/scripts/live-insert.mjs +272 -0
  90. package/template/skills/impeccable/scripts/live-manual-edit-evidence.mjs +363 -0
  91. package/template/skills/impeccable/scripts/live-poll.mjs +384 -0
  92. package/template/skills/impeccable/scripts/live-resume.mjs +94 -0
  93. package/template/skills/impeccable/scripts/live-server.mjs +1135 -0
  94. package/template/skills/impeccable/scripts/live-status.mjs +61 -0
  95. package/template/skills/impeccable/scripts/live-target.mjs +30 -0
  96. package/template/skills/impeccable/scripts/live-wrap.mjs +894 -0
  97. package/template/skills/impeccable/scripts/live.mjs +297 -0
  98. package/template/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  99. package/template/skills/impeccable/scripts/palette.mjs +633 -0
  100. package/template/skills/impeccable/scripts/pin.mjs +214 -0
  101. package/template/rules/CodeGraph.mdc +0 -23
  102. package/template/rules/Svelte_5.mdc +0 -167
  103. package/template/rules/Svelte_Flow.mdc +0 -176
  104. package/template/rules/Tailwind_CSS_v4.mdc +0 -187
  105. package/template/rules/Tauri.mdc +0 -145
  106. package/template/rules/app-error-pattern.mdc +0 -65
  107. package/template/rules/invoke-safe-pattern.mdc +0 -53
  108. package/template/rules/js.mdc +0 -10
  109. package/template/rules/powershell.mdc +0 -9
  110. package/template/rules//346/227/245/345/277/227.mdc +0 -15
  111. package/template/rules//350/257/267/346/261/202.mdc +0 -49
  112. package/template/skills/caveman/SKILL.md +0 -49
  113. package/template/skills/check/SKILL.md +0 -393
  114. package/template/skills/check/agents/reviewer-architecture.md +0 -39
  115. package/template/skills/check/agents/reviewer-security.md +0 -39
  116. package/template/skills/check/references/persona-catalog.md +0 -56
  117. package/template/skills/check/references/project-context.md +0 -120
  118. package/template/skills/check/references/public-reply.md +0 -14
  119. package/template/skills/check/scripts/audit_signals.py +0 -666
  120. package/template/skills/check/scripts/run-tests.sh +0 -19
  121. package/template/skills/design/SKILL.md +0 -173
  122. package/template/skills/design/references/design-aesthetic-quality.md +0 -67
  123. package/template/skills/design/references/design-data-viz.md +0 -34
  124. package/template/skills/design/references/design-reference.md +0 -295
  125. package/template/skills/design/references/design-tokens.md +0 -45
  126. package/template/skills/design/references/design-traps.md +0 -43
  127. package/template/skills/design-an-interface/SKILL.md +0 -94
  128. package/template/skills/diagnose/SKILL.md +0 -117
  129. package/template/skills/diagnose/scripts/hitl-loop.template.sh +0 -41
  130. package/template/skills/edit-article/SKILL.md +0 -14
  131. package/template/skills/git-guardrails-claude-code/SKILL.md +0 -95
  132. package/template/skills/git-guardrails-claude-code/scripts/block-dangerous-git.sh +0 -25
  133. package/template/skills/grill-me/SKILL.md +0 -10
  134. package/template/skills/grill-with-docs/ADR-FORMAT.md +0 -47
  135. package/template/skills/grill-with-docs/CONTEXT-FORMAT.md +0 -60
  136. package/template/skills/grill-with-docs/SKILL.md +0 -88
  137. package/template/skills/handoff/SKILL.md +0 -15
  138. package/template/skills/health/SKILL.md +0 -260
  139. package/template/skills/health/agents/inspector-context.md +0 -119
  140. package/template/skills/health/agents/inspector-control.md +0 -84
  141. package/template/skills/health/agents/inspector-maintainability.md +0 -55
  142. package/template/skills/health/scripts/check-agent-context.sh +0 -5
  143. package/template/skills/health/scripts/check-doc-refs.sh +0 -8
  144. package/template/skills/health/scripts/check-maintainability.sh +0 -8
  145. package/template/skills/health/scripts/check-verifier-output.sh +0 -5
  146. package/template/skills/health/scripts/check_agent_context.py +0 -444
  147. package/template/skills/health/scripts/check_doc_refs.py +0 -110
  148. package/template/skills/health/scripts/check_maintainability.py +0 -635
  149. package/template/skills/health/scripts/check_verifier_output.py +0 -116
  150. package/template/skills/health/scripts/collect-data.sh +0 -751
  151. package/template/skills/hunt/SKILL.md +0 -232
  152. package/template/skills/hunt/references/failure-patterns.md +0 -138
  153. package/template/skills/hunt/references/ime-unicode.md +0 -58
  154. package/template/skills/hunt/references/logging-techniques.md +0 -72
  155. package/template/skills/hunt/references/rendering-debug.md +0 -34
  156. package/template/skills/improve-codebase-architecture/DEEPENING.md +0 -37
  157. package/template/skills/improve-codebase-architecture/HTML-REPORT.md +0 -123
  158. package/template/skills/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
  159. package/template/skills/improve-codebase-architecture/LANGUAGE.md +0 -53
  160. package/template/skills/improve-codebase-architecture/SKILL.md +0 -81
  161. package/template/skills/learn/SKILL.md +0 -140
  162. package/template/skills/migrate-to-shoehorn/SKILL.md +0 -118
  163. package/template/skills/obsidian-vault/SKILL.md +0 -59
  164. package/template/skills/prototype/LOGIC.md +0 -79
  165. package/template/skills/prototype/SKILL.md +0 -30
  166. package/template/skills/prototype/UI.md +0 -112
  167. package/template/skills/qa/SKILL.md +0 -130
  168. package/template/skills/read/SKILL.md +0 -141
  169. package/template/skills/read/references/read-methods.md +0 -129
  170. package/template/skills/read/scripts/fetch.sh +0 -106
  171. package/template/skills/read/scripts/fetch_feishu.py +0 -251
  172. package/template/skills/read/scripts/fetch_local.py +0 -218
  173. package/template/skills/read/scripts/fetch_weixin.py +0 -107
  174. package/template/skills/request-refactor-plan/SKILL.md +0 -68
  175. package/template/skills/review/SKILL.md +0 -78
  176. package/template/skills/rust-auto-fix/SKILL.md +0 -94
  177. package/template/skills/scaffold-exercises/SKILL.md +0 -106
  178. package/template/skills/sdd-dev/SKILL.md +0 -114
  179. package/template/skills/setup-matt-pocock-skills/SKILL.md +0 -121
  180. package/template/skills/setup-matt-pocock-skills/domain.md +0 -51
  181. package/template/skills/setup-matt-pocock-skills/issue-tracker-github.md +0 -22
  182. package/template/skills/setup-matt-pocock-skills/issue-tracker-gitlab.md +0 -23
  183. package/template/skills/setup-matt-pocock-skills/issue-tracker-local.md +0 -19
  184. package/template/skills/setup-matt-pocock-skills/triage-labels.md +0 -15
  185. package/template/skills/setup-pre-commit/SKILL.md +0 -91
  186. package/template/skills/svelte-warnings-fix/SKILL.md +0 -94
  187. package/template/skills/tauri-nsis-installer-icon/SKILL.md +0 -92
  188. package/template/skills/tauri-nsis-installer-icon/references/tauri-nsis-schema.md +0 -71
  189. package/template/skills/tb/SKILL.md +0 -62
  190. package/template/skills/tdd/SKILL.md +0 -109
  191. package/template/skills/tdd/deep-modules.md +0 -33
  192. package/template/skills/tdd/interface-design.md +0 -31
  193. package/template/skills/tdd/mocking.md +0 -59
  194. package/template/skills/tdd/refactoring.md +0 -10
  195. package/template/skills/tdd/tests.md +0 -61
  196. package/template/skills/teach/GLOSSARY-FORMAT.md +0 -35
  197. package/template/skills/teach/LEARNING-RECORD-FORMAT.md +0 -46
  198. package/template/skills/teach/MISSION-FORMAT.md +0 -31
  199. package/template/skills/teach/RESOURCES-FORMAT.md +0 -32
  200. package/template/skills/teach/SKILL.md +0 -91
  201. package/template/skills/think/SKILL.md +0 -184
  202. package/template/skills/to-issues/SKILL.md +0 -83
  203. package/template/skills/to-prd/SKILL.md +0 -74
  204. package/template/skills/triage/AGENT-BRIEF.md +0 -168
  205. package/template/skills/triage/OUT-OF-SCOPE.md +0 -101
  206. package/template/skills/triage/SKILL.md +0 -103
  207. package/template/skills/ubiquitous-language/SKILL.md +0 -93
  208. package/template/skills/ver/SKILL.md +0 -62
  209. package/template/skills/write/SKILL.md +0 -209
  210. package/template/skills/write/references/write-en.md +0 -199
  211. package/template/skills/write/references/write-product-localization.md +0 -43
  212. package/template/skills/write/references/write-zh-bilingual.md +0 -59
  213. package/template/skills/write/references/write-zh-prose.md +0 -50
  214. package/template/skills/write/references/write-zh-release-notes.md +0 -40
  215. package/template/skills/write/references/write-zh.md +0 -721
  216. package/template/skills/write-a-skill/SKILL.md +0 -117
  217. package/template/skills/writing-beats/SKILL.md +0 -52
  218. package/template/skills/writing-fragments/SKILL.md +0 -75
  219. package/template/skills/writing-shape/SKILL.md +0 -64
  220. package/template/skills/zoom-out/SKILL.md +0 -7
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Browser-side DOM helpers for Impeccable live mode.
3
+ *
4
+ * Kept separate from live-browser.js so future browser script parts can share
5
+ * chrome mounting, lookup, focus, and picker helpers without depending on the
6
+ * full overlay UI bundle.
7
+ */
8
+ (function (root) {
9
+ 'use strict';
10
+ if (!root) return;
11
+
12
+ function createLiveBrowserDomHelpers({
13
+ prefix,
14
+ skipTags,
15
+ document: doc = root.document,
16
+ css = root.CSS,
17
+ crypto = root.crypto,
18
+ } = {}) {
19
+ if (!prefix) throw new Error('prefix required');
20
+ if (!doc) throw new Error('document required');
21
+ const tagsToSkip = skipTags || new Set();
22
+
23
+ function own(el) {
24
+ return el && (el.id?.startsWith(prefix) || el.closest?.('[id^="' + prefix + '"]'));
25
+ }
26
+
27
+ function pickable(el) {
28
+ if (!el || el.nodeType !== 1) return false;
29
+ if (tagsToSkip.has(String(el.tagName || '').toLowerCase())) return false;
30
+ if (own(el)) return false;
31
+ const r = el.getBoundingClientRect();
32
+ return r.width >= 20 && r.height >= 20;
33
+ }
34
+
35
+ function desc(el) {
36
+ if (!el) return '';
37
+ let s = el.tagName.toLowerCase();
38
+ if (el.id) s += '#' + el.id;
39
+ else if (el.classList.length) s += '.' + [...el.classList].slice(0, 2).join('.');
40
+ return s;
41
+ }
42
+
43
+ function rectIsUsableAnchor(rect) {
44
+ return !!rect && rect.width > 0.5 && rect.height > 0.5;
45
+ }
46
+
47
+ function makeFrozenAnchor(el) {
48
+ if (!el || !el.getBoundingClientRect) return null;
49
+ const r = el.getBoundingClientRect();
50
+ if (!rectIsUsableAnchor(r)) return null;
51
+ const rect = {
52
+ x: r.x, y: r.y,
53
+ top: r.top, left: r.left,
54
+ right: r.right, bottom: r.bottom,
55
+ width: r.width, height: r.height,
56
+ };
57
+ return {
58
+ __impeccableFrozenAnchor: true,
59
+ tagName: el.tagName || 'DIV',
60
+ id: el.id || '',
61
+ classList: el.classList ? [...el.classList] : [],
62
+ hasAttribute: () => false,
63
+ getBoundingClientRect: () => rect,
64
+ };
65
+ }
66
+
67
+ function id8() {
68
+ if (crypto?.randomUUID) return crypto.randomUUID().replace(/-/g, '').slice(0, 8);
69
+ return (Math.random().toString(16).slice(2) + Date.now().toString(16)).slice(0, 8);
70
+ }
71
+
72
+ function cssId(id) {
73
+ if (css?.escape) return css.escape(id);
74
+ return String(id).replace(/([ !"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, '\\$1');
75
+ }
76
+
77
+ function liveUiRoot() {
78
+ const uiRoot = root.__IMPECCABLE_LIVE_UI_ROOT__;
79
+ if (uiRoot && typeof uiRoot.appendChild === 'function') return uiRoot;
80
+ return doc.body;
81
+ }
82
+
83
+ function uiAppend(el) {
84
+ liveUiRoot().appendChild(el);
85
+ return el;
86
+ }
87
+
88
+ function uiAppendStyle(styleEl) {
89
+ const uiRoot = liveUiRoot();
90
+ if (uiRoot && uiRoot !== doc.body) uiRoot.appendChild(styleEl);
91
+ else doc.head.appendChild(styleEl);
92
+ return styleEl;
93
+ }
94
+
95
+ function uiGetById(id) {
96
+ const uiRoot = liveUiRoot();
97
+ if (uiRoot?.getElementById) {
98
+ const found = uiRoot.getElementById(id);
99
+ if (found) return found;
100
+ }
101
+ if (uiRoot?.querySelector) {
102
+ const found = uiRoot.querySelector('#' + cssId(id));
103
+ if (found) return found;
104
+ }
105
+ return doc.getElementById(id);
106
+ }
107
+
108
+ function activeElementDeep() {
109
+ let active = doc.activeElement;
110
+ while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;
111
+ return active;
112
+ }
113
+
114
+ function defangOutsideHandlers(rootEl, { setPointerEvents = true } = {}) {
115
+ if (!rootEl) return;
116
+ if (setPointerEvents) {
117
+ rootEl.style.setProperty('pointer-events', 'auto', 'important');
118
+ }
119
+ const stop = (e) => e.stopPropagation();
120
+ rootEl.addEventListener('pointerdown', stop);
121
+ rootEl.addEventListener('mousedown', stop);
122
+ rootEl.addEventListener('focusin', stop);
123
+ }
124
+
125
+ return {
126
+ own,
127
+ pickable,
128
+ desc,
129
+ rectIsUsableAnchor,
130
+ makeFrozenAnchor,
131
+ id8,
132
+ cssId,
133
+ liveUiRoot,
134
+ uiAppend,
135
+ uiAppendStyle,
136
+ uiGetById,
137
+ activeElementDeep,
138
+ defangOutsideHandlers,
139
+ };
140
+ }
141
+
142
+ root.__IMPECCABLE_LIVE_DOM__ = {
143
+ version: 1,
144
+ createLiveBrowserDomHelpers,
145
+ };
146
+ })(typeof window !== 'undefined' ? window : globalThis);
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Browser-side durable session helpers for Impeccable live mode.
3
+ *
4
+ * Kept separate from live-browser.js so recovery state can be tested without
5
+ * booting the full overlay UI. Served before live-browser.js and attached to
6
+ * window.__IMPECCABLE_LIVE_SESSION__.
7
+ */
8
+ (function (root) {
9
+ 'use strict';
10
+
11
+ function createLiveBrowserSessionState({ prefix, storage, idFactory }) {
12
+ if (!prefix) throw new Error('prefix required');
13
+ const store = storage || root.localStorage;
14
+ const makeId = idFactory || function () { return Math.random().toString(16).slice(2, 10); };
15
+ const sessionKey = prefix + '-session';
16
+ const handledKey = sessionKey + '-handled';
17
+ const scrollKey = sessionKey + '-scroll';
18
+ let checkpointRevision = 0;
19
+ const owner = makeId();
20
+
21
+ function safeRead(key) {
22
+ try { return store.getItem(key); } catch { return null; }
23
+ }
24
+
25
+ function safeWrite(key, value) {
26
+ try { store.setItem(key, value); } catch { /* quota exceeded or private mode */ }
27
+ }
28
+
29
+ function safeRemove(key) {
30
+ try { store.removeItem(key); } catch { /* unavailable storage */ }
31
+ }
32
+
33
+ function loadSession() {
34
+ try {
35
+ const raw = safeRead(sessionKey);
36
+ if (!raw) return null;
37
+ const parsed = JSON.parse(raw);
38
+ if (Number.isInteger(parsed.checkpointRevision)) {
39
+ checkpointRevision = Math.max(checkpointRevision, parsed.checkpointRevision);
40
+ }
41
+ return parsed;
42
+ } catch { return null; }
43
+ }
44
+
45
+ function saveSession(session) {
46
+ if (!session || !session.id) return;
47
+ const payload = {
48
+ ...session,
49
+ checkpointRevision,
50
+ };
51
+ safeWrite(sessionKey, JSON.stringify(payload));
52
+ }
53
+
54
+ function clearSession() {
55
+ safeRemove(sessionKey);
56
+ }
57
+
58
+ function nextCheckpointRevision() {
59
+ checkpointRevision += 1;
60
+ const existing = loadSession();
61
+ if (existing?.id) saveSession(existing);
62
+ return checkpointRevision;
63
+ }
64
+
65
+ function seedCheckpointRevision(value) {
66
+ if (Number.isInteger(value)) checkpointRevision = Math.max(checkpointRevision, value);
67
+ return checkpointRevision;
68
+ }
69
+
70
+ function currentCheckpointRevision() {
71
+ return checkpointRevision;
72
+ }
73
+
74
+ function markHandled(id) {
75
+ if (!id) return;
76
+ safeWrite(handledKey, id);
77
+ }
78
+
79
+ function isHandled(id) {
80
+ return !!id && safeRead(handledKey) === id;
81
+ }
82
+
83
+ function clearHandled() {
84
+ safeRemove(handledKey);
85
+ }
86
+
87
+ function writeScrollY(y) {
88
+ safeWrite(scrollKey, String(y));
89
+ }
90
+
91
+ function readScrollY() {
92
+ const raw = safeRead(scrollKey);
93
+ if (raw == null) return null;
94
+ const n = parseFloat(raw);
95
+ return isFinite(n) ? n : null;
96
+ }
97
+
98
+ function clearScrollY() {
99
+ safeRemove(scrollKey);
100
+ }
101
+
102
+ return {
103
+ owner,
104
+ sessionKey,
105
+ handledKey,
106
+ scrollKey,
107
+ saveSession,
108
+ loadSession,
109
+ clearSession,
110
+ nextCheckpointRevision,
111
+ seedCheckpointRevision,
112
+ currentCheckpointRevision,
113
+ markHandled,
114
+ isHandled,
115
+ clearHandled,
116
+ writeScrollY,
117
+ readScrollY,
118
+ clearScrollY,
119
+ };
120
+ }
121
+
122
+ root.__IMPECCABLE_LIVE_SESSION__ = { createLiveBrowserSessionState };
123
+ })(typeof window !== 'undefined' ? window : globalThis);