draken 0.2.0 → 0.4.0
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/ACCEPTANCE.md +6 -3
- package/CHANGELOG.md +64 -0
- package/CONTRIBUTING.md +1 -1
- package/MEMORY.md +30 -8
- package/README.md +25 -9
- package/SETUP.md +2 -2
- package/SOURCES.md +1 -1
- package/VOICE.md +11 -3
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +6 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/memory/automatic.d.ts +12 -6
- package/dist/memory/automatic.d.ts.map +1 -1
- package/dist/memory/automatic.js +65 -21
- package/dist/memory/automatic.js.map +1 -1
- package/dist/memory/context.d.ts +4 -4
- package/dist/memory/context.d.ts.map +1 -1
- package/dist/memory/context.js +64 -16
- package/dist/memory/context.js.map +1 -1
- package/dist/memory/embedding-pool.d.ts +1 -1
- package/dist/memory/embedding-pool.d.ts.map +1 -1
- package/dist/memory/embedding-pool.js +1 -1
- package/dist/memory/embedding-pool.js.map +1 -1
- package/dist/memory/index.d.ts +8 -2
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +195 -37
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/model-files.d.ts +9 -0
- package/dist/memory/model-files.d.ts.map +1 -0
- package/dist/memory/model-files.js +13 -0
- package/dist/memory/model-files.js.map +1 -0
- package/dist/memory/model.d.ts +1 -1
- package/dist/memory/model.d.ts.map +1 -1
- package/dist/memory/model.js +11 -16
- package/dist/memory/model.js.map +1 -1
- package/dist/memory/readiness.d.ts +16 -0
- package/dist/memory/readiness.d.ts.map +1 -0
- package/dist/memory/readiness.js +131 -0
- package/dist/memory/readiness.js.map +1 -0
- package/dist/memory/reconcile.d.ts +11 -0
- package/dist/memory/reconcile.d.ts.map +1 -0
- package/dist/memory/reconcile.js +132 -0
- package/dist/memory/reconcile.js.map +1 -0
- package/dist/memory/service.d.ts +4 -2
- package/dist/memory/service.d.ts.map +1 -1
- package/dist/memory/service.js +34 -8
- package/dist/memory/service.js.map +1 -1
- package/dist/memory/sources.d.ts +2 -2
- package/dist/memory/sources.d.ts.map +1 -1
- package/dist/memory/sources.js +12 -5
- package/dist/memory/sources.js.map +1 -1
- package/dist/memory/storage.d.ts.map +1 -1
- package/dist/memory/storage.js +9 -0
- package/dist/memory/storage.js.map +1 -1
- package/dist/memory/types.d.ts +22 -1
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js.map +1 -1
- package/dist/memory/worker.js +4 -2
- package/dist/memory/worker.js.map +1 -1
- package/dist/routes/live-voice.d.ts.map +1 -1
- package/dist/routes/live-voice.js +7 -1
- package/dist/routes/live-voice.js.map +1 -1
- package/dist/routes/memory.d.ts.map +1 -1
- package/dist/routes/memory.js +12 -2
- package/dist/routes/memory.js.map +1 -1
- package/dist/routes/sync.d.ts.map +1 -1
- package/dist/routes/sync.js +44 -10
- package/dist/routes/sync.js.map +1 -1
- package/dist/sync/answer-references.d.ts +10 -0
- package/dist/sync/answer-references.d.ts.map +1 -0
- package/dist/sync/answer-references.js +47 -0
- package/dist/sync/answer-references.js.map +1 -0
- package/dist/sync/automatic.d.ts +7 -0
- package/dist/sync/automatic.d.ts.map +1 -0
- package/dist/sync/automatic.js +56 -0
- package/dist/sync/automatic.js.map +1 -0
- package/dist/sync/collector.d.ts +1 -1
- package/dist/sync/collector.d.ts.map +1 -1
- package/dist/sync/collector.js +109 -69
- package/dist/sync/collector.js.map +1 -1
- package/dist/sync/cost.d.ts +2 -1
- package/dist/sync/cost.d.ts.map +1 -1
- package/dist/sync/cost.js +10 -6
- package/dist/sync/cost.js.map +1 -1
- package/dist/sync/manager.d.ts +7 -1
- package/dist/sync/manager.d.ts.map +1 -1
- package/dist/sync/manager.js +104 -19
- package/dist/sync/manager.js.map +1 -1
- package/dist/sync/reconciliation.d.ts +16 -0
- package/dist/sync/reconciliation.d.ts.map +1 -0
- package/dist/sync/reconciliation.js +22 -0
- package/dist/sync/reconciliation.js.map +1 -0
- package/dist/sync/store.d.ts +8 -1
- package/dist/sync/store.d.ts.map +1 -1
- package/dist/sync/store.js +51 -5
- package/dist/sync/store.js.map +1 -1
- package/dist/sync/tree.d.ts.map +1 -1
- package/dist/sync/tree.js +13 -7
- package/dist/sync/tree.js.map +1 -1
- package/dist/sync/usage.d.ts +6 -0
- package/dist/sync/usage.d.ts.map +1 -0
- package/dist/sync/usage.js +91 -0
- package/dist/sync/usage.js.map +1 -0
- package/dist/types.d.ts +46 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/voice/continuation.d.ts.map +1 -1
- package/dist/voice/continuation.js +1 -0
- package/dist/voice/continuation.js.map +1 -1
- package/dist/voice/history-focus.d.ts +14 -0
- package/dist/voice/history-focus.d.ts.map +1 -0
- package/dist/voice/history-focus.js +39 -0
- package/dist/voice/history-focus.js.map +1 -0
- package/dist/voice/live-context.d.ts +1 -1
- package/dist/voice/live-context.d.ts.map +1 -1
- package/dist/voice/live-context.js +3 -3
- package/dist/voice/live-context.js.map +1 -1
- package/dist/voice/live.d.ts.map +1 -1
- package/dist/voice/live.js +47 -33
- package/dist/voice/live.js.map +1 -1
- package/dist/voice/preparation.d.ts +8 -0
- package/dist/voice/preparation.d.ts.map +1 -0
- package/dist/voice/preparation.js +59 -0
- package/dist/voice/preparation.js.map +1 -0
- package/package.json +1 -1
- package/public/assets/index-BCDcSZkB.css +1 -0
- package/public/assets/index-SXgKBqZw.js +131 -0
- package/public/assets/{persona-XbLvCqRT.js → persona-BgbqhiLa.js} +1 -1
- package/public/index.html +3 -3
- package/public/persona/chat-avatar.webp +0 -0
- package/public/persona.html +3 -3
- package/voice/realtime/native.mjs +1 -1
- package/public/assets/index-CYz_kpAp.js +0 -126
- package/public/assets/index-DmRid5xE.css +0 -1
- /package/public/assets/{index-Ymd62i3g.js → index-S46UUaj8.js} +0 -0
package/ACCEPTANCE.md
CHANGED
|
@@ -15,10 +15,13 @@ The release workflow requires a strict stable version already committed consiste
|
|
|
15
15
|
Use disposable histories first. Real-provider checks below require the operator's explicit sign-in and consent.
|
|
16
16
|
|
|
17
17
|
- [ ] **Useful, qualified briefing:** distinguish what was proposed, attempted, tested, deployed, and still unresolved. Inspect original evidence and a late correction; verify the summary preserves chronology and qualifications rather than sounding more certain.
|
|
18
|
-
- [ ] **Explicit permissions:** Codex/Claude imports stay off until independently enabled. Opening Settings/setup/status does not scan transcript bodies, prepare a snapshot, download an embedding model, call a provider, or request a microphone.
|
|
19
|
-
- [ ] **
|
|
18
|
+
- [ ] **Explicit permissions:** Codex/Claude imports stay off until independently enabled. Opening Settings/setup/status does not scan transcript bodies, prepare a snapshot, download an embedding model, call a provider, or request a microphone. The single indexing-and-briefing permission is separate from agent-source permission; legacy local-only opt-in alone cannot start paid preparation.
|
|
19
|
+
- [ ] **Automatic preparation and restart:** an already indexed backlog of 64 waiting entries still gets a briefing. Smaller new tails wait unless a 64-source-change batch is due; unfinished owned preparation resumes from cache. Session bookkeeping and aliases do not multiply the change count. Joining an unchanged ready batch makes no new briefing call. Foreground tails get a new immutable snapshot. Model failure pauses paid retries until an explicit action, including across restart. Review and notes remain untouched.
|
|
20
20
|
- [ ] **Evidence availability:** removing/changing a frozen original fails visibly; no cached-source fallback invents availability. Notes/discussion remain inspectable. Restore the exact original and verify recovery without regenerated evidence or review.
|
|
21
|
-
- [ ] **
|
|
21
|
+
- [ ] **Import completeness:** a source larger than 32 MiB reaches its captured tail before a new snapshot or call readiness. Cancellation retains committed chunks without marking a partial import complete; retry resumes. An unfinished final record is deferred; an oversized or unreadable record blocks preparation. Later appends do not cause an endless chase.
|
|
22
|
+
- [ ] **Useful retrieval:** replay project-status and follow-up questions with older identical user questions and acknowledgements present. Confirm original project evidence, latest recorded work, technical definitions and concrete remaining work—not just source IDs. Include duplicate passages, ambiguous topics, project switches, explicit conversation recall, source readback and per-turn source lists. Passing transport tests alone is insufficient.
|
|
23
|
+
- [ ] **Call readiness:** a complete briefing with unfinished history keeps Call disabled. Prepare or cancel history on the sync page, with no call reservation or microphone. A 64-record background batch can establish readiness; a smaller pending tail cannot silently flush inside call setup. Retry/restart reuses completed work. Changed/missing sources invalidate readiness, and original bytes still require verification.
|
|
24
|
+
- [ ] **Call lifecycle:** cancel history preparation before a call; separately cancel connection before the create response arrives. Reload and start again. Microphone acquisition stays after preparation and explicit intent. End/Stop/mute/hidden-page behavior is understandable; no call restarts itself.
|
|
22
25
|
- [ ] **Review is yours:** included/retrieved/summarized/generated/heard/agreed/reviewed are not interchangeable. Only explicit review advances coverage. Discard, failure, cancellation and app restart do not mark work reviewed.
|
|
23
26
|
- [ ] **Real account and audio, separately:** configuration metadata alone does not prove provider/model access, token refresh, quota, billing or audible playback. If desired, test each explicitly with the intended account/device/browser; do not infer them from CI.
|
|
24
27
|
- [ ] **Physical desktop tray:** on actual macOS and Windows desktops, check icon visibility, all menu actions, browser opening, close-terminal survival, external-server observation, owned Stop/Quit and helper loss. No saved-PID adoption, external-server termination, silent settings changes or second same-data listener. Hosted helper smoke is not this test.
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,69 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.4.0
|
|
4
|
+
|
|
5
|
+
This release prepares conversations in the background, makes preparation usage visible, and improves text-answer reference handling.
|
|
6
|
+
|
|
7
|
+
### One automatic preparation mode
|
|
8
|
+
|
|
9
|
+
- **Automatically prepare conversations** combines source discovery, local search indexing, summary batches and the next briefing. Home shows the actual stage, entry progress, model invocations, errors and last completion.
|
|
10
|
+
- Start a batch at 64 source changes or waiting entries, resume interrupted owned work from cache, and reuse an untouched ready briefing when you join. Small new tails wait for foreground preparation or a full batch; there is no timed flush.
|
|
11
|
+
- Foreground work takes priority. Provider failures require an explicit retry rather than an endless paid loop. Existing conversations, notes and frozen snapshots are not rewritten.
|
|
12
|
+
- This mode uses the configured pi summary/final models and their quota or API billing within the saved invocation limit. Existing local-index-only permission does **not** authorize it: enable the replacement switch explicitly. Agent/session exclusions remain independent. No automatic microphone, call, user question, note saving or review.
|
|
13
|
+
|
|
14
|
+
### Preparation usage in Settings
|
|
15
|
+
|
|
16
|
+
- A wider, responsive Settings dialog shows completed batches, entries, model requests, active preparation and estimated cost, with charts and bucket details.
|
|
17
|
+
- Look back 6 hours, 1 day, 7 days or 14 days, grouped into 1-hour, 6-hour or 24-hour UTC buckets. The dashboard refreshes every 15 seconds only while Settings is open.
|
|
18
|
+
- Include automatic and manual preparation, retries, failed work and discarded snapshots. Count a snapshot's first successful briefing preparation once; rebuilding it adds cost without another completed batch.
|
|
19
|
+
- New requests receive durable timestamps and a pending accounting record. Older timing is labelled approximate; missing pricing remains unavailable or a partial subtotal, never a guessed zero.
|
|
20
|
+
- Costs are recorded API-price estimates, not invoices, subscription charges or quota balances. Chat, native voice, post-conversation recaps and local machine/network costs are excluded. Opening the dashboard reads metadata only; it does not start preparation.
|
|
21
|
+
|
|
22
|
+
### More reliable text-answer references
|
|
23
|
+
|
|
24
|
+
- Give the final model short, stable per-answer labels and map them back to admitted original-source references before saving an answer. Historical citations inside quoted text do not authorize new references.
|
|
25
|
+
- Handle bad/missing citations and ignored later reports in one bounded correction through the same final model and invocation/cancellation budget. Unknown references are not guessed or silently removed; rejected drafts are not saved.
|
|
26
|
+
- Show the actual source-reference correction stage. Error wording describes validation failure rather than asserting that a reference was invented. Citation checks still do not independently verify every claim, and native voice retains its separate lookup path.
|
|
27
|
+
|
|
28
|
+
### Upgrading from 0.3.0
|
|
29
|
+
|
|
30
|
+
- **No new database tables, columns or schema migration.** Existing SQLite run records, JSON metrics and settings storage are reused. No dependency changes.
|
|
31
|
+
- Existing histories, conversations, notes, review state, cached summaries and compatible search vectors are retained. Older usage records are not rewritten or backfilled from current prices.
|
|
32
|
+
- Node.js 22.19+ and npm remain required. Back up original logs and Draken data, wait for active work to finish, stop the server, upgrade and restart. No automatic boot startup or hot reload is added.
|
|
33
|
+
- Automated qualification does not establish exhaustive real-model answer quality, future account quota or physical-device voice acceptance.
|
|
34
|
+
|
|
35
|
+
## 0.3.0
|
|
36
|
+
|
|
37
|
+
This release adds a separate text-chat experience and improves how Draken prepares history and checks later updates.
|
|
38
|
+
|
|
39
|
+
### Chat without a call
|
|
40
|
+
|
|
41
|
+
- Choose **Chat instead** on Home or an existing sync. Chat uses configured pi, without native voice setup, microphone permission or WebRTC.
|
|
42
|
+
- Keep saved messages, original-source links, a square Draken portrait and real searching/thinking status across reloads.
|
|
43
|
+
- Stop a reply or explicitly retry a failed one. Accepted questions remain saved even if generation fails; repeated delivery of the same request does not generate another answer.
|
|
44
|
+
- Sending a message never implicitly saves edited notes, marks work reviewed or starts a voice call. The model/quota notice was removed from the chat view.
|
|
45
|
+
|
|
46
|
+
### More reliable history preparation and retrieval
|
|
47
|
+
|
|
48
|
+
- Finish bounded import passes to the captured end of each log before freezing a snapshot. An indexed but incompletely imported prefix no longer qualifies as ready.
|
|
49
|
+
- Prepare history before enabling a call, with explicit progress, cancellation and server-side readiness checks. Live retrieval does not silently download the local model or rebuild corpus embeddings.
|
|
50
|
+
- Keep project scope across follow-up questions using actual user turns and admitted metadata. Prefer original project records over stale Draken replies, with better deduplication and explanatory excerpts.
|
|
51
|
+
- Show the prepared-history cutoff and make refreshing history explicit. New chat messages do not force a corpus rebuild after every turn; changed or missing captured originals still invalidate readiness.
|
|
52
|
+
|
|
53
|
+
### Reconcile later evidence in text status answers
|
|
54
|
+
|
|
55
|
+
- Check later related reports within the same original session, including follow-ups that themselves became stale. Keep client implementation, backend foundations, delivery enablement and device/provider acceptance distinct.
|
|
56
|
+
- Supply a larger bounded text-history packet and retain closing qualifications when excerpts are shortened.
|
|
57
|
+
- If a draft cites a linked old checkpoint while ignoring its supplied follow-ups, permit one correction through the same final model and invocation budget. A second failure is visible; rejected drafts are not saved.
|
|
58
|
+
- The correction can consume one additional final-model request. These checks improve retrieval and citation consistency; they do not independently verify every claim or exhaustively reconcile all sessions. Native voice retains its separate smaller lookup path.
|
|
59
|
+
|
|
60
|
+
### Upgrading from 0.2.0
|
|
61
|
+
|
|
62
|
+
- Node.js 22.19+ and npm remain required. Back up original agent logs and Draken data first; wait for active calls and preparation/indexing jobs to finish, then stop the server before upgrading and restart it afterward.
|
|
63
|
+
- This release adds import-completeness metadata and nullable chat request IDs with a uniqueness constraint. Existing conversations, notes, review state and compatible embedding vectors are retained. Do not restore an older backup over newer user activity or use an older binary to undo migrations.
|
|
64
|
+
- No provider/account replacement, automatic paid summarization or new background-indexing policy is introduced. Chat and its correction attempts remain outside the preparation-only cost estimate.
|
|
65
|
+
- Automated tests use synthetic provider replies. Real local-embedding checks do not establish real-account quota, model-answer correctness, physical-device audio or end-to-end notification delivery in your projects.
|
|
66
|
+
|
|
3
67
|
## 0.2.0
|
|
4
68
|
|
|
5
69
|
Draken now helps you catch up on what your coding agents did. It reads saved sessions, prepares summaries with links to the original messages, and lets you ask questions and save decisions. It does not run project commands or change your code.
|
package/CONTRIBUTING.md
CHANGED
|
@@ -98,7 +98,7 @@ The native smoke check opens a temporary icon, updates status and checks orderly
|
|
|
98
98
|
|
|
99
99
|
`site/` is plain HTML/CSS with a small, synthetic evidence-reference interaction. It has no account/API integration, remote fonts, analytics or microphone access. Keep demo content labelled and never use private project screenshots or histories.
|
|
100
100
|
|
|
101
|
-
Merging `site/**` changes into `master` triggers `.github/workflows/web-deploy.yml`, which deploys to the existing Cloudflare R2 site and purges its cache. A feature-branch push does not deploy it. npm publication and application deployment are separate operations. Keep
|
|
101
|
+
Merging `site/**` changes into `master` triggers `.github/workflows/web-deploy.yml`, which deploys to the existing Cloudflare R2 site and purges its cache. A feature-branch push does not deploy it. npm publication and application deployment are separate operations. Keep version notices and installation commands accurate. Before announcing a release on the site, verify that the npm registry serves the expected version and test a fresh production-only installation. A successful publish command can precede registry availability while npm processes the package. Update the site and user documentation to match the confirmed release.
|
|
102
102
|
|
|
103
103
|
## Keep the code lean and the boundaries explicit
|
|
104
104
|
|
package/MEMORY.md
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
**Just ask.** Draken automatically searches retained older sessions, sync conversations and saved notes when you ask a text question or talk to it. The separate **Search history** page (`/history`) lets you inspect the same records directly.
|
|
4
4
|
|
|
5
|
-
There is no memory-enable switch,
|
|
5
|
+
There is no memory-enable switch, search-mode selector or wider-history checkbox. An existing sync offers **Prepare history** when its call history is not ready. Historical retrieval does not replace the complete-snapshot summary tree or advance review coverage.
|
|
6
6
|
|
|
7
7
|
## Automatic preparation
|
|
8
8
|
|
|
9
9
|
The first request with eligible retained history downloads approximately **136 MB** of pinned model/tokenizer files from Hugging Face, verifies their SHA-256 checksums and prepares local embeddings. Later requests reuse them and automatically embed new or changed records. Empty history does not require a model download.
|
|
10
10
|
|
|
11
|
-
Search combines meaning and exact keywords every time. It waits for both indexes rather than quietly returning keyword-only results while semantic work is incomplete. First use or a large amount of newly collected history can take minutes. Search, text-reply preparation and call
|
|
11
|
+
Search combines meaning and exact keywords every time. It waits for both indexes rather than quietly returning keyword-only results while semantic work is incomplete. First use or a large amount of newly collected history can take minutes. Search, text-reply preparation and pre-call preparation show the current phase, model-download bytes or completed/total **new or changed unique passages**, unchanged cached work separately, elapsed time and an approximate remaining time once enough passages have been measured. The estimate can change with passage length. Progress is read-only metadata; polling it does not start indexing. **Call Draken stays disabled until both the briefing and searchable history are ready.** Sync preparation includes history preparation; an older or changed sync offers **Prepare history**, with progress and cancellation on the sync page, not inside a call. Call creation checks readiness again and rejects unprepared history without starting a call or building an index. Cancelling or failing preparation leaves the microphone off. Ordinary concurrent requests queue behind one history process, within a fixed bound. Its embedding lanes run bounded batches in parallel; they do not run concurrent database writers. An unchanged index shows **History is up to date**, not a full-archive progress bar.
|
|
12
12
|
|
|
13
13
|
No session text or queries are uploaded for embedding. Text discussion and ChatGPT voice do receive the relevant historical excerpts, just as they receive frozen snapshot context. Those excerpts are dated background—not newly reviewed progress, agreement or permission to execute work.
|
|
14
14
|
|
|
@@ -16,13 +16,35 @@ Opening/reloading a page does not itself download the model, compute embeddings
|
|
|
16
16
|
|
|
17
17
|
### Optional background indexing
|
|
18
18
|
|
|
19
|
-
**Settings → Automatically
|
|
19
|
+
**Settings → Automatically prepare conversations** is the single opt-in for scanning, local indexing, summary batches and the final briefing. It is off by default and works while the server runs, even without a browser. It uses the configured pi summary/final models and their quota or API billing within the saved per-run invocation limit, and may download the pinned local embedding model on first use. It creates new immutable sync snapshots; existing snapshots, discussions and notes are not rewritten. It never starts audio, a call or review. Earlier local-index-only permission is not silently upgraded to paid model permission: the replacement switch records the combined scope.
|
|
20
20
|
|
|
21
|
-
The app's single scheduler checks once a minute when no sync, call or foreground history work is active. A background batch requires at least 64 changed source records, regardless of
|
|
21
|
+
The app's single scheduler checks once a minute when no sync, call or foreground history work is active. A new background batch requires at least 64 changed source records or 64 entries waiting for a briefing, regardless of elapsed time; unfinished owned batches resume from their cached work. An already indexed backlog still receives its briefing. There is no timed flush. Smaller pending batches wait for a sync, **Prepare history**, or search; that foreground path has no minimum batch size. Background indexing records the same history readiness used by calls. If anything still needs preparation, Call remains disabled—clicking it cannot start a hidden indexing job. Metadata hashes detect additions, edits and removals once per original source entry (or discussion/note record). Session/file bookkeeping does not add records, and frozen aliases coalesce with the original rather than multiplying the count. Actual indexing still reconstructs and verifies admitted source bytes. Unchanged checks do not start an embedding request. Source records and embedding passages are different counts. New sessions from enabled agents retain the collector's included-by-default behavior; per-agent/per-session exclusions and the existing baseline remain respected. Codex and Claude sources require separate explicit opt-in in **Settings → Agents & sessions**, even if background indexing is already enabled. Summarization continues to use pi. See [SOURCES.md](SOURCES.md).
|
|
22
22
|
|
|
23
|
-
Foreground
|
|
23
|
+
Foreground requests preempt and await the owned automatic job, including its provider call. Disabling cancels only that automatic job; completed vectors and summary nodes remain reusable. A provider/briefing failure is durably paused until explicit retry, rather than repeating paid calls on a timer. Local preparation failures retry no sooner than five minutes; foreground preemption waits at least one minute. Shutdown awaits owned work. Settings/progress GETs remain metadata-only. Home shows the same combined pipeline as Settings, including actual summary counts and model-call budget; last completion and unfinished snapshot ownership survive restart. A ready untouched automatic snapshot is claimed once by the Home conversation action, preserving delivery idempotency and avoiding another briefing call. New arrivals belong to a new snapshot; earlier batches come along as qualified, lossy recaps, with originals available through retrieval.
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
The hash-only search checkpoint still advances only after successful global preparation. Missing older checkpoints can be established by the combined opt-in's preparation pass, reusing compatible vectors. Snapshot ownership uses private `auto:` request IDs until a foreground request claims the batch; it is not review coverage. Existing user conversations are not adopted as unfinished background jobs. No source-text copy, provider substitution, vector conversion or timed small-batch flush is introduced.
|
|
26
|
+
|
|
27
|
+
A failed preparation/search reports an error. If a session file changed, moved or disappeared, scan sessions again before retrying; stale derived text is not a substitute for a verified source. Otherwise retry the question or **Prepare history**; completed embeddings are reused automatically. Cancel preparation on the sync page to stop that work. Cancelling a search or text reply stops its owned work too. Reloading does not start a call. An older cache without a call-readiness record needs one preparation pass, which reuses its compatible vectors. A completed index over a partial import is not sufficient: foreground call preparation first drains bounded import chunks to captured file ends. Missing, changed or incomplete originals block readiness. Later appends do not force preparation to chase a live stream forever; the call uses its displayed cutoff, and new work waits for another preparation. A ready sync offers **Refresh history** for an explicit local-only update without regenerating its briefing. See [SOURCES.md](SOURCES.md).
|
|
28
|
+
|
|
29
|
+
## Work questions and follow-ups
|
|
30
|
+
|
|
31
|
+
Voice and **Chat instead** work questions prefer original session records, not old Draken replies or repeated questions. Project names in admitted session metadata establish a scope that follows generic follow-ups; an explicit project change updates it. Explicit conversation recall still searches earlier discussion. This is a heuristic, not a guarantee that an ambiguous project name will be understood correctly.
|
|
32
|
+
|
|
33
|
+
Retrieval ranks both keywords and local vectors, deduplicates shared passages before the candidate limit, and gives original agent explanations their own candidate set. Current-status questions include the latest recorded agent explanation and favor recent records. Up to two named topics in a question can be searched separately so one does not crowd out the other. All candidates remain subject to source permissions and the prepared cutoff. Useful negative or historical evidence is not confirmation of a current defect.
|
|
34
|
+
|
|
35
|
+
Voice source packets contain up to four sources within 7,000 UTF-8 bytes. Excerpts keep contiguous explanatory text; tool requests may be omitted with an explicit marker. A later passage can include the beginning of its source for context. The native helper can refine a question or request an H reference (optionally with `offset 2000`); each user turn permits at most three distinct lookups and reuses duplicates. Source IDs are the context supplied for that turn, not verified per-claim citations or a cumulative claim that every earlier source supported the answer. A failed or empty work lookup is not silently replaced by an old conversation.
|
|
36
|
+
|
|
37
|
+
### Separate text chat
|
|
38
|
+
|
|
39
|
+
`/syncs/:id/chat` uses the same project/topic planner and prepared-only source search, with an up-to-32,000-byte historical packet (at most 16 sources). Recent actual user questions in the sync's saved chat and native call transcripts establish follow-up scope; assistant replies cannot select a project. The text model receives qualified recent call transcripts as context, not evidence of hearing or agreement. Source-reference validation checks existence, not per-claim truth.
|
|
40
|
+
|
|
41
|
+
Text status questions additionally check for later related original assistant narratives in the same source session. The bounded lexical pass considers at most 4,096 admitted narratives, four starting threads and two further follow-up generations; it does not run another embedding model or rebuild the corpus. It checks individual pending sub-tasks, favors relevant implementation sections over repeated pending tables, and retains a latest related report. Sequence orders records within a session, not across sessions. Follow-ups can themselves be stale, so a client-completion report that still lists backend jobs as pending is checked against later backend reports. Candidate links are not verified supersession: later plans, contradictory reports, completed foundations and unfinished delivery/acceptance remain distinct.
|
|
42
|
+
|
|
43
|
+
Packets retain contiguous excerpts and, when clipped, separately labelled ending excerpts with original offsets so closing qualifications survive. An earlier linked checkpoint is omitted if its selected follow-ups cannot fit. Omitted candidates/threads are disclosed; no-match never establishes that no later completion record exists. These are language-dependent lexical candidates over admitted projections, not exhaustive whole-log or cross-session semantic verification.
|
|
44
|
+
|
|
45
|
+
Final answers use a stable per-request `R1`, `R2`, … label catalog, mapped by Draken to the admitted E/C/H source references before validation and persistence. Source excerpts, earlier briefings and discussion are quoted data: their embedded citation syntax does not create labels. Explicit source requests are mapped into the same catalog. Unknown labels are neither guessed nor dropped. If a text answer has missing/out-of-catalog citations or cites a linked old checkpoint while ignoring supplied later reports (including E/C aliases), Draken permits **one combined correction using the same final model and invocation/cancellation budget**. The rejected draft is never saved or shown. A second failure is visible and retains the user question without an assistant answer. **Checking source references** or **Checking later updates** identifies the actual correction stage. It can consume one additional final-model request; chat/repair usage remains outside the preparation-only estimate. This citation-consistency check is not proof that every claim is true. The larger packet and repair apply to text replies, **not** streaming native voice, whose separate 7,000-byte lookup budget is unchanged.
|
|
46
|
+
|
|
47
|
+
Chat readiness checks the prepared receipt at its captured cutoff. New chat messages beyond that cutoff are passed directly as recent conversation and do not force an index rebuild on every turn. Original-file identity/import cursors, selection changes, missing originals and edits to already captured records still invalidate readiness. Fresh native-call readiness keeps its stricter current-record check. Both readiness endpoints only read metadata. Refresh is explicit; chat does not silently refresh the corpus, regenerate a briefing or switch providers.
|
|
26
48
|
|
|
27
49
|
## How it works
|
|
28
50
|
|
|
@@ -67,7 +89,7 @@ Back up both current databases before deployment and qualify migration on privat
|
|
|
67
89
|
|
|
68
90
|
Source inclusion, missing-session state, active branches for unsnapshotted entries and the existing history baseline are respected. Frozen evidence remains historical, including superseded branch material. Reviewed records remain searchable. Discarded sync discussion/notes are excluded, while discarded work can still be eligible through an active selected session.
|
|
69
91
|
|
|
70
|
-
|
|
92
|
+
Ordinary search and text discussion prepare the candidates observed at their start. Voice instead uses the history cutoff prepared before the call: it verifies original bytes and queries existing passages, but does not build missing corpus embeddings or download a missing model. Newer records wait for a later preparation and call. Query embeddings still run locally during a call. Exclusions and edits are rechecked after inference; stale or unprepared history fails visibly rather than being quietly rebuilt during the call. This avoids mixing fresh keyword-only records into results described as fully hybrid.
|
|
71
93
|
|
|
72
94
|
Sync discussion is its own retained record: excluding a session does not erase text previously discussed in a sync. Recaps/current briefings are not separately indexed as primary evidence, though preserved discussion can contain historical assistant summaries; attribution remains visible.
|
|
73
95
|
|
|
@@ -93,6 +115,6 @@ The npm package contains code/dependencies, not downloaded weights or private in
|
|
|
93
115
|
|
|
94
116
|
Ordinary tests use synthetic records and deterministic or empty embedding fixtures, with real FTS5/vector tests. They do not download/run the real model. Browser fixtures exercise automatic search and source reading without setup controls, plus no capture on navigation. Existing native-only and review-boundary tests remain.
|
|
95
117
|
|
|
96
|
-
Optional real-model qualification and CPU comparison commands live in [CONTRIBUTING.md](CONTRIBUTING.md#local-model-qualification). Those are isolated test tools, not steps required to use search.
|
|
118
|
+
Optional real-model qualification and CPU comparison commands live in [CONTRIBUTING.md](CONTRIBUTING.md#local-model-qualification). Those are isolated test tools, not steps required to use search. Search and text requests prepare the index automatically; calls require completed preparation first. There is no separate model setup command for users.
|
|
97
119
|
|
|
98
120
|
Synthetic retrieval and throughput checks do not establish exhaustive recall, real-provider answer quality or performance on every machine.
|
package/README.md
CHANGED
|
@@ -8,7 +8,9 @@ A local-first engineering sync across your **pi, Codex CLI and Claude Code sessi
|
|
|
8
8
|
>
|
|
9
9
|
> **Large histories now use a cached summary tree:** cheaper-model parsing and reconciliation, followed by a stronger-model verdict. The old raw-evidence snapshot cutoff is removed. This is still lossy model compression, not independent verification. See [ROADMAP.md](ROADMAP.md) for remaining quality evaluation and community research.
|
|
10
10
|
|
|
11
|
-
**Sync with Draken →
|
|
11
|
+
**Sync with Draken → call or chat → keep a short recap.**
|
|
12
|
+
|
|
13
|
+
**Draken 0.4.0** adds combined automatic preparation, a preparation-usage dashboard and more reliable text-answer references. See [the release notes](CHANGELOG.md#040).
|
|
12
14
|
|
|
13
15
|
The home page is compact history cards. Each sync has its own `/syncs/:id` URL, with the full briefing, conversations, notes and evidence behind it. **Search history** (`/history`) adds local semantic + keyword retrieval across retained older records, with dated source links. It prepares itself automatically—no enable/update buttons or search-mode choices. Progress counts only new or changed passages, with cached history shown separately and a measured time estimate. Local indexing reuses existing vectors and uses up to two embedding lanes/six CPU threads on sufficiently capable machines; smaller machines stay single-lane. Text questions and calls use it by default. See [MEMORY.md](MEMORY.md) for source scope, first-use download and limitations.
|
|
14
16
|
|
|
@@ -20,10 +22,10 @@ Draken remembers which evidence a finished sync covered, what you decided, and w
|
|
|
20
22
|
|
|
21
23
|
Requires Node.js **22.19+** and npm. Session-log indexing and evidence review do not require a model or pi executable. Generated briefings and discussion use **pi 1.4+**. Existing configured pi works unchanged; otherwise **`draken setup`** installs a pinned private runtime and **`draken login`** opens pi’s own authentication interface. See [SETUP.md](SETUP.md) for the full first-run flow, private directories and recovery.
|
|
22
24
|
|
|
23
|
-
> **
|
|
25
|
+
> **Upgrading?** Back up your original agent logs and Draken data first. Versions **0.1.6 and earlier** are the old task dashboard, not this application. See [what changed in 0.4.0](CHANGELOG.md#040).
|
|
24
26
|
|
|
25
27
|
```sh
|
|
26
|
-
npm install -g draken
|
|
28
|
+
npm install -g draken
|
|
27
29
|
draken
|
|
28
30
|
```
|
|
29
31
|
|
|
@@ -50,16 +52,28 @@ Run setup/login as the server’s user with the same environment. `draken status
|
|
|
50
52
|
2. Click **Sync with Draken**. Draken scans, freezes all available entries, summarizes earlier conversations, prepares the briefing, then starts the call on the same visible page. Browser microphone permission may still be required. This is one explicit action, not an automatic call on page load.
|
|
51
53
|
3. Talk. Ending the call requests a short, cached recap; it never saves decisions or marks evidence reviewed.
|
|
52
54
|
4. Return home for compact cards, or open any `/syncs/:id` independently. Reopening/reloading a URL never starts capture. **Call Draken** resumes discussion of that frozen snapshot without collecting later activity.
|
|
53
|
-
5.
|
|
55
|
+
5. Use **Chat instead** for a separate text conversation, or expand the detail sections to inspect the briefing/evidence and explicitly save **Decisions** and **Carry into the next sync**. **Mark reviewed** is separate and optional before starting another sync; only that explicit action advances coverage.
|
|
56
|
+
|
|
57
|
+
**Settings → Automatically prepare conversations** is one mode for the whole preparation pipeline: scan history, update local search, summarize new entries and prepare the opening briefing before you arrive. It is off by default and persists across restarts. Checks run once a minute while idle; 64 changed source records or waiting entries trigger a batch, and interrupted batches resume from cache. Smaller new tails wait for foreground preparation, with no timed flush. Home and Settings show the current stage, summary progress and last completed batch. Joining an unchanged prepared batch reuses its snapshot and briefing; later entries get a new snapshot with the earlier preparation as historical context. Existing conversations, notes and frozen evidence are never rewritten or marked reviewed. Calls and foreground work take priority.
|
|
54
58
|
|
|
55
|
-
|
|
59
|
+
This single opt-in authorizes **configured pi summary/final model use**, including account quota or API billing, bounded by each snapshot's saved invocation limit (120 by default). Provider failures pause automatic retries until an explicit retry; completed work is retained. There is no microphone capture or automatic call. An older local-index-only opt-in does not silently authorize this wider scope: enable the replacement switch once after upgrading. First use may download the pinned local search model. Agent/session exclusions remain respected; enabling other agents still requires their own source consent.
|
|
56
60
|
|
|
57
61
|
**Settings → Agents & sessions** shows each supported agent’s configured directories, recorded sessions, workspace/file paths, last recorded changes, unreviewed counts, inclusion choices and missing-source status. **Scan enabled agents** explicitly refreshes this inventory; opening Settings only reads recorded metadata and directory presence. Readers support **pi v3 JSONL, self-contained Codex CLI rollouts and Claude Code transcripts**. Codex and Claude history require explicit per-agent opt-in; existing pi choices are preserved. The panel shows directory presence separately from recorded sessions, not an installation claim. Summaries still use pi. See [SOURCES.md](SOURCES.md) for paths, supported layouts, migration and limitations. Source selection/scanning lives in this settings panel. A fresh installation includes all indexed history; an existing fixed baseline is preserved. There are no ordinary model/budget controls or extra inference permission checkboxes. Failed preparation keeps its snapshot and cached work; retry explicitly. Opening a link after preparation requires an explicit call click.
|
|
58
62
|
|
|
59
|
-
Closing the browser preserves the running job; reloading reconnects to progress. Restarting the server preserves the snapshot and completed summary nodes, but interrupts an active model call; retry to resume from cache. Discarding a sync leaves its evidence uncovered and retains the conversation in history.
|
|
63
|
+
Closing the browser preserves the running job; reloading reconnects to progress. Restarting the server preserves the snapshot and completed summary nodes, but interrupts an active model call; retry to resume from cache. Discarding a sync leaves its evidence uncovered and retains the conversation in history. Chat retains the sent question even if its reply fails or is stopped; it never fabricates a completed assistant answer or marks anything reviewed. The older discussion API still saves only completed exchanges. Records from the retired local engine retain their original playback qualifications. Live calls retain ordered generated/interrupted transcripts and supplied context sources, without claiming exact playback or agreement. Reload ends the call and never resumes microphone capture automatically.
|
|
60
64
|
|
|
61
65
|
An old capped snapshot must be explicitly **expanded to full history** before generating another briefing. Expansion rescans, preserves decisions/discussion and existing citation IDs, archives the obsolete briefing, and establishes a new snapshot time. It does not invoke models or advance coverage.
|
|
62
66
|
|
|
67
|
+
### Text chat
|
|
68
|
+
|
|
69
|
+
**Chat instead** is available on Home and beside **Call Draken** on a sync. Home prepares a new snapshot; opening chat on an existing sync reuses its briefing. `/syncs/:id/chat` restores the saved conversation and any running reply. Chat needs configured pi, not voice setup, ChatGPT native sign-in, microphone permission, WebRTC or a secure-context audio API. Dashboard authentication and normal transport-security requirements still apply.
|
|
70
|
+
|
|
71
|
+
A square Draken portrait accompanies replies. **Searching your prepared history**, **Draken is thinking** and **Checking later updates** follow actual server job stages; they are status cues, not private model reasoning or streamed draft answers. Enter sends; Shift+Enter inserts a newline. **Stop reply** cancels owned work; retry is explicit. A retried delivery with the same request ID does not repeat generation. A new explicit retry after failure uses a new ID and may consume model quota.
|
|
72
|
+
|
|
73
|
+
Replies use the sync's configured final text model through pi, with the briefing, recent conversation and project-aware original-history retrieval. The prepared archive has a displayed cutoff; new chat messages are supplied directly without rebuilding corpus embeddings after every turn. **Refresh history** admits later work. Changed, excluded or unavailable original sources still block readiness. Chat never opens a native call, implicitly regenerates a ready briefing, saves decisions or marks evidence reviewed. Chat quota/cost is separate from the preparation-only **Est. cost**.
|
|
74
|
+
|
|
75
|
+
For status questions, text chat checks later related original reports before repeating old blockers, including follow-ups to a report that was itself superseded. Client implementation, backend foundations, delivery enablement and device acceptance are kept distinct. The final model uses short per-answer reference labels, which Draken maps back to admitted original links; quoted historical citations never authorize new references. Bad/missing citations and ignored later follow-ups share one bounded same-model correction, with the same label catalog in both calls. A second validation failure remains visible without saving an unsupported draft. Retrieval and citation consistency do not independently verify the agent's claims; see [MEMORY.md](MEMORY.md#separate-text-chat) for bounds and voice differences.
|
|
76
|
+
|
|
63
77
|
### Model integration
|
|
64
78
|
|
|
65
79
|
For briefings, conversation recaps and text discussion, Draken invokes `pi --print` with all tools, extensions, MCP, skills, templates, context-file discovery, and session persistence disabled. It runs outside project checkouts and never resumes or writes to your coding sessions. Credentials stay with the selected pi profile—your existing installation or Draken’s private `pi/agent` directory. Pi owns authentication and refresh; Draken does not copy auth files or implement provider login flows.
|
|
@@ -97,7 +111,9 @@ Each run also retains metadata-only request timings, model/task/stage and repair
|
|
|
97
111
|
|
|
98
112
|
Each sync card and detail page shows **Est. cost** for its preparation: chunk summaries, consolidation, preparation-time prior recaps, final briefing, and retries/rebuilds for that sync. Later questions, voice calls, standalone conversation recaps and local embeddings are excluded. Preparation consumes pi's bounded JSON event stream and saves only numeric usage, returned model names and the catalog-based USD estimate alongside existing metrics—not raw events, prompts, thinking or signatures. Reasoning is a subset of output, not an extra charge; provider cache reads/writes are distinct from Draken cache hits (which make no new request). The total uses prices reported at call time, never today's prices applied to old calls. **This is an API-equivalent estimate, not a subscription charge, quota measurement or provider invoice.** Missing/zero-filled usage or unavailable catalog pricing stays unavailable; mixed or interrupted records show a partial subtotal. Older syncs cannot be honestly backfilled from the padded planning estimates.
|
|
99
113
|
|
|
100
|
-
|
|
114
|
+
Settings includes a **Preparation usage** dashboard with 6-hour, 1-day, 7-day and 14-day lookbacks, and 1-hour, 6-hour or 24-hour UTC buckets. It shows completed briefing batches, model requests and their recorded API-price estimate, across automatic and manual preparation—including retries, failed work and discarded snapshots. A batch is a snapshot's first successful briefing preparation; rebuilds add cost without counting it again. It is not proof of review or current call readiness. Request costs are placed at their start time, and completed batches at their completion time. New requests have durable timestamps, including pending/interrupted requests; older metrics use the run start and are explicitly approximate. Missing usage/pricing is unavailable or a partial subtotal, never a fabricated zero or a backfill from today's prices. These are estimates, not invoices or subscription/quota balances. Chat, native voice, post-conversation recaps and local machine/network costs are excluded. Opening Settings and changing the time range only read accounting metadata; polling stops when it closes.
|
|
115
|
+
|
|
116
|
+
The final model receives bounded summaries, raw verification excerpts, saved decisions, and recent conversation—not the entire transcript. Questions additionally retrieve up to 16 raw snapshot entries and automatically receive a bounded hybrid-search packet from retained earlier history, with separate global H citations. The separate chat surface requires prepared history and uses its captured cutoff; ordinary standalone search and the older discussion API can prepare the local index as needed. Wider history is not added to the frozen snapshot. Final citation validation checks reference existence and, for text status replies, whether cited checkpoints address their supplied follow-ups. Neither check proves that every claim is actually supported.
|
|
101
117
|
|
|
102
118
|
The manager is a **read-only conversation**, not a worker. Its responses distinguish intent, attempts, agent-reported implementation, and observed validation, with clickable evidence references. Model-generated claims still need human review. Draken does not independently run tests or verify Git/CI/deployment state.
|
|
103
119
|
|
|
@@ -105,7 +121,7 @@ The manager is a **read-only conversation**, not a worker. Its responses disting
|
|
|
105
121
|
|
|
106
122
|
The new workflow freezes the three most recent non-discarded syncs' briefing, discussion and explicit notes at snapshot creation. Their full supplied text passes through cached bounded map/reduce recap jobs; it does not silently select only the final messages. This remains **lossy summarization**, not exhaustive recall or independent verification. Recaps are 1–5 short lines (at most 600 characters), labelled historical summaries rather than agreement. Old source IDs are not treated as this snapshot's citations. Original histories remain available at their own URLs.
|
|
107
123
|
|
|
108
|
-
The card shows a short recap, or an explicitly labelled briefing preview until one exists, with its body clamped to three visual lines. A changed conversation marks an older recap as stale. Closing the call UI requests an asynchronous recap using the cheap model (maximum 32 invocations, also bounded by the sync's saved ceiling); interrupted browser exits cannot guarantee that request. **Make recap / Refresh recap** retries explicitly, and the next sync recomputes changed prior inputs from cache. Recaps never change notes, source snapshots or coverage.
|
|
124
|
+
The card shows a short recap, or an explicitly labelled briefing preview until one exists, with its body clamped to three visual lines. A changed conversation marks an older recap as stale. Closing the call UI requests an asynchronous recap using the cheap model (maximum 32 invocations, also bounded by the sync's saved ceiling); interrupted browser exits cannot guarantee that request. **Make recap / Refresh recap** retries explicitly, and the next sync recomputes changed prior inputs from cache. Recaps never change notes, source snapshots or coverage. The single automatic-preparation opt-in also permits these preparation recaps and briefing model calls in the background; merely browsing does not. Native recall can reuse these prior-sync recaps, but cannot quote original words from them; historical lookup automatically retrieves retained original excerpts across sessions and syncs through the local hybrid index, separately from frozen discussion and recaps; see [MEMORY.md](MEMORY.md).
|
|
109
125
|
|
|
110
126
|
The migration adds presentation/recap-cache tables and removes the single-open-sync index without rewriting original rows. Once multiple open snapshots exist, do not blindly downgrade to the old one-open-sync schema. ChatGPT is the only voice engine. Removing the old engine does not remove its historical records, and updating the app does not require restoring an old database.
|
|
111
127
|
|
|
@@ -143,7 +159,7 @@ Current limits: discovery is eight directories deep; each scan reads up to 32 Mi
|
|
|
143
159
|
|
|
144
160
|
Session logs can contain private source code, prompts, command output, and credentials.
|
|
145
161
|
|
|
146
|
-
- **Provider-model use starts through
|
|
162
|
+
- **Provider-model use starts through conversation/preparation actions or the explicitly enabled combined automatic-preparation mode.** The combined action prepares previous recaps and a new briefing before calling; closing the call UI requests a derived recap. Voice turns do not invoke pi. Calls open a persistent OpenAI audio session at call start; idle/quota accounting is not established. There is no separate permission checkbox. Scanning and reading evidence stay local. History lookup automatically prepares/updates a local embedding index when needed; first use downloads pinned public weights. Text questions and calls receive relevant historical excerpts by default through their existing model. Merely opening a page performs no embedding inference; the explicitly enabled automatic-preparation schedule runs independently of browsing and can also use the configured summary/final models.
|
|
147
163
|
- Thinking blocks, system prompts, images, and opaque signatures are not indexed. Tool-call arguments are minimized; common secret patterns are redacted. **This is best-effort, not a guarantee that the remaining text is safe to share.** Inspect evidence and exclude sensitive sessions before calling a provider.
|
|
148
164
|
- SQLite contains verified live-session and frozen-snapshot pointers, cached summaries, run metadata, decisions and conversations—not copies of original agent entry bodies. It lives outside the checkout in `~/.draken/draken.db` by default. **Original agent JSONL files are the authoritative archive, including for old snapshots.** Back up both those files and Draken's private state. Missing/changed originals are labelled unavailable; discussion and notes remain accessible, but generating replies, calling or reviewing that snapshot requires restoring its evidence. Search stores passage hashes, unique vectors, source links and contentless keyword postings, not passage bodies. See [MEMORY.md](MEMORY.md) for migration and storage details. There is no in-app retention/purge UI yet.
|
|
149
165
|
- The server defaults to loopback with **no dashboard login**. Explicitly configured credentials (or `DRAKEN_NO_AUTH=false`) retain authentication even on loopback. Local API access still rejects cross-origin requests and unexpected Host headers.
|
package/SETUP.md
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
Draken uses **pi for summaries, preparation recaps and text discussion**, regardless of which coding agent produced the imported history. It does not implement provider OAuth, translate another agent's credentials, or run Claude/Codex to summarize.
|
|
4
4
|
|
|
5
|
-
>
|
|
5
|
+
> This guide is for **Draken 0.4.0**. Versions **0.1.6 and earlier** are the old task dashboard. Before upgrading, back up your original agent logs and Draken data; see [what changed](CHANGELOG.md#040).
|
|
6
6
|
|
|
7
7
|
## Install and start
|
|
8
8
|
|
|
9
9
|
Install Node.js **22.19+** with npm, then run:
|
|
10
10
|
|
|
11
11
|
```sh
|
|
12
|
-
npm install -g draken
|
|
12
|
+
npm install -g draken
|
|
13
13
|
draken
|
|
14
14
|
```
|
|
15
15
|
|
package/SOURCES.md
CHANGED
|
@@ -21,7 +21,7 @@ Open **Settings → Agents & sessions**. Each adapter shows its configured direc
|
|
|
21
21
|
|
|
22
22
|
The overview API retains its old `session_root` field as a read-only pi compatibility field; new consumers use `agents[].roots` and each session's `agent`/`external_id`.
|
|
23
23
|
|
|
24
|
-
Root overrides are server environment settings, not arbitrary filesystem paths supplied by browser requests. The worker receives an explicit per-agent root allowlist, not credentials or the server environment. Directory traversal is bounded to eight levels. Source symlinks are not followed during discovery; record reads verify real-path containment, regular-file identity, header/session identity, raw bytes and hashes.
|
|
24
|
+
Root overrides are server environment settings, not arbitrary filesystem paths supplied by browser requests. The worker receives an explicit per-agent root allowlist, not credentials or the server environment. Directory traversal is bounded to eight levels. Source symlinks are not followed during discovery; record reads verify real-path containment, regular-file identity, header/session identity, raw bytes and hashes. Each import pass reads at most 32 MiB per file; a scan repeats those bounded passes until it reaches that file's captured end. It does not chase later appends. Complete LF-terminated records remain bounded to 8 MiB, and an unfinished final record waits for another scan. Committed chunks survive cancellation, but an interrupted or failed import is not a completed capture. Snapshot routes reject scan warnings rather than freezing a partial import. Pre-call preparation scans before indexing, and readiness requires each admitted source's completed capture marker (`agent_sessions.scanned_bytes`), not just its modification time or imported cursor. Older rows default to `-1` (unverified) and are revalidated from the beginning; `0` marks an incomplete import and a positive value its completed captured size. A failed chunk never advances past malformed records. A persisted scan-completion flag also blocks readiness after cancellation or a discovery error, including errors in new files that have no imported row yet. Later appends can wait for the next preparation; original byte/hash verification still applies at retrieval.
|
|
25
25
|
|
|
26
26
|
## Adapter recipes
|
|
27
27
|
|
package/VOICE.md
CHANGED
|
@@ -23,11 +23,17 @@ The helper and its credentials live under `~/.draken/realtime/`, separate from t
|
|
|
23
23
|
|
|
24
24
|
This uses an experimental native interface, not a stable public embedding API. Successful setup or a connection handshake is not proof that an account can receive usable audio. The opt-in probe tests actual audio separately. Quota, idle accounting, coding-allowance impact and future compatibility are not established.
|
|
25
25
|
|
|
26
|
+
## Chat instead
|
|
27
|
+
|
|
28
|
+
For a keyboard-only conversation, choose **Chat instead** on Home or next to **Call Draken**. This is a separate `/syncs/:id/chat` surface, not a muted call. It uses the configured text model through pi and requires no microphone permission, WebRTC connection or native ChatGPT sign-in. It shows a square Draken portrait, searching/thinking status, saved messages and source links. Its model access/quota is separate from the native voice account. See [the text-chat guide](README.md#text-chat).
|
|
29
|
+
|
|
30
|
+
Choosing chat while a one-click call is still preparing consumes that browser call intent; preparation can finish without opening a microphone. Returning to **Voice & call history** never automatically starts a call. Existing voice history remains preserved and separately labelled.
|
|
31
|
+
|
|
26
32
|
## Start and use a call
|
|
27
33
|
|
|
28
34
|
1. Open Draken on **localhost or trusted HTTPS**. Plain LAN HTTP normally cannot access the microphone.
|
|
29
|
-
2. **Sync with Draken**
|
|
30
|
-
3.
|
|
35
|
+
2. **Sync with Draken** finishes importing each discovered file's captured prefix, prepares the briefing and searchable history, then opens its call. Import errors stop preparation instead of silently freezing an old prefix. On an existing sync, **Call Draken** stays disabled until both are ready. If imported history has changed, use **Prepare history** first. An already-ready sync also offers **Refresh history** to capture later work without rebuilding its frozen briefing.
|
|
36
|
+
3. Any needed history download/indexing happens on the sync page, before a call can start. Progress and **Cancel preparation** are available there; the microphone remains off. Once ready, start the call and allow microphone access. A failed or cancelled preparation does not request permission, and if the page is hidden when preparation finishes, start the call again explicitly. You can also type if microphone permission is unavailable.
|
|
31
37
|
4. Speaker-safe mode pauses input during replies. Use **Stop reply** to speak, or enable **Headphone mode** to allow spoken interruption. Headphones are recommended.
|
|
32
38
|
5. **Mute** releases the microphone tracks. **Stop reply** cuts playback locally and asks the provider to stop; it does not prove immediate remote cancellation. **End call** stops capture/playback and keeps the text history.
|
|
33
39
|
|
|
@@ -35,11 +41,13 @@ Capture follows a transient browser action, never a URL flag. Reloading or openi
|
|
|
35
41
|
|
|
36
42
|
Reply waiting is owned by the server's identified user transcript and pending-answer events. Unkeyed WebRTC user events can arrive late and must not switch an already pending reply back to listening, erase its waiting caption, or restart a settled reply. A lookup acknowledgement such as “I’ll check what’s recorded” is not meant to end the answer. Draken keeps the question pending and can automatically resume ChatGPT speech when its context arrives; you should not need to ask “have you checked?” Quiet captions in the dragon scene show **[Thinking...]**, **[Hmmm...]** and **[Hmmmmmm...]** during a pending reply, including silence after an acknowledgement. They change every five seconds without animation. **[Checking...]** and **[Looking that up...]** are used only while the local history worker reports fresh lookup activity; these labels are not proof of a match or exhaustive search. These are visual waiting cues—not the model’s private thoughts, spoken messages, a percentage or an ETA. They are never saved in the transcript or sent to the model. The separate waiting banner and elapsed-wait timer have been removed. Stop, a newer question, interruption, or ending the call cancels the old pending continuation. There is at most one automatic completion cue per question—not a retry loop or a fabricated user message. A failed lookup must be disclosed; a failed or silent continuation produces a visible notice instead of silently retrying.
|
|
37
43
|
|
|
44
|
+
Work questions use original project evidence and preserve the project across follow-ups; old conversation recall remains available when explicitly requested. History is captured at the displayed preparation cutoff, not observed live. The helper can refine a lookup or read a longer H source. Each turn allows three distinct lookups, with source packets bounded to 7,000 UTF-8 bytes (the native context envelope is bounded to 8 KiB). Supplied source IDs belong to that turn; they are not proof that each generated claim was verified. The larger text-chat reconciliation packet and bounded pi answer-repair pass do not apply to streaming native voice; this call path retains its existing lookup budget. See [MEMORY.md](MEMORY.md) for retrieval limits.
|
|
45
|
+
|
|
38
46
|
One call may be active at a time, with a 30-minute limit, at most 60 user messages and a 90-second disconnect timeout. These are resource limits, not spending guarantees. A new call cannot start until helper cleanup is confirmed. The browser chooses its reservation UUID before sending creation, so End can release a reservation even if the create response is lost. If End overtakes creation, the server retains a bounded cancellation marker for five minutes; an already-created ID can never be reused. Network loss can still require the disconnect timeout or explicit End previous call.
|
|
39
47
|
|
|
40
48
|
## Evidence, records and recap
|
|
41
49
|
|
|
42
|
-
- Voice questions do **not** start pi, local transcription or local synthesis. The call receives a bounded briefing, saved notes and source excerpts. Explicit source/history questions can request more data from the same frozen snapshot. Calls
|
|
50
|
+
- Voice questions do **not** start pi, local transcription or local synthesis. The call receives a bounded briefing, saved notes and source excerpts. Explicit source/history questions can request more data from the same frozen snapshot. Calls use bounded semantic + keyword retrieval across retained older records, using the local index described in [MEMORY.md](MEMORY.md). The local model/index must be prepared before calling is enabled; first preparation may take minutes. During the call, retrieval uses that prepared cutoff and verifies original sources without building new corpus embeddings. Expand **Conversation & details** for the full transcript, sources and any later history progress. Optional **Settings → Automatically prepare conversations** prepares both that history and a new briefing in one idle pipeline, starting new batches at 64 source changes or waiting entries and resuming incomplete owned batches. It uses the configured pi summary/final models before the conversation, but never starts capture, calls or review. Smaller batches wait for explicit preparation, and keep Call disabled if history is not ready. This block starts collapsed for every call; its progress polling reads metadata only. Those dated excerpts also go to ChatGPT; they are not new snapshot evidence. The embedding runtime is text-only and is not a replacement speech engine.
|
|
43
51
|
- The read-only lookup service is not a coding model or a general web search. Tool-execution and approval requests are denied. Calls cannot edit files, deploy work, save decisions by model instruction, finish syncs or advance coverage.
|
|
44
52
|
- Speech may paraphrase. **Sources supplied** means context was given to the model, not that every spoken claim was verified. Responses are not held for whole-answer JSON validation before playback.
|
|
45
53
|
- History stores ordered user/assistant messages with generated/interrupted labels. It does not invent question–answer pairs, exact played words, human hearing or agreement. Historical records from the retired engine retain their original playback reports and are labelled separately.
|
package/dist/db/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAQtC,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAID,wBAAgB,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAazC;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAQtC,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAID,wBAAgB,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAazC;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAuL5D;AAED,wBAAgB,OAAO,IAAI,IAAI,CAG9B"}
|
package/dist/db/schema.js
CHANGED
|
@@ -217,10 +217,16 @@ function initSchema(database) {
|
|
|
217
217
|
const runColumns = new Set(database.prepare('PRAGMA table_info(sync_runs)').all().map(column => column.name));
|
|
218
218
|
if (!runColumns.has('metrics_json'))
|
|
219
219
|
database.exec("ALTER TABLE sync_runs ADD COLUMN metrics_json TEXT NOT NULL DEFAULT '[]'");
|
|
220
|
+
if (!runColumns.has('request_id'))
|
|
221
|
+
database.exec('ALTER TABLE sync_runs ADD COLUMN request_id TEXT');
|
|
222
|
+
database.exec('CREATE UNIQUE INDEX IF NOT EXISTS sync_run_request ON sync_runs(request_id) WHERE request_id IS NOT NULL');
|
|
220
223
|
database.prepare('UPDATE syncs SET snapshot_at = created_at WHERE snapshot_at IS NULL').run();
|
|
221
224
|
(0, pointer_migration_1.migratePointers)(database);
|
|
222
225
|
(0, snapshot_pointers_1.migrateSnapshotPointers)(database);
|
|
223
226
|
(0, agent_migration_1.migrateAgents)(database);
|
|
227
|
+
const sessionColumns = new Set(database.prepare('PRAGMA table_info(agent_sessions)').all().map(column => column.name));
|
|
228
|
+
if (!sessionColumns.has('scanned_bytes'))
|
|
229
|
+
database.exec('ALTER TABLE agent_sessions ADD COLUMN scanned_bytes INTEGER NOT NULL DEFAULT -1');
|
|
224
230
|
})();
|
|
225
231
|
}
|
|
226
232
|
function closeDb() {
|
package/dist/db/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":";;;;;AAQA,gCAEC;AAID,sBAaC;AAED,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":";;;;;AAQA,gCAEC;AAID,sBAaC;AAED,gCAuLC;AAED,0BAGC;AAzND,oEAAsC;AACtC,gDAAwB;AACxB,4CAAoB;AACpB,4CAAoB;AACpB,2DAAkE;AAClE,2DAA8D;AAC9D,uDAAqE;AAErE,SAAgB,UAAU;IACxB,OAAO,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,IAAI,EAAE,GAA6B,IAAI,CAAC;AAExC,SAAgB,KAAK;IACnB,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,YAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,EAAE,GAAG,IAAI,wBAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;QAC/C,uFAAuF;QACvF,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC;QACjD,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC/B,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACjC,IAAI,CAAC;YAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAAC,EAAE,GAAG,IAAI,CAAC;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;IAC/E,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,UAAU,CAAC,QAA2B;IACpD,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE;QAC1B,IAAA,mCAAiB,EAAC,QAAQ,CAAC,CAAC;QAC5B,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC,GAAG,EAAE;eAC9F,QAAQ,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC,GAAG,EAAU,EAAE,KAAK,KAAK,YAAY,CAAC;QAC3H,6EAA6E;QAC7E,yEAAyE;QACzE,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;MAmBV,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,sFAAsF;MACzG,IAAA,8BAAU,EAAC,eAAe,EAAE,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyI5C,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAE,QAAQ,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC,GAAG,EAAyB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/H,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;YAC9C,gBAAgB,EAAE,4BAA4B;YAC9C,WAAW,EAAE,MAAM;YACnB,iBAAiB,EAAE,4BAA4B;YAC/C,oBAAoB,EAAE,4BAA4B;SACnD,CAAC,EAAE,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,gCAAgC,IAAI,IAAI,UAAU,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAE,QAAQ,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,GAAG,EAAyB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACtI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;QAC/H,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QACrG,QAAQ,CAAC,IAAI,CAAC,0GAA0G,CAAC,CAAC;QAC1H,QAAQ,CAAC,OAAO,CAAC,qEAAqE,CAAC,CAAC,GAAG,EAAE,CAAC;QAC9F,IAAA,mCAAe,EAAC,QAAQ,CAAC,CAAC;QAAC,IAAA,2CAAuB,EAAC,QAAQ,CAAC,CAAC;QAAC,IAAA,+BAAa,EAAC,QAAQ,CAAC,CAAC;QACtF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAE,QAAQ,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,EAAyB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/I,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC;IAC3I,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;AAED,SAAgB,OAAO;IACrB,EAAE,EAAE,KAAK,EAAE,CAAC;IACZ,EAAE,GAAG,IAAI,CAAC;AACZ,CAAC"}
|
|
@@ -4,17 +4,22 @@ interface Operations {
|
|
|
4
4
|
enabled(): boolean;
|
|
5
5
|
idle(): boolean;
|
|
6
6
|
now(): number;
|
|
7
|
-
scan(): Promise<{
|
|
7
|
+
scan(signal: AbortSignal): Promise<{
|
|
8
8
|
warnings: string[];
|
|
9
9
|
}>;
|
|
10
10
|
stamp(before: string): Map<string, string>;
|
|
11
11
|
baseline?(): Map<string, string> | undefined;
|
|
12
12
|
prepare(before: string, signal: AbortSignal): Promise<void>;
|
|
13
|
+
waiting?(): number;
|
|
14
|
+
unfinished?(): boolean;
|
|
15
|
+
briefing?(signal: AbortSignal): Promise<void>;
|
|
16
|
+
problem?(): string;
|
|
17
|
+
completed?(at: string): void;
|
|
13
18
|
}
|
|
14
|
-
/**
|
|
15
|
-
*
|
|
16
|
-
* Smaller tails wait for
|
|
17
|
-
*
|
|
19
|
+
/** One opted-in pipeline: source discovery, local search and a ready briefing.
|
|
20
|
+
* Full batches start at 64 changes or waiting entries; interrupted work resumes.
|
|
21
|
+
* Smaller new tails wait for foreground preparation, with no timed flush.
|
|
22
|
+
* Provider failures require explicit retry; cancellation retains cached work. */
|
|
18
23
|
declare class AutoIndexer {
|
|
19
24
|
private ops;
|
|
20
25
|
state: State;
|
|
@@ -26,12 +31,13 @@ declare class AutoIndexer {
|
|
|
26
31
|
tick(): Promise<void>;
|
|
27
32
|
pause(): void;
|
|
28
33
|
stop(): Promise<void>;
|
|
34
|
+
retry(): void;
|
|
29
35
|
private run;
|
|
30
36
|
}
|
|
31
37
|
export declare function createAutoIndexer(ops: Operations): AutoIndexer;
|
|
32
38
|
export declare function startBackgroundIndexing(): void;
|
|
33
39
|
export declare function stopBackgroundIndexing(): Promise<void>;
|
|
34
|
-
export declare function yieldBackgroundIndexing(): void
|
|
40
|
+
export declare function yieldBackgroundIndexing(): Promise<void>;
|
|
35
41
|
export declare function autoIndexSettings(): AutoIndexSettings;
|
|
36
42
|
export declare function setAutoIndex(value: unknown): AutoIndexSettings;
|
|
37
43
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automatic.d.ts","sourceRoot":"","sources":["../../src/memory/automatic.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"automatic.d.ts","sourceRoot":"","sources":["../../src/memory/automatic.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD,KAAK,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,OAAO,CAAC,CAAC;AAClG,UAAU,UAAU;IAClB,OAAO,IAAI,OAAO,CAAC;IAAC,IAAI,IAAI,OAAO,CAAC;IAAC,GAAG,IAAI,MAAM,CAAC;IACnD,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC3D,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,MAAM,CAAC;IACnB,UAAU,CAAC,IAAI,OAAO,CAAC;IACvB,QAAQ,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,MAAM,CAAC;IACnB,SAAS,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAGD;;;iFAGiF;AACjF,cAAM,WAAW;IAMH,OAAO,CAAC,GAAG;IALvB,KAAK,QAAa;IAClB,OAAO,CAAC,QAAQ,CAAC,CAAsB;IACvC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,IAAI,CAAC,CAAkB;IAC/B,OAAO,CAAC,GAAG,CAAC,CAAgB;gBACR,GAAG,EAAE,UAAU;IAC7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,KAAK;IAIC,IAAI;IACV,KAAK;YACS,GAAG;CAmDlB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,eAAkC;AAMnF,wBAAgB,uBAAuB,SAStC;AACD,wBAAsB,sBAAsB,kBAG3C;AACD,wBAAsB,uBAAuB,kBAA4B;AACzE,wBAAgB,iBAAiB,IAAI,iBAAiB,CAUrD;AACD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAW9D"}
|