@appport/sdk 1.0.2 → 1.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.
- package/README.md +23 -1
- package/dist/external-compatibility.d.ts +142 -0
- package/dist/external-compatibility.d.ts.map +1 -0
- package/dist/external-compatibility.js +132 -0
- package/dist/external-compatibility.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/provider-lifecycle.d.ts +247 -0
- package/dist/provider-lifecycle.d.ts.map +1 -0
- package/dist/provider-lifecycle.js +314 -0
- package/dist/provider-lifecycle.js.map +1 -0
- package/dist/resolution-policy.d.ts +81 -0
- package/dist/resolution-policy.d.ts.map +1 -0
- package/dist/resolution-policy.js +131 -0
- package/dist/resolution-policy.js.map +1 -0
- package/package.json +1 -1
- package/vendor/@appport/core/dist/appboundry-capability-catalog.d.ts +930 -0
- package/vendor/@appport/core/dist/appboundry-capability-catalog.d.ts.map +1 -0
- package/vendor/@appport/core/dist/appboundry-capability-catalog.js +352 -0
- package/vendor/@appport/core/dist/appboundry-capability-catalog.js.map +1 -0
- package/vendor/@appport/core/dist/appboundry-composition.d.ts +93 -0
- package/vendor/@appport/core/dist/appboundry-composition.d.ts.map +1 -0
- package/vendor/@appport/core/dist/appboundry-composition.js +184 -0
- package/vendor/@appport/core/dist/appboundry-composition.js.map +1 -0
- package/vendor/@appport/core/dist/appboundry-discovery.d.ts +110 -0
- package/vendor/@appport/core/dist/appboundry-discovery.d.ts.map +1 -0
- package/vendor/@appport/core/dist/appboundry-discovery.js +141 -0
- package/vendor/@appport/core/dist/appboundry-discovery.js.map +1 -0
- package/vendor/@appport/core/dist/appboundry-entitlements.d.ts +128 -0
- package/vendor/@appport/core/dist/appboundry-entitlements.d.ts.map +1 -0
- package/vendor/@appport/core/dist/appboundry-entitlements.js +312 -0
- package/vendor/@appport/core/dist/appboundry-entitlements.js.map +1 -0
- package/vendor/@appport/core/dist/appboundry-execution.d.ts +72 -0
- package/vendor/@appport/core/dist/appboundry-execution.d.ts.map +1 -0
- package/vendor/@appport/core/dist/appboundry-execution.js +114 -0
- package/vendor/@appport/core/dist/appboundry-execution.js.map +1 -0
- package/vendor/@appport/core/dist/appboundry-materialization.d.ts +222 -0
- package/vendor/@appport/core/dist/appboundry-materialization.d.ts.map +1 -0
- package/vendor/@appport/core/dist/appboundry-materialization.js +474 -0
- package/vendor/@appport/core/dist/appboundry-materialization.js.map +1 -0
- package/vendor/@appport/core/dist/appboundry-resolution.d.ts +160 -0
- package/vendor/@appport/core/dist/appboundry-resolution.d.ts.map +1 -0
- package/vendor/@appport/core/dist/appboundry-resolution.js +218 -0
- package/vendor/@appport/core/dist/appboundry-resolution.js.map +1 -0
- package/vendor/@appport/core/dist/appboundry-surface.d.ts +96 -0
- package/vendor/@appport/core/dist/appboundry-surface.d.ts.map +1 -0
- package/vendor/@appport/core/dist/appboundry-surface.js +223 -0
- package/vendor/@appport/core/dist/appboundry-surface.js.map +1 -0
- package/vendor/@appport/core/dist/application.d.ts +3 -1
- package/vendor/@appport/core/dist/application.d.ts.map +1 -1
- package/vendor/@appport/core/dist/application.js +3 -0
- package/vendor/@appport/core/dist/application.js.map +1 -1
- package/vendor/@appport/core/dist/index.d.ts +8 -0
- package/vendor/@appport/core/dist/index.d.ts.map +1 -1
- package/vendor/@appport/core/dist/index.js +8 -0
- package/vendor/@appport/core/dist/index.js.map +1 -1
- package/vendor/@appport/core/dist/public.d.ts +1 -0
- package/vendor/@appport/core/dist/public.d.ts.map +1 -1
- package/vendor/@appport/core/dist/public.js +1 -0
- package/vendor/@appport/core/dist/public.js.map +1 -1
- package/vendor/@appport/core/dist/registry.d.ts +2 -1
- package/vendor/@appport/core/dist/registry.d.ts.map +1 -1
- package/vendor/@appport/core/dist/registry.js +1 -0
- package/vendor/@appport/core/dist/registry.js.map +1 -1
- package/vendor/@appport/mcp/README.md +29 -0
- package/vendor/@appport/mcp/dist/index.d.ts +58 -0
- package/vendor/@appport/mcp/dist/index.d.ts.map +1 -0
- package/vendor/@appport/mcp/dist/index.js +69 -0
- package/vendor/@appport/mcp/dist/index.js.map +1 -0
- package/vendor/@appport/mcp/package.json +29 -0
- package/vendor/@appport/protocol/dist/errors.d.ts +1 -1
- package/vendor/@appport/protocol/dist/errors.d.ts.map +1 -1
- package/vendor/@appport/protocol/dist/errors.js +1 -0
- package/vendor/@appport/protocol/dist/errors.js.map +1 -1
- package/vendor/@appport/protocol/dist/index.d.ts +1 -0
- package/vendor/@appport/protocol/dist/index.d.ts.map +1 -1
- package/vendor/@appport/protocol/dist/index.js +1 -0
- package/vendor/@appport/protocol/dist/index.js.map +1 -1
- package/vendor/@appport/protocol/dist/manifest.d.ts +3 -0
- package/vendor/@appport/protocol/dist/manifest.d.ts.map +1 -1
- package/vendor/@appport/protocol/dist/manifest.js.map +1 -1
- package/vendor/@appport/protocol/dist/materialization.d.ts +59 -0
- package/vendor/@appport/protocol/dist/materialization.d.ts.map +1 -0
- package/vendor/@appport/protocol/dist/materialization.js +2 -0
- package/vendor/@appport/protocol/dist/materialization.js.map +1 -0
- package/vendor/@appport/server/dist/http.d.ts.map +1 -1
- package/vendor/@appport/server/dist/http.js +1 -0
- package/vendor/@appport/server/dist/http.js.map +1 -1
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AppBoundry capability dependency and composition graph resolution.
|
|
3
|
+
*
|
|
4
|
+
* This layer determines whether a root capability and its declared dependency
|
|
5
|
+
* graph are composable in the current context. It does not execute the graph;
|
|
6
|
+
* execution orchestration can consume the resolved composition later.
|
|
7
|
+
*/
|
|
8
|
+
import { AppBoundrySurfaceResolver } from "./appboundry-surface.js";
|
|
9
|
+
export class AppBoundryCompositionResolver {
|
|
10
|
+
surfaceResolver;
|
|
11
|
+
constructor(surfaceResolver) {
|
|
12
|
+
this.surfaceResolver = surfaceResolver;
|
|
13
|
+
}
|
|
14
|
+
async resolve(request) {
|
|
15
|
+
const requestedTarget = request.requestedTarget ?? request.context.environment;
|
|
16
|
+
const compositionId = createCompositionId(request, requestedTarget);
|
|
17
|
+
const declarations = new Map(request.declarations.map((declaration) => [capabilityId(declaration.capability), declaration]));
|
|
18
|
+
const nodes = new Map();
|
|
19
|
+
const nodeOrder = [];
|
|
20
|
+
const dependencyOrder = [];
|
|
21
|
+
const rawEdges = [];
|
|
22
|
+
const cycles = [];
|
|
23
|
+
const visiting = new Set();
|
|
24
|
+
const visited = new Set();
|
|
25
|
+
const visit = async (requirement, depth, path) => {
|
|
26
|
+
const id = capabilityId(requirement);
|
|
27
|
+
if (visiting.has(id)) {
|
|
28
|
+
const cyclePath = path.slice(path.indexOf(id));
|
|
29
|
+
cycles.push({
|
|
30
|
+
path: cyclePath,
|
|
31
|
+
message: `Capability dependency cycle detected: ${cyclePath.join(" -> ")}`
|
|
32
|
+
});
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (visited.has(id))
|
|
36
|
+
return;
|
|
37
|
+
visiting.add(id);
|
|
38
|
+
const node = await this.resolveNode(request, compositionId, requirement, depth, requestedTarget, declarations);
|
|
39
|
+
nodes.set(id, node);
|
|
40
|
+
nodeOrder.push(id);
|
|
41
|
+
if (node.status === "resolved") {
|
|
42
|
+
for (const dependency of sortRequirements(declarations.get(id)?.requires ?? [])) {
|
|
43
|
+
const dependencyId = capabilityId(dependency);
|
|
44
|
+
rawEdges.push({ from: id, to: dependencyId, status: "resolved" });
|
|
45
|
+
await visit(dependency, depth + 1, [...path, dependencyId]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
visiting.delete(id);
|
|
49
|
+
visited.add(id);
|
|
50
|
+
dependencyOrder.push(id);
|
|
51
|
+
};
|
|
52
|
+
await visit(request.root, 0, [capabilityId(request.root)]);
|
|
53
|
+
const orderedNodes = nodeOrder.map((id) => nodes.get(id));
|
|
54
|
+
const edges = rawEdges.map((edge) => {
|
|
55
|
+
const target = nodes.get(edge.to);
|
|
56
|
+
const cyclic = cycles.some((cycle) => edge.from === cycle.path.at(-2) && edge.to === cycle.path.at(-1));
|
|
57
|
+
if (cyclic)
|
|
58
|
+
return { ...edge, status: "cycle", reason: "cycle" };
|
|
59
|
+
if (!target || target.status !== "resolved") {
|
|
60
|
+
return { ...edge, status: "blocked", reason: target?.status ?? "unresolved" };
|
|
61
|
+
}
|
|
62
|
+
return edge;
|
|
63
|
+
});
|
|
64
|
+
const blockedNodeIds = orderedNodes.filter((node) => node.status !== "resolved").map((node) => node.id);
|
|
65
|
+
const status = blockedNodeIds.length === 0 && cycles.length === 0 && edges.every((edge) => edge.status === "resolved") ? "ready" : "blocked";
|
|
66
|
+
const root = nodes.get(capabilityId(request.root)) ?? missingRootNode(request, compositionId);
|
|
67
|
+
return {
|
|
68
|
+
kind: "composition",
|
|
69
|
+
compositionId,
|
|
70
|
+
status,
|
|
71
|
+
request,
|
|
72
|
+
root,
|
|
73
|
+
nodes: orderedNodes,
|
|
74
|
+
edges,
|
|
75
|
+
dependencyOrder,
|
|
76
|
+
cycles,
|
|
77
|
+
evidence: {
|
|
78
|
+
requestId: request.requestId,
|
|
79
|
+
compositionId,
|
|
80
|
+
applicationId: request.applicationId,
|
|
81
|
+
rootCapabilityId: capabilityId(request.root),
|
|
82
|
+
...(request.context.environment ? { environment: request.context.environment } : {}),
|
|
83
|
+
...(requestedTarget ? { requestedTarget } : {}),
|
|
84
|
+
nodeIds: orderedNodes.map((node) => node.id),
|
|
85
|
+
dependencyOrder,
|
|
86
|
+
blockedNodeIds,
|
|
87
|
+
resolvedAt: new Date().toISOString()
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async resolveNode(request, compositionId, requirement, depth, requestedTarget, declarations) {
|
|
92
|
+
const surface = await this.surfaceResolver.resolve({
|
|
93
|
+
requestId: `${request.requestId}::${capabilityId(requirement)}`,
|
|
94
|
+
applicationId: request.applicationId,
|
|
95
|
+
context: request.context,
|
|
96
|
+
requirements: [requirement],
|
|
97
|
+
...(requestedTarget ? { requestedTarget } : {}),
|
|
98
|
+
...(request.artifacts ? { artifacts: request.artifacts } : {})
|
|
99
|
+
});
|
|
100
|
+
const available = surface.capabilities[0];
|
|
101
|
+
if (available) {
|
|
102
|
+
const dependencyIds = sortRequirements(declarations.get(capabilityId(requirement))?.requires ?? []).map(capabilityId);
|
|
103
|
+
return {
|
|
104
|
+
id: capabilityId(available.capability),
|
|
105
|
+
capability: available.capability,
|
|
106
|
+
depth,
|
|
107
|
+
dependencyIds,
|
|
108
|
+
status: "resolved",
|
|
109
|
+
surface: available,
|
|
110
|
+
evidence: {
|
|
111
|
+
compositionId,
|
|
112
|
+
surfaceId: surface.surfaceId,
|
|
113
|
+
discoveryId: available.discoveryId,
|
|
114
|
+
resolutionId: available.resolutionId,
|
|
115
|
+
authorizationId: available.materialization.kind === "materializer"
|
|
116
|
+
? stringContextValue(available.materialization.request.context, "authorizationId")
|
|
117
|
+
: undefined,
|
|
118
|
+
materializationRequestId: available.evidence.materializationRequestId,
|
|
119
|
+
contractFingerprint: available.evidence.contractFingerprint,
|
|
120
|
+
resolvedEnvironment: available.evidence.resolvedEnvironment
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const unavailable = surface.unavailable[0];
|
|
125
|
+
return {
|
|
126
|
+
id: capabilityId(requirement),
|
|
127
|
+
capability: { name: requirement.name, version: requirement.version },
|
|
128
|
+
depth,
|
|
129
|
+
dependencyIds: [],
|
|
130
|
+
status: unavailable ? compositionStatusFromUnavailable(unavailable) : "blocked",
|
|
131
|
+
...(unavailable ? { unavailable } : {}),
|
|
132
|
+
evidence: {
|
|
133
|
+
compositionId,
|
|
134
|
+
surfaceId: surface.surfaceId,
|
|
135
|
+
discoveryId: unavailable?.discoveryId,
|
|
136
|
+
resolvedEnvironment: request.context.environment
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function missingRootNode(request, compositionId) {
|
|
142
|
+
return {
|
|
143
|
+
id: capabilityId(request.root),
|
|
144
|
+
capability: { name: request.root.name, version: request.root.version },
|
|
145
|
+
depth: 0,
|
|
146
|
+
dependencyIds: [],
|
|
147
|
+
status: "missing",
|
|
148
|
+
evidence: { compositionId, resolvedEnvironment: request.context.environment }
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function compositionStatusFromUnavailable(unavailable) {
|
|
152
|
+
if (unavailable.reason === "not_found" || unavailable.reason === "unresolved")
|
|
153
|
+
return "missing";
|
|
154
|
+
if (unavailable.reason === "unauthorized")
|
|
155
|
+
return "unauthorized";
|
|
156
|
+
if (unavailable.reason === "incompatible_environment" || unavailable.reason === "materialization_ambiguous")
|
|
157
|
+
return "incompatible";
|
|
158
|
+
if (unavailable.reason === "ambiguous")
|
|
159
|
+
return "ambiguous";
|
|
160
|
+
return "blocked";
|
|
161
|
+
}
|
|
162
|
+
function sortRequirements(requirements) {
|
|
163
|
+
return [...requirements].sort((left, right) => left.name.localeCompare(right.name) ||
|
|
164
|
+
left.version - right.version ||
|
|
165
|
+
(left.versionConstraint ?? "").localeCompare(right.versionConstraint ?? "") ||
|
|
166
|
+
(left.provider?.applicationId ?? "").localeCompare(right.provider?.applicationId ?? ""));
|
|
167
|
+
}
|
|
168
|
+
function capabilityId(capability) {
|
|
169
|
+
return `${capability.name}@${capability.version}`;
|
|
170
|
+
}
|
|
171
|
+
function createCompositionId(request, requestedTarget) {
|
|
172
|
+
return [
|
|
173
|
+
request.requestId,
|
|
174
|
+
request.applicationId,
|
|
175
|
+
capabilityId(request.root),
|
|
176
|
+
request.context.environment ?? "unknown",
|
|
177
|
+
requestedTarget ?? "any"
|
|
178
|
+
].join("::");
|
|
179
|
+
}
|
|
180
|
+
function stringContextValue(context, key) {
|
|
181
|
+
const value = context?.[key];
|
|
182
|
+
return typeof value === "string" ? value : undefined;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=appboundry-composition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appboundry-composition.js","sourceRoot":"","sources":["../src/appboundry-composition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AppBoundry dynamic capability discovery boundary.
|
|
3
|
+
*
|
|
4
|
+
* Discovery answers "what capabilities are available?" without deciding who is
|
|
5
|
+
* allowed to use them, which compatible candidate should satisfy the request,
|
|
6
|
+
* how the capability is materialized, or how it executes.
|
|
7
|
+
*/
|
|
8
|
+
import type { JsonValue, MaterializationDeclaration } from "../../protocol/dist/index.d.ts";
|
|
9
|
+
import type { AppBoundryCapabilityRequest, AppBoundryRequestContext, OfferedCapability } from "./appboundry-resolution.js";
|
|
10
|
+
import { AppBoundryCapabilityResolver, type AppBoundryResolutionRecord } from "./appboundry-resolution.js";
|
|
11
|
+
import type { ApplicationState } from "./state.js";
|
|
12
|
+
import type { CapabilityManifestEntry } from "./manifest.js";
|
|
13
|
+
export declare const NO_CAPABILITY_FOUND: "appboundry.NO_CAPABILITY_FOUND";
|
|
14
|
+
export declare const NO_ELIGIBLE_PROVIDER: "appboundry.NO_ELIGIBLE_PROVIDER";
|
|
15
|
+
export declare const DISCOVERY_FAILED: "appboundry.DISCOVERY_FAILED";
|
|
16
|
+
export interface CapabilityAdvertisement {
|
|
17
|
+
readonly provider: ApplicationState;
|
|
18
|
+
readonly capability: CapabilityManifestEntry;
|
|
19
|
+
readonly materialization?: MaterializationDeclaration;
|
|
20
|
+
readonly metadata?: Readonly<Record<string, JsonValue>>;
|
|
21
|
+
}
|
|
22
|
+
export interface CapabilityDiscoveryRequest {
|
|
23
|
+
readonly request: AppBoundryCapabilityRequest;
|
|
24
|
+
readonly context: AppBoundryRequestContext;
|
|
25
|
+
}
|
|
26
|
+
export interface CapabilityProvider {
|
|
27
|
+
readonly id: string;
|
|
28
|
+
advertise(input: CapabilityDiscoveryRequest): CapabilityAdvertisement[] | Promise<CapabilityAdvertisement[]>;
|
|
29
|
+
}
|
|
30
|
+
export interface CapabilityDiscoveryCandidate {
|
|
31
|
+
readonly providerId: string;
|
|
32
|
+
readonly capabilityName: string;
|
|
33
|
+
readonly capabilityVersion: number;
|
|
34
|
+
readonly contractFingerprint: string;
|
|
35
|
+
readonly offer: OfferedCapability;
|
|
36
|
+
readonly metadata?: Readonly<Record<string, JsonValue>>;
|
|
37
|
+
}
|
|
38
|
+
export interface CapabilityDiscoveryIneligibleProvider {
|
|
39
|
+
readonly providerId: string;
|
|
40
|
+
readonly capabilityName: string;
|
|
41
|
+
readonly capabilityVersion: number;
|
|
42
|
+
readonly reason: string;
|
|
43
|
+
readonly eligibilitySource?: string;
|
|
44
|
+
readonly relationshipId?: string;
|
|
45
|
+
readonly relationshipStatus?: string;
|
|
46
|
+
readonly offerId?: string;
|
|
47
|
+
readonly offerStatus?: string;
|
|
48
|
+
}
|
|
49
|
+
export type CapabilityDiscoveryResult = {
|
|
50
|
+
readonly kind: "discovered";
|
|
51
|
+
readonly discoveryId: string;
|
|
52
|
+
readonly requestId: string;
|
|
53
|
+
readonly candidates: readonly CapabilityDiscoveryCandidate[];
|
|
54
|
+
readonly providerIds: readonly string[];
|
|
55
|
+
readonly ineligibleProviders?: readonly CapabilityDiscoveryIneligibleProvider[];
|
|
56
|
+
} | {
|
|
57
|
+
readonly kind: "none";
|
|
58
|
+
readonly discoveryId: string;
|
|
59
|
+
readonly requestId: string;
|
|
60
|
+
readonly code: typeof NO_CAPABILITY_FOUND | typeof NO_ELIGIBLE_PROVIDER;
|
|
61
|
+
readonly candidates: readonly [];
|
|
62
|
+
readonly providerIds: readonly string[];
|
|
63
|
+
readonly message: string;
|
|
64
|
+
readonly ineligibleProviders?: readonly CapabilityDiscoveryIneligibleProvider[];
|
|
65
|
+
} | {
|
|
66
|
+
readonly kind: "failed";
|
|
67
|
+
readonly discoveryId: string;
|
|
68
|
+
readonly requestId: string;
|
|
69
|
+
readonly code: typeof DISCOVERY_FAILED;
|
|
70
|
+
readonly candidates: readonly [];
|
|
71
|
+
readonly providerIds: readonly string[];
|
|
72
|
+
readonly message: string;
|
|
73
|
+
};
|
|
74
|
+
export interface CapabilityDiscovery {
|
|
75
|
+
discover(input: CapabilityDiscoveryRequest): Promise<CapabilityDiscoveryResult>;
|
|
76
|
+
}
|
|
77
|
+
export declare class InMemoryCapabilityProviderRegistry implements CapabilityDiscovery {
|
|
78
|
+
#private;
|
|
79
|
+
register(provider: CapabilityProvider): this;
|
|
80
|
+
unregister(providerId: string): boolean;
|
|
81
|
+
list(): readonly CapabilityProvider[];
|
|
82
|
+
discover(input: CapabilityDiscoveryRequest): Promise<CapabilityDiscoveryResult>;
|
|
83
|
+
}
|
|
84
|
+
export declare function capabilityProvider(input: {
|
|
85
|
+
readonly id: string;
|
|
86
|
+
readonly advertisements: readonly CapabilityAdvertisement[];
|
|
87
|
+
}): CapabilityProvider;
|
|
88
|
+
export declare function resolveDiscoveredCapability(input: {
|
|
89
|
+
readonly discovery: CapabilityDiscovery;
|
|
90
|
+
readonly resolver: AppBoundryCapabilityResolver;
|
|
91
|
+
readonly request: AppBoundryCapabilityRequest;
|
|
92
|
+
}): Promise<{
|
|
93
|
+
readonly kind: "resolved";
|
|
94
|
+
readonly discovery: Extract<CapabilityDiscoveryResult, {
|
|
95
|
+
kind: "discovered";
|
|
96
|
+
}>;
|
|
97
|
+
readonly resolution: AppBoundryResolutionRecord;
|
|
98
|
+
} | {
|
|
99
|
+
readonly kind: "discovery_none";
|
|
100
|
+
readonly discovery: Extract<CapabilityDiscoveryResult, {
|
|
101
|
+
kind: "none";
|
|
102
|
+
}>;
|
|
103
|
+
} | {
|
|
104
|
+
readonly kind: "discovery_failed";
|
|
105
|
+
readonly discovery: Extract<CapabilityDiscoveryResult, {
|
|
106
|
+
kind: "failed";
|
|
107
|
+
}>;
|
|
108
|
+
}>;
|
|
109
|
+
export declare function candidateId(candidate: CapabilityDiscoveryCandidate): string;
|
|
110
|
+
//# sourceMappingURL=appboundry-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appboundry-discovery.d.ts","sourceRoot":"","sources":["../src/appboundry-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AppBoundry dynamic capability discovery boundary.
|
|
3
|
+
*
|
|
4
|
+
* Discovery answers "what capabilities are available?" without deciding who is
|
|
5
|
+
* allowed to use them, which compatible candidate should satisfy the request,
|
|
6
|
+
* how the capability is materialized, or how it executes.
|
|
7
|
+
*/
|
|
8
|
+
import { randomUUID } from "node:crypto";
|
|
9
|
+
import { AppBoundryCapabilityResolver } from "./appboundry-resolution.js";
|
|
10
|
+
export const NO_CAPABILITY_FOUND = "appboundry.NO_CAPABILITY_FOUND";
|
|
11
|
+
export const NO_ELIGIBLE_PROVIDER = "appboundry.NO_ELIGIBLE_PROVIDER";
|
|
12
|
+
export const DISCOVERY_FAILED = "appboundry.DISCOVERY_FAILED";
|
|
13
|
+
export class InMemoryCapabilityProviderRegistry {
|
|
14
|
+
#providers = new Map();
|
|
15
|
+
register(provider) {
|
|
16
|
+
if (!provider.id)
|
|
17
|
+
throw new Error("provider id must be non-empty");
|
|
18
|
+
if (this.#providers.has(provider.id))
|
|
19
|
+
throw new Error(`provider "${provider.id}" is already registered`);
|
|
20
|
+
this.#providers.set(provider.id, provider);
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
unregister(providerId) {
|
|
24
|
+
return this.#providers.delete(providerId);
|
|
25
|
+
}
|
|
26
|
+
list() {
|
|
27
|
+
return [...this.#providers.values()].sort((left, right) => left.id.localeCompare(right.id));
|
|
28
|
+
}
|
|
29
|
+
async discover(input) {
|
|
30
|
+
const discoveryId = `disc_${randomUUID()}`;
|
|
31
|
+
const providers = this.list();
|
|
32
|
+
const providerIds = providers.map((provider) => provider.id);
|
|
33
|
+
const candidates = new Map();
|
|
34
|
+
try {
|
|
35
|
+
for (const provider of providers) {
|
|
36
|
+
for (const advertisement of await provider.advertise(input)) {
|
|
37
|
+
if (!advertisementMatchesRequest(input.request, advertisement))
|
|
38
|
+
continue;
|
|
39
|
+
const key = advertisementKey(advertisement);
|
|
40
|
+
if (!candidates.has(key)) {
|
|
41
|
+
candidates.set(key, {
|
|
42
|
+
providerId: advertisement.provider.id,
|
|
43
|
+
capabilityName: advertisement.capability.name,
|
|
44
|
+
capabilityVersion: advertisement.capability.version,
|
|
45
|
+
contractFingerprint: advertisement.provider.fingerprint,
|
|
46
|
+
offer: {
|
|
47
|
+
provider: advertisement.provider,
|
|
48
|
+
capability: advertisement.capability,
|
|
49
|
+
...(advertisement.materialization ? { materialization: advertisement.materialization } : {}),
|
|
50
|
+
...(advertisement.metadata ? { metadata: advertisement.metadata } : {})
|
|
51
|
+
},
|
|
52
|
+
...(advertisement.metadata ? { metadata: advertisement.metadata } : {})
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return {
|
|
60
|
+
kind: "failed",
|
|
61
|
+
discoveryId,
|
|
62
|
+
requestId: input.request.requestId,
|
|
63
|
+
code: DISCOVERY_FAILED,
|
|
64
|
+
candidates: [],
|
|
65
|
+
providerIds,
|
|
66
|
+
message: error instanceof Error ? error.message : String(error)
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const ordered = [...candidates.values()].sort(compareCandidates);
|
|
70
|
+
if (ordered.length === 0) {
|
|
71
|
+
return {
|
|
72
|
+
kind: "none",
|
|
73
|
+
discoveryId,
|
|
74
|
+
requestId: input.request.requestId,
|
|
75
|
+
code: NO_CAPABILITY_FOUND,
|
|
76
|
+
candidates: [],
|
|
77
|
+
providerIds,
|
|
78
|
+
message: `No capability found for "${input.request.requirement.name}"`
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
kind: "discovered",
|
|
83
|
+
discoveryId,
|
|
84
|
+
requestId: input.request.requestId,
|
|
85
|
+
candidates: ordered,
|
|
86
|
+
providerIds
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export function capabilityProvider(input) {
|
|
91
|
+
return {
|
|
92
|
+
id: input.id,
|
|
93
|
+
advertise() {
|
|
94
|
+
return [...input.advertisements];
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export async function resolveDiscoveredCapability(input) {
|
|
99
|
+
const discovery = await input.discovery.discover({ request: input.request, context: input.request.context });
|
|
100
|
+
if (discovery.kind === "none")
|
|
101
|
+
return { kind: "discovery_none", discovery };
|
|
102
|
+
if (discovery.kind === "failed")
|
|
103
|
+
return { kind: "discovery_failed", discovery };
|
|
104
|
+
const resolution = await input.resolver.resolve({
|
|
105
|
+
...input.request,
|
|
106
|
+
availableCapabilities: discovery.candidates.map((candidate) => candidate.offer),
|
|
107
|
+
discovery: {
|
|
108
|
+
discoveryId: discovery.discoveryId,
|
|
109
|
+
providerIds: discovery.providerIds,
|
|
110
|
+
candidateIds: discovery.candidates.map(candidateId)
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
return { kind: "resolved", discovery, resolution };
|
|
114
|
+
}
|
|
115
|
+
export function candidateId(candidate) {
|
|
116
|
+
return `${candidate.providerId}::${candidate.capabilityName}@${candidate.capabilityVersion}::${candidate.contractFingerprint}`;
|
|
117
|
+
}
|
|
118
|
+
function advertisementMatchesRequest(request, advertisement) {
|
|
119
|
+
if (advertisement.capability.name !== request.requirement.name)
|
|
120
|
+
return false;
|
|
121
|
+
if (request.requirement.provider?.applicationId && advertisement.provider.id !== request.requirement.provider.applicationId) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
return advertisement.provider.manifest.provides.some((capability) => capability.name === advertisement.capability.name &&
|
|
125
|
+
capability.version === advertisement.capability.version);
|
|
126
|
+
}
|
|
127
|
+
function advertisementKey(advertisement) {
|
|
128
|
+
return [
|
|
129
|
+
advertisement.provider.id,
|
|
130
|
+
advertisement.capability.name,
|
|
131
|
+
advertisement.capability.version,
|
|
132
|
+
advertisement.provider.fingerprint
|
|
133
|
+
].join("::");
|
|
134
|
+
}
|
|
135
|
+
function compareCandidates(left, right) {
|
|
136
|
+
return (left.capabilityName.localeCompare(right.capabilityName) ||
|
|
137
|
+
right.capabilityVersion - left.capabilityVersion ||
|
|
138
|
+
left.providerId.localeCompare(right.providerId) ||
|
|
139
|
+
left.contractFingerprint.localeCompare(right.contractFingerprint));
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=appboundry-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appboundry-discovery.js","sourceRoot":"","sources":["../src/appboundry-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AppBoundry capability relationship and entitlement filtering.
|
|
3
|
+
*
|
|
4
|
+
* This layer answers whether a discovered provider is an eligible candidate for
|
|
5
|
+
* the requesting consumer, subject, purpose, contract, and context. It does not
|
|
6
|
+
* replace authorization; it narrows discovery before the authorization boundary
|
|
7
|
+
* makes the final decision.
|
|
8
|
+
*/
|
|
9
|
+
import type { JsonValue } from "../../protocol/dist/index.d.ts";
|
|
10
|
+
import { type CapabilityDiscovery, type CapabilityDiscoveryCandidate, type CapabilityDiscoveryRequest, type CapabilityDiscoveryResult } from "./appboundry-discovery.js";
|
|
11
|
+
import type { CapabilityManifestEntry } from "./manifest.js";
|
|
12
|
+
import { type RequirementWithConstraints } from "./resolver.js";
|
|
13
|
+
export type AppBoundryRelationshipStatus = "active" | "suspended" | "retired" | "revoked";
|
|
14
|
+
export type AppBoundryCapabilityOfferStatus = "active" | "disabled" | "retired";
|
|
15
|
+
export type AppBoundryCapabilityOfferAvailabilityModel = "open" | "relationship_required";
|
|
16
|
+
export type AppBoundryEligibilitySource = "relationship" | "open_offer";
|
|
17
|
+
export interface AppBoundryCapabilityRelationship {
|
|
18
|
+
readonly relationshipId: string;
|
|
19
|
+
readonly stateId?: string;
|
|
20
|
+
readonly consumerApplicationId: string;
|
|
21
|
+
readonly providerApplicationId: string;
|
|
22
|
+
readonly capabilities: readonly AppBoundryRelationshipCapability[];
|
|
23
|
+
readonly subjects?: {
|
|
24
|
+
readonly ids?: readonly string[];
|
|
25
|
+
readonly scopes?: readonly string[];
|
|
26
|
+
};
|
|
27
|
+
readonly purposes?: readonly string[];
|
|
28
|
+
readonly constraints?: Readonly<Record<string, JsonValue>>;
|
|
29
|
+
readonly status: AppBoundryRelationshipStatus;
|
|
30
|
+
readonly contractFingerprint?: string;
|
|
31
|
+
readonly effective?: {
|
|
32
|
+
readonly from?: string;
|
|
33
|
+
readonly until?: string;
|
|
34
|
+
};
|
|
35
|
+
readonly revision: number;
|
|
36
|
+
readonly createdAt?: string;
|
|
37
|
+
readonly updatedAt?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface AppBoundryRelationshipCapability {
|
|
40
|
+
readonly name: string;
|
|
41
|
+
readonly version?: number;
|
|
42
|
+
readonly versionConstraint?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface AppBoundryCapabilityOffer {
|
|
45
|
+
readonly offerId: string;
|
|
46
|
+
readonly stateId?: string;
|
|
47
|
+
readonly providerApplicationId: string;
|
|
48
|
+
readonly capability: AppBoundryRelationshipCapability;
|
|
49
|
+
readonly status: AppBoundryCapabilityOfferStatus;
|
|
50
|
+
readonly availabilityModel: AppBoundryCapabilityOfferAvailabilityModel;
|
|
51
|
+
readonly terms?: {
|
|
52
|
+
readonly relationshipRequired?: boolean;
|
|
53
|
+
readonly pricing?: string;
|
|
54
|
+
readonly quota?: string;
|
|
55
|
+
readonly usageUnit?: string;
|
|
56
|
+
};
|
|
57
|
+
readonly supportedEnvironments?: readonly string[];
|
|
58
|
+
readonly materialization?: {
|
|
59
|
+
readonly targets?: readonly string[];
|
|
60
|
+
};
|
|
61
|
+
readonly subjects?: {
|
|
62
|
+
readonly ids?: readonly string[];
|
|
63
|
+
readonly scopes?: readonly string[];
|
|
64
|
+
};
|
|
65
|
+
readonly purposes?: readonly string[];
|
|
66
|
+
readonly constraints?: Readonly<Record<string, JsonValue>>;
|
|
67
|
+
readonly contractFingerprint?: string;
|
|
68
|
+
readonly effective?: {
|
|
69
|
+
readonly from?: string;
|
|
70
|
+
readonly until?: string;
|
|
71
|
+
};
|
|
72
|
+
readonly revision: number;
|
|
73
|
+
readonly createdAt?: string;
|
|
74
|
+
readonly updatedAt?: string;
|
|
75
|
+
}
|
|
76
|
+
export interface AppBoundryCapabilityRelationshipStore {
|
|
77
|
+
listRelationships(input: {
|
|
78
|
+
readonly consumerApplicationId: string;
|
|
79
|
+
readonly providerApplicationId?: string;
|
|
80
|
+
readonly capability?: RequirementWithConstraints;
|
|
81
|
+
}): Promise<readonly AppBoundryCapabilityRelationship[]>;
|
|
82
|
+
}
|
|
83
|
+
export interface AppBoundryCapabilityOfferStore {
|
|
84
|
+
listOffers(input: {
|
|
85
|
+
readonly providerApplicationId?: string;
|
|
86
|
+
readonly capability?: RequirementWithConstraints;
|
|
87
|
+
}): Promise<readonly AppBoundryCapabilityOffer[]>;
|
|
88
|
+
}
|
|
89
|
+
export interface AppBoundryEntitlementEvaluation {
|
|
90
|
+
readonly eligible: boolean;
|
|
91
|
+
readonly relationship?: AppBoundryCapabilityRelationship;
|
|
92
|
+
readonly offer?: AppBoundryCapabilityOffer;
|
|
93
|
+
readonly reason?: AppBoundryEntitlementDenialReason;
|
|
94
|
+
readonly source?: AppBoundryEligibilitySource;
|
|
95
|
+
}
|
|
96
|
+
export type AppBoundryEntitlementDenialReason = "no_relationship" | "relationship_inactive" | "capability_not_entitled" | "subject_not_entitled" | "purpose_not_entitled" | "constraint_mismatch" | "contract_mismatch" | "offer_inactive" | "offer_requires_relationship" | "environment_not_supported" | "not_yet_effective" | "expired";
|
|
97
|
+
export declare class AppBoundryEntitlementEvaluator {
|
|
98
|
+
evaluate(input: {
|
|
99
|
+
readonly relationship: AppBoundryCapabilityRelationship;
|
|
100
|
+
readonly request: CapabilityDiscoveryRequest;
|
|
101
|
+
readonly candidate: CapabilityDiscoveryCandidate;
|
|
102
|
+
readonly now?: Date;
|
|
103
|
+
}): AppBoundryEntitlementEvaluation;
|
|
104
|
+
}
|
|
105
|
+
export declare class AppBoundryOpenOfferEvaluator {
|
|
106
|
+
evaluate(input: {
|
|
107
|
+
readonly offer: AppBoundryCapabilityOffer;
|
|
108
|
+
readonly request: CapabilityDiscoveryRequest;
|
|
109
|
+
readonly candidate: CapabilityDiscoveryCandidate;
|
|
110
|
+
readonly now?: Date;
|
|
111
|
+
}): AppBoundryEntitlementEvaluation;
|
|
112
|
+
}
|
|
113
|
+
export interface AppBoundryEntitledCapabilityDiscoveryOptions {
|
|
114
|
+
readonly relationshipEvaluator?: AppBoundryEntitlementEvaluator;
|
|
115
|
+
readonly offerStore?: AppBoundryCapabilityOfferStore;
|
|
116
|
+
readonly offerEvaluator?: AppBoundryOpenOfferEvaluator;
|
|
117
|
+
}
|
|
118
|
+
export declare class AppBoundryEntitledCapabilityDiscovery implements CapabilityDiscovery {
|
|
119
|
+
private readonly discovery;
|
|
120
|
+
private readonly relationships;
|
|
121
|
+
private readonly relationshipEvaluator;
|
|
122
|
+
private readonly offerStore?;
|
|
123
|
+
private readonly offerEvaluator;
|
|
124
|
+
constructor(discovery: CapabilityDiscovery, relationships: AppBoundryCapabilityRelationshipStore, evaluatorOrOptions?: AppBoundryEntitlementEvaluator | AppBoundryEntitledCapabilityDiscoveryOptions);
|
|
125
|
+
discover(input: CapabilityDiscoveryRequest): Promise<CapabilityDiscoveryResult>;
|
|
126
|
+
}
|
|
127
|
+
export declare function appBoundryRelationshipCapability(capability: CapabilityManifestEntry): AppBoundryRelationshipCapability;
|
|
128
|
+
//# sourceMappingURL=appboundry-entitlements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appboundry-entitlements.d.ts","sourceRoot":"","sources":["../src/appboundry-entitlements.ts"],"names":[],"mappings":"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"}
|