@appport/sdk 1.1.2 → 1.1.4

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 (65) hide show
  1. package/README.md +20 -3
  2. package/dist/application-onboarding.d.ts +52 -0
  3. package/dist/application-onboarding.d.ts.map +1 -0
  4. package/dist/application-onboarding.js +50 -0
  5. package/dist/application-onboarding.js.map +1 -0
  6. package/dist/execution-topology.d.ts +210 -0
  7. package/dist/execution-topology.d.ts.map +1 -0
  8. package/dist/execution-topology.js +558 -0
  9. package/dist/execution-topology.js.map +1 -0
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -0
  13. package/dist/index.js.map +1 -1
  14. package/package.json +1 -1
  15. package/vendor/@appport/client/dist/host.d.ts +62 -0
  16. package/vendor/@appport/client/dist/host.d.ts.map +1 -0
  17. package/vendor/@appport/client/dist/host.js +139 -0
  18. package/vendor/@appport/client/dist/host.js.map +1 -0
  19. package/vendor/@appport/client/dist/index.d.ts +1 -0
  20. package/vendor/@appport/client/dist/index.d.ts.map +1 -1
  21. package/vendor/@appport/client/dist/index.js +1 -0
  22. package/vendor/@appport/client/dist/index.js.map +1 -1
  23. package/vendor/@appport/core/dist/appboundry-diagnostics.d.ts +107 -0
  24. package/vendor/@appport/core/dist/appboundry-diagnostics.d.ts.map +1 -0
  25. package/vendor/@appport/core/dist/appboundry-diagnostics.js +358 -0
  26. package/vendor/@appport/core/dist/appboundry-diagnostics.js.map +1 -0
  27. package/vendor/@appport/core/dist/appboundry-execution.d.ts +12 -0
  28. package/vendor/@appport/core/dist/appboundry-execution.d.ts.map +1 -1
  29. package/vendor/@appport/core/dist/appboundry-execution.js +46 -10
  30. package/vendor/@appport/core/dist/appboundry-execution.js.map +1 -1
  31. package/vendor/@appport/core/dist/appboundry-exercise.d.ts +152 -0
  32. package/vendor/@appport/core/dist/appboundry-exercise.d.ts.map +1 -0
  33. package/vendor/@appport/core/dist/appboundry-exercise.js +416 -0
  34. package/vendor/@appport/core/dist/appboundry-exercise.js.map +1 -0
  35. package/vendor/@appport/core/dist/appboundry-materialization.d.ts.map +1 -1
  36. package/vendor/@appport/core/dist/appboundry-materialization.js +20 -0
  37. package/vendor/@appport/core/dist/appboundry-materialization.js.map +1 -1
  38. package/vendor/@appport/core/dist/appboundry-migration.d.ts +195 -0
  39. package/vendor/@appport/core/dist/appboundry-migration.d.ts.map +1 -0
  40. package/vendor/@appport/core/dist/appboundry-migration.js +227 -0
  41. package/vendor/@appport/core/dist/appboundry-migration.js.map +1 -0
  42. package/vendor/@appport/core/dist/appboundry-onboarding.d.ts +70 -0
  43. package/vendor/@appport/core/dist/appboundry-onboarding.d.ts.map +1 -0
  44. package/vendor/@appport/core/dist/appboundry-onboarding.js +232 -0
  45. package/vendor/@appport/core/dist/appboundry-onboarding.js.map +1 -0
  46. package/vendor/@appport/core/dist/appboundry-operation-discovery.d.ts +93 -0
  47. package/vendor/@appport/core/dist/appboundry-operation-discovery.d.ts.map +1 -0
  48. package/vendor/@appport/core/dist/appboundry-operation-discovery.js +89 -0
  49. package/vendor/@appport/core/dist/appboundry-operation-discovery.js.map +1 -0
  50. package/vendor/@appport/core/dist/appboundry-usage.d.ts +94 -0
  51. package/vendor/@appport/core/dist/appboundry-usage.d.ts.map +1 -0
  52. package/vendor/@appport/core/dist/appboundry-usage.js +80 -0
  53. package/vendor/@appport/core/dist/appboundry-usage.js.map +1 -0
  54. package/vendor/@appport/core/dist/application-package.d.ts +105 -0
  55. package/vendor/@appport/core/dist/application-package.d.ts.map +1 -0
  56. package/vendor/@appport/core/dist/application-package.js +349 -0
  57. package/vendor/@appport/core/dist/application-package.js.map +1 -0
  58. package/vendor/@appport/core/dist/index.d.ts +7 -0
  59. package/vendor/@appport/core/dist/index.d.ts.map +1 -1
  60. package/vendor/@appport/core/dist/index.js +7 -0
  61. package/vendor/@appport/core/dist/index.js.map +1 -1
  62. package/vendor/@appport/core/dist/wasm-engine.d.ts +2 -0
  63. package/vendor/@appport/core/dist/wasm-engine.d.ts.map +1 -1
  64. package/vendor/@appport/core/dist/wasm-engine.js +10 -1
  65. package/vendor/@appport/core/dist/wasm-engine.js.map +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appboundry-onboarding.d.ts","sourceRoot":"","sources":["../src/appboundry-onboarding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,232 @@
1
+ import { randomUUID } from "node:crypto";
2
+ export const ONBOARDING_STAGES = [
3
+ "UNDERSTAND",
4
+ "START",
5
+ "CONNECT",
6
+ "DISCOVER",
7
+ "PROMOTE",
8
+ "EXERCISE",
9
+ "DIAGNOSE",
10
+ "RESOLVE",
11
+ "VERIFY",
12
+ "COMPLETE",
13
+ "BLOCKED"
14
+ ];
15
+ export class AppBoundryOnboardingEngine {
16
+ #application;
17
+ #understand;
18
+ #startApplication;
19
+ #connectBoundary;
20
+ #operationDiscovery;
21
+ #promoteOperation;
22
+ #exerciseEngine;
23
+ #exerciseRequests;
24
+ #diagnosticEngine;
25
+ #diagnosticFacts;
26
+ #clock;
27
+ #idGenerator;
28
+ constructor(options = {}) {
29
+ this.#application = options.application;
30
+ this.#understand = options.understand;
31
+ this.#startApplication = options.startApplication;
32
+ this.#connectBoundary = options.connectBoundary;
33
+ this.#operationDiscovery = options.operationDiscovery;
34
+ this.#promoteOperation = options.promoteOperation;
35
+ this.#exerciseEngine = options.exerciseEngine;
36
+ this.#exerciseRequests = options.exerciseRequests;
37
+ this.#diagnosticEngine = options.diagnosticEngine;
38
+ this.#diagnosticFacts = options.diagnosticFacts;
39
+ this.#clock = options.clock ?? (() => new Date().toISOString());
40
+ this.#idGenerator = options.idGenerator ?? (() => randomUUID());
41
+ }
42
+ createSession(input) {
43
+ const createdAt = input.createdAt ?? this.#clock();
44
+ return {
45
+ id: input.id ?? `onboarding_${this.#idGenerator()}`,
46
+ applicationId: input.applicationId,
47
+ stage: "UNDERSTAND",
48
+ applicationStatus: input.applicationStatus ?? { lifecycle: "unknown", process: "UNKNOWN", boundary: "UNKNOWN", verified: false },
49
+ discoveredOperations: [],
50
+ promotedCapabilities: [],
51
+ blockers: [],
52
+ evidence: [`application:${input.applicationId}`],
53
+ createdAt,
54
+ updatedAt: createdAt
55
+ };
56
+ }
57
+ async start(session) {
58
+ let current = await this.#runStep(this.#transition(session, "UNDERSTAND"), this.#understand);
59
+ if (current.stage === "BLOCKED")
60
+ return current;
61
+ current = await this.#runStep(this.#transition(current, "START"), this.#startApplication);
62
+ if (current.stage === "BLOCKED")
63
+ return current;
64
+ current = await this.#runStep(this.#transition(current, "CONNECT"), this.#connectBoundary);
65
+ if (current.stage === "BLOCKED")
66
+ return current;
67
+ const discovery = await this.#discover(this.#transition(current, "DISCOVER"));
68
+ current = discovery.session;
69
+ if (current.stage === "BLOCKED")
70
+ return current;
71
+ const promoted = [];
72
+ current = await this.#promote(this.#transition(current, "PROMOTE"), discovery.operations, promoted);
73
+ if (current.stage === "BLOCKED")
74
+ return current;
75
+ const exercises = [];
76
+ current = await this.#exercise(this.#transition(current, "EXERCISE"), promoted, exercises);
77
+ if (current.stage === "BLOCKED")
78
+ return current;
79
+ const diagnostic = this.#diagnose(this.#transition(current, "DIAGNOSE"), exercises.at(-1));
80
+ current = diagnostic.session;
81
+ current = this.#resolve(this.#transition(current, "RESOLVE"), diagnostic.report);
82
+ if (current.stage === "BLOCKED")
83
+ return current;
84
+ current = await this.#verify(this.#transition(current, "VERIFY"), exercises);
85
+ if (current.stage === "BLOCKED")
86
+ return current;
87
+ return this.#transition(current, "COMPLETE", { applicationStatus: { ...current.applicationStatus, verified: true } });
88
+ }
89
+ async #runStep(session, step) {
90
+ if (!step)
91
+ return session;
92
+ const result = await step(session);
93
+ return this.#applyStepResult(session, result);
94
+ }
95
+ async #discover(session) {
96
+ if (!this.#operationDiscovery) {
97
+ return {
98
+ session: this.#blocked(session, "DISCOVERY_NOT_CONFIGURED", "No AppBoundry operation discovery primitive was configured."),
99
+ operations: []
100
+ };
101
+ }
102
+ const operations = await this.#operationDiscovery.discover({
103
+ applicationId: session.applicationId,
104
+ ...this.#application
105
+ });
106
+ if (!operations.length) {
107
+ return {
108
+ session: this.#blocked(session, "NO_OPERATIONS_DISCOVERED", "No invokable application operations were discovered."),
109
+ operations
110
+ };
111
+ }
112
+ return {
113
+ session: this.#merge(session, {
114
+ discoveredOperations: operations.map(operation => operation.id),
115
+ evidence: [...session.evidence, ...operations.map(operation => `operation:${operation.id}`)]
116
+ }),
117
+ operations
118
+ };
119
+ }
120
+ async #promote(session, operations, promoted) {
121
+ if (!this.#promoteOperation) {
122
+ return this.#blocked(session, "PROMOTION_NOT_CONFIGURED", "No AppBoundry capability promotion primitive was configured.");
123
+ }
124
+ for (const operation of operations.filter(operation => session.discoveredOperations.includes(operation.id))) {
125
+ const capability = await this.#promoteOperation(operation, session);
126
+ if (capability)
127
+ promoted.push(capability);
128
+ }
129
+ if (!promoted.length) {
130
+ return this.#blocked(session, "NO_CAPABILITIES_PROMOTED", "No discovered operations were promoted to canonical capabilities.");
131
+ }
132
+ return this.#merge(session, {
133
+ promotedCapabilities: promoted.map(entry => `${entry.capability.name}@${entry.capability.version}`),
134
+ evidence: [...session.evidence, ...promoted.map(entry => `promotion:${entry.promotion.promotionId}`)]
135
+ });
136
+ }
137
+ async #exercise(session, promoted, exercises) {
138
+ if (!this.#exerciseEngine || !this.#exerciseRequests) {
139
+ return this.#blocked(session, "EXERCISE_NOT_CONFIGURED", "No AppBoundry exercise primitive was configured.");
140
+ }
141
+ const requests = await this.#exerciseRequests(session, promoted);
142
+ if (!requests.length) {
143
+ return this.#blocked(session, "NO_EXERCISE_REQUEST", "No exercise request was available for the promoted capabilities.");
144
+ }
145
+ let current = session;
146
+ for (const request of requests) {
147
+ const exercise = await this.#exerciseEngine.exercise(request);
148
+ exercises.push(exercise);
149
+ current = this.#merge(current, {
150
+ activeExerciseId: exercise.id,
151
+ evidence: [...current.evidence, `exercise:${exercise.id}`]
152
+ });
153
+ if (exercise.outcome === "VERIFIED")
154
+ return current;
155
+ }
156
+ return current;
157
+ }
158
+ #diagnose(session, exercise) {
159
+ if (!this.#diagnosticEngine)
160
+ return { session };
161
+ const report = this.#diagnosticEngine.diagnose({
162
+ exercise,
163
+ applicationId: session.applicationId,
164
+ facts: this.#diagnosticFacts?.(session, exercise),
165
+ timestamp: this.#clock()
166
+ });
167
+ return {
168
+ report,
169
+ session: this.#merge(session, {
170
+ activeDiagnosticId: report.id,
171
+ evidence: [...session.evidence, `diagnostic:${report.id}`, ...report.diagnostics.map(diagnostic => `diagnostic:${diagnostic.id}`)]
172
+ })
173
+ };
174
+ }
175
+ #resolve(session, report) {
176
+ const blockers = report?.diagnostics.filter(diagnostic => diagnostic.blocking) ?? [];
177
+ if (!blockers.length)
178
+ return session;
179
+ return this.#blocked(session, blockers[0]?.code ?? "DIAGNOSTIC_BLOCKED", blockers[0]?.summary ?? "A diagnostic is blocking onboarding.", {
180
+ diagnosticId: blockers[0]?.id,
181
+ evidence: blockers.flatMap(diagnostic => [`diagnostic:${diagnostic.id}`, ...diagnostic.evidence.map(item => item.reference ?? item.type)]),
182
+ recommendations: blockers.flatMap(diagnostic => diagnostic.recommendations)
183
+ });
184
+ }
185
+ async #verify(session, exercises) {
186
+ if (!this.#exerciseEngine) {
187
+ return this.#blocked(session, "VERIFY_NOT_CONFIGURED", "No AppBoundry exercise status primitive was configured.");
188
+ }
189
+ for (const exercise of exercises) {
190
+ const status = await this.#exerciseEngine.status({
191
+ applicationId: session.applicationId,
192
+ capability: exercise.capability
193
+ });
194
+ if (status === "VERIFIED")
195
+ return session;
196
+ }
197
+ return this.#blocked(session, "CAPABILITY_NOT_VERIFIED", "No exercised capability has authoritative VERIFIED status.");
198
+ }
199
+ #applyStepResult(session, result) {
200
+ let current = this.#merge(session, {
201
+ ...(result.applicationStatus ? { applicationStatus: { ...session.applicationStatus, ...result.applicationStatus } } : {}),
202
+ ...(result.evidence ? { evidence: [...session.evidence, ...result.evidence] } : {})
203
+ });
204
+ for (const blocker of result.blockers ?? []) {
205
+ current = this.#blocked(current, blocker.code, blocker.message, blocker);
206
+ }
207
+ return current;
208
+ }
209
+ #blocked(session, code, message, options = {}) {
210
+ const blocker = {
211
+ id: `blocker_${this.#idGenerator()}`,
212
+ stage: session.stage,
213
+ code,
214
+ message,
215
+ evidence: options.evidence ?? session.evidence,
216
+ ...(options.diagnosticId ? { diagnosticId: options.diagnosticId } : {}),
217
+ ...(options.recommendations ? { recommendations: options.recommendations } : {})
218
+ };
219
+ return this.#transition(this.#merge(session, { blockers: [...session.blockers, blocker] }), "BLOCKED");
220
+ }
221
+ #transition(session, stage, patch = {}) {
222
+ return this.#merge(session, { ...patch, stage });
223
+ }
224
+ #merge(session, patch) {
225
+ return {
226
+ ...session,
227
+ ...patch,
228
+ updatedAt: this.#clock()
229
+ };
230
+ }
231
+ }
232
+ //# sourceMappingURL=appboundry-onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appboundry-onboarding.js","sourceRoot":"","sources":["../src/appboundry-onboarding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { type ConcurrencyPolicy, type IdempotencySupport, type JsonValue } from "../../protocol/dist/index.d.ts";
2
+ import type { CapabilityManifestEntry } from "./manifest.js";
3
+ export interface ApplicationExecutionContext {
4
+ readonly applicationId?: string;
5
+ readonly name?: string;
6
+ readonly version?: string;
7
+ readonly workingDirectory?: string;
8
+ readonly metadata?: Readonly<Record<string, JsonValue>>;
9
+ }
10
+ export interface DiscoveredOperationSourceLocation {
11
+ readonly uri: string;
12
+ readonly startLine?: number;
13
+ readonly endLine?: number;
14
+ }
15
+ export interface DiscoveredInvocationSurface {
16
+ readonly kind: string;
17
+ readonly method?: string;
18
+ readonly path?: string;
19
+ readonly address?: string;
20
+ readonly metadata?: Readonly<Record<string, JsonValue>>;
21
+ }
22
+ export interface DiscoveredOperationEvidence {
23
+ readonly kind: string;
24
+ readonly summary: string;
25
+ readonly location?: DiscoveredOperationSourceLocation;
26
+ readonly data?: JsonValue;
27
+ }
28
+ export interface DiscoveredOperation {
29
+ readonly id: string;
30
+ readonly nativeName: string;
31
+ readonly source: string;
32
+ readonly sourceLocation?: DiscoveredOperationSourceLocation;
33
+ readonly invocationSurface: DiscoveredInvocationSurface;
34
+ readonly input: JsonValue;
35
+ readonly output: JsonValue;
36
+ readonly confidence: number;
37
+ readonly evidence: readonly DiscoveredOperationEvidence[];
38
+ }
39
+ export interface OperationDiscoveryProvider {
40
+ readonly id: string;
41
+ discover(application: ApplicationExecutionContext): Promise<readonly DiscoveredOperation[]> | readonly DiscoveredOperation[];
42
+ }
43
+ export interface PromotedCapabilityOptions {
44
+ readonly name: string;
45
+ readonly version: number;
46
+ readonly kind?: "request" | "stream";
47
+ readonly description?: string;
48
+ readonly inputSchema?: JsonValue;
49
+ readonly outputSchema?: JsonValue;
50
+ readonly authorization?: readonly string[];
51
+ readonly idempotency?: IdempotencySupport;
52
+ readonly concurrency?: ConcurrencyPolicy;
53
+ readonly timeoutMs?: number;
54
+ readonly emits?: readonly string[];
55
+ readonly deprecated?: boolean;
56
+ }
57
+ export interface CapabilityPromotionRecord {
58
+ readonly promotionId: string;
59
+ readonly operationId: string;
60
+ readonly nativeName: string;
61
+ readonly source: string;
62
+ readonly sourceLocation?: DiscoveredOperationSourceLocation;
63
+ readonly invocationSurface: DiscoveredInvocationSurface;
64
+ readonly canonicalName: string;
65
+ readonly canonicalVersion: number;
66
+ readonly promotedAt: string;
67
+ readonly confidence: number;
68
+ readonly evidence: readonly DiscoveredOperationEvidence[];
69
+ }
70
+ export interface PromotedCapability {
71
+ readonly capability: CapabilityManifestEntry;
72
+ readonly promotion: CapabilityPromotionRecord;
73
+ }
74
+ export declare class InMemoryOperationDiscoveryProviderRegistry implements OperationDiscoveryProvider {
75
+ #private;
76
+ readonly id: string;
77
+ constructor(id?: string);
78
+ register(provider: OperationDiscoveryProvider): this;
79
+ unregister(providerId: string): boolean;
80
+ list(): readonly OperationDiscoveryProvider[];
81
+ discover(application: ApplicationExecutionContext): Promise<readonly DiscoveredOperation[]>;
82
+ }
83
+ export declare function operationDiscoveryProvider(input: {
84
+ readonly id: string;
85
+ readonly operations: readonly DiscoveredOperation[];
86
+ }): OperationDiscoveryProvider;
87
+ export declare function promoteDiscoveredOperation(input: {
88
+ readonly operation: DiscoveredOperation;
89
+ readonly capability: PromotedCapabilityOptions;
90
+ readonly promotionId?: string;
91
+ readonly promotedAt?: string;
92
+ }): PromotedCapability;
93
+ //# sourceMappingURL=appboundry-operation-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appboundry-operation-discovery.d.ts","sourceRoot":"","sources":["../src/appboundry-operation-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { validateName } from "../../protocol/dist/index.js";
3
+ export class InMemoryOperationDiscoveryProviderRegistry {
4
+ #providers = new Map();
5
+ id;
6
+ constructor(id = "appboundry.operation-discovery") {
7
+ this.id = id;
8
+ }
9
+ register(provider) {
10
+ if (!provider.id)
11
+ throw new Error("operation discovery provider id must be non-empty");
12
+ if (this.#providers.has(provider.id))
13
+ throw new Error(`operation discovery provider "${provider.id}" is already registered`);
14
+ this.#providers.set(provider.id, provider);
15
+ return this;
16
+ }
17
+ unregister(providerId) {
18
+ return this.#providers.delete(providerId);
19
+ }
20
+ list() {
21
+ return [...this.#providers.values()].sort((left, right) => left.id.localeCompare(right.id));
22
+ }
23
+ async discover(application) {
24
+ const operations = new Map();
25
+ for (const provider of this.list()) {
26
+ for (const operation of await provider.discover(application)) {
27
+ if (!operations.has(operation.id))
28
+ operations.set(operation.id, operation);
29
+ }
30
+ }
31
+ return [...operations.values()].sort(compareDiscoveredOperations);
32
+ }
33
+ }
34
+ export function operationDiscoveryProvider(input) {
35
+ return {
36
+ id: input.id,
37
+ discover() {
38
+ return [...input.operations];
39
+ }
40
+ };
41
+ }
42
+ export function promoteDiscoveredOperation(input) {
43
+ assertCanonicalCapability(input.capability.name, input.capability.version);
44
+ const capability = {
45
+ name: input.capability.name,
46
+ version: input.capability.version,
47
+ kind: input.capability.kind ?? "request",
48
+ ...(input.capability.description ? { description: input.capability.description } : {}),
49
+ inputSchema: input.capability.inputSchema ?? input.operation.input,
50
+ outputSchema: input.capability.outputSchema ?? input.operation.output,
51
+ authorization: input.capability.authorization ?? [],
52
+ ...(input.capability.idempotency ? { idempotency: input.capability.idempotency } : {}),
53
+ ...(input.capability.concurrency ? { concurrency: input.capability.concurrency } : {}),
54
+ ...(input.capability.timeoutMs !== undefined ? { timeoutMs: input.capability.timeoutMs } : {}),
55
+ emits: input.capability.emits ?? [],
56
+ deprecated: input.capability.deprecated ?? false
57
+ };
58
+ return {
59
+ capability,
60
+ promotion: {
61
+ promotionId: input.promotionId ?? `promo_${randomUUID()}`,
62
+ operationId: input.operation.id,
63
+ nativeName: input.operation.nativeName,
64
+ source: input.operation.source,
65
+ ...(input.operation.sourceLocation ? { sourceLocation: input.operation.sourceLocation } : {}),
66
+ invocationSurface: input.operation.invocationSurface,
67
+ canonicalName: capability.name,
68
+ canonicalVersion: capability.version,
69
+ promotedAt: input.promotedAt ?? new Date().toISOString(),
70
+ confidence: input.operation.confidence,
71
+ evidence: input.operation.evidence
72
+ }
73
+ };
74
+ }
75
+ function assertCanonicalCapability(name, version) {
76
+ const validation = validateName(name);
77
+ if (!validation.valid)
78
+ throw new Error(`Invalid canonical capability name "${name}": ${validation.reason}`);
79
+ if (!Number.isInteger(version) || version < 1) {
80
+ throw new Error(`Canonical capability ${name} must declare a positive integer version`);
81
+ }
82
+ }
83
+ function compareDiscoveredOperations(left, right) {
84
+ return (left.nativeName.localeCompare(right.nativeName) ||
85
+ left.source.localeCompare(right.source) ||
86
+ right.confidence - left.confidence ||
87
+ left.id.localeCompare(right.id));
88
+ }
89
+ //# sourceMappingURL=appboundry-operation-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appboundry-operation-discovery.js","sourceRoot":"","sources":["../src/appboundry-operation-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import type { JsonValue, MaterializationRequest } from "../../protocol/dist/index.d.ts";
2
+ import type { CapabilityContext } from "./context.js";
3
+ import type { AppBoundryExecutionEvidence } from "./appboundry-materialization.js";
4
+ export type UsageOutcome = "success" | "failure";
5
+ export interface AppBoundryUsageRecord {
6
+ readonly applicationId: string;
7
+ readonly executionId: string;
8
+ readonly executionMode: "managed";
9
+ readonly capability: string;
10
+ readonly startedAt: string;
11
+ readonly durationMs: number;
12
+ readonly requests: 1;
13
+ readonly memoryMb: number;
14
+ readonly stateOperations: number;
15
+ readonly status: "success" | "failure";
16
+ }
17
+ export interface AppBoundryUsageSummary {
18
+ readonly applicationId: string;
19
+ readonly managedExecutions: number;
20
+ readonly requests: number;
21
+ readonly computeTimeMs: number;
22
+ readonly stateOperations: number;
23
+ readonly successful: number;
24
+ readonly failed: number;
25
+ }
26
+ export interface UsageEvent {
27
+ readonly id: string;
28
+ readonly organizationId: string;
29
+ readonly consumerId: string;
30
+ readonly consumerApplicationId?: string;
31
+ readonly providerId: string;
32
+ readonly providerOrganizationId: string;
33
+ readonly providerApplicationId?: string;
34
+ readonly capability: string;
35
+ readonly capabilityVersion: string;
36
+ readonly environment: string;
37
+ readonly invocationId: string;
38
+ readonly evidenceId?: string;
39
+ readonly timestamp: string;
40
+ readonly outcome: UsageOutcome;
41
+ readonly quantity: number;
42
+ readonly unit: string;
43
+ readonly metadata?: Readonly<Record<string, JsonValue>>;
44
+ }
45
+ export interface UsageMeasurement {
46
+ readonly quantity: number;
47
+ readonly unit: string;
48
+ readonly metadata?: Readonly<Record<string, JsonValue>>;
49
+ }
50
+ export interface UsageMeterInput {
51
+ readonly outcome: UsageOutcome;
52
+ readonly requestId: string;
53
+ readonly executionId: string;
54
+ readonly context: CapabilityContext;
55
+ readonly materializationRequest: MaterializationRequest;
56
+ readonly evidence: AppBoundryExecutionEvidence;
57
+ }
58
+ export type UsageMeter = (input: UsageMeterInput) => UsageMeasurement | Promise<UsageMeasurement>;
59
+ export interface UsageCaptureOverrides {
60
+ readonly id?: string;
61
+ readonly organizationId?: string;
62
+ readonly consumerId?: string;
63
+ readonly consumerApplicationId?: string;
64
+ readonly providerId?: string;
65
+ readonly providerOrganizationId?: string;
66
+ readonly providerApplicationId?: string;
67
+ readonly environment?: string;
68
+ readonly evidenceId?: string;
69
+ readonly timestamp?: string;
70
+ readonly quantity?: number;
71
+ readonly unit?: string;
72
+ readonly metadata?: Readonly<Record<string, JsonValue>>;
73
+ }
74
+ export interface UsageEventSink {
75
+ record(event: UsageEvent): Promise<void> | void;
76
+ }
77
+ export declare class InMemoryUsageEventSink implements UsageEventSink {
78
+ #private;
79
+ record(event: UsageEvent): void;
80
+ list(): readonly UsageEvent[];
81
+ }
82
+ export declare function defaultUsageMeter(): UsageMeasurement;
83
+ export declare function createUsageEvent(input: {
84
+ readonly outcome: UsageOutcome;
85
+ readonly requestId: string;
86
+ readonly executionId: string;
87
+ readonly context: CapabilityContext;
88
+ readonly materializationRequest: MaterializationRequest;
89
+ readonly evidence: AppBoundryExecutionEvidence;
90
+ readonly measurement?: UsageMeasurement;
91
+ readonly overrides?: UsageCaptureOverrides;
92
+ readonly timestamp?: string;
93
+ }): UsageEvent;
94
+ //# sourceMappingURL=appboundry-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appboundry-usage.d.ts","sourceRoot":"","sources":["../src/appboundry-usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { randomUUID } from "node:crypto";
2
+ export class InMemoryUsageEventSink {
3
+ #events = [];
4
+ record(event) {
5
+ this.#events.push(event);
6
+ }
7
+ list() {
8
+ return [...this.#events];
9
+ }
10
+ }
11
+ export function defaultUsageMeter() {
12
+ return { quantity: 1, unit: "invocation" };
13
+ }
14
+ export function createUsageEvent(input) {
15
+ const materializationContext = input.materializationRequest.context ?? {};
16
+ const measurement = input.measurement ?? defaultUsageMeter();
17
+ const quantity = input.overrides?.quantity ?? measurement.quantity;
18
+ const unit = input.overrides?.unit ?? measurement.unit;
19
+ if (!Number.isFinite(quantity) || quantity < 0)
20
+ throw new Error("usage quantity must be a finite non-negative number");
21
+ if (!unit)
22
+ throw new Error("usage unit must be non-empty");
23
+ const metadata = mergeMetadata(measurement.metadata, input.overrides?.metadata);
24
+ const event = {
25
+ id: input.overrides?.id ?? `use_${randomUUID()}`,
26
+ organizationId: input.overrides?.organizationId ??
27
+ stringField(materializationContext, "organizationId") ??
28
+ stringField(materializationContext, "consumerOrganizationId") ??
29
+ input.evidence.consumerApplicationId,
30
+ consumerId: input.overrides?.consumerId ??
31
+ stringField(materializationContext, "consumerId") ??
32
+ input.context.principal?.id ??
33
+ input.context.authorization.principal?.id ??
34
+ input.evidence.consumerApplicationId,
35
+ ...(input.overrides?.consumerApplicationId ?? input.evidence.consumerApplicationId
36
+ ? { consumerApplicationId: input.overrides?.consumerApplicationId ?? input.evidence.consumerApplicationId }
37
+ : {}),
38
+ providerId: input.overrides?.providerId ??
39
+ stringField(materializationContext, "providerId") ??
40
+ input.evidence.providerApplicationId,
41
+ providerOrganizationId: input.overrides?.providerOrganizationId ??
42
+ stringField(materializationContext, "providerOrganizationId") ??
43
+ input.evidence.providerApplicationId,
44
+ ...(input.overrides?.providerApplicationId ?? input.evidence.providerApplicationId
45
+ ? { providerApplicationId: input.overrides?.providerApplicationId ?? input.evidence.providerApplicationId }
46
+ : {}),
47
+ capability: input.evidence.capability.name,
48
+ capabilityVersion: String(input.evidence.capability.version),
49
+ environment: input.overrides?.environment ??
50
+ input.evidence.resolvedEnvironment ??
51
+ input.evidence.resolvedTarget ??
52
+ input.evidence.requestedTarget,
53
+ invocationId: input.executionId,
54
+ evidenceId: input.overrides?.evidenceId ?? input.evidence.executionId,
55
+ timestamp: input.overrides?.timestamp ?? input.timestamp ?? new Date().toISOString(),
56
+ outcome: input.outcome,
57
+ quantity,
58
+ unit,
59
+ ...(metadata ? { metadata } : {})
60
+ };
61
+ return deepFreeze(event);
62
+ }
63
+ function stringField(record, key) {
64
+ const value = record[key];
65
+ return typeof value === "string" && value.length > 0 ? value : undefined;
66
+ }
67
+ function mergeMetadata(base, override) {
68
+ if (!base && !override)
69
+ return undefined;
70
+ return deepFreeze({ ...(base ?? {}), ...(override ?? {}) });
71
+ }
72
+ function deepFreeze(value) {
73
+ if (value && typeof value === "object" && !Object.isFrozen(value)) {
74
+ for (const item of Object.values(value))
75
+ deepFreeze(item);
76
+ Object.freeze(value);
77
+ }
78
+ return value;
79
+ }
80
+ //# sourceMappingURL=appboundry-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appboundry-usage.js","sourceRoot":"","sources":["../src/appboundry-usage.ts"],"names":[],"mappings":"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"}