chartremotely 0.2.12__tar.gz → 0.2.14__tar.gz

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 (64) hide show
  1. {chartremotely-0.2.12 → chartremotely-0.2.14}/PKG-INFO +42 -8
  2. {chartremotely-0.2.12 → chartremotely-0.2.14}/README.md +40 -7
  3. chartremotely-0.2.12/chartremotely/assets/shortcut-template.plist → chartremotely-0.2.14/chartremotely/assets/shortcut.plist +378 -782
  4. chartremotely-0.2.14/chartremotely/displays.py +129 -0
  5. chartremotely-0.2.14/chartremotely/hearing.py +261 -0
  6. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/requestlog.py +12 -0
  7. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/server.py +66 -4
  8. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/setup.py +26 -6
  9. chartremotely-0.2.14/chartremotely/shortcut.py +102 -0
  10. chartremotely-0.2.14/chartremotely/voice.py +174 -0
  11. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely.egg-info/PKG-INFO +42 -8
  12. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely.egg-info/SOURCES.txt +7 -2
  13. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely.egg-info/requires.txt +3 -0
  14. {chartremotely-0.2.12 → chartremotely-0.2.14}/pyproject.toml +4 -1
  15. chartremotely-0.2.14/tests/test_hearing.py +306 -0
  16. {chartremotely-0.2.12 → chartremotely-0.2.14}/tests/test_patron.py +1 -15
  17. {chartremotely-0.2.12 → chartremotely-0.2.14}/tests/test_relay.py +4 -2
  18. {chartremotely-0.2.12 → chartremotely-0.2.14}/tests/test_setup.py +69 -20
  19. chartremotely-0.2.14/tests/test_voice.py +282 -0
  20. chartremotely-0.2.12/chartremotely/shortcut.py +0 -56
  21. {chartremotely-0.2.12 → chartremotely-0.2.14}/LICENSE +0 -0
  22. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/__init__.py +0 -0
  23. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/answer.py +0 -0
  24. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/ax.py +0 -0
  25. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/cli.py +0 -0
  26. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/config.py +0 -0
  27. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/doctor.py +0 -0
  28. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/guilock.py +0 -0
  29. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/keystore.py +0 -0
  30. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/layout.py +0 -0
  31. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/mcpclient.py +0 -0
  32. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/patron.py +0 -0
  33. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/popups.py +0 -0
  34. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/push.py +0 -0
  35. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/recent.py +0 -0
  36. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/registry.py +0 -0
  37. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/relay.py +0 -0
  38. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/resolve.py +0 -0
  39. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/scales.py +0 -0
  40. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/screen.py +0 -0
  41. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/services.py +0 -0
  42. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/snapshot.py +0 -0
  43. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/studies.py +0 -0
  44. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/symbol.py +0 -0
  45. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/tailnet.py +0 -0
  46. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/timeframe.py +0 -0
  47. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/understand.py +0 -0
  48. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/vocab.py +0 -0
  49. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely/window.py +0 -0
  50. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely.egg-info/dependency_links.txt +0 -0
  51. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely.egg-info/entry_points.txt +0 -0
  52. {chartremotely-0.2.12 → chartremotely-0.2.14}/chartremotely.egg-info/top_level.txt +0 -0
  53. {chartremotely-0.2.12 → chartremotely-0.2.14}/setup.cfg +0 -0
  54. {chartremotely-0.2.12 → chartremotely-0.2.14}/tests/test_popups.py +0 -0
  55. {chartremotely-0.2.12 → chartremotely-0.2.14}/tests/test_push.py +0 -0
  56. {chartremotely-0.2.12 → chartremotely-0.2.14}/tests/test_recent.py +0 -0
  57. {chartremotely-0.2.12 → chartremotely-0.2.14}/tests/test_requestlog.py +0 -0
  58. {chartremotely-0.2.12 → chartremotely-0.2.14}/tests/test_resolve.py +0 -0
  59. {chartremotely-0.2.12 → chartremotely-0.2.14}/tests/test_scales.py +0 -0
  60. {chartremotely-0.2.12 → chartremotely-0.2.14}/tests/test_screen.py +0 -0
  61. {chartremotely-0.2.12 → chartremotely-0.2.14}/tests/test_snapshot.py +0 -0
  62. {chartremotely-0.2.12 → chartremotely-0.2.14}/tests/test_stamp_changelog.py +0 -0
  63. {chartremotely-0.2.12 → chartremotely-0.2.14}/tests/test_timeframe.py +0 -0
  64. {chartremotely-0.2.12 → chartremotely-0.2.14}/tests/test_understand.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chartremotely
3
- Version: 0.2.12
3
+ Version: 0.2.14
4
4
  Summary: Remote control of desktop charting applications on macOS
5
5
  Author: Lonnie VanZandt
6
6
  License:
@@ -215,6 +215,7 @@ Requires-Dist: pyobjc-framework-ApplicationServices>=10; extra == "macos"
215
215
  Requires-Dist: pyobjc-framework-Cocoa>=10; extra == "macos"
216
216
  Requires-Dist: pyobjc-framework-Quartz>=10; extra == "macos"
217
217
  Requires-Dist: pyobjc-framework-Security>=10; extra == "macos"
218
+ Requires-Dist: mlx-whisper>=0.4.3; (sys_platform == "darwin" and platform_machine == "arm64") and extra == "macos"
218
219
  Provides-Extra: setup
219
220
  Requires-Dist: tollbooth-dpyc[nostr]==0.90.0; extra == "setup"
220
221
  Provides-Extra: dev
@@ -315,11 +316,40 @@ ignores everything sent to it.
315
316
 
316
317
  ## Voice
317
318
 
318
- "Hey Siri, ChartRemotely" asks three questions:
319
-
320
- 1. **Which company?** — a spoken name or a spelled ticker.
321
- 2. **What scale?** — a time frame mnemonic (below), or "as is".
322
- 3. **Where?** — which display. Leave it blank to stay on this Mac.
319
+ "Hey Siri, ChartRemotely", then **one sentence**:
320
+
321
+ > "Palantir, half, on mac mini." · "Shopify thirty minutes." · "Nvidia daily." · "GE hourly on the studio."
322
+
323
+ Say the company, the scale, and - if it is not this Mac - "on" the display.
324
+ The Shortcut records for about six seconds (tap to finish sooner where your
325
+ device offers it) and sends the recording to the Mac that made it. That Mac
326
+ hears it with **Whisper, running locally** on its own GPU (`mlx-whisper`,
327
+ Apple silicon only) - nothing is sent to Apple or anyone else to transcribe -
328
+ primed with the words it expects: the ten scale mnemonics, bar phrases like
329
+ "thirty minutes", the companies you chart lately and the names of your
330
+ displays. The recording is deleted as soon as it is heard; only the text is
331
+ logged.
332
+
333
+ If something is missing or unclear you are asked, and the Shortcut listens
334
+ again (up to three times), keeping what it already understood: "I heard
335
+ Nvidia but no scale. Say the scale, like half or daily. I'm listening." -
336
+ "Daily." Or "Did you mean PS (Pershing Square) or MSGS (Madison Square
337
+ Garden)? Say the one you meant. I'm listening."
338
+
339
+ **First run.** `chartremotely setup` fetches the speech model,
340
+ `whisper-large-v3-turbo` (about 1.6 GB, once, from Hugging Face). The
341
+ listener loads it when it starts, so a sentence takes about a second to hear.
342
+ Setup also learns your display names (the free `chart_agent_status`, asked at
343
+ most every four hours) so "on the studio" is understood.
344
+
345
+ **One Shortcut: talk, or type when it asks.** When the recording has
346
+ nothing in it - no microphone, silence, noise, or a Mac that cannot hear yet
347
+ - "ChartRemotely" shows one text box instead: *Type your request, e.g.
348
+ Palantir half on mac mini*. Type the same sentence and press Return; it is
349
+ understood the same way and costs the same. If something is missing, the box
350
+ comes back with the question ("I heard Nvidia but no scale. Type the scale,
351
+ like half or daily."). On a Mac the Shortcut goes straight to the box: Record
352
+ Audio waits forever on a Mac without a microphone, and a Mac has a keyboard.
323
353
 
324
354
  The Shortcut talks to one Mac — the one that made it. That Mac looks up the
325
355
  company and the scale itself (free: a table, never the chart), then acts as
@@ -355,7 +385,8 @@ Palantir; "shop if y" is Shopify); when two companies are too close to call
355
385
  you are asked - "Did you mean PS (Pershing Square) or MSGS (Madison Square
356
386
  Garden)?" - rather than shown the wrong chart, and the symbols you chart
357
387
  lately settle a near-tie. `understand()` parses a whole sentence the same way
358
- ("Palantir half on the mini").
388
+ ("Palantir half on the mini") - that is what the ChartRemotely Shortcut
389
+ uses on the sentence Whisper heard.
359
390
 
360
391
  Each command handled is logged as one line — time, the command's first word,
361
392
  the "Where?" as said, what was heard for a company or scale lookup, and the
@@ -397,7 +428,10 @@ and runs `chartremotely setup`, which:
397
428
  3. gives the Mac its tailnet address with `tailscale serve`;
398
429
  4. installs the listener and the relay as launchd agents;
399
430
  5. asks macOS for Accessibility and Screen Recording for the Python that runs them;
400
- 6. makes this Mac's ChartRemotely voice Shortcut and opens it for import.
431
+ 6. fetches the Whisper speech model (about 1.6 GB, once) and your display names;
432
+ 7. makes this Mac's Shortcut, "ChartRemotely" (talk, or type when it asks),
433
+ opens it for import, and removes a "ChartRemotely Ask" an older setup left
434
+ in your library.
401
435
 
402
436
  Run it again at any time: finished steps are skipped. `chartremotely doctor`
403
437
  reports anything still missing.
@@ -91,11 +91,40 @@ ignores everything sent to it.
91
91
 
92
92
  ## Voice
93
93
 
94
- "Hey Siri, ChartRemotely" asks three questions:
95
-
96
- 1. **Which company?** — a spoken name or a spelled ticker.
97
- 2. **What scale?** — a time frame mnemonic (below), or "as is".
98
- 3. **Where?** — which display. Leave it blank to stay on this Mac.
94
+ "Hey Siri, ChartRemotely", then **one sentence**:
95
+
96
+ > "Palantir, half, on mac mini." · "Shopify thirty minutes." · "Nvidia daily." · "GE hourly on the studio."
97
+
98
+ Say the company, the scale, and - if it is not this Mac - "on" the display.
99
+ The Shortcut records for about six seconds (tap to finish sooner where your
100
+ device offers it) and sends the recording to the Mac that made it. That Mac
101
+ hears it with **Whisper, running locally** on its own GPU (`mlx-whisper`,
102
+ Apple silicon only) - nothing is sent to Apple or anyone else to transcribe -
103
+ primed with the words it expects: the ten scale mnemonics, bar phrases like
104
+ "thirty minutes", the companies you chart lately and the names of your
105
+ displays. The recording is deleted as soon as it is heard; only the text is
106
+ logged.
107
+
108
+ If something is missing or unclear you are asked, and the Shortcut listens
109
+ again (up to three times), keeping what it already understood: "I heard
110
+ Nvidia but no scale. Say the scale, like half or daily. I'm listening." -
111
+ "Daily." Or "Did you mean PS (Pershing Square) or MSGS (Madison Square
112
+ Garden)? Say the one you meant. I'm listening."
113
+
114
+ **First run.** `chartremotely setup` fetches the speech model,
115
+ `whisper-large-v3-turbo` (about 1.6 GB, once, from Hugging Face). The
116
+ listener loads it when it starts, so a sentence takes about a second to hear.
117
+ Setup also learns your display names (the free `chart_agent_status`, asked at
118
+ most every four hours) so "on the studio" is understood.
119
+
120
+ **One Shortcut: talk, or type when it asks.** When the recording has
121
+ nothing in it - no microphone, silence, noise, or a Mac that cannot hear yet
122
+ - "ChartRemotely" shows one text box instead: *Type your request, e.g.
123
+ Palantir half on mac mini*. Type the same sentence and press Return; it is
124
+ understood the same way and costs the same. If something is missing, the box
125
+ comes back with the question ("I heard Nvidia but no scale. Type the scale,
126
+ like half or daily."). On a Mac the Shortcut goes straight to the box: Record
127
+ Audio waits forever on a Mac without a microphone, and a Mac has a keyboard.
99
128
 
100
129
  The Shortcut talks to one Mac — the one that made it. That Mac looks up the
101
130
  company and the scale itself (free: a table, never the chart), then acts as
@@ -131,7 +160,8 @@ Palantir; "shop if y" is Shopify); when two companies are too close to call
131
160
  you are asked - "Did you mean PS (Pershing Square) or MSGS (Madison Square
132
161
  Garden)?" - rather than shown the wrong chart, and the symbols you chart
133
162
  lately settle a near-tie. `understand()` parses a whole sentence the same way
134
- ("Palantir half on the mini").
163
+ ("Palantir half on the mini") - that is what the ChartRemotely Shortcut
164
+ uses on the sentence Whisper heard.
135
165
 
136
166
  Each command handled is logged as one line — time, the command's first word,
137
167
  the "Where?" as said, what was heard for a company or scale lookup, and the
@@ -173,7 +203,10 @@ and runs `chartremotely setup`, which:
173
203
  3. gives the Mac its tailnet address with `tailscale serve`;
174
204
  4. installs the listener and the relay as launchd agents;
175
205
  5. asks macOS for Accessibility and Screen Recording for the Python that runs them;
176
- 6. makes this Mac's ChartRemotely voice Shortcut and opens it for import.
206
+ 6. fetches the Whisper speech model (about 1.6 GB, once) and your display names;
207
+ 7. makes this Mac's Shortcut, "ChartRemotely" (talk, or type when it asks),
208
+ opens it for import, and removes a "ChartRemotely Ask" an older setup left
209
+ in your library.
177
210
 
178
211
  Run it again at any time: finished steps are skipped. `chartremotely doctor`
179
212
  reports anything still missing.