@wirecat/drive-cli 0.2.0 → 0.4.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 (90) hide show
  1. package/README.md +9 -8
  2. package/dist/api-contract.d.ts.map +1 -1
  3. package/dist/api-contract.js +4 -2
  4. package/dist/api-contract.js.map +1 -1
  5. package/dist/bin/drive.js +16 -20
  6. package/dist/bin/drive.js.map +1 -1
  7. package/dist/catalog-commands.d.ts +13 -0
  8. package/dist/catalog-commands.d.ts.map +1 -0
  9. package/dist/catalog-commands.js +111 -0
  10. package/dist/catalog-commands.js.map +1 -0
  11. package/dist/catalog.d.ts +43 -0
  12. package/dist/catalog.d.ts.map +1 -0
  13. package/dist/catalog.js +107 -0
  14. package/dist/catalog.js.map +1 -0
  15. package/dist/config.d.ts +8 -0
  16. package/dist/config.d.ts.map +1 -1
  17. package/dist/config.js +17 -3
  18. package/dist/config.js.map +1 -1
  19. package/dist/errors.d.ts.map +1 -1
  20. package/dist/errors.js +13 -5
  21. package/dist/errors.js.map +1 -1
  22. package/dist/extraction.d.ts +1 -1
  23. package/dist/extraction.d.ts.map +1 -1
  24. package/dist/extraction.js +9 -5
  25. package/dist/extraction.js.map +1 -1
  26. package/dist/failure.d.ts +65 -0
  27. package/dist/failure.d.ts.map +1 -0
  28. package/dist/failure.js +86 -0
  29. package/dist/failure.js.map +1 -0
  30. package/dist/google-api.d.ts.map +1 -1
  31. package/dist/google-api.js +3 -1
  32. package/dist/google-api.js.map +1 -1
  33. package/dist/google.d.ts +5 -0
  34. package/dist/google.d.ts.map +1 -1
  35. package/dist/google.js +80 -12
  36. package/dist/google.js.map +1 -1
  37. package/dist/knowledge-commands.d.ts.map +1 -1
  38. package/dist/knowledge-commands.js +150 -113
  39. package/dist/knowledge-commands.js.map +1 -1
  40. package/dist/knowledge.d.ts +2 -2
  41. package/dist/knowledge.d.ts.map +1 -1
  42. package/dist/knowledge.js +11 -5
  43. package/dist/knowledge.js.map +1 -1
  44. package/dist/login.d.ts +1 -1
  45. package/dist/login.d.ts.map +1 -1
  46. package/dist/login.js +11 -5
  47. package/dist/login.js.map +1 -1
  48. package/dist/mcp.d.ts +22 -4
  49. package/dist/mcp.d.ts.map +1 -1
  50. package/dist/mcp.js +7 -15
  51. package/dist/mcp.js.map +1 -1
  52. package/dist/model.d.ts +67 -11
  53. package/dist/model.d.ts.map +1 -1
  54. package/dist/model.js +17 -0
  55. package/dist/model.js.map +1 -1
  56. package/dist/policy.d.ts.map +1 -1
  57. package/dist/policy.js +11 -4
  58. package/dist/policy.js.map +1 -1
  59. package/dist/profile-lock.d.ts.map +1 -1
  60. package/dist/profile-lock.js +4 -2
  61. package/dist/profile-lock.js.map +1 -1
  62. package/dist/program.d.ts.map +1 -1
  63. package/dist/program.js +191 -152
  64. package/dist/program.js.map +1 -1
  65. package/dist/registry.d.ts +7 -1
  66. package/dist/registry.d.ts.map +1 -1
  67. package/dist/registry.js +28 -2
  68. package/dist/registry.js.map +1 -1
  69. package/dist/remote-commands.d.ts.map +1 -1
  70. package/dist/remote-commands.js +95 -76
  71. package/dist/remote-commands.js.map +1 -1
  72. package/dist/scope.d.ts +3 -0
  73. package/dist/scope.d.ts.map +1 -0
  74. package/dist/scope.js +15 -0
  75. package/dist/scope.js.map +1 -0
  76. package/dist/state.d.ts.map +1 -1
  77. package/dist/state.js +27 -6
  78. package/dist/state.js.map +1 -1
  79. package/dist/store.d.ts +4 -2
  80. package/dist/store.d.ts.map +1 -1
  81. package/dist/store.js +90 -10
  82. package/dist/store.js.map +1 -1
  83. package/dist/sync.d.ts +6 -2
  84. package/dist/sync.d.ts.map +1 -1
  85. package/dist/sync.js +121 -52
  86. package/dist/sync.js.map +1 -1
  87. package/dist/tokens.d.ts.map +1 -1
  88. package/dist/tokens.js +8 -4
  89. package/dist/tokens.js.map +1 -1
  90. package/package.json +7 -4
package/dist/state.js CHANGED
@@ -15,11 +15,20 @@ const File = v.object({
15
15
  url: v.string(),
16
16
  trashed: v.boolean(),
17
17
  canDownload: v.boolean(),
18
+ size: v.optional(v.number()),
18
19
  createdAt: v.optional(v.string()),
19
20
  description: v.optional(v.string()),
20
21
  driveId: v.optional(v.string()),
21
22
  owners: v.optional(v.array(User)),
22
23
  lastModifiedBy: v.optional(User),
24
+ providerMetadata: v.optional(v.unknown()),
25
+ });
26
+ const Skip = v.object({
27
+ id: ID,
28
+ reason: v.string(),
29
+ file: v.optional(File),
30
+ textLimit: v.optional(v.number()),
31
+ storeRefusedIn: v.optional(v.string()),
23
32
  });
24
33
  const State = v.object({
25
34
  version: v.literal(1),
@@ -27,15 +36,21 @@ const State = v.object({
27
36
  scope: v.string(),
28
37
  cursor: v.optional(v.string()),
29
38
  folders: v.record(ID, File),
30
- documents: v.record(ID, v.object({ metadata: File, hash: v.string(), reference: v.string(), tabs: v.number() })),
31
- skipped: v.array(v.object({ id: ID, reason: v.string(), file: v.optional(File) })),
39
+ documents: v.record(ID, v.object({
40
+ metadata: File,
41
+ hash: v.string(),
42
+ reference: v.string(),
43
+ tabs: v.number(),
44
+ notRead: v.optional(v.string()),
45
+ })),
46
+ skipped: v.array(Skip),
32
47
  lastSync: v.optional(v.string()),
33
48
  pending: v.optional(v.object({
34
49
  cursor: v.string(),
35
50
  scope: v.string(),
36
51
  folders: v.record(ID, File),
37
52
  jobs: v.array(v.object({ id: ID, kind: v.picklist(["save", "remove"]), file: v.optional(File) })),
38
- skipped: v.array(v.object({ id: ID, reason: v.string(), file: v.optional(File) })),
53
+ skipped: v.array(Skip),
39
54
  })),
40
55
  });
41
56
  export const profileDir = (env, name) => join(paths(env).state, "profiles", profileName(name));
@@ -48,11 +63,15 @@ export const readState = (env, name, principal) => {
48
63
  catch (error) {
49
64
  if (error.code === "ENOENT")
50
65
  return { version: 1, principal, scope: "", folders: {}, documents: {}, skipped: [] };
51
- throw new CliError("configuration_error", "sync state is unreadable; refusing to reset its checkpoint");
66
+ throw new CliError("configuration_error", "sync state is unreadable; refusing to reset its checkpoint", {
67
+ reason: "state.invalid",
68
+ });
52
69
  }
53
70
  const parsed = v.safeParse(State, value);
54
71
  if (!parsed.success || parsed.output.principal !== principal)
55
- throw new CliError("configuration_error", "sync state is invalid or belongs to another Google account");
72
+ throw new CliError("configuration_error", "sync state is invalid or belongs to another Google account", {
73
+ reason: "state.invalid",
74
+ });
56
75
  return parsed.output;
57
76
  };
58
77
  export const saveState = (env, name, state) => {
@@ -84,7 +103,9 @@ export const readSnapshot = (env, name, id) => {
84
103
  return JSON.parse(readFileSync(snapshotPath(env, name, id), "utf8"));
85
104
  }
86
105
  catch {
87
- throw new CliError("not_found", "source snapshot is unavailable — run drive sync");
106
+ throw new CliError("not_found", "source snapshot is unavailable — run drive sync", {
107
+ reason: "state.snapshot-missing",
108
+ });
88
109
  }
89
110
  };
90
111
  //# sourceMappingURL=state.js.map
package/dist/state.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
package/dist/store.d.ts CHANGED
@@ -1,5 +1,7 @@
1
- import type { MessageStore } from "@wirecat/cli-messaging/store";
1
+ import type { MessageStore } from "@wirecat/cli-core/store";
2
2
  import type { DocumentIndex } from "./model.js";
3
3
  export declare const openIndex: (env: NodeJS.ProcessEnv) => Promise<DocumentIndex>;
4
- export declare const indexOver: (store: MessageStore, env: NodeJS.ProcessEnv) => DocumentIndex;
4
+ type PictureEmbedder = Awaited<ReturnType<typeof import("@wirecat/cli-core/services")["openPictureEmbedderFor"]>>;
5
+ export declare const indexOver: (store: MessageStore, env: NodeJS.ProcessEnv, pictureEmbedder?: PictureEmbedder) => DocumentIndex;
6
+ export {};
5
7
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAQ,MAAM,8BAA8B,CAAA;AAGtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,eAAO,MAAM,SAAS,QAAe,MAAM,CAAC,UAAU,KAAG,OAAO,CAAC,aAAa,CAM7E,CAAA;AACD,eAAO,MAAM,SAAS,UAAW,YAAY,OAAO,MAAM,CAAC,UAAU,KAAG,aAiHvE,CAAA"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAQ,MAAM,yBAAyB,CAAA;AAIjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,eAAO,MAAM,SAAS,QAAe,MAAM,CAAC,UAAU,KAAG,OAAO,CAAC,aAAa,CAM7E,CAAA;AACD,KAAK,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,cAAc,4BAA4B,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAA;AACjH,eAAO,MAAM,SAAS,UACb,YAAY,OACd,MAAM,CAAC,UAAU,oBACJ,eAAe,KAChC,aAgMF,CAAA"}
package/dist/store.js CHANGED
@@ -1,15 +1,17 @@
1
1
  import { join } from "node:path";
2
2
  import { CliError } from "@wirecat/cli-base";
3
+ import { walkQuery } from "@wirecat/cli-base/query";
4
+ import { catalogInput } from "./catalog.js";
3
5
  import { paths } from "./config.js";
4
6
  import { documentKnowledge, saveContributors } from "./knowledge.js";
5
7
  export const openIndex = async (env) => {
6
- const { ensureSqlite } = await import("@wirecat/cli-messaging/sqlite-runtime");
8
+ const { ensureSqlite } = await import("@wirecat/cli-core/sqlite-runtime");
7
9
  await ensureSqlite();
8
- const { openStore } = await import("@wirecat/cli-messaging/store");
9
- const store = await openStore({ path: env.DRIVE_STORE ?? join(paths(env).state, "drive.db"), env, command: "drive" });
10
+ const { openStore } = await import("@wirecat/cli-core/store");
11
+ const store = await openStore({ path: env.DRIVE_STORE ?? join(paths(env).state, "drive.db"), env, command: "tg" });
10
12
  return indexOver(store, env);
11
13
  };
12
- export const indexOver = (store, env) => {
14
+ export const indexOver = (store, env, pictureEmbedder) => {
13
15
  const folder = async (principal, create) => {
14
16
  const name = `google-drive:${principal}`;
15
17
  const found = (await store.notes.folders()).find((item) => item.name === name);
@@ -51,6 +53,47 @@ export const indexOver = (store, env) => {
51
53
  }
52
54
  };
53
55
  return {
56
+ catalog: {
57
+ import: async (principal, files) => {
58
+ if (files.length > 10000)
59
+ throw new CliError("validation_error", "catalog scope exceeds 10000 entries", {
60
+ reason: "catalog.scope-limit",
61
+ });
62
+ const selected = await folder(principal, true);
63
+ if (!selected)
64
+ throw new CliError("configuration_error", "catalog collection could not be registered");
65
+ for (let start = 0; start < files.length; start += 200) {
66
+ await store.catalog.upsert(selected.id, files.slice(start, start + 200).map(catalogInput));
67
+ }
68
+ for (const file of files) {
69
+ const entry = await store.catalog.get(selected.id, `${file.id}.md`);
70
+ if (entry)
71
+ await saveContributors(store, principal, file, entry.ref.slice("document:".length));
72
+ }
73
+ const retired = await store.catalog.reconcile(selected.id, files.map((file) => `${file.id}.md`));
74
+ documents.delete(principal);
75
+ return { entries: files.length, retired };
76
+ },
77
+ get: async (principal, id) => {
78
+ const selected = await folder(principal, false);
79
+ return selected ? store.catalog.get(selected.id, `${id}.md`) : undefined;
80
+ },
81
+ list: async (principal, query = {}) => {
82
+ const selected = await folder(principal, false);
83
+ const ast = query.ast ? structuredClone(query.ast) : undefined;
84
+ if (ast)
85
+ for (const node of walkQuery(ast.root))
86
+ if (node.field === "parent")
87
+ node.value = `${node.value}.md`;
88
+ return selected
89
+ ? store.catalog.list(selected.id, {
90
+ ...query,
91
+ ...(ast ? { ast } : {}),
92
+ ...(query.parent === undefined ? {} : { parent: `${query.parent}.md` }),
93
+ })
94
+ : { items: [], hasMore: false };
95
+ },
96
+ },
54
97
  knowledge: documentKnowledge(store, async (principal) => (await folder(principal, false))?.id),
55
98
  save: async (principal, content, hash) => {
56
99
  const selected = await folder(principal, true);
@@ -71,13 +114,17 @@ export const indexOver = (store, env) => {
71
114
  source: "google-drive",
72
115
  sourceUrl: content.metadata.url,
73
116
  fileId: content.metadata.id,
117
+ mime: content.metadata.mime,
118
+ size: content.metadata.size ?? null,
74
119
  owners: content.metadata.owners ?? [],
75
120
  lastModifiedBy: content.metadata.lastModifiedBy ?? null,
76
121
  modifiedAt: content.metadata.modifiedAt ?? null,
77
122
  sourceVersion: content.metadata.version ?? null,
78
123
  tabs: content.tabs.map(({ id, title }) => ({ id, title })),
124
+ ...(content.notRead ? { notRead: content.notRead } : {}),
79
125
  },
80
126
  });
127
+ await store.catalog.upsert(selected.id, [catalogInput(content.metadata)]);
81
128
  await saveContributors(store, principal, content.metadata, note.id);
82
129
  notes.set(path, note);
83
130
  return note.ref;
@@ -88,12 +135,22 @@ export const indexOver = (store, env) => {
88
135
  const notes = await cached(principal);
89
136
  const path = `${id}.md`;
90
137
  const note = notes.get(path);
91
- if (note)
92
- await stale(note.ref);
138
+ const retired = note ? undefined : await store.catalog.get(selected.id, path, true);
139
+ const ref = note?.ref ?? retired?.ref;
140
+ if (ref)
141
+ await stale(ref);
93
142
  await store.notes.deleteFileNotes(selected.id, [path]);
94
143
  notes.delete(path);
95
144
  }
96
145
  },
146
+ openPictures: async () => {
147
+ const { openPictureEmbedderFor, savePicture } = await import("@wirecat/cli-core/services");
148
+ const embedder = pictureEmbedder ?? (await openPictureEmbedderFor({ env, command: "tg" }));
149
+ return {
150
+ save: (reference, bytes) => savePicture(store, { ref: reference }, bytes, { embedder }),
151
+ close: () => (pictureEmbedder ? Promise.resolve() : embedder.close()),
152
+ };
153
+ },
97
154
  search: async (principal, query, options) => {
98
155
  const selected = await folder(principal, false);
99
156
  if (!selected)
@@ -105,28 +162,51 @@ export const indexOver = (store, env) => {
105
162
  hasMore: false,
106
163
  meaningSkipped: "this Google account has no imported sources",
107
164
  };
108
- const { searchNotes } = await import("@wirecat/cli-messaging/services");
165
+ const { searchNotes } = await import("@wirecat/cli-core/services");
109
166
  const result = await searchNotes(store, query, {
110
167
  ...options,
111
168
  folderIds: selected ? [selected.id] : [],
112
169
  env,
113
170
  command: "tg",
171
+ ...(pictureEmbedder ? { pictureEmbedder } : {}),
114
172
  });
173
+ const pictures = await Promise.all((result.pictures ?? []).map(async (picture) => {
174
+ const note = await store.notes.note(picture.ref);
175
+ const metadata = note.frontMatter;
176
+ return {
177
+ ...picture,
178
+ title: note.title,
179
+ source_url: typeof metadata?.sourceUrl === "string" ? metadata.sourceUrl : null,
180
+ };
181
+ }));
182
+ const { pictures: _, picturesSkipped, ...rest } = result;
115
183
  return {
116
- ...result,
184
+ ...rest,
185
+ ...(result.pictures ? { pictures } : {}),
186
+ ...(picturesSkipped ? { pictures_skipped: picturesSkipped } : {}),
117
187
  hits: await Promise.all(result.hits.map(async (hit) => {
118
188
  const note = await store.notes.note(hit.ref);
119
189
  const metadata = note.frontMatter;
190
+ const entry = note.path ? await store.catalog.get(selected.id, note.path) : undefined;
120
191
  return {
121
192
  ...hit,
122
- sourceUrl: typeof metadata?.sourceUrl === "string" ? metadata.sourceUrl : null,
193
+ source_url: typeof metadata?.sourceUrl === "string" ? metadata.sourceUrl : null,
123
194
  tabs: Array.isArray(metadata?.tabs) ? metadata.tabs : [],
195
+ kind: entry?.kind ?? "file",
196
+ content: entry?.content ?? "indexed",
197
+ not_read: typeof metadata?.notRead === "string"
198
+ ? metadata.notRead
199
+ : entry?.content === "metadata"
200
+ ? entry.kind === "folder"
201
+ ? "folder metadata only"
202
+ : "content is not indexed yet"
203
+ : null,
124
204
  };
125
205
  })),
126
206
  };
127
207
  },
128
208
  embed: async (max) => {
129
- const { embedNotes } = await import("@wirecat/cli-messaging/services");
209
+ const { embedNotes } = await import("@wirecat/cli-core/services");
130
210
  return embedNotes(store, { maxChunks: max, env, command: "tg" });
131
211
  },
132
212
  close: () => store.close(),
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/dist/sync.d.ts CHANGED
@@ -1,9 +1,13 @@
1
- import { type DocumentIndex, type FileMetadata, type GoogleSource } from "./model.js";
2
- export declare const within: (file: FileMetadata, roots: string[], folders: Record<string, FileMetadata>, seen?: Set<string>) => boolean;
1
+ import { type DocumentIndex, type GoogleSource } from "./model.js";
2
+ export { within } from "./scope.js";
3
3
  export interface SyncResult {
4
4
  saved: number;
5
+ names_only: number;
5
6
  removed: number;
6
7
  unchanged: number;
8
+ pictures?: number;
9
+ pictures_too_large?: number;
10
+ pictures_skipped?: string;
7
11
  pending: number;
8
12
  skipped: {
9
13
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,YAAY,EAEjB,KAAK,YAAY,EAGlB,MAAM,YAAY,CAAA;AASnB,eAAO,MAAM,MAAM,SACX,YAAY,SACX,MAAM,EAAE,WACN,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,yBAEpC,OASF,CAAA;AAkID,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,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,IAAI,WACP,YAAY,GAAG,SAAS,SACzB,aAAa,OACf,MAAM,CAAC,UAAU,QAChB,MAAM,OACP,MAAM,WACF,WAAW,uBAEnB,OAAO,CAAC,UAAU,CAuGpB,CAAA"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,aAAa,EAGlB,KAAK,YAAY,EAMlB,MAAM,YAAY,CAAA;AA+BnB,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AA+HnC,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,IAAI,WACP,YAAY,GAAG,SAAS,SACzB,aAAa,OACf,MAAM,CAAC,UAAU,QAChB,MAAM,OACP,MAAM,WACF,WAAW,uBAEnB,OAAO,CAAC,UAAU,CA4JpB,CAAA"}
package/dist/sync.js CHANGED
@@ -1,29 +1,36 @@
1
1
  import { createHash } from "node:crypto";
2
- import { CliError } from "@wirecat/cli-base";
3
- import { activeProfile } from "./config.js";
2
+ import { CliError, isCliError } from "@wirecat/cli-base";
3
+ import { catalogFiles } from "./catalog.js";
4
+ import { activeProfile, textLimit } from "./config.js";
4
5
  import { googleError } from "./errors.js";
5
- import { supported } from "./google.js";
6
+ import { MAX_ENTRIES, supported, tooManyEntries } from "./google.js";
6
7
  import { FOLDER, } from "./model.js";
7
8
  import { lockProfile } from "./profile-lock.js";
9
+ import { within } from "./scope.js";
8
10
  import { readState, removeSnapshot, saveSnapshot, saveState } from "./state.js";
11
+ import { VERSION } from "./version.js";
9
12
  const scopeHash = (roots) => createHash("sha256")
10
13
  .update(JSON.stringify([...roots].sort()))
11
14
  .digest("hex");
15
+ const skipReason = (file) => !file.canDownload ? "downloads restricted" : supported(file) ? undefined : `unsupported type: ${file.mime}`;
16
+ // Skips decided by type are retried once a newer version reads the type; length skips once the limit is raised.
17
+ const retryable = (skip, limit) => skip.reason === "downloads restricted" ||
18
+ skip.reason.startsWith("unsupported type: ") ||
19
+ (skip.textLimit !== undefined && skip.textLimit < limit) ||
20
+ // The store's own bounds change only with the shared package drive pins.
21
+ (skip.storeRefusedIn !== undefined && skip.storeRefusedIn !== VERSION) ||
22
+ // 0.2.0 and earlier skipped text over 200 000 characters with this reason and no recorded limit.
23
+ (skip.reason.startsWith("document exceeds the ingestion bound") && limit > 200000);
24
+ const changedSince = (previous, file) => previous.version !== file.version ||
25
+ previous.modifiedAt !== file.modifiedAt ||
26
+ previous.name !== file.name ||
27
+ previous.canDownload !== file.canDownload ||
28
+ JSON.stringify(previous.parents) !== JSON.stringify(file.parents);
29
+ const MAX_PICTURE_BYTES = 25 * 1024 * 1024;
30
+ const isPicture = (file) => file.mime.startsWith("image/") && file.canDownload;
12
31
  const hashText = (text) => createHash("sha256").update(text).digest("hex");
13
- export const within = (file, roots, folders, seen = new Set()) => {
14
- if (file.trashed)
15
- return false;
16
- if (roots.includes(file.id))
17
- return true;
18
- if (seen.has(file.id))
19
- throw new CliError("invalid_response", "folder ancestry contains a cycle");
20
- const next = new Set([...seen, file.id]);
21
- return file.parents.some((id) => {
22
- const folder = folders[id];
23
- return folder ? within(folder, roots, folders, next) : roots.includes(id);
24
- });
25
- };
26
- const plan = async (source, state, roots, abandoned = []) => {
32
+ export { within } from "./scope.js";
33
+ const plan = async (source, state, roots, limit, pictures, abandoned = []) => {
27
34
  const scope = scopeHash(roots);
28
35
  if (!roots.length)
29
36
  return {
@@ -53,8 +60,8 @@ const plan = async (source, state, roots, abandoned = []) => {
53
60
  visited.add(folder.id);
54
61
  folders[folder.id] = folder;
55
62
  for (const file of await source.children(folder.id)) {
56
- if (++discovered > 10000)
57
- throw new CliError("provider_error", "folder scan exceeded 10000 entries; checkpoint preserved");
63
+ if (++discovered > MAX_ENTRIES)
64
+ throw tooManyEntries();
58
65
  if (file.mime === FOLDER)
59
66
  await crawl(file, new Set([...ancestry, folder.id]));
60
67
  else {
@@ -129,29 +136,28 @@ const plan = async (source, state, roots, abandoned = []) => {
129
136
  if (!within(file, roots, folders))
130
137
  continue;
131
138
  const previousSkip = state.skipped.find((item) => item.id === id);
132
- if (previousSkip && !changed.has(id) && !initial) {
139
+ const reason = skipReason(file);
140
+ const retry = previousSkip && !reason && retryable(previousSkip, limit);
141
+ const known = state.documents[id];
142
+ const pictureDue = pictures && isPicture(file) && known !== undefined && !known.picture;
143
+ if (previousSkip && !changed.has(id) && !initial && !retry && !pictureDue && !(reason && !state.documents[id])) {
133
144
  skipped.push({ ...previousSkip, file });
134
145
  continue;
135
146
  }
136
- if (!supported(file) || !file.canDownload) {
137
- skipped.push({ id, reason: !file.canDownload ? "downloads restricted" : `unsupported type: ${file.mime}`, file });
147
+ if (reason) {
148
+ skipped.push({ id, reason, file });
149
+ if (initial || !known || known.notRead !== reason || changedSince(known.metadata, file) || pictureDue)
150
+ jobs.push({ id, kind: "save", file });
138
151
  continue;
139
152
  }
140
- if (changed.has(id)) {
141
- const previous = state.documents[id]?.metadata;
142
- if (!previous ||
143
- previous.version !== file.version ||
144
- previous.modifiedAt !== file.modifiedAt ||
145
- previous.name !== file.name ||
146
- previous.canDownload !== file.canDownload ||
147
- JSON.stringify(previous.parents) !== JSON.stringify(file.parents) ||
148
- initial)
153
+ if (changed.has(id) || retry || known?.notRead) {
154
+ if (!known || known.notRead || changedSince(known.metadata, file) || initial)
149
155
  jobs.push({ id, kind: "save", file });
150
156
  }
151
157
  }
152
158
  for (const id of new Set([...Object.keys(state.documents), ...abandoned])) {
153
159
  const file = files.get(id);
154
- if (!file || !within(file, roots, folders) || !supported(file) || !file.canDownload)
160
+ if (!file || !within(file, roots, folders))
155
161
  jobs.push({ id, kind: "remove" });
156
162
  }
157
163
  // Only retain metadata for selected ancestry; the account-wide feed includes unrelated folders.
@@ -165,17 +171,23 @@ export const sync = async (source, index, env, name, max, signal, rescan = false
165
171
  const lock = await lockProfile(env, name);
166
172
  const result = {
167
173
  saved: 0,
174
+ names_only: 0,
168
175
  removed: 0,
169
176
  unchanged: 0,
170
177
  pending: 0,
171
178
  skipped: [],
172
179
  errors: [],
173
180
  coverage: "selected folders only; unsupported files are reported",
181
+ ...(profile.pictureSearch ? { pictures: 0 } : {}),
174
182
  };
183
+ let writer;
175
184
  try {
176
185
  if (profile.roots.length && (!source || (await source.identity()) !== profile.principal))
177
- throw new CliError("authentication_error", "signed-in Google account does not match this profile");
186
+ throw new CliError("authentication_error", "signed-in Google account does not match this profile", {
187
+ reason: "profile.wrong-account",
188
+ });
178
189
  const state = readState(env, name, profile.principal);
190
+ const limit = textLimit(env, name);
179
191
  const currentScope = scopeHash(profile.roots);
180
192
  const abandoned = state.pending && (state.pending.scope !== currentScope || rescan) ? state.pending.jobs.map((job) => job.id) : [];
181
193
  if (state.pending?.scope !== currentScope || rescan)
@@ -183,14 +195,62 @@ export const sync = async (source, index, env, name, max, signal, rescan = false
183
195
  if (rescan)
184
196
  delete state.cursor;
185
197
  if (!state.pending) {
186
- state.pending = await plan(source, state, profile.roots, abandoned);
198
+ state.pending = await plan(source, state, profile.roots, limit, profile.pictureSearch ?? false, abandoned);
187
199
  state.skipped = state.pending.skipped;
188
200
  saveState(env, name, state);
189
201
  }
190
202
  const pending = state.pending;
191
203
  if (!pending)
192
204
  throw new CliError("invalid_response", "could not prepare a sync batch");
205
+ if (index.catalog)
206
+ await index.catalog.import(profile.principal, catalogFiles(state, profile.roots));
193
207
  result.skipped = state.skipped.map(({ id, reason }) => ({ id, reason }));
208
+ const saveNamesOnly = async (file, reason) => {
209
+ const doc = { metadata: file, markdown: "", text: "", tabs: [], notRead: reason };
210
+ const hash = hashText("");
211
+ const previous = state.documents[file.id];
212
+ const reference = await index.save(profile.principal, doc, hash);
213
+ saveSnapshot(env, name, doc);
214
+ state.documents[file.id] = { metadata: file, hash, reference, tabs: 0, notRead: reason };
215
+ if (previous?.notRead === reason && !changedSince(previous.metadata, file))
216
+ result.unchanged++;
217
+ else
218
+ result.names_only++;
219
+ };
220
+ let modelMissing = false;
221
+ const savePictureOf = async (file) => {
222
+ const entry = state.documents[file.id];
223
+ if (!profile.pictureSearch || !isPicture(file) || modelMissing)
224
+ return;
225
+ if ((file.size ?? 0) > MAX_PICTURE_BYTES) {
226
+ entry.picture = "too-large";
227
+ result.pictures_too_large = (result.pictures_too_large ?? 0) + 1;
228
+ return;
229
+ }
230
+ if (!source)
231
+ throw new CliError("configuration_error", "a pending picture requires Google sign-in");
232
+ if (!writer) {
233
+ try {
234
+ writer = await index.openPictures();
235
+ }
236
+ catch (error) {
237
+ if (!isCliError(error) || error.code !== "not_found")
238
+ throw error;
239
+ modelMissing = true;
240
+ result.pictures_skipped = error.message;
241
+ return;
242
+ }
243
+ }
244
+ const bytes = await source.bytes(file.id);
245
+ if (bytes.length > MAX_PICTURE_BYTES) {
246
+ entry.picture = "too-large";
247
+ result.pictures_too_large = (result.pictures_too_large ?? 0) + 1;
248
+ return;
249
+ }
250
+ if ((await writer.save(entry.reference, bytes)) === "saved")
251
+ result.pictures = (result.pictures ?? 0) + 1;
252
+ entry.picture = "saved";
253
+ };
194
254
  const jobs = [...pending.jobs].slice(0, max);
195
255
  for (const job of jobs) {
196
256
  if (signal?.aborted)
@@ -203,23 +263,14 @@ export const sync = async (source, index, env, name, max, signal, rescan = false
203
263
  delete state.documents[job.id];
204
264
  result.removed++;
205
265
  }
206
- else if (job.file && (!supported(job.file) || !job.file.canDownload)) {
207
- const skipped = {
208
- id: job.id,
209
- reason: !job.file.canDownload ? "downloads restricted" : `unsupported type: ${job.file.mime}`,
210
- };
211
- if (state.documents[job.id]) {
212
- await index.remove(profile.principal, job.id);
213
- removeSnapshot(env, name, job.id);
214
- delete state.documents[job.id];
215
- }
216
- state.skipped.push(skipped);
217
- result.skipped.push(skipped);
266
+ else if (job.file && skipReason(job.file)) {
267
+ await saveNamesOnly(job.file, skipReason(job.file));
268
+ await savePictureOf(job.file);
218
269
  }
219
270
  else {
220
271
  if (!source)
221
272
  throw new CliError("configuration_error", "a pending save requires Google sign-in");
222
- const content = await source.content(job.id);
273
+ const content = await source.content(job.id, limit);
223
274
  if (!within(content.metadata, profile.roots, pending.folders)) {
224
275
  await index.remove(profile.principal, job.id);
225
276
  removeSnapshot(env, name, job.id);
@@ -229,7 +280,14 @@ export const sync = async (source, index, env, name, max, signal, rescan = false
229
280
  else {
230
281
  const hash = hashText(content.text);
231
282
  const previous = state.documents[job.id];
232
- const reference = await index.save(profile.principal, content, hash);
283
+ const reference = await index.save(profile.principal, content, hash).catch((error) => {
284
+ if (!isCliError(error) || error.code !== "validation_error")
285
+ throw error;
286
+ throw new CliError("validation_error", `the local store refused this text: ${error.message}`, {
287
+ reason: "store.refused",
288
+ store_refused_in: VERSION,
289
+ });
290
+ });
233
291
  saveSnapshot(env, name, content);
234
292
  state.documents[job.id] = { metadata: content.metadata, hash, reference, tabs: content.tabs.length };
235
293
  if (previous?.hash === hash)
@@ -246,10 +304,20 @@ export const sync = async (source, index, env, name, max, signal, rescan = false
246
304
  if (safe.code === "cancelled")
247
305
  throw safe;
248
306
  if (job.kind === "save" && (safe.code === "not_found" || safe.code === "validation_error")) {
249
- await index.remove(profile.principal, job.id);
250
- removeSnapshot(env, name, job.id);
251
- delete state.documents[job.id];
252
- const skipped = { id: job.id, reason: safe.message, ...(job.file ? { file: job.file } : {}) };
307
+ const skipped = {
308
+ id: job.id,
309
+ reason: safe.message,
310
+ ...(job.file ? { file: job.file } : {}),
311
+ ...(safe.details.text_limit ? { textLimit: limit } : {}),
312
+ ...(safe.details.store_refused_in ? { storeRefusedIn: VERSION } : {}),
313
+ };
314
+ if (job.file && safe.code === "validation_error")
315
+ await saveNamesOnly(job.file, skipped.reason);
316
+ else {
317
+ await index.remove(profile.principal, job.id);
318
+ removeSnapshot(env, name, job.id);
319
+ delete state.documents[job.id];
320
+ }
253
321
  state.skipped = state.skipped.filter((item) => item.id !== job.id);
254
322
  state.skipped.push(skipped);
255
323
  result.skipped.push({ id: skipped.id, reason: skipped.reason });
@@ -272,6 +340,7 @@ export const sync = async (source, index, env, name, max, signal, rescan = false
272
340
  return result;
273
341
  }
274
342
  finally {
343
+ await writer?.close();
275
344
  await lock.release();
276
345
  }
277
346
  };