@eyeauras/cli-factory 0.1.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 (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -0
  3. package/dist/src/app-arguments.d.ts +59 -0
  4. package/dist/src/app-arguments.d.ts.map +1 -0
  5. package/dist/src/app-arguments.js +102 -0
  6. package/dist/src/app-arguments.js.map +1 -0
  7. package/dist/src/auth.d.ts +14 -0
  8. package/dist/src/auth.d.ts.map +1 -0
  9. package/dist/src/auth.js +184 -0
  10. package/dist/src/auth.js.map +1 -0
  11. package/dist/src/bounded-lines.d.ts +4 -0
  12. package/dist/src/bounded-lines.d.ts.map +1 -0
  13. package/dist/src/bounded-lines.js +68 -0
  14. package/dist/src/bounded-lines.js.map +1 -0
  15. package/dist/src/cli.d.ts +3 -0
  16. package/dist/src/cli.d.ts.map +1 -0
  17. package/dist/src/cli.js +364 -0
  18. package/dist/src/cli.js.map +1 -0
  19. package/dist/src/command-gate.d.ts +9 -0
  20. package/dist/src/command-gate.d.ts.map +1 -0
  21. package/dist/src/command-gate.js +64 -0
  22. package/dist/src/command-gate.js.map +1 -0
  23. package/dist/src/command-input.d.ts +14 -0
  24. package/dist/src/command-input.d.ts.map +1 -0
  25. package/dist/src/command-input.js +2 -0
  26. package/dist/src/command-input.js.map +1 -0
  27. package/dist/src/command.d.ts +5 -0
  28. package/dist/src/command.d.ts.map +1 -0
  29. package/dist/src/command.js +14 -0
  30. package/dist/src/command.js.map +1 -0
  31. package/dist/src/index.d.ts +21 -0
  32. package/dist/src/index.d.ts.map +1 -0
  33. package/dist/src/index.js +16 -0
  34. package/dist/src/index.js.map +1 -0
  35. package/dist/src/input-limits.d.ts +9 -0
  36. package/dist/src/input-limits.d.ts.map +1 -0
  37. package/dist/src/input-limits.js +21 -0
  38. package/dist/src/input-limits.js.map +1 -0
  39. package/dist/src/json-rpc.d.ts +8 -0
  40. package/dist/src/json-rpc.d.ts.map +1 -0
  41. package/dist/src/json-rpc.js +99 -0
  42. package/dist/src/json-rpc.js.map +1 -0
  43. package/dist/src/option-parsers.d.ts +10 -0
  44. package/dist/src/option-parsers.d.ts.map +1 -0
  45. package/dist/src/option-parsers.js +26 -0
  46. package/dist/src/option-parsers.js.map +1 -0
  47. package/dist/src/output.d.ts +4 -0
  48. package/dist/src/output.d.ts.map +1 -0
  49. package/dist/src/output.js +54 -0
  50. package/dist/src/output.js.map +1 -0
  51. package/dist/src/permissions.d.ts +11 -0
  52. package/dist/src/permissions.d.ts.map +1 -0
  53. package/dist/src/permissions.js +95 -0
  54. package/dist/src/permissions.js.map +1 -0
  55. package/dist/src/private-storage.d.ts +5 -0
  56. package/dist/src/private-storage.d.ts.map +1 -0
  57. package/dist/src/private-storage.js +68 -0
  58. package/dist/src/private-storage.js.map +1 -0
  59. package/dist/src/profile-commands.d.ts +29 -0
  60. package/dist/src/profile-commands.d.ts.map +1 -0
  61. package/dist/src/profile-commands.js +265 -0
  62. package/dist/src/profile-commands.js.map +1 -0
  63. package/dist/src/profile-file.d.ts +26 -0
  64. package/dist/src/profile-file.d.ts.map +1 -0
  65. package/dist/src/profile-file.js +325 -0
  66. package/dist/src/profile-file.js.map +1 -0
  67. package/dist/src/profile-store.d.ts +32 -0
  68. package/dist/src/profile-store.d.ts.map +1 -0
  69. package/dist/src/profile-store.js +223 -0
  70. package/dist/src/profile-store.js.map +1 -0
  71. package/dist/src/proof.d.ts +18 -0
  72. package/dist/src/proof.d.ts.map +1 -0
  73. package/dist/src/proof.js +98 -0
  74. package/dist/src/proof.js.map +1 -0
  75. package/dist/src/resources.d.ts +4 -0
  76. package/dist/src/resources.d.ts.map +1 -0
  77. package/dist/src/resources.js +17 -0
  78. package/dist/src/resources.js.map +1 -0
  79. package/dist/src/response-body.d.ts +12 -0
  80. package/dist/src/response-body.d.ts.map +1 -0
  81. package/dist/src/response-body.js +70 -0
  82. package/dist/src/response-body.js.map +1 -0
  83. package/dist/src/secret-store.d.ts +21 -0
  84. package/dist/src/secret-store.d.ts.map +1 -0
  85. package/dist/src/secret-store.js +73 -0
  86. package/dist/src/secret-store.js.map +1 -0
  87. package/dist/src/target-commands.d.ts +19 -0
  88. package/dist/src/target-commands.d.ts.map +1 -0
  89. package/dist/src/target-commands.js +17 -0
  90. package/dist/src/target-commands.js.map +1 -0
  91. package/dist/src/testing-contracts.d.ts +31 -0
  92. package/dist/src/testing-contracts.d.ts.map +1 -0
  93. package/dist/src/testing-contracts.js +72 -0
  94. package/dist/src/testing-contracts.js.map +1 -0
  95. package/dist/src/testing.d.ts +51 -0
  96. package/dist/src/testing.d.ts.map +1 -0
  97. package/dist/src/testing.js +126 -0
  98. package/dist/src/testing.js.map +1 -0
  99. package/dist/src/types.d.ts +174 -0
  100. package/dist/src/types.d.ts.map +1 -0
  101. package/dist/src/types.js +2 -0
  102. package/dist/src/types.js.map +1 -0
  103. package/package.json +51 -0
@@ -0,0 +1,32 @@
1
+ import { type IAppArguments } from "./app-arguments.js";
2
+ import type { Profile, ProfileStoreContract, ProfileValues } from "./types.js";
3
+ export interface ProfileStoreOptions {
4
+ applicationId: string;
5
+ defaultName?: string;
6
+ defaults?: ProfileValues;
7
+ rootDirectory?: string;
8
+ appArguments?: IAppArguments;
9
+ validate?: (values: ProfileValues) => void | Promise<void>;
10
+ }
11
+ export declare function assertProfileName(name: string): void;
12
+ /** Ported from reviewed profile-isolation fix 3df5066 (#9). */
13
+ export declare function assertUniqueProfileName(name: string, names: readonly string[]): void;
14
+ export declare class ProfileStore implements ProfileStoreContract {
15
+ #private;
16
+ constructor(options: ProfileStoreOptions);
17
+ get(name?: string): Promise<Profile>;
18
+ list(): Promise<{
19
+ active: string;
20
+ profiles: Profile[];
21
+ }>;
22
+ create(name: string, values?: ProfileValues): Promise<Profile>;
23
+ set(name: string, values: ProfileValues): Promise<Profile>;
24
+ setDefault(name: string): Promise<Profile>;
25
+ delete(name: string): Promise<{
26
+ deleted: string;
27
+ default: string;
28
+ }>;
29
+ getPermissions(name?: string): Promise<readonly string[] | undefined>;
30
+ setPermissions(name: string, permissions: readonly string[]): Promise<readonly string[]>;
31
+ }
32
+ //# sourceMappingURL=profile-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-store.d.ts","sourceRoot":"","sources":["../../src/profile-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAS/E,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D;AAID,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAWpD;AAED,+DAA+D;AAC/D,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,IAAI,CAMN;AAED,qBAAa,YAAa,YAAW,oBAAoB;;IASvD,YAAmB,OAAO,EAAE,mBAAmB,EA6B9C;IAEY,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAShD;IAEY,IAAI,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,CASpE;IAEY,MAAM,CACjB,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,aAAkB,GACzB,OAAO,CAAC,OAAO,CAAC,CAWlB;IAEY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBtE;IAEY,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAetD;IAEY,MAAM,CACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CA4B/C;IAEY,cAAc,CACzB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC,CAWxC;IAEY,cAAc,CACzB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAa5B;CAmFF"}
@@ -0,0 +1,223 @@
1
+ var _a;
2
+ import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import { AppArguments } from "./app-arguments.js";
5
+ const profileNamePattern = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
6
+ export function assertProfileName(name) {
7
+ if (!profileNamePattern.test(name)) {
8
+ throw new Error("Profile names must start with a letter or number and contain at most 64 letters, numbers, dots, dashes, or underscores.");
9
+ }
10
+ if (name.toLowerCase() === "profiles.json") {
11
+ throw new Error("Profile name 'profiles.json' is reserved for the application profile index.");
12
+ }
13
+ }
14
+ /** Ported from reviewed profile-isolation fix 3df5066 (#9). */
15
+ export function assertUniqueProfileName(name, names) {
16
+ if (names.some((existing) => existing.toLowerCase() === name.toLowerCase())) {
17
+ throw new Error(`Profile '${name}' already exists ignoring letter case. Use its exact spelling or choose a different name.`);
18
+ }
19
+ }
20
+ export class ProfileStore {
21
+ static #writes = new Map();
22
+ #filePath;
23
+ #defaultName;
24
+ #defaults;
25
+ #validate;
26
+ constructor(options) {
27
+ this.#defaultName = options.defaultName ?? "default";
28
+ assertProfileName(this.#defaultName);
29
+ this.#defaults = structuredClone(options.defaults ?? {});
30
+ this.#validate = options.validate;
31
+ const appArguments = options.appArguments ??
32
+ new AppArguments({
33
+ AppName: options.applicationId,
34
+ Profile: this.#defaultName,
35
+ ...(options.rootDirectory === undefined
36
+ ? {}
37
+ : {
38
+ Environment: {
39
+ ...AppArguments.CurrentEnvironment(),
40
+ EnvironmentAppData: options.rootDirectory,
41
+ EnvironmentLocalAppData: options.rootDirectory,
42
+ },
43
+ }),
44
+ });
45
+ if (appArguments.AppName !== options.applicationId) {
46
+ throw new Error(`ProfileStore applicationId '${options.applicationId}' does not match AppArguments.AppName '${appArguments.AppName}'.`);
47
+ }
48
+ this.#filePath = join(appArguments.RoamingAppDataDirectory, "profiles.json");
49
+ }
50
+ async get(name) {
51
+ const document = await this.#load();
52
+ const selectedName = name ?? document.active;
53
+ const values = document.profiles[selectedName];
54
+ if (!Object.hasOwn(document.profiles, selectedName) || !values) {
55
+ throw new Error(`Profile '${selectedName}' does not exist.`);
56
+ }
57
+ return { name: selectedName, values: structuredClone(values) };
58
+ }
59
+ async list() {
60
+ const document = await this.#load();
61
+ return {
62
+ active: document.active,
63
+ profiles: Object.entries(document.profiles).map(([name, values]) => ({
64
+ name,
65
+ values: structuredClone(values),
66
+ })),
67
+ };
68
+ }
69
+ async create(name, values = {}) {
70
+ assertProfileName(name);
71
+ return this.#mutate(async () => {
72
+ const document = await this.#load();
73
+ assertUniqueProfileName(name, Object.keys(document.profiles));
74
+ const nextValues = { ...this.#defaults, ...values };
75
+ await this.#validate?.(nextValues);
76
+ document.profiles[name] = nextValues;
77
+ await this.#save(document);
78
+ return { name, values: structuredClone(nextValues) };
79
+ });
80
+ }
81
+ async set(name, values) {
82
+ assertProfileName(name);
83
+ return this.#mutate(async () => {
84
+ const document = await this.#load();
85
+ if (!Object.hasOwn(document.profiles, name)) {
86
+ throw new Error(`Profile '${name}' does not exist. Create it with 'profile create ${name}'.`);
87
+ }
88
+ const nextValues = {
89
+ ...this.#defaults,
90
+ ...document.profiles[name],
91
+ ...values,
92
+ };
93
+ await this.#validate?.(nextValues);
94
+ document.profiles[name] = nextValues;
95
+ await this.#save(document);
96
+ return { name, values: structuredClone(nextValues) };
97
+ });
98
+ }
99
+ async setDefault(name) {
100
+ assertProfileName(name);
101
+ return this.#mutate(async () => {
102
+ const document = await this.#load();
103
+ const values = document.profiles[name];
104
+ if (!Object.hasOwn(document.profiles, name) || !values) {
105
+ throw new Error(`Profile '${name}' does not exist. Create it with 'profile create ${name}'.`);
106
+ }
107
+ document.active = name;
108
+ await this.#save(document);
109
+ return { name, values: structuredClone(values) };
110
+ });
111
+ }
112
+ async delete(name) {
113
+ assertProfileName(name);
114
+ return this.#mutate(async () => {
115
+ const document = await this.#load();
116
+ if (!Object.hasOwn(document.profiles, name)) {
117
+ throw new Error(`Profile '${name}' does not exist.`);
118
+ }
119
+ if (Object.keys(document.profiles).length === 1) {
120
+ throw new Error("Cannot delete the only profile. At least one default profile must exist.");
121
+ }
122
+ if (document.active === name) {
123
+ throw new Error(`Cannot delete default profile '${name}'. Set another default with 'profile set-default <name>' first.`);
124
+ }
125
+ delete document.profiles[name];
126
+ if (document.permissions) {
127
+ delete document.permissions[name];
128
+ if (Object.keys(document.permissions).length === 0) {
129
+ delete document.permissions;
130
+ }
131
+ }
132
+ await this.#save(document);
133
+ return { deleted: name, default: document.active };
134
+ });
135
+ }
136
+ async getPermissions(name) {
137
+ const document = await this.#load();
138
+ const selectedName = name ?? document.active;
139
+ if (!Object.hasOwn(document.profiles, selectedName)) {
140
+ throw new Error(`Profile '${selectedName}' does not exist.`);
141
+ }
142
+ const permissions = document.permissions && Object.hasOwn(document.permissions, selectedName)
143
+ ? document.permissions[selectedName]
144
+ : undefined;
145
+ return permissions === undefined ? undefined : [...permissions];
146
+ }
147
+ async setPermissions(name, permissions) {
148
+ assertProfileName(name);
149
+ return this.#mutate(async () => {
150
+ const document = await this.#load();
151
+ if (!Object.hasOwn(document.profiles, name)) {
152
+ throw new Error(`Profile '${name}' does not exist.`);
153
+ }
154
+ const uniquePermissions = [...new Set(permissions)];
155
+ document.permissions ??= {};
156
+ document.permissions[name] = uniquePermissions;
157
+ await this.#save(document);
158
+ return [...uniquePermissions];
159
+ });
160
+ }
161
+ #mutate(work) {
162
+ const previous = _a.#writes.get(this.#filePath) ?? Promise.resolve();
163
+ const result = previous.then(work);
164
+ const tail = result.then(() => undefined, () => undefined);
165
+ _a.#writes.set(this.#filePath, tail);
166
+ void tail.then(() => {
167
+ if (_a.#writes.get(this.#filePath) === tail)
168
+ _a.#writes.delete(this.#filePath);
169
+ });
170
+ return result;
171
+ }
172
+ async #load() {
173
+ try {
174
+ const contents = await readFile(this.#filePath, "utf8");
175
+ const document = JSON.parse(contents);
176
+ if (document.version !== 1 ||
177
+ typeof document.active !== "string" ||
178
+ !document.profiles ||
179
+ typeof document.profiles !== "object" ||
180
+ Array.isArray(document.profiles) ||
181
+ Object.keys(document.profiles).length === 0 ||
182
+ !Object.hasOwn(document.profiles, document.active) ||
183
+ Object.values(document.profiles).some((values) => values === null ||
184
+ typeof values !== "object" ||
185
+ Array.isArray(values)) ||
186
+ (document.permissions !== undefined &&
187
+ (document.permissions === null ||
188
+ typeof document.permissions !== "object" ||
189
+ Object.values(document.permissions).some((permissions) => !Array.isArray(permissions) ||
190
+ permissions.some((permission) => typeof permission !== "string"))))) {
191
+ throw new Error(`Unsupported profile document at '${this.#filePath}'.`);
192
+ }
193
+ const names = Object.keys(document.profiles);
194
+ names.forEach(assertProfileName);
195
+ if (new Set(names.map((name) => name.toLowerCase())).size !== names.length) {
196
+ throw new Error("Profile document contains names that differ only by letter case. " +
197
+ "Back up profiles.json and profile-owned data, then resolve the conflicting names manually and reconfigure renamed profiles. No data was changed.");
198
+ }
199
+ return document;
200
+ }
201
+ catch (error) {
202
+ if (error.code !== "ENOENT") {
203
+ throw error;
204
+ }
205
+ return {
206
+ version: 1,
207
+ active: this.#defaultName,
208
+ profiles: { [this.#defaultName]: structuredClone(this.#defaults) },
209
+ };
210
+ }
211
+ }
212
+ async #save(document) {
213
+ await mkdir(dirname(this.#filePath), { recursive: true });
214
+ const temporaryPath = `${this.#filePath}.${process.pid}.tmp`;
215
+ await writeFile(temporaryPath, `${JSON.stringify(document, null, 2)}\n`, {
216
+ encoding: "utf8",
217
+ mode: 0o600,
218
+ });
219
+ await rename(temporaryPath, this.#filePath);
220
+ }
221
+ }
222
+ _a = ProfileStore;
223
+ //# sourceMappingURL=profile-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-store.js","sourceRoot":"","sources":["../../src/profile-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /** Proof entry points accept only this selector, never commands, URLs or credentials. */
2
+ export declare function parseProofProfile(argv: readonly string[], environment?: NodeJS.ProcessEnv): string;
3
+ export interface ProofInvocation {
4
+ argv: readonly string[];
5
+ stdin?: string;
6
+ }
7
+ export type ProofInvoker = (invocation: ProofInvocation) => Promise<string>;
8
+ export interface ProofInvokerOptions {
9
+ executable: URL;
10
+ environment?: NodeJS.ProcessEnv;
11
+ credentialEnvironment?: readonly string[];
12
+ timeoutMs?: number;
13
+ /** Separate byte limit for stdout and stderr, measured before UTF-8 decoding. */
14
+ maxOutputBytes?: number;
15
+ }
16
+ /** Invoke a fixed, integration-owned inventory; this is not a user-argv passthrough. */
17
+ export declare function createProofInvoker(options: ProofInvokerOptions): ProofInvoker;
18
+ //# sourceMappingURL=proof.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proof.d.ts","sourceRoot":"","sources":["../../src/proof.ts"],"names":[],"mappings":"AAcA,yFAAyF;AACzF,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,WAAW,GAAE,MAAM,CAAC,UAAwB,GAC3C,MAAM,CAUR;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,eAAe,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,GAAG,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CA8D7E"}
@@ -0,0 +1,98 @@
1
+ import { spawn } from "node:child_process";
2
+ import { fileURLToPath } from "node:url";
3
+ import { assertProfileName } from "./profile-store.js";
4
+ const ciNames = new Set([
5
+ "CI", "GITHUB_ACTIONS", "TF_BUILD", "BUILD_BUILDID", "TEAMCITY_VERSION", "JENKINS_URL", "BUILDKITE",
6
+ ]);
7
+ function assertLocal(environment) {
8
+ if (Object.entries(environment).some(([name, value]) => value && ciNames.has(name.toUpperCase()))) {
9
+ throw new Error("Profile proof is local-only and refuses CI environments.");
10
+ }
11
+ }
12
+ /** Proof entry points accept only this selector, never commands, URLs or credentials. */
13
+ export function parseProofProfile(argv, environment = process.env) {
14
+ assertLocal(environment);
15
+ const profile = argv[1];
16
+ try {
17
+ if (argv.length !== 2 || argv[0] !== "--profile" || !profile)
18
+ throw new Error();
19
+ assertProfileName(profile);
20
+ }
21
+ catch {
22
+ throw new Error("Usage: test:integration -- --profile <name>");
23
+ }
24
+ return profile;
25
+ }
26
+ /** Invoke a fixed, integration-owned inventory; this is not a user-argv passthrough. */
27
+ export function createProofInvoker(options) {
28
+ const environment = options.environment ?? process.env;
29
+ assertLocal(environment);
30
+ const timeoutMs = options.timeoutMs ?? 30_000;
31
+ const maxOutputBytes = options.maxOutputBytes ?? 65_536;
32
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > 2_147_483_647 ||
33
+ !Number.isSafeInteger(maxOutputBytes) || maxOutputBytes <= 0) {
34
+ throw new Error("Proof process limits must be positive finite integers within supported bounds.");
35
+ }
36
+ let executable;
37
+ try {
38
+ executable = fileURLToPath(options.executable);
39
+ }
40
+ catch {
41
+ throw new Error("Proof executable must be a local file URL.");
42
+ }
43
+ const omitted = new Set(options.credentialEnvironment?.map(name => name.toUpperCase()));
44
+ return async ({ argv, stdin }) => {
45
+ assertLocal(environment);
46
+ const env = Object.fromEntries(Object.entries(environment).filter(([name]) => !omitted.has(name.toUpperCase())));
47
+ return new Promise((resolve, reject) => {
48
+ let child;
49
+ try {
50
+ child = spawn(process.execPath, [executable, ...argv], {
51
+ stdio: ["pipe", "pipe", "pipe"], windowsHide: true, env,
52
+ });
53
+ }
54
+ catch {
55
+ reject(new Error("Proof CLI process could not start."));
56
+ return;
57
+ }
58
+ const stdout = [];
59
+ let stdoutBytes = 0, stderrBytes = 0;
60
+ let failure;
61
+ const fail = (message) => {
62
+ failure ??= new Error(message);
63
+ child.kill("SIGKILL");
64
+ child.stdin.destroy();
65
+ child.stdout.destroy();
66
+ child.stderr.destroy();
67
+ };
68
+ const timer = setTimeout(() => fail("Proof CLI process timed out."), timeoutMs);
69
+ child.once("error", () => fail("Proof CLI process could not start."));
70
+ child.stdin.once("error", () => fail("Proof CLI input failed."));
71
+ child.stdout.once("error", () => fail("Proof CLI output failed."));
72
+ child.stderr.once("error", () => fail("Proof CLI output failed."));
73
+ child.stdout.on("data", (chunk) => {
74
+ stdoutBytes += chunk.length;
75
+ if (stdoutBytes > maxOutputBytes)
76
+ fail("Proof CLI stdout exceeded its byte limit.");
77
+ else
78
+ stdout.push(chunk);
79
+ });
80
+ child.stderr.on("data", (chunk) => {
81
+ stderrBytes += chunk.length;
82
+ if (stderrBytes > maxOutputBytes)
83
+ fail("Proof CLI stderr exceeded its byte limit.");
84
+ });
85
+ child.once("close", code => {
86
+ clearTimeout(timer);
87
+ if (failure)
88
+ reject(failure);
89
+ else if (code !== 0)
90
+ reject(new Error("Proof CLI process exited unsuccessfully."));
91
+ else
92
+ resolve(Buffer.concat(stdout).toString("utf8"));
93
+ });
94
+ child.stdin.end(stdin);
95
+ });
96
+ };
97
+ }
98
+ //# sourceMappingURL=proof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proof.js","sourceRoot":"","sources":["../../src/proof.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC;IACtB,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,WAAW;CACpG,CAAC,CAAC;AAEH,SAAS,WAAW,CAAC,WAA8B;IACjD,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;QAClG,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,iBAAiB,CAC/B,IAAuB,EACvB,WAAW,GAAsB,OAAO,CAAC,GAAG;IAE5C,WAAW,CAAC,WAAW,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,EAAE,CAAC;QAChF,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAkBD,wFAAwF;AACxF,MAAM,UAAU,kBAAkB,CAAC,OAA4B;IAC7D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC;IACvD,WAAW,CAAC,WAAW,CAAC,CAAC;IACzB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAC9C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,MAAM,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,GAAG,aAAa;QAC/E,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACxF,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QAC/B,WAAW,CAAC,WAAW,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;QACjH,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC7C,IAAI,KAA+B,CAAC;YACpC,IAAI,CAAC;gBACH,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,EAAE;oBACrD,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG;iBACxD,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;gBACxD,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC;YACrC,IAAI,OAA0B,CAAC;YAC/B,MAAM,IAAI,GAAG,CAAC,OAAe,EAAQ,EAAE;gBACrC,OAAO,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,KAAK,CAAC,KAAM,CAAC,OAAO,EAAE,CAAC;gBACvB,KAAK,CAAC,MAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,KAAK,CAAC,MAAO,CAAC,OAAO,EAAE,CAAC;YAC1B,CAAC,CAAC;YACF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,8BAA8B,CAAC,EAAE,SAAS,CAAC,CAAC;YAChF,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;YACtE,KAAK,CAAC,KAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;YAClE,KAAK,CAAC,MAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACpE,KAAK,CAAC,MAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACpE,KAAK,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACzC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;gBAC5B,IAAI,WAAW,GAAG,cAAc;oBAAE,IAAI,CAAC,2CAA2C,CAAC,CAAC;;oBAC/E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACzC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;gBAC5B,IAAI,WAAW,GAAG,cAAc;oBAAE,IAAI,CAAC,2CAA2C,CAAC,CAAC;YACtF,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;gBACzB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,OAAO;oBAAE,MAAM,CAAC,OAAO,CAAC,CAAC;qBACxB,IAAI,IAAI,KAAK,CAAC;oBAAE,MAAM,CAAC,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;;oBAC9E,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,KAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { CliResource } from "./types.js";
2
+ /** Runtime composition helper; resources are concrete instances, never a dependency container. */
3
+ export declare function visitResources(resources: readonly CliResource[], visit: (resource: CliResource) => void | Promise<void>): Promise<void>;
4
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/resources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,kGAAkG;AAClG,wBAAsB,cAAc,CAClC,SAAS,EAAE,SAAS,WAAW,EAAE,EACjC,KAAK,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACrD,OAAO,CAAC,IAAI,CAAC,CAYf"}
@@ -0,0 +1,17 @@
1
+ /** Runtime composition helper; resources are concrete instances, never a dependency container. */
2
+ export async function visitResources(resources, visit) {
3
+ const errors = [];
4
+ for (const resource of [...new Set(resources)].reverse()) {
5
+ try {
6
+ await visit(resource);
7
+ }
8
+ catch (error) {
9
+ errors.push(error);
10
+ }
11
+ }
12
+ if (errors.length === 1)
13
+ throw errors[0];
14
+ if (errors.length)
15
+ throw new AggregateError(errors, "Application resource cleanup failed.");
16
+ }
17
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/resources.ts"],"names":[],"mappings":"AAEA,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAiC,EACjC,KAAsD;IAEtD,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,MAAM;QACf,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,sCAAsC,CAAC,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,12 @@
1
+ interface ConsumeOptions {
2
+ maxBytes: number;
3
+ signal?: AbortSignal | undefined;
4
+ }
5
+ declare function consumeResponseBody(response: Response, options: ConsumeOptions, consume: (chunk: Uint8Array) => void | Promise<void>): Promise<number>;
6
+ /**
7
+ * Consume one response as bounded bytes. HTTP status, decoding and JSON/media policy stay local.
8
+ * Cancellation is observed but never awaited: a tee's other branch may still be unread.
9
+ */
10
+ export declare function readBoundedResponseBody(response: Response, options: ConsumeOptions): Promise<Uint8Array>;
11
+ export { consumeResponseBody };
12
+ //# sourceMappingURL=response-body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-body.d.ts","sourceRoot":"","sources":["../../src/response-body.ts"],"names":[],"mappings":"AAAA,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC;AAED,iBAAe,mBAAmB,CAChC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACnD,OAAO,CAAC,MAAM,CAAC,CAqCjB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC,CAkBrB;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,70 @@
1
+ async function consumeResponseBody(response, options, consume) {
2
+ const { maxBytes, signal } = options;
3
+ let reader;
4
+ const cancel = () => { void reader?.cancel().catch(() => undefined); };
5
+ try {
6
+ reader = response.body?.getReader();
7
+ signal?.addEventListener("abort", cancel, { once: true });
8
+ if (signal?.aborted || !Number.isSafeInteger(maxBytes) || maxBytes < 1)
9
+ throw new Error();
10
+ const header = response.headers.get("content-length");
11
+ const declared = header === null ? undefined : Number(header);
12
+ const encoding = response.headers.get("content-encoding")?.trim().toLowerCase();
13
+ const identity = !encoding || encoding === "identity";
14
+ if (header !== null && (!/^\d+$/.test(header) || !Number.isSafeInteger(declared) ||
15
+ (identity && declared > maxBytes))) {
16
+ throw new Error();
17
+ }
18
+ let bytes = 0;
19
+ while (reader) {
20
+ if (signal?.aborted)
21
+ throw new Error();
22
+ const chunk = await reader.read();
23
+ if (signal?.aborted)
24
+ throw new Error();
25
+ if (chunk.done)
26
+ break;
27
+ if (!chunk.value.byteLength)
28
+ continue;
29
+ const next = bytes + chunk.value.byteLength;
30
+ if (next > maxBytes)
31
+ throw new Error();
32
+ await consume(chunk.value);
33
+ bytes = next;
34
+ }
35
+ if (declared !== undefined && identity && bytes !== declared)
36
+ throw new Error();
37
+ return bytes;
38
+ }
39
+ catch {
40
+ throw new Error("Response body failed, exceeded its byte bound, or was cancelled.");
41
+ }
42
+ finally {
43
+ signal?.removeEventListener("abort", cancel);
44
+ cancel();
45
+ reader?.releaseLock();
46
+ }
47
+ }
48
+ /**
49
+ * Consume one response as bounded bytes. HTTP status, decoding and JSON/media policy stay local.
50
+ * Cancellation is observed but never awaited: a tee's other branch may still be unread.
51
+ */
52
+ export async function readBoundedResponseBody(response, options) {
53
+ const { maxBytes } = options;
54
+ let buffer = new Uint8Array(0);
55
+ let written = 0;
56
+ const bytes = await consumeResponseBody(response, options, (chunk) => {
57
+ const next = written + chunk.byteLength;
58
+ if (next > buffer.length) {
59
+ const grown = new Uint8Array(Math.min(maxBytes, Math.max(next, buffer.length * 2, 16384)));
60
+ grown.set(buffer.subarray(0, written));
61
+ buffer = grown;
62
+ }
63
+ // Own every chunk immediately: a producer may reuse its buffer on the next read.
64
+ buffer.set(chunk, written);
65
+ written = next;
66
+ });
67
+ return buffer.subarray(0, bytes);
68
+ }
69
+ export { consumeResponseBody };
70
+ //# sourceMappingURL=response-body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-body.js","sourceRoot":"","sources":["../../src/response-body.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ScopedSecrets, SecretStore } from "./types.js";
2
+ export declare class KeyringSecretStore implements SecretStore {
3
+ get(service: string, account: string): Promise<string | undefined>;
4
+ set(service: string, account: string, value: string): Promise<void>;
5
+ delete(service: string, account: string): Promise<void>;
6
+ }
7
+ export declare class MemorySecretStore implements SecretStore {
8
+ #private;
9
+ get(service: string, account: string): Promise<string | undefined>;
10
+ set(service: string, account: string, value: string): Promise<void>;
11
+ delete(service: string, account: string): Promise<void>;
12
+ }
13
+ export declare class ProfileSecrets implements ScopedSecrets {
14
+ #private;
15
+ constructor(store: SecretStore, applicationId: string, profileName: string);
16
+ get(name: string): Promise<string | undefined>;
17
+ require(name: string): Promise<string>;
18
+ set(name: string, value: string): Promise<void>;
19
+ delete(name: string): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=secret-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-store.d.ts","sourceRoot":"","sources":["../../src/secret-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE7D,qBAAa,kBAAmB,YAAW,WAAW;IACvC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAM9E;IAEY,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM/E;IAEY,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASnE;CACF;AAUD,qBAAa,iBAAkB,YAAW,WAAW;;IAGtC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE9E;IAEY,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/E;IAEY,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;CACF;AAED,qBAAa,cAAe,YAAW,aAAa;;IAKlD,YAAmB,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAIhF;IAEM,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAEpD;IAEY,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlD;IAEM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErD;IAEM,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzC;CACF"}
@@ -0,0 +1,73 @@
1
+ import { Entry } from "@napi-rs/keyring";
2
+ export class KeyringSecretStore {
3
+ async get(service, account) {
4
+ try {
5
+ return new Entry(service, account).getPassword() ?? undefined;
6
+ }
7
+ catch (error) {
8
+ throw keyringError("read", error);
9
+ }
10
+ }
11
+ async set(service, account, value) {
12
+ try {
13
+ new Entry(service, account).setPassword(value);
14
+ }
15
+ catch (error) {
16
+ throw keyringError("write", error);
17
+ }
18
+ }
19
+ async delete(service, account) {
20
+ const entry = new Entry(service, account);
21
+ try {
22
+ if (entry.getPassword() !== null) {
23
+ entry.deletePassword();
24
+ }
25
+ }
26
+ catch (error) {
27
+ throw keyringError("delete", error);
28
+ }
29
+ }
30
+ }
31
+ function keyringError(operation, error) {
32
+ const message = error instanceof Error ? error.message : String(error);
33
+ return new Error(`Could not ${operation} the OS credential store: ${message}. No plaintext fallback is used.`, { cause: error });
34
+ }
35
+ export class MemorySecretStore {
36
+ #values = new Map();
37
+ async get(service, account) {
38
+ return this.#values.get(`${service}\0${account}`);
39
+ }
40
+ async set(service, account, value) {
41
+ this.#values.set(`${service}\0${account}`, value);
42
+ }
43
+ async delete(service, account) {
44
+ this.#values.delete(`${service}\0${account}`);
45
+ }
46
+ }
47
+ export class ProfileSecrets {
48
+ #store;
49
+ #service;
50
+ #profileName;
51
+ constructor(store, applicationId, profileName) {
52
+ this.#store = store;
53
+ this.#service = `ai-cli-factory:${applicationId}`;
54
+ this.#profileName = profileName;
55
+ }
56
+ get(name) {
57
+ return this.#store.get(this.#service, `${this.#profileName}:${name}`);
58
+ }
59
+ async require(name) {
60
+ const value = await this.get(name);
61
+ if (!value) {
62
+ throw new Error(`No credential is stored for profile '${this.#profileName}'. Run 'auth login' first.`);
63
+ }
64
+ return value;
65
+ }
66
+ set(name, value) {
67
+ return this.#store.set(this.#service, `${this.#profileName}:${name}`, value);
68
+ }
69
+ delete(name) {
70
+ return this.#store.delete(this.#service, `${this.#profileName}:${name}`);
71
+ }
72
+ }
73
+ //# sourceMappingURL=secret-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-store.js","sourceRoot":"","sources":["../../src/secret-store.ts"],"names":[],"mappings":"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"}