@andie/openlist 0.0.1

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 ADDED
@@ -0,0 +1,27 @@
1
+ # OpenList CLI and Skill
2
+
3
+ This repository ships the `@andie/openlist` CLI and the `skills/openlist` Agent Skill.
4
+
5
+ ## CLI
6
+
7
+ ```sh
8
+ npx @andie/openlist config set endpoint https://openlist.example
9
+ npx @andie/openlist config set admin-token <admin-token>
10
+ npx @andie/openlist share create /test/a.txt
11
+ ```
12
+
13
+ `share create` only accepts existing OpenList paths. It reads each path first with OpenList and creates one share only after all paths are readable.
14
+
15
+ Defaults:
16
+
17
+ - Share code is enabled unless `--no-code` is passed.
18
+ - Expiration is 3 days unless `--expires` or `--no-expire` is passed.
19
+ - Multiple paths create one share bundle.
20
+
21
+ Config precedence:
22
+
23
+ 1. CLI flags: `--endpoint`, `--admin-token`
24
+ 2. Environment: `OPENLIST_ENDPOINT`, `OPENLIST_ADMIN_TOKEN`
25
+ 3. User config: `~/.config/openlist/config.json`
26
+
27
+ CLI commands write stable JSON Agent Results to stdout. Diagnostics are written to stderr.
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const run_openlist_1 = require("./run-openlist");
5
+ void (0, run_openlist_1.runOpenList)(process.argv.slice(2)).then((exitCode) => {
6
+ process.exitCode = exitCode;
7
+ });
8
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,iDAA6C;AAE7C,KAAK,IAAA,0BAAW,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;IACxD,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC9B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type ConfigFlags, type Env } from "../config/store";
2
+ import type { CommandDeps } from "./shared";
3
+ export declare function runConfigCommand(args: string[], env: Env, flags: ConfigFlags, deps: CommandDeps): Promise<import("../model/result").AgentSuccess<{
4
+ path: string;
5
+ }>>;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runConfigCommand = runConfigCommand;
4
+ const redact_1 = require("../config/redact");
5
+ const store_1 = require("../config/store");
6
+ const result_1 = require("../model/result");
7
+ async function runConfigCommand(args, env, flags, deps) {
8
+ const subcommand = args[0];
9
+ if (!subcommand) {
10
+ throw new result_1.OpenListError("USAGE_CONFIG_COMMAND_REQUIRED", "Missing config command", 2);
11
+ }
12
+ if (subcommand === "set") {
13
+ return runConfigSet(args.slice(1), env, deps);
14
+ }
15
+ if (subcommand === "get") {
16
+ assertNoExtraArgs(args.slice(1), "config get");
17
+ const stored = await (0, store_1.readUserConfig)(env, deps);
18
+ return (0, result_1.success)("config get", (0, store_1.resolveEffectiveConfig)(env, flags, stored));
19
+ }
20
+ if (subcommand === "unset") {
21
+ return runConfigUnset(args.slice(1), env, deps);
22
+ }
23
+ if (subcommand === "path") {
24
+ assertNoExtraArgs(args.slice(1), "config path");
25
+ return (0, result_1.success)("config path", {
26
+ path: (0, store_1.resolveConfigPath)(env)
27
+ });
28
+ }
29
+ throw new result_1.OpenListError("USAGE_UNKNOWN_CONFIG_COMMAND", `Unknown config command: ${subcommand}`, 2, {
30
+ command: subcommand
31
+ });
32
+ }
33
+ async function runConfigSet(args, env, deps) {
34
+ const [key, value, ...extra] = args;
35
+ if (!key || !value || extra.length > 0) {
36
+ throw new result_1.OpenListError("USAGE_CONFIG_SET", "Usage: openlist config set endpoint <url> | openlist config set admin-token <token>", 2);
37
+ }
38
+ const config = await (0, store_1.readUserConfig)(env, deps);
39
+ if (key === "endpoint") {
40
+ const next = {
41
+ ...config,
42
+ endpoint: value
43
+ };
44
+ await (0, store_1.writeUserConfig)(env, next, deps);
45
+ return (0, result_1.success)("config set", {
46
+ key: "endpoint",
47
+ path: (0, store_1.resolveConfigPath)(env),
48
+ value
49
+ });
50
+ }
51
+ if (key === "admin-token") {
52
+ const next = {
53
+ ...config,
54
+ adminToken: value
55
+ };
56
+ await (0, store_1.writeUserConfig)(env, next, deps);
57
+ return (0, result_1.success)("config set", {
58
+ key: "admin-token",
59
+ path: (0, store_1.resolveConfigPath)(env),
60
+ adminToken: (0, redact_1.redactSecret)(value)
61
+ });
62
+ }
63
+ throw new result_1.OpenListError("USAGE_CONFIG_KEY", `Unknown config key: ${key}`, 2, {
64
+ key
65
+ });
66
+ }
67
+ async function runConfigUnset(args, env, deps) {
68
+ const [key, ...extra] = args;
69
+ if (key !== "admin-token" || extra.length > 0) {
70
+ throw new result_1.OpenListError("USAGE_CONFIG_UNSET", "Usage: openlist config unset admin-token", 2);
71
+ }
72
+ const config = await (0, store_1.readUserConfig)(env, deps);
73
+ const removed = Boolean(config.adminToken);
74
+ const next = {
75
+ ...config
76
+ };
77
+ delete next.adminToken;
78
+ await (0, store_1.writeUserConfig)(env, next, deps);
79
+ return (0, result_1.success)("config unset", {
80
+ key: "admin-token",
81
+ path: (0, store_1.resolveConfigPath)(env),
82
+ removed
83
+ });
84
+ }
85
+ function assertNoExtraArgs(args, command) {
86
+ if (args.length > 0) {
87
+ throw new result_1.OpenListError("USAGE_EXTRA_ARGS", `Unexpected arguments for ${command}`, 2, {
88
+ command,
89
+ extra: args
90
+ });
91
+ }
92
+ }
93
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type CommandDeps } from "./shared";
2
+ import type { ConfigFlags, Env } from "../config/store";
3
+ export type ShareCreateResult = {
4
+ id: string;
5
+ paths: string[];
6
+ accessUrl: string;
7
+ url: string;
8
+ code: string | null;
9
+ expires: string | null;
10
+ maxAccessed: number | null;
11
+ remark: string | null;
12
+ readme: string | null;
13
+ header: string | null;
14
+ creator: string | null;
15
+ };
16
+ export declare function runShareCreateCommand(args: string[], env: Env, flags: ConfigFlags, deps: CommandDeps): Promise<import("../model/result").AgentSuccess<ShareCreateResult>>;
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runShareCreateCommand = runShareCreateCommand;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const result_1 = require("../model/result");
6
+ const client_1 = require("../openlist/client");
7
+ const shared_1 = require("./shared");
8
+ const DEFAULT_EXPIRATION_MS = 3 * 24 * 60 * 60 * 1000;
9
+ const SHARE_CODE_ALPHABET = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789";
10
+ const DURATION_MULTIPLIER = {
11
+ s: 1000,
12
+ m: 60 * 1000,
13
+ h: 60 * 60 * 1000,
14
+ d: 24 * 60 * 60 * 1000,
15
+ w: 7 * 24 * 60 * 60 * 1000
16
+ };
17
+ async function runShareCreateCommand(args, env, flags, deps) {
18
+ const parsed = parseShareCreateArgs(args, deps);
19
+ const connection = await (0, shared_1.resolveConnectionForCommand)(env, flags, deps);
20
+ const client = deps.openListFactory?.(connection) ?? (0, client_1.createOpenListClient)(connection, deps);
21
+ for (const path of parsed.paths) {
22
+ try {
23
+ await client.getPath(path);
24
+ }
25
+ catch (error) {
26
+ if (error instanceof result_1.OpenListError) {
27
+ if (!isPathReadApiFailure(error)) {
28
+ throw error;
29
+ }
30
+ throw new result_1.OpenListError("OPENLIST_PATH_UNREADABLE", `OpenList path is not readable: ${path}`, error.exitCode, {
31
+ path,
32
+ cause: {
33
+ code: error.code,
34
+ message: error.message,
35
+ details: error.details
36
+ }
37
+ });
38
+ }
39
+ throw error;
40
+ }
41
+ }
42
+ const request = toOpenListCreateShareRequest(parsed);
43
+ const share = await client.createShare(request);
44
+ const result = toShareCreateResult(connection.endpoint, parsed, request, share);
45
+ return (0, result_1.success)("share create", result);
46
+ }
47
+ function parseShareCreateArgs(args, deps) {
48
+ const paths = [];
49
+ let explicitCode;
50
+ let noCode = false;
51
+ let explicitExpires;
52
+ let noExpire = false;
53
+ let id;
54
+ let maxAccessed;
55
+ let remark;
56
+ let readme;
57
+ let header;
58
+ let positionalOnly = false;
59
+ for (let index = 0; index < args.length; index += 1) {
60
+ const arg = args[index];
61
+ if (positionalOnly) {
62
+ paths.push(arg);
63
+ continue;
64
+ }
65
+ if (arg === "--") {
66
+ positionalOnly = true;
67
+ continue;
68
+ }
69
+ if (arg === "--code") {
70
+ explicitCode = requiredFlagValue(args, index, "--code");
71
+ index += 1;
72
+ continue;
73
+ }
74
+ if (arg.startsWith("--code=")) {
75
+ explicitCode = valueFromEqualsFlag(arg, "--code");
76
+ continue;
77
+ }
78
+ if (arg === "--no-code") {
79
+ noCode = true;
80
+ continue;
81
+ }
82
+ if (arg === "--expires") {
83
+ explicitExpires = requiredFlagValue(args, index, "--expires");
84
+ index += 1;
85
+ continue;
86
+ }
87
+ if (arg.startsWith("--expires=")) {
88
+ explicitExpires = valueFromEqualsFlag(arg, "--expires");
89
+ continue;
90
+ }
91
+ if (arg === "--no-expire") {
92
+ noExpire = true;
93
+ continue;
94
+ }
95
+ if (arg === "--id") {
96
+ id = requiredFlagValue(args, index, "--id");
97
+ index += 1;
98
+ continue;
99
+ }
100
+ if (arg.startsWith("--id=")) {
101
+ id = valueFromEqualsFlag(arg, "--id");
102
+ continue;
103
+ }
104
+ if (arg === "--max-accessed") {
105
+ maxAccessed = parseNonNegativeInt(requiredFlagValue(args, index, "--max-accessed"), "--max-accessed");
106
+ index += 1;
107
+ continue;
108
+ }
109
+ if (arg.startsWith("--max-accessed=")) {
110
+ maxAccessed = parseNonNegativeInt(valueFromEqualsFlag(arg, "--max-accessed"), "--max-accessed");
111
+ continue;
112
+ }
113
+ if (arg === "--remark") {
114
+ remark = requiredFlagValue(args, index, "--remark");
115
+ index += 1;
116
+ continue;
117
+ }
118
+ if (arg.startsWith("--remark=")) {
119
+ remark = valueFromEqualsFlag(arg, "--remark");
120
+ continue;
121
+ }
122
+ if (arg === "--readme") {
123
+ readme = requiredFlagValue(args, index, "--readme");
124
+ index += 1;
125
+ continue;
126
+ }
127
+ if (arg.startsWith("--readme=")) {
128
+ readme = valueFromEqualsFlag(arg, "--readme");
129
+ continue;
130
+ }
131
+ if (arg === "--header") {
132
+ header = requiredFlagValue(args, index, "--header");
133
+ index += 1;
134
+ continue;
135
+ }
136
+ if (arg.startsWith("--header=")) {
137
+ header = valueFromEqualsFlag(arg, "--header");
138
+ continue;
139
+ }
140
+ if (arg.startsWith("-")) {
141
+ throw new result_1.OpenListError("USAGE_UNKNOWN_FLAG", `Unknown share create flag: ${arg}`, 2, {
142
+ flag: arg
143
+ });
144
+ }
145
+ paths.push(arg);
146
+ }
147
+ if (paths.length === 0) {
148
+ throw new result_1.OpenListError("USAGE_SHARE_PATH_REQUIRED", "Usage: openlist share create <openlist-path> [more-openlist-paths...]", 2);
149
+ }
150
+ for (const path of paths) {
151
+ assertOpenListPath(path);
152
+ }
153
+ if (explicitCode !== undefined && noCode) {
154
+ throw new result_1.OpenListError("USAGE_CODE_CONFLICT", "Use either --code or --no-code, not both", 2);
155
+ }
156
+ if (explicitExpires !== undefined && noExpire) {
157
+ throw new result_1.OpenListError("USAGE_EXPIRES_CONFLICT", "Use either --expires or --no-expire, not both", 2);
158
+ }
159
+ return {
160
+ paths,
161
+ code: noCode ? null : explicitCode ?? (deps.randomCode ?? randomShareCode)(),
162
+ expires: noExpire
163
+ ? null
164
+ : explicitExpires
165
+ ? parseExpiration(explicitExpires, deps.now ?? (() => new Date()))
166
+ : new Date((deps.now ?? (() => new Date()))().getTime() + DEFAULT_EXPIRATION_MS).toISOString(),
167
+ id,
168
+ maxAccessed,
169
+ remark,
170
+ readme,
171
+ header
172
+ };
173
+ }
174
+ function toOpenListCreateShareRequest(parsed) {
175
+ const request = {
176
+ files: parsed.paths,
177
+ expires: parsed.expires,
178
+ pwd: parsed.code ?? ""
179
+ };
180
+ if (parsed.id !== undefined) {
181
+ request.id = parsed.id;
182
+ }
183
+ if (parsed.maxAccessed !== undefined) {
184
+ request.max_accessed = parsed.maxAccessed;
185
+ }
186
+ if (parsed.remark !== undefined) {
187
+ request.remark = parsed.remark;
188
+ }
189
+ if (parsed.readme !== undefined) {
190
+ request.readme = parsed.readme;
191
+ }
192
+ if (parsed.header !== undefined) {
193
+ request.header = parsed.header;
194
+ }
195
+ return request;
196
+ }
197
+ function toShareCreateResult(endpoint, parsed, request, share) {
198
+ const id = share.id;
199
+ const url = `${endpoint}/@s/${encodeURIComponent(id)}`;
200
+ const code = share.pwd || request.pwd || null;
201
+ const accessUrl = code ? `${url}?pwd=${encodeURIComponent(code)}` : url;
202
+ return {
203
+ id,
204
+ paths: share.files ?? parsed.paths,
205
+ accessUrl,
206
+ url,
207
+ code,
208
+ expires: share.expires ?? request.expires ?? null,
209
+ maxAccessed: share.max_accessed ?? request.max_accessed ?? null,
210
+ remark: share.remark ?? request.remark ?? null,
211
+ readme: share.readme ?? request.readme ?? null,
212
+ header: share.header ?? request.header ?? null,
213
+ creator: share.creator ?? null
214
+ };
215
+ }
216
+ function parseExpiration(value, now) {
217
+ const duration = /^(\d+)(s|m|h|d|w)$/.exec(value);
218
+ if (duration) {
219
+ const amount = Number(duration[1]);
220
+ const unit = duration[2];
221
+ const multiplier = DURATION_MULTIPLIER[unit];
222
+ return new Date(now().getTime() + amount * multiplier).toISOString();
223
+ }
224
+ const parsed = new Date(value);
225
+ if (Number.isNaN(parsed.getTime())) {
226
+ throw new result_1.OpenListError("USAGE_EXPIRES_INVALID", "--expires must be an ISO datetime or duration like 3d, 12h, or 30m", 2, {
227
+ value
228
+ });
229
+ }
230
+ return parsed.toISOString();
231
+ }
232
+ function parseNonNegativeInt(value, flag) {
233
+ if (!/^\d+$/.test(value)) {
234
+ throw new result_1.OpenListError("USAGE_INTEGER_FLAG", `${flag} must be a non-negative integer`, 2, {
235
+ flag,
236
+ value
237
+ });
238
+ }
239
+ return Number(value);
240
+ }
241
+ function assertOpenListPath(path) {
242
+ if (!path.startsWith("/") || path.startsWith("//")) {
243
+ throw new result_1.OpenListError("USAGE_OPENLIST_PATH", "Share paths must be OpenList paths that begin with /", 2, {
244
+ path
245
+ });
246
+ }
247
+ }
248
+ function isPathReadApiFailure(error) {
249
+ if (error.code !== "OPENLIST_API_ERROR") {
250
+ return false;
251
+ }
252
+ const apiPath = error.details.apiPath;
253
+ const apiCode = error.details.apiCode;
254
+ if (apiPath !== "/api/fs/get") {
255
+ return false;
256
+ }
257
+ return apiCode !== 401 && apiCode !== 403;
258
+ }
259
+ function randomShareCode() {
260
+ let code = "";
261
+ for (let index = 0; index < 8; index += 1) {
262
+ code += SHARE_CODE_ALPHABET[(0, node_crypto_1.randomInt)(SHARE_CODE_ALPHABET.length)];
263
+ }
264
+ return code;
265
+ }
266
+ function requiredFlagValue(args, index, flag) {
267
+ const value = args[index + 1];
268
+ if (!value || value.startsWith("--")) {
269
+ throw new result_1.OpenListError("USAGE_FLAG_VALUE_REQUIRED", `${flag} requires a value`, 2, {
270
+ flag
271
+ });
272
+ }
273
+ return value;
274
+ }
275
+ function valueFromEqualsFlag(arg, flag) {
276
+ const value = arg.slice(`${flag}=`.length);
277
+ if (!value) {
278
+ throw new result_1.OpenListError("USAGE_FLAG_VALUE_REQUIRED", `${flag} requires a value`, 2, {
279
+ flag
280
+ });
281
+ }
282
+ return value;
283
+ }
284
+ //# sourceMappingURL=share-create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share-create.js","sourceRoot":"","sources":["../../src/commands/share-create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type ConfigDeps, type ConfigFlags, type Env } from "../config/store";
2
+ import { type OpenListClient, type OpenListConnection } from "../openlist/client";
3
+ export type CommandDeps = ConfigDeps & {
4
+ fetch?: typeof fetch;
5
+ now?: () => Date;
6
+ randomCode?: () => string;
7
+ openListFactory?: (connection: OpenListConnection) => OpenListClient;
8
+ };
9
+ export declare function createOpenListForCommand(env: Env, flags: ConfigFlags, deps: CommandDeps): Promise<OpenListClient>;
10
+ export declare function resolveConnectionForCommand(env: Env, flags: ConfigFlags, deps: CommandDeps): Promise<OpenListConnection>;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOpenListForCommand = createOpenListForCommand;
4
+ exports.resolveConnectionForCommand = resolveConnectionForCommand;
5
+ const store_1 = require("../config/store");
6
+ const result_1 = require("../model/result");
7
+ const client_1 = require("../openlist/client");
8
+ async function createOpenListForCommand(env, flags, deps) {
9
+ const connection = await resolveConnectionForCommand(env, flags, deps);
10
+ return (deps.openListFactory ?? ((conn) => (0, client_1.createOpenListClient)(conn, deps)))(connection);
11
+ }
12
+ async function resolveConnectionForCommand(env, flags, deps) {
13
+ const stored = await (0, store_1.readUserConfig)(env, deps);
14
+ const resolved = (0, store_1.resolveEffectiveConfig)(env, flags, stored);
15
+ const endpoint = resolved.effective.endpoint.value;
16
+ const adminToken = resolved.effective.adminToken.configured
17
+ ? resolveAdminToken(env, flags, stored.adminToken)
18
+ : null;
19
+ if (!endpoint) {
20
+ throw new result_1.OpenListError("CONFIG_ENDPOINT_REQUIRED", "OpenList endpoint is not configured. Run: npx @andie/openlist config set endpoint <url>", 2);
21
+ }
22
+ if (!adminToken) {
23
+ throw new result_1.OpenListError("CONFIG_ADMIN_TOKEN_REQUIRED", "OpenList admin token is not configured. Run: npx @andie/openlist config set admin-token <token>", 2);
24
+ }
25
+ return {
26
+ endpoint: (0, client_1.normalizeEndpoint)(endpoint),
27
+ adminToken
28
+ };
29
+ }
30
+ function resolveAdminToken(env, flags, storedToken) {
31
+ return flags.adminToken ?? env.OPENLIST_ADMIN_TOKEN ?? storedToken ?? null;
32
+ }
33
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":";;AAsBA,4DAUC;AAED,kEAgCC;AAlED,2CAMyB;AACzB,4CAAgD;AAChD,+CAK4B;AASrB,KAAK,UAAU,wBAAwB,CAC5C,GAAQ,EACR,KAAkB,EAClB,IAAiB;IAEjB,MAAM,UAAU,GAAG,MAAM,2BAA2B,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAEvE,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,6BAAoB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAC3E,UAAU,CACX,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,2BAA2B,CAC/C,GAAQ,EACR,KAAkB,EAClB,IAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAA,8BAAsB,EAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;IACnD,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU;QACzD,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC;QAClD,CAAC,CAAC,IAAI,CAAC;IAET,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,sBAAa,CACrB,0BAA0B,EAC1B,yFAAyF,EACzF,CAAC,CACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,sBAAa,CACrB,6BAA6B,EAC7B,iGAAiG,EACjG,CAAC,CACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,IAAA,0BAAiB,EAAC,QAAQ,CAAC;QACrC,UAAU;KACX,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,GAAQ,EACR,KAAkB,EAClB,WAA+B;IAE/B,OAAO,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC,oBAAoB,IAAI,WAAW,IAAI,IAAI,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type RedactedSecret = {
2
+ configured: boolean;
3
+ redacted: string | null;
4
+ };
5
+ export declare function redactSecret(value: string | undefined): RedactedSecret;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.redactSecret = redactSecret;
4
+ function redactSecret(value) {
5
+ if (!value) {
6
+ return {
7
+ configured: false,
8
+ redacted: null
9
+ };
10
+ }
11
+ if (value.length <= 8) {
12
+ return {
13
+ configured: true,
14
+ redacted: "<set>"
15
+ };
16
+ }
17
+ return {
18
+ configured: true,
19
+ redacted: `${value.slice(0, 4)}...${value.slice(-4)}`
20
+ };
21
+ }
22
+ //# sourceMappingURL=redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/config/redact.ts"],"names":[],"mappings":";;AAKA,oCAmBC;AAnBD,SAAgB,YAAY,CAAC,KAAyB;IACpD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,OAAO;SAClB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;KACtD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ import * as nodeFs from "node:fs/promises";
2
+ import { type RedactedSecret } from "./redact";
3
+ export type Env = Record<string, string | undefined>;
4
+ export type UserConfig = {
5
+ endpoint?: string;
6
+ adminToken?: string;
7
+ };
8
+ export type ConfigFlags = {
9
+ endpoint?: string;
10
+ adminToken?: string;
11
+ };
12
+ export type ConfigSource = "flag" | "env" | "config" | "unset";
13
+ export type ResolvedConfig = {
14
+ path: string;
15
+ stored: {
16
+ endpoint: string | null;
17
+ adminToken: RedactedSecret;
18
+ };
19
+ effective: {
20
+ endpoint: {
21
+ value: string | null;
22
+ source: ConfigSource;
23
+ };
24
+ adminToken: RedactedSecret & {
25
+ source: ConfigSource;
26
+ };
27
+ };
28
+ };
29
+ export type ConfigFs = Pick<typeof nodeFs, "readFile" | "writeFile" | "mkdir" | "chmod" | "rename">;
30
+ export type ConfigDeps = {
31
+ fs?: ConfigFs;
32
+ };
33
+ export declare function resolveConfigPath(env: Env): string;
34
+ export declare function readUserConfig(env: Env, deps?: ConfigDeps): Promise<UserConfig>;
35
+ export declare function writeUserConfig(env: Env, config: UserConfig, deps?: ConfigDeps): Promise<void>;
36
+ export declare function resolveEffectiveConfig(env: Env, flags: ConfigFlags, stored: UserConfig): ResolvedConfig;