@dualityinstitute/blink 0.0.3 → 0.0.4
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 +16 -11
- package/dist/cli.js +15 -6
- package/dist/electron/main.js +865 -529
- package/dist/electron/preload.cjs +31 -0
- package/dist/electron/renderer/popup.css +125 -15
- package/dist/electron/renderer/popup.html +17 -3
- package/dist/electron/renderer/popup.js +121 -42
- package/dist/electron/renderer/settings.css +439 -0
- package/dist/electron/renderer/settings.html +93 -0
- package/dist/electron/renderer/settings.js +4067 -0
- package/package.json +2 -2
- package/vendor/Blink.app/Contents/Helpers/BlinkAudio +0 -0
- package/vendor/Blink.app/Contents/MacOS/Blink +0 -0
- package/vendor/Blink.app/Contents/_CodeSignature/CodeResources +2 -2
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ credentials on the Mac.
|
|
|
24
24
|
## Install
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
|
-
bunx @dualityinstitute/blink install
|
|
27
|
+
bunx @dualityinstitute/blink@latest install
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
The terminal UI asks for the access token, writes `~/.blink/config.json`, and
|
|
@@ -34,7 +34,7 @@ at its default URL, so only the token is needed.
|
|
|
34
34
|
For non-interactive installation:
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
bunx @dualityinstitute/blink install --token blink_customer_token
|
|
37
|
+
bunx @dualityinstitute/blink@latest install --token blink_customer_token
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
Pass `--api-url` as well to point the app at a different gateway, such as a
|
|
@@ -72,7 +72,9 @@ the signed **Blink** app identity.
|
|
|
72
72
|
|
|
73
73
|
Enable **Meeting** in the tray or popup. Blink starts a new identity-scoped
|
|
74
74
|
Meeting conversation, captures system audio as `Them` and microphone audio as
|
|
75
|
-
`You`, and keeps a rolling two-minute transcript
|
|
75
|
+
`You`, and keeps a rolling two-minute transcript for the model. The popup widens
|
|
76
|
+
to show the full running transcript beside the answer; scroll back at any point
|
|
77
|
+
and it stops following new speech until you return to the bottom. Captures made with the
|
|
76
78
|
global shortcuts are retained in a private staging directory. The popup shows
|
|
77
79
|
which transcript and screenshot context is ready.
|
|
78
80
|
|
|
@@ -89,15 +91,18 @@ Run `blink ungrant` to clear both permission records and make macOS ask again.
|
|
|
89
91
|
|
|
90
92
|
### Saving transcripts
|
|
91
93
|
|
|
92
|
-
|
|
93
|
-
appended to a Markdown file under:
|
|
94
|
+
Every Meeting is appended to a Markdown file on your Mac, one per session:
|
|
94
95
|
|
|
95
96
|
```text
|
|
96
97
|
~/.blink/transcripts/2026-08-30-143022.md
|
|
97
98
|
```
|
|
98
99
|
|
|
99
|
-
|
|
100
|
-
two-minute transcript snapshot when one is available.
|
|
100
|
+
Saving is local only and independent from submission: Ask always sends the
|
|
101
|
+
current two-minute transcript snapshot when one is available, no more.
|
|
102
|
+
|
|
103
|
+
Open **Meeting Transcripts…** from the tray to read, search, and filter past
|
|
104
|
+
sessions by date. Search runs across every saved transcript and reports how many
|
|
105
|
+
times each session matched.
|
|
101
106
|
|
|
102
107
|
## Answer lifecycle and cancellation
|
|
103
108
|
|
|
@@ -110,7 +115,7 @@ two-minute transcript snapshot when one is available.
|
|
|
110
115
|
|
|
111
116
|
Subscribe at [duality.institute/blink](https://duality.institute/blink). After
|
|
112
117
|
Stripe Checkout the claim page shows your access token exactly once; paste it
|
|
113
|
-
into `bunx @dualityinstitute/blink install`.
|
|
118
|
+
into `bunx @dualityinstitute/blink@latest install`.
|
|
114
119
|
|
|
115
120
|
Every Monitor screenshot and every Meeting Ask counts as one answer against
|
|
116
121
|
your monthly limit. The popup shows `used / limit` for the current period, and
|
|
@@ -136,7 +141,8 @@ Blink Cloud receives:
|
|
|
136
141
|
- The bearer access token needed to authorize and isolate the request
|
|
137
142
|
|
|
138
143
|
The desktop stores the access token in `~/.blink/config.json`. Answer metadata
|
|
139
|
-
and text are appended locally to `~/.blink/answers.jsonl
|
|
144
|
+
and text are appended locally to `~/.blink/answers.jsonl`, and meeting
|
|
145
|
+
transcripts to `~/.blink/transcripts/`. Presenter Notes stay
|
|
140
146
|
local in `~/.blink/presenter.md` and are never submitted. Meeting captures are
|
|
141
147
|
staged under `~/.blink/meeting-captures/` and cleared when Meeting ends.
|
|
142
148
|
|
|
@@ -153,8 +159,7 @@ and token totals are kept for billing.
|
|
|
153
159
|
| `accessToken` | Empty | Bearer token issued for Blink Cloud |
|
|
154
160
|
| `screenshotDir` | `~/blinkDir/` | Watched PNG directory |
|
|
155
161
|
| `hideFromCapture` | `true` | Enables privacy mode |
|
|
156
|
-
| `showTranscript` | `true` | Shows the live transcript
|
|
157
|
-
| `saveTranscript` | `false` | Saves full meeting transcripts locally |
|
|
162
|
+
| `showTranscript` | `true` | Shows the live transcript panel during a meeting |
|
|
158
163
|
|
|
159
164
|
Blink materializes new defaults without deleting unrelated settings from an
|
|
160
165
|
existing config file. The obsolete `sessionMode` and `hotkeyPreset` keys are
|
package/dist/cli.js
CHANGED
|
@@ -19862,14 +19862,17 @@ function date4(params) {
|
|
|
19862
19862
|
return _coercedDate(ZodDate, params);
|
|
19863
19863
|
}
|
|
19864
19864
|
// src/core/cloud-protocol.ts
|
|
19865
|
+
var OptionalPrompt = exports_external.preprocess((value) => value === null || value === "" ? undefined : value, exports_external.string().trim().min(1).max(4000).optional());
|
|
19865
19866
|
var MonitorRequestSchema = exports_external.object({
|
|
19866
19867
|
kind: exports_external.literal("monitor"),
|
|
19867
|
-
image: exports_external.instanceof(File)
|
|
19868
|
+
image: exports_external.instanceof(File),
|
|
19869
|
+
prompt: OptionalPrompt
|
|
19868
19870
|
});
|
|
19869
19871
|
var MeetingRequestSchema = exports_external.object({
|
|
19870
19872
|
kind: exports_external.literal("meeting"),
|
|
19871
19873
|
text: exports_external.preprocess((value) => value === null ? undefined : value, exports_external.string().trim().min(1).optional()),
|
|
19872
|
-
images: exports_external.array(exports_external.instanceof(File)).readonly()
|
|
19874
|
+
images: exports_external.array(exports_external.instanceof(File)).readonly(),
|
|
19875
|
+
prompt: OptionalPrompt
|
|
19873
19876
|
});
|
|
19874
19877
|
var CloudAnswerRequestSchema = exports_external.discriminatedUnion("kind", [MonitorRequestSchema, MeetingRequestSchema]).superRefine((request, context) => {
|
|
19875
19878
|
if (request.kind === "meeting" && request.text === undefined && request.images.length === 0) {
|
|
@@ -19962,9 +19965,10 @@ var DEFAULTS = {
|
|
|
19962
19965
|
accessToken: "",
|
|
19963
19966
|
hideFromCapture: true,
|
|
19964
19967
|
showTranscript: true,
|
|
19965
|
-
|
|
19968
|
+
monitorPrompt: "",
|
|
19969
|
+
meetingPrompt: ""
|
|
19966
19970
|
};
|
|
19967
|
-
var OBSOLETE_KEYS = ["sessionMode", "hotkeyPreset"];
|
|
19971
|
+
var OBSOLETE_KEYS = ["sessionMode", "hotkeyPreset", "saveTranscript"];
|
|
19968
19972
|
var RawConfigSchema = exports_external.record(exports_external.string(), exports_external.unknown());
|
|
19969
19973
|
var HttpUrlSchema = exports_external.url().refine((value) => {
|
|
19970
19974
|
const protocol = new URL(value).protocol;
|
|
@@ -20048,8 +20052,13 @@ function loadConfig() {
|
|
|
20048
20052
|
if (user["showTranscript"] !== undefined) {
|
|
20049
20053
|
merged.showTranscript = user["showTranscript"] === true;
|
|
20050
20054
|
}
|
|
20051
|
-
|
|
20052
|
-
|
|
20055
|
+
for (const key of ["monitorPrompt", "meetingPrompt"]) {
|
|
20056
|
+
if (user[key] === undefined)
|
|
20057
|
+
continue;
|
|
20058
|
+
const prompt = exports_external.string().safeParse(user[key]);
|
|
20059
|
+
if (!prompt.success)
|
|
20060
|
+
throw new ConfigFileError(`${key} must be a string`);
|
|
20061
|
+
merged[key] = prompt.data.trim();
|
|
20053
20062
|
}
|
|
20054
20063
|
const missing = Object.keys(merged).filter((key) => !(key in persisted));
|
|
20055
20064
|
if (missing.length > 0 || hadObsolete) {
|