@wirecat/cli-core 0.294.0 → 0.296.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.
Files changed (167) hide show
  1. package/README.md +1 -0
  2. package/dist/cli/bot/mcp.js +1 -1
  3. package/dist/cli/bot/mcp.js.map +1 -1
  4. package/dist/cli/bot/watch.js +1 -1
  5. package/dist/cli/bot/watch.js.map +1 -1
  6. package/dist/cli/messenger/backfill-command.js +1 -1
  7. package/dist/cli/messenger/backfill-command.js.map +1 -1
  8. package/dist/cli/messenger/mcp-command.js +1 -1
  9. package/dist/cli/messenger/mcp-command.js.map +1 -1
  10. package/dist/cli/messenger/serve-command.js +1 -1
  11. package/dist/cli/messenger/serve-command.js.map +1 -1
  12. package/dist/cli/messenger/store-maintenance-command.d.ts +1 -1
  13. package/dist/cli/messenger/tasks-command.d.ts.map +1 -1
  14. package/dist/cli/messenger/tasks-command.js +75 -13
  15. package/dist/cli/messenger/tasks-command.js.map +1 -1
  16. package/dist/cli/messenger/watch-command.js +1 -1
  17. package/dist/cli/messenger/watch-command.js.map +1 -1
  18. package/dist/cli/program.d.ts.map +1 -1
  19. package/dist/cli/program.js +4 -5
  20. package/dist/cli/program.js.map +1 -1
  21. package/dist/cli/store-settings.d.ts +13 -0
  22. package/dist/cli/store-settings.d.ts.map +1 -1
  23. package/dist/cli/store-settings.js +76 -8
  24. package/dist/cli/store-settings.js.map +1 -1
  25. package/dist/documents/catalog.d.ts +3 -0
  26. package/dist/documents/catalog.d.ts.map +1 -0
  27. package/dist/documents/catalog.js +18 -0
  28. package/dist/documents/catalog.js.map +1 -0
  29. package/dist/documents/index.d.ts +10 -0
  30. package/dist/documents/index.d.ts.map +1 -0
  31. package/dist/documents/index.js +8 -0
  32. package/dist/documents/index.js.map +1 -0
  33. package/dist/documents/model.d.ts +117 -0
  34. package/dist/documents/model.d.ts.map +1 -0
  35. package/dist/documents/model.js +2 -0
  36. package/dist/documents/model.js.map +1 -0
  37. package/dist/documents/scope.d.ts +3 -0
  38. package/dist/documents/scope.d.ts.map +1 -0
  39. package/dist/documents/scope.js +15 -0
  40. package/dist/documents/scope.js.map +1 -0
  41. package/dist/documents.d.ts +1 -0
  42. package/dist/documents.d.ts.map +1 -1
  43. package/dist/documents.js +1 -0
  44. package/dist/documents.js.map +1 -1
  45. package/dist/domain/task-categories.d.ts +15 -2
  46. package/dist/domain/task-categories.d.ts.map +1 -1
  47. package/dist/domain/task-categories.js +649 -26
  48. package/dist/domain/task-categories.js.map +1 -1
  49. package/dist/entities/agenda.d.ts +14 -1
  50. package/dist/entities/agenda.d.ts.map +1 -1
  51. package/dist/entities/agenda.js +6 -1
  52. package/dist/entities/agenda.js.map +1 -1
  53. package/dist/entities/index.d.ts +19 -1
  54. package/dist/entities/index.d.ts.map +1 -1
  55. package/dist/entities/task.d.ts +19 -0
  56. package/dist/entities/task.d.ts.map +1 -1
  57. package/dist/entities/task.js +11 -0
  58. package/dist/entities/task.js.map +1 -1
  59. package/dist/errors/reasons.d.ts +1 -1
  60. package/dist/errors/reasons.d.ts.map +1 -1
  61. package/dist/errors/reasons.js +12 -1
  62. package/dist/errors/reasons.js.map +1 -1
  63. package/dist/mcp/tools/tasks.d.ts.map +1 -1
  64. package/dist/mcp/tools/tasks.js +46 -18
  65. package/dist/mcp/tools/tasks.js.map +1 -1
  66. package/dist/search/task-signature.d.ts.map +1 -1
  67. package/dist/search/task-signature.js +32 -6
  68. package/dist/search/task-signature.js.map +1 -1
  69. package/dist/search/task-similarity.d.ts +15 -2
  70. package/dist/search/task-similarity.d.ts.map +1 -1
  71. package/dist/search/task-similarity.js +29 -10
  72. package/dist/search/task-similarity.js.map +1 -1
  73. package/dist/services/agenda.d.ts +7 -2
  74. package/dist/services/agenda.d.ts.map +1 -1
  75. package/dist/services/agenda.js +11 -0
  76. package/dist/services/agenda.js.map +1 -1
  77. package/dist/services/documents/extraction.d.ts +13 -0
  78. package/dist/services/documents/extraction.d.ts.map +1 -0
  79. package/dist/services/documents/extraction.js +37 -0
  80. package/dist/services/documents/extraction.js.map +1 -0
  81. package/dist/services/documents/ingestion.d.ts +29 -0
  82. package/dist/services/documents/ingestion.d.ts.map +1 -0
  83. package/dist/services/documents/ingestion.js +125 -0
  84. package/dist/services/documents/ingestion.js.map +1 -0
  85. package/dist/services/documents/knowledge.d.ts +58 -0
  86. package/dist/services/documents/knowledge.d.ts.map +1 -0
  87. package/dist/services/documents/knowledge.js +143 -0
  88. package/dist/services/documents/knowledge.js.map +1 -0
  89. package/dist/services/documents/plan.d.ts +11 -0
  90. package/dist/services/documents/plan.d.ts.map +1 -0
  91. package/dist/services/documents/plan.js +200 -0
  92. package/dist/services/documents/plan.js.map +1 -0
  93. package/dist/services/documents/ports.d.ts +24 -0
  94. package/dist/services/documents/ports.d.ts.map +1 -0
  95. package/dist/services/documents/ports.js +2 -0
  96. package/dist/services/documents/ports.js.map +1 -0
  97. package/dist/services/documents/proposals.d.ts +38 -0
  98. package/dist/services/documents/proposals.d.ts.map +1 -0
  99. package/dist/services/documents/proposals.js +52 -0
  100. package/dist/services/documents/proposals.js.map +1 -0
  101. package/dist/services/documents/sync.d.ts +24 -0
  102. package/dist/services/documents/sync.d.ts.map +1 -0
  103. package/dist/services/documents/sync.js +217 -0
  104. package/dist/services/documents/sync.js.map +1 -0
  105. package/dist/services/task-categories.d.ts +5 -2
  106. package/dist/services/task-categories.d.ts.map +1 -1
  107. package/dist/services/task-categories.js +37 -14
  108. package/dist/services/task-categories.js.map +1 -1
  109. package/dist/services/tasks.d.ts +38 -12
  110. package/dist/services/tasks.d.ts.map +1 -1
  111. package/dist/services/tasks.js +83 -17
  112. package/dist/services/tasks.js.map +1 -1
  113. package/dist/store/index.d.ts +1 -0
  114. package/dist/store/index.d.ts.map +1 -1
  115. package/dist/store/index.js +1 -0
  116. package/dist/store/index.js.map +1 -1
  117. package/dist/store/sqlite/lucene.d.ts.map +1 -1
  118. package/dist/store/sqlite/lucene.js +5 -2
  119. package/dist/store/sqlite/lucene.js.map +1 -1
  120. package/dist/store/sqlite/manifest.d.ts.map +1 -1
  121. package/dist/store/sqlite/manifest.js +1 -0
  122. package/dist/store/sqlite/manifest.js.map +1 -1
  123. package/dist/store/sqlite/migrations.generated.d.ts.map +1 -1
  124. package/dist/store/sqlite/migrations.generated.js +13 -0
  125. package/dist/store/sqlite/migrations.generated.js.map +1 -1
  126. package/dist/store/sqlite/schema.d.ts +112 -0
  127. package/dist/store/sqlite/schema.d.ts.map +1 -1
  128. package/dist/store/sqlite/schema.js +8 -0
  129. package/dist/store/sqlite/schema.js.map +1 -1
  130. package/dist/store/sqlite/task-candidates.d.ts +2 -0
  131. package/dist/store/sqlite/task-candidates.d.ts.map +1 -1
  132. package/dist/store/sqlite/task-candidates.js +76 -32
  133. package/dist/store/sqlite/task-candidates.js.map +1 -1
  134. package/dist/store/sqlite/task-category-settings.d.ts +3 -1
  135. package/dist/store/sqlite/task-category-settings.d.ts.map +1 -1
  136. package/dist/store/sqlite/task-category-settings.js +11 -1
  137. package/dist/store/sqlite/task-category-settings.js.map +1 -1
  138. package/dist/store/sqlite/task-close-store.d.ts +24 -0
  139. package/dist/store/sqlite/task-close-store.d.ts.map +1 -0
  140. package/dist/store/sqlite/task-close-store.js +57 -0
  141. package/dist/store/sqlite/task-close-store.js.map +1 -0
  142. package/dist/store/sqlite/task-close.d.ts +35 -0
  143. package/dist/store/sqlite/task-close.d.ts.map +1 -0
  144. package/dist/store/sqlite/task-close.js +68 -0
  145. package/dist/store/sqlite/task-close.js.map +1 -0
  146. package/dist/store/sqlite/task-pairs.d.ts +14 -4
  147. package/dist/store/sqlite/task-pairs.d.ts.map +1 -1
  148. package/dist/store/sqlite/task-pairs.js +31 -5
  149. package/dist/store/sqlite/task-pairs.js.map +1 -1
  150. package/dist/store/sqlite/task-relations.d.ts.map +1 -1
  151. package/dist/store/sqlite/task-relations.js +4 -1
  152. package/dist/store/sqlite/task-relations.js.map +1 -1
  153. package/dist/store/sqlite/tasks.d.ts +7 -2
  154. package/dist/store/sqlite/tasks.d.ts.map +1 -1
  155. package/dist/store/sqlite/tasks.js +18 -5
  156. package/dist/store/sqlite/tasks.js.map +1 -1
  157. package/dist/store/sqlite/work-tasks.d.ts +6 -1
  158. package/dist/store/sqlite/work-tasks.d.ts.map +1 -1
  159. package/dist/store/sqlite/work-tasks.js +8 -0
  160. package/dist/store/sqlite/work-tasks.js.map +1 -1
  161. package/dist/store/store.d.ts +1 -0
  162. package/dist/store/store.d.ts.map +1 -1
  163. package/dist/store/store.js +1 -0
  164. package/dist/store/store.js.map +1 -1
  165. package/package.json +3 -3
  166. package/parity.json +34 -0
  167. package/skills/follow-ups/SKILL.md +2 -1
@@ -0,0 +1,38 @@
1
+ import type { SourceContent } from "../../documents/model.js";
2
+ import type { Fact, Memory } from "../../store/index.js";
3
+ import { type Complete } from "./extraction.js";
4
+ import type { DocumentKnowledge } from "./knowledge.js";
5
+ export interface ImportedSource {
6
+ id: string;
7
+ ref: string;
8
+ hash: string;
9
+ snapshot: SourceContent;
10
+ }
11
+ export interface ProposalOptions {
12
+ read(): ImportedSource;
13
+ complete: Complete;
14
+ scope: Memory["scope"];
15
+ author: string;
16
+ tab?: string;
17
+ save?: boolean;
18
+ withWrite<T>(fn: (knowledge: DocumentKnowledge, principal: string, ref: string) => Promise<T>): Promise<T>;
19
+ }
20
+ export declare const extractDocumentMemories: (options: ProposalOptions) => Promise<{
21
+ items: {
22
+ kind: "digest" | "fact" | "preference" | "summary";
23
+ body: string;
24
+ quote: string;
25
+ }[];
26
+ provider: string;
27
+ model: string;
28
+ tokens: number;
29
+ provenance: {
30
+ document: string;
31
+ file_id: string;
32
+ hash: string;
33
+ url: string;
34
+ tab: string | null;
35
+ };
36
+ saved: (Fact | Memory)[];
37
+ }>;
38
+ //# sourceMappingURL=proposals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposals.d.ts","sourceRoot":"","sources":["../../../src/services/documents/proposals.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,KAAK,QAAQ,EAAmB,MAAM,iBAAiB,CAAA;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEvD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,aAAa,CAAA;CACxB;AACD,MAAM,WAAW,eAAe;IAC9B,IAAI,IAAI,cAAc,CAAA;IACtB,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAC3G;AACD,eAAO,MAAM,uBAAuB,YAAmB,eAAe;;;;;;;;;;QAyChE,QAAQ;QACR,OAAO;QACP,IAAI;QACJ,GAAG;QACH,GAAG;;;EAIR,CAAA"}
@@ -0,0 +1,52 @@
1
+ import { CliError } from "@wirecat/cli-base";
2
+ import { extractMemories } from "./extraction.js";
3
+ export const extractDocumentMemories = async (options) => {
4
+ const source = options.read();
5
+ const text = options.tab ? source.snapshot.tabs.find((tab) => tab.id === options.tab)?.text : source.snapshot.text;
6
+ if (text === undefined)
7
+ throw new CliError("not_found", "tab was not found in this imported document");
8
+ const result = await extractMemories(text, options.complete);
9
+ const assertCurrent = () => {
10
+ if (options.read().hash !== source.hash)
11
+ throw new CliError("validation_error", "source changed during extraction; no memories were saved", {
12
+ reason: "document.changed",
13
+ });
14
+ };
15
+ assertCurrent();
16
+ const saved = options.save
17
+ ? await options.withWrite(async (knowledge, principal, ref) => {
18
+ assertCurrent();
19
+ if (ref !== source.ref)
20
+ throw new CliError("validation_error", "source changed during extraction; no memories were saved", {
21
+ reason: "document.changed",
22
+ });
23
+ const items = [];
24
+ const by = { bot: options.author, model: result.model };
25
+ for (const item of result.items) {
26
+ const body = `${item.body}\n\nSource quote: ${item.quote}\nSnapshot: ${source.hash}`;
27
+ items.push(item.kind === "fact"
28
+ ? await knowledge.addFact(principal, ref, { statement: body, type: "fact", scope: options.scope, by })
29
+ : await knowledge.addMemory(principal, ref, {
30
+ kind: item.kind,
31
+ body,
32
+ scope: options.scope,
33
+ status: "proposed",
34
+ author: by,
35
+ }));
36
+ }
37
+ return items;
38
+ })
39
+ : [];
40
+ return {
41
+ ...result,
42
+ provenance: {
43
+ document: source.ref,
44
+ file_id: source.id,
45
+ hash: source.hash,
46
+ url: source.snapshot.metadata.url,
47
+ tab: options.tab ?? null,
48
+ },
49
+ saved,
50
+ };
51
+ };
52
+ //# sourceMappingURL=proposals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposals.js","sourceRoot":"","sources":["../../../src/services/documents/proposals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { SourceFile } from "../../documents/model.js";
2
+ import type { SyncOptions } from "./ports.js";
3
+ export interface SyncResult {
4
+ saved: number;
5
+ names_only: number;
6
+ removed: number;
7
+ unchanged: number;
8
+ pictures?: number;
9
+ pictures_too_large?: number;
10
+ pictures_skipped?: string;
11
+ pending: number;
12
+ skipped: {
13
+ id: string;
14
+ reason: string;
15
+ }[];
16
+ errors: {
17
+ id: string;
18
+ code: string;
19
+ message: string;
20
+ }[];
21
+ coverage: string;
22
+ }
23
+ export declare const syncDocuments: <M extends SourceFile>(options: SyncOptions<M>) => Promise<SyncResult>;
24
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/services/documents/sync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA+C,UAAU,EAAc,MAAM,0BAA0B,CAAA;AAGnH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAO7C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACzC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACvD,QAAQ,EAAE,MAAM,CAAA;CACjB;AACD,eAAO,MAAM,aAAa,GAAU,CAAC,SAAS,UAAU,WAAW,WAAW,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,UAAU,CA6MrG,CAAA"}
@@ -0,0 +1,217 @@
1
+ import { createHash } from "node:crypto";
2
+ import { CliError, isCliError } from "@wirecat/cli-base";
3
+ import { catalogFiles } from "../../documents/catalog.js";
4
+ import { within } from "../../documents/scope.js";
5
+ import { changedSince, planDocuments, scopeHash } from "./plan.js";
6
+ const MAX_PICTURE_BYTES = 25 * 1024 * 1024;
7
+ const SAVE_EVERY_MS = 2000;
8
+ const SAVE_EVERY_ITEMS = 25;
9
+ const isPicture = (file) => file.mime.startsWith("image/") && file.canDownload;
10
+ const hashText = (text) => createHash("sha256").update(text).digest("hex");
11
+ export const syncDocuments = async (options) => {
12
+ const { source, index, state: statePort, principal, roots, textLimit: limit, max, signal, rescan = false, pictures = false, assertHeld, errorOf, skipReason, storeVersion: VERSION, } = options;
13
+ if (![max, limit, options.maxEntries].every((value) => Number.isSafeInteger(value) && value > 0))
14
+ throw new CliError("validation_error", "sync limits must be positive whole numbers");
15
+ const profile = { principal, roots, picture_search: pictures };
16
+ const now = options.now ?? Date.now;
17
+ const lock = { assertHeld };
18
+ if (signal?.aborted)
19
+ throw new CliError("cancelled", "sync was cancelled");
20
+ const result = {
21
+ saved: 0,
22
+ names_only: 0,
23
+ removed: 0,
24
+ unchanged: 0,
25
+ pending: 0,
26
+ skipped: [],
27
+ errors: [],
28
+ coverage: "selected folders only; unsupported files are reported",
29
+ ...(profile.picture_search ? { pictures: 0 } : {}),
30
+ };
31
+ let writer;
32
+ let flush;
33
+ try {
34
+ if (profile.roots.length && (!source || (await source.identity()) !== profile.principal))
35
+ throw new CliError("authentication_error", "signed-in source account does not match this profile", {
36
+ reason: "profile.wrong-account",
37
+ });
38
+ const state = statePort.read();
39
+ if (state.principal !== principal)
40
+ throw new CliError("configuration_error", "sync state belongs to another source account");
41
+ const currentScope = scopeHash(profile.roots);
42
+ const abandoned = state.pending && (state.pending.scope !== currentScope || rescan) ? state.pending.jobs.map((job) => job.id) : [];
43
+ if (state.pending?.scope !== currentScope || rescan)
44
+ delete state.pending;
45
+ if (rescan) {
46
+ delete state.cursor;
47
+ statePort.removeWalk();
48
+ }
49
+ if (!state.pending) {
50
+ state.pending = await planDocuments(options, source, state, profile.roots, limit, profile.picture_search ?? false, abandoned, {
51
+ read: (scope) => statePort.readWalk(scope),
52
+ save: (walk) => statePort.saveWalk(walk),
53
+ });
54
+ state.skipped = state.pending.skipped;
55
+ statePort.save(state);
56
+ statePort.removeWalk();
57
+ }
58
+ const pending = state.pending;
59
+ if (!pending)
60
+ throw new CliError("invalid_response", "could not prepare a sync batch");
61
+ if (index.catalog)
62
+ await index.catalog.import(profile.principal, catalogFiles(state, profile.roots));
63
+ result.skipped = state.skipped.map(({ id, reason }) => ({ id, reason }));
64
+ const saveNamesOnly = async (file, reason) => {
65
+ const doc = { metadata: file, markdown: "", text: "", tabs: [], notRead: reason };
66
+ const hash = hashText("");
67
+ const previous = state.documents[file.id];
68
+ const reference = await index.save(profile.principal, doc, hash);
69
+ statePort.saveSnapshot(doc);
70
+ state.documents[file.id] = { metadata: file, hash, reference, tabs: 0, notRead: reason };
71
+ if (previous?.notRead === reason && !changedSince(previous.metadata, file))
72
+ result.unchanged++;
73
+ else
74
+ result.names_only++;
75
+ };
76
+ let modelMissing = false;
77
+ const savePictureOf = async (file) => {
78
+ const entry = state.documents[file.id];
79
+ if (!profile.picture_search || !isPicture(file) || modelMissing)
80
+ return;
81
+ if ((file.size ?? 0) > MAX_PICTURE_BYTES) {
82
+ entry.picture = "too-large";
83
+ result.pictures_too_large = (result.pictures_too_large ?? 0) + 1;
84
+ return;
85
+ }
86
+ if (!source)
87
+ throw new CliError("configuration_error", "a pending picture requires source sign-in");
88
+ if (!writer) {
89
+ try {
90
+ writer = await index.openPictures();
91
+ }
92
+ catch (error) {
93
+ if (!isCliError(error) || error.code !== "not_found")
94
+ throw error;
95
+ modelMissing = true;
96
+ result.pictures_skipped = error.message;
97
+ return;
98
+ }
99
+ }
100
+ const bytes = await source.bytes(file.id);
101
+ if (bytes.length > MAX_PICTURE_BYTES) {
102
+ entry.picture = "too-large";
103
+ result.pictures_too_large = (result.pictures_too_large ?? 0) + 1;
104
+ return;
105
+ }
106
+ if ((await writer.save(entry.reference, bytes)) === "saved")
107
+ result.pictures = (result.pictures ?? 0) + 1;
108
+ entry.picture = "saved";
109
+ };
110
+ // Saving the whole state after every file grows with the profile; a batch at a time keeps it bounded.
111
+ let unsaved = 0;
112
+ let savedAt = now();
113
+ flush = () => {
114
+ if (unsaved)
115
+ statePort.save(state);
116
+ unsaved = 0;
117
+ savedAt = now();
118
+ };
119
+ const progress = () => {
120
+ if (++unsaved >= SAVE_EVERY_ITEMS || now() - savedAt >= SAVE_EVERY_MS)
121
+ flush?.();
122
+ };
123
+ const jobs = [...pending.jobs].slice(0, max);
124
+ for (const job of jobs) {
125
+ if (signal?.aborted)
126
+ throw new CliError("cancelled", "sync was cancelled; pending operations are retained");
127
+ lock.assertHeld();
128
+ try {
129
+ if (job.kind === "remove") {
130
+ await index.remove(profile.principal, job.id);
131
+ statePort.removeSnapshot(job.id);
132
+ delete state.documents[job.id];
133
+ result.removed++;
134
+ }
135
+ else if (job.file && skipReason(job.file)) {
136
+ await saveNamesOnly(job.file, skipReason(job.file));
137
+ await savePictureOf(job.file);
138
+ }
139
+ else {
140
+ if (!source)
141
+ throw new CliError("configuration_error", "a pending save requires source sign-in");
142
+ const content = await source.content(job.id, limit);
143
+ if (!within(content.metadata, profile.roots, pending.folders)) {
144
+ await index.remove(profile.principal, job.id);
145
+ statePort.removeSnapshot(job.id);
146
+ delete state.documents[job.id];
147
+ result.removed++;
148
+ }
149
+ else {
150
+ const hash = hashText(content.text);
151
+ const previous = state.documents[job.id];
152
+ const reference = await index.save(profile.principal, content, hash).catch((error) => {
153
+ if (!isCliError(error) || error.code !== "validation_error")
154
+ throw error;
155
+ throw new CliError("validation_error", `the local store refused this text: ${error.message}`, {
156
+ reason: "store.refused",
157
+ store_refused_in: VERSION,
158
+ });
159
+ });
160
+ statePort.saveSnapshot(content);
161
+ state.documents[job.id] = { metadata: content.metadata, hash, reference, tabs: content.tabs.length };
162
+ if (previous?.hash === hash)
163
+ result.unchanged++;
164
+ else
165
+ result.saved++;
166
+ }
167
+ }
168
+ pending.jobs = pending.jobs.filter((item) => item !== job);
169
+ progress();
170
+ }
171
+ catch (error) {
172
+ const safe = errorOf(error);
173
+ if (safe.code === "cancelled")
174
+ throw safe;
175
+ if (job.kind === "save" && (safe.code === "not_found" || safe.code === "validation_error")) {
176
+ const skipped = {
177
+ id: job.id,
178
+ reason: safe.message,
179
+ ...(job.file ? { file: job.file } : {}),
180
+ ...(safe.details.text_limit ? { textLimit: limit } : {}),
181
+ ...(safe.details.store_refused_in ? { storeRefusedIn: VERSION } : {}),
182
+ };
183
+ if (job.file && safe.code === "validation_error")
184
+ await saveNamesOnly(job.file, skipped.reason);
185
+ else {
186
+ await index.remove(profile.principal, job.id);
187
+ statePort.removeSnapshot(job.id);
188
+ delete state.documents[job.id];
189
+ }
190
+ state.skipped = state.skipped.filter((item) => item.id !== job.id);
191
+ state.skipped.push(skipped);
192
+ result.skipped.push({ id: skipped.id, reason: skipped.reason });
193
+ pending.jobs = pending.jobs.filter((item) => item !== job);
194
+ progress();
195
+ continue;
196
+ }
197
+ result.errors.push({ id: job.id, code: safe.code, message: safe.message });
198
+ }
199
+ }
200
+ flush();
201
+ result.pending = pending.jobs.length;
202
+ if (!pending.jobs.length) {
203
+ state.cursor = pending.cursor;
204
+ state.scope = pending.scope;
205
+ state.folders = pending.folders;
206
+ delete state.pending;
207
+ state.lastSync = new Date(now()).toISOString();
208
+ statePort.save(state);
209
+ }
210
+ return result;
211
+ }
212
+ finally {
213
+ flush?.();
214
+ await writer?.close();
215
+ }
216
+ };
217
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/services/documents/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAEzD,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAGlE,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA;AAC1C,MAAM,aAAa,GAAG,IAAI,CAAA;AAC1B,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAC3B,MAAM,SAAS,GAAG,CAAC,IAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,WAAW,CAAA;AAC1F,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAclF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAwB,OAAuB,EAAuB,EAAE;IACxG,MAAM,EACJ,MAAM,EACN,KAAK,EACL,KAAK,EAAE,SAAS,EAChB,SAAS,EACT,KAAK,EACL,SAAS,EAAE,KAAK,EAChB,GAAG,EACH,MAAM,EACN,MAAM,GAAG,KAAK,EACd,QAAQ,GAAG,KAAK,EAChB,UAAU,EACV,OAAO,EACP,UAAU,EACV,YAAY,EAAE,OAAO,GACtB,GAAG,OAAO,CAAA;IACX,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;QAC9F,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,4CAA4C,CAAC,CAAA;IACtF,MAAM,OAAO,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAA;IAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAA;IACnC,MAAM,IAAI,GAAG,EAAE,UAAU,EAAE,CAAA;IAC3B,IAAI,MAAM,EAAE,OAAO;QAAE,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAA;IAC1E,MAAM,MAAM,GAAe;QACzB,KAAK,EAAE,CAAC;QACR,UAAU,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,uDAAuD;QACjE,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,CAAA;IACD,IAAI,MAAiC,CAAA;IACrC,IAAI,KAA+B,CAAA;IACnC,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC;YACtF,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,sDAAsD,EAAE;gBACjG,MAAM,EAAE,uBAAuB;aAChC,CAAC,CAAA;QACJ,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;QAC9B,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;YAC/B,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,8CAA8C,CAAC,CAAA;QAC3F,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC7C,MAAM,SAAS,GACb,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,KAAK,YAAY,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAClH,IAAI,KAAK,CAAC,OAAO,EAAE,KAAK,KAAK,YAAY,IAAI,MAAM;YAAE,OAAO,KAAK,CAAC,OAAO,CAAA;QACzE,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,KAAK,CAAC,MAAM,CAAA;YACnB,SAAS,CAAC,UAAU,EAAE,CAAA;QACxB,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,KAAK,CAAC,OAAO,GAAG,MAAM,aAAa,CACjC,OAAO,EACP,MAAM,EACN,KAAK,EACL,OAAO,CAAC,KAAK,EACb,KAAK,EACL,OAAO,CAAC,cAAc,IAAI,KAAK,EAC/B,SAAS,EACT;gBACE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC1C,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;aACzC,CACF,CAAA;YACD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAA;YACrC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACrB,SAAS,CAAC,UAAU,EAAE,CAAA;QACxB,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAA;QAC7B,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,gCAAgC,CAAC,CAAA;QACtF,IAAI,KAAK,CAAC,OAAO;YAAE,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QACpG,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;QACxE,MAAM,aAAa,GAAG,KAAK,EAAE,IAAO,EAAE,MAAc,EAAE,EAAE;YACtD,MAAM,GAAG,GAAqB,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;YACnG,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;YACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACzC,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAChE,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;YAC3B,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;YACxF,IAAI,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;gBAAE,MAAM,CAAC,SAAS,EAAE,CAAA;;gBACzF,MAAM,CAAC,UAAU,EAAE,CAAA;QAC1B,CAAC,CAAA;QACD,IAAI,YAAY,GAAG,KAAK,CAAA;QACxB,MAAM,aAAa,GAAG,KAAK,EAAE,IAAO,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAqB,CAAA;YAC1D,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,YAAY;gBAAE,OAAM;YACvE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,iBAAiB,EAAE,CAAC;gBACzC,KAAK,CAAC,OAAO,GAAG,WAAW,CAAA;gBAC3B,MAAM,CAAC,kBAAkB,GAAG,CAAC,MAAM,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;gBAChE,OAAM;YACR,CAAC;YACD,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,2CAA2C,CAAC,CAAA;YACnG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,CAAC;oBACH,MAAM,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE,CAAA;gBACrC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;wBAAE,MAAM,KAAK,CAAA;oBACjE,YAAY,GAAG,IAAI,CAAA;oBACnB,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAA;oBACvC,OAAM;gBACR,CAAC;YACH,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACzC,IAAI,KAAK,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;gBACrC,KAAK,CAAC,OAAO,GAAG,WAAW,CAAA;gBAC3B,MAAM,CAAC,kBAAkB,GAAG,CAAC,MAAM,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;gBAChE,OAAM;YACR,CAAC;YACD,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,KAAK,OAAO;gBAAE,MAAM,CAAC,QAAQ,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;YACzG,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;QACzB,CAAC,CAAA;QACD,sGAAsG;QACtG,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,IAAI,OAAO,GAAG,GAAG,EAAE,CAAA;QACnB,KAAK,GAAG,GAAG,EAAE;YACX,IAAI,OAAO;gBAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClC,OAAO,GAAG,CAAC,CAAA;YACX,OAAO,GAAG,GAAG,EAAE,CAAA;QACjB,CAAC,CAAA;QACD,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,IAAI,EAAE,OAAO,IAAI,gBAAgB,IAAI,GAAG,EAAE,GAAG,OAAO,IAAI,aAAa;gBAAE,KAAK,EAAE,EAAE,CAAA;QAClF,CAAC,CAAA;QACD,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QAC5C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,MAAM,EAAE,OAAO;gBAAE,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,qDAAqD,CAAC,CAAA;YAC3G,IAAI,CAAC,UAAU,EAAE,CAAA;YACjB,IAAI,CAAC;gBACH,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC1B,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;oBAC7C,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;oBAChC,OAAO,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;oBAC9B,MAAM,CAAC,OAAO,EAAE,CAAA;gBAClB,CAAC;qBAAM,IAAI,GAAG,CAAC,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5C,MAAM,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAW,CAAC,CAAA;oBAC7D,MAAM,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBAC/B,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM;wBAAE,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,wCAAwC,CAAC,CAAA;oBAChG,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;oBACnD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC9D,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;wBAC7C,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;wBAChC,OAAO,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;wBAC9B,MAAM,CAAC,OAAO,EAAE,CAAA;oBAClB,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;wBACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;wBACxC,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;4BAC5F,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB;gCAAE,MAAM,KAAK,CAAA;4BACxE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,sCAAsC,KAAK,CAAC,OAAO,EAAE,EAAE;gCAC5F,MAAM,EAAE,eAAe;gCACvB,gBAAgB,EAAE,OAAO;6BAC1B,CAAC,CAAA;wBACJ,CAAC,CAAC,CAAA;wBACF,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;wBAC/B,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAA;wBACpG,IAAI,QAAQ,EAAE,IAAI,KAAK,IAAI;4BAAE,MAAM,CAAC,SAAS,EAAE,CAAA;;4BAC1C,MAAM,CAAC,KAAK,EAAE,CAAA;oBACrB,CAAC;gBACH,CAAC;gBACD,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,CAAA;gBAC1D,QAAQ,EAAE,CAAA;YACZ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;gBAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;oBAAE,MAAM,IAAI,CAAA;gBACzC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,CAAC,EAAE,CAAC;oBAC3F,MAAM,OAAO,GAAkB;wBAC7B,EAAE,EAAE,GAAG,CAAC,EAAE;wBACV,MAAM,EAAE,IAAI,CAAC,OAAO;wBACpB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACvC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACxD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACtE,CAAA;oBACD,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB;wBAAE,MAAM,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;yBAC1F,CAAC;wBACJ,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;wBAC7C,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;wBAChC,OAAO,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;oBAChC,CAAC;oBACD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAA;oBAClE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;oBAC3B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;oBAC/D,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,CAAA;oBAC1D,QAAQ,EAAE,CAAA;oBACV,SAAQ;gBACV,CAAC;gBACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;YAC5E,CAAC;QACH,CAAC;QACD,KAAK,EAAE,CAAA;QACP,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAA;QACpC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACzB,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;YAC7B,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;YAC3B,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;YAC/B,OAAO,KAAK,CAAC,OAAO,CAAA;YACpB,KAAK,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;YAC9C,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACvB,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,EAAE,CAAA;QACT,MAAM,MAAM,EAAE,KAAK,EAAE,CAAA;IACvB,CAAC;AACH,CAAC,CAAA"}
@@ -1,7 +1,10 @@
1
1
  import { type TaskCategory } from "../domain/task-categories.js";
2
- export { DEFAULT_TASK_CATEGORIES, FALLBACK_CATEGORY, parseTaskCategory, type TaskCategory, withTaskCategory, } from "../domain/task-categories.js";
2
+ export { DEFAULT_TASK_CATEGORIES, FALLBACK_CATEGORY, parseTaskCategory, type TaskCategory, type UnlistedCategory, unlistedNote, withTaskCategory, } from "../domain/task-categories.js";
3
3
  /** A category the list holds, or a refusal that names the list. */
4
4
  export declare const taskCategoryOf: (categories?: readonly TaskCategory[], flag?: string) => (typed: string) => string;
5
- /** The category whose trigger stems the text shares most; none shared is `other`. A tie goes to the earlier one. */
5
+ /**
6
+ * The category with the most distinct trigger stems in the text; none is `other`, a tie goes to the earlier one.
7
+ * A word hits by its English stem first, so a cognate (`hospital`) counts once, not twice.
8
+ */
6
9
  export declare const categorize: (text: string, categories?: readonly TaskCategory[]) => string;
7
10
  //# sourceMappingURL=task-categories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"task-categories.d.ts","sourceRoot":"","sources":["../../src/services/task-categories.ts"],"names":[],"mappings":"AACA,OAAO,EAA8C,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAG5G,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,YAAY,EACjB,gBAAgB,GACjB,MAAM,8BAA8B,CAAA;AAIrC,mEAAmE;AACnE,eAAO,MAAM,cAAc,gBACZ,SAAS,YAAY,EAAE,4BAC5B,MAAM,KAAG,MAQhB,CAAA;AAgBH,oHAAoH;AACpH,eAAO,MAAM,UAAU,SAAU,MAAM,eAAc,SAAS,YAAY,EAAE,KAA6B,MAUxG,CAAA"}
1
+ {"version":3,"file":"task-categories.d.ts","sourceRoot":"","sources":["../../src/services/task-categories.ts"],"names":[],"mappings":"AACA,OAAO,EAA8C,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAG5G,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,YAAY,EACZ,gBAAgB,GACjB,MAAM,8BAA8B,CAAA;AAIrC,mEAAmE;AACnE,eAAO,MAAM,cAAc,gBACZ,SAAS,YAAY,EAAE,4BAC5B,MAAM,KAAG,MAQhB,CAAA;AAoCH;;;GAGG;AACH,eAAO,MAAM,UAAU,SAAU,MAAM,eAAc,SAAS,YAAY,EAAE,KAA6B,MAexG,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { CliError, singleLine } from "@wirecat/cli-base";
2
2
  import { DEFAULT_TASK_CATEGORIES, FALLBACK_CATEGORY } from "../domain/task-categories.js";
3
3
  import { createStemmer } from "../search/stem.js";
4
- export { DEFAULT_TASK_CATEGORIES, FALLBACK_CATEGORY, parseTaskCategory, withTaskCategory, } from "../domain/task-categories.js";
4
+ export { DEFAULT_TASK_CATEGORIES, FALLBACK_CATEGORY, parseTaskCategory, unlistedNote, withTaskCategory, } from "../domain/task-categories.js";
5
5
  const names = (categories) => categories.map(({ name }) => name).join(", ");
6
6
  /** A category the list holds, or a refusal that names the list. */
7
7
  export const taskCategoryOf = (categories = DEFAULT_TASK_CATEGORIES, flag = "--category") => (typed) => {
@@ -10,31 +10,54 @@ export const taskCategoryOf = (categories = DEFAULT_TASK_CATEGORIES, flag = "--c
10
10
  return name;
11
11
  throw new CliError("validation_error", `${flag} takes ${names(categories)} — not "${singleLine(typed)}"; tasks categories says what each means`, { reason: "task.category-unknown" });
12
12
  };
13
- let stemmer;
13
+ /**
14
+ * A Latin word may be English or Spanish. Every trigger meets the message's English stems, as it always has; Spanish
15
+ * triggers also meet its Spanish stems, but only in a message that reads as Spanish: Spanish stems are short and
16
+ * English words land on them (`page` → `pag`, the stem of `pagar`).
17
+ */
18
+ let stemmers;
19
+ const stemmersOf = () => (stemmers ??= {
20
+ english: createStemmer({ cyrillic: "russian", latin: "english" }),
21
+ spanish: createStemmer({ cyrillic: "russian", latin: "spanish" }),
22
+ });
23
+ const SPANISH_LETTERS = /[ñáéíóú¿¡]/u;
24
+ const SPANISH_WORDS = new Set("de del la las el los que por para una unos unas hay tengo hola gracias".split(" "));
25
+ const readsSpanish = (text) => SPANISH_LETTERS.test(text.toLowerCase()) ||
26
+ (text.toLowerCase().match(/\p{L}+/gu) ?? []).some((word) => SPANISH_WORDS.has(word));
14
27
  const stemsByList = new WeakMap();
15
- const triggerStems = (categories, stem) => {
28
+ const triggerStems = (categories) => {
16
29
  const known = stemsByList.get(categories);
17
30
  if (known)
18
31
  return known;
32
+ const { english, spanish } = stemmersOf();
19
33
  const built = categories.map(({ name, triggers }) => ({
20
34
  name,
21
- stems: new Set(Object.values(triggers).flatMap((words) => words.flatMap((word) => stem.stemTokens(word)))),
35
+ english: new Set(Object.values(triggers).flatMap((words) => words.flatMap((word) => english.stemTokens(word)))),
36
+ spanish: new Set(triggers.es.flatMap((word) => spanish.stemTokens(word))),
22
37
  }));
23
38
  stemsByList.set(categories, built);
24
39
  return built;
25
40
  };
26
- /** The category whose trigger stems the text shares most; none shared is `other`. A tie goes to the earlier one. */
41
+ /**
42
+ * The category with the most distinct trigger stems in the text; none is `other`, a tie goes to the earlier one.
43
+ * A word hits by its English stem first, so a cognate (`hospital`) counts once, not twice.
44
+ */
27
45
  export const categorize = (text, categories = DEFAULT_TASK_CATEGORIES) => {
28
- stemmer ??= createStemmer();
29
- const words = new Set(stemmer.stemTokens(text));
46
+ const stem = stemmersOf();
47
+ const english = stem.english.stemTokens(text);
48
+ const spanish = readsSpanish(text) ? stem.spanish.stemTokens(text) : [];
30
49
  let best = { name: FALLBACK_CATEGORY, hits: 0 };
31
- for (const { name, stems } of triggerStems(categories, stemmer)) {
32
- let hits = 0;
33
- for (const stem of stems)
34
- if (words.has(stem))
35
- hits += 1;
36
- if (hits > best.hits)
37
- best = { name, hits };
50
+ for (const triggers of triggerStems(categories)) {
51
+ const hit = new Set();
52
+ english.forEach((word, at) => {
53
+ const other = spanish[at];
54
+ if (triggers.english.has(word))
55
+ hit.add(word);
56
+ else if (other !== undefined && triggers.spanish.has(other))
57
+ hit.add(other);
58
+ });
59
+ if (hit.size > best.hits)
60
+ best = { name: triggers.name, hits: hit.size };
38
61
  }
39
62
  return best.name;
40
63
  };
@@ -1 +1 @@
1
- {"version":3,"file":"task-categories.js","sourceRoot":"","sources":["../../src/services/task-categories.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task-categories.js","sourceRoot":"","sources":["../../src/services/task-categories.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import { type QueryAst } from "@wirecat/cli-base/query";
2
2
  import type * as v from "valibot";
3
3
  import { task as taskEntity } from "../entities/task.js";
4
- import { type SimilarTask, type TaskDraft, type TaskPair, type TaskRelation } from "../store/index.js";
4
+ import { type CloseSuggestion, type SimilarTask, type TaskDraft, type TaskPair, type TaskPairSide, type TaskRelation } from "../store/index.js";
5
5
  import type { AccountKey, MessageStore, TaskDetails, ThingLink } from "../store/store.js";
6
6
  import { type ClosedState, type GroupStats, TASK_KINDS, TASK_STATES, type Task, type TaskKind, type TaskOrigin } from "../tasks/index.js";
7
7
  import type { ServiceDeps } from "./deps.js";
8
- import { type TaskCategory } from "./task-categories.js";
8
+ import { type TaskCategory, type UnlistedCategory } from "./task-categories.js";
9
9
  export { TASK_KINDS, TASK_STATES };
10
10
  /** Source previews are read on demand; task records never retain source text. */
11
11
  export interface TaskView extends Task {
@@ -84,6 +84,19 @@ export interface DuplicateChoice {
84
84
  /** How many candidates a refused `tasks add` lists. */
85
85
  export declare const REFUSAL_CANDIDATES = 5;
86
86
  export type DuplicateCandidate = Pick<SimilarTask, "ref" | "key" | "title" | "status" | "score" | "band" | "reasons">;
87
+ export interface CloseRequest {
88
+ as?: ClosedState;
89
+ reason?: string;
90
+ by: TaskOrigin;
91
+ /** The agent's name, recorded with its suggestion. */
92
+ agent?: string;
93
+ /** 0–1: how sure the agent is that the task needs nothing more. */
94
+ certainty?: number;
95
+ }
96
+ export interface ClosedTask extends TaskView {
97
+ closeCertainty: number | null;
98
+ closeSuggestion: CloseSuggestion | null;
99
+ }
87
100
  export interface TaskCard extends TaskDetails {
88
101
  links: ThingLink[];
89
102
  }
@@ -98,13 +111,17 @@ export interface TasksService {
98
111
  limit?: number;
99
112
  }): Promise<SimilarTask[]>;
100
113
  /**
101
- * Refused (`task.duplicate-candidates`, with the candidates) while an open or recent task is likely or maybe the
102
- * same job, unless `choice` says to attach the message to one of them or to open the task anyway.
114
+ * Refused (`task.duplicate-candidates`, with the candidates) while an open task is likely or maybe the same job,
115
+ * unless `choice` says to attach the message to one of them or to open the task anyway. A task opened while one
116
+ * closed in the last 14 days is likely or maybe the same job follows it up (`followUpOf`); that one stays closed.
103
117
  */
104
118
  add(message: string, type: TaskKind, origin: TaskOrigin, plan?: TaskPlan, choice?: DuplicateChoice): Promise<{
105
119
  task: TaskView;
106
120
  created: boolean;
107
121
  attached?: boolean;
122
+ review?: number;
123
+ /** The task closed in the last 14 days this one follows up; it stays closed. */
124
+ followUpOf?: TaskPairSide;
108
125
  card?: TaskCard;
109
126
  }>;
110
127
  /** Pairs a rule left for review — or, with `unsure`, the ones the reviewing agent passed to the owner — newest first. */
@@ -119,17 +136,20 @@ export interface TasksService {
119
136
  merge(dup: string, into: string, by: TaskOrigin): Promise<{
120
137
  pair: TaskPair;
121
138
  linked: number;
139
+ review: number;
122
140
  task: TaskCard;
123
141
  }>;
124
142
  unmerge(dup: string, by: TaskOrigin): Promise<{
125
143
  pair: TaskPair;
126
144
  task: TaskCard;
127
145
  }>;
128
- close(id: string, options: {
129
- as: ClosedState;
130
- reason?: string;
131
- by: TaskOrigin;
132
- }): Promise<TaskView>;
146
+ /**
147
+ * An agent states its `certainty`; below the store's threshold, or while agent closes are off, the task stays open
148
+ * with the close waiting on the owner. The owner always closes; `as` left out takes the agent's suggestion.
149
+ */
150
+ close(id: string, options: CloseRequest): Promise<ClosedTask>;
151
+ /** The owner refuses an agent's close: the task stays open and the suggestion goes. */
152
+ reject(id: string, by: TaskOrigin): Promise<TaskCard>;
133
153
  stats(filter?: {
134
154
  chat?: string;
135
155
  type?: TaskKind;
@@ -138,7 +158,8 @@ export interface TasksService {
138
158
  plan(id: string, plan: TaskPlan, by: TaskOrigin): Promise<TaskCard>;
139
159
  /**
140
160
  * Links a task to stored things (`msg:`, `chat:`, `person:`, `document:`…) or, for what the store does
141
- * not hold, to the text as written — a URL, a message not saved yet.
161
+ * not hold, to the text as written — a URL, a message not saved yet. After a `msg:` target, `review` counts the
162
+ * pairs the duplicate check sent to `tasks duplicates`.
142
163
  */
143
164
  link(id: string, targets: {
144
165
  references?: readonly string[];
@@ -146,12 +167,16 @@ export interface TasksService {
146
167
  }, options: {
147
168
  kind: TaskLinkOptionKind;
148
169
  by: TaskOrigin;
149
- }): Promise<TaskCard | {
170
+ }): Promise<(TaskCard & {
171
+ review?: number;
172
+ }) | {
150
173
  relations: TaskRelation[];
151
174
  }>;
152
175
  show(id: string): Promise<TaskCard>;
153
176
  /** The list a task's category comes from, with what each one means. */
154
177
  categories(): Promise<readonly TaskCategory[]>;
178
+ /** Categories tasks still carry that the list no longer holds, across the store, with open and total counts. */
179
+ unlistedCategories(): Promise<UnlistedCategory[]>;
155
180
  /** Takes an open task for `holder` for `forMs`; refused, naming the holder, while someone else holds it. */
156
181
  claim(id: string, holder: string, forMs: number): Promise<TaskCard>;
157
182
  /** Gives a task back; only its holder or the owner may. */
@@ -168,10 +193,11 @@ export declare const taskTypesOf: (typed: string) => TaskKind[];
168
193
  /** `categories` fixes the list; left out, each call reads the store's (`config set task_categories.*`). */
169
194
  export declare const tasksService: (deps: ServiceDeps, categories?: readonly TaskCategory[]) => TasksService;
170
195
  /** A stored task as the `task` entity: its chat as a `chat:` reference, its times in ISO 8601. */
171
- export declare const taskItem: (account: AccountKey, { task, title, updatedAt }: {
196
+ export declare const taskItem: (account: AccountKey, { task, title, updatedAt, closeSuggestion, }: {
172
197
  task: Task;
173
198
  title: string;
174
199
  updatedAt: Date;
200
+ closeSuggestion?: CloseSuggestion | null;
175
201
  }) => TaskItem;
176
202
  export declare const taskView: (store: MessageStore, account: AccountKey, task: Task) => Promise<TaskView>;
177
203
  //# sourceMappingURL=tasks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/services/tasks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/services/tasks.ts"],"names":[],"mappings":"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"}