@cat-factory/server 0.263.1 → 0.265.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/dist/agents/binaryGenerators.d.ts +10 -10
- package/dist/agents/binaryGenerators.d.ts.map +1 -1
- package/dist/agents/binaryGenerators.js +157 -59
- package/dist/agents/binaryGenerators.js.map +1 -1
- package/dist/modules/capabilityCredentials/declaredCredentials.d.ts.map +1 -1
- package/dist/modules/capabilityCredentials/declaredCredentials.js +13 -11
- package/dist/modules/capabilityCredentials/declaredCredentials.js.map +1 -1
- package/dist/modules/publicApi/openapiDocument.generated.d.ts +1 -1
- package/dist/modules/publicApi/openapiDocument.generated.d.ts.map +1 -1
- package/dist/modules/publicApi/openapiDocument.generated.js +1 -1
- package/dist/modules/publicApi/openapiDocument.generated.js.map +1 -1
- package/dist/persistence/binaryGenerators.js +1 -0
- package/dist/persistence/binaryGenerators.js.map +1 -1
- package/package.json +8 -8
|
@@ -2,9 +2,10 @@ import type { AgentRunContext, Logger, ToolSecretResolver } from '@cat-factory/k
|
|
|
2
2
|
/**
|
|
3
3
|
* One `{ key, value }` env pair the harness injects into THIS JOB's agent process.
|
|
4
4
|
*
|
|
5
|
-
* `key` is the INJECTION name (`
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* `key` is the INJECTION name (`binaryCredentialInjectionName`), not necessarily what the resolver
|
|
6
|
+
* was asked for. It has to be, because this is the variable the agent reads, and it is the same
|
|
7
|
+
* name the brief tells it to read: both sides call that one helper so they cannot name different
|
|
8
|
+
* variables.
|
|
8
9
|
*/
|
|
9
10
|
export interface GeneratorSecretJobSpec {
|
|
10
11
|
key: string;
|
|
@@ -27,14 +28,13 @@ export interface ResolveBinaryGeneratorSecretsInput {
|
|
|
27
28
|
* a run that produces nothing and explains nothing, when a run that generates what it can and
|
|
28
29
|
* NAMES the gap is strictly more useful.
|
|
29
30
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* the
|
|
31
|
+
* Every lookup an integration needs travels in ONE resolver call, which is the port's stated
|
|
32
|
+
* contract (once per dispatch per subject) and not merely a saving: the per-workspace sealed-store
|
|
33
|
+
* implementation re-reads and decrypts the whole workspace bag per call, so a key pair asked for
|
|
34
|
+
* one name at a time pays that twice under an identical subject.
|
|
33
35
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* round trip, and a step holding three integrations should not pay for three of them in series.
|
|
37
|
-
* Order is preserved by resolving a pre-built list rather than pushing as results arrive.
|
|
36
|
+
* Integrations are resolved CONCURRENTLY, since their subjects are genuinely different. Order is
|
|
37
|
+
* preserved by resolving a pre-built plan rather than pushing as results arrive.
|
|
38
38
|
*/
|
|
39
39
|
export declare function resolveBinaryGeneratorSecrets(input: ResolveBinaryGeneratorSecretsInput): Promise<GeneratorSecretJobSpec[]>;
|
|
40
40
|
//# sourceMappingURL=binaryGenerators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binaryGenerators.d.ts","sourceRoot":"","sources":["../../src/agents/binaryGenerators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,MAAM,
|
|
1
|
+
{"version":3,"file":"binaryGenerators.d.ts","sourceRoot":"","sources":["../../src/agents/binaryGenerators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,MAAM,EAGN,kBAAkB,EACnB,MAAM,qBAAqB,CAAA;AAgC5B;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,kCAAkC;IACjD,OAAO,EAAE,eAAe,CAAA;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gGAAgG;IAChG,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,kCAAkC,GACxC,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAOnC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { noopLogger, runBestEffort } from '@cat-factory/kernel';
|
|
2
|
-
import { isReservedPlatformEnvKey, isToolchainEnvName, reservedEnvKeyMessage, toolchainEnvNameMessage, } from '@cat-factory/contracts';
|
|
2
|
+
import { binaryCredentialInjectionName, comparableCredentialInjectionName, isReservedPlatformEnvKey, isToolchainEnvName, reservedEnvKeyMessage, toolchainEnvNameMessage, } from '@cat-factory/contracts';
|
|
3
3
|
/**
|
|
4
4
|
* Resolve the credentials of this dispatch's generative integrations into job-body env pairs.
|
|
5
5
|
*
|
|
@@ -9,93 +9,191 @@ import { isReservedPlatformEnvKey, isToolchainEnvName, reservedEnvKeyMessage, to
|
|
|
9
9
|
* a run that produces nothing and explains nothing, when a run that generates what it can and
|
|
10
10
|
* NAMES the gap is strictly more useful.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* the
|
|
12
|
+
* Every lookup an integration needs travels in ONE resolver call, which is the port's stated
|
|
13
|
+
* contract (once per dispatch per subject) and not merely a saving: the per-workspace sealed-store
|
|
14
|
+
* implementation re-reads and decrypts the whole workspace bag per call, so a key pair asked for
|
|
15
|
+
* one name at a time pays that twice under an identical subject.
|
|
15
16
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* round trip, and a step holding three integrations should not pay for three of them in series.
|
|
19
|
-
* Order is preserved by resolving a pre-built list rather than pushing as results arrive.
|
|
17
|
+
* Integrations are resolved CONCURRENTLY, since their subjects are genuinely different. Order is
|
|
18
|
+
* preserved by resolving a pre-built plan rather than pushing as results arrive.
|
|
20
19
|
*/
|
|
21
20
|
export async function resolveBinaryGeneratorSecrets(input) {
|
|
22
21
|
const generators = input.context.binaryGenerators ?? [];
|
|
23
22
|
const resolver = input.resolveToolSecrets;
|
|
24
23
|
if (!resolver || generators.length === 0)
|
|
25
24
|
return [];
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
25
|
+
const plans = planLookups(input, generators);
|
|
26
|
+
const resolved = await Promise.all(plans.map((plan) => resolveGenerator(input, resolver, plan)));
|
|
27
|
+
return resolved.flat();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Decide, before any I/O, exactly which lookup each integration gets to make.
|
|
31
|
+
*
|
|
32
|
+
* Planning is separate from resolving because two of the three rules below are about the dispatch
|
|
33
|
+
* AS A WHOLE rather than about one credential, and a rule of that shape cannot be applied by a
|
|
34
|
+
* function that sees one credential at a time.
|
|
35
|
+
*/
|
|
36
|
+
function planLookups(input, generators) {
|
|
37
|
+
const admissible = generators.map((generator) => ({
|
|
38
|
+
generator,
|
|
39
|
+
credentials: generator.credentials
|
|
40
|
+
.filter((credential) => passesEnvNameFloors(input, generator, credential))
|
|
41
|
+
.map((credential) => ({
|
|
42
|
+
credential,
|
|
43
|
+
key: credential.key,
|
|
44
|
+
envName: binaryCredentialInjectionName(credential),
|
|
45
|
+
comparableName: comparableCredentialInjectionName(credential),
|
|
46
|
+
})),
|
|
45
47
|
}));
|
|
46
|
-
|
|
48
|
+
const contested = contestedInjectionNames(input, admissible);
|
|
49
|
+
const claimed = new Set();
|
|
50
|
+
return admissible.map(({ generator, credentials }) => ({
|
|
51
|
+
generator,
|
|
52
|
+
credentials: credentials.filter((planned) => {
|
|
53
|
+
// Contest is judged on the CASE-FOLDED name, because two spellings of one variable collide
|
|
54
|
+
// wherever the environment is case-insensitive. The dedupe below is judged on the exact
|
|
55
|
+
// name, because that is the string the brief tells the agent to read: dropping `acme_key`
|
|
56
|
+
// as a duplicate of `ACME_KEY` would leave a variable named in the brief and set nowhere on
|
|
57
|
+
// every platform that keeps them apart.
|
|
58
|
+
if (contested.has(planned.comparableName))
|
|
59
|
+
return false;
|
|
60
|
+
// A name already claimed by an earlier integration is the SHARED-ACCOUNT case and nothing
|
|
61
|
+
// else, because a contested name was dropped above: the claimant looks the same value up
|
|
62
|
+
// under the same key, so the variable this integration reads is already being set to
|
|
63
|
+
// exactly what it wanted. Asking a second time would only duplicate the round trip.
|
|
64
|
+
if (claimed.has(planned.envName))
|
|
65
|
+
return false;
|
|
66
|
+
claimed.add(planned.envName);
|
|
67
|
+
return true;
|
|
68
|
+
}),
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The injection names two integrations want to mean DIFFERENT values, withheld from both.
|
|
73
|
+
*
|
|
74
|
+
* One vendor behind an image and a music endpoint legitimately shares a variable, and that case is
|
|
75
|
+
* indistinguishable from a collision by the NAME alone: what separates them is whether the lookup
|
|
76
|
+
* key behind the name is the same value. Where it is not, no arbitration can be right. Serving the
|
|
77
|
+
* first claimant sets the variable the SECOND integration's brief tells the agent to read, so the
|
|
78
|
+
* agent authenticates one vendor with another's key, and every layer that could report it sees a
|
|
79
|
+
* variable that is present and a call that failed. A pair loses a half the same way, with the
|
|
80
|
+
* brief still telling the agent the two names belong together.
|
|
81
|
+
*
|
|
82
|
+
* So the value is withheld from everyone, which is the one disposition the brief already describes
|
|
83
|
+
* truthfully: an unset variable means the platform could not provide the credential, and both
|
|
84
|
+
* integrations are reported unavailable rather than one being quietly wrong. Registration refuses
|
|
85
|
+
* this across a deployment's definitions (`binary_generator_injection_name_collision`); reaching
|
|
86
|
+
* here means a MOTHERSHIP node was served definitions it never boot-validated.
|
|
87
|
+
*/
|
|
88
|
+
function contestedInjectionNames(input, admissible) {
|
|
89
|
+
// Keyed by the case-folded name and reported under the spelling that reached the dispatch: two
|
|
90
|
+
// integrations declaring `ACME_KEY` and `acme_key` for different keys are one variable on a
|
|
91
|
+
// case-insensitive environment, which is where the wrong value would be read.
|
|
92
|
+
const byName = new Map();
|
|
93
|
+
for (const { generator, credentials } of admissible) {
|
|
94
|
+
for (const planned of credentials) {
|
|
95
|
+
const entry = byName.get(planned.comparableName) ?? {
|
|
96
|
+
spelling: planned.envName,
|
|
97
|
+
keys: new Set(),
|
|
98
|
+
generatorIds: [],
|
|
99
|
+
};
|
|
100
|
+
entry.keys.add(planned.key);
|
|
101
|
+
if (!entry.generatorIds.includes(generator.id))
|
|
102
|
+
entry.generatorIds.push(generator.id);
|
|
103
|
+
byName.set(planned.comparableName, entry);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const contested = new Set();
|
|
107
|
+
for (const [comparableName, entry] of byName) {
|
|
108
|
+
if (entry.keys.size < 2)
|
|
109
|
+
continue;
|
|
110
|
+
contested.add(comparableName);
|
|
111
|
+
input.logger?.warn('binary-generators disagree about what one injected variable holds; withholding it from all of them', {
|
|
112
|
+
credentialEnvName: entry.spelling,
|
|
113
|
+
binaryGeneratorIds: entry.generatorIds,
|
|
114
|
+
credentialKeys: [...entry.keys],
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return contested;
|
|
47
118
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
119
|
+
/**
|
|
120
|
+
* The two name floors, applied per credential.
|
|
121
|
+
*
|
|
122
|
+
* Both are re-applied HERE rather than trusted from registration so they hold whatever a facade
|
|
123
|
+
* wired, and because a MOTHERSHIP-MODE node boot-validates none of the definitions it resolves:
|
|
124
|
+
* they arrive per dispatch over `/internal/binary-generators`, chosen by a process that is not
|
|
125
|
+
* this one, and the environment they would be read from is a developer's own laptop.
|
|
126
|
+
*/
|
|
127
|
+
function passesEnvNameFloors(input, generator, credential) {
|
|
128
|
+
// The platform's own configuration variables are never resolvable as an integration credential.
|
|
56
129
|
// Only the LOOKUP key is held to it. The injection name reads nothing, so it gets the toolchain
|
|
57
130
|
// rule below instead, which is what lets an integration keep a vendor's documented variable name
|
|
58
131
|
// even when a platform prefix family covers it.
|
|
59
|
-
if (isReservedPlatformEnvKey(key)) {
|
|
132
|
+
if (isReservedPlatformEnvKey(credential.key)) {
|
|
60
133
|
// Reported at WARN, not at the `debug` an optional missing key gets: this is never a
|
|
61
134
|
// deployment's stated normal, and its fix is a declaration rather than a variable to set.
|
|
62
|
-
input.logger?.warn('binary-generator declares a reserved credential key; the agent is told the integration is unavailable', {
|
|
63
|
-
|
|
135
|
+
input.logger?.warn('binary-generator declares a reserved credential key; the agent is told the integration is unavailable', {
|
|
136
|
+
binaryGeneratorId: generator.id,
|
|
137
|
+
credentialKey: credential.key,
|
|
138
|
+
detail: reservedEnvKeyMessage(credential.key),
|
|
139
|
+
});
|
|
140
|
+
return false;
|
|
64
141
|
}
|
|
65
142
|
// A value injected under a toolchain name reconfigures the agent's process instead of
|
|
66
143
|
// authenticating a call. Registration refuses one; this is the mothership case again.
|
|
144
|
+
const envName = binaryCredentialInjectionName(credential);
|
|
67
145
|
if (isToolchainEnvName(envName)) {
|
|
68
146
|
input.logger?.warn('binary-generator declares a toolchain injection name; the agent is told the integration is unavailable', {
|
|
69
147
|
binaryGeneratorId: generator.id,
|
|
70
148
|
credentialEnvName: envName,
|
|
71
149
|
detail: toolchainEnvNameMessage(envName),
|
|
72
150
|
});
|
|
73
|
-
return
|
|
151
|
+
return false;
|
|
74
152
|
}
|
|
75
|
-
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
/** Resolve one integration's whole credential set in a single call, in declaration order. */
|
|
156
|
+
async function resolveGenerator(input, resolver, plan) {
|
|
157
|
+
if (plan.credentials.length === 0)
|
|
158
|
+
return [];
|
|
159
|
+
// Distinct LOOKUP keys, because one stored value delivered under two injection names is an
|
|
160
|
+
// allowed declaration and asking for the same key twice in one call is not.
|
|
161
|
+
const keys = [...new Set(plan.credentials.map((planned) => planned.key))].map((key) => ({ key }));
|
|
162
|
+
const resolved = await runBestEffort(input.logger ?? noopLogger, 'resolve binary-generator credentials', () => resolver.resolve({
|
|
76
163
|
workspaceId: input.workspaceId,
|
|
77
164
|
...(input.blockId ? { blockId: input.blockId } : {}),
|
|
78
|
-
subject: { kind: 'binary-generator', id: generator.id },
|
|
79
|
-
// The
|
|
80
|
-
//
|
|
165
|
+
subject: { kind: 'binary-generator', id: plan.generator.id },
|
|
166
|
+
// The credentials are declared with no `header`, so the default env-var channel applies.
|
|
167
|
+
// An integration is called by the AGENT's own code, not by a client we configure, so a
|
|
81
168
|
// header template would be a shape nothing here could act on. `required` rides the
|
|
82
169
|
// declaration for the BRIEF's benefit, not this resolver's: the disposition for a missing
|
|
83
170
|
// key is stated to the agent, never enforced by dropping something silently here.
|
|
84
|
-
keys
|
|
85
|
-
}), { binaryGeneratorId: generator.id });
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
171
|
+
keys,
|
|
172
|
+
}), { binaryGeneratorId: plan.generator.id });
|
|
173
|
+
const pairs = [];
|
|
174
|
+
for (const planned of plan.credentials) {
|
|
175
|
+
const value = resolved?.[planned.key];
|
|
176
|
+
if (value) {
|
|
177
|
+
pairs.push({ key: planned.envName, value });
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
reportUnresolved(input, plan.generator, planned);
|
|
181
|
+
}
|
|
182
|
+
return pairs;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* An unresolved credential reported at the severity its DECLARATION earns.
|
|
186
|
+
*
|
|
187
|
+
* The two cases need different reactions and a single severity would train an operator to ignore
|
|
188
|
+
* both. A required key that did not resolve is a misconfiguration that will cost this step its
|
|
189
|
+
* integration; an optional one is a state the deployment declared as normal, so reporting it as a
|
|
190
|
+
* warning would be crying wolf about a working endpoint.
|
|
191
|
+
*/
|
|
192
|
+
function reportUnresolved(input, generator, planned) {
|
|
193
|
+
if (planned.credential.required === false) {
|
|
194
|
+
input.logger?.debug('binary-generator optional credential did not resolve; the agent is told to call it without that value', { binaryGeneratorId: generator.id, credentialKey: planned.key });
|
|
195
|
+
return;
|
|
97
196
|
}
|
|
98
|
-
input.logger?.warn('binary-generator credential did not resolve; the agent is told the integration is unavailable', { binaryGeneratorId: generator.id, credentialKey: key });
|
|
99
|
-
return undefined;
|
|
197
|
+
input.logger?.warn('binary-generator credential did not resolve; the agent is told the integration is unavailable', { binaryGeneratorId: generator.id, credentialKey: planned.key });
|
|
100
198
|
}
|
|
101
199
|
//# sourceMappingURL=binaryGenerators.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binaryGenerators.js","sourceRoot":"","sources":["../../src/agents/binaryGenerators.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"binaryGenerators.js","sourceRoot":"","sources":["../../src/agents/binaryGenerators.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declaredCredentials.d.ts","sourceRoot":"","sources":["../../../src/modules/capabilityCredentials/declaredCredentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAExE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,KAAK,EACV,uBAAuB,EAEvB,yBAAyB,EAC1B,MAAM,wBAAwB,CAAA;AAkB/B,2FAA2F;AAC3F,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,aAAa,GAAG,kBAAkB,CAAA;IAC3C,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qFAAqF;IACrF,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,4BAA4B,EAAE,CAAA;IACxC;;;;;OAKG;IACH,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,+BAA+B;IAC9C,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,qFAAqF;IACrF,gBAAgB,EAAE,qBAAqB,CAAA;IACvC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,oFAAoF;AACpF,wBAAsB,oCAAoC,CACxD,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC,6BAA6B,CAAC,
|
|
1
|
+
{"version":3,"file":"declaredCredentials.d.ts","sourceRoot":"","sources":["../../../src/modules/capabilityCredentials/declaredCredentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAExE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,KAAK,EACV,uBAAuB,EAEvB,yBAAyB,EAC1B,MAAM,wBAAwB,CAAA;AAkB/B,2FAA2F;AAC3F,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,aAAa,GAAG,kBAAkB,CAAA;IAC3C,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qFAAqF;IACrF,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,4BAA4B,EAAE,CAAA;IACxC;;;;;OAKG;IACH,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,+BAA+B;IAC9C,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,qFAAqF;IACrF,gBAAgB,EAAE,qBAAqB,CAAA;IACvC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,oFAAoF;AACpF,wBAAsB,oCAAoC,CACxD,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC,6BAA6B,CAAC,CAoExC;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE;IACpD,YAAY,EAAE,6BAA6B,CAAA;IAC3C,MAAM,EAAE,uBAAuB,EAAE,CAAA;IACjC;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B,GAAG,yBAAyB,CA0C5B"}
|
|
@@ -48,17 +48,19 @@ export async function collectDeclaredCapabilityCredentials(input) {
|
|
|
48
48
|
// be short" instead of "nothing needs a credential".
|
|
49
49
|
const views = await runBestEffort(input.logger ?? noopLogger, 'read generative integrations for the credential checklist', () => input.binaryGenerators.views());
|
|
50
50
|
for (const view of views ?? []) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
51
|
+
// Every credential the integration declares, not one: a vendor authenticating with a
|
|
52
|
+
// key/secret pair gives the operator two values in its own console, and a checklist offering
|
|
53
|
+
// one row for them is a form that cannot be filled in correctly.
|
|
54
|
+
for (const credential of view.credentials) {
|
|
55
|
+
push({
|
|
56
|
+
subject: 'binary-generator',
|
|
57
|
+
id: view.id,
|
|
58
|
+
label: view.name,
|
|
59
|
+
key: credential.key,
|
|
60
|
+
...(credential.usage ? { usage: credential.usage } : {}),
|
|
61
|
+
required: credential.required !== false,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
62
64
|
}
|
|
63
65
|
return { declared, incomplete: views === undefined };
|
|
64
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declaredCredentials.js","sourceRoot":"","sources":["../../../src/modules/capabilityCredentials/declaredCredentials.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAqD/D,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,oCAAoC,CACxD,KAAsC;IAEtC,MAAM,QAAQ,GAAmC,EAAE,CAAA;IACnD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,IAAI,GAAG,CAAC,KAAmC,EAAQ,EAAE;QACzD,0FAA0F;QAC1F,8FAA8F;QAC9F,mEAAmE;QACnE,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,GAAG,EAAE,CAAA;QAC5D,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAM;QAC9B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAClB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC,CAAA;IAED,4FAA4F;IAC5F,gGAAgG;IAChG,iGAAiG;IACjG,iEAAiE;IACjE,EAAE;IACF,yFAAyF;IACzF,+FAA+F;IAC/F,4FAA4F;IAC5F,uFAAuF;IACvF,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,EAAE,CAAC;QACnE,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAC1E,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;gBAC7C,IAAI,CAAC;oBACH,OAAO,EAAE,aAAa;oBACtB,EAAE,EAAE,MAAM,CAAC,EAAE;oBACb,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE;oBAChC,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,wFAAwF;oBACxF,uFAAuF;oBACvF,oFAAoF;oBACpF,qFAAqF;oBACrF,8BAA8B;oBAC9B,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChD,mFAAmF;oBACnF,uCAAuC;oBACvC,QAAQ,EAAE,MAAM,CAAC,QAAQ,KAAK,KAAK;iBACpC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,gGAAgG;IAChG,+FAA+F;IAC/F,qDAAqD;IACrD,MAAM,KAAK,GAAG,MAAM,aAAa,CAC/B,KAAK,CAAC,MAAM,IAAI,UAAU,EAC1B,2DAA2D,EAC3D,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,CACrC,CAAA;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAC/B,
|
|
1
|
+
{"version":3,"file":"declaredCredentials.js","sourceRoot":"","sources":["../../../src/modules/capabilityCredentials/declaredCredentials.ts"],"names":[],"mappings":"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"}
|