@wirecat/cli-memo 0.131.62 → 0.131.64

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.
Files changed (163) hide show
  1. package/dist/bin/memo.js +2 -2
  2. package/dist/bundle/{app-server-QBJG7OGQ.js → app-server-7KM4MSDA.js} +9 -9
  3. package/dist/bundle/{auto-Z4MEU5OY.js → auto-V3FUD6RW.js} +16 -16
  4. package/dist/bundle/{chunk-LK6D26RK.js → chunk-3SCHFNUH.js} +5 -5
  5. package/dist/bundle/{chunk-HGNWJJDT.js → chunk-3YNJBKGV.js} +13 -1
  6. package/dist/bundle/{chunk-Q3VEUHC7.js → chunk-6OS7PTOC.js} +3 -3
  7. package/dist/bundle/{chunk-2UCLF4AO.js → chunk-DXTNBVLV.js} +394 -115
  8. package/dist/bundle/{chunk-2VDRVJCR.js → chunk-EDBZEHAU.js} +5 -4
  9. package/dist/bundle/{chunk-H3COKFXP.js → chunk-FHZKHKBJ.js} +1651 -11
  10. package/dist/bundle/{chunk-TBSWOVM3.js → chunk-FKUA3BTM.js} +14 -14
  11. package/dist/bundle/{chunk-TSKGEK2S.js → chunk-LVLFLWGY.js} +3 -3
  12. package/dist/bundle/{chunk-O2NQCWRM.js → chunk-ML46T7UC.js} +8 -8
  13. package/dist/bundle/{chunk-XX37LSNV.js → chunk-MYXB2T77.js} +25 -1
  14. package/dist/bundle/{chunk-WDZOEBTE.js → chunk-NH3A5QTW.js} +2 -2
  15. package/dist/bundle/{chunk-6OZ2WI7Y.js → chunk-NIJZXGJN.js} +1 -1
  16. package/dist/bundle/{chunk-EGI6JHIA.js → chunk-NRHF7TQ4.js} +2 -2
  17. package/dist/bundle/{chunk-WDWKG7FJ.js → chunk-PVGK67AJ.js} +17 -0
  18. package/dist/bundle/{chunk-E5JQFEIQ.js → chunk-QHNAPLVB.js} +4 -4
  19. package/dist/bundle/{chunk-SJ55SMBE.js → chunk-QTF4ZXOL.js} +2 -1
  20. package/dist/bundle/chunk-T3LVSUNZ.js +301 -0
  21. package/dist/bundle/{chunk-OXBETHGN.js → chunk-UXAP7MNL.js} +4 -4
  22. package/dist/bundle/{chunk-3ZXWLFUG.js → chunk-VLUDHCCX.js} +3 -3
  23. package/dist/bundle/{chunk-KREN56SX.js → chunk-WINH45XG.js} +4 -4
  24. package/dist/bundle/{chunk-FD3OQYFL.js → chunk-XPT5PX7H.js} +4 -4
  25. package/dist/bundle/{chunk-SJ36WSEI.js → chunk-ZX6SWNSR.js} +3 -3
  26. package/dist/bundle/{command-contract-SIXWLKAS.js → command-contract-PLB2JGFJ.js} +2 -2
  27. package/dist/bundle/{entry-SFLEGFSN.js → entry-MUE6HWX3.js} +1 -1
  28. package/dist/bundle/{failure-B33C3BFU.js → failure-6SP64Q66.js} +14 -14
  29. package/dist/bundle/{first-run-ZKDGFY6P.js → first-run-3JYWLJCH.js} +1 -1
  30. package/dist/bundle/{first-screen-IQEU7XF2.js → first-screen-QH34AIFV.js} +3 -3
  31. package/dist/bundle/{mcp-Y4XMDC5Q.js → mcp-QX2D6EXA.js} +6 -6
  32. package/dist/bundle/memo.js +6 -6
  33. package/dist/bundle/{program-DSQWICNB.js → program-LXQLWUAG.js} +1789 -422
  34. package/dist/bundle/{server-IQILK5YP.js → server-L622PMVC.js} +9 -9
  35. package/dist/bundle/{server-ZHFC3PIP.js → server-MVJU7QG4.js} +19 -19
  36. package/dist/bundle/{server-NKI7SVK5.js → server-SJVP2XXD.js} +6 -6
  37. package/dist/bundle/{store-6H4FPFTX.js → store-M5QSIRWJ.js} +1 -1
  38. package/dist/bundle/{store-maintenance-command-IFVWSQMJ.js → store-maintenance-command-PQCO5ICC.js} +5 -5
  39. package/dist/bundle/{update-LR5BVLBD.js → update-MQUCCIBB.js} +15 -15
  40. package/dist/contract-overrides/search.js +2 -2
  41. package/dist/contract-overrides/search.js.map +1 -1
  42. package/dist/discovery/command.d.ts.map +1 -1
  43. package/dist/discovery/command.js +6 -0
  44. package/dist/discovery/command.js.map +1 -1
  45. package/dist/events/command.d.ts +4 -0
  46. package/dist/events/command.d.ts.map +1 -0
  47. package/dist/events/command.js +35 -0
  48. package/dist/events/command.js.map +1 -0
  49. package/dist/events/events.d.ts +52 -0
  50. package/dist/events/events.d.ts.map +1 -0
  51. package/dist/events/events.js +199 -0
  52. package/dist/events/events.js.map +1 -0
  53. package/dist/examples.d.ts.map +1 -1
  54. package/dist/examples.js +90 -3
  55. package/dist/examples.js.map +1 -1
  56. package/dist/finance/command.d.ts +1 -1
  57. package/dist/finance/command.d.ts.map +1 -1
  58. package/dist/finance/command.js +13 -30
  59. package/dist/finance/command.js.map +1 -1
  60. package/dist/finance/contracts-command.d.ts +12 -0
  61. package/dist/finance/contracts-command.d.ts.map +1 -0
  62. package/dist/finance/contracts-command.js +110 -0
  63. package/dist/finance/contracts-command.js.map +1 -0
  64. package/dist/finance/deals-command.d.ts.map +1 -1
  65. package/dist/finance/deals-command.js +5 -4
  66. package/dist/finance/deals-command.js.map +1 -1
  67. package/dist/finance/lines-command.d.ts +37 -0
  68. package/dist/finance/lines-command.d.ts.map +1 -0
  69. package/dist/finance/lines-command.js +70 -0
  70. package/dist/finance/lines-command.js.map +1 -0
  71. package/dist/finance/orders-command.d.ts.map +1 -1
  72. package/dist/finance/orders-command.js +5 -2
  73. package/dist/finance/orders-command.js.map +1 -1
  74. package/dist/finance/products-command.d.ts +12 -0
  75. package/dist/finance/products-command.d.ts.map +1 -0
  76. package/dist/finance/products-command.js +99 -0
  77. package/dist/finance/products-command.js.map +1 -0
  78. package/dist/finance/subscriptions-command.d.ts +12 -0
  79. package/dist/finance/subscriptions-command.d.ts.map +1 -0
  80. package/dist/finance/subscriptions-command.js +153 -0
  81. package/dist/finance/subscriptions-command.js.map +1 -0
  82. package/dist/finance/transactions-command.d.ts +12 -0
  83. package/dist/finance/transactions-command.d.ts.map +1 -0
  84. package/dist/finance/transactions-command.js +137 -0
  85. package/dist/finance/transactions-command.js.map +1 -0
  86. package/dist/finance/wallets-command.d.ts +12 -0
  87. package/dist/finance/wallets-command.d.ts.map +1 -0
  88. package/dist/finance/wallets-command.js +106 -0
  89. package/dist/finance/wallets-command.js.map +1 -0
  90. package/dist/finance/written.d.ts +37 -0
  91. package/dist/finance/written.d.ts.map +1 -0
  92. package/dist/finance/written.js +36 -0
  93. package/dist/finance/written.js.map +1 -0
  94. package/dist/knowledge/command.d.ts.map +1 -1
  95. package/dist/knowledge/command.js +3 -2
  96. package/dist/knowledge/command.js.map +1 -1
  97. package/dist/mcp/permissions.d.ts +1 -1
  98. package/dist/mcp/permissions.d.ts.map +1 -1
  99. package/dist/mcp/permissions.js +1 -0
  100. package/dist/mcp/permissions.js.map +1 -1
  101. package/dist/options.d.ts +2 -0
  102. package/dist/options.d.ts.map +1 -1
  103. package/dist/options.js +2 -0
  104. package/dist/options.js.map +1 -1
  105. package/dist/program.d.ts.map +1 -1
  106. package/dist/program.js +174 -0
  107. package/dist/program.js.map +1 -1
  108. package/dist/reasons.d.ts.map +1 -1
  109. package/dist/reasons.js +24 -0
  110. package/dist/reasons.js.map +1 -1
  111. package/dist/records/import.d.ts +2 -4
  112. package/dist/records/import.d.ts.map +1 -1
  113. package/dist/records/import.js +41 -41
  114. package/dist/records/import.js.map +1 -1
  115. package/dist/records/input.d.ts +20 -0
  116. package/dist/records/input.d.ts.map +1 -0
  117. package/dist/records/input.js +115 -0
  118. package/dist/records/input.js.map +1 -0
  119. package/dist/records/mapping.d.ts +16 -1
  120. package/dist/records/mapping.d.ts.map +1 -1
  121. package/dist/records/mapping.js +24 -11
  122. package/dist/records/mapping.js.map +1 -1
  123. package/dist/records/record-commands.d.ts +8 -0
  124. package/dist/records/record-commands.d.ts.map +1 -0
  125. package/dist/records/record-commands.js +89 -0
  126. package/dist/records/record-commands.js.map +1 -0
  127. package/dist/records/sources.d.ts +48 -0
  128. package/dist/records/sources.d.ts.map +1 -0
  129. package/dist/records/sources.js +72 -0
  130. package/dist/records/sources.js.map +1 -0
  131. package/dist/review/kinds.d.ts +1 -1
  132. package/dist/review/kinds.d.ts.map +1 -1
  133. package/dist/review/kinds.js +4 -0
  134. package/dist/review/kinds.js.map +1 -1
  135. package/dist/review/review.d.ts.map +1 -1
  136. package/dist/review/review.js +4 -0
  137. package/dist/review/review.js.map +1 -1
  138. package/dist/rows.d.ts.map +1 -1
  139. package/dist/rows.js +34 -0
  140. package/dist/rows.js.map +1 -1
  141. package/dist/search/command.d.ts.map +1 -1
  142. package/dist/search/command.js +9 -4
  143. package/dist/search/command.js.map +1 -1
  144. package/dist/search/lane-gates.d.ts +3 -0
  145. package/dist/search/lane-gates.d.ts.map +1 -1
  146. package/dist/search/lane-gates.js +9 -3
  147. package/dist/search/lane-gates.js.map +1 -1
  148. package/dist/search/search.d.ts +3 -1
  149. package/dist/search/search.d.ts.map +1 -1
  150. package/dist/search/search.js +2 -1
  151. package/dist/search/search.js.map +1 -1
  152. package/dist/show/command.d.ts +6 -1
  153. package/dist/show/command.d.ts.map +1 -1
  154. package/dist/show/command.js +49 -4
  155. package/dist/show/command.js.map +1 -1
  156. package/dist/version.d.ts +1 -1
  157. package/dist/version.js +1 -1
  158. package/package.json +1 -1
  159. package/skills/cli-memo/SKILL.md +8 -5
  160. package/skills/cli-memo/topics/money.md +20 -1
  161. package/skills/cli-memo/topics/proposals.md +8 -5
  162. package/skills/cli-memo/topics/search.md +7 -0
  163. package/dist/bundle/chunk-HMJ3D7XE.js +0 -1901
@@ -1,55 +1,46 @@
1
- import { readFile } from "node:fs/promises";
2
1
  import { CliError } from "@wirecat/cli-base";
3
2
  import { annotate } from "@wirecat/cli-base/commands";
4
- import { envelopeOfJsonl } from "@wirecat/cli-core";
5
- import { environmentOf, LOCAL_READ, LOCAL_WRITE } from "@wirecat/cli-core/cli";
6
- import { ingest } from "@wirecat/cli-core/services";
3
+ import { environmentOf, LOCAL_WRITE } from "@wirecat/cli-core/cli";
7
4
  import { answers, itemAnswer, withStore } from "../answer.js";
5
+ import { importRecords } from "./input.js";
8
6
  import { recordMappingCommands } from "./mapping.js";
9
- const readAll = async (file, stdin) => {
10
- if (file !== "-")
11
- return readFile(file, "utf8");
12
- let text = "";
13
- stdin.setEncoding("utf8");
14
- for await (const chunk of stdin)
15
- text += chunk;
16
- return text;
17
- };
18
- /** One JSON envelope, or JSONL: a header line, then a record per line. */
19
- export const envelopeOf = (text) => {
20
- try {
21
- const whole = JSON.parse(text);
22
- if (whole && typeof whole === "object" && "records" in whole)
23
- return whole;
24
- }
25
- catch { }
26
- return envelopeOfJsonl(text);
27
- };
28
- /** `sheet:rentals` names the envelope's provider and account, as records list and map take it. */
29
- const accountIn = (envelope, given) => {
30
- const provider = envelope?.source?.provider;
31
- return typeof provider === "string" && given.startsWith(`${provider}:`) ? given.slice(provider.length + 1) : given;
32
- };
7
+ import { recordCommands } from "./record-commands.js";
8
+ /** The review kinds of what the import proposed, as `memo review kind:` takes them: each ref's prefix. */
9
+ const kindsOf = (proposed) => [...new Set(proposed.map((ref) => ref.slice(0, ref.indexOf(":"))))];
10
+ /** The envelope's root is `/`: an empty JSON pointer would break the answer's issue shape. */
11
+ const pointerOf = (pointer) => pointer || "/";
12
+ const refusedLine = (one) => `refused ${pointerOf(one.pointer)} · ${one.message} (${one.code})`;
33
13
  export const receiptText = (receipt) => [
34
14
  `${receipt.dryRun ? "would import" : "imported"} ${receipt.source?.batchId ?? "nothing"}: ` +
35
15
  `${receipt.created} created, ${receipt.updated} updated, ${receipt.unchanged} unchanged, ` +
36
16
  `${receipt.deleted} deleted, ${receipt.refused} refused`,
37
17
  ...(receipt.proposed.length
38
- ? [`proposed for your review (memo review kind:invoice,payment): ${receipt.proposed.join(" ")}`]
18
+ ? [
19
+ `proposed for your review (memo review list kind:${kindsOf(receipt.proposed).join(",")}): ` +
20
+ receipt.proposed.join(" "),
21
+ ]
39
22
  : []),
40
23
  ...receipt.waiting.map((one) => `waiting ${one.key}: no entity yet for ${one.missing.join(", ")}`),
24
+ ...receipt.unmatched.map((one) => `unmatched ${one.key}: ${one.candidates.length ? `could be ${one.candidates.join(" or ")}` : one.reason}; ` +
25
+ "you say which with memo records link"),
41
26
  ...receipt.flagged.map((one) => `changed at the source ${one.key}: ${one.entity} kept as it was`),
42
- ...receipt.errors.map((one) => `refused ${one.pointer} · ${one.message} (${one.code})`),
27
+ ...receipt.ignored.map((one) => `kept as data only ${one.key} ${one.pointer} (${one.reason})`),
28
+ ...(receipt.vcard ?? []).map((one) => `notice card ${one.card}: ${one.message}`),
29
+ ...receipt.errors.map(refusedLine),
30
+ ...(receipt.truncated ? ["the lists stop at 1000 entries each; the counts are exact"] : []),
43
31
  ].join("\n");
32
+ const HOLDS_LOCK = "a dry run holds the store's write lock and grows the write-ahead log for its length";
44
33
  export const recordsCommand = (program, streams, env) => {
45
- const { print } = answers(program, streams, env);
34
+ const answered = answers(program, streams, env);
35
+ const { print } = answered;
46
36
  const records = program
47
37
  .command("records")
48
- .description("what a source said, kept per account; invoices and payments from it wait for your review")
38
+ .description("what a source said, kept per account; what it says about money waits for your review")
49
39
  .summary("what a source said, kept per account");
50
40
  const importing = (command, dryRun) => command
51
- .argument("<file>", "a records envelope as JSON, or JSONL (a header line, then a record per line); - for stdin")
52
- .option("--account <account>", "the source the envelope is for: <provider>:<account> (sheet:rentals) or its source.account alone")
41
+ .argument("<file>", "a records envelope as JSON, JSONL (a header line, then a record per line, read as it streams) or a vCard address book (.vcf, into phone:<device>); - for stdin")
42
+ .option("--account <account>", "the source the envelope is for: <provider>:<account> (sheet:rentals) or its source.account alone; " +
43
+ "phone:<device> for a vCard file")
53
44
  .option("--json", "print JSON; --json=created,errors keeps only those fields")
54
45
  .action(async (file, given) => {
55
46
  const account = given.account?.trim();
@@ -57,23 +48,32 @@ export const recordsCommand = (program, streams, env) => {
57
48
  throw new CliError("validation_error", "name the source account the envelope is for: --account <account>", {
58
49
  param: "--account",
59
50
  });
60
- const envelope = envelopeOf(await readAll(file, environmentOf(program).stdin ?? process.stdin));
61
- const receipt = await withStore(env, (store) => ingest(store, envelope, { account: accountIn(envelope, account), dryRun: dryRun ?? given.dryRun === true }));
51
+ const receipt = await withStore(env, (store) => importRecords(store, {
52
+ file,
53
+ stdin: environmentOf(program).stdin ?? process.stdin,
54
+ account,
55
+ dryRun: dryRun ?? given.dryRun === true,
56
+ onIssue: (issue) => streams.diagnostic(`${refusedLine(issue)}\n`),
57
+ }));
62
58
  const issues = receipt.errors.map((one) => ({
63
59
  code: "validation_error",
64
- source: one.pointer,
60
+ source: pointerOf(one.pointer),
65
61
  reason: one.code,
66
62
  }));
67
63
  print(given.json, itemAnswer(receipt, issues.length ? { meta: { complete: false, issues } } : undefined), receiptText(receipt));
68
64
  });
69
65
  importing(annotate(records.command("import"), { effects: LOCAL_WRITE, output: { entity: "records_receipt" } })
70
66
  .description("bring a source's records into the store, once: the same file twice changes nothing, a lower revision is " +
71
- "refused, and an invoice or a payment becomes a proposal for you, never confirmed money")
67
+ "refused, and anything that feeds money totals becomes a proposal for you, never confirmed money. Each " +
68
+ "refusal is also printed on stderr as it happens, one line each, past the receipt's 1000")
72
69
  .summary("import a source's records; money waits for your review")
73
- .option("--dry-run", "check and plan the import; write nothing"), undefined);
74
- importing(annotate(records.command("check"), { effects: LOCAL_READ, output: { entity: "records_receipt" } })
75
- .description("what records import would do with the file, as its receipt, writing nothing")
70
+ .option("--dry-run", `check and plan the import; write nothing. ${HOLDS_LOCK}`), undefined);
71
+ importing(
72
+ // A dry run holds the write lock for its length, so MCP gates it as a write.
73
+ annotate(records.command("check"), { effects: LOCAL_WRITE, output: { entity: "records_receipt" } })
74
+ .description(`what records import would do with the file, as its receipt, writing nothing; ${HOLDS_LOCK}`)
76
75
  .summary("check a records file against the store; write nothing"), true);
77
76
  recordMappingCommands(records, program, streams, env);
77
+ recordCommands(records, answered, (work) => withStore(env, work));
78
78
  };
79
79
  //# sourceMappingURL=import.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/records/import.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/records/import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type IngestError, type VcardIssue } from "@wirecat/cli-core";
2
+ import { type IngestReceipt } from "@wirecat/cli-core/services";
3
+ import type { MessageStore } from "@wirecat/cli-core/store";
4
+ /** `vcard` holds the converter's notices, each `card` counted from 1. */
5
+ export type Receipt = IngestReceipt & {
6
+ vcard?: VcardIssue[];
7
+ };
8
+ /**
9
+ * Imports a records file or stdin. JSONL streams, a record at a time, so a file of any length fits in memory; a JSON
10
+ * envelope and a vCard address book are read whole, as one envelope each. `onIssue` hears every refusal as it
11
+ * happens, also those past the receipt's capped lists.
12
+ */
13
+ export declare const importRecords: (store: MessageStore, { file, stdin, account, dryRun, onIssue, }: {
14
+ file: string;
15
+ stdin: NodeJS.ReadableStream;
16
+ account: string;
17
+ dryRun: boolean;
18
+ onIssue: (issue: IngestError) => void;
19
+ }) => Promise<Receipt>;
20
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/records/input.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,WAAW,EAAW,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9F,OAAO,EAAE,KAAK,aAAa,EAAgD,MAAM,4BAA4B,CAAA;AAC7G,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3D,yEAAyE;AACzE,MAAM,MAAM,OAAO,GAAG,aAAa,GAAG;IAAE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAA;CAAE,CAAA;AAgE9D;;;;GAIG;AACH,eAAO,MAAM,aAAa,UACjB,YAAY,8CAOhB;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAC,cAAc,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;CACtC,KACA,OAAO,CAAC,OAAO,CA2CjB,CAAA"}
@@ -0,0 +1,115 @@
1
+ import { open } from "node:fs/promises";
2
+ import { CliError } from "@wirecat/cli-base";
3
+ import { envelopeOfText, isVcard } from "@wirecat/cli-core";
4
+ import { ingest, ingestLines, ingestVcard, jsonlLines } from "@wirecat/cli-core/services";
5
+ /** A vCard address book is a phone's contacts: they go under the seeded `phone` provider, one account per device. */
6
+ const PHONE = "phone";
7
+ const BOM = /^\uFEFF/;
8
+ const errnoOf = (error) => typeof error === "object" && error !== null && "code" in error ? String(error.code) : undefined;
9
+ /** A file opened now, so a missing one fails before anything is read; its errors come as answers, not as errno. */
10
+ const linesOf = async (file, stdin) => {
11
+ if (file === "-")
12
+ return jsonlLines(stdin);
13
+ try {
14
+ const handle = await open(file);
15
+ if (!(await handle.stat()).isFile()) {
16
+ await handle.close();
17
+ throw Object.assign(new Error(`${file} is a folder`), { code: "EISDIR" });
18
+ }
19
+ return jsonlLines(handle.createReadStream({ encoding: "utf8" }));
20
+ }
21
+ catch (error) {
22
+ if (errnoOf(error) === "ENOENT")
23
+ throw new CliError("not_found", `no records file ${file}: give a file that exists, or - for stdin`, {
24
+ reason: "records.file-missing",
25
+ path: file,
26
+ });
27
+ const why = errnoOf(error) === "EISDIR" ? "it is a folder" : errnoOf(error) === "EACCES" ? "no permission" : "unreadable";
28
+ throw new CliError("validation_error", `the records file ${file} cannot be read: ${why}`, {
29
+ reason: "records.file-unreadable",
30
+ path: file,
31
+ why,
32
+ });
33
+ }
34
+ };
35
+ /** A JSONL file's first line: an object holding no `records`. */
36
+ const headerOf = (line) => {
37
+ try {
38
+ const value = JSON.parse(line);
39
+ return value && typeof value === "object" && !Array.isArray(value) && !("records" in value)
40
+ ? value
41
+ : undefined;
42
+ }
43
+ catch {
44
+ return undefined;
45
+ }
46
+ };
47
+ /** `sheet:rentals` names the envelope's provider and account, as records list and link take it. */
48
+ const accountIn = (envelope, given) => {
49
+ const provider = envelope?.source?.provider;
50
+ return typeof provider === "string" && given.startsWith(`${provider}:`) ? given.slice(provider.length + 1) : given;
51
+ };
52
+ const deviceOf = (given) => {
53
+ const at = given.indexOf(":");
54
+ if (at < 0)
55
+ return given;
56
+ if (given.slice(0, at) !== PHONE)
57
+ throw new CliError("validation_error", "a vCard file holds a phone's contacts: --account phone:<device>", {
58
+ param: "--account",
59
+ });
60
+ return given.slice(at + 1);
61
+ };
62
+ /**
63
+ * Imports a records file or stdin. JSONL streams, a record at a time, so a file of any length fits in memory; a JSON
64
+ * envelope and a vCard address book are read whole, as one envelope each. `onIssue` hears every refusal as it
65
+ * happens, also those past the receipt's capped lists.
66
+ */
67
+ export const importRecords = async (store, { file, stdin, account, dryRun, onIssue, }) => {
68
+ const iterator = (await linesOf(file, stdin))[Symbol.asyncIterator]();
69
+ const before = [];
70
+ let next = await iterator.next();
71
+ while (!next.done && next.value.replace(BOM, "").trim() === "") {
72
+ before.push(next.value);
73
+ next = await iterator.next();
74
+ }
75
+ async function* rest() {
76
+ for (let line = await iterator.next(); !line.done; line = await iterator.next())
77
+ yield line.value;
78
+ }
79
+ const whole = async (first) => {
80
+ const lines = [...before, ...first];
81
+ for await (const line of rest())
82
+ lines.push(line);
83
+ return lines.join("\n");
84
+ };
85
+ if (next.done)
86
+ return ingest(store, envelopeOfText(before.join("\n")), { account, dryRun, onIssue });
87
+ const first = next.value.replace(BOM, "");
88
+ if (isVcard(first)) {
89
+ const { vcard, ...receipt } = await ingestVcard(store, await whole([first]), {
90
+ account: deviceOf(account),
91
+ provider: PHONE,
92
+ batchId: `vcard-${new Date().toISOString()}`,
93
+ dryRun,
94
+ onIssue,
95
+ });
96
+ return { ...receipt, vcard: vcard.map((one) => ({ ...one, card: one.card + 1 })) };
97
+ }
98
+ const header = headerOf(first);
99
+ if (header !== undefined) {
100
+ async function* all() {
101
+ // A refused header stops the stream at its first line; the file is closed here, not when it is collected.
102
+ try {
103
+ yield first;
104
+ yield* rest();
105
+ }
106
+ finally {
107
+ await iterator.return?.();
108
+ }
109
+ }
110
+ return ingestLines(store, all(), { account: accountIn(header, account), dryRun, onIssue });
111
+ }
112
+ const envelope = envelopeOfText(await whole([first]));
113
+ return ingest(store, envelope, { account: accountIn(envelope, account), dryRun, onIssue });
114
+ };
115
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/records/input.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,22 @@ import type { Command } from "commander";
3
3
  export declare const RECORD_QUERY: {
4
4
  readonly entity: "source_record";
5
5
  readonly backend: "native";
6
- readonly fields: readonly [import("@wirecat/cli-base/query").FieldSpec, import("@wirecat/cli-base/query").FieldSpec, import("@wirecat/cli-base/query").FieldSpec];
6
+ readonly fields: readonly [import("@wirecat/cli-base/query").FieldSpec, import("@wirecat/cli-base/query").FieldSpec, import("@wirecat/cli-base/query").FieldSpec, import("@wirecat/cli-base/query").FieldSpec, import("@wirecat/cli-base/query").FieldSpec, import("@wirecat/cli-base/query").FieldSpec, import("@wirecat/cli-base/query").FieldSpec];
7
7
  };
8
+ /** `sheet:rentals`: records are kept per source, so a read or a mapping names its provider and account. */
9
+ export declare const sourceOf: (account: string | undefined) => {
10
+ provider: string;
11
+ account: string;
12
+ };
13
+ /**
14
+ * `organization:client` or `custom:quote:Q-7`: the record's type and its id at the source, as the envelope gave them.
15
+ * Only a `custom:` type holds a colon; any other id may hold one.
16
+ */
17
+ export declare const recordOf: (record: string) => {
18
+ type: string;
19
+ externalId: string;
20
+ };
21
+ export declare const RECORD_HELP = "<type>:<external_id> as the source names it, such as organization:client or custom:quote:Q-7";
22
+ export declare const ACCOUNT_HELP = "the source, <provider>:<account> as the envelope's source names it, such as sheet:rentals";
8
23
  export declare const recordMappingCommands: (records: Command, program: Command, streams: Streams, env: NodeJS.ProcessEnv) => void;
9
24
  //# sourceMappingURL=mapping.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../../src/records/mapping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAI1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMxC,eAAO,MAAM,YAAY;qBACf,eAAe;sBACd,QAAQ;;CAMe,CAAA;AAyBlC,eAAO,MAAM,qBAAqB,YACvB,OAAO,WACP,OAAO,WACP,OAAO,OACX,MAAM,CAAC,UAAU,KACrB,IAmDF,CAAA"}
1
+ {"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../../src/records/mapping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAI1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMxC,eAAO,MAAM,YAAY;qBACf,eAAe;sBACd,QAAQ;;CAUe,CAAA;AAElC,2GAA2G;AAC3G,eAAO,MAAM,QAAQ,YAAa,MAAM,GAAG,SAAS;;;CAQnD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,WAAY,MAAM;IAS5B,IAAI;IAAuB,UAAU;CAC/C,CAAA;AAED,eAAO,MAAM,WAAW,iGACwE,CAAA;AAEhG,eAAO,MAAM,YAAY,8FAA8F,CAAA;AAEvH,eAAO,MAAM,qBAAqB,YACvB,OAAO,WACP,OAAO,WACP,OAAO,OACX,MAAM,CAAC,UAAU,KACrB,IAyDF,CAAA"}
@@ -12,10 +12,14 @@ export const RECORD_QUERY = {
12
12
  termField("type", "kw", "type:organization"),
13
13
  termField("waiting", "bool", "waiting:true"),
14
14
  termField("flagged", "bool", "flagged:true"),
15
+ termField("unmatched", "bool", "unmatched:true"),
16
+ termField("entity", "ref", 'entity:"organization:3"'),
17
+ termField("batch", "kw", "batch:2026-11-07"),
18
+ termField("deleted", "bool", "deleted:true"),
15
19
  ],
16
20
  };
17
21
  /** `sheet:rentals`: records are kept per source, so a read or a mapping names its provider and account. */
18
- const sourceOf = (account) => {
22
+ export const sourceOf = (account) => {
19
23
  const [provider = "", ...rest] = (account ?? "").trim().split(":");
20
24
  const name = rest.join(":");
21
25
  if (!provider || !name)
@@ -24,19 +28,24 @@ const sourceOf = (account) => {
24
28
  });
25
29
  return { provider, account: name };
26
30
  };
27
- /** `organization:client`: the record's type and its id at the source, as the envelope gave them. */
28
- const recordOf = (record) => {
29
- const at = record.indexOf(":");
30
- if (at < 1 || at === record.length - 1)
31
- throw new CliError("validation_error", `${record} is not <type>:<external_id>, such as organization:client`, {
32
- param: "record",
33
- });
31
+ /**
32
+ * `organization:client` or `custom:quote:Q-7`: the record's type and its id at the source, as the envelope gave them.
33
+ * Only a `custom:` type holds a colon; any other id may hold one.
34
+ */
35
+ export const recordOf = (record) => {
36
+ const from = record.startsWith("custom:") ? "custom:".length : 0;
37
+ const at = record.indexOf(":", from);
38
+ if (at <= from || at === record.length - 1)
39
+ throw new CliError("validation_error", `${record} is not <type>:<external_id>, such as organization:client or custom:quote:Q-7`, { param: "record" });
34
40
  return { type: record.slice(0, at), externalId: record.slice(at + 1) };
35
41
  };
36
- const ACCOUNT_HELP = "the source, <provider>:<account> as the envelope's source names it, such as sheet:rentals";
42
+ export const RECORD_HELP = "<type>:<external_id> as the source names it, such as organization:client or custom:quote:Q-7";
43
+ export const ACCOUNT_HELP = "the source, <provider>:<account> as the envelope's source names it, such as sheet:rentals";
37
44
  export const recordMappingCommands = (records, program, streams, env) => {
38
45
  const { run } = answers(program, streams, env);
39
- withQuery(annotate(records.command("list"), { effects: LOCAL_READ }).description("a source's records, newest first; waiting:true lists those whose invoice or payment waits for records link"), RECORD_QUERY)
46
+ withQuery(annotate(records.command("list"), { effects: LOCAL_READ }).description("a source's records, newest first; waiting:true lists those that wait for a record they name, unmatched:true " +
47
+ "the people, organizations and projects whose identifiers fit more than one of yours, entity: those mapped " +
48
+ "to one of your entries"), RECORD_QUERY)
40
49
  .summary("a source's records; waiting:true lists what needs records link")
41
50
  .option("--account <account>", ACCOUNT_HELP)
42
51
  .option("--limit <n>", "most records, up to 500", positive, 100)
@@ -49,6 +58,10 @@ export const recordMappingCommands = (records, program, streams, env) => {
49
58
  ...(terms.has("type") ? { type: terms.get("type") } : {}),
50
59
  ...(terms.get("waiting") === "true" ? { waiting: true } : {}),
51
60
  ...(terms.get("flagged") === "true" ? { flagged: true } : {}),
61
+ ...(terms.get("unmatched") === "true" ? { unmatched: true } : {}),
62
+ ...(terms.has("entity") ? { entity: terms.get("entity") } : {}),
63
+ ...(terms.has("batch") ? { batch: terms.get("batch") } : {}),
64
+ ...(terms.has("deleted") ? { deleted: terms.get("deleted") === "true" } : {}),
52
65
  };
53
66
  return pageOf("records list", given.limit, (most) => store.records.list({ ...filter, limit: most }));
54
67
  }));
@@ -56,7 +69,7 @@ export const recordMappingCommands = (records, program, streams, env) => {
56
69
  .description("say which of your entries a source's record is (organization:client is organization:3); never done by " +
57
70
  "name. Records that waited for it become proposals in memo review. Only you link; an agent is refused")
58
71
  .summary("say which of your entries a source's record is")
59
- .argument("<record>", "<type>:<external_id> as the source names it, such as organization:client")
72
+ .argument("<record>", RECORD_HELP)
60
73
  .argument("<ref>", "your entry of the same type: person:<id>, organization:<id> or project:<id>")
61
74
  .option("--account <account>", ACCOUNT_HELP)
62
75
  .option("--json", "print JSON; --json=type,external_id,entity keeps only those fields")).action(async (record, ref, given, command) => {
@@ -1 +1 @@
1
- {"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../src/records/mapping.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../src/records/mapping.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { MessageStore } from "@wirecat/cli-core/store";
2
+ import type { Command } from "commander";
3
+ import { type answers } from "../answer.js";
4
+ /** The CLI code cli-core registers for an import's refusal, such as `record.stale-revision`. */
5
+ export declare const codeOf: (reason: string) => "authentication_error" | "cancelled" | "configuration_error" | "confirmation_required" | "conflict" | "invalid_response" | "network_error" | "not_found" | "outcome_unknown" | "permission_error" | "provider_error" | "provider_unavailable" | "rate_limited" | "timeout" | "validation_error";
6
+ /** `records show`, `records delete` and `records match`: one record, and the account's waiting identities. */
7
+ export declare const recordCommands: (records: Command, { run, print }: ReturnType<typeof answers>, withStore: <T>(work: (store: MessageStore) => Promise<T>) => Promise<T>) => void;
8
+ //# sourceMappingURL=record-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-commands.d.ts","sourceRoot":"","sources":["../../src/records/record-commands.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAY,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,KAAK,OAAO,EAAc,MAAM,cAAc,CAAA;AAMvD,gGAAgG;AAChG,eAAO,MAAM,MAAM,WAAY,MAAM,oSAGpC,CAAA;AA8BD,8GAA8G;AAC9G,eAAO,MAAM,cAAc,YAChB,OAAO,kBACA,UAAU,CAAC,OAAO,OAAO,CAAC,aAC/B,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,KACtE,IAuFF,CAAA"}
@@ -0,0 +1,89 @@
1
+ import { CliError } from "@wirecat/cli-base";
2
+ import { annotate } from "@wirecat/cli-base/commands";
3
+ import { CORE_REASONS, RECORDS_SCHEMA_VERSION } from "@wirecat/cli-core";
4
+ import { LOCAL_READ, LOCAL_WRITE } from "@wirecat/cli-core/cli";
5
+ import { ingest } from "@wirecat/cli-core/services";
6
+ import { itemAnswer } from "../answer.js";
7
+ import { jsonOption } from "../options.js";
8
+ import { ACCOUNT_HELP, RECORD_HELP, recordOf, sourceOf } from "./mapping.js";
9
+ const INCOMING = 100;
10
+ /** The CLI code cli-core registers for an import's refusal, such as `record.stale-revision`. */
11
+ export const codeOf = (reason) => {
12
+ const code = CORE_REASONS.find((one) => one.reason === reason)?.code;
13
+ return code === undefined || code === "internal_error" ? "validation_error" : code;
14
+ };
15
+ const storedRecord = async (store, account, record) => {
16
+ const key = { ...sourceOf(account), ...recordOf(record) };
17
+ const found = await store.records.get(key);
18
+ if (found === undefined)
19
+ throw new CliError("not_found", `no record ${record} from ${key.provider}:${key.account}; records list shows them`, {
20
+ reason: "records.not-stored",
21
+ record,
22
+ });
23
+ return found;
24
+ };
25
+ const matchText = (run) => [
26
+ `matched ${run.linked}, created ${run.created}`,
27
+ ...(run.proposed.length ? [`proposed for your review: ${run.proposed.join(" ")}`] : []),
28
+ ...run.unmatched.map((one) => `unmatched ${one.key.type}:${one.key.externalId}: ` +
29
+ `${one.candidates.length ? `could be ${one.candidates.join(" or ")}` : one.reason}`),
30
+ ...run.errors.map((one) => `refused ${one.pointer} · ${one.message} (${one.code})`),
31
+ ...(run.truncated ? ["the lists stop at 1000 entries each; the counts are exact"] : []),
32
+ ].join("\n");
33
+ /** `records show`, `records delete` and `records match`: one record, and the account's waiting identities. */
34
+ export const recordCommands = (records, { run, print }, withStore) => {
35
+ jsonOption(annotate(records.command("show"), { effects: LOCAL_READ, output: { entity: "source_record" } })
36
+ .argument("<record>", RECORD_HELP)
37
+ .option("--account <account>", ACCOUNT_HELP), "fields,relations,incoming,entity")
38
+ .description("one record as its source said it: its fields, the records it names, the records that name it (incoming, " +
39
+ `the first ${INCOMING}) and the entry made from it`)
40
+ .summary("one record as its source said it")
41
+ .action((record, given) => run(given.json, async (store) => {
42
+ const found = await storedRecord(store, given.account, record);
43
+ const incoming = await store.records.incoming(found, { limit: INCOMING + 1 });
44
+ return itemAnswer({
45
+ ...found,
46
+ incoming: { items: incoming.slice(0, INCOMING), hasMore: incoming.length > INCOMING },
47
+ });
48
+ }));
49
+ jsonOption(annotate(records.command("delete"), { effects: LOCAL_WRITE, output: { entity: "records_receipt" } })
50
+ .argument("<record>", RECORD_HELP)
51
+ .option("--account <account>", ACCOUNT_HELP), "deleted,flagged,errors")
52
+ .description("say a source no longer has a record, as an import's delete does: the record is kept as deleted, and the " +
53
+ "entry made from it stays, flagged for you to reject or keep")
54
+ .summary("mark a source's record deleted")
55
+ .action(async (record, given) => {
56
+ const receipt = await withStore(async (store) => {
57
+ const found = await storedRecord(store, given.account, record);
58
+ return ingest(store, {
59
+ schema_version: RECORDS_SCHEMA_VERSION,
60
+ source: {
61
+ provider: found.provider,
62
+ account: found.account,
63
+ batch_id: `delete-${new Date().toISOString()}`,
64
+ },
65
+ records: [
66
+ {
67
+ key: "delete",
68
+ type: found.type,
69
+ external_id: found.externalId,
70
+ operation: "delete",
71
+ ...(found.revision === null ? {} : { revision: found.revision }),
72
+ },
73
+ ],
74
+ }, { account: found.account });
75
+ });
76
+ const [refused] = receipt.errors;
77
+ if (refused)
78
+ throw new CliError(codeOf(refused.code), refused.message, { reason: refused.code });
79
+ print(given.json, itemAnswer(receipt), receipt.deleted === 0
80
+ ? `${record} was already deleted`
81
+ : `deleted ${record}${receipt.flagged.length ? `; ${receipt.flagged.map((one) => one.entity).join(" ")} kept, flagged for you` : ""}`);
82
+ });
83
+ jsonOption(annotate(records.command("match"), { effects: LOCAL_WRITE, output: { entity: "records_match" } }).option("--account <account>", ACCOUNT_HELP), "linked,created,unmatched")
84
+ .description("link every waiting person, organization and project of a source to the one entry its e-mail, phone or other " +
85
+ "identifier names, or make one, as an import does; never by name. Two or more fits wait for records link")
86
+ .summary("match a source's waiting people and organizations")
87
+ .action((given) => withStore(async (store) => store.records.match(sourceOf(given.account))).then((found) => print(given.json, itemAnswer(found), matchText(found))));
88
+ };
89
+ //# sourceMappingURL=record-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-commands.js","sourceRoot":"","sources":["../../src/records/record-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { AccountKey, MessageStore } from "@wirecat/cli-core/store";
2
+ import type { Command } from "commander";
3
+ /** An entity as its `show` reads it: an import's row says `import:<provider>`, a CRM copy names its account. */
4
+ export interface Sourced {
5
+ ref: string;
6
+ source?: string;
7
+ account?: AccountKey | null;
8
+ }
9
+ export declare const SOURCED: ReadonlySet<string>;
10
+ export declare const readSourced: (store: MessageStore, kind: string, ref: string) => Promise<Sourced> | undefined;
11
+ /** Whether an import or a CRM made it, so its title is the source's words, not the owner's. */
12
+ export declare const imported: ({ source, account }: Sourced) => boolean;
13
+ /** The accounts whose records can be mapped to the entity: its CRM account, or every account of its import provider. */
14
+ export declare const sourceAccounts: (store: MessageStore, { source, account }: Sourced) => Promise<AccountKey[]>;
15
+ export interface SourceRecordRef {
16
+ /** `type:external_id`, as `records show` takes it with `--account`. */
17
+ record: string;
18
+ account: string;
19
+ flagged?: true;
20
+ deleted?: true;
21
+ }
22
+ export interface NamingRecord {
23
+ record: string;
24
+ account: string;
25
+ role: string;
26
+ as: string | null;
27
+ }
28
+ export interface SourcesOf {
29
+ records: {
30
+ items: SourceRecordRef[];
31
+ hasMore: boolean;
32
+ };
33
+ incoming: {
34
+ items: NamingRecord[];
35
+ hasMore: boolean;
36
+ };
37
+ }
38
+ /**
39
+ * Where an entity came from: the records of its source's accounts mapped to it, and the live records of any account
40
+ * whose relations name it, such as a quote `quoted-for` a deal.
41
+ */
42
+ export declare const sourcesOf: (store: MessageStore, entity: Sourced) => Promise<SourcesOf>;
43
+ export declare const sourcesText: (ref: string, { records, incoming }: SourcesOf, indent?: string) => string[];
44
+ /** `sources` names source records, which `records show` reads: an MCP client denied that gets none. */
45
+ export declare const recordsHidden: (command: Command) => boolean;
46
+ /** An entity's `show` answer with where it came from beside it. */
47
+ export declare const withSources: <T extends Sourced>(command: Command, store: MessageStore, item: T) => Promise<T>;
48
+ //# sourceMappingURL=sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../src/records/sources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAa,MAAM,yBAAyB,CAAA;AAClF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKxC,gHAAgH;AAChH,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;CAC5B;AAiBD,eAAO,MAAM,OAAO,EAAE,WAAW,CAAC,MAAM,CAA+B,CAAA;AAEvE,eAAO,MAAM,WAAW,UAAW,YAAY,QAAQ,MAAM,OAAO,MAAM,iCAA8B,CAAA;AAIxG,+FAA+F;AAC/F,eAAO,MAAM,QAAQ,wBAAyB,OAAO,YAA+D,CAAA;AAEpH,wHAAwH;AACxH,eAAO,MAAM,cAAc,UAAiB,YAAY,uBAAuB,OAAO,KAAG,OAAO,CAAC,UAAU,EAAE,CAK5G,CAAA;AAED,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,IAAI,CAAA;IACd,OAAO,CAAC,EAAE,IAAI,CAAA;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE;QAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAA;IACvD,QAAQ,EAAE;QAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAA;CACtD;AAOD;;;GAGG;AACH,eAAO,MAAM,SAAS,UAAiB,YAAY,UAAU,OAAO,KAAG,OAAO,CAAC,SAAS,CAoBvF,CAAA;AAED,eAAO,MAAM,WAAW,QAAS,MAAM,yBAAyB,SAAS,sBAAkB,MAAM,EAWhG,CAAA;AAED,uGAAuG;AACvG,eAAO,MAAM,aAAa,YAAa,OAAO,YAAqD,CAAA;AAEnG,mEAAmE;AACnE,eAAO,MAAM,WAAW,GAAU,CAAC,SAAS,OAAO,WAAW,OAAO,SAAS,YAAY,QAAQ,CAAC,eACf,CAAA"}