dsh-click 0.1.4 → 0.3.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.
@@ -27,13 +27,17 @@ export { HelperBackend } from './platform/runner.js';
27
27
  export { allTools, type ToolServices } from './tools.js';
28
28
  export { OBSERVED_EVENT, ACTION_EVENT, type ObservedEvent, type ActionEvent, type ProcessFacts } from './events.js';
29
29
  export { sanitizeText, sanitizePath, redactSensitive, sanitizeVisible } from './sanitize.js';
30
+ export { TesseractOcrProvider, UnavailableOcrProvider, parseTesseractTsv, probeTesseract, tesseractArgv, type OcrBox, type OcrProvider, type OcrWord, } from './vision/ocr.js';
31
+ export { UnavailableGroundingProvider, type GroundingBox, type GroundingTarget, type VisualGroundingProvider, } from './vision/grounding.js';
32
+ export { centerOf, screenBoxFor } from './vision/index.js';
30
33
  /**
31
- * Mount the plugin: resolve config, select the platform backend, and register
34
+ * Mount the plugin: resolve config, select the platform backend, probe the
35
+ * optional OCR provider, read the optional visual-grounding seam, and register
32
36
  * every tool through `ctx.tools.register` (each registration is an effect
33
37
  * whose disposer removes exactly that tool on stop/HMR).
34
38
  *
35
39
  * @param ctx - context carrying the tools registry.
36
40
  * @param config - raw loader config; defaults applied through {@link resolveConfig}.
37
41
  */
38
- export declare function apply(ctx: Context, config: Config): void;
42
+ export declare function apply(ctx: Context, config: Config): Promise<void>;
39
43
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAIlD,OAAO,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAA;AAMnD,eAAO,MAAM,IAAI,cAAc,CAAA;AAE/B,oEAAoE;AACpE,eAAO,MAAM,MAAM,UAAY,CAAA;AAE/B,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/G,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AACzF,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AACnH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAE5F;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAYxD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAA;AAQnD,eAAO,MAAM,IAAI,cAAc,CAAA;AAE/B,oEAAoE;AACpE,eAAO,MAAM,MAAM,UAAY,CAAA;AAE/B,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/G,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AACzF,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AACnH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC5F,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,OAAO,GACb,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,4BAA4B,EAC5B,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,uBAAuB,GAC7B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAE1D;;;;;;;;GAQG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BvE"}
@@ -14,6 +14,7 @@ import type { Context } from '@deepseek-ai/cordis';
14
14
  import { ActionExecutor } from './actions.js';
15
15
  import type { ResolvedConfig } from './config.js';
16
16
  import { ObservationStore } from './observe.js';
17
+ import { type OcrProvider, type VisualGroundingProvider } from './vision/index.js';
17
18
  import type { DesktopBackend, Rect } from './platform/types.js';
18
19
  /** Everything one tool needs at runtime; injected by `src/index.ts`. */
19
20
  export interface ToolServices {
@@ -27,6 +28,10 @@ export interface ToolServices {
27
28
  readonly observations: ObservationStore;
28
29
  /** The action executor. */
29
30
  readonly actions: ActionExecutor;
31
+ /** The probed OCR provider (optional). */
32
+ readonly ocr: OcrProvider;
33
+ /** The optional visual grounding provider. */
34
+ readonly grounding: VisualGroundingProvider;
30
35
  }
31
36
  /** The sanitized, model-visible window facts shared by observer outputs. */
32
37
  export interface ObservedWindowValue {
@@ -57,6 +62,18 @@ export declare function screenShotTool(services: ToolServices): import("@deepsee
57
62
  * @returns the tool definition.
58
63
  */
59
64
  export declare function screenReadTool(services: ToolServices): import("@deepseek-ai/dsh-tools").ToolDefinition;
65
+ /**
66
+ * `screen_find` — find clickable text/visual targets in a window whose
67
+ * accessibility tree is empty (no UIA elements). It captures the window,
68
+ * runs OCR (when the probed provider is available) and, when a grounding
69
+ * provider is mounted and a query is given, visual grounding, then returns
70
+ * screen-coordinate targets plus an observationId for the coordinate-based
71
+ * `click` path. Read-only: never needs approval.
72
+ *
73
+ * @param services - runtime services.
74
+ * @returns the tool definition.
75
+ */
76
+ export declare function screenFindTool(services: ToolServices): import("@deepseek-ai/dsh-tools").ToolDefinition;
60
77
  /**
61
78
  * `click` — click an element (by elementId) or a coordinate inside the
62
79
  * observed window. Never steals foreground focus; delivery is UIA invoke
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAG/C,OAAO,KAAK,EAAE,cAAc,EAA0B,IAAI,EAAyC,MAAM,qBAAqB,CAAA;AAE9H,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB,8BAA8B;IAC9B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,6BAA6B;IAC7B,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAA;IACvC,2BAA2B;IAC3B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;CACjC;AAED,4EAA4E;AAC5E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,IAAI,EAAE,IAAI,CAAA;IACV,UAAU,EAAE,OAAO,CAAA;CACpB;AAgFD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,mDAoIpD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,mDA+IpD;AAiED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,YAAY,mDAoD/C;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,mDAyC9C;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,YAAY,mDA0ChD;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,YAAY,mDAkC7C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,mDA+EjD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,mDAwCnD;AAED,oDAAoD;AACpD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,qDAW9C"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAG/C,OAAO,EAA0B,KAAK,WAAW,EAAE,KAAK,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC1G,OAAO,KAAK,EAAE,cAAc,EAA0B,IAAI,EAAyC,MAAM,qBAAqB,CAAA;AAE9H,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB,8BAA8B;IAC9B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,6BAA6B;IAC7B,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAA;IACvC,2BAA2B;IAC3B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAA;IACzB,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAA;CAC5C;AAED,4EAA4E;AAC5E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,IAAI,EAAE,IAAI,CAAA;IACV,UAAU,EAAE,OAAO,CAAA;CACpB;AAgFD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,mDAoIpD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,mDA+IpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,mDAsJpD;AAiED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,YAAY,mDAoD/C;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,mDAyC9C;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,YAAY,mDA0ChD;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,YAAY,mDAkC7C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,mDA+EjD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,mDAwCnD;AAED,oDAAoD;AACpD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,qDAY9C"}
@@ -7,7 +7,7 @@
7
7
  * @module dsh-click/version
8
8
  */
9
9
  /** Plugin version advertised in the helper-protocol handshake. */
10
- export declare const VERSION = "0.1.4";
10
+ export declare const VERSION = "0.3.0";
11
11
  /** The helper protocol revision; bump only on incompatible wire changes. */
12
12
  export declare const HELPER_PROTOCOL_VERSION = 1;
13
13
  //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Visual grounding seam: turning a screenshot plus a natural-language prompt
3
+ * into labeled bounding boxes. Kept as an independent provider so a vision
4
+ * model (or an external grounding service) can plug in later without touching
5
+ * the desktop backend or the tool surface. The default is unavailable — the
6
+ * OCR path (`screen_find`) already yields text targets, and a grounding
7
+ * provider is optional and probed through the `dsh-click/grounding` seam.
8
+ *
9
+ * @module dsh-click/vision/grounding
10
+ */
11
+ /** One grounded box in screenshot pixel coordinates. */
12
+ export interface GroundingBox {
13
+ x: number;
14
+ y: number;
15
+ width: number;
16
+ height: number;
17
+ }
18
+ /** One grounded target: a label plus its box and confidence. */
19
+ export interface GroundingTarget {
20
+ label: string;
21
+ box: GroundingBox;
22
+ /** 0..1 confidence. */
23
+ confidence: number;
24
+ }
25
+ /** One visual grounding provider. */
26
+ export interface VisualGroundingProvider {
27
+ /** Stable provider id. */
28
+ readonly id: string;
29
+ /** Whether the provider can run. */
30
+ readonly available: boolean;
31
+ /** Why the provider is unavailable, when it is. */
32
+ readonly unavailableReason?: string;
33
+ /** Ground one screenshot for the given prompt. */
34
+ ground(pngBase64: string, width: number, height: number, prompt: string, signal?: AbortSignal): Promise<GroundingTarget[]>;
35
+ }
36
+ /** A provider that cannot run: `ground` fails closed with the given reason. */
37
+ export declare class UnavailableGroundingProvider implements VisualGroundingProvider {
38
+ readonly id: string;
39
+ readonly reason: string;
40
+ readonly available = false;
41
+ /** @param id - provider id. @param reason - model-readable unavailability reason. */
42
+ constructor(id?: string, reason?: string);
43
+ get unavailableReason(): string;
44
+ ground(_pngBase64: string, _width: number, _height: number, _prompt: string, _signal?: AbortSignal): Promise<GroundingTarget[]>;
45
+ }
46
+ //# sourceMappingURL=grounding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grounding.d.ts","sourceRoot":"","sources":["../../../src/vision/grounding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,gEAAgE;AAChE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,YAAY,CAAA;IACjB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,qCAAqC;AACrC,MAAM,WAAW,uBAAuB;IACtC,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,mDAAmD;IACnD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IACnC,kDAAkD;IAClD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;CAC3H;AAED,+EAA+E;AAC/E,qBAAa,4BAA6B,YAAW,uBAAuB;IAI9D,QAAQ,CAAC,EAAE;IAAkB,QAAQ,CAAC,MAAM;IAHxD,QAAQ,CAAC,SAAS,SAAQ;IAE1B,qFAAqF;gBAChE,EAAE,SAAgB,EAAW,MAAM,SAA4C;IAEpG,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAGhI"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Vision seam index: re-exports the OCR and visual-grounding providers and the
3
+ * shared pixel→screen coordinate mapping the `screen_find` tool uses to turn
4
+ * screenshot boxes into clickable screen coordinates.
5
+ *
6
+ * @module dsh-click/vision
7
+ */
8
+ import type { Rect } from '../platform/types.js';
9
+ export { TesseractOcrProvider, UnavailableOcrProvider, parseTesseractTsv, probeTesseract, tesseractArgv, type OcrBox, type OcrProvider, type OcrWord, } from './ocr.js';
10
+ export { UnavailableGroundingProvider, type GroundingBox, type GroundingTarget, type VisualGroundingProvider, } from './grounding.js';
11
+ /**
12
+ * Map one screenshot box (possibly downscaled by `maxScreenshotSide`) to its
13
+ * screen-space box, centering on the window's screen rect origin.
14
+ * @param rect - the window's screen rectangle.
15
+ * @param imageWidth - screenshot width in pixels.
16
+ * @param imageHeight - screenshot height in pixels.
17
+ * @param box - the screenshot-space box.
18
+ * @returns the screen-space box.
19
+ */
20
+ export declare function screenBoxFor(rect: Rect, imageWidth: number, imageHeight: number, box: {
21
+ x: number;
22
+ y: number;
23
+ width: number;
24
+ height: number;
25
+ }): {
26
+ x: number;
27
+ y: number;
28
+ width: number;
29
+ height: number;
30
+ };
31
+ /** Center point of a screen-space box (the coordinate `click` addresses). */
32
+ export declare function centerOf(box: {
33
+ x: number;
34
+ y: number;
35
+ width: number;
36
+ height: number;
37
+ }): {
38
+ x: number;
39
+ y: number;
40
+ };
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vision/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAEhD,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,OAAO,GACb,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,4BAA4B,EAC5B,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,uBAAuB,GAC7B,MAAM,gBAAgB,CAAA;AAEvB;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CASzD;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,CAAC,GAAG,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAE/G"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Optical character recognition seam for windows without a UIA tree. OCR is
3
+ * optional and probed at mount: the `tesseract` provider is used only when the
4
+ * binary resolves through the subprocess service, otherwise an unavailable
5
+ * provider fails closed with a model-readable reason. Recognized words carry
6
+ * their pixel boxes, which `screen_find` maps to screen coordinates for the
7
+ * coordinate-based `click` path.
8
+ *
9
+ * @module dsh-click/vision/ocr
10
+ */
11
+ import type { SubprocessRuntime } from '@deepseek-ai/dsh-subprocess';
12
+ /** One OCR word box, in screenshot pixel coordinates. */
13
+ export interface OcrBox {
14
+ x: number;
15
+ y: number;
16
+ width: number;
17
+ height: number;
18
+ }
19
+ /** One recognized word plus its box and confidence. */
20
+ export interface OcrWord {
21
+ text: string;
22
+ box: OcrBox;
23
+ /** 0..100 tesseract confidence, or 0 when unknown. */
24
+ confidence: number;
25
+ }
26
+ /** One OCR provider (probed at mount). */
27
+ export interface OcrProvider {
28
+ /** Stable provider id. */
29
+ readonly id: string;
30
+ /** Whether the provider can run. */
31
+ readonly available: boolean;
32
+ /** Why the provider is unavailable, when it is. */
33
+ readonly unavailableReason?: string;
34
+ /** Recognize text in one PNG screenshot. */
35
+ recognize(pngBase64: string, signal?: AbortSignal): Promise<OcrWord[]>;
36
+ }
37
+ /**
38
+ * Build the tesseract command line: write words as TSV to stdout.
39
+ * @param command - tesseract executable.
40
+ * @param imagePath - absolute PNG path.
41
+ * @param language - tesseract language tag.
42
+ * @returns the argv (argv[0] is the executable).
43
+ */
44
+ export declare function tesseractArgv(command: string, imagePath: string, language: string): readonly string[];
45
+ /**
46
+ * Parse tesseract TSV output into word boxes. Non-word rows, empty text, and
47
+ * malformed numeric fields are skipped; a hostile or truncated stdout cannot
48
+ * produce bogus coordinates.
49
+ * @param tsv - tesseract TSV text from stdout.
50
+ * @returns the recognized words.
51
+ */
52
+ export declare function parseTesseractTsv(tsv: string): OcrWord[];
53
+ /** A provider that cannot run: `recognize` fails closed with the given reason. */
54
+ export declare class UnavailableOcrProvider implements OcrProvider {
55
+ readonly id: string;
56
+ readonly reason: string;
57
+ readonly available = false;
58
+ /** @param id - provider id. @param reason - model-readable unavailability reason. */
59
+ constructor(id: string, reason: string);
60
+ get unavailableReason(): string;
61
+ recognize(_pngBase64: string, _signal?: AbortSignal): Promise<OcrWord[]>;
62
+ }
63
+ /** The tesseract OCR provider over `ctx.subprocess`. */
64
+ export declare class TesseractOcrProvider implements OcrProvider {
65
+ private readonly subprocess;
66
+ private readonly command;
67
+ private readonly language;
68
+ readonly id = "tesseract";
69
+ readonly available = true;
70
+ /**
71
+ * @param subprocess - the subprocess service that runs tesseract.
72
+ * @param command - tesseract executable name.
73
+ * @param language - tesseract language tag.
74
+ */
75
+ constructor(subprocess: SubprocessRuntime, command: string, language: string);
76
+ recognize(pngBase64: string, signal?: AbortSignal): Promise<OcrWord[]>;
77
+ }
78
+ /**
79
+ * Probe tesseract through the subprocess service and return a provider.
80
+ * A missing binary degrades to an unavailable provider (fail closed), never a
81
+ * crash, so the zero-dependency desktop path keeps working.
82
+ *
83
+ * @param subprocess - the subprocess service.
84
+ * @param command - tesseract executable name.
85
+ * @param language - tesseract language tag.
86
+ * @returns the probed OCR provider.
87
+ */
88
+ export declare function probeTesseract(subprocess: SubprocessRuntime, command: string, language: string): Promise<OcrProvider>;
89
+ //# sourceMappingURL=ocr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ocr.d.ts","sourceRoot":"","sources":["../../../src/vision/ocr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAIpE,yDAAyD;AACzD,MAAM,WAAW,MAAM;IACrB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,uDAAuD;AACvD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,0CAA0C;AAC1C,MAAM,WAAW,WAAW;IAC1B,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,mDAAmD;IACnD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IACnC,4CAA4C;IAC5C,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;CACvE;AAKD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAErG;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,CAqBxD;AAED,kFAAkF;AAClF,qBAAa,sBAAuB,YAAW,WAAW;IAI5C,QAAQ,CAAC,EAAE,EAAE,MAAM;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM;IAHxD,QAAQ,CAAC,SAAS,SAAQ;IAE1B,qFAAqF;gBAChE,EAAE,EAAE,MAAM,EAAW,MAAM,EAAE,MAAM;IAExD,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAGzE;AAED,wDAAwD;AACxD,qBAAa,oBAAqB,YAAW,WAAW;IAUpD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAX3B,QAAQ,CAAC,EAAE,eAAc;IACzB,QAAQ,CAAC,SAAS,QAAO;IAEzB;;;;OAIG;gBAEgB,UAAU,EAAE,iBAAiB,EAC7B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM;IAG7B,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CA2B7E;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAO3H"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-click",
3
- "version": "0.1.4",
3
+ "version": "0.3.0",
4
4
  "description": "Cross-platform native desktop control tools for DeepSeek Harness (Windows first): screen_shot, screen_read (accessibility tree + pixel description for text-only models), click/type/scroll/key, and app_list/app_launch — every mutating action gated by approval, never stealing foreground focus, with stale-observation rejection and process-identity checks",
5
5
  "repository": {
6
6
  "type": "git",
@@ -146,5 +146,9 @@
146
146
  "verify:self-contained": "node scripts/verify-self-contained.mjs",
147
147
  "verify:artifacts": "node scripts/verify-artifacts.mjs"
148
148
  },
149
- "license": "Apache-2.0"
149
+ "license": "Apache-2.0",
150
+ "funding": {
151
+ "type": "individual",
152
+ "url": "https://github.com/sponsors/PerryLink"
153
+ }
150
154
  }