@harborclient/sdk 1.3.7 → 1.3.9

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 (45) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/components/AnchorMenuPanel/index.d.ts.map +1 -1
  3. package/dist/components/AnchorMenuPanel/index.js +13 -5
  4. package/dist/components/Autocomplete/useAutocomplete.d.ts +14 -1
  5. package/dist/components/Autocomplete/useAutocomplete.d.ts.map +1 -1
  6. package/dist/components/Autocomplete/useAutocomplete.js +28 -1
  7. package/dist/components/RoundButton/index.d.ts +5 -1
  8. package/dist/components/RoundButton/index.d.ts.map +1 -1
  9. package/dist/components/RoundButton/index.js +2 -2
  10. package/dist/components/RowActionsMenu/index.d.ts.map +1 -1
  11. package/dist/components/RowActionsMenu/index.js +22 -11
  12. package/dist/components/Sidebar/index.d.ts +4 -1
  13. package/dist/components/Sidebar/index.d.ts.map +1 -1
  14. package/dist/components/Sidebar/index.js +4 -2
  15. package/dist/components/SidebarItem/SidebarWebsiteItem.d.ts +49 -0
  16. package/dist/components/SidebarItem/SidebarWebsiteItem.d.ts.map +1 -0
  17. package/dist/components/SidebarItem/SidebarWebsiteItem.js +41 -0
  18. package/dist/components/SidebarItem/index.d.ts +1 -0
  19. package/dist/components/SidebarItem/index.d.ts.map +1 -1
  20. package/dist/components/SidebarItem/index.js +1 -0
  21. package/dist/components/SidebarItem/sidebarItemClasses.d.ts +3 -2
  22. package/dist/components/SidebarItem/sidebarItemClasses.d.ts.map +1 -1
  23. package/dist/components/SidebarItem/sidebarItemClasses.js +3 -2
  24. package/dist/components/SidebarRail/SidebarRailSeparator.d.ts +3 -3
  25. package/dist/components/SidebarRail/SidebarRailSeparator.js +3 -3
  26. package/dist/components/SidebarSection/SectionItem.js +1 -1
  27. package/dist/components/TabBar/index.d.ts.map +1 -1
  28. package/dist/components/TabBar/index.js +1 -1
  29. package/dist/components/VariableInput/index.d.ts +14 -1
  30. package/dist/components/VariableInput/index.d.ts.map +1 -1
  31. package/dist/components/VariableInput/index.js +4 -2
  32. package/dist/components/index.d.ts +1 -1
  33. package/dist/components/index.d.ts.map +1 -1
  34. package/dist/components/index.js +1 -1
  35. package/dist/components/rowActionsMenuHelpers.d.ts +4 -0
  36. package/dist/components/rowActionsMenuHelpers.d.ts.map +1 -1
  37. package/dist/components/rowActionsMenuHelpers.js +6 -1
  38. package/dist/runtime/createBridgedPluginContext.js +87 -0
  39. package/dist/runtime/reactHost.d.ts +32 -0
  40. package/dist/runtime/webpageHandle.d.ts +50 -0
  41. package/dist/runtime/webpageHandle.js +273 -0
  42. package/dist/snippets.d.ts +73 -0
  43. package/dist/types.d.ts +105 -1
  44. package/dist/types.d.ts.map +1 -1
  45. package/package.json +1 -1
@@ -18,7 +18,7 @@ const TOOLTIP_HIDE_DELAY_MS = 400;
18
18
  * Token highlight color (`text-[#32D2E2]`) and the tooltip `app-no-drag` class rely on
19
19
  * host styling in HarborClient `styles.css`.
20
20
  */
21
- export function VariableInput({ value, onChange, variables, placeholder, onKeyDown, className = '', wrapperClassName, onEditVariable, id, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, source, ...props }) {
21
+ export function VariableInput({ value, onChange, variables, placeholder, onKeyDown, className = '', wrapperClassName, onEditVariable, id, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, source, beforeSuggestionsOpen, onSuggestionsOpenChange, ...props }) {
22
22
  const safeValue = value ?? '';
23
23
  const wrapperRef = useRef(null);
24
24
  const inputRef = useRef(null);
@@ -40,7 +40,9 @@ export function VariableInput({ value, onChange, variables, placeholder, onKeyDo
40
40
  source,
41
41
  value: safeValue,
42
42
  onSelect: onChange,
43
- anchorRef: inputRef
43
+ anchorRef: inputRef,
44
+ beforeOpen: beforeSuggestionsOpen,
45
+ onOpenChange: onSuggestionsOpenChange
44
46
  });
45
47
  /**
46
48
  * Splits the input value into plain text and {{variable}} token spans for highlighting.
@@ -110,6 +110,6 @@ export { cleanVariables, resolveTabListKeyAction } from './utils.js';
110
110
  export type { TabListKeyOptions } from './utils.js';
111
111
  export { useDialogFocus, getFocusableElements } from './useDialogFocus.js';
112
112
  export { segment, segmentGroup, tabItem } from './classes.js';
113
- export { SidebarItem, SidebarListbox, SidebarList, SidebarTree, SidebarTreeGroup, handleSidebarOptionKeyDown, type SidebarItemListboxOption, type SidebarItemTreeItem, SortableSidebarItem, stopSortableDragPointerDown, SidebarMarkerDot, SidebarBadge, sourceRow, METHOD_CLASSES, methodBadgeClass, documentIconClass, statusDotVariant, statusDotClass, SIDEBAR_ITEM_BUTTON_CLASS, SIDEBAR_CHEVRON_BUTTON_CLASS, SIDEBAR_CHEVRON_ICON_CLASS, SIDEBAR_CHEVRON_SLOT_CLASS, SIDEBAR_CHEVRON_LABEL_OFFSET_CLASS, SidebarMethodBadge, SidebarStatusDot, SidebarStatusMarker, SidebarRequestItem, SidebarDocumentItem, SidebarFolderItem, SidebarRunItem, SidebarHistoryItem, SidebarEnvironmentItem, SidebarWorkspaceItem, SidebarCommitItem, type SidebarItemSortableConfig, type SidebarBadgeVariant, type SidebarCommitPushStatus } from './SidebarItem/index.js';
113
+ export { SidebarItem, SidebarListbox, SidebarList, SidebarTree, SidebarTreeGroup, handleSidebarOptionKeyDown, type SidebarItemListboxOption, type SidebarItemTreeItem, SortableSidebarItem, stopSortableDragPointerDown, SidebarMarkerDot, SidebarBadge, sourceRow, METHOD_CLASSES, methodBadgeClass, documentIconClass, statusDotVariant, statusDotClass, SIDEBAR_ITEM_BUTTON_CLASS, SIDEBAR_CHEVRON_BUTTON_CLASS, SIDEBAR_CHEVRON_ICON_CLASS, SIDEBAR_CHEVRON_SLOT_CLASS, SIDEBAR_CHEVRON_LABEL_OFFSET_CLASS, SidebarMethodBadge, SidebarStatusDot, SidebarStatusMarker, SidebarRequestItem, SidebarDocumentItem, SidebarFolderItem, SidebarRunItem, SidebarHistoryItem, SidebarEnvironmentItem, SidebarWorkspaceItem, SidebarWebsiteItem, SidebarCommitItem, type SidebarItemSortableConfig, type SidebarBadgeVariant, type SidebarCommitPushStatus } from './SidebarItem/index.js';
114
114
  export type { FormDataPart, FormDataPartType, HttpMethod, KeyValue, Variable } from '../types.js';
115
115
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
@@ -80,4 +80,4 @@ export { VisibilityMenu } from './VisibilityMenu/index.js';
80
80
  export { cleanVariables, resolveTabListKeyAction } from './utils.js';
81
81
  export { useDialogFocus, getFocusableElements } from './useDialogFocus.js';
82
82
  export { segment, segmentGroup, tabItem } from './classes.js';
83
- export { SidebarItem, SidebarListbox, SidebarList, SidebarTree, SidebarTreeGroup, handleSidebarOptionKeyDown, SortableSidebarItem, stopSortableDragPointerDown, SidebarMarkerDot, SidebarBadge, sourceRow, METHOD_CLASSES, methodBadgeClass, documentIconClass, statusDotVariant, statusDotClass, SIDEBAR_ITEM_BUTTON_CLASS, SIDEBAR_CHEVRON_BUTTON_CLASS, SIDEBAR_CHEVRON_ICON_CLASS, SIDEBAR_CHEVRON_SLOT_CLASS, SIDEBAR_CHEVRON_LABEL_OFFSET_CLASS, SidebarMethodBadge, SidebarStatusDot, SidebarStatusMarker, SidebarRequestItem, SidebarDocumentItem, SidebarFolderItem, SidebarRunItem, SidebarHistoryItem, SidebarEnvironmentItem, SidebarWorkspaceItem, SidebarCommitItem } from './SidebarItem/index.js';
83
+ export { SidebarItem, SidebarListbox, SidebarList, SidebarTree, SidebarTreeGroup, handleSidebarOptionKeyDown, SortableSidebarItem, stopSortableDragPointerDown, SidebarMarkerDot, SidebarBadge, sourceRow, METHOD_CLASSES, methodBadgeClass, documentIconClass, statusDotVariant, statusDotClass, SIDEBAR_ITEM_BUTTON_CLASS, SIDEBAR_CHEVRON_BUTTON_CLASS, SIDEBAR_CHEVRON_ICON_CLASS, SIDEBAR_CHEVRON_SLOT_CLASS, SIDEBAR_CHEVRON_LABEL_OFFSET_CLASS, SidebarMethodBadge, SidebarStatusDot, SidebarStatusMarker, SidebarRequestItem, SidebarDocumentItem, SidebarFolderItem, SidebarRunItem, SidebarHistoryItem, SidebarEnvironmentItem, SidebarWorkspaceItem, SidebarWebsiteItem, SidebarCommitItem } from './SidebarItem/index.js';
@@ -14,6 +14,10 @@ export declare function isMenuItemEnabled(item: MenuItem): boolean;
14
14
  export declare function findAdjacentEnabledIndex(items: MenuItem[], fromIndex: number, direction: -1 | 1): number | null;
15
15
  /**
16
16
  * Returns the first or last enabled flat item index.
17
+ *
18
+ * @param items - Flat menu items to search.
19
+ * @param fromEnd - When true, returns the last enabled index; otherwise the first.
20
+ * @returns Enabled index, or `null` when every item is disabled / the list is empty.
17
21
  */
18
22
  export declare function findEdgeEnabledIndex(items: MenuItem[], fromEnd: boolean): number | null;
19
23
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"rowActionsMenuHelpers.d.ts","sourceRoot":"","sources":["../../src/components/rowActionsMenuHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAatF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,QAAQ,EAAE,EACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,GAChB,MAAM,GAAG,IAAI,CAWf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAWvF;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,GACzC,QAAQ,EAAE,EAAE,CAsBd"}
1
+ {"version":3,"file":"rowActionsMenuHelpers.d.ts","sourceRoot":"","sources":["../../src/components/rowActionsMenuHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAatF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,QAAQ,EAAE,EACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,GAChB,MAAM,GAAG,IAAI,CAWf;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAYvF;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,GACzC,QAAQ,EAAE,EAAE,CAsBd"}
@@ -33,6 +33,10 @@ export function findAdjacentEnabledIndex(items, fromIndex, direction) {
33
33
  }
34
34
  /**
35
35
  * Returns the first or last enabled flat item index.
36
+ *
37
+ * @param items - Flat menu items to search.
38
+ * @param fromEnd - When true, returns the last enabled index; otherwise the first.
39
+ * @returns Enabled index, or `null` when every item is disabled / the list is empty.
36
40
  */
37
41
  export function findEdgeEnabledIndex(items, fromEnd) {
38
42
  if (fromEnd) {
@@ -43,7 +47,8 @@ export function findEdgeEnabledIndex(items, fromEnd) {
43
47
  }
44
48
  return null;
45
49
  }
46
- return items.findIndex((item) => isMenuItemEnabled(item));
50
+ const index = items.findIndex((item) => isMenuItemEnabled(item));
51
+ return index >= 0 ? index : null;
47
52
  }
48
53
  /**
49
54
  * Builds an optional reorder group for move-up/move-down row actions.
@@ -7,6 +7,7 @@ import {
7
7
  import { bridgeInvoke, bridgeOn } from './hcBridge.js';
8
8
  import { createPluginDatabaseApi } from './pluginDatabaseApi.js';
9
9
  import { setHostReact } from './reactHost.js';
10
+ import { openWebpage } from './webpageHandle.js';
10
11
 
11
12
  /** @type {Map<string, Set<(...args: unknown[]) => void | Promise<void>>>} */
12
13
  const commandHandlers = new Map();
@@ -352,6 +353,52 @@ export function createBridgedPluginContext({ pluginId, mode, contributionId, rea
352
353
  */
353
354
  const assertAi = () => assertPermission('ai');
354
355
 
356
+ /**
357
+ * Asserts browser permission for embedded webpage control.
358
+ */
359
+ const assertBrowser = () => assertPermission('browser');
360
+
361
+ /**
362
+ * Invokes a webpage session op on the host renderer via the plugin bridge.
363
+ *
364
+ * @param {Record<string, unknown>} req - ScriptWebpageRequest-shaped payload.
365
+ * @returns {Promise<unknown>} Host session result.
366
+ */
367
+ const callWebpage = async (req) => {
368
+ const op = String(req.op ?? '');
369
+ switch (op) {
370
+ case 'open':
371
+ return bridgeInvoke('webpage.open', { url: req.url, reuse: req.reuse });
372
+ case 'focus':
373
+ return bridgeInvoke('webpage.focus', { tabId: req.tabId });
374
+ case 'close':
375
+ return bridgeInvoke('webpage.close', { tabId: req.tabId });
376
+ case 'query':
377
+ return bridgeInvoke('webpage.query', {
378
+ tabId: req.tabId,
379
+ selector: req.selector,
380
+ all: req.all,
381
+ maxElements: req.maxElements
382
+ });
383
+ case 'evaluate':
384
+ return bridgeInvoke('webpage.evaluate', {
385
+ tabId: req.tabId,
386
+ expression: req.expression
387
+ });
388
+ case 'injectScript':
389
+ return bridgeInvoke('webpage.injectScript', { tabId: req.tabId, source: req.source });
390
+ case 'injectStylesheet':
391
+ return bridgeInvoke('webpage.injectStylesheet', { tabId: req.tabId, css: req.css });
392
+ case 'screenshot':
393
+ return bridgeInvoke('webpage.screenshot', {
394
+ tabId: req.tabId,
395
+ fullPage: req.fullPage === true
396
+ });
397
+ default:
398
+ throw new Error(`Unsupported webpage bridge op: ${op}`);
399
+ }
400
+ };
401
+
355
402
  /**
356
403
  * Asserts that a contribution id is declared in manifest.contributes.
357
404
  *
@@ -482,6 +529,18 @@ export function createBridgedPluginContext({ pluginId, mode, contributionId, rea
482
529
  assertPermission('filesystem:write');
483
530
  await bridgeInvoke('fs.writeFile', { path, content });
484
531
  },
532
+ writeBytes: async (path, bytes) => {
533
+ assertPermission('filesystem:write');
534
+ const u8 =
535
+ bytes instanceof Uint8Array
536
+ ? bytes
537
+ : new Uint8Array(/** @type {ArrayLike<number>} */ (bytes));
538
+ let binary = '';
539
+ for (let i = 0; i < u8.length; i += 1) {
540
+ binary += String.fromCharCode(u8[i] ?? 0);
541
+ }
542
+ return bridgeInvoke('fs.writeBytes', { path, base64: btoa(binary) });
543
+ },
485
544
  watchFile: (path, listener) => {
486
545
  assertPermission('filesystem:read');
487
546
  const unsubscribe = bridgeOn(`fs.watch:${path}`, () => {
@@ -1243,6 +1302,34 @@ export function createBridgedPluginContext({ pluginId, mode, contributionId, rea
1243
1302
  selection: input?.selection
1244
1303
  });
1245
1304
  }
1305
+ },
1306
+ /**
1307
+ * Opens or reuses an embedded browser tab and returns a control handle.
1308
+ *
1309
+ * Requires the `browser` permission. Same semantics as request-script `hc.webpage`.
1310
+ *
1311
+ * @param {string} [url] - Optional URL; omit to bind the active browser tab.
1312
+ * @param {{ reuse?: boolean }} [options] - Optional `{ reuse }` (default true).
1313
+ * @returns {Promise<import('../types').PluginWebpageHandle>} Webpage handle.
1314
+ */
1315
+ webpage: async (url, options) => {
1316
+ assertBrowser();
1317
+ /**
1318
+ * Writes screenshot PNG bytes via the plugin filesystem bridge.
1319
+ *
1320
+ * @param {string} path - Relative or absolute allowlisted path.
1321
+ * @param {string} pngBase64 - Base64-encoded PNG payload.
1322
+ * @returns {Promise<string>} Absolute written path.
1323
+ */
1324
+ const writeScreenshotBytes = async (path, pngBase64) => {
1325
+ assertPermission('filesystem:write');
1326
+ const result = await bridgeInvoke('fs.writeBytes', { path, base64: pngBase64 });
1327
+ if (typeof result !== 'string' || !result.trim()) {
1328
+ throw new Error('hc.webpage().screenshot failed to resolve write path');
1329
+ }
1330
+ return result;
1331
+ };
1332
+ return openWebpage(callWebpage, url, options, writeScreenshotBytes);
1246
1333
  }
1247
1334
  };
1248
1335
  }
@@ -0,0 +1,32 @@
1
+ import type * as React from 'react';
2
+ import type * as ReactDOM from 'react-dom';
3
+
4
+ /**
5
+ * Installs the HarborClient renderer React instance for plugin JSX and hooks.
6
+ *
7
+ * @param react - React namespace from the host.
8
+ */
9
+ export function setHostReact(react: typeof React): void;
10
+
11
+ /**
12
+ * Returns the installed host React instance.
13
+ *
14
+ * @returns Host React namespace.
15
+ * @throws When {@link setHostReact} has not been called yet.
16
+ */
17
+ export function requireHostReact(): typeof React;
18
+
19
+ /**
20
+ * Installs the HarborClient renderer React DOM instance for plugin portals.
21
+ *
22
+ * @param reactDom - React DOM namespace from the host shim.
23
+ */
24
+ export function setHostReactDom(reactDom: typeof ReactDOM): void;
25
+
26
+ /**
27
+ * Returns the installed host React DOM instance.
28
+ *
29
+ * @returns Host React DOM namespace.
30
+ * @throws When {@link setHostReactDom} has not been called yet.
31
+ */
32
+ export function requireHostReactDom(): typeof ReactDOM;
@@ -0,0 +1,50 @@
1
+ import type { PluginWebpageHandle } from '../types';
2
+
3
+ /**
4
+ * Throws when a webpage bridge result is an `{ error }` object.
5
+ *
6
+ * @param result - Raw bridge result.
7
+ * @returns The result when it is not an error.
8
+ * @throws When the bridge returned `{ error: string }`.
9
+ */
10
+ export function unwrapWebpageBridgeResult(result: unknown): unknown;
11
+
12
+ /**
13
+ * Normalizes the optional second argument to `hc.webpage(url, options)`.
14
+ *
15
+ * @param options - User-provided options.
16
+ * @returns Normalized open options.
17
+ */
18
+ export function normalizeWebpageOpenOptions(options?: unknown): { reuse?: boolean };
19
+
20
+ /**
21
+ * Builds a webpage handle whose methods call the host webpage bridge.
22
+ *
23
+ * @param tab - Opened tab metadata from the bridge.
24
+ * @param callWebpage - Bridge transport.
25
+ * @returns Plain-object handle for the plugin world.
26
+ */
27
+ export function createWebpageHandle(
28
+ tab: {
29
+ tabId: string;
30
+ url: string;
31
+ title: string;
32
+ canGoBack?: boolean;
33
+ canGoForward?: boolean;
34
+ },
35
+ callWebpage: (req: Record<string, unknown>) => Promise<unknown>
36
+ ): PluginWebpageHandle;
37
+
38
+ /**
39
+ * Opens or reuses an embedded browser tab and returns a control handle.
40
+ *
41
+ * @param callWebpage - Bridge transport that accepts ScriptWebpageRequest-shaped payloads.
42
+ * @param url - Optional URL; omit to bind the active browser tab.
43
+ * @param openOptions - Optional `{ reuse }` (default true).
44
+ * @returns Webpage handle.
45
+ */
46
+ export function openWebpage(
47
+ callWebpage: (req: Record<string, unknown>) => Promise<unknown>,
48
+ url?: unknown,
49
+ openOptions?: unknown
50
+ ): Promise<PluginWebpageHandle>;
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Throws when a webpage bridge result is an `{ error }` object.
3
+ *
4
+ * @param {unknown} result - Raw bridge result.
5
+ * @returns {unknown} The result when it is not an error.
6
+ * @throws {Error} When the bridge returned `{ error: string }`.
7
+ */
8
+ export function unwrapWebpageBridgeResult(result) {
9
+ if (
10
+ result != null &&
11
+ typeof result === 'object' &&
12
+ !Array.isArray(result) &&
13
+ Object.keys(result).length === 1 &&
14
+ 'error' in result &&
15
+ typeof (/** @type {{ error: unknown }} */ (result).error) === 'string'
16
+ ) {
17
+ throw new Error(/** @type {{ error: string }} */ (result).error);
18
+ }
19
+ return result;
20
+ }
21
+
22
+ /**
23
+ * Normalizes the optional second argument to `hc.webpage(url, options)`.
24
+ *
25
+ * @param {unknown} [options] - User-provided options.
26
+ * @returns {{ reuse?: boolean }} Normalized open options.
27
+ */
28
+ export function normalizeWebpageOpenOptions(options) {
29
+ if (options == null) {
30
+ return {};
31
+ }
32
+ if (typeof options !== 'object' || Array.isArray(options)) {
33
+ throw new Error('hc.webpage options must be an object');
34
+ }
35
+ const raw = /** @type {Record<string, unknown>} */ (options);
36
+ if (!('reuse' in raw) || raw.reuse === undefined) {
37
+ return {};
38
+ }
39
+ if (typeof raw.reuse !== 'boolean') {
40
+ throw new Error('hc.webpage options.reuse must be a boolean');
41
+ }
42
+ return { reuse: raw.reuse };
43
+ }
44
+
45
+ /**
46
+ * Normalizes optional `hc.webpage().screenshot` options.
47
+ *
48
+ * @param {unknown} [options] - User-provided options (`fullPage` optional).
49
+ * @returns {{ fullPage: boolean }} Normalized options (default `fullPage: false`).
50
+ * @throws {Error} When options is present but not a plain object, or `fullPage` is not a boolean.
51
+ */
52
+ export function normalizeWebpageScreenshotOptions(options) {
53
+ if (options == null) {
54
+ return { fullPage: false };
55
+ }
56
+ if (typeof options !== 'object' || Array.isArray(options)) {
57
+ throw new Error('hc.webpage().screenshot options must be an object');
58
+ }
59
+ const raw = /** @type {Record<string, unknown>} */ (options);
60
+ if (!('fullPage' in raw) || raw.fullPage === undefined) {
61
+ return { fullPage: false };
62
+ }
63
+ if (typeof raw.fullPage !== 'boolean') {
64
+ throw new Error('hc.webpage().screenshot options.fullPage must be a boolean');
65
+ }
66
+ return { fullPage: raw.fullPage };
67
+ }
68
+
69
+ /**
70
+ * Builds a webpage handle whose methods call the host webpage bridge.
71
+ *
72
+ * @param {{
73
+ * tabId: string;
74
+ * url: string;
75
+ * title: string;
76
+ * canGoBack?: boolean;
77
+ * canGoForward?: boolean;
78
+ * }} tab - Opened tab metadata from the bridge.
79
+ * @param {(req: Record<string, unknown>) => Promise<unknown>} callWebpage - Bridge transport.
80
+ * @param {(path: string, pngBase64: string) => Promise<string>} [writeScreenshotBytes] - Optional
81
+ * writer that saves PNG base64 under an allowlisted path and returns the absolute path.
82
+ * @returns {import('../types').PluginWebpageHandle} Plain-object handle for the plugin world.
83
+ */
84
+ export function createWebpageHandle(tab, callWebpage, writeScreenshotBytes) {
85
+ const tabId = tab.tabId;
86
+ return {
87
+ tabId,
88
+ url: tab.url,
89
+ title: tab.title,
90
+ canGoBack: tab.canGoBack === true,
91
+ canGoForward: tab.canGoForward === true,
92
+ /**
93
+ * Focuses this browser tab in the HarborClient tab bar.
94
+ *
95
+ * @returns {Promise<void>} Resolves when the tab is focused.
96
+ */
97
+ focus: async () => {
98
+ unwrapWebpageBridgeResult(await callWebpage({ op: 'focus', tabId }));
99
+ },
100
+ /**
101
+ * Closes this browser tab, honoring page leave prompts.
102
+ *
103
+ * @returns {Promise<boolean>} True when closed; false when the user chose to stay.
104
+ */
105
+ close: async () => {
106
+ const result = /** @type {{ closed: boolean }} */ (
107
+ unwrapWebpageBridgeResult(await callWebpage({ op: 'close', tabId }))
108
+ );
109
+ return result.closed === true;
110
+ },
111
+ /**
112
+ * Captures the visible viewport (or full page) as PNG and writes it via the filesystem bridge.
113
+ *
114
+ * @param {unknown} path - Relative (plugin root) or absolute allowlisted path.
115
+ * @param {unknown} [screenshotOptions] - Optional `{ fullPage }` (default false).
116
+ * @returns {Promise<{ path: string }>} Absolute path of the written file.
117
+ */
118
+ screenshot: async (path, screenshotOptions) => {
119
+ const { fullPage } = normalizeWebpageScreenshotOptions(screenshotOptions);
120
+ const pathText = String(path ?? '').trim();
121
+ if (!pathText) {
122
+ throw new Error('hc.webpage().screenshot requires a path');
123
+ }
124
+ if (!writeScreenshotBytes) {
125
+ throw new Error('hc.webpage().screenshot requires hc.fs.writeBytes');
126
+ }
127
+ const capture = /** @type {{ pngBase64?: string }} */ (
128
+ unwrapWebpageBridgeResult(await callWebpage({ op: 'screenshot', tabId, fullPage }))
129
+ );
130
+ if (!capture || typeof capture.pngBase64 !== 'string' || !capture.pngBase64) {
131
+ throw new Error('hc.webpage().screenshot did not return image data');
132
+ }
133
+ const absolutePath = await writeScreenshotBytes(pathText, capture.pngBase64);
134
+ return { path: absolutePath };
135
+ },
136
+ dom: {
137
+ /**
138
+ * Queries the live page DOM with a CSS selector.
139
+ *
140
+ * @param {string} selector - CSS selector.
141
+ * @param {{ all?: boolean; maxElements?: number }} [queryOptions] - Optional query flags.
142
+ * @returns {Promise<{ selector: string; matchCount: number; elements: unknown[] }>}
143
+ */
144
+ query: async (selector, queryOptions) => {
145
+ const selectorText = String(selector ?? '').trim();
146
+ if (!selectorText) {
147
+ throw new Error('hc.webpage().dom.query requires a selector');
148
+ }
149
+ let all;
150
+ let maxElements;
151
+ if (queryOptions != null) {
152
+ if (typeof queryOptions !== 'object' || Array.isArray(queryOptions)) {
153
+ throw new Error('hc.webpage().dom.query options must be an object');
154
+ }
155
+ const raw = /** @type {Record<string, unknown>} */ (queryOptions);
156
+ if ('all' in raw && raw.all !== undefined) {
157
+ if (typeof raw.all !== 'boolean') {
158
+ throw new Error('hc.webpage().dom.query options.all must be a boolean');
159
+ }
160
+ all = raw.all;
161
+ }
162
+ if ('maxElements' in raw && raw.maxElements !== undefined) {
163
+ if (typeof raw.maxElements !== 'number' || !Number.isFinite(raw.maxElements)) {
164
+ throw new Error('hc.webpage().dom.query options.maxElements must be a finite number');
165
+ }
166
+ maxElements = raw.maxElements;
167
+ }
168
+ }
169
+ return /** @type {{ selector: string; matchCount: number; elements: unknown[] }} */ (
170
+ unwrapWebpageBridgeResult(
171
+ await callWebpage({ op: 'query', tabId, selector: selectorText, all, maxElements })
172
+ )
173
+ );
174
+ },
175
+ /**
176
+ * Evaluates JavaScript in the page main world and returns the result.
177
+ *
178
+ * @param {string} expression - JavaScript source that returns a JSON-serializable value.
179
+ * @returns {Promise<unknown>} Evaluation result.
180
+ */
181
+ evaluate: async (expression) => {
182
+ const expressionText = String(expression ?? '').trim();
183
+ if (!expressionText) {
184
+ throw new Error('hc.webpage().dom.evaluate requires an expression');
185
+ }
186
+ const result = /** @type {{ value: unknown }} */ (
187
+ unwrapWebpageBridgeResult(
188
+ await callWebpage({ op: 'evaluate', tabId, expression: expressionText })
189
+ )
190
+ );
191
+ return result.value;
192
+ },
193
+ /**
194
+ * Injects and runs JavaScript source in the page main world.
195
+ *
196
+ * @param {string} source - JavaScript source to inject.
197
+ * @returns {Promise<unknown>} Evaluation result from the injected script.
198
+ */
199
+ injectScript: async (source) => {
200
+ const sourceText = String(source ?? '');
201
+ if (!sourceText.trim()) {
202
+ throw new Error('hc.webpage().dom.injectScript requires source');
203
+ }
204
+ const result = /** @type {{ value: unknown }} */ (
205
+ unwrapWebpageBridgeResult(
206
+ await callWebpage({ op: 'injectScript', tabId, source: sourceText })
207
+ )
208
+ );
209
+ return result.value;
210
+ },
211
+ /**
212
+ * Injects a CSS stylesheet into the page.
213
+ *
214
+ * @param {string} css - Stylesheet source.
215
+ * @returns {Promise<string>} Electron insertion key.
216
+ */
217
+ injectStylesheet: async (css) => {
218
+ const cssText = String(css ?? '');
219
+ if (!cssText.trim()) {
220
+ throw new Error('hc.webpage().dom.injectStylesheet requires css');
221
+ }
222
+ const result = /** @type {{ key: string }} */ (
223
+ unwrapWebpageBridgeResult(
224
+ await callWebpage({ op: 'injectStylesheet', tabId, css: cssText })
225
+ )
226
+ );
227
+ return result.key;
228
+ }
229
+ }
230
+ };
231
+ }
232
+
233
+ /**
234
+ * Opens or reuses an embedded browser tab and returns a control handle.
235
+ *
236
+ * @param {(req: Record<string, unknown>) => Promise<unknown>} callWebpage - Bridge transport
237
+ * that accepts ScriptWebpageRequest-shaped payloads (`op` plus fields).
238
+ * @param {unknown} [url] - Optional URL; omit to bind the active browser tab.
239
+ * @param {unknown} [openOptions] - Optional `{ reuse }` (default true).
240
+ * @param {(path: string, pngBase64: string) => Promise<string>} [writeScreenshotBytes] - Optional
241
+ * writer used by `page.screenshot`.
242
+ * @returns {Promise<import('../types').PluginWebpageHandle>} Webpage handle.
243
+ */
244
+ export async function openWebpage(callWebpage, url, openOptions, writeScreenshotBytes) {
245
+ const normalizedOptions = normalizeWebpageOpenOptions(openOptions);
246
+ let openUrl;
247
+ if (url !== undefined && url !== null) {
248
+ const trimmed = String(url).trim();
249
+ if (!trimmed) {
250
+ throw new Error('hc.webpage requires a non-empty url when provided');
251
+ }
252
+ openUrl = trimmed;
253
+ }
254
+ const opened = /** @type {{
255
+ tabId: string;
256
+ url: string;
257
+ title: string;
258
+ canGoBack?: boolean;
259
+ canGoForward?: boolean;
260
+ }} */ (
261
+ unwrapWebpageBridgeResult(
262
+ await callWebpage({
263
+ op: 'open',
264
+ url: openUrl,
265
+ reuse: normalizedOptions.reuse
266
+ })
267
+ )
268
+ );
269
+ if (!opened || typeof opened.tabId !== 'string') {
270
+ throw new Error('hc.webpage open did not return a tab');
271
+ }
272
+ return createWebpageHandle(opened, callWebpage, writeScreenshotBytes);
273
+ }