@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.
- package/README.md +9 -8
- package/dist/api-contract.d.ts.map +1 -1
- package/dist/api-contract.js +4 -2
- package/dist/api-contract.js.map +1 -1
- package/dist/bin/drive.js +16 -20
- package/dist/bin/drive.js.map +1 -1
- package/dist/catalog-commands.d.ts +13 -0
- package/dist/catalog-commands.d.ts.map +1 -0
- package/dist/catalog-commands.js +111 -0
- package/dist/catalog-commands.js.map +1 -0
- package/dist/catalog.d.ts +43 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +107 -0
- package/dist/catalog.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +17 -3
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +13 -5
- package/dist/errors.js.map +1 -1
- package/dist/extraction.d.ts +1 -1
- package/dist/extraction.d.ts.map +1 -1
- package/dist/extraction.js +9 -5
- package/dist/extraction.js.map +1 -1
- package/dist/failure.d.ts +65 -0
- package/dist/failure.d.ts.map +1 -0
- package/dist/failure.js +86 -0
- package/dist/failure.js.map +1 -0
- package/dist/google-api.d.ts.map +1 -1
- package/dist/google-api.js +3 -1
- package/dist/google-api.js.map +1 -1
- package/dist/google.d.ts +5 -0
- package/dist/google.d.ts.map +1 -1
- package/dist/google.js +80 -12
- package/dist/google.js.map +1 -1
- package/dist/knowledge-commands.d.ts.map +1 -1
- package/dist/knowledge-commands.js +150 -113
- package/dist/knowledge-commands.js.map +1 -1
- package/dist/knowledge.d.ts +2 -2
- package/dist/knowledge.d.ts.map +1 -1
- package/dist/knowledge.js +11 -5
- package/dist/knowledge.js.map +1 -1
- package/dist/login.d.ts +1 -1
- package/dist/login.d.ts.map +1 -1
- package/dist/login.js +11 -5
- package/dist/login.js.map +1 -1
- package/dist/mcp.d.ts +22 -4
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +7 -15
- package/dist/mcp.js.map +1 -1
- package/dist/model.d.ts +67 -11
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +17 -0
- package/dist/model.js.map +1 -1
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +11 -4
- package/dist/policy.js.map +1 -1
- package/dist/profile-lock.d.ts.map +1 -1
- package/dist/profile-lock.js +4 -2
- package/dist/profile-lock.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +191 -152
- package/dist/program.js.map +1 -1
- package/dist/registry.d.ts +7 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +28 -2
- package/dist/registry.js.map +1 -1
- package/dist/remote-commands.d.ts.map +1 -1
- package/dist/remote-commands.js +95 -76
- package/dist/remote-commands.js.map +1 -1
- package/dist/scope.d.ts +3 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +15 -0
- package/dist/scope.js.map +1 -0
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +27 -6
- package/dist/state.js.map +1 -1
- package/dist/store.d.ts +4 -2
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +90 -10
- package/dist/store.js.map +1 -1
- package/dist/sync.d.ts +6 -2
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +121 -52
- package/dist/sync.js.map +1 -1
- package/dist/tokens.d.ts.map +1 -1
- package/dist/tokens.js +8 -4
- package/dist/tokens.js.map +1 -1
- package/package.json +7 -4
package/README.md
CHANGED
|
@@ -82,7 +82,7 @@ There is no replacement model downloader or implicit download here. Missing mode
|
|
|
82
82
|
## Keep it current
|
|
83
83
|
|
|
84
84
|
```sh
|
|
85
|
-
drive personal sync --
|
|
85
|
+
drive personal sync --limit 200 --json
|
|
86
86
|
drive personal folders remove FOLDER_ID
|
|
87
87
|
drive personal sync --json
|
|
88
88
|
```
|
|
@@ -111,8 +111,9 @@ Search covers body text, nested tables and footnotes from all tabs. Images, head
|
|
|
111
111
|
comments and suggested edits are excluded. Image assets are not downloaded. Search text and Google’s native Markdown export are separate representations; inspect the export
|
|
112
112
|
when layout or tab coverage matters.
|
|
113
113
|
|
|
114
|
-
|
|
115
|
-
|
|
114
|
+
One sync reads at most 10,000 entries under the chosen folders, and at most 10,000 changes from
|
|
115
|
+
Google's change feed; past either, it stops with nothing lost and says what to do. Text caps at
|
|
116
|
+
200,000 characters and snapshots at 50 MiB, with bounded pagination. Oversized input is refused rather than truncated. Google's native export
|
|
116
117
|
also has its own 10 MB limit. Documents changing during export remain pending for retry.
|
|
117
118
|
|
|
118
119
|
## Development
|
|
@@ -140,18 +141,18 @@ See [architecture](docs/dev/ARCHITECTURE.md), [testing](docs/dev/TESTING.md),
|
|
|
140
141
|
drive personal tags add DOC_ID project-budget review
|
|
141
142
|
drive personal documents list --tag review
|
|
142
143
|
drive personal notes add DOC_ID 'Check the assumptions' --title Review
|
|
143
|
-
drive personal
|
|
144
|
+
drive personal identities list DOC_ID
|
|
144
145
|
drive personal documents context DOC_ID
|
|
145
146
|
drive personal facts add DOC_ID 'Budget approved for Q4' --type decision --scope work
|
|
146
147
|
drive personal memories add DOC_ID 'Q4 budget, in short' --scope work --kind summary
|
|
147
148
|
drive personal memories extract DOC_ID --scope work
|
|
148
149
|
drive personal documents history DOC_ID
|
|
149
|
-
drive api
|
|
150
|
+
drive api list --service docs
|
|
150
151
|
```
|
|
151
152
|
|
|
152
153
|
AI extraction explicitly sends selected cached text to the configured model. It previews proposals
|
|
153
154
|
unless `--save` is given; saved proposals include source quotes, snapshot hashes and model authorship.
|
|
154
|
-
Use the shared model setup with `models
|
|
155
|
+
Use the shared model setup with `models set --provider openai --model MODEL_ID`. Provider keys
|
|
155
156
|
come from the corresponding API-key environment variable and never enter regular configuration.
|
|
156
157
|
Source content changes and scope removals mark source-backed memories stale. User notes stay local.
|
|
157
158
|
|
|
@@ -167,14 +168,14 @@ isolated sources and mocked provider requests; see the [testing guide](docs/dev/
|
|
|
167
168
|
## Shared CLI conventions
|
|
168
169
|
|
|
169
170
|
Drive now uses MAX's API generation approach: committed Google Discovery snapshots feed a
|
|
170
|
-
provider adapter into cli-base's shared code generators. cli-
|
|
171
|
+
provider adapter into cli-base's shared code generators. cli-core builds the generated
|
|
171
172
|
commands and validates their input; Google's SDK remains the transport. `pnpm generate` rebuilds
|
|
172
173
|
types, validators, the operation manifest, coverage and [command reference](docs/commands.md).
|
|
173
174
|
`pnpm generate:check` checks freshness offline. Only `pnpm spec:sync` fetches a new public specification.
|
|
174
175
|
|
|
175
176
|
```sh
|
|
176
177
|
drive personal api drive-files-get --help
|
|
177
|
-
drive
|
|
178
|
+
drive api show docs.documents.batchUpdate --json
|
|
178
179
|
drive personal --dry-run api drive-files-get --file-id synthetic-doc --json
|
|
179
180
|
drive complete zsh
|
|
180
181
|
drive personal --read-only mcp --tools --json
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-contract.d.ts","sourceRoot":"","sources":["../src/api-contract.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAEhD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAA;AAC9B,eAAO,MAAM,WAAW,SAAU,MAAM,KAAG,
|
|
1
|
+
{"version":3,"file":"api-contract.d.ts","sourceRoot":"","sources":["../src/api-contract.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAEhD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAA;AAC9B,eAAO,MAAM,WAAW,SAAU,MAAM,KAAG,iBAO1C,CAAA;AACD,eAAO,MAAM,eAAe,SAAU,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SA6B5G,CAAA"}
|
package/dist/api-contract.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { CliError } from "@wirecat/cli-base";
|
|
2
|
-
import { apiJson, checkApiBody, checkApiParameter } from "@wirecat/cli-
|
|
2
|
+
import { apiJson, checkApiBody, checkApiParameter } from "@wirecat/cli-core/cli";
|
|
3
3
|
import { operations } from "./generated/manifest.js";
|
|
4
4
|
import { schemas } from "./generated/schemas.js";
|
|
5
5
|
export { operations, schemas };
|
|
6
6
|
export const operationOf = (name) => {
|
|
7
7
|
const operation = operations.find((item) => item.id === name);
|
|
8
8
|
if (!operation)
|
|
9
|
-
throw new CliError("validation_error", "unknown Google method; run drive api
|
|
9
|
+
throw new CliError("validation_error", "unknown Google method; run drive api list", {
|
|
10
|
+
reason: "api.unknown-method",
|
|
11
|
+
});
|
|
10
12
|
return operation;
|
|
11
13
|
};
|
|
12
14
|
export const validateRequest = (name, params, body) => {
|
package/dist/api-contract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-contract.js","sourceRoot":"","sources":["../src/api-contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE5C,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"api-contract.js","sourceRoot":"","sources":["../src/api-contract.ts"],"names":[],"mappings":"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"}
|
package/dist/bin/drive.js
CHANGED
|
@@ -1,41 +1,37 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { execFile } from "node:child_process";
|
|
3
|
-
import { CliError,
|
|
3
|
+
import { CliError, catchCrashes, processStreams } from "@wirecat/cli-base";
|
|
4
4
|
import { CommanderError } from "commander";
|
|
5
|
+
import { interactiveOf, REASONS, reportFailure } from "../failure.js";
|
|
5
6
|
import { createProgram } from "../program.js";
|
|
7
|
+
const args = process.argv.slice(2);
|
|
8
|
+
const tty = process.stdout.isTTY === true;
|
|
9
|
+
const release = catchCrashes({ cli: "drive", interactive: interactiveOf(args, tty), reasons: REASONS });
|
|
6
10
|
const controller = new AbortController();
|
|
7
11
|
const cancelled = () => controller.abort();
|
|
8
12
|
process.once("SIGINT", cancelled);
|
|
9
13
|
process.once("SIGTERM", cancelled);
|
|
14
|
+
let program;
|
|
10
15
|
try {
|
|
11
|
-
|
|
16
|
+
program = createProgram({
|
|
12
17
|
signal: controller.signal,
|
|
13
18
|
openBrowser: (url) => new Promise((resolve, reject) => {
|
|
14
19
|
const command = process.platform === "darwin" ? "open" : process.platform === "win32" ? "rundll32.exe" : "xdg-open";
|
|
15
|
-
const
|
|
16
|
-
execFile(command,
|
|
20
|
+
const browserArgs = process.platform === "win32" ? ["url.dll,FileProtocolHandler", url] : [url];
|
|
21
|
+
execFile(command, browserArgs, { timeout: 10000, windowsHide: true }, (error) => error ? reject(new CliError("configuration_error", "open the printed Google sign-in URL")) : resolve());
|
|
17
22
|
}),
|
|
18
|
-
})
|
|
23
|
+
});
|
|
24
|
+
await program.parseAsync(process.argv);
|
|
19
25
|
}
|
|
20
26
|
catch (error) {
|
|
21
|
-
if (error instanceof CommanderError)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
process.stderr.write(`${JSON.stringify({ error: { code: "validation_error", message: "invalid command arguments; use drive --help" } })}\n`);
|
|
26
|
-
process.exitCode = exitCodeFor("validation_error");
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
const safe = isCliError(error)
|
|
31
|
-
? error
|
|
32
|
-
: new CliError("provider_error", "operation failed; credential and provider details were not logged");
|
|
33
|
-
process.stderr.write(`${JSON.stringify({ error: { code: safe.code, message: safe.message, ...safe.details } })}\n`);
|
|
34
|
-
process.exitCode = exitCodeFor(safe.code);
|
|
35
|
-
}
|
|
27
|
+
if (error instanceof CommanderError && error.exitCode === 0)
|
|
28
|
+
process.exitCode = 0;
|
|
29
|
+
else
|
|
30
|
+
process.exitCode = reportFailure(error, { args, program, streams: processStreams, tty });
|
|
36
31
|
}
|
|
37
32
|
finally {
|
|
38
33
|
process.removeListener("SIGINT", cancelled);
|
|
39
34
|
process.removeListener("SIGTERM", cancelled);
|
|
35
|
+
release();
|
|
40
36
|
}
|
|
41
37
|
//# sourceMappingURL=drive.js.map
|
package/dist/bin/drive.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drive.js","sourceRoot":"","sources":["../../src/bin/drive.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"drive.js","sourceRoot":"","sources":["../../src/bin/drive.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAC1E,OAAO,EAAgB,cAAc,EAAE,MAAM,WAAW,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAClC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAA;AACzC,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;AACvG,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;AACxC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;AAC1C,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;AACjC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;AAClC,IAAI,OAA4B,CAAA;AAChC,IAAI,CAAC;IACH,OAAO,GAAG,aAAa,CAAC;QACtB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CACnB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpC,MAAM,OAAO,GACX,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAA;YACrG,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YAC/F,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAC9E,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,qBAAqB,EAAE,qCAAqC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CACvG,CAAA;QACH,CAAC,CAAC;KACL,CAAC,CAAA;IACF,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AACxC,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,IAAI,KAAK,YAAY,cAAc,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;;QAC5E,OAAO,CAAC,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,CAAA;AAC/F,CAAC;QAAS,CAAC;IACT,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IAC3C,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IAC5C,OAAO,EAAE,CAAA;AACX,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { DocumentIndex } from "./model.js";
|
|
3
|
+
interface Helpers {
|
|
4
|
+
env: NodeJS.ProcessEnv;
|
|
5
|
+
selected(): string;
|
|
6
|
+
output(value: unknown): void;
|
|
7
|
+
positive(input: string): number;
|
|
8
|
+
offset(input: string): number;
|
|
9
|
+
withIndex<T>(fn: (index: DocumentIndex) => Promise<T>): Promise<T>;
|
|
10
|
+
}
|
|
11
|
+
export declare const installCatalogCommands: (program: Command, helpers: Helpers) => void;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=catalog-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-commands.d.ts","sourceRoot":"","sources":["../src/catalog-commands.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAK/C,UAAU,OAAO;IACf,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IACtB,QAAQ,IAAI,MAAM,CAAA;IAClB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IAC/B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IAC7B,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CACnE;AACD,eAAO,MAAM,sBAAsB,YAAa,OAAO,WAAW,OAAO,SA0IxE,CAAA"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { annotate } from "@wirecat/cli-base/commands";
|
|
3
|
+
import { parseLucene, validateQuery } from "@wirecat/cli-base/query";
|
|
4
|
+
import { CATALOG_QUERY } from "@wirecat/cli-core/store";
|
|
5
|
+
import { catalogFiles, catalogOutput, catalogTree } from "./catalog.js";
|
|
6
|
+
import { activeProfile, fileId } from "./config.js";
|
|
7
|
+
import { lockProfile } from "./profile-lock.js";
|
|
8
|
+
import { examples } from "./registry.js";
|
|
9
|
+
import { readState } from "./state.js";
|
|
10
|
+
export const installCatalogCommands = (program, helpers) => {
|
|
11
|
+
const { env, selected, output, positive, offset, withIndex } = helpers;
|
|
12
|
+
const catalog = program.command("catalog").description("browse stored Drive files and folders offline");
|
|
13
|
+
const run = async (fn, write = false) => {
|
|
14
|
+
const profile = activeProfile(env, selected());
|
|
15
|
+
const lock = write ? await lockProfile(env, selected()) : undefined;
|
|
16
|
+
try {
|
|
17
|
+
return await withIndex(async (index) => {
|
|
18
|
+
if (!index.catalog)
|
|
19
|
+
throw new CliError("configuration_error", "index has no shared catalog adapter", {
|
|
20
|
+
reason: "catalog.unavailable",
|
|
21
|
+
});
|
|
22
|
+
lock?.assertHeld();
|
|
23
|
+
const value = await fn({ ...index, catalog: index.catalog }, profile.principal);
|
|
24
|
+
lock?.assertHeld();
|
|
25
|
+
return value;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
await lock?.release();
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const entry = async (index, principal, id) => {
|
|
33
|
+
const found = await index.catalog?.get(principal, fileId(id));
|
|
34
|
+
if (!found)
|
|
35
|
+
throw new CliError("not_found", "file or folder is not in the active local catalog; run catalog import or sync", {
|
|
36
|
+
reason: "catalog.not-found",
|
|
37
|
+
});
|
|
38
|
+
return found;
|
|
39
|
+
};
|
|
40
|
+
const local = (command, mutates = false) => {
|
|
41
|
+
annotate(command, { local: true, mutates });
|
|
42
|
+
return command;
|
|
43
|
+
};
|
|
44
|
+
examples(local(catalog.command("import").description("put cached file and folder metadata into the shared database"), true), ["drive personal catalog import --offline"]).action(async () => output(await run(async (index, principal) => {
|
|
45
|
+
const state = readState(env, selected(), principal);
|
|
46
|
+
return index.catalog.import(principal, catalogFiles(state, activeProfile(env, selected()).roots));
|
|
47
|
+
}, true)));
|
|
48
|
+
examples(local(catalog.command("show").description("show stored metadata and the stable file or folder reference")), [
|
|
49
|
+
"drive personal catalog show FILE_ID --offline",
|
|
50
|
+
])
|
|
51
|
+
.argument("<file>", "Google file or folder id, or its Drive URL")
|
|
52
|
+
.action(async (id) => output(await run(async (index, principal) => catalogOutput(await entry(index, principal, id)))));
|
|
53
|
+
const list = async (words, args, search) => {
|
|
54
|
+
const ast = words.length
|
|
55
|
+
? validateQuery(parseLucene(words.join(" "), { defaultField: search ? "text" : "none" }), CATALOG_QUERY)
|
|
56
|
+
: undefined;
|
|
57
|
+
output(await run(async (index, principal) => {
|
|
58
|
+
const result = await index.catalog.list(principal, {
|
|
59
|
+
ast,
|
|
60
|
+
limit: args.limit,
|
|
61
|
+
offset: (args.page - 1) * args.limit,
|
|
62
|
+
});
|
|
63
|
+
return { items: result.items.map(catalogOutput), has_more: result.hasMore };
|
|
64
|
+
}));
|
|
65
|
+
};
|
|
66
|
+
for (const action of ["list", "search"]) {
|
|
67
|
+
const command = examples(local(catalog
|
|
68
|
+
.command(action)
|
|
69
|
+
.description(action === "list"
|
|
70
|
+
? "list cached files and folders using metadata queries"
|
|
71
|
+
: "search cached names, descriptions, types and observed people")), [
|
|
72
|
+
action === "list"
|
|
73
|
+
? 'drive personal catalog list "parent:FOLDER_ID AND kind:file" --offline'
|
|
74
|
+
: 'drive personal catalog search "budget AND person:Rin*" --offline',
|
|
75
|
+
])
|
|
76
|
+
.argument(action === "list" ? "[query...]" : "<query...>", "metadata query: kind, mime, name, parent, person, tag; AND, OR, NOT")
|
|
77
|
+
.option("--limit <n>", "how many entries to return (at most 1000)", positive, 50)
|
|
78
|
+
.option("--page <n>", "which page to return", positive, 1)
|
|
79
|
+
.action(async (words, args) => list(words, args, action === "search"));
|
|
80
|
+
annotate(command, { query: CATALOG_QUERY, output: { entity: "document" } });
|
|
81
|
+
}
|
|
82
|
+
examples(local(catalog.command("tree").description("show the cached hierarchy below a folder or all selected roots")), ["drive personal catalog tree --offline", "drive personal catalog tree FOLDER_ID --depth 3 --offline"])
|
|
83
|
+
.argument("[folder]", "Google folder id or URL; defaults to the explicitly selected profile's roots")
|
|
84
|
+
.option("--depth <n>", "maximum descendant depth, from 0 to 50", offset, 5)
|
|
85
|
+
.action(async (id, args) => output(await run(async (index, principal) => {
|
|
86
|
+
const items = [];
|
|
87
|
+
for (let skip = 0; skip < 10000; skip += 1000) {
|
|
88
|
+
const page = await index.catalog.list(principal, { limit: 1000, offset: skip });
|
|
89
|
+
items.push(...page.items);
|
|
90
|
+
if (!page.hasMore)
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
const roots = id ? [fileId(id)] : activeProfile(env, selected()).roots;
|
|
94
|
+
return {
|
|
95
|
+
items: catalogTree(items, roots.map((root) => `${root}.md`), args.depth),
|
|
96
|
+
};
|
|
97
|
+
})));
|
|
98
|
+
const tags = catalog.command("tags").description("add owner tags to cached files or folders");
|
|
99
|
+
for (const action of ["list", "add", "remove"]) {
|
|
100
|
+
const command = examples(local(tags.command(action).description(`${action} local tags on a cached file or folder`), action !== "list"), [`drive personal catalog tags ${action} FOLDER_ID${action === "list" ? "" : " project"} --offline`]).argument("<file>", "Google file or folder id, or its Drive URL");
|
|
101
|
+
if (action !== "list")
|
|
102
|
+
command.argument("<tags...>", "local tag names");
|
|
103
|
+
command.action(async (id, values) => output(await run(async (index, principal) => {
|
|
104
|
+
const found = await entry(index, principal, id);
|
|
105
|
+
if (!index.knowledge)
|
|
106
|
+
throw new CliError("configuration_error", "index has no shared knowledge adapter");
|
|
107
|
+
return index.knowledge.tags(principal, found.ref, action, action === "list" ? undefined : values);
|
|
108
|
+
}, action !== "list")));
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=catalog-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-commands.js","sourceRoot":"","sources":["../src/catalog-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { CatalogEntry, CatalogInput, CatalogQuery } from "@wirecat/cli-core/store";
|
|
2
|
+
import { type FileMetadata, type SyncState } from "./model.js";
|
|
3
|
+
export declare const catalogInput: (file: FileMetadata) => CatalogInput;
|
|
4
|
+
export interface SourceCatalog {
|
|
5
|
+
import(principal: string, files: FileMetadata[]): Promise<{
|
|
6
|
+
entries: number;
|
|
7
|
+
retired: number;
|
|
8
|
+
}>;
|
|
9
|
+
get(principal: string, id: string): Promise<CatalogEntry | undefined>;
|
|
10
|
+
list(principal: string, query?: CatalogQuery): Promise<{
|
|
11
|
+
items: CatalogEntry[];
|
|
12
|
+
hasMore: boolean;
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
15
|
+
export declare const catalogFiles: (state: SyncState, roots: string[]) => FileMetadata[];
|
|
16
|
+
export interface CatalogTree {
|
|
17
|
+
item: Pick<CatalogEntry, "ref" | "name" | "kind" | "url" | "content"> & {
|
|
18
|
+
id: string;
|
|
19
|
+
};
|
|
20
|
+
children: CatalogTree[];
|
|
21
|
+
truncated: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare const catalogTree: (entries: CatalogEntry[], roots: string[], depth: number) => CatalogTree[];
|
|
24
|
+
export declare const catalogId: (entry: CatalogEntry) => string;
|
|
25
|
+
export declare const catalogOutput: (entry: CatalogEntry) => {
|
|
26
|
+
id: string;
|
|
27
|
+
ref: string;
|
|
28
|
+
kind: "file" | "folder";
|
|
29
|
+
name: string;
|
|
30
|
+
parents: string[];
|
|
31
|
+
url: string | undefined;
|
|
32
|
+
mime: string | undefined;
|
|
33
|
+
size: number | undefined;
|
|
34
|
+
created_at: string | undefined;
|
|
35
|
+
modified_at: string | undefined;
|
|
36
|
+
observed_at: string;
|
|
37
|
+
description: string | undefined;
|
|
38
|
+
actors: import("@wirecat/cli-core/store").CatalogActor[] | undefined;
|
|
39
|
+
provider_metadata: unknown;
|
|
40
|
+
active: boolean;
|
|
41
|
+
content: "indexed" | "metadata" | "unreadable";
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACvF,OAAO,EAAE,KAAK,YAAY,EAAU,KAAK,SAAS,EAAE,MAAM,YAAY,CAAA;AAGtE,eAAO,MAAM,YAAY,SAAU,YAAY,KAAG,YAwBhD,CAAA;AACF,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/F,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAA;IACrE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CACpG;AACD,eAAO,MAAM,YAAY,UAAW,SAAS,SAAS,MAAM,EAAE,KAAG,YAAY,EAY5E,CAAA;AACD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IACtF,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;CACnB;AACD,eAAO,MAAM,WAAW,YAAa,YAAY,EAAE,SAAS,MAAM,EAAE,SAAS,MAAM,KAAG,WAAW,EA0ChG,CAAA;AACD,eAAO,MAAM,SAAS,UAAW,YAAY,KAAG,MAA+C,CAAA;AAC/F,eAAO,MAAM,aAAa,UAAW,YAAY;IAC/C,EAAE;IACF,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,OAAO;IACP,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,UAAU;IACV,WAAW;IACX,WAAW;IACX,WAAW;IACX,MAAM;IACN,iBAAiB;IACjB,MAAM;IACN,OAAO;CACP,CAAA"}
|
package/dist/catalog.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { FOLDER } from "./model.js";
|
|
3
|
+
import { within } from "./scope.js";
|
|
4
|
+
export const catalogInput = (file) => ({
|
|
5
|
+
externalId: `${file.id}.md`,
|
|
6
|
+
kind: file.mime === FOLDER ? "folder" : "file",
|
|
7
|
+
name: file.name,
|
|
8
|
+
parents: file.parents.map((id) => `${id}.md`),
|
|
9
|
+
url: file.url,
|
|
10
|
+
mime: file.mime,
|
|
11
|
+
size: file.size,
|
|
12
|
+
createdAt: file.createdAt,
|
|
13
|
+
modifiedAt: file.modifiedAt,
|
|
14
|
+
description: file.description,
|
|
15
|
+
actors: [
|
|
16
|
+
...(file.owners ?? []).map((actor) => ({ ...actor, role: "owner" })),
|
|
17
|
+
...(file.lastModifiedBy ? [{ ...file.lastModifiedBy, role: "editor" }] : []),
|
|
18
|
+
],
|
|
19
|
+
metadata: file.providerMetadata ?? file,
|
|
20
|
+
frontMatter: {
|
|
21
|
+
source: "google-drive",
|
|
22
|
+
sourceUrl: file.url,
|
|
23
|
+
fileId: file.id,
|
|
24
|
+
mime: file.mime,
|
|
25
|
+
owners: file.owners ?? [],
|
|
26
|
+
lastModifiedBy: file.lastModifiedBy ?? null,
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
export const catalogFiles = (state, roots) => {
|
|
30
|
+
const folders = state.pending?.folders ?? state.folders;
|
|
31
|
+
const files = new Map(Object.values(state.documents).map((doc) => [doc.metadata.id, doc.metadata]));
|
|
32
|
+
for (const skip of state.skipped)
|
|
33
|
+
if (skip.file)
|
|
34
|
+
files.set(skip.id, skip.file);
|
|
35
|
+
for (const file of Object.values(folders))
|
|
36
|
+
files.set(file.id, file);
|
|
37
|
+
for (const job of state.pending?.jobs ?? []) {
|
|
38
|
+
if (job.kind === "remove")
|
|
39
|
+
files.delete(job.id);
|
|
40
|
+
else if (job.file)
|
|
41
|
+
files.set(job.id, job.file);
|
|
42
|
+
}
|
|
43
|
+
return [...files.values()].filter((file) => within(file, roots, folders));
|
|
44
|
+
};
|
|
45
|
+
export const catalogTree = (entries, roots, depth) => {
|
|
46
|
+
if (!Number.isSafeInteger(depth) || depth < 0 || depth > 50)
|
|
47
|
+
throw new CliError("validation_error", "tree depth must be between 0 and 50", { reason: "catalog.depth-invalid" });
|
|
48
|
+
const byId = new Map(entries.map((entry) => [entry.externalId, entry]));
|
|
49
|
+
const children = new Map();
|
|
50
|
+
for (const entry of entries)
|
|
51
|
+
for (const parent of entry.parents) {
|
|
52
|
+
const list = children.get(parent) ?? [];
|
|
53
|
+
list.push(entry);
|
|
54
|
+
children.set(parent, list);
|
|
55
|
+
}
|
|
56
|
+
let count = 0;
|
|
57
|
+
const node = (item, level, ancestors) => {
|
|
58
|
+
if (ancestors.has(item.externalId))
|
|
59
|
+
throw new CliError("invalid_response", "local folder ancestry contains a cycle", { reason: "catalog.cycle" });
|
|
60
|
+
if (++count > 10000)
|
|
61
|
+
throw new CliError("validation_error", "tree output exceeds 10000 nodes; choose a smaller folder", {
|
|
62
|
+
reason: "catalog.tree-limit",
|
|
63
|
+
});
|
|
64
|
+
const found = children.get(item.externalId) ?? [];
|
|
65
|
+
const next = new Set([...ancestors, item.externalId]);
|
|
66
|
+
return {
|
|
67
|
+
item: {
|
|
68
|
+
id: catalogId(item),
|
|
69
|
+
ref: item.ref,
|
|
70
|
+
name: item.name,
|
|
71
|
+
kind: item.kind,
|
|
72
|
+
url: item.url,
|
|
73
|
+
content: item.content,
|
|
74
|
+
},
|
|
75
|
+
children: level >= depth ? [] : found.map((child) => node(child, level + 1, next)),
|
|
76
|
+
truncated: level >= depth && found.length > 0,
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
return roots.map((id) => {
|
|
80
|
+
const entry = byId.get(id);
|
|
81
|
+
if (entry?.kind !== "folder")
|
|
82
|
+
throw new CliError("not_found", "folder is not in the active local catalog; run catalog import or sync", {
|
|
83
|
+
reason: "catalog.not-found",
|
|
84
|
+
});
|
|
85
|
+
return node(entry, 0, new Set());
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
export const catalogId = (entry) => entry.externalId.replace(/\.md$/, "");
|
|
89
|
+
export const catalogOutput = (entry) => ({
|
|
90
|
+
id: catalogId(entry),
|
|
91
|
+
ref: entry.ref,
|
|
92
|
+
kind: entry.kind,
|
|
93
|
+
name: entry.name,
|
|
94
|
+
parents: entry.parents.map((id) => id.replace(/\.md$/, "")),
|
|
95
|
+
url: entry.url,
|
|
96
|
+
mime: entry.mime,
|
|
97
|
+
size: entry.size,
|
|
98
|
+
created_at: entry.createdAt,
|
|
99
|
+
modified_at: entry.modifiedAt,
|
|
100
|
+
observed_at: entry.observedAt,
|
|
101
|
+
description: entry.description,
|
|
102
|
+
actors: entry.actors,
|
|
103
|
+
provider_metadata: entry.metadata,
|
|
104
|
+
active: entry.active,
|
|
105
|
+
content: entry.content,
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -15,9 +15,11 @@ export declare const ConfigSchema: v.StrictObjectSchema<{
|
|
|
15
15
|
}, undefined>, undefined>, undefined>;
|
|
16
16
|
readonly readOnly: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
17
17
|
readonly permissions: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.PicklistSchema<readonly ["deny", "readonly", "ask", "allow"], undefined>, undefined>, undefined>;
|
|
18
|
+
readonly maxTextChars: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 2000000, undefined>]>, undefined>;
|
|
18
19
|
readonly principal: v.StringSchema<undefined>;
|
|
19
20
|
readonly roots: v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>]>, undefined>;
|
|
20
21
|
readonly storage: v.PicklistSchema<["keyring", "file"], undefined>;
|
|
22
|
+
readonly pictureSearch: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
21
23
|
}, undefined>, undefined>;
|
|
22
24
|
readonly defaults: v.OptionalSchema<v.StrictObjectSchema<{
|
|
23
25
|
embeddingProvider: v.OptionalSchema<v.PicklistSchema<["local", "openai"], undefined>, undefined>;
|
|
@@ -34,6 +36,7 @@ export declare const ConfigSchema: v.StrictObjectSchema<{
|
|
|
34
36
|
}, undefined>, undefined>, undefined>;
|
|
35
37
|
readOnly: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
36
38
|
permissions: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.PicklistSchema<readonly ["deny", "readonly", "ask", "allow"], undefined>, undefined>, undefined>;
|
|
39
|
+
maxTextChars: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 2000000, undefined>]>, undefined>;
|
|
37
40
|
}, undefined>, undefined>;
|
|
38
41
|
readonly defaultProfile: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
39
42
|
}, undefined>;
|
|
@@ -62,13 +65,18 @@ export declare const activeProfile: (env: NodeJS.ProcessEnv, name: string) => {
|
|
|
62
65
|
permissions?: {
|
|
63
66
|
[x: string]: "allow" | "ask" | "deny" | "readonly";
|
|
64
67
|
} | undefined;
|
|
68
|
+
maxTextChars?: number | undefined;
|
|
65
69
|
principal: string;
|
|
66
70
|
roots: string[];
|
|
67
71
|
storage: "file" | "keyring";
|
|
72
|
+
pictureSearch?: boolean | undefined;
|
|
68
73
|
};
|
|
69
74
|
export interface OAuthApplication {
|
|
70
75
|
clientId: string;
|
|
71
76
|
clientSecret?: string;
|
|
72
77
|
}
|
|
78
|
+
export declare const checkTextLimit: (value: unknown) => number;
|
|
79
|
+
export declare const textLimit: (env: NodeJS.ProcessEnv, name: string) => number;
|
|
80
|
+
export declare const pictureSearch: (env: NodeJS.ProcessEnv, name: string) => boolean;
|
|
73
81
|
export declare const application: (env: NodeJS.ProcessEnv, file?: string) => OAuthApplication;
|
|
74
82
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAgB5B,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAIvB,CAAA;AACF,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,YAAY,CAAC,CAAA;AACvD,eAAO,MAAM,KAAK,QAAS,MAAM,CAAC,UAAU,sCAAiE,CAAA;AAC7G,eAAO,MAAM,UAAU,QAAS,MAAM,CAAC,UAAU,KAAG,MAMnD,CAAA;AACD,eAAO,MAAM,WAAW,QAAS,MAAM,CAAC,UAAU,UAAU,MAAM,SAIjE,CAAA;AACD,eAAO,MAAM,WAAW,6BAAoB,CAAA;AAC5C,eAAO,MAAM,MAAM,UAAW,MAAM,KAAG,MAUtC,CAAA;AACD,eAAO,MAAM,aAAa,QAAS,MAAM,CAAC,UAAU,QAAQ,MAAM;;;;;;;;;;;;;;;;;;;;;;;;CAOjE,CAAA;AACD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AACD,eAAO,MAAM,cAAc,UAAW,OAAO,KAAG,MAS/C,CAAA;AACD,eAAO,MAAM,SAAS,QAAS,MAAM,CAAC,UAAU,QAAQ,MAAM,KAAG,MACkC,CAAA;AACnG,eAAO,MAAM,aAAa,QAAS,MAAM,CAAC,UAAU,QAAQ,MAAM,KAAG,OACpB,CAAA;AACjD,eAAO,MAAM,WAAW,QAAS,MAAM,CAAC,UAAU,SAAS,MAAM,KAAG,gBA6BnE,CAAA"}
|
package/dist/config.js
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { CliError, loadConfigFile, resolvePaths, saveConfigFile } from "@wirecat/cli-base";
|
|
4
|
-
import { AI_ENTRIES, usableProfileName } from "@wirecat/cli-
|
|
5
|
-
import {
|
|
4
|
+
import { AI_ENTRIES, usableProfileName } from "@wirecat/cli-core/cli";
|
|
5
|
+
import { MAX_TEXT_CHARS } from "@wirecat/cli-core/documents";
|
|
6
|
+
import { LEVELS } from "@wirecat/cli-core/sends";
|
|
6
7
|
import * as v from "valibot";
|
|
7
8
|
import { WIRECAT_APPLICATION } from "./oauth-application.js";
|
|
8
9
|
const Common = {
|
|
9
10
|
...AI_ENTRIES,
|
|
10
11
|
readOnly: v.optional(v.boolean()),
|
|
11
12
|
permissions: v.optional(v.record(v.string(), v.picklist(LEVELS))),
|
|
13
|
+
maxTextChars: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(MAX_TEXT_CHARS))),
|
|
12
14
|
};
|
|
13
15
|
const Profile = v.strictObject({
|
|
14
16
|
principal: v.string(),
|
|
15
17
|
roots: v.array(v.pipe(v.string(), v.regex(/^[A-Za-z0-9_-]{1,200}$/))),
|
|
16
18
|
storage: v.picklist(["keyring", "file"]),
|
|
19
|
+
pictureSearch: v.optional(v.boolean()),
|
|
17
20
|
...Common,
|
|
18
21
|
});
|
|
19
22
|
export const ConfigSchema = v.strictObject({
|
|
@@ -52,9 +55,20 @@ export const fileId = (input) => {
|
|
|
52
55
|
export const activeProfile = (env, name) => {
|
|
53
56
|
const profile = readConfig(env).profiles[profileName(name)];
|
|
54
57
|
if (!profile)
|
|
55
|
-
throw new CliError("authentication_error", `profile ${name} is not signed in — drive ${name} session start
|
|
58
|
+
throw new CliError("authentication_error", `profile ${name} is not signed in — drive ${name} session start`, {
|
|
59
|
+
reason: "profile.not-signed-in",
|
|
60
|
+
});
|
|
56
61
|
return profile;
|
|
57
62
|
};
|
|
63
|
+
export const checkTextLimit = (value) => {
|
|
64
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value < 1)
|
|
65
|
+
throw new CliError("validation_error", "maxTextChars must be a positive whole number of characters");
|
|
66
|
+
if (value > MAX_TEXT_CHARS)
|
|
67
|
+
throw new CliError("validation_error", `maxTextChars can be at most ${MAX_TEXT_CHARS}: the document readers return at most that many characters`);
|
|
68
|
+
return value;
|
|
69
|
+
};
|
|
70
|
+
export const textLimit = (env, name) => activeProfile(env, name).maxTextChars ?? readConfig(env).defaults?.maxTextChars ?? MAX_TEXT_CHARS;
|
|
71
|
+
export const pictureSearch = (env, name) => activeProfile(env, name).pictureSearch ?? false;
|
|
58
72
|
export const application = (env, file) => {
|
|
59
73
|
if (!file) {
|
|
60
74
|
if (!env.DRIVE_GOOGLE_CLIENT_ID) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAC1F,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAc,MAAM,mBAAmB,CAAA;AAGxD,eAAO,MAAM,WAAW,UAAW,OAAO,KAAG,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAc,MAAM,mBAAmB,CAAA;AAGxD,eAAO,MAAM,WAAW,UAAW,OAAO,KAAG,QAkD5C,CAAA"}
|