@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.
Files changed (44) hide show
  1. package/README.md +13 -4
  2. package/apps/mac/Info.plist +4 -2
  3. package/apps/mac/Lattices.app/Contents/Info.plist +4 -2
  4. package/apps/mac/Lattices.app/Contents/MacOS/Lattices +0 -0
  5. package/apps/mac/Lattices.app/Contents/Resources/docs/assistant-knowledge.md +130 -0
  6. package/apps/mac/Lattices.app/Contents/_CodeSignature/CodeResources +11 -0
  7. package/apps/mac/Lattices.entitlements +6 -0
  8. package/bin/assistant-intelligence.ts +41 -3
  9. package/bin/cli/capture.ts +252 -0
  10. package/bin/cli/daemon.ts +22 -0
  11. package/bin/cli/helpers.ts +105 -0
  12. package/bin/cli/layer.ts +178 -0
  13. package/bin/cli/runs.ts +43 -0
  14. package/bin/cli/search.ts +141 -0
  15. package/bin/cli/session.ts +32 -0
  16. package/bin/client.ts +2 -1
  17. package/bin/cua.ts +26 -0
  18. package/bin/infer.ts +22 -4
  19. package/bin/keychain.ts +75 -0
  20. package/bin/lattices-app.ts +111 -12
  21. package/bin/lattices-build-env.ts +77 -0
  22. package/bin/lattices-dev +29 -2
  23. package/bin/lattices.ts +729 -769
  24. package/docs/api.md +496 -3
  25. package/docs/app.md +5 -4
  26. package/docs/assistant-knowledge.md +130 -0
  27. package/docs/config.md +5 -0
  28. package/docs/hyperspace-grid-snappiness.md +210 -0
  29. package/docs/layers.md +53 -0
  30. package/docs/mouse-gestures.md +40 -3
  31. package/docs/ocr.md +3 -0
  32. package/docs/prompts/hands-off-system.md +9 -1
  33. package/docs/proposals/LAT-006-followup-gaps.md +103 -0
  34. package/docs/proposals/{LAT-006-mira-in-lattices.md → LAT-006-runs-and-capture-in-lattices.md} +83 -70
  35. package/docs/quickstart.md +3 -1
  36. package/docs/reference/dewey.config.ts +1 -1
  37. package/docs/release.md +4 -3
  38. package/docs/terminal-kit.md +87 -0
  39. package/docs/tiling-reference.md +5 -3
  40. package/docs/voice.md +3 -3
  41. package/package.json +27 -5
  42. package/packages/npm/sdk/cua.d.mts +1 -0
  43. package/packages/npm/sdk/cua.d.ts +188 -0
  44. 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`, or `grid:CxR:C,R`.
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 | Force-refresh the terminal tab cache |
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+3** to open the voice command window. Hold **Option** to
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 | Voice commands |
250
- | Hyper+4 | Desktop inventory |
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+4) uses OCR to make windows searchable
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