@wirecat/cli-core 0.294.0 → 0.295.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 (156) 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 +66 -11
  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 +65 -2
  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 +5 -0
  46. package/dist/domain/task-categories.d.ts.map +1 -1
  47. package/dist/domain/task-categories.js +473 -24
  48. package/dist/domain/task-categories.js.map +1 -1
  49. package/dist/entities/agenda.d.ts +9 -1
  50. package/dist/entities/agenda.d.ts.map +1 -1
  51. package/dist/entities/agenda.js +4 -1
  52. package/dist/entities/agenda.js.map +1 -1
  53. package/dist/entities/index.d.ts +15 -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 +37 -14
  65. package/dist/mcp/tools/tasks.js.map +1 -1
  66. package/dist/search/task-similarity.d.ts +15 -2
  67. package/dist/search/task-similarity.d.ts.map +1 -1
  68. package/dist/search/task-similarity.js +29 -10
  69. package/dist/search/task-similarity.js.map +1 -1
  70. package/dist/services/agenda.d.ts +2 -2
  71. package/dist/services/agenda.d.ts.map +1 -1
  72. package/dist/services/agenda.js +4 -0
  73. package/dist/services/agenda.js.map +1 -1
  74. package/dist/services/documents/extraction.d.ts +13 -0
  75. package/dist/services/documents/extraction.d.ts.map +1 -0
  76. package/dist/services/documents/extraction.js +37 -0
  77. package/dist/services/documents/extraction.js.map +1 -0
  78. package/dist/services/documents/ingestion.d.ts +29 -0
  79. package/dist/services/documents/ingestion.d.ts.map +1 -0
  80. package/dist/services/documents/ingestion.js +125 -0
  81. package/dist/services/documents/ingestion.js.map +1 -0
  82. package/dist/services/documents/knowledge.d.ts +58 -0
  83. package/dist/services/documents/knowledge.d.ts.map +1 -0
  84. package/dist/services/documents/knowledge.js +143 -0
  85. package/dist/services/documents/knowledge.js.map +1 -0
  86. package/dist/services/documents/plan.d.ts +11 -0
  87. package/dist/services/documents/plan.d.ts.map +1 -0
  88. package/dist/services/documents/plan.js +200 -0
  89. package/dist/services/documents/plan.js.map +1 -0
  90. package/dist/services/documents/ports.d.ts +24 -0
  91. package/dist/services/documents/ports.d.ts.map +1 -0
  92. package/dist/services/documents/ports.js +2 -0
  93. package/dist/services/documents/ports.js.map +1 -0
  94. package/dist/services/documents/proposals.d.ts +38 -0
  95. package/dist/services/documents/proposals.d.ts.map +1 -0
  96. package/dist/services/documents/proposals.js +52 -0
  97. package/dist/services/documents/proposals.js.map +1 -0
  98. package/dist/services/documents/sync.d.ts +24 -0
  99. package/dist/services/documents/sync.d.ts.map +1 -0
  100. package/dist/services/documents/sync.js +217 -0
  101. package/dist/services/documents/sync.js.map +1 -0
  102. package/dist/services/tasks.d.ts +35 -11
  103. package/dist/services/tasks.d.ts.map +1 -1
  104. package/dist/services/tasks.js +82 -17
  105. package/dist/services/tasks.js.map +1 -1
  106. package/dist/store/index.d.ts +1 -0
  107. package/dist/store/index.d.ts.map +1 -1
  108. package/dist/store/index.js +1 -0
  109. package/dist/store/index.js.map +1 -1
  110. package/dist/store/sqlite/lucene.d.ts.map +1 -1
  111. package/dist/store/sqlite/lucene.js +5 -2
  112. package/dist/store/sqlite/lucene.js.map +1 -1
  113. package/dist/store/sqlite/manifest.d.ts.map +1 -1
  114. package/dist/store/sqlite/manifest.js +1 -0
  115. package/dist/store/sqlite/manifest.js.map +1 -1
  116. package/dist/store/sqlite/migrations.generated.d.ts.map +1 -1
  117. package/dist/store/sqlite/migrations.generated.js +13 -0
  118. package/dist/store/sqlite/migrations.generated.js.map +1 -1
  119. package/dist/store/sqlite/schema.d.ts +112 -0
  120. package/dist/store/sqlite/schema.d.ts.map +1 -1
  121. package/dist/store/sqlite/schema.js +8 -0
  122. package/dist/store/sqlite/schema.js.map +1 -1
  123. package/dist/store/sqlite/task-candidates.d.ts +2 -0
  124. package/dist/store/sqlite/task-candidates.d.ts.map +1 -1
  125. package/dist/store/sqlite/task-candidates.js +76 -32
  126. package/dist/store/sqlite/task-candidates.js.map +1 -1
  127. package/dist/store/sqlite/task-close-store.d.ts +24 -0
  128. package/dist/store/sqlite/task-close-store.d.ts.map +1 -0
  129. package/dist/store/sqlite/task-close-store.js +57 -0
  130. package/dist/store/sqlite/task-close-store.js.map +1 -0
  131. package/dist/store/sqlite/task-close.d.ts +35 -0
  132. package/dist/store/sqlite/task-close.d.ts.map +1 -0
  133. package/dist/store/sqlite/task-close.js +68 -0
  134. package/dist/store/sqlite/task-close.js.map +1 -0
  135. package/dist/store/sqlite/task-pairs.d.ts +14 -4
  136. package/dist/store/sqlite/task-pairs.d.ts.map +1 -1
  137. package/dist/store/sqlite/task-pairs.js +31 -5
  138. package/dist/store/sqlite/task-pairs.js.map +1 -1
  139. package/dist/store/sqlite/task-relations.d.ts.map +1 -1
  140. package/dist/store/sqlite/task-relations.js +4 -1
  141. package/dist/store/sqlite/task-relations.js.map +1 -1
  142. package/dist/store/sqlite/tasks.d.ts +4 -1
  143. package/dist/store/sqlite/tasks.d.ts.map +1 -1
  144. package/dist/store/sqlite/tasks.js +16 -4
  145. package/dist/store/sqlite/tasks.js.map +1 -1
  146. package/dist/store/sqlite/work-tasks.d.ts +6 -1
  147. package/dist/store/sqlite/work-tasks.d.ts.map +1 -1
  148. package/dist/store/sqlite/work-tasks.js +8 -0
  149. package/dist/store/sqlite/work-tasks.js.map +1 -1
  150. package/dist/store/store.d.ts +1 -0
  151. package/dist/store/store.d.ts.map +1 -1
  152. package/dist/store/store.js +1 -0
  153. package/dist/store/store.js.map +1 -1
  154. package/package.json +3 -3
  155. package/parity.json +34 -0
  156. package/skills/follow-ups/SKILL.md +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/services/documents/plan.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAc,MAAM,0BAA0B,CAAA;AAE/G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,eAAO,MAAM,SAAS,UAAW,MAAM,EAAE,WAGvB,CAAA;AAClB,eAAO,MAAM,YAAY,aAAc,UAAU,QAAQ,UAAU,YAKA,CAAA;AAGnE,UAAU,SAAS,CAAC,CAAC,SAAS,UAAU;IACtC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;IAClD,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;CACpC;AAED,eAAO,MAAM,aAAa,GAAU,CAAC,SAAS,UAAU,WAC7C,WAAW,CAAC,CAAC,CAAC,UACf,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,SAC9B,WAAW,CAAC,CAAC,CAAC,SACd,MAAM,EAAE,SACR,MAAM,YACH,OAAO,cACN,MAAM,EAAE,UACX,SAAS,CAAC,CAAC,CAAC,KACnB,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAmKhD,CAAA"}
@@ -0,0 +1,200 @@
1
+ import { createHash } from "node:crypto";
2
+ import { CliError } from "@wirecat/cli-base";
3
+ import { within } from "../../documents/scope.js";
4
+ export const scopeHash = (roots) => createHash("sha256")
5
+ .update(JSON.stringify([...roots].sort()))
6
+ .digest("hex");
7
+ export const changedSince = (previous, file) => previous.version !== file.version ||
8
+ previous.modifiedAt !== file.modifiedAt ||
9
+ previous.name !== file.name ||
10
+ previous.canDownload !== file.canDownload ||
11
+ JSON.stringify(previous.parents) !== JSON.stringify(file.parents);
12
+ const SAVE_EVERY_MS = 2000;
13
+ export const planDocuments = async (options, source, state, roots, limit, pictures, abandoned = [], walks) => {
14
+ const { isFolder, skipReason, retryable, maxEntries: MAX_ENTRIES, errorOf } = options;
15
+ const tooManyEntries = () => options.limitError?.() ?? new CliError("validation_error", `selected folders exceed the ${MAX_ENTRIES} entry limit`);
16
+ const scope = scopeHash(roots);
17
+ if (!roots.length)
18
+ return {
19
+ scope,
20
+ cursor: state.cursor ?? "",
21
+ folders: {},
22
+ skipped: [],
23
+ jobs: [...new Set([...Object.keys(state.documents), ...abandoned])].map((id) => ({ id, kind: "remove" })),
24
+ };
25
+ if (!source)
26
+ throw new CliError("configuration_error", "selected folders require an authenticated source");
27
+ const initial = !state.cursor || scope !== state.scope;
28
+ const resumed = initial ? walks?.read(scope) : undefined;
29
+ const cursor = initial ? (resumed?.cursor ?? (await source.startToken())) : state.cursor;
30
+ const folders = initial ? {} : structuredClone(state.folders);
31
+ const files = new Map(Object.values(state.documents).map((doc) => [doc.metadata.id, doc.metadata]));
32
+ const changed = new Set();
33
+ for (const skipped of state.skipped)
34
+ if (skipped.file)
35
+ files.set(skipped.id, skipped.file);
36
+ const visited = new Set();
37
+ let discovered = 0;
38
+ const crawl = async (folder, ancestry = new Set()) => {
39
+ if (ancestry.has(folder.id))
40
+ throw new CliError("invalid_response", "folder traversal contains a cycle");
41
+ if (visited.has(folder.id))
42
+ return;
43
+ visited.add(folder.id);
44
+ folders[folder.id] = folder;
45
+ for (const file of await source.children(folder.id)) {
46
+ if (++discovered > MAX_ENTRIES)
47
+ throw tooManyEntries();
48
+ if (isFolder(file))
49
+ await crawl(file, new Set([...ancestry, folder.id]));
50
+ else {
51
+ files.set(file.id, file);
52
+ changed.add(file.id);
53
+ }
54
+ }
55
+ };
56
+ let finalCursor = cursor;
57
+ if (initial) {
58
+ files.clear();
59
+ const walk = resumed ?? {
60
+ scope,
61
+ cursor,
62
+ stack: [...roots].reverse().map((id) => ({ id, ancestry: [] })),
63
+ visited: [],
64
+ folders: {},
65
+ files: [],
66
+ discovered: 0,
67
+ };
68
+ for (const id of walk.visited)
69
+ visited.add(id);
70
+ Object.assign(folders, walk.folders);
71
+ for (const file of walk.files) {
72
+ files.set(file.id, file);
73
+ changed.add(file.id);
74
+ }
75
+ discovered = walk.discovered;
76
+ let savedAt = (options.now ?? Date.now)();
77
+ const record = () => {
78
+ walks?.save({ ...walk, visited: [...visited], folders, files: [...files.values()], discovered });
79
+ savedAt = (options.now ?? Date.now)();
80
+ };
81
+ try {
82
+ for (let step = walk.stack.at(-1); step; step = walk.stack.at(-1)) {
83
+ if (step.ancestry.includes(step.id))
84
+ throw new CliError("invalid_response", "folder traversal contains a cycle");
85
+ if (visited.has(step.id)) {
86
+ walk.stack.pop();
87
+ continue;
88
+ }
89
+ const folder = step.folder ?? (await source.metadata(step.id));
90
+ if (!step.folder && (!isFolder(folder) || folder.trashed))
91
+ throw new CliError("validation_error", "configured root is not an accessible folder");
92
+ const children = await source.children(folder.id);
93
+ if (discovered + children.length > MAX_ENTRIES)
94
+ throw tooManyEntries();
95
+ discovered += children.length;
96
+ walk.stack.pop();
97
+ visited.add(folder.id);
98
+ folders[folder.id] = folder;
99
+ const nested = [];
100
+ for (const file of children)
101
+ if (isFolder(file))
102
+ nested.push({ id: file.id, ancestry: [...step.ancestry, folder.id], folder: file });
103
+ else {
104
+ files.set(file.id, file);
105
+ changed.add(file.id);
106
+ }
107
+ for (const entry of nested.reverse())
108
+ walk.stack.push(entry);
109
+ if ((options.now ?? Date.now)() - savedAt > SAVE_EVERY_MS)
110
+ record();
111
+ }
112
+ }
113
+ catch (error) {
114
+ record();
115
+ throw error;
116
+ }
117
+ }
118
+ else {
119
+ const page = await source.changes(cursor);
120
+ finalCursor = page.cursor;
121
+ const latest = new Map(page.items.map((change) => [change.id, change]));
122
+ const entering = [];
123
+ // Apply all ancestry changes before classifying document scope.
124
+ for (const change of latest.values()) {
125
+ if (change.removed || change.file?.trashed) {
126
+ files.delete(change.id);
127
+ if (folders[change.id])
128
+ folders[change.id] = { ...folders[change.id], trashed: true };
129
+ }
130
+ else if (change.file && isFolder(change.file)) {
131
+ folders[change.id] = change.file;
132
+ entering.push(change.file);
133
+ }
134
+ else if (change.file) {
135
+ files.set(change.id, change.file);
136
+ changed.add(change.id);
137
+ }
138
+ else if (state.documents[change.id] || folders[change.id])
139
+ throw new CliError("invalid_response", "known source changed without metadata; checkpoint preserved");
140
+ }
141
+ // Provider access changes may not emit an event for every descendant file.
142
+ for (const root of roots) {
143
+ const previous = folders[root];
144
+ try {
145
+ const current = await source.metadata(root);
146
+ if (current.id !== root || !isFolder(current))
147
+ throw new CliError("invalid_response", "selected folder metadata is inconsistent");
148
+ folders[root] = current;
149
+ if (previous?.trashed && !current.trashed)
150
+ entering.push(current);
151
+ }
152
+ catch (error) {
153
+ const safe = errorOf(error);
154
+ if (safe.code !== "not_found" || !previous)
155
+ throw safe;
156
+ folders[root] = { ...previous, trashed: true };
157
+ }
158
+ }
159
+ for (const folder of entering)
160
+ if (!visited.has(folder.id) && within(folder, roots, folders))
161
+ await crawl(folder);
162
+ }
163
+ const jobs = [];
164
+ const skipped = [];
165
+ for (const root of roots)
166
+ if (folders[root]?.trashed)
167
+ skipped.push({ id: root, reason: "selected folder is unavailable" });
168
+ for (const [id, file] of files) {
169
+ if (!within(file, roots, folders))
170
+ continue;
171
+ const previousSkip = state.skipped.find((item) => item.id === id);
172
+ const reason = skipReason(file);
173
+ const retry = previousSkip && !reason && retryable(previousSkip, limit);
174
+ const known = state.documents[id];
175
+ const pictureDue = pictures && file.mime.startsWith("image/") && file.canDownload && known !== undefined && !known.picture;
176
+ if (previousSkip && !changed.has(id) && !initial && !retry && !pictureDue && !(reason && !state.documents[id])) {
177
+ skipped.push({ ...previousSkip, file });
178
+ continue;
179
+ }
180
+ if (reason) {
181
+ skipped.push({ id, reason, file });
182
+ if (initial || !known || known.notRead !== reason || changedSince(known.metadata, file) || pictureDue)
183
+ jobs.push({ id, kind: "save", file });
184
+ continue;
185
+ }
186
+ if (changed.has(id) || retry || known?.notRead) {
187
+ if (!known || known.notRead || changedSince(known.metadata, file) || initial)
188
+ jobs.push({ id, kind: "save", file });
189
+ }
190
+ }
191
+ for (const id of new Set([...Object.keys(state.documents), ...abandoned])) {
192
+ const file = files.get(id);
193
+ if (!file || !within(file, roots, folders))
194
+ jobs.push({ id, kind: "remove" });
195
+ }
196
+ // Only retain metadata for selected ancestry; the account-wide feed includes unrelated folders.
197
+ const scopedFolders = Object.fromEntries(Object.entries(folders).filter(([, file]) => within(file, roots, folders) || roots.includes(file.id)));
198
+ return { scope, cursor: finalCursor, folders: scopedFolders, jobs, skipped };
199
+ };
200
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/services/documents/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { CliError } from "@wirecat/cli-base";
2
+ import type { DocumentSource, SourceFile, SourceIndex, SourceSkip, SourceStatePort } from "../../documents/model.js";
3
+ export interface SyncOptions<M extends SourceFile> {
4
+ source: DocumentSource<M> | undefined;
5
+ index: SourceIndex<M>;
6
+ state: SourceStatePort<M>;
7
+ principal: string;
8
+ roots: string[];
9
+ textLimit: number;
10
+ max: number;
11
+ maxEntries: number;
12
+ limitError?(): CliError;
13
+ isFolder(file: M): boolean;
14
+ skipReason(file: M): string | undefined;
15
+ retryable(skip: SourceSkip<M>, limit: number): boolean;
16
+ errorOf(error: unknown): CliError;
17
+ assertHeld(): void;
18
+ storeVersion: string;
19
+ signal?: AbortSignal;
20
+ rescan?: boolean;
21
+ pictures?: boolean;
22
+ now?(): number;
23
+ }
24
+ //# sourceMappingURL=ports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../src/services/documents/ports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AACpH,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,UAAU;IAC/C,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;IACrC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;IACrB,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,IAAI,QAAQ,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAA;IAC1B,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,CAAA;IACvC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;IACtD,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAA;IACjC,UAAU,IAAI,IAAI,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,CAAC,IAAI,MAAM,CAAA;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../src/services/documents/ports.ts"],"names":[],"mappings":""}
@@ -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":"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"}