@seamward/cli 0.1.0-alpha.10
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/LICENSE +31 -0
- package/README.md +428 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.js +659 -0
- package/dist/cli.js.map +1 -0
- package/dist/connection-key.d.ts +5 -0
- package/dist/connection-key.js +6 -0
- package/dist/connection-key.js.map +1 -0
- package/dist/contract-sync.d.ts +134 -0
- package/dist/contract-sync.js +603 -0
- package/dist/contract-sync.js.map +1 -0
- package/dist/discovery.d.ts +47 -0
- package/dist/discovery.js +496 -0
- package/dist/discovery.js.map +1 -0
- package/dist/existing-webhook-binding.d.ts +9 -0
- package/dist/existing-webhook-binding.js +196 -0
- package/dist/existing-webhook-binding.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/observation-sync.d.ts +28 -0
- package/dist/observation-sync.js +101 -0
- package/dist/observation-sync.js.map +1 -0
- package/dist/project-metadata.d.ts +7 -0
- package/dist/project-metadata.js +104 -0
- package/dist/project-metadata.js.map +1 -0
- package/dist/remote-api.d.ts +10 -0
- package/dist/remote-api.js +61 -0
- package/dist/remote-api.js.map +1 -0
- package/dist/setup-engine.d.ts +127 -0
- package/dist/setup-engine.js +765 -0
- package/dist/setup-engine.js.map +1 -0
- package/dist/setup-plan.d.ts +197 -0
- package/dist/setup-plan.js +1240 -0
- package/dist/setup-plan.js.map +1 -0
- package/dist/source-instrumentation.d.ts +10 -0
- package/dist/source-instrumentation.js +291 -0
- package/dist/source-instrumentation.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/examples/node-service/README.md +42 -0
- package/examples/node-service/contracts/orders.openapi.yaml +18 -0
- package/examples/node-service/package.json +11 -0
- package/examples/node-service/src/server.ts +13 -0
- package/package.json +58 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
function scriptKind(file) {
|
|
3
|
+
if (/\.tsx$/i.test(file))
|
|
4
|
+
return ts.ScriptKind.TSX;
|
|
5
|
+
if (/\.jsx$/i.test(file))
|
|
6
|
+
return ts.ScriptKind.JSX;
|
|
7
|
+
if (/\.[cm]?js$/i.test(file))
|
|
8
|
+
return ts.ScriptKind.JS;
|
|
9
|
+
return ts.ScriptKind.TS;
|
|
10
|
+
}
|
|
11
|
+
function lineOf(source, node) {
|
|
12
|
+
return source.getLineAndCharacterOfPosition(node.getStart(source)).line + 1;
|
|
13
|
+
}
|
|
14
|
+
function webhookRouteCall(source, line, targetHint) {
|
|
15
|
+
const routeCalls = [];
|
|
16
|
+
const visit = (node) => {
|
|
17
|
+
if (!ts.isCallExpression(node)) {
|
|
18
|
+
ts.forEachChild(node, visit);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (ts.isPropertyAccessExpression(node.expression) &&
|
|
22
|
+
["delete", "get", "patch", "post", "put"].includes(node.expression.name.text)) {
|
|
23
|
+
routeCalls.push(node);
|
|
24
|
+
}
|
|
25
|
+
ts.forEachChild(node, visit);
|
|
26
|
+
};
|
|
27
|
+
visit(source);
|
|
28
|
+
const normalizedHint = targetHint ? normalizeRoute(targetHint) : null;
|
|
29
|
+
const lineMatch = routeCalls.find((call) => lineOf(source, call) === line);
|
|
30
|
+
if (lineMatch)
|
|
31
|
+
return lineMatch;
|
|
32
|
+
if (!normalizedHint)
|
|
33
|
+
return null;
|
|
34
|
+
const routeMatches = routeCalls.filter((call) => normalizeRoute(literalText(call.arguments[0]) ?? "") === normalizedHint);
|
|
35
|
+
return routeMatches.length === 1 ? routeMatches[0] : null;
|
|
36
|
+
}
|
|
37
|
+
function normalizeRoute(value) {
|
|
38
|
+
if (!value)
|
|
39
|
+
return "";
|
|
40
|
+
try {
|
|
41
|
+
return new URL(value).pathname || "/";
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function literalText(node) {
|
|
48
|
+
return node &&
|
|
49
|
+
(ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node))
|
|
50
|
+
? node.text
|
|
51
|
+
: null;
|
|
52
|
+
}
|
|
53
|
+
function routeTemplateValue(metadata) {
|
|
54
|
+
if (!metadata || !ts.isObjectLiteralExpression(metadata))
|
|
55
|
+
return null;
|
|
56
|
+
for (const property of metadata.properties) {
|
|
57
|
+
if (ts.isPropertyAssignment(property) &&
|
|
58
|
+
((ts.isIdentifier(property.name) &&
|
|
59
|
+
property.name.text === "routeTemplate") ||
|
|
60
|
+
(ts.isStringLiteral(property.name) &&
|
|
61
|
+
property.name.text === "routeTemplate"))) {
|
|
62
|
+
return property.initializer;
|
|
63
|
+
}
|
|
64
|
+
if (ts.isShorthandPropertyAssignment(property) &&
|
|
65
|
+
property.name.text === "routeTemplate") {
|
|
66
|
+
return property.name;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
function isObserveWebhookCall(call) {
|
|
72
|
+
return (ts.isPropertyAccessExpression(call.expression) &&
|
|
73
|
+
call.expression.name.text === "observeWebhook");
|
|
74
|
+
}
|
|
75
|
+
function containsBoundObserveWebhook(node, target, routeParameter) {
|
|
76
|
+
let found = false;
|
|
77
|
+
const visit = (candidate) => {
|
|
78
|
+
if (found)
|
|
79
|
+
return;
|
|
80
|
+
if (ts.isCallExpression(candidate) && isObserveWebhookCall(candidate)) {
|
|
81
|
+
const routeValue = routeTemplateValue(candidate.arguments[0]);
|
|
82
|
+
if (literalText(routeValue ?? undefined) === target ||
|
|
83
|
+
(routeParameter &&
|
|
84
|
+
routeValue &&
|
|
85
|
+
ts.isIdentifier(routeValue) &&
|
|
86
|
+
routeValue.text === routeParameter)) {
|
|
87
|
+
found = true;
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
ts.forEachChild(candidate, visit);
|
|
92
|
+
};
|
|
93
|
+
visit(node);
|
|
94
|
+
return found;
|
|
95
|
+
}
|
|
96
|
+
function referencedIdentifiers(node) {
|
|
97
|
+
const identifiers = new Set();
|
|
98
|
+
const visit = (candidate) => {
|
|
99
|
+
if (ts.isIdentifier(candidate))
|
|
100
|
+
identifiers.add(candidate.text);
|
|
101
|
+
ts.forEachChild(candidate, visit);
|
|
102
|
+
};
|
|
103
|
+
visit(node);
|
|
104
|
+
return identifiers;
|
|
105
|
+
}
|
|
106
|
+
function namedVariableInitializers(source, names) {
|
|
107
|
+
const declarations = [];
|
|
108
|
+
const visit = (node) => {
|
|
109
|
+
if (ts.isVariableDeclaration(node) &&
|
|
110
|
+
ts.isIdentifier(node.name) &&
|
|
111
|
+
names.has(node.name.text) &&
|
|
112
|
+
node.initializer) {
|
|
113
|
+
declarations.push({
|
|
114
|
+
name: node.name.text,
|
|
115
|
+
initializer: node.initializer,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
ts.forEachChild(node, visit);
|
|
119
|
+
};
|
|
120
|
+
visit(source);
|
|
121
|
+
return declarations;
|
|
122
|
+
}
|
|
123
|
+
function namedFunctions(source, name) {
|
|
124
|
+
const declarations = [];
|
|
125
|
+
const visit = (node) => {
|
|
126
|
+
if (ts.isFunctionDeclaration(node) &&
|
|
127
|
+
node.name?.text === name &&
|
|
128
|
+
node.body) {
|
|
129
|
+
declarations.push(node);
|
|
130
|
+
}
|
|
131
|
+
if (ts.isVariableDeclaration(node) &&
|
|
132
|
+
ts.isIdentifier(node.name) &&
|
|
133
|
+
node.name.text === name &&
|
|
134
|
+
node.initializer &&
|
|
135
|
+
(ts.isArrowFunction(node.initializer) ||
|
|
136
|
+
ts.isFunctionExpression(node.initializer))) {
|
|
137
|
+
declarations.push(node.initializer);
|
|
138
|
+
}
|
|
139
|
+
ts.forEachChild(node, visit);
|
|
140
|
+
};
|
|
141
|
+
visit(source);
|
|
142
|
+
return declarations;
|
|
143
|
+
}
|
|
144
|
+
function factoryBindsRoute(source, initializer, target) {
|
|
145
|
+
if (!ts.isIdentifier(initializer.expression))
|
|
146
|
+
return null;
|
|
147
|
+
if (literalText(initializer.arguments[0]) !== target)
|
|
148
|
+
return null;
|
|
149
|
+
const factoryName = initializer.expression.text;
|
|
150
|
+
for (const factory of namedFunctions(source, factoryName)) {
|
|
151
|
+
const routeParameter = factory.parameters[0]?.name;
|
|
152
|
+
if (!routeParameter ||
|
|
153
|
+
!ts.isIdentifier(routeParameter) ||
|
|
154
|
+
!factory.body ||
|
|
155
|
+
!containsBoundObserveWebhook(factory.body, target, routeParameter.text)) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
return factoryName;
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
export function findExistingWebhookBinding(input) {
|
|
163
|
+
const source = ts.createSourceFile(input.file, input.content, ts.ScriptTarget.Latest, true, scriptKind(input.file));
|
|
164
|
+
const routeCall = webhookRouteCall(source, input.line, input.targetHint);
|
|
165
|
+
if (!routeCall)
|
|
166
|
+
return null;
|
|
167
|
+
const target = literalText(routeCall.arguments[0]);
|
|
168
|
+
const handler = routeCall.arguments.at(-1);
|
|
169
|
+
if (!target || !handler)
|
|
170
|
+
return null;
|
|
171
|
+
if (containsBoundObserveWebhook(handler, target)) {
|
|
172
|
+
return {
|
|
173
|
+
marker: `existing collector backed for ${JSON.stringify(target)} via handler`,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
const identifiers = referencedIdentifiers(handler);
|
|
177
|
+
for (const declaration of namedVariableInitializers(source, identifiers)) {
|
|
178
|
+
if (ts.isCallExpression(declaration.initializer) &&
|
|
179
|
+
isObserveWebhookCall(declaration.initializer) &&
|
|
180
|
+
containsBoundObserveWebhook(declaration.initializer, target)) {
|
|
181
|
+
return {
|
|
182
|
+
marker: `existing collector backed for ${JSON.stringify(target)} via ${declaration.name}`,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
if (ts.isCallExpression(declaration.initializer)) {
|
|
186
|
+
const factoryName = factoryBindsRoute(source, declaration.initializer, target);
|
|
187
|
+
if (factoryName) {
|
|
188
|
+
return {
|
|
189
|
+
marker: `existing collector backed for ${JSON.stringify(target)} via ${declaration.name}:${factoryName}`,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=existing-webhook-binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"existing-webhook-binding.js","sourceRoot":"","sources":["../src/existing-webhook-binding.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { discoverSources, scanProject, type ContractArtifact, type DiscoveryConfidence, type DiscoveryDirection, type DiscoveryFinding, type DiscoveryKind, type DiscoveryLanguage, type DiscoveryProtocol, type DiscoveryResult, type ScanProjectOptions, type SourceInput, } from "./discovery.js";
|
|
2
|
+
export { applySetupPlan, completedSetupActionIds, createSetupPlan, discoverIntegrationScopes, discoverIntegrationGroups, isAutomaticIntegrationGroup, inspectSetupPlanFiles, inspectSetupActionEvidence, inspectSetupCompletionState, inspectSetupIntegrationBinding, inspectSetupRemoteLifecycle, operatorReviewableSetupActions, recordSourceBackedSetupEvidence, recordSetupIntegrationBinding, registeredContractVersionIdForFile, registeredContractVersionIdsForPlan, resetSetupCompletionState, setupCompletionStateFingerprint, setupInstrumentationMarker, supportedCollectorVersion, reviewSetupActions, type ApplySetupOptions, type ApplySetupResult, type GeneratedFile, type IntegrationProtocol, type IntegrationScope, type IntegrationGroup, type PackageManager, type RuntimeTarget, type ReviewSetupActionsResult, type SetupCompletionState, type SetupFileInspection, type SetupAction, type SetupActionCompletion, type SetupActionEvidenceInspection, type SetupActionEvidenceStatus, type SetupImplementationFileEvidence, type SetupVerificationEvidence, type SetupActionMode, type SetupActionType, type SetupPlan, type SetupPlanOptions, type SetupRemoteLifecycleState, } from "./setup-plan.js";
|
|
3
|
+
export { checkFirstSetupObservation, type CheckFirstSetupObservationOptions, type FirstSetupObservationResult, } from "./observation-sync.js";
|
|
4
|
+
export { SeamwardRemoteApiError, type SeamwardRemoteApiErrorCode, } from "./remote-api.js";
|
|
5
|
+
export { applyLocalSetupBatch, createLocalSetupEngine, readSetupPlan, readSetupPlans, retireLocalSetupBindings, verifySetup, LocalSetupEngineError, type LocalSetupEngine, type LocalSetupEngineOptions, type LocalApplyResult, type SetupAnalysis, type SetupSelection, type SetupVerification, } from "./setup-engine.js";
|
|
6
|
+
export { readProjectMetadata, type ProjectMetadata, } from "./project-metadata.js";
|
|
7
|
+
export { activateContractVersion, activatePlanContractVersion, previewPlanContract, previewPlanContractActivation, readContractStatus, readMatchingActivePlanContract, reconcileActivePlanContract, registerPlanContracts, validatePlanContractActivation, type ContractActivationOptions, type ContractActivationResult, type PlanContractActivationOptions, type ContractRegistration, type ContractRegistrationOptions, type ContractRegistrationResult, type ContractStatusResult, type ContractVersionStatus, type JsonSchemaOperationBinding, type MatchingActivePlanContractOptions, type PlanContractStatusOptions, type PlanContractActivationPreview, } from "./contract-sync.js";
|
|
8
|
+
export { parseConnectionKey, type ParsedConnectionKey, } from "./connection-key.js";
|
|
9
|
+
export { cliVersion } from "./version.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { discoverSources, scanProject, } from "./discovery.js";
|
|
2
|
+
export { applySetupPlan, completedSetupActionIds, createSetupPlan, discoverIntegrationScopes, discoverIntegrationGroups, isAutomaticIntegrationGroup, inspectSetupPlanFiles, inspectSetupActionEvidence, inspectSetupCompletionState, inspectSetupIntegrationBinding, inspectSetupRemoteLifecycle, operatorReviewableSetupActions, recordSourceBackedSetupEvidence, recordSetupIntegrationBinding, registeredContractVersionIdForFile, registeredContractVersionIdsForPlan, resetSetupCompletionState, setupCompletionStateFingerprint, setupInstrumentationMarker, supportedCollectorVersion, reviewSetupActions, } from "./setup-plan.js";
|
|
3
|
+
export { checkFirstSetupObservation, } from "./observation-sync.js";
|
|
4
|
+
export { SeamwardRemoteApiError, } from "./remote-api.js";
|
|
5
|
+
export { applyLocalSetupBatch, createLocalSetupEngine, readSetupPlan, readSetupPlans, retireLocalSetupBindings, verifySetup, LocalSetupEngineError, } from "./setup-engine.js";
|
|
6
|
+
export { readProjectMetadata, } from "./project-metadata.js";
|
|
7
|
+
export { activateContractVersion, activatePlanContractVersion, previewPlanContract, previewPlanContractActivation, readContractStatus, readMatchingActivePlanContract, reconcileActivePlanContract, registerPlanContracts, validatePlanContractActivation, } from "./contract-sync.js";
|
|
8
|
+
export { parseConnectionKey, } from "./connection-key.js";
|
|
9
|
+
export { cliVersion } from "./version.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,WAAW,GAWZ,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,eAAe,EACf,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC3B,8BAA8B,EAC9B,2BAA2B,EAC3B,8BAA8B,EAC9B,+BAA+B,EAC/B,6BAA6B,EAC7B,kCAAkC,EAClC,mCAAmC,EACnC,yBAAyB,EACzB,+BAA+B,EAC/B,0BAA0B,EAC1B,yBAAyB,EACzB,kBAAkB,GAuBnB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,0BAA0B,GAG3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,sBAAsB,GAEvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,aAAa,EACb,cAAc,EACd,wBAAwB,EACxB,WAAW,EACX,qBAAqB,GAOtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,mBAAmB,GAEpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,mBAAmB,EACnB,6BAA6B,EAC7B,kBAAkB,EAClB,8BAA8B,EAC9B,2BAA2B,EAC3B,qBAAqB,EACrB,8BAA8B,GAa/B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type SetupPlan } from "./setup-plan.js";
|
|
2
|
+
export type FirstSetupObservationResult = {
|
|
3
|
+
status: "source_verification_required";
|
|
4
|
+
} | {
|
|
5
|
+
status: "contract_activation_required";
|
|
6
|
+
} | {
|
|
7
|
+
status: "waiting";
|
|
8
|
+
integrationId: string;
|
|
9
|
+
checkedFrom: string;
|
|
10
|
+
} | {
|
|
11
|
+
status: "observed";
|
|
12
|
+
integrationId: string;
|
|
13
|
+
observation: {
|
|
14
|
+
id: string;
|
|
15
|
+
receivedAt: string;
|
|
16
|
+
};
|
|
17
|
+
scope: "integration_connection";
|
|
18
|
+
recorded: boolean;
|
|
19
|
+
};
|
|
20
|
+
export interface CheckFirstSetupObservationOptions {
|
|
21
|
+
apiKey: string;
|
|
22
|
+
connectionKey: string;
|
|
23
|
+
endpoint?: string;
|
|
24
|
+
fetchFn?: typeof fetch;
|
|
25
|
+
timeoutMs?: number;
|
|
26
|
+
write?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare function checkFirstSetupObservation(plan: SetupPlan, root: string, options: CheckFirstSetupObservationOptions): Promise<FirstSetupObservationResult>;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { parseConnectionKey } from "./connection-key.js";
|
|
2
|
+
import { remoteInvalidResponse, remoteNetworkError, remoteResponseError, } from "./remote-api.js";
|
|
3
|
+
import { readContractStatus } from "./contract-sync.js";
|
|
4
|
+
import { inspectSetupActionEvidence, inspectSetupRemoteLifecycle, recordFirstSetupObservation, } from "./setup-plan.js";
|
|
5
|
+
function managementEndpoint(value) {
|
|
6
|
+
const url = new URL(value);
|
|
7
|
+
const loopback = ["localhost", "127.0.0.1", "::1"].includes(url.hostname);
|
|
8
|
+
if (url.protocol !== "https:" && !(url.protocol === "http:" && loopback)) {
|
|
9
|
+
throw new Error("Management API must use HTTPS unless it is local");
|
|
10
|
+
}
|
|
11
|
+
url.pathname = url.pathname.replace(/\/$/, "");
|
|
12
|
+
url.search = "";
|
|
13
|
+
url.hash = "";
|
|
14
|
+
return url.toString().replace(/\/$/, "");
|
|
15
|
+
}
|
|
16
|
+
function laterTimestamp(left, right) {
|
|
17
|
+
return right && Date.parse(right) > Date.parse(left) ? right : left;
|
|
18
|
+
}
|
|
19
|
+
export async function checkFirstSetupObservation(plan, root, options) {
|
|
20
|
+
if (!options.apiKey || !options.connectionKey) {
|
|
21
|
+
throw new Error("A Connection key and scoped API key are required");
|
|
22
|
+
}
|
|
23
|
+
const evidence = await inspectSetupActionEvidence(plan, root);
|
|
24
|
+
const instrumentationEvidence = evidence.filter(({ actionType }) => actionType === "instrument_operation");
|
|
25
|
+
if (instrumentationEvidence.length === 0 ||
|
|
26
|
+
instrumentationEvidence.some(({ status, recordedAt }) => status !== "source_verified" || !recordedAt)) {
|
|
27
|
+
return { status: "source_verification_required" };
|
|
28
|
+
}
|
|
29
|
+
const sourceEvidence = instrumentationEvidence
|
|
30
|
+
.map((action) => action.recordedAt)
|
|
31
|
+
.sort()
|
|
32
|
+
.at(-1);
|
|
33
|
+
if (!sourceEvidence)
|
|
34
|
+
return { status: "source_verification_required" };
|
|
35
|
+
const contractActions = evidence.filter(({ actionType }) => actionType === "register_contract");
|
|
36
|
+
const lifecycle = await inspectSetupRemoteLifecycle(plan, root);
|
|
37
|
+
if (contractActions.length > 0 && !lifecycle.activation) {
|
|
38
|
+
return { status: "contract_activation_required" };
|
|
39
|
+
}
|
|
40
|
+
if (contractActions.length > 0 && lifecycle.activation) {
|
|
41
|
+
const status = await readContractStatus({
|
|
42
|
+
apiKey: options.apiKey,
|
|
43
|
+
connectionKey: options.connectionKey,
|
|
44
|
+
...(options.endpoint ? { endpoint: options.endpoint } : {}),
|
|
45
|
+
...(options.fetchFn ? { fetchFn: options.fetchFn } : {}),
|
|
46
|
+
...(options.timeoutMs ? { timeoutMs: options.timeoutMs } : {}),
|
|
47
|
+
});
|
|
48
|
+
if (status.activeContractVersionId !== lifecycle.activation.contractVersionId) {
|
|
49
|
+
return { status: "contract_activation_required" };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const checkedFrom = laterTimestamp(sourceEvidence, lifecycle.activation?.recordedAt);
|
|
53
|
+
const { integrationId } = parseConnectionKey(options.connectionKey);
|
|
54
|
+
const query = new URLSearchParams({
|
|
55
|
+
integrationId,
|
|
56
|
+
from: checkedFrom,
|
|
57
|
+
limit: "1",
|
|
58
|
+
sortBy: "receivedAt",
|
|
59
|
+
sortOrder: "asc",
|
|
60
|
+
});
|
|
61
|
+
const endpoint = managementEndpoint(options.endpoint ?? "https://api.seamward.com");
|
|
62
|
+
let response;
|
|
63
|
+
try {
|
|
64
|
+
response = await (options.fetchFn ?? fetch)(`${endpoint}/v1/observations?${query}`, {
|
|
65
|
+
headers: { authorization: `Bearer ${options.apiKey}` },
|
|
66
|
+
signal: AbortSignal.timeout(options.timeoutMs ?? 15_000),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
throw remoteNetworkError();
|
|
71
|
+
}
|
|
72
|
+
if (response.status !== 200)
|
|
73
|
+
throw await remoteResponseError(response);
|
|
74
|
+
const payload = (await response.json());
|
|
75
|
+
if (!Array.isArray(payload.observations)) {
|
|
76
|
+
throw remoteInvalidResponse();
|
|
77
|
+
}
|
|
78
|
+
const observation = payload.observations[0];
|
|
79
|
+
if (!observation)
|
|
80
|
+
return { status: "waiting", integrationId, checkedFrom };
|
|
81
|
+
if (typeof observation.id !== "string" ||
|
|
82
|
+
typeof observation.receivedAt !== "string" ||
|
|
83
|
+
!Number.isFinite(Date.parse(observation.receivedAt))) {
|
|
84
|
+
throw remoteInvalidResponse();
|
|
85
|
+
}
|
|
86
|
+
if (options.write) {
|
|
87
|
+
await recordFirstSetupObservation(plan, root, {
|
|
88
|
+
integrationId,
|
|
89
|
+
observationId: observation.id,
|
|
90
|
+
receivedAt: observation.receivedAt,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
status: "observed",
|
|
95
|
+
integrationId,
|
|
96
|
+
observation: { id: observation.id, receivedAt: observation.receivedAt },
|
|
97
|
+
scope: "integration_connection",
|
|
98
|
+
recorded: options.write === true,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=observation-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observation-sync.js","sourceRoot":"","sources":["../src/observation-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PackageManager, RuntimeTarget } from "./setup-plan.js";
|
|
2
|
+
export interface ProjectMetadata {
|
|
3
|
+
projectName: string;
|
|
4
|
+
packageManager: PackageManager;
|
|
5
|
+
runtimeTarget: RuntimeTarget;
|
|
6
|
+
}
|
|
7
|
+
export declare function readProjectMetadata(root: string): Promise<ProjectMetadata>;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { access, readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { parse as parseYaml } from "yaml";
|
|
4
|
+
async function exists(file) {
|
|
5
|
+
try {
|
|
6
|
+
await access(file);
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
async function pnpmWorkspaceContainsMultipleServices(root) {
|
|
14
|
+
const workspaceFile = path.join(root, "pnpm-workspace.yaml");
|
|
15
|
+
if (!(await exists(workspaceFile)))
|
|
16
|
+
return false;
|
|
17
|
+
try {
|
|
18
|
+
const parsed = parseYaml(await readFile(workspaceFile, "utf8"));
|
|
19
|
+
if (!Array.isArray(parsed?.packages) || parsed.packages.length === 0) {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
return parsed.packages.some((entry) => typeof entry !== "string" || ![".", "./"].includes(entry.trim()));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export async function readProjectMetadata(root) {
|
|
29
|
+
let projectName = path.basename(root);
|
|
30
|
+
let runtimeTarget = "unknown";
|
|
31
|
+
let packageDocument;
|
|
32
|
+
try {
|
|
33
|
+
packageDocument = JSON.parse(await readFile(path.join(root, "package.json"), "utf8"));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// A package manifest is optional for discovery-only and non-Node projects.
|
|
37
|
+
}
|
|
38
|
+
const workspaceMarkers = ["lerna.json", "rush.json", "go.work"];
|
|
39
|
+
let pythonWorkspace = false;
|
|
40
|
+
try {
|
|
41
|
+
pythonWorkspace = /^\[tool\.uv\.workspace\]\s*$/m.test(await readFile(path.join(root, "pyproject.toml"), "utf8"));
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Python projects do not require a pyproject file.
|
|
45
|
+
}
|
|
46
|
+
if (packageDocument?.workspaces ||
|
|
47
|
+
pythonWorkspace ||
|
|
48
|
+
(await pnpmWorkspaceContainsMultipleServices(root)) ||
|
|
49
|
+
(await Promise.all(workspaceMarkers.map((file) => exists(path.join(root, file))))).some(Boolean)) {
|
|
50
|
+
throw new Error("A workspace root contains multiple services. Run Seamward from one service directory");
|
|
51
|
+
}
|
|
52
|
+
if (packageDocument) {
|
|
53
|
+
if (typeof packageDocument.name === "string" &&
|
|
54
|
+
packageDocument.name.trim()) {
|
|
55
|
+
projectName = packageDocument.name.trim();
|
|
56
|
+
}
|
|
57
|
+
const dependencies = {
|
|
58
|
+
...packageDocument.dependencies,
|
|
59
|
+
...packageDocument.devDependencies,
|
|
60
|
+
};
|
|
61
|
+
const serverPackages = [
|
|
62
|
+
"@nestjs/core",
|
|
63
|
+
"@types/node",
|
|
64
|
+
"express",
|
|
65
|
+
"fastify",
|
|
66
|
+
"hapi",
|
|
67
|
+
"koa",
|
|
68
|
+
];
|
|
69
|
+
const nodeDeclared = typeof packageDocument.engines?.node === "string" ||
|
|
70
|
+
serverPackages.some((name) => typeof dependencies[name] === "string");
|
|
71
|
+
const edgePackages = [
|
|
72
|
+
"@cloudflare/workers-types",
|
|
73
|
+
"@vercel/edge",
|
|
74
|
+
"edge-runtime",
|
|
75
|
+
"workerd",
|
|
76
|
+
"wrangler",
|
|
77
|
+
];
|
|
78
|
+
const edgeMarkers = [
|
|
79
|
+
"deno.json",
|
|
80
|
+
"deno.jsonc",
|
|
81
|
+
"wrangler.json",
|
|
82
|
+
"wrangler.jsonc",
|
|
83
|
+
"wrangler.toml",
|
|
84
|
+
];
|
|
85
|
+
const edgeTarget = edgePackages.some((name) => typeof dependencies[name] === "string") ||
|
|
86
|
+
(await Promise.all(edgeMarkers.map((file) => exists(path.join(root, file))))).some(Boolean);
|
|
87
|
+
const browserTarget = packageDocument.browser !== undefined &&
|
|
88
|
+
packageDocument.browser !== false;
|
|
89
|
+
if (!browserTarget && !edgeTarget && nodeDeclared) {
|
|
90
|
+
runtimeTarget =
|
|
91
|
+
packageDocument.type === "module" ? "node-esm" : "node-commonjs";
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const packageManager = (await exists(path.join(root, "pnpm-lock.yaml")))
|
|
95
|
+
? "pnpm"
|
|
96
|
+
: (await exists(path.join(root, "yarn.lock")))
|
|
97
|
+
? "yarn"
|
|
98
|
+
: (await exists(path.join(root, "bun.lockb"))) ||
|
|
99
|
+
(await exists(path.join(root, "bun.lock")))
|
|
100
|
+
? "bun"
|
|
101
|
+
: "npm";
|
|
102
|
+
return { projectName, packageManager, runtimeTarget };
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=project-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-metadata.js","sourceRoot":"","sources":["../src/project-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type SeamwardRemoteApiErrorCode = "authentication_required" | "insufficient_scope" | "not_found" | "contract_activation_conflict" | "integration_scope_mismatch" | "contract_version_conflict" | "remote_conflict" | "rate_limited" | "service_unavailable" | "remote_request_failed" | "remote_response_invalid";
|
|
2
|
+
export declare class SeamwardRemoteApiError extends Error {
|
|
3
|
+
readonly code: SeamwardRemoteApiErrorCode;
|
|
4
|
+
readonly retryable: boolean;
|
|
5
|
+
readonly status: number | null;
|
|
6
|
+
constructor(code: SeamwardRemoteApiErrorCode, retryable: boolean, status: number | null);
|
|
7
|
+
}
|
|
8
|
+
export declare function remoteResponseError(response: Response): Promise<SeamwardRemoteApiError>;
|
|
9
|
+
export declare function remoteNetworkError(): SeamwardRemoteApiError;
|
|
10
|
+
export declare function remoteInvalidResponse(): SeamwardRemoteApiError;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export class SeamwardRemoteApiError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
retryable;
|
|
4
|
+
status;
|
|
5
|
+
constructor(code, retryable, status) {
|
|
6
|
+
super(code);
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.retryable = retryable;
|
|
9
|
+
this.status = status;
|
|
10
|
+
this.name = "SeamwardRemoteApiError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
async function stableResponseCode(response) {
|
|
14
|
+
try {
|
|
15
|
+
const body = (await response.json());
|
|
16
|
+
return typeof body.error === "string" &&
|
|
17
|
+
/^[a-z0-9_]{1,80}$/.test(body.error)
|
|
18
|
+
? body.error
|
|
19
|
+
: null;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function remoteResponseError(response) {
|
|
26
|
+
const stableCode = await stableResponseCode(response);
|
|
27
|
+
if (response.status === 401) {
|
|
28
|
+
return new SeamwardRemoteApiError("authentication_required", false, 401);
|
|
29
|
+
}
|
|
30
|
+
if (response.status === 403) {
|
|
31
|
+
return new SeamwardRemoteApiError("insufficient_scope", false, 403);
|
|
32
|
+
}
|
|
33
|
+
if (response.status === 404) {
|
|
34
|
+
return new SeamwardRemoteApiError("not_found", false, 404);
|
|
35
|
+
}
|
|
36
|
+
if (response.status === 409) {
|
|
37
|
+
if (stableCode === "integration_scope_mismatch") {
|
|
38
|
+
return new SeamwardRemoteApiError("integration_scope_mismatch", false, 409);
|
|
39
|
+
}
|
|
40
|
+
if (stableCode === "contract_version_conflict") {
|
|
41
|
+
return new SeamwardRemoteApiError("contract_version_conflict", false, 409);
|
|
42
|
+
}
|
|
43
|
+
return new SeamwardRemoteApiError(stableCode === "active_contract_conflict"
|
|
44
|
+
? "contract_activation_conflict"
|
|
45
|
+
: "remote_conflict", false, 409);
|
|
46
|
+
}
|
|
47
|
+
if (response.status === 429) {
|
|
48
|
+
return new SeamwardRemoteApiError("rate_limited", true, 429);
|
|
49
|
+
}
|
|
50
|
+
if (response.status >= 500) {
|
|
51
|
+
return new SeamwardRemoteApiError("service_unavailable", true, response.status);
|
|
52
|
+
}
|
|
53
|
+
return new SeamwardRemoteApiError("remote_request_failed", false, response.status);
|
|
54
|
+
}
|
|
55
|
+
export function remoteNetworkError() {
|
|
56
|
+
return new SeamwardRemoteApiError("service_unavailable", true, null);
|
|
57
|
+
}
|
|
58
|
+
export function remoteInvalidResponse() {
|
|
59
|
+
return new SeamwardRemoteApiError("remote_response_invalid", false, null);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=remote-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-api.js","sourceRoot":"","sources":["../src/remote-api.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAEpC;IACA;IACA;IAHX,YACW,IAAgC,EAChC,SAAkB,EAClB,MAAqB;QAE9B,KAAK,CAAC,IAAI,CAAC,CAAC;QAJH,SAAI,GAAJ,IAAI,CAA4B;QAChC,cAAS,GAAT,SAAS,CAAS;QAClB,WAAM,GAAN,MAAM,CAAe;QAG9B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,KAAK,UAAU,kBAAkB,CAAC,QAAkB;IAClD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;QAC5D,OAAO,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;YACnC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACpC,CAAC,CAAC,IAAI,CAAC,KAAK;YACZ,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAkB;IAElB,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACtD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,IAAI,sBAAsB,CAAC,yBAAyB,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,IAAI,sBAAsB,CAAC,oBAAoB,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,IAAI,sBAAsB,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,IAAI,UAAU,KAAK,4BAA4B,EAAE,CAAC;YAChD,OAAO,IAAI,sBAAsB,CAC/B,4BAA4B,EAC5B,KAAK,EACL,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,IAAI,UAAU,KAAK,2BAA2B,EAAE,CAAC;YAC/C,OAAO,IAAI,sBAAsB,CAC/B,2BAA2B,EAC3B,KAAK,EACL,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,sBAAsB,CAC/B,UAAU,KAAK,0BAA0B;YACvC,CAAC,CAAC,8BAA8B;YAChC,CAAC,CAAC,iBAAiB,EACrB,KAAK,EACL,GAAG,CACJ,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,IAAI,sBAAsB,CAAC,cAAc,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QAC3B,OAAO,IAAI,sBAAsB,CAC/B,qBAAqB,EACrB,IAAI,EACJ,QAAQ,CAAC,MAAM,CAChB,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,sBAAsB,CAC/B,uBAAuB,EACvB,KAAK,EACL,QAAQ,CAAC,MAAM,CAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,sBAAsB,CAAC,qBAAqB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,sBAAsB,CAAC,yBAAyB,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAC5E,CAAC"}
|