dictawhisper 0.1.10 → 0.1.11
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 +43 -2
- package/bin/dictawhisper.js +7 -3
- package/dist/apiRoutes.js +696 -0
- package/dist/classes/Queue.js +59 -0
- package/dist/classes/Watcher.js +98 -0
- package/dist/cli.js +136 -0
- package/dist/config.js +165 -0
- package/dist/dev.js +48 -0
- package/dist/doctor.js +10 -0
- package/dist/lib/activityLib.js +87 -0
- package/dist/lib/alignLib.js +120 -0
- package/dist/lib/audioLib.js +225 -0
- package/dist/lib/audioProbeLib.js +148 -0
- package/dist/lib/cleanupProvenanceLib.js +84 -0
- package/dist/lib/devChild.js +13 -0
- package/dist/lib/devPorts.js +19 -0
- package/dist/lib/downloadLib.js +7 -0
- package/dist/lib/entryBundleLib.js +385 -0
- package/dist/lib/entryIdentityLib.js +42 -0
- package/dist/lib/entryOperationLib.js +20 -0
- package/dist/lib/entryOrganizationLib.js +71 -0
- package/dist/lib/fileSettleLib.js +160 -0
- package/dist/lib/fsLib.js +47 -0
- package/dist/lib/healthLib.js +338 -0
- package/dist/lib/humanEditsLib.js +19 -0
- package/dist/lib/inboxUrl.js +134 -0
- package/dist/lib/journalEmbedLib.js +197 -0
- package/dist/lib/journalIndexLib.js +877 -0
- package/dist/lib/journalQueryLib.js +225 -0
- package/dist/lib/journalService.js +246 -0
- package/dist/lib/jsonLib.js +69 -0
- package/dist/lib/localslipGet.js +14 -0
- package/dist/lib/mayDoBackfillLib.js +35 -0
- package/dist/lib/mayDoJobLib.js +180 -0
- package/dist/lib/mayDoLib.js +76 -0
- package/dist/lib/mayDoService.js +108 -0
- package/dist/lib/ollanetLib.js +113 -0
- package/dist/lib/ollanetReadyLib.js +6 -0
- package/dist/lib/organizationLib.js +178 -0
- package/dist/lib/pathAllowLib.js +55 -0
- package/dist/lib/queueLib.js +54 -0
- package/dist/lib/settingsLib.js +22 -0
- package/dist/lib/speechCleanupLib.js +16 -0
- package/dist/lib/tagConsolidateLib.js +429 -0
- package/dist/lib/tailscaleLib.js +68 -0
- package/dist/lib/transcriptionLib.js +566 -0
- package/dist/lib/whisperLib.js +353 -0
- package/dist/mcp.js +111 -0
- package/{src/prompts/cleanTranscription.ts → dist/prompts/cleanTranscription.js} +11 -11
- package/{src/prompts/consolidateTags.ts → dist/prompts/consolidateTags.js} +6 -10
- package/dist/prompts/mayDos.js +12 -0
- package/dist/prompts/whisperInitial.js +10 -0
- package/dist/server.js +219 -0
- package/dist/shared/mayDoState.js +24 -0
- package/dist/socketEvents.js +49 -0
- package/dist/types/transcription.js +1 -0
- package/dist/ui/_app/immutable/assets/0.DxyUNkjo.css +1 -0
- package/dist/ui/_app/immutable/assets/2.O5Zbl_z2.css +1 -0
- package/dist/ui/_app/immutable/chunks/BGVbLLfK.js +33 -0
- package/dist/ui/_app/immutable/chunks/{C_GXV0ju.js → CrmyB2cJ.js} +4 -4
- package/dist/ui/_app/immutable/entry/app.DjygP6Ao.js +2 -0
- package/dist/ui/_app/immutable/entry/start.DzFn2z2S.js +1 -0
- package/dist/ui/_app/immutable/nodes/0.D9l2ObvS.js +1 -0
- package/dist/ui/_app/immutable/nodes/1.fx-33-06.js +1 -0
- package/dist/ui/_app/immutable/nodes/2.C6Z3sEFd.js +7 -0
- package/dist/ui/_app/version.json +1 -1
- package/dist/ui/index.html +9 -9
- package/package.json +10 -7
- package/dist/ui/_app/immutable/assets/0.C6M3gHo0.css +0 -1
- package/dist/ui/_app/immutable/assets/2.C96vgj_4.css +0 -1
- package/dist/ui/_app/immutable/chunks/B7P9Bdo4.js +0 -33
- package/dist/ui/_app/immutable/entry/app.BV2o_uso.js +0 -2
- package/dist/ui/_app/immutable/entry/start.BcWuD_CE.js +0 -1
- package/dist/ui/_app/immutable/nodes/0.BUULaIw9.js +0 -1
- package/dist/ui/_app/immutable/nodes/1.DRZrJlcs.js +0 -1
- package/dist/ui/_app/immutable/nodes/2.hyNF4Yup.js +0 -5
- package/src/apiRoutes.ts +0 -464
- package/src/classes/Queue.ts +0 -77
- package/src/classes/Watcher.ts +0 -118
- package/src/cli.ts +0 -132
- package/src/config.ts +0 -242
- package/src/dev.ts +0 -63
- package/src/doctor.ts +0 -12
- package/src/lib/alignLib.ts +0 -154
- package/src/lib/audioLib.ts +0 -227
- package/src/lib/audioProbeLib.ts +0 -117
- package/src/lib/cleanupProvenanceLib.ts +0 -80
- package/src/lib/downloadLib.ts +0 -8
- package/src/lib/fileSettleLib.ts +0 -213
- package/src/lib/fsLib.ts +0 -52
- package/src/lib/healthLib.ts +0 -419
- package/src/lib/inboxUrl.ts +0 -123
- package/src/lib/journalEmbedLib.ts +0 -246
- package/src/lib/journalIndexLib.ts +0 -923
- package/src/lib/journalQueryLib.ts +0 -269
- package/src/lib/journalService.ts +0 -306
- package/src/lib/jsonLib.ts +0 -71
- package/src/lib/localslipGet.ts +0 -14
- package/src/lib/ollanetLib.ts +0 -130
- package/src/lib/ollanetReadyLib.ts +0 -7
- package/src/lib/organizationLib.ts +0 -189
- package/src/lib/pathAllowLib.ts +0 -65
- package/src/lib/queueLib.ts +0 -30
- package/src/lib/speechCleanupLib.ts +0 -14
- package/src/lib/tagConsolidateLib.ts +0 -431
- package/src/lib/tailscaleLib.ts +0 -78
- package/src/lib/transcriptionLib.ts +0 -484
- package/src/lib/whisperLib.ts +0 -409
- package/src/mcp.ts +0 -152
- package/src/prompts/whisperInitial.ts +0 -11
- package/src/server.ts +0 -220
- package/src/socketEvents.ts +0 -72
- package/src/types/transcription.ts +0 -56
package/README.md
CHANGED
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
|
|
7
7
|
**A local voice journal.** Record in the browser, drop a file, or (optionally) sync a phone folder. Transcribe on your GPU with [faster-whisper](https://github.com/SYSTRAN/faster-whisper). Clean the note with [ollanet](https://ollanet.dev). The `.json` next to each recording is the journal.
|
|
8
8
|
|
|
9
|
-
Install from a Git checkout ([below](#from-a-checkout)).
|
|
9
|
+
Install from a Git checkout ([below](#from-a-checkout)). Starting with 0.1.11, the npm package ships compiled JavaScript and the inbox UI. Earlier releases through 0.1.10 do not start from npm installations. Python and faster-whisper remain separate prerequisites.
|
|
10
10
|
|
|
11
11
|
**Docs:** [dictawhisper.com/docs](https://dictawhisper.com/docs) · **Site:** [dictawhisper.com](https://dictawhisper.com)
|
|
12
12
|
|
|
13
13
|
## Before you clone
|
|
14
14
|
|
|
15
|
-
Exercised path: Windows, Node 22.
|
|
15
|
+
Exercised path: Windows, Node 22.13+ (checkout scripts use `--experimental-strip-types`), pnpm, Python with [faster-whisper](https://github.com/SYSTRAN/faster-whisper), and an NVIDIA GPU with CUDA. `ffmpeg` is required when denoise is on. macOS and Linux are unverified. CPU mode works and is slow. Cleanup via [ollanet](https://ollanet.dev) is optional.
|
|
16
16
|
|
|
17
17
|
## From a checkout
|
|
18
18
|
|
|
@@ -27,6 +27,8 @@ pnpm dev
|
|
|
27
27
|
|
|
28
28
|
Ready signal: `pnpm run doctor` exits 0, or only warnings remain. Then open [http://localhost:7777](http://localhost:7777). Point `whisper.python` at the interpreter that has CUDA Whisper. Cleanup host and model are optional; raw transcripts still work.
|
|
29
29
|
|
|
30
|
+
LocalSlip is optional. `pnpm dev` and `pnpm serve` read existing `dictawhisper` and `dictawhisper-api` claims when available; they do not create claims. Without LocalSlip, the UI uses 7777 and the API uses `http.port` (8008 by default). Startup names both endpoints and gives the UI proxy the same API port. Claim ports separately if you want named assignments.
|
|
31
|
+
|
|
30
32
|
## Quick start
|
|
31
33
|
|
|
32
34
|
```bash
|
|
@@ -40,6 +42,20 @@ Hit Record, or drag an audio file onto the page. Flags, HTTP, MCP, and `retransc
|
|
|
40
42
|
|
|
41
43
|
Files are the database. Each note is the recording plus a neighboring `.json`. The Whisper model stays loaded. Audio and transcript files stay on this computer. Cleanup sends transcript text only to the host in `ollanet.machine`, and is skipped when that is empty. Search indexing embeds note text on this computer by default; it goes to another host only if you set `journal.embedHost` (`machine`, a host name, or `any`). With no embedding model on an allowed host, or with `journal.search` set to `lex`, nothing is embedded and search matches words only; doctor says which. The inbox is loopback by default; `http.tailscale` puts the same page on your tailnet. Playback follows cleaned paragraphs using Whisper word times. If cleanup is skipped or fails, the inbox shows **raw only** or **cleanup failed**, and **Retry** is available. Transcription itself still needs faster-whisper.
|
|
42
44
|
|
|
45
|
+
## Browsing and MayDos
|
|
46
|
+
|
|
47
|
+
Select a card to read its full entry in the right pane. The entry list and detail pane scroll separately. On narrow screens, **Back to entries** returns to the cards. Hover over a transcript passage (or focus it with the keyboard) to copy its text; its timestamp still plays the audio.
|
|
48
|
+
|
|
49
|
+
Library and search results load in pages of 50. **Load more** keeps the current reading position, and reader **Next** continues onto the next page. Word searches show an exact matching count and sort the full matching set before paging. Meaning searches label their bounded ranked results; **Search words only** switches to exhaustive word matching. If results change or a ranked snapshot expires, **Refresh results** keeps the selected entry open.
|
|
50
|
+
|
|
51
|
+
HTTP callers can opt into the page contract with `GET /notes/search?page=1`: `items`, `total`, `countKind` (`exact` or `ranked`), `hasMore`, `nextCursor`, and actual `mode`. Ranked responses also include `candidateLimit` (500) and `expiresAt` (60 seconds). Pass `cursor` with the same query/filter/sort parameters to continue. Cursor errors return `invalid_cursor` (400) or `cursor_expired` (409); refresh by omitting the cursor. Without `page=1`, the legacy `{ hits, count }` response remains available; its `count` is the returned array length, not a corpus total. Existing MCP search keeps its array response.
|
|
52
|
+
|
|
53
|
+
Cleanup also extracts **MayDos**: possible actions stated in the transcript, including tentative intentions. Each starts as **Suggested** and can become **Selected**, **Done**, or **Dismissed**. Its source quote and available audio timing stay with it. Re-extraction preserves IDs and your status choices, keeping decided items even when the model omits them. Filter entries by any MayDos or a particular status.
|
|
54
|
+
|
|
55
|
+
Existing entries have an **Extract MayDos** action in their detail pane. **Tools → MayDo backfill** processes the library serially using the configured cleanup host and model. Optionally restrict it to a year. It skips entries already extracted from unchanged text unless refresh is enabled, shows progress and errors, and stops after the current entry when requested. Starting it again skips completed work. Progress is held in memory; results are saved in the sidecars.
|
|
56
|
+
|
|
57
|
+
Sidecars store a `mayDos` array (ID, title, verb, source quote, audio start/end, status, and timestamps), plus `mayDoExtraction` version, source hash, model, host, and timestamp. Failures set `mayDoError` without replacing existing actions. ExoMetaCortex synchronization is a future step.
|
|
58
|
+
|
|
43
59
|
<!-- xfacts-label -->
|
|
44
60
|
|
|
45
61
|
## xFacts label
|
|
@@ -47,11 +63,30 @@ Files are the database. Each note is the recording plus a neighboring `.json`. T
|
|
|
47
63
|
- **AppFacts:** [viewer](https://appfacts.dev/v#af1.eNpVkltr3DAQhf-KmKcWtGvyqqeASaG5lFDnrZQwK0-8imVJaMbemGX_e5H31n0Tc74ZnTnSHiYwdxoCDgQGWmcFd1vHiTJokDmV6o42ClNS35rm93fQwIIyMhhAK24i0OCdpcCFffn5diRsD2YPHkM3YleUtzlRY7NLotUjTng-v86yjQE05DGIW2z8ii2tP_k_7SPjQLuYezDQTOSFnpxo9fCVMjEvN87eha7IddNoVTcNaEAHBj6QhfLqtJZW0XsMJKDBxmEYg7MoLgYwwNH2JGsX4aChpcRg_uyhKPe8XPrJVe9KZypzcwxCoVVXcwd9xOniq4AbtH3hmPJE-QLd-jqxkjHwkoyLQVHoXKBLx9V5Qb0flF0siEo5WmIuCZzh6zJHPBP6VQlY3a595u-H2JJfBn5JylGijb7itj_1v9Sv6lxWPKYUs8Dhr4bN6HxbHjuh7bGj9wEDdpTBQAppKFlmSpGdxDyDga1IYlNVnZPtuFnbOFQ1CvqZZfUj5o5Wz891dfMVD_8Ay7foKw) · [raw](https://github.com/Catalyst-Forge-LLC/dictawhisper/blob/main/APP_FACTS.md)
|
|
48
64
|
- **ToolFacts:** [viewer](https://toolfacts.dev/v#tf1.eNrFlE1v2zAMhv-KoHM-1h2zY4YCA1JgQAfsUBSBKjG2WltyKdppEOS_76XSYB9Yz7kksfiSLx_G1NFOdnUzs8n1ZFf2a_TifraxDMTmbv3d3BNPxHZmA03UZRxDtXbiukMRc5u5IQQhKTEnhD4tbhafcVLEyVhw4LzESTVd9JSKmtx9-4Hnl5gCHno_zMvFhMckURs5WnojP8q5aJe96-YDZ0-lQCbsUhkyC2JFQsz2NLOeKRDSXVc0n-l1jDiyq4dHRKlhzUVAqKOehA9ITjlRZSsSk1O38q6XnLXOw_EymaCT2Z8nsy3k2LeKGQNtabcjLwrL5IJikEMUXrvYUcGgqNdOPcan4USyz_zy2_-djFBih_YJ_qjbD1kAZFfCI0E08pDr_O6ru5kyJmoSRMU8HQxKhjIz4hp8Zjbqrb1_MUwycipmcNIiFhwyLkKXgnGmtBimGZimSHsM8__UDclW7a7FfUsCbKRWaGXWNrzjSqbMY4qvIyKu_IPuO3KJghF6k8qs9B-CdrHItiquRLpBA7VFE5ORlsxzBobrzD4C1GesycfdM3ktes3WE-1Jv-q7uYuM37XzPOiOgQNs9W8I7mCwzA3p6yq4RezpcWbb3NPgGi3XigxltVz-Sbjwua8gsIyS6yZfdA1sxidVLC-31LzeUvPNZv1XlXqPjMljG8IZ4_QLRYvHeA) · [raw](https://github.com/Catalyst-Forge-LLC/dictawhisper/blob/main/TOOL_FACTS.md)
|
|
49
65
|
|
|
66
|
+
## Capture and Activity
|
|
67
|
+
|
|
68
|
+
Record opens the compact capture panel and requests the microphone. Stop keeps a draft in the current tab; Save recording sends it, and Discard releases it without saving. Failed saves retain playback, download, and retry. Download unsaved audio before leaving the tab if you need to keep it.
|
|
69
|
+
|
|
70
|
+
Import accepts multiple WebM, MP3, M4A, WAV, or OGG files up to 80 MiB each, with two simultaneous uploads and per-file outcomes. Saved means the server acknowledged the audio bytes; transcription and cleanup continue separately. Imports never overwrite an existing audio file or sidecar. Stable upload identities let retries reconcile an unknown previous outcome.
|
|
71
|
+
|
|
72
|
+
Activity shows actual processing stages, sync eligibility deadlines, failures with specific recovery actions, recent completions, and bulk-job progress. Open a newly saved entry there to play it before its transcript is ready. System diagnostics run when expanded or explicitly refreshed. After a server restart, unfinished work appears as Interrupted and requires explicit resume; existing transcripts remain readable. Activity history is stored in an internal `.dictawhisper/activity.json` beneath the configured index's directory. Resumable bulk backfill is tracked separately in the UX upgrade spec.
|
|
73
|
+
|
|
74
|
+
## MayDo review and backfill
|
|
75
|
+
|
|
76
|
+
The MayDos view shows entries with Suggested or Selected actions by default. Cards and reader tabs distinguish active actions from all saved actions. Open the MayDos tab to Select, Mark done, Reopen, or Restore an action; More offers every status, and Undo is available for five seconds. Source quote expands to selectable text and Copy; Play source appears only when timing is grounded.
|
|
77
|
+
|
|
78
|
+
Extract again refreshes suggestions while retaining stable IDs and selected, completed, and dismissed decisions. Out-of-date and failed extraction are explicit. Saved actions remain usable when the optional cleanup model is unavailable.
|
|
79
|
+
|
|
80
|
+
Use **MayDos → More → Extract from older entries** or **Tools** for backfill. Preview the scope and configured model, then Start. Unchanged entries are skipped by default. Activity and the MayDos view expose progress and recovery. Stop finishes the current entry; Resume continues saved scope; Retry failed processes only failures. Restarted work shows Interrupted and requires explicit Resume. Closing a panel does not stop extraction.
|
|
81
|
+
|
|
82
|
+
API clients retain `mayDoCount` and numeric `skipped` compatibility. Summaries also expose `mayDoTotalCount`, `mayDoStatusCounts`, and `skipReasons`. `POST /tools/may-dos/backfill` accepts `action: start | stop | resume | retry_failed`, plus `id` for stale-job protection; Start accepts `year` and `refresh`. `GET /notes/may-dos/capabilities` reports configuration availability without calling the model.
|
|
83
|
+
|
|
50
84
|
## Development
|
|
51
85
|
|
|
52
86
|
```bash
|
|
53
87
|
pnpm test
|
|
54
88
|
pnpm typecheck
|
|
89
|
+
pnpm build # compiled runtime and packaged inbox
|
|
55
90
|
pnpm site:dev
|
|
56
91
|
```
|
|
57
92
|
|
|
@@ -62,3 +97,9 @@ Site (FilePress + docs mount): `pnpm --dir site ship`
|
|
|
62
97
|
MIT · [Catalyst Forge LLC](https://www.catalystforge.com)
|
|
63
98
|
|
|
64
99
|
[See the rest of the Catalyst Forge shelf.](https://catalystforge.com/tools/)
|
|
100
|
+
|
|
101
|
+
## Recovery and effective settings
|
|
102
|
+
|
|
103
|
+
Reader More → Move to Trash waits for a verified whole-entry bundle receipt, then offers eight-second Undo. Settings → Data and maintenance restores later; collisions keep both. Replacement requires a preview and saves the existing bundle in Trash. Assign recording date moves all variants together and records confirmed date provenance. New entries and edits receive stable IDs; explicit legacy backfill is available in maintenance.
|
|
104
|
+
|
|
105
|
+
Settings shows effective folders, models, processing destinations, search coverage, and MCP configuration. Configuration is read-only here: edit the loaded file and restart. Maintenance includes scoped MayDo extraction, reviewed cleanup retries, tag merge preview/apply, and check-only audio scanning with separate reviewed marking. Help follows search, reading/listening, capture, MayDos, and recovery tasks. On small screens access Help through Settings. No ExoMetaCortex synchronization is active.
|
package/bin/dictawhisper.js
CHANGED
|
@@ -4,10 +4,14 @@ import path from 'node:path';
|
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
5
|
|
|
6
6
|
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
7
|
-
const cli = path.join(root, '
|
|
8
|
-
const child = spawn(process.execPath, [
|
|
7
|
+
const cli = path.join(root, 'dist', 'cli.js');
|
|
8
|
+
const child = spawn(process.execPath, [cli, ...process.argv.slice(2)], {
|
|
9
9
|
stdio: 'inherit',
|
|
10
|
-
windowsHide:
|
|
10
|
+
windowsHide: true,
|
|
11
|
+
});
|
|
12
|
+
child.on('error', (error) => {
|
|
13
|
+
console.error(`Could not start DictaWhisper: ${error.message}`);
|
|
14
|
+
process.exitCode = 1;
|
|
11
15
|
});
|
|
12
16
|
child.on('exit', (code) => {
|
|
13
17
|
process.exit(code ?? 1);
|