@djolex999/vir-cli 0.29.0 → 0.31.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/README.md +68 -0
- package/dist/audit/afterRun.js +28 -0
- package/dist/audit/afterRun.js.map +1 -0
- package/dist/audit/ground.js +176 -0
- package/dist/audit/ground.js.map +1 -0
- package/dist/cli/audit.js +124 -0
- package/dist/cli/audit.js.map +1 -1
- package/dist/cli/initConfig.js +3 -0
- package/dist/cli/initConfig.js.map +1 -1
- package/dist/cli/journal.js +73 -0
- package/dist/cli/journal.js.map +1 -0
- package/dist/cli.js +19 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.js +9 -0
- package/dist/config.js.map +1 -1
- package/dist/journal/events.js +226 -0
- package/dist/journal/events.js.map +1 -0
- package/dist/journal/render.js +230 -0
- package/dist/journal/render.js.map +1 -0
- package/dist/journal/run.js +88 -0
- package/dist/journal/run.js.map +1 -0
- package/dist/lint/linter.js +5 -2
- package/dist/lint/linter.js.map +1 -1
- package/dist/search/retriever.js +3 -2
- package/dist/search/retriever.js.map +1 -1
- package/dist/state/db.js +103 -0
- package/dist/state/db.js.map +1 -1
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -28,6 +28,7 @@ developer-tools, mcp, local-first, cross-platform, llm-wiki
|
|
|
28
28
|
<a href="https://modelcontextprotocol.io"><img src="https://img.shields.io/badge/MCP-server-c084fc" alt="mcp"></a>
|
|
29
29
|
<a href="#"><img src="https://img.shields.io/badge/local--first-yes-f59e0b" alt="local-first"></a>
|
|
30
30
|
<a href="https://github.com/djolex999/vir"><img src="https://img.shields.io/github/stars/djolex999/vir?style=social" alt="stars"></a>
|
|
31
|
+
<a href="https://ko-fi.com/djmarkovic"><img src="https://img.shields.io/badge/Ko--fi-support%20vir-FF5E5B?logo=ko-fi&logoColor=white" alt="Support vir on Ko-fi"></a>
|
|
31
32
|
</p>
|
|
32
33
|
|
|
33
34
|
That graph is my vault. Every node is a plain markdown file that vir wrote by
|
|
@@ -461,6 +462,8 @@ with your distro, init system, and Node version.
|
|
|
461
462
|
| `vir connect` | $ | Propose those lessons as cited rules (≤10 LLM calls) |
|
|
462
463
|
| `vir summarize <project>` | cheap | Cross-session project synthesis |
|
|
463
464
|
| `vir summarize --week` | cheap | Period summary of the week's notes |
|
|
465
|
+
| `vir journal [date]` | free | Daily work journal from transcripts, no LLM calls (default: today) |
|
|
466
|
+
| `vir journal --since <date>` | free | Write every day with activity from that date on |
|
|
464
467
|
| `vir lint` | cheap | Find orphans, stale notes, contradictions |
|
|
465
468
|
| `vir dedupe` | cheap | Interactive duplicate detection + merge |
|
|
466
469
|
| `vir review` | free | Walk new notes: approve/edit/reject |
|
|
@@ -470,6 +473,7 @@ with your distro, init system, and Node version.
|
|
|
470
473
|
| `vir review --audited` | free | Walk notes vir audit flagged, worst first |
|
|
471
474
|
| `vir review --insights` | free | Accept, edit or reject rules proposed by `vir connect` |
|
|
472
475
|
| `vir audit --apply-rejects` | free | Move fresh reject verdicts to `.rejected/` (reversible) |
|
|
476
|
+
| `vir audit --transcript` | $$ | Check each note against its own transcript; contradicted notes join `vir review --audited` |
|
|
473
477
|
| `vir lint --strays` | free | Note files with no live DB row (retitle debris) |
|
|
474
478
|
| `vir lint --strays --fix` | free | Move retitle debris to `archived/` (only when a live copy exists) |
|
|
475
479
|
| `vir lint --legacy-related` | free | Pre-0.12.0 notes whose stored Related holds content a rewrite drops |
|
|
@@ -492,6 +496,63 @@ run `vir <command> --help` for the full flag list. `vir query --json` and
|
|
|
492
496
|
`vir doctor --json` are the machine contracts the
|
|
493
497
|
[vir-obsidian](https://github.com/djolex999/vir-obsidian) plugin consumes.
|
|
494
498
|
|
|
499
|
+
## Daily journal
|
|
500
|
+
|
|
501
|
+
`vir journal` writes one file per day, `vault/vir/journal/YYYY-MM-DD.md`, with
|
|
502
|
+
what happened in each project: what got done, what's in progress, blocked or
|
|
503
|
+
still open, links to that day's decision notes, and work left unfinished on an
|
|
504
|
+
earlier day that nothing has touched since. It reads your transcripts
|
|
505
|
+
directly and makes no LLM calls, so it's free and gives the same file every
|
|
506
|
+
time for the same input.
|
|
507
|
+
|
|
508
|
+
```markdown
|
|
509
|
+
## my-app
|
|
510
|
+
|
|
511
|
+
2 sessions
|
|
512
|
+
|
|
513
|
+
**Done**
|
|
514
|
+
- fix: retry webhook on 502 (commit a1b2c3d)
|
|
515
|
+
- Add idempotency key to checkout (task 1f2e3d4c#todo-0a1b2c3d)
|
|
516
|
+
|
|
517
|
+
**In progress**
|
|
518
|
+
- Migrate sessions table (task 1f2e3d4c#todo-4e5f6a7b)
|
|
519
|
+
|
|
520
|
+
**Decisions**
|
|
521
|
+
- [[use-sqlite-for-job-state-1f2e3d4c]]
|
|
522
|
+
|
|
523
|
+
**Carried over**
|
|
524
|
+
- Rotate webhook secret (task 9c8b7a6d#todo-1c2d3e4f), in progress, open 3 days
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
Every line has to point at evidence: a commit sha git printed, or a task whose
|
|
528
|
+
tool result confirmed it. A rejected commit, a refused call or a plan step
|
|
529
|
+
nobody finished doesn't count. Tasks come from TaskCreate/TaskUpdate, TodoWrite
|
|
530
|
+
and the Claude desktop app's task list.
|
|
531
|
+
|
|
532
|
+
```
|
|
533
|
+
vir journal # today
|
|
534
|
+
vir journal 2026-11-04 # one day
|
|
535
|
+
vir journal --since 2026-10-28 # every day with activity since then
|
|
536
|
+
vir journal --all # rewrite every day
|
|
537
|
+
vir journal --stdout # print instead of writing
|
|
538
|
+
vir journal --tz Europe/Belgrade
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
Days are local calendar days in your machine's time zone (or `--tz`). The
|
|
542
|
+
facts are copied into vir's SQLite state first, so the journal survives Claude
|
|
543
|
+
Code deleting transcripts after about 30 days; delete the folder and re-run to
|
|
544
|
+
get the same files back. Edits to journal files are overwritten. Search
|
|
545
|
+
(`vir query`, MCP) and `vir lint` skip the folder: it records work done, it
|
|
546
|
+
isn't knowledge to retrieve.
|
|
547
|
+
|
|
548
|
+
An unfinished task carries over day to day until it's completed, deleted,
|
|
549
|
+
picked up again under the same name in a later session, or left untouched for
|
|
550
|
+
more than 7 days.
|
|
551
|
+
|
|
552
|
+
Limits: Claude Code sessions only (not Codex yet). Commits made with
|
|
553
|
+
`git commit -q`, merges, rebases and commits outside an agent session aren't
|
|
554
|
+
seen. Work finished outside a session keeps carrying until the 7-day limit.
|
|
555
|
+
|
|
495
556
|
## Use vir from any agent (skill)
|
|
496
557
|
|
|
497
558
|
vir ships an [Agent Skills](https://agentskills.io) skill that teaches Claude
|
|
@@ -599,6 +660,8 @@ Located at `~/.vir/config.json`.
|
|
|
599
660
|
| `filterToolCalls` | `moderate` | Tool-output filtering: `aggressive` \| `moderate` \| `off` |
|
|
600
661
|
| `retrievalDiversity`| `0` | MMR diversity (0..1); 0 = pure relevance |
|
|
601
662
|
| `logQueries` | `true` | Log retrievals to `~/.vir/queries.jsonl`; `false` = off |
|
|
663
|
+
| `checkTranscripts` | `false` | After each daemon pass, run `vir audit --transcript` on the oldest unchecked notes |
|
|
664
|
+
| `checkTranscriptsPerRun` | `20` | Notes checked per daemon pass when `checkTranscripts` is on |
|
|
602
665
|
| `embeddingProvider` | (unset) | `ollama` \| `local` \| `none`; unset = auto-detect |
|
|
603
666
|
| `models.classify` | `claude-haiku-5-5` | Classify model (Kie keeps Haiku 4.5) |
|
|
604
667
|
| `models.distill` | `claude-sonnet-5` | Distill model for decision-heavy and large sessions |
|
|
@@ -621,6 +684,7 @@ vault/vir/
|
|
|
621
684
|
topics/ # synthesized topic pages (vir compose)
|
|
622
685
|
projects/ # cross-session project summaries
|
|
623
686
|
summaries/ # weekly/monthly period summaries (derived, never indexed)
|
|
687
|
+
journal/ # daily work journal, YYYY-MM-DD.md (vir journal; never indexed)
|
|
624
688
|
archived/ # deduplicated notes (kept, never deleted)
|
|
625
689
|
```
|
|
626
690
|
|
|
@@ -675,6 +739,7 @@ Shipped:
|
|
|
675
739
|
- [x] Any agent can read your notes: `npx skills add djolex999/vir` (0.25.0)
|
|
676
740
|
- [x] Recurring lessons become reviewed rules: `vir connect` (0.25.0)
|
|
677
741
|
- [x] Codex sessions, and a keyless `codex-cli` provider (0.26.0)
|
|
742
|
+
- [x] Daily work journal from transcripts, no LLM calls: `vir journal` (0.30.0)
|
|
678
743
|
|
|
679
744
|
Not built:
|
|
680
745
|
|
|
@@ -714,6 +779,9 @@ matters, and deposits it somewhere permanent.
|
|
|
714
779
|
Inspired by Andrej Karpathy's LLM Wiki pattern and Uros Pesic's KB Brain
|
|
715
780
|
concept.
|
|
716
781
|
|
|
782
|
+
If vir saves you time, [a coffee on Ko-fi](https://ko-fi.com/djmarkovic) keeps it
|
|
783
|
+
maintained and in step with Claude Code and Codex releases.
|
|
784
|
+
|
|
717
785
|
[GitHub](https://github.com/djolex999) ·
|
|
718
786
|
[LinkedIn](https://www.linkedin.com/in/djmarkovic/) ·
|
|
719
787
|
[npm](https://www.npmjs.com/~djolex999) ·
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { SubscriptionLimitError } from "../pipeline/subscription.js";
|
|
2
|
+
import { runGround } from "./ground.js";
|
|
3
|
+
export const DEFAULT_CHECKS_PER_RUN = 20;
|
|
4
|
+
export async function checkTranscriptsAfterRun(cfg, db, deps) {
|
|
5
|
+
if (cfg.checkTranscripts !== true)
|
|
6
|
+
return { kind: "off" };
|
|
7
|
+
let summary;
|
|
8
|
+
try {
|
|
9
|
+
summary = await runGround(db, { limit: cfg.checkTranscriptsPerRun ?? DEFAULT_CHECKS_PER_RUN }, deps);
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
// An optional step after a finished distill pass: a quota halt or a failed
|
|
13
|
+
// call is logged and retried next pass, never turned into a failed run.
|
|
14
|
+
const reason = err instanceof SubscriptionLimitError
|
|
15
|
+
? `subscription limit: ${err.message}`
|
|
16
|
+
: err instanceof Error
|
|
17
|
+
? err.message
|
|
18
|
+
: String(err);
|
|
19
|
+
deps.log(`transcript check stopped: ${reason}`);
|
|
20
|
+
return { kind: "stopped", reason };
|
|
21
|
+
}
|
|
22
|
+
if (summary.checked > 0 || summary.failed > 0) {
|
|
23
|
+
deps.log(`transcript check: ${summary.checked} checked, ${summary.contradicted} contradicted ` +
|
|
24
|
+
`(${summary.flagged} sent to review), ${summary.unbacked} unbacked, ${summary.failed} failed`);
|
|
25
|
+
}
|
|
26
|
+
return { kind: "checked", summary };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=afterRun.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"afterRun.js","sourceRoot":"","sources":["../../src/audit/afterRun.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAAE,SAAS,EAAuC,MAAM,aAAa,CAAC;AAW7E,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAOzC,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,GAAmB,EACnB,EAAW,EACX,IAAiD;IAEjD,IAAI,GAAG,CAAC,gBAAgB,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC1D,IAAI,OAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,sBAAsB,IAAI,sBAAsB,EAAE,EAAE,IAAI,CAAC,CAAC;IACvG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,2EAA2E;QAC3E,wEAAwE;QACxE,MAAM,MAAM,GACV,GAAG,YAAY,sBAAsB;YACnC,CAAC,CAAC,uBAAuB,GAAG,CAAC,OAAO,EAAE;YACtC,CAAC,CAAC,GAAG,YAAY,KAAK;gBACpB,CAAC,CAAC,GAAG,CAAC,OAAO;gBACb,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,6BAA6B,MAAM,EAAE,CAAC,CAAC;QAChD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,GAAG,CACN,qBAAqB,OAAO,CAAC,OAAO,aAAa,OAAO,CAAC,YAAY,gBAAgB;YACnF,IAAI,OAAO,CAAC,OAAO,qBAAqB,OAAO,CAAC,QAAQ,cAAc,OAAO,CAAC,MAAM,SAAS,CAChG,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { filterToolCalls } from "../pipeline/toolCallFilter.js";
|
|
3
|
+
import { scrub } from "../pipeline/scrubber.js";
|
|
4
|
+
import { trimTranscript } from "../pipeline/distillSession.js";
|
|
5
|
+
import { SubscriptionLimitError } from "../pipeline/subscription.js";
|
|
6
|
+
import { resolveSource } from "../sources/registry.js";
|
|
7
|
+
import { AuditParseError } from "./prompt.js";
|
|
8
|
+
import { contentHash } from "./types.js";
|
|
9
|
+
export function selectGroundRows(rows, grounds, opts, isVerified, transcriptExists = existsSync) {
|
|
10
|
+
const fresh = new Set(grounds.filter((g) => g.fresh).map((g) => g.path));
|
|
11
|
+
const out = [];
|
|
12
|
+
let skippedVerified = 0;
|
|
13
|
+
let skippedFresh = 0;
|
|
14
|
+
let transcriptGone = 0;
|
|
15
|
+
for (const r of rows) {
|
|
16
|
+
if (opts.project !== undefined && r.project !== opts.project)
|
|
17
|
+
continue;
|
|
18
|
+
if (!opts.all && fresh.has(r.path)) {
|
|
19
|
+
skippedFresh += 1;
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (isVerified(r)) {
|
|
23
|
+
skippedVerified += 1;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (!transcriptExists(r.path)) {
|
|
27
|
+
transcriptGone += 1;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
out.push(r);
|
|
31
|
+
}
|
|
32
|
+
// Oldest first: their transcripts are the next the agent prunes, so a
|
|
33
|
+
// --limit (and the daemon's per-pass cap) spends on what is about to be lost.
|
|
34
|
+
out.sort((a, b) => {
|
|
35
|
+
if (a.startedAt === b.startedAt)
|
|
36
|
+
return 0;
|
|
37
|
+
if (a.startedAt === null)
|
|
38
|
+
return 1;
|
|
39
|
+
if (b.startedAt === null)
|
|
40
|
+
return -1;
|
|
41
|
+
return a.startedAt.localeCompare(b.startedAt);
|
|
42
|
+
});
|
|
43
|
+
const limited = opts.limit !== undefined && opts.limit > 0 ? out.slice(0, opts.limit) : out;
|
|
44
|
+
return { rows: limited, skippedVerified, skippedFresh, transcriptGone };
|
|
45
|
+
}
|
|
46
|
+
// The transcript as the distiller saw it: tool filter, scrub, trim. The same
|
|
47
|
+
// steps as distillOneSession, so the check reads the evidence the note came from.
|
|
48
|
+
export function loadEvidence(sources, path, filterMode) {
|
|
49
|
+
const parsed = resolveSource(sources, path).parse(path, "");
|
|
50
|
+
const scrubbed = scrub(filterToolCalls(parsed.transcriptText, filterMode).filtered);
|
|
51
|
+
return trimTranscript(scrubbed) ?? scrubbed;
|
|
52
|
+
}
|
|
53
|
+
export function buildGroundPrompt(note, transcript) {
|
|
54
|
+
return `You are checking one note in a developer's knowledge base against the session transcript it was written from. The note is fed back to coding agents as trusted memory, so a claim the transcript does not back is worse than no note.
|
|
55
|
+
|
|
56
|
+
<transcript>
|
|
57
|
+
${transcript}
|
|
58
|
+
</transcript>
|
|
59
|
+
|
|
60
|
+
<note>
|
|
61
|
+
${note}
|
|
62
|
+
</note>
|
|
63
|
+
|
|
64
|
+
Go through every factual claim in the note: what was decided and why, what broke and what fixed it, file, function, config and command names, numbers, versions, and the order things happened in. For each, find what the transcript says about it.
|
|
65
|
+
|
|
66
|
+
- A claim is supported when the transcript states it, or it follows directly from what the transcript shows. Paraphrase and summary are fine.
|
|
67
|
+
- A claim is a problem when the transcript contradicts it (a different cause, fix, name, number or outcome), or when nothing in the transcript backs it (an invented detail, a guess written as fact, a fix the session tried that did not work presented as the fix).
|
|
68
|
+
- A note is a summary. Skipping failed attempts, dead ends or intermediate errors on the way to the outcome is not a problem. It is a problem only when the note presents as the cause, fix or result something the transcript shows was not.
|
|
69
|
+
- Generic advice in the note is not a claim about the session; ignore it here.
|
|
70
|
+
- If the transcript has an "omitted" marker, or a tool result is shown truncated or filtered, a claim that could come from the missing part is ok, not unbacked.
|
|
71
|
+
- Paths in the transcript may be shortened (home directory as ~). A path that matches up to that shortening is supported.
|
|
72
|
+
|
|
73
|
+
Reply with JSON only, one finding per claim you looked at closely. Write "transcript" first and decide "status" from it:
|
|
74
|
+
{"findings": [{"claim": "the note's claim", "transcript": "what the transcript actually shows", "status": "ok" | "contradicted" | "unbacked"}]}
|
|
75
|
+
- ok: supported, a fair summary, borderline, or you corrected yourself while checking. When unsure, ok.
|
|
76
|
+
- contradicted: the transcript shows something different.
|
|
77
|
+
- unbacked: nothing in the transcript supports it.
|
|
78
|
+
Keep each field under 25 words. An empty list means every claim is ok.`;
|
|
79
|
+
}
|
|
80
|
+
const PROBLEM_STATUSES = new Set(["contradicted", "unbacked"]);
|
|
81
|
+
export function parseGroundResponse(text) {
|
|
82
|
+
const match = text.match(/\{[\s\S]*\}/);
|
|
83
|
+
if (!match)
|
|
84
|
+
throw new AuditParseError("transcript check response has no JSON object");
|
|
85
|
+
let raw;
|
|
86
|
+
try {
|
|
87
|
+
raw = JSON.parse(match[0]);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
throw new AuditParseError("transcript check response JSON does not parse");
|
|
91
|
+
}
|
|
92
|
+
if (typeof raw !== "object" || raw === null) {
|
|
93
|
+
throw new AuditParseError("transcript check response is not an object");
|
|
94
|
+
}
|
|
95
|
+
const findings = raw.findings;
|
|
96
|
+
if (!Array.isArray(findings))
|
|
97
|
+
throw new AuditParseError("transcript check response has no findings list");
|
|
98
|
+
// The verdict is derived here, never taken from the model: models list
|
|
99
|
+
// claims they then judge fine, so only a contradicted/unbacked status counts.
|
|
100
|
+
const problems = findings.flatMap((p) => {
|
|
101
|
+
if (typeof p !== "object" || p === null)
|
|
102
|
+
return [];
|
|
103
|
+
const e = p;
|
|
104
|
+
if (typeof e.status !== "string" || !PROBLEM_STATUSES.has(e.status))
|
|
105
|
+
return [];
|
|
106
|
+
const claim = typeof e.claim === "string" ? e.claim.trim() : "";
|
|
107
|
+
const transcript = typeof e.transcript === "string" ? e.transcript.trim() : "";
|
|
108
|
+
return claim === "" ? [] : [{ claim, status: e.status, transcript }];
|
|
109
|
+
});
|
|
110
|
+
// Contradictions first: they are what a reviewer acts on.
|
|
111
|
+
problems.sort((a, b) => Number(b.status === "contradicted") - Number(a.status === "contradicted"));
|
|
112
|
+
const verdict = problems.some((p) => p.status === "contradicted")
|
|
113
|
+
? "contradicted"
|
|
114
|
+
: problems.length > 0
|
|
115
|
+
? "unbacked"
|
|
116
|
+
: "supported";
|
|
117
|
+
return { verdict, problems };
|
|
118
|
+
}
|
|
119
|
+
export function formatGroundReason(problems) {
|
|
120
|
+
return problems
|
|
121
|
+
.map((p) => `${p.status}: ${p.claim}${p.transcript === "" ? "" : ` (transcript: ${p.transcript})`}`)
|
|
122
|
+
.join("; ");
|
|
123
|
+
}
|
|
124
|
+
// Only contradicted notes go to the `vir review --audited` queue: on real notes
|
|
125
|
+
// "unbacked" was mostly claims from truncated tool output, while contradictions
|
|
126
|
+
// were real errors (a wrong count, a bug that never happened). They go as
|
|
127
|
+
// verify, unless a fresh verdict already sends them out (reject or merge).
|
|
128
|
+
function shouldFlagForReview(existing) {
|
|
129
|
+
if (existing === undefined || !existing.fresh)
|
|
130
|
+
return true;
|
|
131
|
+
return existing.verdict === "keep" || existing.verdict === "verify";
|
|
132
|
+
}
|
|
133
|
+
export async function runGround(db, opts, deps) {
|
|
134
|
+
const now = deps.now ?? (() => new Date().toISOString());
|
|
135
|
+
const picked = selectGroundRows(db.listDistilled(), db.listGrounds(), opts, deps.isVerified, deps.transcriptExists);
|
|
136
|
+
const audits = new Map(db.listAudits().map((a) => [a.path, a]));
|
|
137
|
+
const summary = {
|
|
138
|
+
checked: 0,
|
|
139
|
+
supported: 0,
|
|
140
|
+
unbacked: 0,
|
|
141
|
+
contradicted: 0,
|
|
142
|
+
flagged: 0,
|
|
143
|
+
skippedVerified: picked.skippedVerified,
|
|
144
|
+
skippedFresh: picked.skippedFresh,
|
|
145
|
+
transcriptGone: picked.transcriptGone,
|
|
146
|
+
failed: 0,
|
|
147
|
+
};
|
|
148
|
+
for (const [i, row] of picked.rows.entries()) {
|
|
149
|
+
deps.onProgress?.(i, picked.rows.length);
|
|
150
|
+
let result;
|
|
151
|
+
try {
|
|
152
|
+
result = parseGroundResponse(await deps.llm(buildGroundPrompt(row.content, deps.evidence(row.path))));
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
if (err instanceof SubscriptionLimitError)
|
|
156
|
+
throw err;
|
|
157
|
+
if (!(err instanceof AuditParseError))
|
|
158
|
+
throw err;
|
|
159
|
+
summary.failed += 1;
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const hash = contentHash(row.content);
|
|
163
|
+
const reason = formatGroundReason(result.problems);
|
|
164
|
+
db.recordGround(row.path, { verdict: result.verdict, reason, contentHash: hash }, now());
|
|
165
|
+
summary.checked += 1;
|
|
166
|
+
summary[result.verdict] += 1;
|
|
167
|
+
if (result.verdict !== "contradicted")
|
|
168
|
+
continue;
|
|
169
|
+
if (shouldFlagForReview(audits.get(row.path))) {
|
|
170
|
+
db.recordAudit(row.path, { verdict: "verify", reason: `transcript check: ${reason}`, mergeInto: null, contentHash: hash }, now());
|
|
171
|
+
summary.flagged += 1;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return summary;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=ground.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ground.js","sourceRoot":"","sources":["../../src/audit/ground.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/audit.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import confirm from "@inquirer/confirm";
|
|
2
2
|
import { loadConfig } from "../config.js";
|
|
3
|
+
import { loadEvidence, runGround, selectGroundRows, } from "../audit/ground.js";
|
|
4
|
+
import { buildSources } from "../sources/registry.js";
|
|
5
|
+
import { checkTranscriptsAfterRun } from "../audit/afterRun.js";
|
|
6
|
+
import { appendRunLog } from "../pipeline/run.js";
|
|
3
7
|
import { callLLM, maybeAnthropicClient, normalizeModelName, resolveModelShorthand, withRateLimitRetry, } from "../pipeline/distiller.js";
|
|
4
8
|
import { applyAuditRejects, previewRejects } from "../audit/apply.js";
|
|
5
9
|
import { batchByProject } from "../audit/batch.js";
|
|
@@ -10,6 +14,13 @@ import * as ui from "../ui/display.js";
|
|
|
10
14
|
import { estCostLabel } from "./costLabel.js";
|
|
11
15
|
import { withPipelineLock } from "./guards.js";
|
|
12
16
|
export async function auditCommand(opts) {
|
|
17
|
+
if (opts.transcript && opts.applyRejects) {
|
|
18
|
+
ui.header("audit");
|
|
19
|
+
ui.blank();
|
|
20
|
+
ui.row(ui.errorColor(ui.CROSS), ui.text("--transcript and --apply-rejects are separate steps; run one at a time"));
|
|
21
|
+
process.exitCode = 1;
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
13
24
|
const limit = parseLimitOption(opts.limit);
|
|
14
25
|
if (limit === null) {
|
|
15
26
|
ui.header("audit");
|
|
@@ -60,6 +71,10 @@ export async function auditCommand(opts) {
|
|
|
60
71
|
const auditOpts = { project: opts.project, limit, all: opts.all };
|
|
61
72
|
const isVerified = (r) => noteIsVerified(root, r);
|
|
62
73
|
const model = normalizeModelName(resolveModelShorthand(opts.model ?? cfg.models.distill), cfg.provider);
|
|
74
|
+
if (opts.transcript) {
|
|
75
|
+
await transcriptCheck(cfg, db, auditOpts, isVerified, model, opts);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
63
78
|
const picked = selectAuditRows(db.listDistilled(), db.listAudits(), auditOpts, isVerified);
|
|
64
79
|
const batches = batchByProject(picked.rows);
|
|
65
80
|
const inputTokens = Math.ceil(picked.rows.reduce((n, r) => n + r.content.length, 0) / 4 + batches.length * 600);
|
|
@@ -133,4 +148,113 @@ export async function auditCommand(opts) {
|
|
|
133
148
|
db.close();
|
|
134
149
|
}
|
|
135
150
|
}
|
|
151
|
+
async function transcriptCheck(cfg, db, groundOpts, isVerified, model, opts) {
|
|
152
|
+
const sources = buildSources(cfg);
|
|
153
|
+
const evidence = (path) => loadEvidence(sources, path, cfg.filterToolCalls);
|
|
154
|
+
const picked = selectGroundRows(db.listDistilled(), db.listGrounds(), groundOpts, isVerified);
|
|
155
|
+
// Free: parse each transcript once for the estimate. The text is dropped and
|
|
156
|
+
// read again during the run, so memory stays at one transcript at a time.
|
|
157
|
+
const sp = picked.rows.length > 0 ? ui.spinner(`reading ${picked.rows.length} transcripts`).start() : null;
|
|
158
|
+
let evidenceChars = 0;
|
|
159
|
+
for (const r of picked.rows)
|
|
160
|
+
evidenceChars += evidence(r.path).length;
|
|
161
|
+
sp?.stop();
|
|
162
|
+
const inputTokens = Math.ceil(evidenceChars / 3 + picked.rows.reduce((n, r) => n + r.content.length, 0) / 4 + picked.rows.length * 500);
|
|
163
|
+
const outputTokens = picked.rows.length * 150;
|
|
164
|
+
const estCost = estCostLabel(cfg, model, inputTokens, outputTokens);
|
|
165
|
+
ui.header("audit --transcript");
|
|
166
|
+
ui.blank();
|
|
167
|
+
ui.summary({
|
|
168
|
+
notes: { value: picked.rows.length, color: ui.info },
|
|
169
|
+
"already checked": { value: picked.skippedFresh, color: ui.muted },
|
|
170
|
+
verified: { value: picked.skippedVerified, color: ui.muted },
|
|
171
|
+
"transcript gone": { value: picked.transcriptGone, color: picked.transcriptGone > 0 ? ui.warn : ui.muted },
|
|
172
|
+
model: { value: model, color: ui.accent },
|
|
173
|
+
"est. cost": { value: estCost, color: ui.warn },
|
|
174
|
+
});
|
|
175
|
+
ui.divider();
|
|
176
|
+
if (picked.transcriptGone > 0) {
|
|
177
|
+
ui.line(ui.dim(` ${picked.transcriptGone} note(s) can no longer be checked: the agent pruned their transcripts`));
|
|
178
|
+
}
|
|
179
|
+
if (picked.rows.length === 0) {
|
|
180
|
+
ui.row(ui.success(ui.CHECK), ui.text("nothing to check"));
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if (opts.dryRun) {
|
|
184
|
+
ui.line(ui.dim(" dry run — no model calls made"));
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (opts.yes !== true) {
|
|
188
|
+
const proceed = await confirm({
|
|
189
|
+
message: `check ${picked.rows.length} notes against their transcripts with ${model} (~${estCost})?`,
|
|
190
|
+
default: true,
|
|
191
|
+
});
|
|
192
|
+
if (!proceed) {
|
|
193
|
+
ui.line(ui.dim("aborted"));
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const llm = groundLlm(cfg, model);
|
|
198
|
+
let summary;
|
|
199
|
+
await withPipelineLock(async () => {
|
|
200
|
+
const run = ui.spinner(`checking ${picked.rows.length} notes`).start();
|
|
201
|
+
try {
|
|
202
|
+
summary = await runGround(db, groundOpts, {
|
|
203
|
+
isVerified,
|
|
204
|
+
evidence,
|
|
205
|
+
onProgress: (done, total) => {
|
|
206
|
+
run.text = ui.dim(`checking notes ${done + 1}/${total}`);
|
|
207
|
+
},
|
|
208
|
+
llm,
|
|
209
|
+
});
|
|
210
|
+
run.stop();
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
run.fail(ui.errorColor(err.message));
|
|
214
|
+
process.exitCode = 1;
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
if (summary === undefined)
|
|
218
|
+
return;
|
|
219
|
+
ui.summary({
|
|
220
|
+
checked: { value: summary.checked, color: ui.info },
|
|
221
|
+
supported: { value: summary.supported, color: ui.success },
|
|
222
|
+
unbacked: { value: summary.unbacked, color: summary.unbacked > 0 ? ui.warn : ui.muted },
|
|
223
|
+
contradicted: { value: summary.contradicted, color: summary.contradicted > 0 ? ui.errorColor : ui.muted },
|
|
224
|
+
"sent to review": { value: summary.flagged, color: summary.flagged > 0 ? ui.warn : ui.muted },
|
|
225
|
+
failed: { value: summary.failed, color: summary.failed > 0 ? ui.errorColor : ui.muted },
|
|
226
|
+
});
|
|
227
|
+
ui.line(ui.dim(" nothing was moved — walk the flagged notes with `vir review --audited`"));
|
|
228
|
+
if (summary.failed > 0)
|
|
229
|
+
process.exitCode = 1;
|
|
230
|
+
}
|
|
231
|
+
function groundLlm(cfg, model) {
|
|
232
|
+
const client = maybeAnthropicClient(cfg);
|
|
233
|
+
return (prompt) => withRateLimitRetry(() => callLLM(cfg, client, {
|
|
234
|
+
prompt,
|
|
235
|
+
model,
|
|
236
|
+
maxTokens: 4000,
|
|
237
|
+
cost: { stage: "audit-transcript" },
|
|
238
|
+
}));
|
|
239
|
+
}
|
|
240
|
+
// Called by `vir run --daemon` after a finished pass, inside its lock. A no-op
|
|
241
|
+
// unless config.checkTranscripts is on.
|
|
242
|
+
export async function transcriptCheckAfterPass(cfg) {
|
|
243
|
+
if (cfg.checkTranscripts !== true)
|
|
244
|
+
return;
|
|
245
|
+
const db = new StateDb();
|
|
246
|
+
try {
|
|
247
|
+
const root = vaultRoot(cfg);
|
|
248
|
+
const sources = buildSources(cfg);
|
|
249
|
+
await checkTranscriptsAfterRun(cfg, db, {
|
|
250
|
+
llm: groundLlm(cfg, normalizeModelName(resolveModelShorthand(cfg.models.distill), cfg.provider)),
|
|
251
|
+
isVerified: (r) => noteIsVerified(root, r),
|
|
252
|
+
evidence: (path) => loadEvidence(sources, path, cfg.filterToolCalls),
|
|
253
|
+
log: appendRunLog,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
finally {
|
|
257
|
+
db.close();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
136
260
|
//# sourceMappingURL=audit.js.map
|
package/dist/cli/audit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/cli/audit.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/cli/audit.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAe,MAAM,cAAc,CAAC;AACvD,OAAO,EACL,YAAY,EACZ,SAAS,EACT,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,OAAO,EACP,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,QAAQ,EACR,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAqB,MAAM,gBAAgB,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IASK;IAEL,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACzC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC,CAAC;QACnH,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,4CAA4C,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAE5B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,cAAc,CAClD,EAAE,CAAC,aAAa,EAAE,EAClB,EAAE,CAAC,UAAU,EAAE,EACf,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,EAC9B,IAAI,CAAC,OAAO,CACb,CAAC;YACF,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,EAAE,CAAC,OAAO,CAAC;gBACT,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,EAAE;gBACxD,mBAAmB,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE;aACjG,CAAC,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACjH,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;gBAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;YAChF,EAAE,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACxC,IAAI,IAAI,CAAC,MAAM;oBAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;gBAC9D,OAAO;YACT,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;gBACtB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1G,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;oBAC3B,OAAO;gBACT,CAAC;YACH,CAAC;YACD,MAAM,CAAC,GAAG,iBAAiB,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,EAAE,CAAC,OAAO,CAAC;gBACT,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;gBACzC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE;gBACzD,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE;gBAC9E,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE;aAC5E,CAAC,CAAC;YACH,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC,CAAC;YACzE,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QAClE,MAAM,UAAU,GAAG,CAAC,CAAe,EAAW,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,kBAAkB,CAC9B,qBAAqB,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EACvD,GAAG,CAAC,QAAQ,CACb,CAAC;QAEF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,eAAe,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC3F,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAC3B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,CACjF,CAAC;QACF,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;QAEpE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,CAAC,OAAO,CAAC;YACT,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;YACpD,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;YAClD,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE;YAClE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE;YAC5D,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE;YACzC,WAAW,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;SAChD,CAAC,CAAC;QACH,EAAE,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,MAAM,eAAe,KAAK,MAAM,OAAO,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5H,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACzC,oEAAoE;QACpE,4CAA4C;QAC5C,IAAI,OAAyD,CAAC;QAC9D,MAAM,gBAAgB,CAAC,KAAK,IAAI,EAAE;YAChC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC;YACpE,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE;oBACtC,UAAU;oBACV,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CACd,kBAAkB,CAAC,GAAG,EAAE,CACtB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE;wBACnB,MAAM;wBACN,KAAK;wBACL,SAAS,EAAE,IAAI;wBACf,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;qBACzB,CAAC,CACH;iBACJ,CAAC,CAAC;gBACH,EAAE,CAAC,IAAI,EAAE,CAAC;YACZ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC/C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO;QAElC,EAAE,CAAC,OAAO,CAAC;YACT,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;YACnD,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE;YAC1D,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;YAC3D,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;YACzD,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,EAAE;YACjE,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE;YAC1D,gBAAgB,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE;SAChH,CAAC,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC,CAAC;QAC5F,IAAI,OAAO,CAAC,aAAa,GAAG,CAAC;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtD,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AAEH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,GAAW,EACX,EAAW,EACX,UAAyB,EACzB,UAAwC,EACxC,KAAa,EACb,IAAyC;IAEzC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;IAC5F,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAE9F,6EAA6E;IAC7E,0EAA0E;IAC1E,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3G,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI;QAAE,aAAa,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IACtE,EAAE,EAAE,IAAI,EAAE,CAAC;IACX,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAC3B,aAAa,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CACzG,CAAC;IACF,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;IAC9C,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAEpE,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,EAAE,CAAC,OAAO,CAAC;QACT,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;QACpD,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE;QAClE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE;QAC5D,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE;QAC1G,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE;QACzC,WAAW,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;KAChD,CAAC,CAAC;IACH,EAAE,CAAC,OAAO,EAAE,CAAC;IACb,IAAI,MAAM,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,cAAc,uEAAuE,CAAC,CAAC,CAAC;IACrH,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC;YAC5B,OAAO,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,MAAM,yCAAyC,KAAK,MAAM,OAAO,IAAI;YACnG,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClC,IAAI,OAAkC,CAAC;IACvC,MAAM,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAChC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;QACvE,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE;gBACxC,UAAU;gBACV,QAAQ;gBACR,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;oBAC1B,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,kBAAkB,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;gBAC3D,CAAC;gBACD,GAAG;aACJ,CAAC,CAAC;YACH,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO;IAElC,EAAE,CAAC,OAAO,CAAC;QACT,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;QACnD,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE;QAC1D,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE;QACvF,YAAY,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE;QACzG,gBAAgB,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE;QAC7F,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE;KACxF,CAAC,CAAC;IACH,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC,CAAC;IAC5F,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,KAAa;IAC3C,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,CAAC,MAAM,EAAE,EAAE,CAChB,kBAAkB,CAAC,GAAG,EAAE,CACtB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE;QACnB,MAAM;QACN,KAAK;QACL,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE;KACpC,CAAC,CACH,CAAC;AACN,CAAC;AAED,+EAA+E;AAC/E,wCAAwC;AACxC,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,GAAW;IACxD,IAAI,GAAG,CAAC,gBAAgB,KAAK,IAAI;QAAE,OAAO;IAC1C,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,wBAAwB,CAAC,GAAG,EAAE,EAAE,EAAE;YACtC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,kBAAkB,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChG,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1C,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,eAAe,CAAC;YACpE,GAAG,EAAE,YAAY;SAClB,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
|
package/dist/cli/initConfig.js
CHANGED
|
@@ -39,6 +39,9 @@ export function buildInitConfig(existing, a) {
|
|
|
39
39
|
logQueries: existing?.logQueries,
|
|
40
40
|
// Wizard-silent connect-pass knob.
|
|
41
41
|
connectMaxCandidates: existing?.connectMaxCandidates,
|
|
42
|
+
// Wizard-silent daemon transcript check (opt-in, costs a call per note).
|
|
43
|
+
checkTranscripts: existing?.checkTranscripts,
|
|
44
|
+
checkTranscriptsPerRun: existing?.checkTranscriptsPerRun,
|
|
42
45
|
// Migration marker: saveConfig stamps the current version anyway; carried
|
|
43
46
|
// so a built config never reads as pre-migration.
|
|
44
47
|
configVersion: existing?.configVersion,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initConfig.js","sourceRoot":"","sources":["../../src/cli/initConfig.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"initConfig.js","sourceRoot":"","sources":["../../src/cli/initConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { loadConfig } from "../config.js";
|
|
2
|
+
import { dayOf } from "../journal/render.js";
|
|
3
|
+
import { ingestJournal, journalDays, loadJournalSessions, renderJournalDay, writeJournalDay, } from "../journal/run.js";
|
|
4
|
+
import { StateDb } from "../state/db.js";
|
|
5
|
+
import * as ui from "../ui/display.js";
|
|
6
|
+
import { withPipelineLock } from "./guards.js";
|
|
7
|
+
const DAY_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
8
|
+
function validTimeZone(tz) {
|
|
9
|
+
try {
|
|
10
|
+
new Intl.DateTimeFormat("en-CA", { timeZone: tz });
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export async function cmdJournal(date, opts) {
|
|
18
|
+
const timeZone = opts.tz ?? Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
19
|
+
const fail = (msg) => {
|
|
20
|
+
ui.row(ui.warn(ui.WARN_GLYPH), ui.text(msg));
|
|
21
|
+
process.exitCode = 1;
|
|
22
|
+
};
|
|
23
|
+
if (!validTimeZone(timeZone))
|
|
24
|
+
return fail(`unknown time zone: ${timeZone}`);
|
|
25
|
+
for (const d of [date, opts.since]) {
|
|
26
|
+
if (d !== undefined && !DAY_RE.test(d))
|
|
27
|
+
return fail(`expected YYYY-MM-DD, got ${d}`);
|
|
28
|
+
}
|
|
29
|
+
if ([date !== undefined, opts.since !== undefined, opts.all === true].filter(Boolean).length > 1) {
|
|
30
|
+
return fail("use one of: a date, --since, --all");
|
|
31
|
+
}
|
|
32
|
+
await withPipelineLock(async () => {
|
|
33
|
+
const cfg = loadConfig();
|
|
34
|
+
const db = new StateDb();
|
|
35
|
+
try {
|
|
36
|
+
const ingest = ingestJournal(cfg, db);
|
|
37
|
+
const sessions = loadJournalSessions(cfg, db);
|
|
38
|
+
const today = dayOf(new Date().toISOString(), timeZone) ?? "";
|
|
39
|
+
const all = journalDays(sessions, timeZone);
|
|
40
|
+
const days = opts.all === true
|
|
41
|
+
? all
|
|
42
|
+
: opts.since !== undefined
|
|
43
|
+
? all.filter((d) => d >= opts.since)
|
|
44
|
+
: [date ?? today];
|
|
45
|
+
let written = 0;
|
|
46
|
+
let unchanged = 0;
|
|
47
|
+
for (const day of days) {
|
|
48
|
+
const body = renderJournalDay(sessions, db, day, timeZone);
|
|
49
|
+
if (body === null)
|
|
50
|
+
continue;
|
|
51
|
+
if (opts.stdout === true) {
|
|
52
|
+
process.stdout.write(body);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (writeJournalDay(cfg, day, body) === "written")
|
|
56
|
+
written += 1;
|
|
57
|
+
else
|
|
58
|
+
unchanged += 1;
|
|
59
|
+
}
|
|
60
|
+
if (opts.stdout === true)
|
|
61
|
+
return;
|
|
62
|
+
ui.row(ui.success(ui.CHECK), ui.text(`${written} day(s) written, ${unchanged} unchanged · ${ingest.parsed} of ${ingest.scanned} transcript(s) parsed`));
|
|
63
|
+
if (ingest.failed > 0)
|
|
64
|
+
ui.row(ui.warn(ui.WARN_GLYPH), ui.text(`${ingest.failed} transcript(s) could not be read`));
|
|
65
|
+
if (written + unchanged === 0)
|
|
66
|
+
ui.row(ui.dim(ui.BULLET), ui.dim(`no activity for ${date ?? today}`));
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
db.close();
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=journal.js.map
|