@wirecat/cli-memo 0.131.65 → 0.131.67
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/dist/bin/memo.js +2 -2
- package/dist/bundle/{all-profiles-L6EBORCV.js → all-profiles-W3GRNNLJ.js} +9 -9
- package/dist/bundle/{anthropic-42PADP4V.js → anthropic-GWMYHBO4.js} +5 -5
- package/dist/bundle/{app-server-7KM4MSDA.js → app-server-RQ26EXNI.js} +42 -42
- package/dist/bundle/auto-FR6LX5KO.js +85 -0
- package/dist/bundle/{bun-NYSNYHAD.js → bun-KKLPQTG5.js} +2 -2
- package/dist/bundle/{bun-sqlite-B46U7KI7.js → bun-sqlite-WKIZJNTG.js} +5 -5
- package/dist/bundle/{chunk-724DPWN6.js → chunk-32ROGX5N.js} +2 -2
- package/dist/bundle/{chunk-YLG2M2TF.js → chunk-4C6RU7DG.js} +7 -7
- package/dist/bundle/{chunk-ZUQXDJ7A.js → chunk-4JTCNMW6.js} +1 -1
- package/dist/bundle/{chunk-5D7BPC33.js → chunk-6SFTVGNL.js} +1 -1
- package/dist/bundle/{chunk-FHZKHKBJ.js → chunk-7DANHJF6.js} +37 -35
- package/dist/bundle/{chunk-V7TJSYFK.js → chunk-7IKET6ES.js} +2 -2
- package/dist/bundle/{chunk-FWRBJAQZ.js → chunk-7KYVUVDS.js} +3 -3
- package/dist/bundle/{chunk-QTF4ZXOL.js → chunk-7OMKWYFN.js} +38 -15
- package/dist/bundle/{chunk-TKPIS4G2.js → chunk-AGNWFOAJ.js} +1 -1
- package/dist/bundle/{chunk-37E74SKW.js → chunk-BOOEDDVY.js} +86 -72
- package/dist/bundle/{chunk-ACG5QN77.js → chunk-CQNYBTWP.js} +3 -3
- package/dist/bundle/{chunk-K5VF47E2.js → chunk-DNDELSVT.js} +6 -6
- package/dist/bundle/{chunk-347UBASY.js → chunk-DNS2QWK3.js} +4 -4
- package/dist/bundle/{chunk-IK6KH3RE.js → chunk-DSU6UR2X.js} +1 -1
- package/dist/bundle/{chunk-2XVXF4RW.js → chunk-ECMYCWG2.js} +3 -3
- package/dist/bundle/{chunk-NRHF7TQ4.js → chunk-FBSHWCIZ.js} +11 -11
- package/dist/bundle/{chunk-3SCHFNUH.js → chunk-GHN2KYMO.js} +23 -23
- package/dist/bundle/{chunk-SOQGV3ZM.js → chunk-GJ3P7RJF.js} +6 -6
- package/dist/bundle/{chunk-I5L7MLZ6.js → chunk-GU3MRYK2.js} +1 -1
- package/dist/bundle/{chunk-VX4HNQLN.js → chunk-GUWRR7F2.js} +3 -3
- package/dist/bundle/{chunk-RCGFSWZE.js → chunk-HE2F4JII.js} +8 -8
- package/dist/bundle/{chunk-XVREIQ2N.js → chunk-HUPZ6XYH.js} +2 -2
- package/dist/bundle/{chunk-3YNJBKGV.js → chunk-IKZBO7NV.js} +1488 -1150
- package/dist/bundle/{chunk-X5CRFU4E.js → chunk-JEKIBI7P.js} +7 -7
- package/dist/bundle/{chunk-RLX5SC2X.js → chunk-JG7EDH7K.js} +1 -1
- package/dist/bundle/{chunk-6G53ZFUT.js → chunk-L62FWN3Y.js} +1 -1
- package/dist/bundle/{chunk-ASWLM74P.js → chunk-LJCT7YG6.js} +4 -4
- package/dist/bundle/{chunk-FUIUS3IG.js → chunk-MCA265JM.js} +8 -2
- package/dist/bundle/{chunk-FG4Q6T72.js → chunk-MLF5FLAP.js} +5 -5
- package/dist/bundle/{chunk-RP6VV35S.js → chunk-NNUJWCEJ.js} +2 -2
- package/dist/bundle/{chunk-LVLFLWGY.js → chunk-ORKWFXWV.js} +12 -12
- package/dist/bundle/{chunk-RGZUDHAQ.js → chunk-OU4PN7PF.js} +8 -8
- package/dist/bundle/{chunk-DKO7WEXJ.js → chunk-OUSLPKWY.js} +2 -2
- package/dist/bundle/{chunk-UXAP7MNL.js → chunk-PBOVHHYG.js} +9 -9
- package/dist/bundle/{chunk-DXTNBVLV.js → chunk-Q4JYHQ47.js} +10872 -10868
- package/dist/bundle/{chunk-4GTZSCUE.js → chunk-QCWA3JUT.js} +3 -3
- package/dist/bundle/{chunk-NZJUMLTD.js → chunk-QFSMJTEA.js} +2 -2
- package/dist/bundle/{chunk-NH3A5QTW.js → chunk-QMTCYKAA.js} +9 -8
- package/dist/bundle/{chunk-RTLQHLHG.js → chunk-R4H5HSQZ.js} +4 -4
- package/dist/bundle/{chunk-ML46T7UC.js → chunk-SKBDI7LU.js} +30 -30
- package/dist/bundle/{chunk-SIBQ34LX.js → chunk-SUCG5HBF.js} +1 -1
- package/dist/bundle/{chunk-FKUA3BTM.js → chunk-TFAUB6JO.js} +1545 -603
- package/dist/bundle/{chunk-VLUDHCCX.js → chunk-TNHFKR6P.js} +23 -23
- package/dist/bundle/{chunk-C4DJLVJQ.js → chunk-TPYXULNG.js} +8 -8
- package/dist/bundle/{chunk-B3SERZMP.js → chunk-TQXXOUOX.js} +1 -1
- package/dist/bundle/{chunk-6OS7PTOC.js → chunk-TWTAWPC7.js} +131 -38
- package/dist/bundle/{chunk-FH4P5UQA.js → chunk-TXWVZVDK.js} +4 -4
- package/dist/bundle/{chunk-EMNQPMZO.js → chunk-UUBV5ATQ.js} +22 -20
- package/dist/bundle/{chunk-EBDX6DNB.js → chunk-V3JOIUVB.js} +4 -4
- package/dist/bundle/{chunk-VTKLHYCZ.js → chunk-VUCD4DAQ.js} +4 -4
- package/dist/bundle/{chunk-BEMVAPYA.js → chunk-VVTC2YAX.js} +6 -6
- package/dist/bundle/{chunk-SIJA2UYC.js → chunk-W7FYMZOW.js} +7 -7
- package/dist/bundle/{chunk-HKC7GDJD.js → chunk-WJ2OYD2D.js} +6 -6
- package/dist/bundle/{chunk-A524HPDV.js → chunk-XI5UABKO.js} +2 -2
- package/dist/bundle/{chunk-NIJZXGJN.js → chunk-XK4VVGMH.js} +4 -4
- package/dist/bundle/{chunk-PKUBC2ME.js → chunk-XVPMSMSP.js} +4 -4
- package/dist/bundle/{chunk-SIOUPPN7.js → chunk-XYL7GDCX.js} +6 -6
- package/dist/bundle/{chunk-FC5PK6M6.js → chunk-YAFSD345.js} +13 -13
- package/dist/bundle/{chunk-PVGK67AJ.js → chunk-ZNBLWLCD.js} +198 -159
- package/dist/bundle/{chunk-MWAXS4BX.js → chunk-ZOIW2YEU.js} +14 -10
- package/dist/bundle/{chunk-4ZW6ZJ2V.js → chunk-ZTONSM5X.js} +2 -2
- package/dist/bundle/{chunk-QHNAPLVB.js → chunk-ZU6HZLZP.js} +45 -45
- package/dist/bundle/{chunk-4SUROBD4.js → chunk-ZVXXJYNW.js} +4 -4
- package/dist/bundle/command-contract-46BU5YKL.js +32 -0
- package/dist/bundle/{decode-2Z4GCIGA.js → decode-KRVQZPSB.js} +5 -5
- package/dist/bundle/{dispatch-CRYB6Q2V.js → dispatch-VJSUBAUM.js} +8 -8
- package/dist/bundle/{echarts-JADCSUD7.js → echarts-O6QQRVZE.js} +2 -2
- package/dist/bundle/{embed-ZLEPINEK.js → embed-DA4H2F4F.js} +6 -6
- package/dist/bundle/{embedder-E3DHPZCK.js → embedder-HWAFLIYM.js} +9 -9
- package/dist/bundle/{entry-MUE6HWX3.js → entry-DE7GJOIZ.js} +7 -7
- package/dist/bundle/{failure-ZMQJF3RO.js → failure-GLF7OMMM.js} +2 -2
- package/dist/bundle/failure-U3VNIQNX.js +65 -0
- package/dist/bundle/{first-run-3JYWLJCH.js → first-run-GOBPIKQF.js} +11 -11
- package/dist/bundle/first-screen-3V3HWSQM.js +30 -0
- package/dist/bundle/{instructions-ECXOBMWS.js → instructions-GYYMBSZW.js} +1 -1
- package/dist/bundle/mcp-6RDHWRXG.js +90 -0
- package/dist/bundle/{mcp-RKJG22KM.js → mcp-H2WYFBNW.js} +2 -2
- package/dist/bundle/memo.js +16 -16
- package/dist/bundle/{node-A6363DJ4.js → node-R3OFASC5.js} +2 -2
- package/dist/bundle/{node-sqlite-FA2P77PW.js → node-sqlite-DYHDZJ5A.js} +6 -6
- package/dist/bundle/{oauth-DBGARGR7.js → oauth-SMCDSCXQ.js} +7 -7
- package/dist/bundle/{open-5YYG2VWH.js → open-GX7RPGQW.js} +5 -5
- package/dist/bundle/{openai-BPVP7TZ7.js → openai-WM4TRXCC.js} +10 -10
- package/dist/bundle/{process-DGPZRHQA.js → process-NT5OZH2V.js} +1 -1
- package/dist/bundle/{program-RM2L3LIT.js → program-YQ3UT2LI.js} +5748 -4695
- package/dist/bundle/{prompt-NTAZWPWA.js → prompt-5XJNSXCW.js} +5 -5
- package/dist/bundle/{recognize-OGEP5VD3.js → recognize-DQNGZLRX.js} +4 -4
- package/dist/bundle/{remote-DER2PFH6.js → remote-RMRYJZSZ.js} +7 -7
- package/dist/bundle/{rerank-PB5ACFHS.js → rerank-5J6JM43S.js} +7 -7
- package/dist/bundle/{serve-KNEY4BXK.js → serve-4RVWOQVC.js} +9 -9
- package/dist/bundle/server-HH2X6G7V.js +61 -0
- package/dist/bundle/server-MS3JKMGF.js +48 -0
- package/dist/bundle/{server-XKSIHWM2.js → server-NKCRFK26.js} +99 -66
- package/dist/bundle/{state-JMCWHHZM.js → state-MGVPOLPZ.js} +6 -6
- package/dist/bundle/{store-M5QSIRWJ.js → store-IEK4PPOE.js} +19 -13
- package/dist/bundle/store-maintenance-command-GSS2AY4J.js +47 -0
- package/dist/bundle/update-S5XRRWTH.js +68 -0
- package/dist/digest/command.d.ts.map +1 -1
- package/dist/digest/command.js +2 -1
- package/dist/digest/command.js.map +1 -1
- package/dist/digest/digest.d.ts +2 -2
- package/dist/digest/digest.d.ts.map +1 -1
- package/dist/digest/digest.js +36 -2
- package/dist/digest/digest.js.map +1 -1
- package/dist/discovery/command.d.ts.map +1 -1
- package/dist/discovery/command.js +3 -0
- package/dist/discovery/command.js.map +1 -1
- package/dist/examples.d.ts.map +1 -1
- package/dist/examples.js +33 -4
- package/dist/examples.js.map +1 -1
- package/dist/facts/command.d.ts.map +1 -1
- package/dist/facts/command.js +7 -4
- package/dist/facts/command.js.map +1 -1
- package/dist/facts/fact.d.ts +1 -0
- package/dist/facts/fact.d.ts.map +1 -1
- package/dist/facts/fact.js +1 -0
- package/dist/facts/fact.js.map +1 -1
- package/dist/finance/subscriptions-command.js +3 -3
- package/dist/finance/subscriptions-command.js.map +1 -1
- package/dist/knowledge/project-context.d.ts +1 -0
- package/dist/knowledge/project-context.d.ts.map +1 -1
- package/dist/mcp/catalogue.d.ts +3 -0
- package/dist/mcp/catalogue.d.ts.map +1 -1
- package/dist/mcp/catalogue.js +47 -13
- package/dist/mcp/catalogue.js.map +1 -1
- package/dist/memories/command.d.ts.map +1 -1
- package/dist/memories/command.js +9 -5
- package/dist/memories/command.js.map +1 -1
- package/dist/memories/memories.d.ts +6 -3
- package/dist/memories/memories.d.ts.map +1 -1
- package/dist/memories/memories.js +15 -20
- package/dist/memories/memories.js.map +1 -1
- package/dist/memories/memory.d.ts +1 -0
- package/dist/memories/memory.d.ts.map +1 -1
- package/dist/memories/memory.js +1 -0
- package/dist/memories/memory.js.map +1 -1
- package/dist/memories/sources.d.ts +27 -0
- package/dist/memories/sources.d.ts.map +1 -0
- package/dist/memories/sources.js +111 -0
- package/dist/memories/sources.js.map +1 -0
- package/dist/notes/embed.d.ts +2 -0
- package/dist/notes/embed.d.ts.map +1 -1
- package/dist/notes/embed.js +13 -0
- package/dist/notes/embed.js.map +1 -1
- package/dist/notes/files.d.ts.map +1 -1
- package/dist/notes/files.js +2 -0
- package/dist/notes/files.js.map +1 -1
- package/dist/program.d.ts +4 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +44 -1
- package/dist/program.js.map +1 -1
- package/dist/read-only.d.ts +1 -1
- package/dist/reasons.d.ts.map +1 -1
- package/dist/reasons.js +6 -0
- package/dist/reasons.js.map +1 -1
- package/dist/records/import.d.ts.map +1 -1
- package/dist/records/import.js +2 -0
- package/dist/records/import.js.map +1 -1
- package/dist/records/input.d.ts +3 -1
- package/dist/records/input.d.ts.map +1 -1
- package/dist/records/input.js +14 -2
- package/dist/records/input.js.map +1 -1
- package/dist/review/command.d.ts +2 -0
- package/dist/review/command.d.ts.map +1 -1
- package/dist/review/command.js +18 -3
- package/dist/review/command.js.map +1 -1
- package/dist/review/kinds.d.ts +1 -1
- package/dist/review/kinds.d.ts.map +1 -1
- package/dist/review/kinds.js +2 -1
- package/dist/review/kinds.js.map +1 -1
- package/dist/review/review.d.ts +64 -1
- package/dist/review/review.d.ts.map +1 -1
- package/dist/review/review.js +45 -0
- package/dist/review/review.js.map +1 -1
- package/dist/run/import.d.ts +9 -0
- package/dist/run/import.d.ts.map +1 -1
- package/dist/run/import.js +20 -0
- package/dist/run/import.js.map +1 -1
- package/dist/sources/command.d.ts +7 -0
- package/dist/sources/command.d.ts.map +1 -0
- package/dist/sources/command.js +246 -0
- package/dist/sources/command.js.map +1 -0
- package/dist/sources/copy.d.ts +13 -0
- package/dist/sources/copy.d.ts.map +1 -0
- package/dist/sources/copy.js +32 -0
- package/dist/sources/copy.js.map +1 -0
- package/dist/sources/mentions.d.ts +21 -0
- package/dist/sources/mentions.d.ts.map +1 -0
- package/dist/sources/mentions.js +78 -0
- package/dist/sources/mentions.js.map +1 -0
- package/dist/sources/read.d.ts +30 -0
- package/dist/sources/read.d.ts.map +1 -0
- package/dist/sources/read.js +181 -0
- package/dist/sources/read.js.map +1 -0
- package/dist/templates/command.d.ts +5 -0
- package/dist/templates/command.d.ts.map +1 -0
- package/dist/templates/command.js +18 -0
- package/dist/templates/command.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -4
- package/scenarios/project-state.md +2 -2
- package/skills/cli-memo/SKILL.md +9 -0
- package/skills/cli-memo/topics/proposals.md +13 -2
- package/skills/cli-memo/topics/search.md +7 -0
- package/dist/bundle/auto-4KOZDLIU.js +0 -85
- package/dist/bundle/command-contract-PLB2JGFJ.js +0 -32
- package/dist/bundle/failure-CRWMZZBO.js +0 -65
- package/dist/bundle/first-screen-QH34AIFV.js +0 -30
- package/dist/bundle/mcp-QX2D6EXA.js +0 -90
- package/dist/bundle/server-L622PMVC.js +0 -61
- package/dist/bundle/server-SJVP2XXD.js +0 -48
- package/dist/bundle/store-maintenance-command-PQCO5ICC.js +0 -47
- package/dist/bundle/update-PQUASMQN.js +0 -68
- /package/dist/bundle/{chunk-C3XNJQD7.js → chunk-DS7NXKAN.js} +0 -0
- /package/dist/bundle/{chunk-SW6C6WH5.js → chunk-SYWHHQMC.js} +0 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { CliError } from "@wirecat/cli-base";
|
|
3
|
+
import { annotate } from "@wirecat/cli-base/commands";
|
|
4
|
+
import { environmentOf, FETCH, LOCAL_READ, LOCAL_WRITE } from "@wirecat/cli-core/cli";
|
|
5
|
+
import { MAX_TEXT_CHARS } from "@wirecat/cli-core/documents";
|
|
6
|
+
import { addedSourceKeyOf } from "@wirecat/cli-core/store";
|
|
7
|
+
import { InvalidArgumentError } from "commander";
|
|
8
|
+
import { answers, itemAnswer, listAnswer, withStore } from "../answer.js";
|
|
9
|
+
import { byOption, reasonOption, whoRuns } from "../author.js";
|
|
10
|
+
import { loadConfig } from "../config.js";
|
|
11
|
+
import { searchModelPresent } from "../notes/embed.js";
|
|
12
|
+
import { collect } from "../options.js";
|
|
13
|
+
import { subjectOf } from "../people/subject.js";
|
|
14
|
+
import { refuseBareNumber } from "../refs.js";
|
|
15
|
+
import { dropCopy, keepCopy } from "./copy.js";
|
|
16
|
+
import { namedIn } from "./mentions.js";
|
|
17
|
+
import { argumentKind, readFile, readPage, readText, SOURCE_TEXT_CHARS, withNextStep } from "./read.js";
|
|
18
|
+
const SUBJECT_HELP = "who or what it is about: person:, organization:, project:, task:, meeting:, or <messenger>:<name or id>; repeat for more";
|
|
19
|
+
const TEXT_BYTES = 16_384;
|
|
20
|
+
const MAX_TEXT_BYTES = 1_048_576;
|
|
21
|
+
const between = (low, high, what) => (value) => {
|
|
22
|
+
const number = Number(value);
|
|
23
|
+
if (!Number.isInteger(number) || number < low || number > high)
|
|
24
|
+
throw new InvalidArgumentError(`${what}: a whole number, ${low} to ${high}`);
|
|
25
|
+
return number;
|
|
26
|
+
};
|
|
27
|
+
/** The text cut at a character, so its UTF-8 form is at most `bytes`. */
|
|
28
|
+
const boundedText = (text, bytes) => {
|
|
29
|
+
const encoded = Buffer.from(text);
|
|
30
|
+
if (encoded.byteLength <= bytes)
|
|
31
|
+
return { text, truncated: false };
|
|
32
|
+
let cut = encoded.subarray(0, bytes).toString("utf8");
|
|
33
|
+
if (cut.endsWith("�"))
|
|
34
|
+
cut = cut.slice(0, -1);
|
|
35
|
+
return { text: cut, truncated: true };
|
|
36
|
+
};
|
|
37
|
+
const documentRef = async (store, reference) => {
|
|
38
|
+
await refuseBareNumber(store, reference, ["document"]);
|
|
39
|
+
const ref = reference.trim();
|
|
40
|
+
if (!/^document:[1-9]\d*$/.test(ref))
|
|
41
|
+
throw new CliError("validation_error", `${reference} is not a source; give its document:<id>`, {
|
|
42
|
+
reason: "input.invalid",
|
|
43
|
+
});
|
|
44
|
+
return ref;
|
|
45
|
+
};
|
|
46
|
+
const isAgentServer = (command, env) => environmentOf(command).agent !== undefined || env.AI_AGENT === "memo-mcp";
|
|
47
|
+
/** Every findings batch whose evidence cites `ref`; the store lists batches by project only, so all are read. */
|
|
48
|
+
const batchesCiting = async (store, ref) => {
|
|
49
|
+
const found = [];
|
|
50
|
+
for (let offset = 0;; offset += 50) {
|
|
51
|
+
const page = await store.evidenceFindings.list({ limit: 50, offset });
|
|
52
|
+
for (const batch of page.items) {
|
|
53
|
+
const findings = batch.input.findings
|
|
54
|
+
.filter((finding) => finding.evidence.some((evidence) => evidence.reference === ref))
|
|
55
|
+
.map((finding) => finding.id);
|
|
56
|
+
if (findings.length > 0)
|
|
57
|
+
found.push({ id: batch.id, status: batch.status, findings });
|
|
58
|
+
}
|
|
59
|
+
if (!page.hasMore)
|
|
60
|
+
return found;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const citing = async (store, ref) => {
|
|
64
|
+
const links = await store.notes.links({ to: ref, kind: "evidence" });
|
|
65
|
+
const of = (type) => [...new Set(links.flatMap(({ from }) => (from.startsWith(`${type}:`) ? [from] : [])))];
|
|
66
|
+
return { facts: of("fact"), memories: of("memory") };
|
|
67
|
+
};
|
|
68
|
+
export const sourcesCommand = (program, streams, env, { fetch } = {}) => {
|
|
69
|
+
const { print, run } = answers(program, streams, env);
|
|
70
|
+
const sources = program
|
|
71
|
+
.command("sources")
|
|
72
|
+
.summary("files, web pages and text you add by hand")
|
|
73
|
+
.description("sources you add by hand: pasted text, a file or a web page, kept as searchable documents");
|
|
74
|
+
byOption(reasonOption(annotate(sources.command("add"), { effects: FETCH, output: { entity: "added_source" } })
|
|
75
|
+
.summary("keep a file, a web page or pasted text as a document")
|
|
76
|
+
.description("keep a file, a web page or pasted text as a document of its own; only its text is kept unless --keep-copy")))
|
|
77
|
+
.argument("<source>", "a file's path, an http(s) address, or - to read the text from stdin")
|
|
78
|
+
.option("--title <title>", "a title; otherwise the page's or file's own, or the text's first line")
|
|
79
|
+
.option("--subject <ref>", SUBJECT_HELP, collect)
|
|
80
|
+
.option("--keep-copy", "also keep a copy of the file in memo's data folder, so it opens after the file is gone")
|
|
81
|
+
.option("--max-chars <n>", `most characters of text to keep, up to ${MAX_TEXT_CHARS} (default ${SOURCE_TEXT_CHARS})`, between(1, MAX_TEXT_CHARS, "--max-chars"))
|
|
82
|
+
.option("--json", "print JSON; --json=id,title keeps only those fields")
|
|
83
|
+
.action(async (given, options, command) => {
|
|
84
|
+
const kind = argumentKind(given);
|
|
85
|
+
if (isAgentServer(command, env) && kind !== "text")
|
|
86
|
+
throw new CliError("permission_error", "over MCP a source is added as text only, never from a path or a link");
|
|
87
|
+
if (options.keepCopy && kind !== "path")
|
|
88
|
+
throw new CliError("validation_error", "--keep-copy keeps a file; a link or pasted text keeps its text only", {
|
|
89
|
+
reason: "input.invalid",
|
|
90
|
+
param: "keep_copy",
|
|
91
|
+
});
|
|
92
|
+
const maxChars = options.maxChars ?? SOURCE_TEXT_CHARS;
|
|
93
|
+
const who = await whoRuns(command, env, { asOwner: options.asOwner, question: "add this source as yours?" });
|
|
94
|
+
const by = who === "owner" ? "owner" : { bot: who.bot, reason: options.reason?.trim() || "memo sources add" };
|
|
95
|
+
const read = await (kind === "text"
|
|
96
|
+
? readText(environmentOf(command).stdin ?? process.stdin, { maxChars })
|
|
97
|
+
: kind === "url"
|
|
98
|
+
? readPage(given, { maxChars, ...(fetch ? { fetch } : {}) })
|
|
99
|
+
: readFile(given, { maxChars })).catch((error) => {
|
|
100
|
+
throw withNextStep(error);
|
|
101
|
+
});
|
|
102
|
+
const content = {
|
|
103
|
+
kind: read.kind,
|
|
104
|
+
text: read.text,
|
|
105
|
+
url: read.url ?? null,
|
|
106
|
+
...(read.bytes ? { bytes: read.bytes } : {}),
|
|
107
|
+
};
|
|
108
|
+
const item = await withStore(env, async (store) => {
|
|
109
|
+
const subjects = await Promise.all((options.subject ?? []).map(async (subject) => (await subjectOf(store, subject)).ref));
|
|
110
|
+
let copy;
|
|
111
|
+
if (options.keepCopy && read.bytes && (await store.notes.findAddedSource(content)).duplicateOf === null)
|
|
112
|
+
copy = keepCopy(env, addedSourceKeyOf(content).hash, read.bytes);
|
|
113
|
+
let saved;
|
|
114
|
+
try {
|
|
115
|
+
saved = await store.notes.saveAddedSource({
|
|
116
|
+
...content,
|
|
117
|
+
read: read.read,
|
|
118
|
+
title: options.title?.trim() || read.title,
|
|
119
|
+
fileName: read.fileName ?? null,
|
|
120
|
+
mime: read.mime ?? null,
|
|
121
|
+
size: read.size,
|
|
122
|
+
subjects,
|
|
123
|
+
by,
|
|
124
|
+
...(copy ? { keepCopy: { path: copy.path } } : {}),
|
|
125
|
+
...(read.metadata ? { metadata: read.metadata } : {}),
|
|
126
|
+
...(read.sections ? { sections: read.sections } : {}),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
if (copy?.wrote)
|
|
131
|
+
dropCopy(env, copy.path);
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
if (copy?.wrote && saved.duplicateOf !== null)
|
|
135
|
+
dropCopy(env, copy.path);
|
|
136
|
+
const text = read.read === "extracted";
|
|
137
|
+
// A source stored before keeps the text of its first read; this read's cut says nothing about it.
|
|
138
|
+
const same = saved.duplicateOf === null && saved.note.text === read.text.trim();
|
|
139
|
+
return {
|
|
140
|
+
ref: saved.note.ref,
|
|
141
|
+
created: saved.created,
|
|
142
|
+
duplicateOf: saved.duplicateOf,
|
|
143
|
+
title: saved.note.title,
|
|
144
|
+
kind: read.kind,
|
|
145
|
+
mime: read.mime ?? null,
|
|
146
|
+
bytes: read.size,
|
|
147
|
+
chars: saved.note.text.length,
|
|
148
|
+
truncated: same ? read.truncated : null,
|
|
149
|
+
extractor: read.extractor,
|
|
150
|
+
read: read.read,
|
|
151
|
+
url: read.url ?? null,
|
|
152
|
+
kept: saved.kept,
|
|
153
|
+
searchable: {
|
|
154
|
+
words: text,
|
|
155
|
+
meaning: text && searchModelPresent(env) && loadConfig(env).notes?.embed !== false,
|
|
156
|
+
},
|
|
157
|
+
subjects: saved.subjects,
|
|
158
|
+
};
|
|
159
|
+
});
|
|
160
|
+
print(options.json, itemAnswer(item), [
|
|
161
|
+
`${item.ref}${item.duplicateOf ? " already stored: only its subjects were added" : item.created ? " added" : " already added"}`,
|
|
162
|
+
` ${item.title ?? ""} ${item.kind}${item.mime ? ` · ${item.mime}` : ""} · ${item.chars} characters${item.truncated === true ? " (only the first part is kept)" : ""}`,
|
|
163
|
+
` kept: ${item.kept === "copy" ? "its text and a copy of the file" : item.kept === "text" ? "its text" : "nothing new"}`,
|
|
164
|
+
` search: ${item.searchable.words ? "by words" : "by its title and subjects only"}${item.searchable.meaning ? " and by meaning after memo sync" : ""}`,
|
|
165
|
+
...(item.subjects.length ? [` about: ${item.subjects.join(", ")}`] : []),
|
|
166
|
+
].join("\n"));
|
|
167
|
+
});
|
|
168
|
+
annotate(sources.command("show"), { effects: LOCAL_READ, output: { entity: "source_detail" } })
|
|
169
|
+
.summary("one source: its text, what is kept, and what cites it")
|
|
170
|
+
.description("one source: its text, what is kept, what it is about, and the facts, memories and batches citing it")
|
|
171
|
+
.argument("<ref>", "document:<id>, as sources add answered")
|
|
172
|
+
.option("--bytes <bytes>", `most UTF-8 bytes of its text, up to ${MAX_TEXT_BYTES} (default ${TEXT_BYTES})`, between(1, MAX_TEXT_BYTES, "--bytes"))
|
|
173
|
+
.option("--json", "print JSON; --json=id,title keeps only those fields")
|
|
174
|
+
.action((reference, options) => run(options.json, async (store) => {
|
|
175
|
+
const ref = await documentRef(store, reference);
|
|
176
|
+
const source = await store.notes.addedSource(ref);
|
|
177
|
+
const note = source?.note ?? (await store.notes.note(ref));
|
|
178
|
+
const { text, truncated } = boundedText(note.text, options.bytes ?? TEXT_BYTES);
|
|
179
|
+
const subjects = (await store.notes.links({ from: ref, kind: "about" })).flatMap(({ to, confirmed }) => to === null ? [] : [{ ref: to, confirmed }]);
|
|
180
|
+
return itemAnswer({
|
|
181
|
+
ref,
|
|
182
|
+
title: note.title,
|
|
183
|
+
added: source !== undefined,
|
|
184
|
+
kind: source?.kind ?? null,
|
|
185
|
+
url: source?.url ?? null,
|
|
186
|
+
fileName: source?.fileName ?? null,
|
|
187
|
+
mime: source?.mime ?? null,
|
|
188
|
+
bytes: source?.size ?? null,
|
|
189
|
+
// The row says a copy was kept; only the file itself says it still is.
|
|
190
|
+
kept: source === undefined ? null : source.copy !== null && existsSync(source.copy) ? "copy" : "text",
|
|
191
|
+
chars: note.text.length,
|
|
192
|
+
text,
|
|
193
|
+
textTruncated: truncated,
|
|
194
|
+
createdAt: note.createdAt,
|
|
195
|
+
updatedAt: note.updatedAt,
|
|
196
|
+
subjects,
|
|
197
|
+
...(await citing(store, ref)),
|
|
198
|
+
batches: await batchesCiting(store, ref),
|
|
199
|
+
});
|
|
200
|
+
}));
|
|
201
|
+
annotate(sources.command("mentions"), { effects: LOCAL_READ, output: { entity: "source_mention" } })
|
|
202
|
+
.summary("known people and organizations named in a source")
|
|
203
|
+
.description("people and organizations memo knows whose names appear in a source's text; nothing leaves")
|
|
204
|
+
.argument("<ref>", "document:<id>")
|
|
205
|
+
.option("--json", "print JSON; --json=id,title keeps only those fields")
|
|
206
|
+
.action((reference, options) => run(options.json, async (store) => {
|
|
207
|
+
const ref = await documentRef(store, reference);
|
|
208
|
+
const found = await namedIn(store, await store.notes.note(ref));
|
|
209
|
+
return listAnswer("sources mentions", {
|
|
210
|
+
items: found.items,
|
|
211
|
+
limit: Math.max(1, found.items.length),
|
|
212
|
+
has_more: false,
|
|
213
|
+
...(found.organizationsComplete
|
|
214
|
+
? {}
|
|
215
|
+
: {
|
|
216
|
+
missing: [
|
|
217
|
+
{
|
|
218
|
+
field: "organizations",
|
|
219
|
+
why: `only the first ${found.organizationsChecked} organizations were matched by name`,
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
}),
|
|
223
|
+
});
|
|
224
|
+
}));
|
|
225
|
+
byOption(annotate(sources.command("remove"), { effects: LOCAL_WRITE, output: { entity: "source_removal" } })
|
|
226
|
+
.summary("remove a source you added, and its kept copy")
|
|
227
|
+
.description("remove a source you added, and its copy if one was kept; the next source check reviews what cites it"))
|
|
228
|
+
.argument("<ref>", "document:<id> of a source you added")
|
|
229
|
+
.option("--json", "print JSON; --json=id,title keeps only those fields")
|
|
230
|
+
.action(async (reference, options, command) => {
|
|
231
|
+
const who = await whoRuns(command, env, { asOwner: options.asOwner, question: "remove this source as you?" });
|
|
232
|
+
const by = who === "owner" ? "owner" : { bot: who.bot, reason: "memo sources remove" };
|
|
233
|
+
await run(options.json, async (store) => {
|
|
234
|
+
const ref = await documentRef(store, reference);
|
|
235
|
+
const cited = await citing(store, ref);
|
|
236
|
+
const removed = await store.notes.removeAddedSource(ref, by);
|
|
237
|
+
return itemAnswer({
|
|
238
|
+
ref: removed.ref,
|
|
239
|
+
removed: true,
|
|
240
|
+
copyDeleted: removed.copy !== null && dropCopy(env, removed.copy),
|
|
241
|
+
...cited,
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
};
|
|
246
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/sources/command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Where memo keeps the copies the owner asked for, each named by the hash of its bytes. */
|
|
2
|
+
export declare const copiesDir: (env: NodeJS.ProcessEnv) => string;
|
|
3
|
+
/** Writes the copy unless it is there; answers whether this call wrote it, so a failed save can take it back. */
|
|
4
|
+
export declare const keepCopy: (env: NodeJS.ProcessEnv, hash: string, bytes: Uint8Array) => {
|
|
5
|
+
path: string;
|
|
6
|
+
wrote: boolean;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Deletes a copy the store named, only inside memo's own folder: the path comes from the database, and a row
|
|
10
|
+
* someone edited must not make memo delete any other file.
|
|
11
|
+
*/
|
|
12
|
+
export declare const dropCopy: (env: NodeJS.ProcessEnv, path: string) => boolean;
|
|
13
|
+
//# sourceMappingURL=copy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/sources/copy.ts"],"names":[],"mappings":"AAMA,4FAA4F;AAC5F,eAAO,MAAM,SAAS,QAAS,MAAM,CAAC,UAAU,WAC2C,CAAA;AAI3F,iHAAiH;AACjH,eAAO,MAAM,QAAQ,QAAS,MAAM,CAAC,UAAU,QAAQ,MAAM,SAAS,UAAU,KAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAShH,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,QAAS,MAAM,CAAC,UAAU,QAAQ,MAAM,KAAG,OAM/D,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { existsSync, mkdirSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
4
|
+
import { resolvePaths } from "@wirecat/cli-base";
|
|
5
|
+
import { APP } from "../app.js";
|
|
6
|
+
/** Where memo keeps the copies the owner asked for, each named by the hash of its bytes. */
|
|
7
|
+
export const copiesDir = (env) => join(resolvePaths({ appName: APP.appName, prefix: APP.envPrefix, env }).state, "sources");
|
|
8
|
+
const copyPath = (env, hash) => join(copiesDir(env), hash);
|
|
9
|
+
/** Writes the copy unless it is there; answers whether this call wrote it, so a failed save can take it back. */
|
|
10
|
+
export const keepCopy = (env, hash, bytes) => {
|
|
11
|
+
const path = copyPath(env, hash);
|
|
12
|
+
if (existsSync(path))
|
|
13
|
+
return { path, wrote: false };
|
|
14
|
+
mkdirSync(copiesDir(env), { recursive: true, mode: 0o700 });
|
|
15
|
+
// A rename is whole or nothing: a run stopped half way leaves no copy that looks kept.
|
|
16
|
+
const partial = `${path}.${randomUUID()}.part`;
|
|
17
|
+
writeFileSync(partial, bytes, { mode: 0o600 });
|
|
18
|
+
renameSync(partial, path);
|
|
19
|
+
return { path, wrote: true };
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Deletes a copy the store named, only inside memo's own folder: the path comes from the database, and a row
|
|
23
|
+
* someone edited must not make memo delete any other file.
|
|
24
|
+
*/
|
|
25
|
+
export const dropCopy = (env, path) => {
|
|
26
|
+
const inside = relative(resolve(copiesDir(env)), resolve(path));
|
|
27
|
+
if (!inside || isAbsolute(inside) || inside.startsWith("..") || inside.includes(sep) || !existsSync(path))
|
|
28
|
+
return false;
|
|
29
|
+
rmSync(path);
|
|
30
|
+
return true;
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/sources/copy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAClF,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAE/B,4FAA4F;AAC5F,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAsB,EAAE,EAAE,CAClD,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;AAE3F,MAAM,QAAQ,GAAG,CAAC,GAAsB,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;AAErF,iHAAiH;AACjH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAsB,EAAE,IAAY,EAAE,KAAiB,EAAoC,EAAE;IACpH,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAChC,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACnD,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC3D,uFAAuF;IACvF,MAAM,OAAO,GAAG,GAAG,IAAI,IAAI,UAAU,EAAE,OAAO,CAAA;IAC9C,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC9C,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IACzB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AAC9B,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAsB,EAAE,IAAY,EAAW,EAAE;IACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAC/D,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QACvG,OAAO,KAAK,CAAA;IACd,MAAM,CAAC,IAAI,CAAC,CAAA;IACZ,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { MessageStore, Note } from "@wirecat/cli-core/store";
|
|
2
|
+
export interface NamedInSource {
|
|
3
|
+
ref: string;
|
|
4
|
+
type: "person" | "organization";
|
|
5
|
+
name: string | null;
|
|
6
|
+
/** The words of the text it was found by: a name as written, an e-mail address or a phone number. */
|
|
7
|
+
foundAs: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface SourceMentions {
|
|
10
|
+
items: NamedInSource[];
|
|
11
|
+
/** Organizations memo read the names of; a store with more than the store lists at once is not covered whole. */
|
|
12
|
+
organizationsChecked: number;
|
|
13
|
+
organizationsComplete: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* People and organizations memo knows whose names appear in a document. People come from cli-core's mentions: a
|
|
17
|
+
* name it found, linked or matching known people, and an e-mail address or phone number a person owns. Organizations
|
|
18
|
+
* are matched by their whole name in the text, since no mention kind finds them.
|
|
19
|
+
*/
|
|
20
|
+
export declare const namedIn: (store: MessageStore, note: Note) => Promise<SourceMentions>;
|
|
21
|
+
//# sourceMappingURL=mentions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mentions.d.ts","sourceRoot":"","sources":["../../src/sources/mentions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAA;AAEjE,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,QAAQ,GAAG,cAAc,CAAA;IAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,qGAAqG;IACrG,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,iHAAiH;IACjH,oBAAoB,EAAE,MAAM,CAAA;IAC5B,qBAAqB,EAAE,OAAO,CAAA;CAC/B;AA6BD;;;;GAIG;AACH,eAAO,MAAM,OAAO,UAAiB,YAAY,QAAQ,IAAI,KAAG,OAAO,CAAC,cAAc,CAuCrF,CAAA"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
const PAGE = 500;
|
|
2
|
+
const ORGANIZATIONS_LISTED = 500;
|
|
3
|
+
const escaped = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
4
|
+
const folded = (text) => text.normalize("NFC").toLocaleLowerCase();
|
|
5
|
+
/**
|
|
6
|
+
* The document's own mentions, read from cli-core's list of every document's mentions. The list is ordered by each
|
|
7
|
+
* document's time, newest first, then its id, so one document's mentions come together and the walk stops once it is
|
|
8
|
+
* past them, or past where they would be.
|
|
9
|
+
*/
|
|
10
|
+
const mentionsOf = async (store, note) => {
|
|
11
|
+
const id = Number(note.id);
|
|
12
|
+
const at = note.modifiedAt ?? note.updatedAt;
|
|
13
|
+
const found = [];
|
|
14
|
+
for (let offset = 0;; offset += PAGE) {
|
|
15
|
+
const page = await store.sourceMentions.list("document", undefined, { limit: PAGE, offset }, []);
|
|
16
|
+
for (const mention of page.items) {
|
|
17
|
+
const when = mention.source.at ?? "";
|
|
18
|
+
if (mention.source.id === id)
|
|
19
|
+
found.push(mention);
|
|
20
|
+
else if (found.length > 0 || when < at || (when === at && mention.source.id < id))
|
|
21
|
+
return found;
|
|
22
|
+
}
|
|
23
|
+
if (!page.hasMore)
|
|
24
|
+
return found;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* People and organizations memo knows whose names appear in a document. People come from cli-core's mentions: a
|
|
29
|
+
* name it found, linked or matching known people, and an e-mail address or phone number a person owns. Organizations
|
|
30
|
+
* are matched by their whole name in the text, since no mention kind finds them.
|
|
31
|
+
*/
|
|
32
|
+
export const namedIn = async (store, note) => {
|
|
33
|
+
const named = new Map();
|
|
34
|
+
const add = (ref, type, name, foundAs) => {
|
|
35
|
+
const entry = named.get(ref) ?? { ref, type, name, foundAs: [] };
|
|
36
|
+
if (!entry.foundAs.includes(foundAs))
|
|
37
|
+
entry.foundAs.push(foundAs);
|
|
38
|
+
named.set(ref, entry);
|
|
39
|
+
};
|
|
40
|
+
const candidates = new Map();
|
|
41
|
+
for (const mention of await mentionsOf(store, note)) {
|
|
42
|
+
if (mention.status === "dismissed")
|
|
43
|
+
continue;
|
|
44
|
+
if (mention.kind === "person-name") {
|
|
45
|
+
let people = mention.target?.startsWith("person:") ? [mention.target] : candidates.get(mention.value);
|
|
46
|
+
if (people === undefined) {
|
|
47
|
+
people = (await store.sourceMentions.show(mention.id, []))?.candidates ?? [];
|
|
48
|
+
candidates.set(mention.value, people);
|
|
49
|
+
}
|
|
50
|
+
for (const ref of people)
|
|
51
|
+
add(ref, "person", null, mention.written);
|
|
52
|
+
}
|
|
53
|
+
else if (mention.kind === "email" || mention.kind === "phone") {
|
|
54
|
+
const person = await store.people.personOf({ provider: mention.kind, id: mention.value });
|
|
55
|
+
if (person)
|
|
56
|
+
add(`person:${person.uid}`, "person", person.name, mention.written);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
for (const entry of named.values())
|
|
60
|
+
if (entry.name === null)
|
|
61
|
+
entry.name = (await store.people.personByUid(entry.ref.slice("person:".length)))?.name ?? null;
|
|
62
|
+
const text = folded(`${note.title ?? ""}\n${note.text}`);
|
|
63
|
+
const organizations = await store.knowledge.organizations();
|
|
64
|
+
for (const organization of organizations) {
|
|
65
|
+
const name = organization.name.trim();
|
|
66
|
+
if (name.length < 3)
|
|
67
|
+
continue;
|
|
68
|
+
const at = new RegExp(`(?<![\\p{L}\\p{N}])${escaped(folded(name))}(?![\\p{L}\\p{N}])`, "u");
|
|
69
|
+
if (at.test(text))
|
|
70
|
+
add(organization.ref, "organization", organization.name, name);
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
items: [...named.values()],
|
|
74
|
+
organizationsChecked: organizations.length,
|
|
75
|
+
organizationsComplete: organizations.length < ORGANIZATIONS_LISTED,
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=mentions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mentions.js","sourceRoot":"","sources":["../../src/sources/mentions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type FetchPageOptions, type LoadEngine, type Section } from "@wirecat/cli-core/documents";
|
|
2
|
+
import type { AddedSourceInput } from "@wirecat/cli-core/store";
|
|
3
|
+
/** What memo's folder import keeps of a file's text; `--max-chars` may raise it to the store's own limit. */
|
|
4
|
+
export declare const SOURCE_TEXT_CHARS = 200000;
|
|
5
|
+
export declare const isUrl: (given: string) => boolean;
|
|
6
|
+
export type SourceArgument = "text" | "url" | "path";
|
|
7
|
+
export declare const argumentKind: (given: string) => SourceArgument;
|
|
8
|
+
/** A source as read, before it is stored: what `saveAddedSource` takes, and what the answer reports. */
|
|
9
|
+
export interface ReadSource extends Pick<AddedSourceInput, "kind" | "text" | "read" | "url" | "fileName" | "mime" | "bytes" | "metadata"> {
|
|
10
|
+
size: number;
|
|
11
|
+
extractor: string | null;
|
|
12
|
+
truncated: boolean;
|
|
13
|
+
title: string | null;
|
|
14
|
+
sections?: Section[];
|
|
15
|
+
}
|
|
16
|
+
/** cli-core's refusal, with the plain next step memo knows for it; its code and reason stay as they were. */
|
|
17
|
+
export declare const withNextStep: (error: unknown) => unknown;
|
|
18
|
+
export declare const readText: (stdin: AsyncIterable<string | Uint8Array>, { maxChars }: {
|
|
19
|
+
maxChars: number;
|
|
20
|
+
}) => Promise<ReadSource>;
|
|
21
|
+
export declare const readFile: (path: string, { maxChars, load }: {
|
|
22
|
+
maxChars: number;
|
|
23
|
+
load?: LoadEngine;
|
|
24
|
+
}) => Promise<ReadSource>;
|
|
25
|
+
/** The page as read from its address; only the address as given is kept, never where its redirects ended. */
|
|
26
|
+
export declare const readPage: (address: string, { maxChars, fetch }: {
|
|
27
|
+
maxChars: number;
|
|
28
|
+
fetch?: FetchPageOptions;
|
|
29
|
+
}) => Promise<ReadSource>;
|
|
30
|
+
//# sourceMappingURL=read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/sources/read.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,gBAAgB,EAGrB,KAAK,UAAU,EAEf,KAAK,OAAO,EACb,MAAM,6BAA6B,CAAA;AACpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAE/D,6GAA6G;AAC7G,eAAO,MAAM,iBAAiB,SAAU,CAAA;AAIxC,eAAO,MAAM,KAAK,UAAW,MAAM,YAAyB,CAAA;AAE5D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;AAEpD,eAAO,MAAM,YAAY,UAAW,MAAM,KAAG,cAA0E,CAAA;AAEvH,wGAAwG;AACxG,MAAM,WAAW,UACf,SAAQ,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IAC7G,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;CACrB;AA0CD,6GAA6G;AAC7G,eAAO,MAAM,YAAY,UAAW,OAAO,KAAG,OAK7C,CAAA;AAqDD,eAAO,MAAM,QAAQ,UACZ,aAAa,CAAC,MAAM,GAAG,UAAU,CAAC,gBAC3B;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,KACjC,OAAO,CAAC,UAAU,CAgBpB,CAAA;AAED,eAAO,MAAM,QAAQ,SACb,MAAM,sBACuB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE,KACzE,OAAO,CAAC,UAAU,CAwCpB,CAAA;AAED,6GAA6G;AAC7G,eAAO,MAAM,QAAQ,YACV,MAAM,uBACM;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAE,KAClE,OAAO,CAAC,UAAU,CAkBpB,CAAA"}
|