@lattices/cli 0.6.0 → 0.6.1
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 +13 -4
- package/apps/mac/Info.plist +4 -2
- package/apps/mac/Lattices.app/Contents/Info.plist +4 -2
- package/apps/mac/Lattices.app/Contents/MacOS/Lattices +0 -0
- package/apps/mac/Lattices.app/Contents/Resources/docs/assistant-knowledge.md +130 -0
- package/apps/mac/Lattices.app/Contents/_CodeSignature/CodeResources +11 -0
- package/apps/mac/Lattices.entitlements +6 -0
- package/bin/assistant-intelligence.ts +41 -3
- package/bin/cli/capture.ts +252 -0
- package/bin/cli/daemon.ts +22 -0
- package/bin/cli/helpers.ts +105 -0
- package/bin/cli/layer.ts +178 -0
- package/bin/cli/runs.ts +43 -0
- package/bin/cli/search.ts +141 -0
- package/bin/cli/session.ts +32 -0
- package/bin/client.ts +2 -1
- package/bin/cua.ts +26 -0
- package/bin/infer.ts +22 -4
- package/bin/keychain.ts +75 -0
- package/bin/lattices-app.ts +111 -12
- package/bin/lattices-build-env.ts +77 -0
- package/bin/lattices-dev +29 -2
- package/bin/lattices.ts +729 -769
- package/docs/api.md +496 -3
- package/docs/app.md +5 -4
- package/docs/assistant-knowledge.md +130 -0
- package/docs/config.md +5 -0
- package/docs/hyperspace-grid-snappiness.md +210 -0
- package/docs/layers.md +53 -0
- package/docs/mouse-gestures.md +40 -3
- package/docs/ocr.md +3 -0
- package/docs/prompts/hands-off-system.md +9 -1
- package/docs/proposals/LAT-006-followup-gaps.md +103 -0
- package/docs/proposals/{LAT-006-mira-in-lattices.md → LAT-006-runs-and-capture-in-lattices.md} +83 -70
- package/docs/quickstart.md +3 -1
- package/docs/reference/dewey.config.ts +1 -1
- package/docs/release.md +4 -3
- package/docs/terminal-kit.md +87 -0
- package/docs/tiling-reference.md +5 -3
- package/docs/voice.md +3 -3
- package/package.json +27 -5
- package/packages/npm/sdk/cua.d.mts +1 -0
- package/packages/npm/sdk/cua.d.ts +188 -0
- package/packages/npm/sdk/cua.mjs +376 -0
package/docs/api.md
CHANGED
|
@@ -138,6 +138,44 @@ if (await isDaemonRunning()) {
|
|
|
138
138
|
|
|
139
139
|
Returns `true` if `daemon.status` responds within 1 second.
|
|
140
140
|
|
|
141
|
+
## TypeScript SDK facade
|
|
142
|
+
|
|
143
|
+
The CLI is a human/debug surface. Product code and agents should prefer the
|
|
144
|
+
typed SDK facade, which validates params with Zod and calls the same daemon
|
|
145
|
+
methods directly.
|
|
146
|
+
|
|
147
|
+
```ts
|
|
148
|
+
import { cua } from '@lattices/sdk'
|
|
149
|
+
|
|
150
|
+
await cua.magicCursor({
|
|
151
|
+
app: 'Scout',
|
|
152
|
+
xRatio: 0.52,
|
|
153
|
+
yRatio: 0.91,
|
|
154
|
+
text: 'What are the most important docs in this project, and what would an agent say after reading them?',
|
|
155
|
+
treatment: 'execute',
|
|
156
|
+
trail: 'comet',
|
|
157
|
+
motion: 'rush',
|
|
158
|
+
trajectory: 'overshoot',
|
|
159
|
+
glow: 'halo',
|
|
160
|
+
idle: 'wiggle',
|
|
161
|
+
edge: 'ripple',
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
await cua.click({
|
|
165
|
+
app: 'Scout',
|
|
166
|
+
xRatio: 0.74,
|
|
167
|
+
yRatio: 0.95,
|
|
168
|
+
transport: 'ax',
|
|
169
|
+
axLabel: 'Send',
|
|
170
|
+
noFocus: true,
|
|
171
|
+
treatment: 'execute',
|
|
172
|
+
})
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
`@lattices/cli/cua` exposes the same CUA module for CLI-adjacent scripts, but
|
|
176
|
+
new app and agent code should use `@lattices/sdk` or `@lattices/sdk/cua` so the
|
|
177
|
+
import names the product surface instead of the CLI package.
|
|
178
|
+
|
|
141
179
|
### Error handling
|
|
142
180
|
|
|
143
181
|
`daemonCall` throws on errors — always wrap calls in try/catch:
|
|
@@ -160,6 +198,394 @@ try {
|
|
|
160
198
|
|
|
161
199
|
---
|
|
162
200
|
|
|
201
|
+
## Runs And Capture
|
|
202
|
+
|
|
203
|
+
Runs are local executions that produce trace events and artifacts. Capture
|
|
204
|
+
methods write into the Lattices run store under
|
|
205
|
+
`~/Library/Application Support/Lattices/Runs/`.
|
|
206
|
+
|
|
207
|
+
| Method | Type | Description |
|
|
208
|
+
|--------|------|-------------|
|
|
209
|
+
| `runs.create` | write | Create a run record and artifact directory |
|
|
210
|
+
| `runs.list` | read | List recent runs |
|
|
211
|
+
| `runs.get` | read | Inspect one run, including artifacts and trace events |
|
|
212
|
+
| `runs.artifacts` | read | List artifacts for one run |
|
|
213
|
+
| `capture.screenshotWindow` | write | Capture a window screenshot as a run artifact |
|
|
214
|
+
| `computer.prepare` | write | Resolve and optionally capture a terminal target without mutating it |
|
|
215
|
+
| `computer.focusWindow` | write | Resolve, capture, focus, and verify a target window |
|
|
216
|
+
| `computer.showCursor` | write | Show a visible cursor appearance and record it as a run |
|
|
217
|
+
| `computer.launchApp` | write | Launch or focus a normal macOS app and record the run |
|
|
218
|
+
| `computer.typeWindowText` | write | Type or paste into a normal app window, optionally after a click |
|
|
219
|
+
| `computer.click` | write | Stage or execute a window-relative click target; prefers no-focus `AXPress` in auto/ax transport |
|
|
220
|
+
| `computer.demoScout` | write | Scout warm-up run for memo/demo recording |
|
|
221
|
+
| `computer.typeText` | write | Insert text into a safe terminal using the least intrusive transport |
|
|
222
|
+
| `computer.demoTerminal` | write | Compatibility wrapper for a bounded terminal text action |
|
|
223
|
+
|
|
224
|
+
#### `capture.screenshotWindow`
|
|
225
|
+
|
|
226
|
+
Capture a window as a PNG artifact. If no target is provided, Lattices captures
|
|
227
|
+
the frontmost non-Lattices window.
|
|
228
|
+
|
|
229
|
+
**Params**:
|
|
230
|
+
|
|
231
|
+
| Field | Type | Required | Description |
|
|
232
|
+
|-------|------|----------|-------------|
|
|
233
|
+
| `wid` | uint32 | no | Target CGWindowID |
|
|
234
|
+
| `session` | string | no | Target lattices session |
|
|
235
|
+
| `app` | string | no | Target app name |
|
|
236
|
+
| `title` | string | no | Optional title filter for `app`, or run title |
|
|
237
|
+
| `runId` | string | no | Existing run to append to |
|
|
238
|
+
| `source` | string | no | Calling surface label |
|
|
239
|
+
| `filename` | string | no | Optional artifact filename |
|
|
240
|
+
|
|
241
|
+
```js
|
|
242
|
+
await daemonCall('capture.screenshotWindow', { source: 'agent' })
|
|
243
|
+
|
|
244
|
+
await daemonCall('capture.screenshotWindow', {
|
|
245
|
+
session: 'frontend-a1b2c3',
|
|
246
|
+
filename: 'before-layout.png'
|
|
247
|
+
})
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
CLI:
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
lattices capture window
|
|
254
|
+
lattices runs
|
|
255
|
+
lattices runs run_20260617-120000_a1b2c3
|
|
256
|
+
lattices terminals
|
|
257
|
+
lattices terminals --refresh
|
|
258
|
+
lattices computer prepare --text "# hello" --treatment stage
|
|
259
|
+
lattices computer focus-window --wid 7258 --treatment present
|
|
260
|
+
lattices computer cursor --style marker --shape chevron --angle-deg -8 --label typing
|
|
261
|
+
lattices computer launch-app Scout
|
|
262
|
+
lattices computer scout --treatment present
|
|
263
|
+
lattices computer scout "Draft memo text" --execute
|
|
264
|
+
lattices computer type-window --app Scout --text "Draft memo text" --x-ratio .5 --y-ratio .86 --execute
|
|
265
|
+
lattices computer click --app Scout --x-ratio .5 --y-ratio .86 --execute
|
|
266
|
+
lattices cua click --app Scout --x-ratio .74 --y-ratio .95 --transport ax --ax-label Send --execute
|
|
267
|
+
lattices computer type-text --text "# hello from lattices"
|
|
268
|
+
lattices computer demo-terminal --dry-run
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
#### Computer Action Treatments
|
|
274
|
+
|
|
275
|
+
Computer-use endpoints accept a `treatment` field that controls how intrusive
|
|
276
|
+
the action may be:
|
|
277
|
+
|
|
278
|
+
| Treatment | Behavior |
|
|
279
|
+
|-----------|----------|
|
|
280
|
+
| `observe` | Resolve target and record a run, without focus or input |
|
|
281
|
+
| `stage` | Resolve target and stage intent/artifacts, without focus or input |
|
|
282
|
+
| `present` | Focus or present the target, without input |
|
|
283
|
+
| `execute` | Perform the action after safety checks |
|
|
284
|
+
|
|
285
|
+
The legacy `dryRun: true` flag maps to `stage`.
|
|
286
|
+
|
|
287
|
+
#### `computer.prepare`
|
|
288
|
+
|
|
289
|
+
Resolve and score terminal candidates for a future computer-use action. This is
|
|
290
|
+
the least intrusive endpoint: by default it observes the target and captures an
|
|
291
|
+
artifact, but it does not focus or type.
|
|
292
|
+
|
|
293
|
+
**Params**:
|
|
294
|
+
|
|
295
|
+
| Field | Type | Required | Description |
|
|
296
|
+
|-------|------|----------|-------------|
|
|
297
|
+
| `wid` | uint32 | no | Specific terminal window id |
|
|
298
|
+
| `tty` | string | no | Specific terminal TTY |
|
|
299
|
+
| `app` | string | no | Preferred terminal app, such as `iTerm2` |
|
|
300
|
+
| `text` | string | no | Text to stage in the run trace |
|
|
301
|
+
| `treatment` | string | no | `observe`, `stage`, `present`, or `execute` |
|
|
302
|
+
| `capture` | bool | no | Capture target screenshot artifact. Defaults to `true` |
|
|
303
|
+
| `source` | string | no | Calling surface label |
|
|
304
|
+
|
|
305
|
+
```js
|
|
306
|
+
await daemonCall('computer.prepare', {
|
|
307
|
+
text: '# review before typing',
|
|
308
|
+
treatment: 'stage'
|
|
309
|
+
})
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
#### `computer.focusWindow`
|
|
313
|
+
|
|
314
|
+
Resolve a target window, optionally capture it, focus it, and verify the focused
|
|
315
|
+
window id. Use `treatment: 'observe'` or `stage` to plan without presenting.
|
|
316
|
+
|
|
317
|
+
**Params**:
|
|
318
|
+
|
|
319
|
+
| Field | Type | Required | Description |
|
|
320
|
+
|-------|------|----------|-------------|
|
|
321
|
+
| `wid` | uint32 | no | Target window id |
|
|
322
|
+
| `session` | string | no | Target lattices session |
|
|
323
|
+
| `app` | string | no | Target app name |
|
|
324
|
+
| `title` | string | no | Optional title substring for `app` |
|
|
325
|
+
| `treatment` | string | no | `observe`, `stage`, `present`, or `execute` |
|
|
326
|
+
| `dryRun` | bool | no | Stage without focusing |
|
|
327
|
+
| `capture` | bool | no | Capture before/after artifacts. Defaults to `true` |
|
|
328
|
+
| `source` | string | no | Calling surface label |
|
|
329
|
+
|
|
330
|
+
```js
|
|
331
|
+
await daemonCall('computer.focusWindow', {
|
|
332
|
+
app: 'iTerm2',
|
|
333
|
+
treatment: 'present'
|
|
334
|
+
})
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
#### `computer.showCursor`
|
|
338
|
+
|
|
339
|
+
Resolve the current cursor location and show a visible cursor appearance. This
|
|
340
|
+
is the cursor equivalent of a typing action: it records a run, cursor target,
|
|
341
|
+
appearance parameters, and trace events. Use `observe` or `stage` to plan
|
|
342
|
+
without showing anything.
|
|
343
|
+
|
|
344
|
+
**Params**:
|
|
345
|
+
|
|
346
|
+
| Field | Type | Required | Description |
|
|
347
|
+
|-------|------|----------|-------------|
|
|
348
|
+
| `x` | double | no | Screen x coordinate. Defaults to current cursor |
|
|
349
|
+
| `y` | double | no | Screen y coordinate. Defaults to current cursor |
|
|
350
|
+
| `treatment` | string | no | `observe`, `stage`, `present`, or `execute` |
|
|
351
|
+
| `style` | string | no | `spotlight`, `pulse`, or `marker` |
|
|
352
|
+
| `appearance` | string | no | Alias for `style` |
|
|
353
|
+
| `shape` | string | no | Marker shape: `chevron`, `facet`, `shard`, `wedge`, `prism`, or `notch` |
|
|
354
|
+
| `angleDeg` | double | no | Marker rotation in degrees. Positive rotates visually clockwise; default is `-8` for marker |
|
|
355
|
+
| `size` | string | no | Marker size: `small`, `regular`, or `large`. Defaults to Settings |
|
|
356
|
+
| `color` | string | no | `blue`, `green`, `amber`, `pink`, `red`, or `white` |
|
|
357
|
+
| `durationMs` | int | no | Appearance duration in milliseconds |
|
|
358
|
+
| `label` | string | no | Optional marker label |
|
|
359
|
+
| `dryRun` | bool | no | Stage without showing |
|
|
360
|
+
| `source` | string | no | Calling surface label |
|
|
361
|
+
|
|
362
|
+
```js
|
|
363
|
+
await daemonCall('computer.showCursor', {
|
|
364
|
+
style: 'marker',
|
|
365
|
+
shape: 'chevron',
|
|
366
|
+
angleDeg: -8,
|
|
367
|
+
size: 'regular',
|
|
368
|
+
color: 'white',
|
|
369
|
+
treatment: 'present'
|
|
370
|
+
})
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
#### `computer.launchApp`
|
|
374
|
+
|
|
375
|
+
Launch or focus a normal macOS app and record the result as a run. Use
|
|
376
|
+
`dryRun: true` or `treatment: 'stage'` to plan without launching.
|
|
377
|
+
|
|
378
|
+
**Params**:
|
|
379
|
+
|
|
380
|
+
| Field | Type | Required | Description |
|
|
381
|
+
|-------|------|----------|-------------|
|
|
382
|
+
| `app` | string | yes | App name, such as `Scout`, `Slack`, or `Notes` |
|
|
383
|
+
| `bundleId` | string | no | Bundle identifier fallback for precise launch |
|
|
384
|
+
| `path` | string | no | Explicit `.app` bundle path |
|
|
385
|
+
| `title` | string | no | Optional title substring for app window selection |
|
|
386
|
+
| `treatment` | string | no | `observe`, `stage`, `present`, or `execute` |
|
|
387
|
+
| `dryRun` | bool | no | Stage without launching |
|
|
388
|
+
| `capture` | bool | no | Capture the launched app window. Defaults to `true` outside dry-run |
|
|
389
|
+
| `source` | string | no | Calling surface label |
|
|
390
|
+
|
|
391
|
+
```js
|
|
392
|
+
await daemonCall('computer.launchApp', {
|
|
393
|
+
app: 'Scout',
|
|
394
|
+
treatment: 'present'
|
|
395
|
+
})
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
#### `computer.typeWindowText`
|
|
399
|
+
|
|
400
|
+
Focus a normal app window and insert text. If click coordinates are provided,
|
|
401
|
+
Lattices clicks that target before typing. Coordinates can be absolute screen
|
|
402
|
+
points (`x`, `y`) or ratios inside the target window (`xRatio`, `yRatio`).
|
|
403
|
+
For window ratios, `0,0` is the top-left of the window and `1,1` is the
|
|
404
|
+
bottom-right.
|
|
405
|
+
|
|
406
|
+
**Params**:
|
|
407
|
+
|
|
408
|
+
| Field | Type | Required | Description |
|
|
409
|
+
|-------|------|----------|-------------|
|
|
410
|
+
| `wid` | uint32 | no | Target window id |
|
|
411
|
+
| `app` | string | no | Target app name |
|
|
412
|
+
| `title` | string | no | Optional title substring for app target |
|
|
413
|
+
| `text` | string | yes | Text to insert |
|
|
414
|
+
| `enter` | bool | no | Press Enter after typing. Defaults to `false` |
|
|
415
|
+
| `send` | bool | no | Alias for `enter` in chat-style demos |
|
|
416
|
+
| `x`, `y` | double | no | Absolute click point before typing |
|
|
417
|
+
| `xRatio`, `yRatio` | double | no | Window-relative click point before typing |
|
|
418
|
+
| `treatment` | string | no | `observe`, `stage`, `present`, or `execute` |
|
|
419
|
+
| `dryRun` | bool | no | Stage without typing |
|
|
420
|
+
| `capture` | bool | no | Capture before/after artifacts. Defaults to `true` |
|
|
421
|
+
| `source` | string | no | Calling surface label |
|
|
422
|
+
|
|
423
|
+
```js
|
|
424
|
+
await daemonCall('computer.typeWindowText', {
|
|
425
|
+
app: 'Scout',
|
|
426
|
+
text: 'Draft memo text',
|
|
427
|
+
xRatio: 0.5,
|
|
428
|
+
yRatio: 0.86,
|
|
429
|
+
treatment: 'execute'
|
|
430
|
+
})
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
#### `computer.click`
|
|
434
|
+
|
|
435
|
+
Stage or execute a click target. `stage` records the target without clicking.
|
|
436
|
+
In `execute`, `transport: "auto"` prefers `AXPress` on the resolved accessibility
|
|
437
|
+
button/control before falling back to a pointer click. Use `transport: "ax"` or
|
|
438
|
+
`noFocus: true` when the action must not focus the app or move the hardware
|
|
439
|
+
pointer. When a window target is provided, ratios are relative to that window.
|
|
440
|
+
|
|
441
|
+
**Params**:
|
|
442
|
+
|
|
443
|
+
| Field | Type | Required | Description |
|
|
444
|
+
|-------|------|----------|-------------|
|
|
445
|
+
| `wid` | uint32 | no | Target window id |
|
|
446
|
+
| `app` | string | no | Target app name |
|
|
447
|
+
| `title` | string | no | Optional title substring for app target |
|
|
448
|
+
| `x`, `y` | double | no | Absolute click point |
|
|
449
|
+
| `xRatio`, `yRatio` | double | no | Window-relative click point |
|
|
450
|
+
| `button` | string | no | `left` or `right`; defaults to `left` |
|
|
451
|
+
| `transport` | string | no | `auto`, `ax`, or `pointer`; defaults to `auto` |
|
|
452
|
+
| `axLabel` | string | no | Optional AX text/title hint, such as `Send` |
|
|
453
|
+
| `noFocus` | bool | no | Require no-focus AX execution; disable pointer fallback |
|
|
454
|
+
| `treatment` | string | no | `stage`, `present`, or `execute` |
|
|
455
|
+
| `dryRun` | bool | no | Stage without clicking |
|
|
456
|
+
| `capture` | bool | no | Capture before/after artifacts when targeting a window |
|
|
457
|
+
| `source` | string | no | Calling surface label |
|
|
458
|
+
|
|
459
|
+
```js
|
|
460
|
+
await daemonCall('computer.click', {
|
|
461
|
+
app: 'Scout',
|
|
462
|
+
xRatio: 0.5,
|
|
463
|
+
yRatio: 0.86,
|
|
464
|
+
treatment: 'execute'
|
|
465
|
+
})
|
|
466
|
+
|
|
467
|
+
await daemonCall('computer.click', {
|
|
468
|
+
app: 'Scout',
|
|
469
|
+
xRatio: 0.74,
|
|
470
|
+
yRatio: 0.95,
|
|
471
|
+
transport: 'ax',
|
|
472
|
+
axLabel: 'Send',
|
|
473
|
+
noFocus: true,
|
|
474
|
+
treatment: 'execute'
|
|
475
|
+
})
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
#### `computer.demoScout`
|
|
479
|
+
|
|
480
|
+
Warm up a Scout memo/demo recording run. In `present` mode it launches or
|
|
481
|
+
focuses Scout and records a run without typing. In `execute` mode it can click
|
|
482
|
+
the likely composer area, type a draft, and optionally press Enter when
|
|
483
|
+
`enter` or `send` is true. Dry-run/stage mode does not capture by default, so it
|
|
484
|
+
works before Screen Recording permission is granted.
|
|
485
|
+
|
|
486
|
+
**Params**:
|
|
487
|
+
|
|
488
|
+
| Field | Type | Required | Description |
|
|
489
|
+
|-------|------|----------|-------------|
|
|
490
|
+
| `app` | string | no | Scout app name override. Defaults to `Scout` |
|
|
491
|
+
| `title` | string | no | Optional title substring for the Scout window |
|
|
492
|
+
| `text` | string | no | Draft text to type in `execute` mode |
|
|
493
|
+
| `enter` | bool | no | Press Enter after typing. Defaults to `false` |
|
|
494
|
+
| `send` | bool | no | Alias for `enter` |
|
|
495
|
+
| `click` | bool | no | Click the likely composer area before typing |
|
|
496
|
+
| `xRatio`, `yRatio` | double | no | Composer click point; defaults to `0.5`, `0.86` |
|
|
497
|
+
| `treatment` | string | no | `observe`, `stage`, `present`, or `execute` |
|
|
498
|
+
| `dryRun` | bool | no | Stage without launching or typing |
|
|
499
|
+
| `capture` | bool | no | Capture before/after artifacts. Defaults to `true` outside dry-run |
|
|
500
|
+
| `source` | string | no | Calling surface label |
|
|
501
|
+
|
|
502
|
+
```js
|
|
503
|
+
await daemonCall('computer.demoScout', { dryRun: true })
|
|
504
|
+
|
|
505
|
+
await daemonCall('computer.demoScout', {
|
|
506
|
+
treatment: 'present',
|
|
507
|
+
capture: false
|
|
508
|
+
})
|
|
509
|
+
|
|
510
|
+
await daemonCall('computer.demoScout', {
|
|
511
|
+
text: 'Draft memo text',
|
|
512
|
+
treatment: 'execute',
|
|
513
|
+
send: false
|
|
514
|
+
})
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
#### `computer.typeText`
|
|
518
|
+
|
|
519
|
+
Resolve a terminal target and insert text after safety checks. Lattices prefers
|
|
520
|
+
the least intrusive available transport: tmux pane input when a tmux pane is
|
|
521
|
+
known, then target-pid key events/pasteboard insertion when window focus is
|
|
522
|
+
required. Enter is never pressed unless `enter: true` is provided.
|
|
523
|
+
|
|
524
|
+
**Params**:
|
|
525
|
+
|
|
526
|
+
| Field | Type | Required | Description |
|
|
527
|
+
|-------|------|----------|-------------|
|
|
528
|
+
| `wid` | uint32 | no | Specific terminal window id |
|
|
529
|
+
| `tty` | string | no | Specific terminal TTY |
|
|
530
|
+
| `app` | string | no | Preferred terminal app, such as `iTerm2` |
|
|
531
|
+
| `text` | string | yes | Text to insert |
|
|
532
|
+
| `enter` | bool | no | Press Enter after typing. Defaults to `false` |
|
|
533
|
+
| `treatment` | string | no | `observe`, `stage`, `present`, or `execute` |
|
|
534
|
+
| `transport` | string | no | `auto`, `tmux`, or `pasteboard`. Defaults to `auto` |
|
|
535
|
+
| `dryRun` | bool | no | Stage without typing |
|
|
536
|
+
| `capture` | bool | no | Capture before/after artifacts. Defaults to `true` |
|
|
537
|
+
| `source` | string | no | Calling surface label |
|
|
538
|
+
|
|
539
|
+
```js
|
|
540
|
+
await daemonCall('computer.typeText', {
|
|
541
|
+
text: '# hello from lattices',
|
|
542
|
+
transport: 'auto',
|
|
543
|
+
enter: false
|
|
544
|
+
})
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
#### `computer.demoTerminal`
|
|
548
|
+
|
|
549
|
+
Compatibility endpoint for the original terminal demo. It follows the same
|
|
550
|
+
treatment, safety, capture, and transport rules as `computer.typeText`, but
|
|
551
|
+
provides a default text payload when `text` is omitted.
|
|
552
|
+
|
|
553
|
+
Run a bounded computer-use sequence against a terminal window:
|
|
554
|
+
|
|
555
|
+
1. synthesize and score terminal candidates
|
|
556
|
+
2. choose a safe shell-like terminal unless `wid` or `tty` is supplied
|
|
557
|
+
3. capture a `before` screenshot artifact
|
|
558
|
+
4. focus the terminal window
|
|
559
|
+
5. insert text without pressing Enter by default
|
|
560
|
+
6. capture an `after` screenshot artifact
|
|
561
|
+
|
|
562
|
+
**Params**:
|
|
563
|
+
|
|
564
|
+
| Field | Type | Required | Description |
|
|
565
|
+
|-------|------|----------|-------------|
|
|
566
|
+
| `wid` | uint32 | no | Specific terminal window id |
|
|
567
|
+
| `tty` | string | no | Specific terminal TTY |
|
|
568
|
+
| `app` | string | no | Preferred terminal app, such as `iTerm2` |
|
|
569
|
+
| `text` | string | no | Text to insert |
|
|
570
|
+
| `enter` | bool | no | Press Enter after typing. Defaults to `false` |
|
|
571
|
+
| `treatment` | string | no | `observe`, `stage`, `present`, or `execute` |
|
|
572
|
+
| `transport` | string | no | `auto`, `tmux`, or `pasteboard`. Defaults to `auto` |
|
|
573
|
+
| `dryRun` | bool | no | Plan and capture without typing |
|
|
574
|
+
| `capture` | bool | no | Capture before/after artifacts. Defaults to `true` |
|
|
575
|
+
| `source` | string | no | Calling surface label |
|
|
576
|
+
|
|
577
|
+
```js
|
|
578
|
+
await daemonCall('computer.demoTerminal', { dryRun: true })
|
|
579
|
+
|
|
580
|
+
await daemonCall('computer.demoTerminal', {
|
|
581
|
+
app: 'iTerm2',
|
|
582
|
+
text: '# hello from lattices',
|
|
583
|
+
enter: false
|
|
584
|
+
})
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
---
|
|
588
|
+
|
|
163
589
|
## Overlay UI
|
|
164
590
|
|
|
165
591
|
The macOS app exposes a shared desktop overlay canvas for lightweight
|
|
@@ -517,6 +943,68 @@ Return recent diagnostic log entries from the daemon.
|
|
|
517
943
|
|
|
518
944
|
---
|
|
519
945
|
|
|
946
|
+
## Mouse & Input
|
|
947
|
+
|
|
948
|
+
| Method | Type | Description |
|
|
949
|
+
|--------|------|-------------|
|
|
950
|
+
| `mouse.find` | read | Show a sonar pulse at the current cursor |
|
|
951
|
+
| `mouse.summon` | write | Move the cursor to a point or screen center |
|
|
952
|
+
| `mouse.shortcuts.get` | read | Return the live mouse shortcut config |
|
|
953
|
+
| `mouse.shortcuts.reload` | write | Reload `~/.lattices/mouse-shortcuts.json` without restarting |
|
|
954
|
+
| `mouse.shortcuts.set` | write | Replace the full mouse shortcut config and activate it |
|
|
955
|
+
| `mouse.shortcuts.upsert` | write | Create or replace one mouse shortcut rule and activate it |
|
|
956
|
+
| `mouse.shortcuts.remove` | write | Remove one mouse shortcut rule and activate the new config |
|
|
957
|
+
| `mouse.shortcuts.restoreDefaults` | write | Restore default mouse shortcuts |
|
|
958
|
+
|
|
959
|
+
Mouse shortcut rules are data. Prefer `shortcut.send` for hotkeys an agent can
|
|
960
|
+
define or change directly; do not add a named action unless the behavior cannot
|
|
961
|
+
be expressed as data.
|
|
962
|
+
|
|
963
|
+
Create or replace a gesture that sends Hyper+D:
|
|
964
|
+
|
|
965
|
+
```js
|
|
966
|
+
await daemonCall('mouse.shortcuts.upsert', {
|
|
967
|
+
rule: {
|
|
968
|
+
id: 'middle-up-voice',
|
|
969
|
+
enabled: true,
|
|
970
|
+
device: 'any',
|
|
971
|
+
trigger: { button: 'middle', kind: 'drag', direction: 'up' },
|
|
972
|
+
action: {
|
|
973
|
+
type: 'shortcut.send',
|
|
974
|
+
shortcut: {
|
|
975
|
+
key: 'd',
|
|
976
|
+
keyCode: 2,
|
|
977
|
+
modifiers: ['control', 'option', 'shift', 'command']
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
})
|
|
982
|
+
```
|
|
983
|
+
|
|
984
|
+
If an agent edits `~/.lattices/mouse-shortcuts.json` itself, refresh the running
|
|
985
|
+
app explicitly:
|
|
986
|
+
|
|
987
|
+
```js
|
|
988
|
+
await daemonCall('mouse.shortcuts.reload')
|
|
989
|
+
```
|
|
990
|
+
|
|
991
|
+
All write methods persist the config, checkpoint the previous version in
|
|
992
|
+
`~/.lattices/mouse-shortcuts.history/`, and update the active event-tap snapshot
|
|
993
|
+
immediately. No app restart is required.
|
|
994
|
+
|
|
995
|
+
Supported action types:
|
|
996
|
+
|
|
997
|
+
| Type | Purpose |
|
|
998
|
+
|------|---------|
|
|
999
|
+
| `shortcut.send` | Send a data-defined key or keyCode with modifiers |
|
|
1000
|
+
| `app.activate` | Activate an app by name |
|
|
1001
|
+
| `space.previous` | Switch to the previous macOS Space |
|
|
1002
|
+
| `space.next` | Switch to the next macOS Space |
|
|
1003
|
+
| `screenmap.toggle` | Open the Screen Map overview |
|
|
1004
|
+
| `dictation.start` | Legacy alias that presses the configured Voice Command hotkey |
|
|
1005
|
+
|
|
1006
|
+
---
|
|
1007
|
+
|
|
520
1008
|
## Windows & Spaces
|
|
521
1009
|
|
|
522
1010
|
| Method | Type | Description |
|
|
@@ -617,6 +1105,9 @@ lattices search vox
|
|
|
617
1105
|
# Deep search — adds terminal tab/process inspection for ranking
|
|
618
1106
|
lattices search vox --deep
|
|
619
1107
|
|
|
1108
|
+
# Same as --deep (all search sources)
|
|
1109
|
+
lattices search vox --all
|
|
1110
|
+
|
|
620
1111
|
# Pipeable output
|
|
621
1112
|
lattices search vox --wid
|
|
622
1113
|
lattices search vox --json
|
|
@@ -668,7 +1159,9 @@ Target resolution priority is `wid` → `session` → `app/title` → frontmost
|
|
|
668
1159
|
**Placement strings**: `left`, `right`, `top`, `bottom`, `top-left`, `top-right`,
|
|
669
1160
|
`bottom-left`, `bottom-right`, `left-third`, `center-third`, `right-third`,
|
|
670
1161
|
`top-third`, `middle-third`, `bottom-third`, `left-quarter`, `right-quarter`,
|
|
671
|
-
`top-quarter`, `bottom-quarter`, `maximize`, `center`,
|
|
1162
|
+
`top-quarter`, `bottom-quarter`, `maximize`, `center`, `grid:CxR:C,R`, or
|
|
1163
|
+
compact `CxR:C,R`. The canonical `grid:` form is 0-indexed; the compact form is
|
|
1164
|
+
1-indexed for command entry.
|
|
672
1165
|
|
|
673
1166
|
**Typed placement examples**:
|
|
674
1167
|
|
|
@@ -1083,7 +1576,7 @@ List all discovered terminal instances with their processes, tabs, and tmux asso
|
|
|
1083
1576
|
|
|
1084
1577
|
| Field | Type | Required | Description |
|
|
1085
1578
|
|-----------|---------|----------|--------------------------------------|
|
|
1086
|
-
| `refresh` | boolean | no |
|
|
1579
|
+
| `refresh` | boolean | no | Explicitly refresh terminal-tab metadata through terminal app scripting |
|
|
1087
1580
|
|
|
1088
1581
|
**Returns**: array of terminal instance objects:
|
|
1089
1582
|
|
|
@@ -1262,7 +1755,7 @@ is available at ws://127.0.0.1:9399.
|
|
|
1262
1755
|
- Search by content: `daemonCall('windows.search', { query: 'myproject' })`
|
|
1263
1756
|
Returns windows with `matchSource` ("title", "app", "session", "ocr") and `ocrSnippet`
|
|
1264
1757
|
- Search terminals: `daemonCall('terminals.search', {})` — tabs, cwds, processes
|
|
1265
|
-
- CLI: `lattices search myproject` or `lattices search myproject --deep`
|
|
1758
|
+
- CLI: `lattices search myproject`, `lattices search myproject --deep`, or `lattices search myproject --all` (same as `--deep`)
|
|
1266
1759
|
|
|
1267
1760
|
### Actions
|
|
1268
1761
|
- Focus a window: `daemonCall('window.focus', { wid: 1234 })`
|
package/docs/app.md
CHANGED
|
@@ -170,7 +170,7 @@ Settings > Privacy & Security for all three paths to work.
|
|
|
170
170
|
|
|
171
171
|
> See [Voice Commands](/docs/voice) for the full guide.
|
|
172
172
|
|
|
173
|
-
Press **Hyper+
|
|
173
|
+
Press **Hyper+D** to open the voice command window. Hold **Option** to
|
|
174
174
|
speak, release to stop. Lattices transcribes via Vox, matches to an
|
|
175
175
|
intent, and executes. Built-in commands: find, show, open, tile, kill, scan.
|
|
176
176
|
|
|
@@ -246,8 +246,9 @@ Shows keyboard shortcut reference:
|
|
|
246
246
|
| Cmd+Shift+M | Open command palette |
|
|
247
247
|
| Hyper+1 | Screen map |
|
|
248
248
|
| Hyper+2 | Window bezel |
|
|
249
|
-
| Hyper+3 |
|
|
250
|
-
| Hyper+
|
|
249
|
+
| Hyper+3 | HUD |
|
|
250
|
+
| Hyper+D | Voice commands |
|
|
251
|
+
| Hyper+G | Desktop inventory |
|
|
251
252
|
| Hyper+5 | Omni search |
|
|
252
253
|
| Hyper+6 | Cheat sheet |
|
|
253
254
|
| Hyper+B | Hide/show persistent overlay actors |
|
|
@@ -298,7 +299,7 @@ Agents can use this to "see" what's on screen.
|
|
|
298
299
|
|
|
299
300
|
### Desktop Inventory integration
|
|
300
301
|
|
|
301
|
-
The Desktop Inventory view (Hyper+
|
|
302
|
+
The Desktop Inventory view (Hyper+G) uses OCR to make windows searchable
|
|
302
303
|
by their content — not just by title or app name. When you type a search
|
|
303
304
|
query, windows matching by OCR content show contextual snippets.
|
|
304
305
|
|