@apilift/cli 1.4.19 → 1.4.20
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.
|
@@ -129549,6 +129549,7 @@ var errorCategoryByCode = {
|
|
|
129549
129549
|
"release-state-conflict": "conflict",
|
|
129550
129550
|
"action-withheld": "withheld",
|
|
129551
129551
|
"publication-budget": "limit",
|
|
129552
|
+
"publication-throttled": "limit",
|
|
129552
129553
|
"session-limit": "limit",
|
|
129553
129554
|
"client-upgrade-required": "upgrade",
|
|
129554
129555
|
"backend-unavailable": "unavailable",
|
|
@@ -129773,12 +129774,12 @@ var me = external_exports.strictObject({ account: external_exports.strictObject(
|
|
|
129773
129774
|
var setupStatus = external_exports.strictObject({ linkCode: external_exports.strictObject({ id: uuid3, agent: knownAgent.nullable(), status: external_exports.enum(["pending", "claimed", "expired"]), expiresAt: iso, installationId: uuid3.nullable() }).nullable(), installation: external_exports.strictObject({ id: uuid3, label: str, readiness, steps: data, agents: external_exports.array(knownAgent) }).nullable() });
|
|
129774
129775
|
var actionSummary = external_exports.strictObject({ name: str, title: str, summary: external_exports.string(), effect: external_exports.enum(["read", "create", "update", "delete"]).optional(), availability: external_exports.enum(["executable", "unavailable"]), policy: external_exports.enum(["approve", "deny", "disable"]), health: data, documentation: data.optional() });
|
|
129775
129776
|
var actionDocumentation = external_exports.strictObject({ name: str, title: str, description: external_exports.string(), effect: external_exports.enum(["read", "create", "update", "delete"]).optional(), availability: external_exports.enum(["executable", "unavailable"]), inputs: jsonSchema, output: jsonSchema.optional(), proof: external_exports.enum(["readback", "absence"]).optional(), unavailable: external_exports.strictObject({ reason: str, evidence: str }).optional(), transport: external_exports.strictObject({ name: str, mode: external_exports.enum(["direct", "browser"]), instructions: str, credentials: external_exports.array(external_exports.strictObject({ name: str, header: str })) }).optional(), version: external_exports.number().int().positive(), executableHash: hash2.optional(), policy: external_exports.enum(["approve", "deny", "disable"]), health: data });
|
|
129776
|
-
var bundle = external_exports.strictObject({ decision: external_exports.literal("allow"), app: external_exports.strictObject({ id: uuid3, slug: str, visibility: external_exports.enum(["public", "private"]) }), action: external_exports.strictObject({ name: str, effect: external_exports.enum(["read", "create", "update", "delete"]) }), closure: external_exports.strictObject({ hash: hash2, status: external_exports.enum(["pending", "validated"]), workspaceStatus: external_exports.literal("successful").nullable(), versions: external_exports.array(external_exports.strictObject({ kind: resourceKindSchema, name: str, version: external_exports.number().int().positive(), executableHash: hash2, definition })) }), selection: external_exports.strictObject({ channel: external_exports.enum(["latest", "validated"]), fallback: external_exports.boolean(), replaced: external_exports.strictObject({ closureHash: hash2, reason: str }).optional() }), policy: external_exports.literal("approve") });
|
|
129777
|
+
var bundle = external_exports.strictObject({ receipt: external_exports.strictObject({ id: uuid3, dispatchBefore: iso }).optional(), decision: external_exports.literal("allow"), app: external_exports.strictObject({ id: uuid3, slug: str, visibility: external_exports.enum(["public", "private"]) }), action: external_exports.strictObject({ name: str, effect: external_exports.enum(["read", "create", "update", "delete"]) }), closure: external_exports.strictObject({ hash: hash2, status: external_exports.enum(["pending", "validated"]), workspaceStatus: external_exports.literal("successful").nullable(), versions: external_exports.array(external_exports.strictObject({ kind: resourceKindSchema, name: str, version: external_exports.number().int().positive(), executableHash: hash2, definition })) }), selection: external_exports.strictObject({ channel: external_exports.enum(["latest", "validated"]), fallback: external_exports.boolean(), replaced: external_exports.strictObject({ closureHash: hash2, reason: str, until: iso.optional() }).optional() }), policy: external_exports.literal("approve") });
|
|
129777
129778
|
var resourceRead = external_exports.strictObject({ ...kindName.shape, definition, version: external_exports.number().int().positive(), executableHash: hash2.optional(), verification: data.optional(), dependents: external_exports.array(kindName).optional() });
|
|
129778
|
-
var resourceRequirements = external_exports.strictObject({ name: str, title: str, mode: external_exports.enum(["direct", "browser"]), instructions: str, credentials: external_exports.array(external_exports.strictObject({ name: str, header: str, prefix: external_exports.string().optional() })) });
|
|
129779
|
+
var resourceRequirements = external_exports.strictObject({ legacyCredentialContract: str.optional(), credentialContract: str.optional(), destinations: external_exports.array(str).optional(), name: str, title: str, mode: external_exports.enum(["direct", "browser"]), instructions: str, credentials: external_exports.array(external_exports.strictObject({ name: str, header: str, prefix: external_exports.string().optional() })) });
|
|
129779
129780
|
var safetyReview = external_exports.union([external_exports.strictObject({ access: external_exports.literal("locked") }), external_exports.strictObject({ access: external_exports.literal("included"), state: external_exports.enum(["missing", "checking", "ready", "unavailable"]), route: str, findings: data.optional(), checkedAt: iso.optional(), stale: external_exports.boolean().optional(), message: external_exports.string().optional() })]);
|
|
129780
129781
|
var billing = external_exports.strictObject({ workspaceId: uuid3, paddleCustomerId: str.optional(), entitlement, trial: external_exports.strictObject({ status: external_exports.enum(["active", "ended", "converted"]), startedAt: iso, endsAt: iso, completedAt: iso.optional() }).optional(), subscription: external_exports.strictObject({ id: str, status: str, plan: str, interval: str, currency: str, currentPeriod: external_exports.strictObject({ startsAt: iso, endsAt: iso }), nextBilledAt: iso.optional(), graceEndsAt: iso.optional(), scheduledChange: data.optional() }).optional(), usage: data.optional(), checkout: external_exports.strictObject({ status: external_exports.enum(["pending", "unknown"]), transactionId: str.optional() }).optional(), checkoutAvailable: external_exports.boolean(), paddle: external_exports.strictObject({ environment: external_exports.enum(["sandbox", "production"]), clientToken: str }) });
|
|
129781
|
-
var executionReportSchema = external_exports.strictObject({ id: uuid3, appId: uuid3, actionName: str, actionVersion: external_exports.number().int().positive(), closureHash: hash2, purpose: external_exports.enum(["run", "verify"]), clientFamily: external_exports.enum(["cli", "discovery"]), agent, outcome: external_exports.enum(["caller-error", "credential-error", "rate-limit", "app-outage", "interface-error", "uncertain", "network-error", "success", "cancelled"]), diagnostic: external_exports.enum(["operation-unavailable", "response-contract", "proof-failed"]).optional(), httpStatus: external_exports.number().int().optional(), proof: external_exports.enum(["passed", "failed", "unavailable"]).optional(), semanticConfirmed: external_exports.boolean().optional(), connectionFingerprint: hash2.optional(), startedAt: iso, dispatchedAt: iso.optional(), finishedAt: iso });
|
|
129782
|
+
var executionReportSchema = external_exports.strictObject({ id: uuid3, receiptId: uuid3.optional(), appId: uuid3, actionName: str, actionVersion: external_exports.number().int().positive(), closureHash: hash2, purpose: external_exports.enum(["run", "verify"]), clientFamily: external_exports.enum(["cli", "discovery"]), agent, outcome: external_exports.enum(["caller-error", "credential-error", "rate-limit", "app-outage", "interface-error", "uncertain", "network-error", "success", "cancelled"]), diagnostic: external_exports.enum(["operation-unavailable", "response-contract", "proof-failed"]).optional(), httpStatus: external_exports.number().int().optional(), proof: external_exports.enum(["passed", "failed", "unavailable"]).optional(), semanticConfirmed: external_exports.boolean().optional(), connectionFingerprint: hash2.optional(), startedAt: iso, dispatchedAt: iso.optional(), finishedAt: iso });
|
|
129782
129783
|
var sharedMeasure = { durationMs: external_exports.number().min(0).max(864e5).nullable(), tokens: external_exports.strictObject({ input: external_exports.number().min(0).max(1e8), output: external_exports.number().min(0).max(1e8) }).nullable(), coverage: external_exports.enum(["final", "partial", "unavailable"]), timeCoverage: external_exports.enum(["final", "partial", "unavailable"]), provider: external_exports.enum(["openai", "anthropic", "bedrock", "vertex", "custom"]).nullable(), model: external_exports.string().max(120).regex(/^[A-Za-z0-9._<>[\]:/@-]+$/).nullable() };
|
|
129783
129784
|
var executionMeasurementSchema = external_exports.strictObject({ id: uuid3, executionId: uuid3, revision: external_exports.number().int().positive(), purpose: external_exports.enum(["productive", "discovery", "verification", "setup", "unknown"]), session: hash2.nullable(), worker: hash2.nullable(), ...sharedMeasure });
|
|
129784
129785
|
var baselineSampleSchema = external_exports.strictObject({ id: uuid3, revision: external_exports.number().int().positive(), appId: uuid3, actionName: str.nullable(), executableHash: hash2.nullable(), method: external_exports.enum(["browser", "direct"]).nullable(), completeness: external_exports.enum(["complete", "prefix"]), occurredAt: iso, ...sharedMeasure });
|
|
@@ -129812,8 +129813,8 @@ var apiContracts = {
|
|
|
129812
129813
|
getBundle: apiContract("GET", "/api/v1/apps/{app}/actions/{action}/bundle", "installation", actionPath, noQuery, noBody, bundle, ["session-limit", "action-withheld", "action-disabled", "action-denied", "action-unavailable"]),
|
|
129813
129814
|
listResources: apiContract("GET", "/api/v1/apps/{app}/resources", "installation", path, external_exports.strictObject({ kind: resourceKindSchema.optional(), names: str.optional() }), noBody, page(external_exports.strictObject({ ...kindName.shape, version: external_exports.number().int().positive(), executableHash: hash2.optional(), updatedAt: iso }))),
|
|
129814
129815
|
getResource: apiContract("GET", "/api/v1/apps/{app}/resources/{kind}/{name}", "installation-or-cookie", resourcePath, external_exports.strictObject({ view: external_exports.literal("requirements").optional() }), noBody, external_exports.union([resourceRead, resourceRequirements])),
|
|
129815
|
-
publishResource: apiContract("PUT", "/api/v1/apps/{app}/resources/{kind}/{name}", "installation", resourcePath, noQuery, external_exports.union([external_exports.strictObject({ requestId: uuid3, expectedVersion: external_exports.number().int().positive().nullable(), definition, verification: data.optional() }), external_exports.strictObject({ requestId: uuid3, expectedVersion: external_exports.number().int().positive(), remove: external_exports.literal(true) })]), external_exports.strictObject({ resource: external_exports.strictObject({ ...kindName.shape, version: external_exports.number().int().positive() }), executableHash: hash2.optional(), closureHash: hash2.optional() }), ["definition-invalid", "documentation-incomplete", "reference-unresolved", "reference-cycle", "verification-incomplete", "verification-stale", "version-conflict"]),
|
|
129816
|
-
listChanges: apiContract("GET", "/api/v1/apps/{app}/changes", "installation-or-cookie", path, external_exports.strictObject({ resource: str.optional(), ...pageQuery }), noBody, page(external_exports.strictObject({ change: external_exports.number().int().positive(), kind: resourceKindSchema, name: str, version: external_exports.number().int().positive(), event: external_exports.enum(["published", "removed"]), publishedAt: iso }))),
|
|
129816
|
+
publishResource: apiContract("PUT", "/api/v1/apps/{app}/resources/{kind}/{name}", "installation", resourcePath, noQuery, external_exports.union([external_exports.strictObject({ requestId: uuid3, expectedVersion: external_exports.number().int().positive().nullable(), definition, verification: data.optional() }), external_exports.strictObject({ requestId: uuid3, expectedVersion: external_exports.number().int().positive(), remove: external_exports.literal(true) })]), external_exports.strictObject({ resource: external_exports.strictObject({ ...kindName.shape, version: external_exports.number().int().positive() }), executableHash: hash2.optional(), closureHash: hash2.optional(), distribution: external_exports.strictObject({ state: external_exports.enum(["available", "testing", "queued", "paused"]), reason: str.optional(), until: iso.optional() }).optional() }), ["definition-invalid", "documentation-incomplete", "reference-unresolved", "reference-cycle", "verification-incomplete", "verification-stale", "version-conflict"]),
|
|
129817
|
+
listChanges: apiContract("GET", "/api/v1/apps/{app}/changes", "installation-or-cookie", path, external_exports.strictObject({ resource: str.optional(), ...pageQuery }), noBody, page(external_exports.strictObject({ change: external_exports.number().int().positive(), kind: resourceKindSchema, name: str, version: external_exports.number().int().positive(), event: external_exports.enum(["published", "removed"]), distribution: external_exports.strictObject({ state: external_exports.enum(["available", "testing", "queued", "paused"]), reason: str.optional(), until: iso.optional() }).optional(), publishedAt: iso }))),
|
|
129817
129818
|
safetyReview: apiContract("GET", "/api/v1/apps/{app}/safety-review", "cookie", path, noQuery, noBody, safetyReview),
|
|
129818
129819
|
postExecutions: apiContract("POST", "/api/v1/executions", "installation", noParams, noQuery, external_exports.strictObject({ reports: external_exports.array(external_exports.unknown()).min(1).max(100) }), executionAcknowledgement),
|
|
129819
129820
|
postMeasurements: apiContract("POST", "/api/v1/measurements", "installation", noParams, noQuery, external_exports.strictObject({ executions: external_exports.array(external_exports.unknown()).max(100), baselines: external_exports.array(external_exports.unknown()).max(100) }).refine((body) => body.executions.length + body.baselines.length >= 1 && body.executions.length + body.baselines.length <= 100), measurementAcknowledgement),
|
|
@@ -129895,6 +129896,7 @@ function createCliApi(baseUrl, fetcher = fetch, token, sessionId) {
|
|
|
129895
129896
|
const transport = async (input2, init) => {
|
|
129896
129897
|
const method = init?.method ?? "GET";
|
|
129897
129898
|
const headers = new Headers(init?.headers);
|
|
129899
|
+
headers.set("Apilift-Capabilities", "distributed-rollouts-v1");
|
|
129898
129900
|
headers.set("Apilift-Client", `cli/${cliVersion}`);
|
|
129899
129901
|
if (token) headers.set("Authorization", `Bearer ${token}`);
|
|
129900
129902
|
if (sessionId) headers.set("Apilift-Session", sessionId);
|
|
@@ -29360,6 +29360,7 @@ var errorCategoryByCode = {
|
|
|
29360
29360
|
"release-state-conflict": "conflict",
|
|
29361
29361
|
"action-withheld": "withheld",
|
|
29362
29362
|
"publication-budget": "limit",
|
|
29363
|
+
"publication-throttled": "limit",
|
|
29363
29364
|
"session-limit": "limit",
|
|
29364
29365
|
"client-upgrade-required": "upgrade",
|
|
29365
29366
|
"backend-unavailable": "unavailable",
|
|
@@ -29584,12 +29585,12 @@ var me = external_exports.strictObject({ account: external_exports.strictObject(
|
|
|
29584
29585
|
var setupStatus = external_exports.strictObject({ linkCode: external_exports.strictObject({ id: uuid3, agent: knownAgent.nullable(), status: external_exports.enum(["pending", "claimed", "expired"]), expiresAt: iso, installationId: uuid3.nullable() }).nullable(), installation: external_exports.strictObject({ id: uuid3, label: str, readiness, steps: data, agents: external_exports.array(knownAgent) }).nullable() });
|
|
29585
29586
|
var actionSummary = external_exports.strictObject({ name: str, title: str, summary: external_exports.string(), effect: external_exports.enum(["read", "create", "update", "delete"]).optional(), availability: external_exports.enum(["executable", "unavailable"]), policy: external_exports.enum(["approve", "deny", "disable"]), health: data, documentation: data.optional() });
|
|
29586
29587
|
var actionDocumentation = external_exports.strictObject({ name: str, title: str, description: external_exports.string(), effect: external_exports.enum(["read", "create", "update", "delete"]).optional(), availability: external_exports.enum(["executable", "unavailable"]), inputs: jsonSchema, output: jsonSchema.optional(), proof: external_exports.enum(["readback", "absence"]).optional(), unavailable: external_exports.strictObject({ reason: str, evidence: str }).optional(), transport: external_exports.strictObject({ name: str, mode: external_exports.enum(["direct", "browser"]), instructions: str, credentials: external_exports.array(external_exports.strictObject({ name: str, header: str })) }).optional(), version: external_exports.number().int().positive(), executableHash: hash3.optional(), policy: external_exports.enum(["approve", "deny", "disable"]), health: data });
|
|
29587
|
-
var bundle = external_exports.strictObject({ decision: external_exports.literal("allow"), app: external_exports.strictObject({ id: uuid3, slug: str, visibility: external_exports.enum(["public", "private"]) }), action: external_exports.strictObject({ name: str, effect: external_exports.enum(["read", "create", "update", "delete"]) }), closure: external_exports.strictObject({ hash: hash3, status: external_exports.enum(["pending", "validated"]), workspaceStatus: external_exports.literal("successful").nullable(), versions: external_exports.array(external_exports.strictObject({ kind: resourceKindSchema, name: str, version: external_exports.number().int().positive(), executableHash: hash3, definition })) }), selection: external_exports.strictObject({ channel: external_exports.enum(["latest", "validated"]), fallback: external_exports.boolean(), replaced: external_exports.strictObject({ closureHash: hash3, reason: str }).optional() }), policy: external_exports.literal("approve") });
|
|
29588
|
+
var bundle = external_exports.strictObject({ receipt: external_exports.strictObject({ id: uuid3, dispatchBefore: iso }).optional(), decision: external_exports.literal("allow"), app: external_exports.strictObject({ id: uuid3, slug: str, visibility: external_exports.enum(["public", "private"]) }), action: external_exports.strictObject({ name: str, effect: external_exports.enum(["read", "create", "update", "delete"]) }), closure: external_exports.strictObject({ hash: hash3, status: external_exports.enum(["pending", "validated"]), workspaceStatus: external_exports.literal("successful").nullable(), versions: external_exports.array(external_exports.strictObject({ kind: resourceKindSchema, name: str, version: external_exports.number().int().positive(), executableHash: hash3, definition })) }), selection: external_exports.strictObject({ channel: external_exports.enum(["latest", "validated"]), fallback: external_exports.boolean(), replaced: external_exports.strictObject({ closureHash: hash3, reason: str, until: iso.optional() }).optional() }), policy: external_exports.literal("approve") });
|
|
29588
29589
|
var resourceRead = external_exports.strictObject({ ...kindName.shape, definition, version: external_exports.number().int().positive(), executableHash: hash3.optional(), verification: data.optional(), dependents: external_exports.array(kindName).optional() });
|
|
29589
|
-
var resourceRequirements = external_exports.strictObject({ name: str, title: str, mode: external_exports.enum(["direct", "browser"]), instructions: str, credentials: external_exports.array(external_exports.strictObject({ name: str, header: str, prefix: external_exports.string().optional() })) });
|
|
29590
|
+
var resourceRequirements = external_exports.strictObject({ legacyCredentialContract: str.optional(), credentialContract: str.optional(), destinations: external_exports.array(str).optional(), name: str, title: str, mode: external_exports.enum(["direct", "browser"]), instructions: str, credentials: external_exports.array(external_exports.strictObject({ name: str, header: str, prefix: external_exports.string().optional() })) });
|
|
29590
29591
|
var safetyReview = external_exports.union([external_exports.strictObject({ access: external_exports.literal("locked") }), external_exports.strictObject({ access: external_exports.literal("included"), state: external_exports.enum(["missing", "checking", "ready", "unavailable"]), route: str, findings: data.optional(), checkedAt: iso.optional(), stale: external_exports.boolean().optional(), message: external_exports.string().optional() })]);
|
|
29591
29592
|
var billing = external_exports.strictObject({ workspaceId: uuid3, paddleCustomerId: str.optional(), entitlement, trial: external_exports.strictObject({ status: external_exports.enum(["active", "ended", "converted"]), startedAt: iso, endsAt: iso, completedAt: iso.optional() }).optional(), subscription: external_exports.strictObject({ id: str, status: str, plan: str, interval: str, currency: str, currentPeriod: external_exports.strictObject({ startsAt: iso, endsAt: iso }), nextBilledAt: iso.optional(), graceEndsAt: iso.optional(), scheduledChange: data.optional() }).optional(), usage: data.optional(), checkout: external_exports.strictObject({ status: external_exports.enum(["pending", "unknown"]), transactionId: str.optional() }).optional(), checkoutAvailable: external_exports.boolean(), paddle: external_exports.strictObject({ environment: external_exports.enum(["sandbox", "production"]), clientToken: str }) });
|
|
29592
|
-
var executionReportSchema = external_exports.strictObject({ id: uuid3, appId: uuid3, actionName: str, actionVersion: external_exports.number().int().positive(), closureHash: hash3, purpose: external_exports.enum(["run", "verify"]), clientFamily: external_exports.enum(["cli", "discovery"]), agent, outcome: external_exports.enum(["caller-error", "credential-error", "rate-limit", "app-outage", "interface-error", "uncertain", "network-error", "success", "cancelled"]), diagnostic: external_exports.enum(["operation-unavailable", "response-contract", "proof-failed"]).optional(), httpStatus: external_exports.number().int().optional(), proof: external_exports.enum(["passed", "failed", "unavailable"]).optional(), semanticConfirmed: external_exports.boolean().optional(), connectionFingerprint: hash3.optional(), startedAt: iso, dispatchedAt: iso.optional(), finishedAt: iso });
|
|
29593
|
+
var executionReportSchema = external_exports.strictObject({ id: uuid3, receiptId: uuid3.optional(), appId: uuid3, actionName: str, actionVersion: external_exports.number().int().positive(), closureHash: hash3, purpose: external_exports.enum(["run", "verify"]), clientFamily: external_exports.enum(["cli", "discovery"]), agent, outcome: external_exports.enum(["caller-error", "credential-error", "rate-limit", "app-outage", "interface-error", "uncertain", "network-error", "success", "cancelled"]), diagnostic: external_exports.enum(["operation-unavailable", "response-contract", "proof-failed"]).optional(), httpStatus: external_exports.number().int().optional(), proof: external_exports.enum(["passed", "failed", "unavailable"]).optional(), semanticConfirmed: external_exports.boolean().optional(), connectionFingerprint: hash3.optional(), startedAt: iso, dispatchedAt: iso.optional(), finishedAt: iso });
|
|
29593
29594
|
var sharedMeasure = { durationMs: external_exports.number().min(0).max(864e5).nullable(), tokens: external_exports.strictObject({ input: external_exports.number().min(0).max(1e8), output: external_exports.number().min(0).max(1e8) }).nullable(), coverage: external_exports.enum(["final", "partial", "unavailable"]), timeCoverage: external_exports.enum(["final", "partial", "unavailable"]), provider: external_exports.enum(["openai", "anthropic", "bedrock", "vertex", "custom"]).nullable(), model: external_exports.string().max(120).regex(/^[A-Za-z0-9._<>[\]:/@-]+$/).nullable() };
|
|
29594
29595
|
var executionMeasurementSchema = external_exports.strictObject({ id: uuid3, executionId: uuid3, revision: external_exports.number().int().positive(), purpose: external_exports.enum(["productive", "discovery", "verification", "setup", "unknown"]), session: hash3.nullable(), worker: hash3.nullable(), ...sharedMeasure });
|
|
29595
29596
|
var baselineSampleSchema = external_exports.strictObject({ id: uuid3, revision: external_exports.number().int().positive(), appId: uuid3, actionName: str.nullable(), executableHash: hash3.nullable(), method: external_exports.enum(["browser", "direct"]).nullable(), completeness: external_exports.enum(["complete", "prefix"]), occurredAt: iso, ...sharedMeasure });
|
|
@@ -29623,8 +29624,8 @@ var apiContracts = {
|
|
|
29623
29624
|
getBundle: apiContract("GET", "/api/v1/apps/{app}/actions/{action}/bundle", "installation", actionPath, noQuery, noBody, bundle, ["session-limit", "action-withheld", "action-disabled", "action-denied", "action-unavailable"]),
|
|
29624
29625
|
listResources: apiContract("GET", "/api/v1/apps/{app}/resources", "installation", path, external_exports.strictObject({ kind: resourceKindSchema.optional(), names: str.optional() }), noBody, page(external_exports.strictObject({ ...kindName.shape, version: external_exports.number().int().positive(), executableHash: hash3.optional(), updatedAt: iso }))),
|
|
29625
29626
|
getResource: apiContract("GET", "/api/v1/apps/{app}/resources/{kind}/{name}", "installation-or-cookie", resourcePath, external_exports.strictObject({ view: external_exports.literal("requirements").optional() }), noBody, external_exports.union([resourceRead, resourceRequirements])),
|
|
29626
|
-
publishResource: apiContract("PUT", "/api/v1/apps/{app}/resources/{kind}/{name}", "installation", resourcePath, noQuery, external_exports.union([external_exports.strictObject({ requestId: uuid3, expectedVersion: external_exports.number().int().positive().nullable(), definition, verification: data.optional() }), external_exports.strictObject({ requestId: uuid3, expectedVersion: external_exports.number().int().positive(), remove: external_exports.literal(true) })]), external_exports.strictObject({ resource: external_exports.strictObject({ ...kindName.shape, version: external_exports.number().int().positive() }), executableHash: hash3.optional(), closureHash: hash3.optional() }), ["definition-invalid", "documentation-incomplete", "reference-unresolved", "reference-cycle", "verification-incomplete", "verification-stale", "version-conflict"]),
|
|
29627
|
-
listChanges: apiContract("GET", "/api/v1/apps/{app}/changes", "installation-or-cookie", path, external_exports.strictObject({ resource: str.optional(), ...pageQuery }), noBody, page(external_exports.strictObject({ change: external_exports.number().int().positive(), kind: resourceKindSchema, name: str, version: external_exports.number().int().positive(), event: external_exports.enum(["published", "removed"]), publishedAt: iso }))),
|
|
29627
|
+
publishResource: apiContract("PUT", "/api/v1/apps/{app}/resources/{kind}/{name}", "installation", resourcePath, noQuery, external_exports.union([external_exports.strictObject({ requestId: uuid3, expectedVersion: external_exports.number().int().positive().nullable(), definition, verification: data.optional() }), external_exports.strictObject({ requestId: uuid3, expectedVersion: external_exports.number().int().positive(), remove: external_exports.literal(true) })]), external_exports.strictObject({ resource: external_exports.strictObject({ ...kindName.shape, version: external_exports.number().int().positive() }), executableHash: hash3.optional(), closureHash: hash3.optional(), distribution: external_exports.strictObject({ state: external_exports.enum(["available", "testing", "queued", "paused"]), reason: str.optional(), until: iso.optional() }).optional() }), ["definition-invalid", "documentation-incomplete", "reference-unresolved", "reference-cycle", "verification-incomplete", "verification-stale", "version-conflict"]),
|
|
29628
|
+
listChanges: apiContract("GET", "/api/v1/apps/{app}/changes", "installation-or-cookie", path, external_exports.strictObject({ resource: str.optional(), ...pageQuery }), noBody, page(external_exports.strictObject({ change: external_exports.number().int().positive(), kind: resourceKindSchema, name: str, version: external_exports.number().int().positive(), event: external_exports.enum(["published", "removed"]), distribution: external_exports.strictObject({ state: external_exports.enum(["available", "testing", "queued", "paused"]), reason: str.optional(), until: iso.optional() }).optional(), publishedAt: iso }))),
|
|
29628
29629
|
safetyReview: apiContract("GET", "/api/v1/apps/{app}/safety-review", "cookie", path, noQuery, noBody, safetyReview),
|
|
29629
29630
|
postExecutions: apiContract("POST", "/api/v1/executions", "installation", noParams, noQuery, external_exports.strictObject({ reports: external_exports.array(external_exports.unknown()).min(1).max(100) }), executionAcknowledgement),
|
|
29630
29631
|
postMeasurements: apiContract("POST", "/api/v1/measurements", "installation", noParams, noQuery, external_exports.strictObject({ executions: external_exports.array(external_exports.unknown()).max(100), baselines: external_exports.array(external_exports.unknown()).max(100) }).refine((body) => body.executions.length + body.baselines.length >= 1 && body.executions.length + body.baselines.length <= 100), measurementAcknowledgement),
|
|
@@ -29702,6 +29703,7 @@ function createCliApi(baseUrl, fetcher = fetch, token, sessionId) {
|
|
|
29702
29703
|
const transport = async (input2, init) => {
|
|
29703
29704
|
const method = init?.method ?? "GET";
|
|
29704
29705
|
const headers = new Headers(init?.headers);
|
|
29706
|
+
headers.set("Apilift-Capabilities", "distributed-rollouts-v1");
|
|
29705
29707
|
headers.set("Apilift-Client", `cli/${cliVersion}`);
|
|
29706
29708
|
if (token) headers.set("Authorization", `Bearer ${token}`);
|
|
29707
29709
|
if (sessionId) headers.set("Apilift-Session", sessionId);
|
|
@@ -30826,13 +30828,14 @@ var CredentialStore = class {
|
|
|
30826
30828
|
constructor(root, vault) {
|
|
30827
30829
|
this.vault = vault;
|
|
30828
30830
|
this.state = new LocalState(root);
|
|
30829
|
-
this.state.db.exec(`CREATE TABLE IF NOT EXISTS credential_draft (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, app_id TEXT NOT NULL, transport_name TEXT NOT NULL, requirements_json TEXT NOT NULL, expires_at TEXT NOT NULL); CREATE TABLE IF NOT EXISTS credential_draft_source (id TEXT PRIMARY KEY, draft_id TEXT NOT NULL, session_id TEXT NOT NULL, fingerprint TEXT NOT NULL); CREATE TABLE IF NOT EXISTS credential_entry (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, app_id TEXT NOT NULL, transport_name TEXT NOT NULL, name TEXT NOT NULL, name_fold TEXT NOT NULL, requirements_json TEXT NOT NULL, ciphertext BLOB NOT NULL, iv BLOB NOT NULL, tag BLOB NOT NULL, created_at TEXT NOT NULL, UNIQUE(app_id,transport_name,name_fold));`);
|
|
30831
|
+
this.state.db.exec(`CREATE TABLE IF NOT EXISTS credential_scope (id TEXT PRIMARY KEY, contract TEXT NOT NULL); CREATE TABLE IF NOT EXISTS credential_draft (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, app_id TEXT NOT NULL, transport_name TEXT NOT NULL, requirements_json TEXT NOT NULL, expires_at TEXT NOT NULL); CREATE TABLE IF NOT EXISTS credential_draft_source (id TEXT PRIMARY KEY, draft_id TEXT NOT NULL, session_id TEXT NOT NULL, fingerprint TEXT NOT NULL); CREATE TABLE IF NOT EXISTS credential_entry (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, app_id TEXT NOT NULL, transport_name TEXT NOT NULL, name TEXT NOT NULL, name_fold TEXT NOT NULL, requirements_json TEXT NOT NULL, ciphertext BLOB NOT NULL, iv BLOB NOT NULL, tag BLOB NOT NULL, created_at TEXT NOT NULL, UNIQUE(app_id,transport_name,name_fold));`);
|
|
30830
30832
|
}
|
|
30831
30833
|
state;
|
|
30832
30834
|
registerDraft(binding) {
|
|
30833
30835
|
this.verify(binding);
|
|
30834
30836
|
if (!Number.isFinite(Date.parse(binding.expiresAt)) || (Date.parse(binding.expiresAt) <= Date.now() || Date.parse(binding.expiresAt) > Date.now() + 30 * 6e4)) throw new CredentialError("draft-expired", "Credential draft has expired");
|
|
30835
30837
|
this.state.db.prepare("INSERT INTO credential_draft (id,workspace_id,app_id,transport_name,requirements_json,expires_at) VALUES (?,?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET workspace_id=excluded.workspace_id,app_id=excluded.app_id,transport_name=excluded.transport_name,requirements_json=excluded.requirements_json,expires_at=excluded.expires_at").run(binding.draftId, binding.workspaceId, binding.appId, binding.transportName, JSON.stringify(binding.requirements), binding.expiresAt);
|
|
30838
|
+
if (binding.credentialContract) this.state.db.prepare("INSERT OR REPLACE INTO credential_scope (id,contract) VALUES (?,?)").run(binding.draftId, binding.credentialContract);
|
|
30836
30839
|
if (binding.source) this.state.db.prepare("INSERT INTO credential_draft_source (id,draft_id,session_id,fingerprint) VALUES (?,?,?,?) ON CONFLICT(id) DO UPDATE SET draft_id=excluded.draft_id,session_id=excluded.session_id,fingerprint=excluded.fingerprint").run(binding.draftId, binding.source.draftId, binding.source.sessionId, binding.source.fingerprint);
|
|
30837
30840
|
}
|
|
30838
30841
|
resolveDraft(binding) {
|
|
@@ -30854,7 +30857,10 @@ var CredentialStore = class {
|
|
|
30854
30857
|
}
|
|
30855
30858
|
const requirements = JSON.parse(row.requirements_json);
|
|
30856
30859
|
if (!sameRequirements(requirements, binding.requirements)) throw new CredentialError("requirements-mismatch", "Credential requirements changed. Ask the agent for a new link");
|
|
30857
|
-
|
|
30860
|
+
const scope2 = this.state.db.prepare("SELECT contract FROM credential_scope WHERE id=?").get(binding.draftId);
|
|
30861
|
+
const contract = scope2?.contract;
|
|
30862
|
+
const destinations = contract ? JSON.parse(contract).origins : void 0;
|
|
30863
|
+
return { ...binding, requirements, ...contract ? { credentialContract: contract, destinations } : {} };
|
|
30858
30864
|
}
|
|
30859
30865
|
verify(binding) {
|
|
30860
30866
|
if (this.state.installation()?.workspaceId !== binding.workspaceId) throw new CredentialError("workspace-mismatch", "Credential workspace does not match this installation");
|
|
@@ -30868,7 +30874,7 @@ var CredentialStore = class {
|
|
|
30868
30874
|
}
|
|
30869
30875
|
async put(binding) {
|
|
30870
30876
|
if (binding.draftId) {
|
|
30871
|
-
this.resolveDraft(binding);
|
|
30877
|
+
binding = { ...binding, ...this.resolveDraft(binding) };
|
|
30872
30878
|
const source = this.state.db.prepare("SELECT session_id FROM credential_draft_source WHERE id=?").get(binding.draftId);
|
|
30873
30879
|
if (source && binding.sessionId !== source.session_id) throw new CredentialError("session-mismatch", "Credential setup belongs to another requesting agent session");
|
|
30874
30880
|
}
|
|
@@ -30885,6 +30891,7 @@ var CredentialStore = class {
|
|
|
30885
30891
|
this.state.db.exec("BEGIN EXCLUSIVE");
|
|
30886
30892
|
if (binding.draftId) this.resolveDraft(binding);
|
|
30887
30893
|
this.state.db.prepare("INSERT INTO credential_entry (id,workspace_id,app_id,transport_name,name,name_fold,requirements_json,ciphertext,iv,tag,created_at) VALUES (?,?,?,?,?,?,?,?,?,?,?)").run(id2, binding.workspaceId, binding.appId, binding.transportName, name, name.toLocaleLowerCase(), JSON.stringify(binding.requirements), ciphertext, iv, tag, (/* @__PURE__ */ new Date()).toISOString());
|
|
30894
|
+
if (binding.credentialContract) this.state.db.prepare("INSERT INTO credential_scope (id,contract) VALUES (?,?)").run(id2, binding.credentialContract);
|
|
30888
30895
|
if (binding.sessionId) {
|
|
30889
30896
|
const current = this.state.useSession(binding.sessionId, binding.appId);
|
|
30890
30897
|
this.state.saveUseSession({ agentSessionId: binding.sessionId, appId: binding.appId, context: current?.credentials[binding.transportName] === id2 ? current.context : {}, credentials: { ...current?.credentials, [binding.transportName]: id2 } });
|
|
@@ -30928,6 +30935,7 @@ var CredentialStore = class {
|
|
|
30928
30935
|
if (!sameRequirements(entry2.requirements, binding.requirements)) throw new CredentialError("credential-incompatible", "Saved credential fields do not match the selected transport");
|
|
30929
30936
|
try {
|
|
30930
30937
|
this.state.db.prepare("UPDATE credential_entry SET app_id=?,transport_name=? WHERE id=? AND workspace_id=?").run(binding.appId, binding.transportName, id2, binding.workspaceId);
|
|
30938
|
+
if (binding.credentialContract) this.state.db.prepare("INSERT OR REPLACE INTO credential_scope (id,contract) VALUES (?,?)").run(id2, binding.credentialContract);
|
|
30931
30939
|
} catch (error62) {
|
|
30932
30940
|
if (error62 instanceof Error && /UNIQUE constraint/.test(error62.message)) throw new CredentialError("credential-label-exists", "A credential with this label already exists for this app and transport");
|
|
30933
30941
|
throw error62;
|
|
@@ -30940,8 +30948,16 @@ var CredentialStore = class {
|
|
|
30940
30948
|
if (!row) throw new CredentialError("credential-missing", "Credential entry does not belong to this app and transport");
|
|
30941
30949
|
const stored = JSON.parse(row.requirements_json);
|
|
30942
30950
|
if (!sameRequirements(stored, binding.requirements)) throw new CredentialError("credential-requirements-changed", "Credential requirements changed; configure the entry again");
|
|
30951
|
+
let scope2 = this.state.db.prepare("SELECT contract FROM credential_scope WHERE id=?").get(id2);
|
|
30952
|
+
if (!scope2 && binding.credentialContract && binding.legacyCredentialContract === binding.credentialContract) {
|
|
30953
|
+
this.state.db.prepare("INSERT OR IGNORE INTO credential_scope (id,contract) VALUES (?,?)").run(id2, binding.credentialContract);
|
|
30954
|
+
scope2 = this.state.db.prepare("SELECT contract FROM credential_scope WHERE id=?").get(id2);
|
|
30955
|
+
}
|
|
30956
|
+
if (scope2?.contract !== binding.credentialContract) throw new CredentialError("credential-destination-changed", "The saved credential is not bound to this destination and injection contract; complete connection setup");
|
|
30943
30957
|
const key = Buffer.from(await this.vault.get(id2), "base64");
|
|
30944
30958
|
if (binding.draftId) this.resolveDraft(binding);
|
|
30959
|
+
const stillBound = this.state.db.prepare("SELECT s.contract FROM credential_entry e LEFT JOIN credential_scope s ON s.id=e.id WHERE e.id=? AND e.workspace_id=? AND e.app_id=? AND e.transport_name=?").get(id2, binding.workspaceId, binding.appId, binding.transportName);
|
|
30960
|
+
if (!stillBound || (stillBound.contract ?? void 0) !== binding.credentialContract) throw new CredentialError("credential-binding-changed", "The selected credential changed while the vault was opening; complete connection setup");
|
|
30945
30961
|
if (key.length !== 32) throw new CredentialError("vault-key-invalid", "Credential vault key is invalid");
|
|
30946
30962
|
const decipher = createDecipheriv("aes-256-gcm", key, row.iv);
|
|
30947
30963
|
decipher.setAuthTag(row.tag);
|
|
@@ -30966,6 +30982,7 @@ var CredentialStore = class {
|
|
|
30966
30982
|
if (!row) throw new CredentialError("credential-missing", "Credential entry was not found");
|
|
30967
30983
|
await this.vault.delete(binding.credentialId);
|
|
30968
30984
|
this.state.db.prepare("DELETE FROM credential_entry WHERE id=?").run(binding.credentialId);
|
|
30985
|
+
this.state.db.prepare("DELETE FROM credential_scope WHERE id=?").run(binding.credentialId);
|
|
30969
30986
|
const sessions = this.state.db.prepare("SELECT agent_session_id,context_json,credentials_json FROM use_session WHERE app_id=?").all(binding.appId);
|
|
30970
30987
|
for (const session of sessions) {
|
|
30971
30988
|
const credentials = JSON.parse(session.credentials_json);
|
|
@@ -31337,7 +31354,7 @@ var NativeHost = class {
|
|
|
31337
31354
|
const api = createCliApi(this.options.siteUrl, this.options.fetcher ?? fetch, installation.token);
|
|
31338
31355
|
const resource = await api.call("getResource", { params: { app: payload.appId, kind: "transport", name: payload.transportName }, query: { view: "requirements" } });
|
|
31339
31356
|
if (!("credentials" in resource)) throw Object.assign(new Error("Transport requirements are unavailable"), { code: "requirements-unavailable" });
|
|
31340
|
-
return { ...payload, requirements: resource.credentials };
|
|
31357
|
+
return { ...payload, requirements: resource.credentials, credentialContract: resource.credentialContract, legacyCredentialContract: resource.legacyCredentialContract, destinations: resource.destinations };
|
|
31341
31358
|
}
|
|
31342
31359
|
admit(value) {
|
|
31343
31360
|
if (this.stopped) return;
|
|
@@ -31430,13 +31447,20 @@ var NativeHost = class {
|
|
|
31430
31447
|
return result;
|
|
31431
31448
|
}
|
|
31432
31449
|
async dispatchJob(envelope) {
|
|
31450
|
+
const checkAuthorization = () => {
|
|
31451
|
+
if (envelope.authorization && (!Number.isFinite(Date.parse(envelope.authorization.dispatchBefore)) || Date.now() > Date.parse(envelope.authorization.dispatchBefore))) throw Object.assign(new Error("Execution authorization expired before native dispatch"), { code: "execution-authorization-expired" });
|
|
31452
|
+
};
|
|
31453
|
+
checkAuthorization();
|
|
31433
31454
|
const job = nativeJobSchema.parse(envelope.job);
|
|
31434
31455
|
if (!envelope.credentialRef) return job;
|
|
31435
31456
|
if (job.kind !== "replay") throw Object.assign(new Error("Credentials can be injected only into replay jobs"), { code: "credential-job-invalid" });
|
|
31436
31457
|
const installation = this.state.installation();
|
|
31437
31458
|
if (!installation) throw Object.assign(new Error("Installation is no longer linked"), { code: "installation-required" });
|
|
31438
31459
|
const binding = await this.resolveBinding({ workspaceId: installation.workspaceId, ...envelope.credentialRef.draftId ? { draftId: envelope.credentialRef.draftId } : {}, appId: envelope.credentialRef.appId, appTitle: envelope.credentialRef.appId, transportName: envelope.credentialRef.transportName, requirements: envelope.credentialRef.requirements });
|
|
31460
|
+
checkAuthorization();
|
|
31461
|
+
if (binding.destinations && !binding.destinations.includes(new URL(job.url).origin)) throw Object.assign(new Error("Credential destination is outside the saved connection contract"), { code: "credential-destination-changed" });
|
|
31439
31462
|
const values = await this.credentials.read(envelope.credentialRef.credentialId, binding);
|
|
31463
|
+
checkAuthorization();
|
|
31440
31464
|
const headers = { ...job.headers };
|
|
31441
31465
|
const credentialHeaderNames = [];
|
|
31442
31466
|
for (const requirement2 of binding.requirements) {
|
|
@@ -161380,6 +161380,7 @@ var errorCategoryByCode = {
|
|
|
161380
161380
|
"release-state-conflict": "conflict",
|
|
161381
161381
|
"action-withheld": "withheld",
|
|
161382
161382
|
"publication-budget": "limit",
|
|
161383
|
+
"publication-throttled": "limit",
|
|
161383
161384
|
"session-limit": "limit",
|
|
161384
161385
|
"client-upgrade-required": "upgrade",
|
|
161385
161386
|
"backend-unavailable": "unavailable",
|
|
@@ -161604,12 +161605,12 @@ var me2 = external_exports.strictObject({ account: external_exports.strictObject
|
|
|
161604
161605
|
var setupStatus = external_exports.strictObject({ linkCode: external_exports.strictObject({ id: uuid3, agent: knownAgent.nullable(), status: external_exports.enum(["pending", "claimed", "expired"]), expiresAt: iso, installationId: uuid3.nullable() }).nullable(), installation: external_exports.strictObject({ id: uuid3, label: str, readiness, steps: data, agents: external_exports.array(knownAgent) }).nullable() });
|
|
161605
161606
|
var actionSummary = external_exports.strictObject({ name: str, title: str, summary: external_exports.string(), effect: external_exports.enum(["read", "create", "update", "delete"]).optional(), availability: external_exports.enum(["executable", "unavailable"]), policy: external_exports.enum(["approve", "deny", "disable"]), health: data, documentation: data.optional() });
|
|
161606
161607
|
var actionDocumentation = external_exports.strictObject({ name: str, title: str, description: external_exports.string(), effect: external_exports.enum(["read", "create", "update", "delete"]).optional(), availability: external_exports.enum(["executable", "unavailable"]), inputs: jsonSchema, output: jsonSchema.optional(), proof: external_exports.enum(["readback", "absence"]).optional(), unavailable: external_exports.strictObject({ reason: str, evidence: str }).optional(), transport: external_exports.strictObject({ name: str, mode: external_exports.enum(["direct", "browser"]), instructions: str, credentials: external_exports.array(external_exports.strictObject({ name: str, header: str })) }).optional(), version: external_exports.number().int().positive(), executableHash: hash2.optional(), policy: external_exports.enum(["approve", "deny", "disable"]), health: data });
|
|
161607
|
-
var bundle = external_exports.strictObject({ decision: external_exports.literal("allow"), app: external_exports.strictObject({ id: uuid3, slug: str, visibility: external_exports.enum(["public", "private"]) }), action: external_exports.strictObject({ name: str, effect: external_exports.enum(["read", "create", "update", "delete"]) }), closure: external_exports.strictObject({ hash: hash2, status: external_exports.enum(["pending", "validated"]), workspaceStatus: external_exports.literal("successful").nullable(), versions: external_exports.array(external_exports.strictObject({ kind: resourceKindSchema, name: str, version: external_exports.number().int().positive(), executableHash: hash2, definition })) }), selection: external_exports.strictObject({ channel: external_exports.enum(["latest", "validated"]), fallback: external_exports.boolean(), replaced: external_exports.strictObject({ closureHash: hash2, reason: str }).optional() }), policy: external_exports.literal("approve") });
|
|
161608
|
+
var bundle = external_exports.strictObject({ receipt: external_exports.strictObject({ id: uuid3, dispatchBefore: iso }).optional(), decision: external_exports.literal("allow"), app: external_exports.strictObject({ id: uuid3, slug: str, visibility: external_exports.enum(["public", "private"]) }), action: external_exports.strictObject({ name: str, effect: external_exports.enum(["read", "create", "update", "delete"]) }), closure: external_exports.strictObject({ hash: hash2, status: external_exports.enum(["pending", "validated"]), workspaceStatus: external_exports.literal("successful").nullable(), versions: external_exports.array(external_exports.strictObject({ kind: resourceKindSchema, name: str, version: external_exports.number().int().positive(), executableHash: hash2, definition })) }), selection: external_exports.strictObject({ channel: external_exports.enum(["latest", "validated"]), fallback: external_exports.boolean(), replaced: external_exports.strictObject({ closureHash: hash2, reason: str, until: iso.optional() }).optional() }), policy: external_exports.literal("approve") });
|
|
161608
161609
|
var resourceRead = external_exports.strictObject({ ...kindName.shape, definition, version: external_exports.number().int().positive(), executableHash: hash2.optional(), verification: data.optional(), dependents: external_exports.array(kindName).optional() });
|
|
161609
|
-
var resourceRequirements = external_exports.strictObject({ name: str, title: str, mode: external_exports.enum(["direct", "browser"]), instructions: str, credentials: external_exports.array(external_exports.strictObject({ name: str, header: str, prefix: external_exports.string().optional() })) });
|
|
161610
|
+
var resourceRequirements = external_exports.strictObject({ legacyCredentialContract: str.optional(), credentialContract: str.optional(), destinations: external_exports.array(str).optional(), name: str, title: str, mode: external_exports.enum(["direct", "browser"]), instructions: str, credentials: external_exports.array(external_exports.strictObject({ name: str, header: str, prefix: external_exports.string().optional() })) });
|
|
161610
161611
|
var safetyReview = external_exports.union([external_exports.strictObject({ access: external_exports.literal("locked") }), external_exports.strictObject({ access: external_exports.literal("included"), state: external_exports.enum(["missing", "checking", "ready", "unavailable"]), route: str, findings: data.optional(), checkedAt: iso.optional(), stale: external_exports.boolean().optional(), message: external_exports.string().optional() })]);
|
|
161611
161612
|
var billing = external_exports.strictObject({ workspaceId: uuid3, paddleCustomerId: str.optional(), entitlement, trial: external_exports.strictObject({ status: external_exports.enum(["active", "ended", "converted"]), startedAt: iso, endsAt: iso, completedAt: iso.optional() }).optional(), subscription: external_exports.strictObject({ id: str, status: str, plan: str, interval: str, currency: str, currentPeriod: external_exports.strictObject({ startsAt: iso, endsAt: iso }), nextBilledAt: iso.optional(), graceEndsAt: iso.optional(), scheduledChange: data.optional() }).optional(), usage: data.optional(), checkout: external_exports.strictObject({ status: external_exports.enum(["pending", "unknown"]), transactionId: str.optional() }).optional(), checkoutAvailable: external_exports.boolean(), paddle: external_exports.strictObject({ environment: external_exports.enum(["sandbox", "production"]), clientToken: str }) });
|
|
161612
|
-
var executionReportSchema = external_exports.strictObject({ id: uuid3, appId: uuid3, actionName: str, actionVersion: external_exports.number().int().positive(), closureHash: hash2, purpose: external_exports.enum(["run", "verify"]), clientFamily: external_exports.enum(["cli", "discovery"]), agent, outcome: external_exports.enum(["caller-error", "credential-error", "rate-limit", "app-outage", "interface-error", "uncertain", "network-error", "success", "cancelled"]), diagnostic: external_exports.enum(["operation-unavailable", "response-contract", "proof-failed"]).optional(), httpStatus: external_exports.number().int().optional(), proof: external_exports.enum(["passed", "failed", "unavailable"]).optional(), semanticConfirmed: external_exports.boolean().optional(), connectionFingerprint: hash2.optional(), startedAt: iso, dispatchedAt: iso.optional(), finishedAt: iso });
|
|
161613
|
+
var executionReportSchema = external_exports.strictObject({ id: uuid3, receiptId: uuid3.optional(), appId: uuid3, actionName: str, actionVersion: external_exports.number().int().positive(), closureHash: hash2, purpose: external_exports.enum(["run", "verify"]), clientFamily: external_exports.enum(["cli", "discovery"]), agent, outcome: external_exports.enum(["caller-error", "credential-error", "rate-limit", "app-outage", "interface-error", "uncertain", "network-error", "success", "cancelled"]), diagnostic: external_exports.enum(["operation-unavailable", "response-contract", "proof-failed"]).optional(), httpStatus: external_exports.number().int().optional(), proof: external_exports.enum(["passed", "failed", "unavailable"]).optional(), semanticConfirmed: external_exports.boolean().optional(), connectionFingerprint: hash2.optional(), startedAt: iso, dispatchedAt: iso.optional(), finishedAt: iso });
|
|
161613
161614
|
var sharedMeasure = { durationMs: external_exports.number().min(0).max(864e5).nullable(), tokens: external_exports.strictObject({ input: external_exports.number().min(0).max(1e8), output: external_exports.number().min(0).max(1e8) }).nullable(), coverage: external_exports.enum(["final", "partial", "unavailable"]), timeCoverage: external_exports.enum(["final", "partial", "unavailable"]), provider: external_exports.enum(["openai", "anthropic", "bedrock", "vertex", "custom"]).nullable(), model: external_exports.string().max(120).regex(/^[A-Za-z0-9._<>[\]:/@-]+$/).nullable() };
|
|
161614
161615
|
var executionMeasurementSchema = external_exports.strictObject({ id: uuid3, executionId: uuid3, revision: external_exports.number().int().positive(), purpose: external_exports.enum(["productive", "discovery", "verification", "setup", "unknown"]), session: hash2.nullable(), worker: hash2.nullable(), ...sharedMeasure });
|
|
161615
161616
|
var baselineSampleSchema = external_exports.strictObject({ id: uuid3, revision: external_exports.number().int().positive(), appId: uuid3, actionName: str.nullable(), executableHash: hash2.nullable(), method: external_exports.enum(["browser", "direct"]).nullable(), completeness: external_exports.enum(["complete", "prefix"]), occurredAt: iso, ...sharedMeasure });
|
|
@@ -161643,8 +161644,8 @@ var apiContracts = {
|
|
|
161643
161644
|
getBundle: apiContract("GET", "/api/v1/apps/{app}/actions/{action}/bundle", "installation", actionPath, noQuery, noBody, bundle, ["session-limit", "action-withheld", "action-disabled", "action-denied", "action-unavailable"]),
|
|
161644
161645
|
listResources: apiContract("GET", "/api/v1/apps/{app}/resources", "installation", path, external_exports.strictObject({ kind: resourceKindSchema.optional(), names: str.optional() }), noBody, page(external_exports.strictObject({ ...kindName.shape, version: external_exports.number().int().positive(), executableHash: hash2.optional(), updatedAt: iso }))),
|
|
161645
161646
|
getResource: apiContract("GET", "/api/v1/apps/{app}/resources/{kind}/{name}", "installation-or-cookie", resourcePath, external_exports.strictObject({ view: external_exports.literal("requirements").optional() }), noBody, external_exports.union([resourceRead, resourceRequirements])),
|
|
161646
|
-
publishResource: apiContract("PUT", "/api/v1/apps/{app}/resources/{kind}/{name}", "installation", resourcePath, noQuery, external_exports.union([external_exports.strictObject({ requestId: uuid3, expectedVersion: external_exports.number().int().positive().nullable(), definition, verification: data.optional() }), external_exports.strictObject({ requestId: uuid3, expectedVersion: external_exports.number().int().positive(), remove: external_exports.literal(true) })]), external_exports.strictObject({ resource: external_exports.strictObject({ ...kindName.shape, version: external_exports.number().int().positive() }), executableHash: hash2.optional(), closureHash: hash2.optional() }), ["definition-invalid", "documentation-incomplete", "reference-unresolved", "reference-cycle", "verification-incomplete", "verification-stale", "version-conflict"]),
|
|
161647
|
-
listChanges: apiContract("GET", "/api/v1/apps/{app}/changes", "installation-or-cookie", path, external_exports.strictObject({ resource: str.optional(), ...pageQuery }), noBody, page(external_exports.strictObject({ change: external_exports.number().int().positive(), kind: resourceKindSchema, name: str, version: external_exports.number().int().positive(), event: external_exports.enum(["published", "removed"]), publishedAt: iso }))),
|
|
161647
|
+
publishResource: apiContract("PUT", "/api/v1/apps/{app}/resources/{kind}/{name}", "installation", resourcePath, noQuery, external_exports.union([external_exports.strictObject({ requestId: uuid3, expectedVersion: external_exports.number().int().positive().nullable(), definition, verification: data.optional() }), external_exports.strictObject({ requestId: uuid3, expectedVersion: external_exports.number().int().positive(), remove: external_exports.literal(true) })]), external_exports.strictObject({ resource: external_exports.strictObject({ ...kindName.shape, version: external_exports.number().int().positive() }), executableHash: hash2.optional(), closureHash: hash2.optional(), distribution: external_exports.strictObject({ state: external_exports.enum(["available", "testing", "queued", "paused"]), reason: str.optional(), until: iso.optional() }).optional() }), ["definition-invalid", "documentation-incomplete", "reference-unresolved", "reference-cycle", "verification-incomplete", "verification-stale", "version-conflict"]),
|
|
161648
|
+
listChanges: apiContract("GET", "/api/v1/apps/{app}/changes", "installation-or-cookie", path, external_exports.strictObject({ resource: str.optional(), ...pageQuery }), noBody, page(external_exports.strictObject({ change: external_exports.number().int().positive(), kind: resourceKindSchema, name: str, version: external_exports.number().int().positive(), event: external_exports.enum(["published", "removed"]), distribution: external_exports.strictObject({ state: external_exports.enum(["available", "testing", "queued", "paused"]), reason: str.optional(), until: iso.optional() }).optional(), publishedAt: iso }))),
|
|
161648
161649
|
safetyReview: apiContract("GET", "/api/v1/apps/{app}/safety-review", "cookie", path, noQuery, noBody, safetyReview),
|
|
161649
161650
|
postExecutions: apiContract("POST", "/api/v1/executions", "installation", noParams, noQuery, external_exports.strictObject({ reports: external_exports.array(external_exports.unknown()).min(1).max(100) }), executionAcknowledgement),
|
|
161650
161651
|
postMeasurements: apiContract("POST", "/api/v1/measurements", "installation", noParams, noQuery, external_exports.strictObject({ executions: external_exports.array(external_exports.unknown()).max(100), baselines: external_exports.array(external_exports.unknown()).max(100) }).refine((body) => body.executions.length + body.baselines.length >= 1 && body.executions.length + body.baselines.length <= 100), measurementAcknowledgement),
|
package/dist/apilift.js
CHANGED
|
@@ -20447,6 +20447,7 @@ var init_errors3 = __esm({
|
|
|
20447
20447
|
"release-state-conflict": "conflict",
|
|
20448
20448
|
"action-withheld": "withheld",
|
|
20449
20449
|
"publication-budget": "limit",
|
|
20450
|
+
"publication-throttled": "limit",
|
|
20450
20451
|
"session-limit": "limit",
|
|
20451
20452
|
"client-upgrade-required": "upgrade",
|
|
20452
20453
|
"backend-unavailable": "unavailable",
|
|
@@ -28133,6 +28134,17 @@ var init_categories = __esm({
|
|
|
28133
28134
|
}
|
|
28134
28135
|
});
|
|
28135
28136
|
|
|
28137
|
+
// ../../packages/core/dist/definitions/credential-contract.js
|
|
28138
|
+
function credentialContractKey(transport) {
|
|
28139
|
+
return canonicalJson({ mode: transport.mode, origins: [...transport.allowedOrigins].sort(), baseOrigin: transport.baseUrl ? new URL(transport.baseUrl).origin : null, browserContext: transport.browserContext ?? null, credentials: [...transport.credentials ?? []].sort((a, b) => a.name.localeCompare(b.name)), inject: transport.inject ?? [] });
|
|
28140
|
+
}
|
|
28141
|
+
var init_credential_contract = __esm({
|
|
28142
|
+
"../../packages/core/dist/definitions/credential-contract.js"() {
|
|
28143
|
+
"use strict";
|
|
28144
|
+
init_json();
|
|
28145
|
+
}
|
|
28146
|
+
});
|
|
28147
|
+
|
|
28136
28148
|
// ../../packages/core/dist/definitions/index.js
|
|
28137
28149
|
var init_definitions = __esm({
|
|
28138
28150
|
"../../packages/core/dist/definitions/index.js"() {
|
|
@@ -28141,6 +28153,7 @@ var init_definitions = __esm({
|
|
|
28141
28153
|
init_rules();
|
|
28142
28154
|
init_analysis();
|
|
28143
28155
|
init_categories();
|
|
28156
|
+
init_credential_contract();
|
|
28144
28157
|
}
|
|
28145
28158
|
});
|
|
28146
28159
|
|
|
@@ -28185,12 +28198,12 @@ var init_contracts = __esm({
|
|
|
28185
28198
|
setupStatus = external_exports.strictObject({ linkCode: external_exports.strictObject({ id: uuid3, agent: knownAgent.nullable(), status: external_exports.enum(["pending", "claimed", "expired"]), expiresAt: iso, installationId: uuid3.nullable() }).nullable(), installation: external_exports.strictObject({ id: uuid3, label: str, readiness, steps: data, agents: external_exports.array(knownAgent) }).nullable() });
|
|
28186
28199
|
actionSummary = external_exports.strictObject({ name: str, title: str, summary: external_exports.string(), effect: external_exports.enum(["read", "create", "update", "delete"]).optional(), availability: external_exports.enum(["executable", "unavailable"]), policy: external_exports.enum(["approve", "deny", "disable"]), health: data, documentation: data.optional() });
|
|
28187
28200
|
actionDocumentation = external_exports.strictObject({ name: str, title: str, description: external_exports.string(), effect: external_exports.enum(["read", "create", "update", "delete"]).optional(), availability: external_exports.enum(["executable", "unavailable"]), inputs: jsonSchema, output: jsonSchema.optional(), proof: external_exports.enum(["readback", "absence"]).optional(), unavailable: external_exports.strictObject({ reason: str, evidence: str }).optional(), transport: external_exports.strictObject({ name: str, mode: external_exports.enum(["direct", "browser"]), instructions: str, credentials: external_exports.array(external_exports.strictObject({ name: str, header: str })) }).optional(), version: external_exports.number().int().positive(), executableHash: hash2.optional(), policy: external_exports.enum(["approve", "deny", "disable"]), health: data });
|
|
28188
|
-
bundle = external_exports.strictObject({ decision: external_exports.literal("allow"), app: external_exports.strictObject({ id: uuid3, slug: str, visibility: external_exports.enum(["public", "private"]) }), action: external_exports.strictObject({ name: str, effect: external_exports.enum(["read", "create", "update", "delete"]) }), closure: external_exports.strictObject({ hash: hash2, status: external_exports.enum(["pending", "validated"]), workspaceStatus: external_exports.literal("successful").nullable(), versions: external_exports.array(external_exports.strictObject({ kind: resourceKindSchema, name: str, version: external_exports.number().int().positive(), executableHash: hash2, definition })) }), selection: external_exports.strictObject({ channel: external_exports.enum(["latest", "validated"]), fallback: external_exports.boolean(), replaced: external_exports.strictObject({ closureHash: hash2, reason: str }).optional() }), policy: external_exports.literal("approve") });
|
|
28201
|
+
bundle = external_exports.strictObject({ receipt: external_exports.strictObject({ id: uuid3, dispatchBefore: iso }).optional(), decision: external_exports.literal("allow"), app: external_exports.strictObject({ id: uuid3, slug: str, visibility: external_exports.enum(["public", "private"]) }), action: external_exports.strictObject({ name: str, effect: external_exports.enum(["read", "create", "update", "delete"]) }), closure: external_exports.strictObject({ hash: hash2, status: external_exports.enum(["pending", "validated"]), workspaceStatus: external_exports.literal("successful").nullable(), versions: external_exports.array(external_exports.strictObject({ kind: resourceKindSchema, name: str, version: external_exports.number().int().positive(), executableHash: hash2, definition })) }), selection: external_exports.strictObject({ channel: external_exports.enum(["latest", "validated"]), fallback: external_exports.boolean(), replaced: external_exports.strictObject({ closureHash: hash2, reason: str, until: iso.optional() }).optional() }), policy: external_exports.literal("approve") });
|
|
28189
28202
|
resourceRead = external_exports.strictObject({ ...kindName.shape, definition, version: external_exports.number().int().positive(), executableHash: hash2.optional(), verification: data.optional(), dependents: external_exports.array(kindName).optional() });
|
|
28190
|
-
resourceRequirements = external_exports.strictObject({ name: str, title: str, mode: external_exports.enum(["direct", "browser"]), instructions: str, credentials: external_exports.array(external_exports.strictObject({ name: str, header: str, prefix: external_exports.string().optional() })) });
|
|
28203
|
+
resourceRequirements = external_exports.strictObject({ legacyCredentialContract: str.optional(), credentialContract: str.optional(), destinations: external_exports.array(str).optional(), name: str, title: str, mode: external_exports.enum(["direct", "browser"]), instructions: str, credentials: external_exports.array(external_exports.strictObject({ name: str, header: str, prefix: external_exports.string().optional() })) });
|
|
28191
28204
|
safetyReview = external_exports.union([external_exports.strictObject({ access: external_exports.literal("locked") }), external_exports.strictObject({ access: external_exports.literal("included"), state: external_exports.enum(["missing", "checking", "ready", "unavailable"]), route: str, findings: data.optional(), checkedAt: iso.optional(), stale: external_exports.boolean().optional(), message: external_exports.string().optional() })]);
|
|
28192
28205
|
billing = external_exports.strictObject({ workspaceId: uuid3, paddleCustomerId: str.optional(), entitlement, trial: external_exports.strictObject({ status: external_exports.enum(["active", "ended", "converted"]), startedAt: iso, endsAt: iso, completedAt: iso.optional() }).optional(), subscription: external_exports.strictObject({ id: str, status: str, plan: str, interval: str, currency: str, currentPeriod: external_exports.strictObject({ startsAt: iso, endsAt: iso }), nextBilledAt: iso.optional(), graceEndsAt: iso.optional(), scheduledChange: data.optional() }).optional(), usage: data.optional(), checkout: external_exports.strictObject({ status: external_exports.enum(["pending", "unknown"]), transactionId: str.optional() }).optional(), checkoutAvailable: external_exports.boolean(), paddle: external_exports.strictObject({ environment: external_exports.enum(["sandbox", "production"]), clientToken: str }) });
|
|
28193
|
-
executionReportSchema = external_exports.strictObject({ id: uuid3, appId: uuid3, actionName: str, actionVersion: external_exports.number().int().positive(), closureHash: hash2, purpose: external_exports.enum(["run", "verify"]), clientFamily: external_exports.enum(["cli", "discovery"]), agent, outcome: external_exports.enum(["caller-error", "credential-error", "rate-limit", "app-outage", "interface-error", "uncertain", "network-error", "success", "cancelled"]), diagnostic: external_exports.enum(["operation-unavailable", "response-contract", "proof-failed"]).optional(), httpStatus: external_exports.number().int().optional(), proof: external_exports.enum(["passed", "failed", "unavailable"]).optional(), semanticConfirmed: external_exports.boolean().optional(), connectionFingerprint: hash2.optional(), startedAt: iso, dispatchedAt: iso.optional(), finishedAt: iso });
|
|
28206
|
+
executionReportSchema = external_exports.strictObject({ id: uuid3, receiptId: uuid3.optional(), appId: uuid3, actionName: str, actionVersion: external_exports.number().int().positive(), closureHash: hash2, purpose: external_exports.enum(["run", "verify"]), clientFamily: external_exports.enum(["cli", "discovery"]), agent, outcome: external_exports.enum(["caller-error", "credential-error", "rate-limit", "app-outage", "interface-error", "uncertain", "network-error", "success", "cancelled"]), diagnostic: external_exports.enum(["operation-unavailable", "response-contract", "proof-failed"]).optional(), httpStatus: external_exports.number().int().optional(), proof: external_exports.enum(["passed", "failed", "unavailable"]).optional(), semanticConfirmed: external_exports.boolean().optional(), connectionFingerprint: hash2.optional(), startedAt: iso, dispatchedAt: iso.optional(), finishedAt: iso });
|
|
28194
28207
|
sharedMeasure = { durationMs: external_exports.number().min(0).max(864e5).nullable(), tokens: external_exports.strictObject({ input: external_exports.number().min(0).max(1e8), output: external_exports.number().min(0).max(1e8) }).nullable(), coverage: external_exports.enum(["final", "partial", "unavailable"]), timeCoverage: external_exports.enum(["final", "partial", "unavailable"]), provider: external_exports.enum(["openai", "anthropic", "bedrock", "vertex", "custom"]).nullable(), model: external_exports.string().max(120).regex(/^[A-Za-z0-9._<>[\]:/@-]+$/).nullable() };
|
|
28195
28208
|
executionMeasurementSchema = external_exports.strictObject({ id: uuid3, executionId: uuid3, revision: external_exports.number().int().positive(), purpose: external_exports.enum(["productive", "discovery", "verification", "setup", "unknown"]), session: hash2.nullable(), worker: hash2.nullable(), ...sharedMeasure });
|
|
28196
28209
|
baselineSampleSchema = external_exports.strictObject({ id: uuid3, revision: external_exports.number().int().positive(), appId: uuid3, actionName: str.nullable(), executableHash: hash2.nullable(), method: external_exports.enum(["browser", "direct"]).nullable(), completeness: external_exports.enum(["complete", "prefix"]), occurredAt: iso, ...sharedMeasure });
|
|
@@ -28216,8 +28229,8 @@ var init_contracts = __esm({
|
|
|
28216
28229
|
getBundle: apiContract("GET", "/api/v1/apps/{app}/actions/{action}/bundle", "installation", actionPath, noQuery, noBody, bundle, ["session-limit", "action-withheld", "action-disabled", "action-denied", "action-unavailable"]),
|
|
28217
28230
|
listResources: apiContract("GET", "/api/v1/apps/{app}/resources", "installation", path, external_exports.strictObject({ kind: resourceKindSchema.optional(), names: str.optional() }), noBody, page(external_exports.strictObject({ ...kindName.shape, version: external_exports.number().int().positive(), executableHash: hash2.optional(), updatedAt: iso }))),
|
|
28218
28231
|
getResource: apiContract("GET", "/api/v1/apps/{app}/resources/{kind}/{name}", "installation-or-cookie", resourcePath, external_exports.strictObject({ view: external_exports.literal("requirements").optional() }), noBody, external_exports.union([resourceRead, resourceRequirements])),
|
|
28219
|
-
publishResource: apiContract("PUT", "/api/v1/apps/{app}/resources/{kind}/{name}", "installation", resourcePath, noQuery, external_exports.union([external_exports.strictObject({ requestId: uuid3, expectedVersion: external_exports.number().int().positive().nullable(), definition, verification: data.optional() }), external_exports.strictObject({ requestId: uuid3, expectedVersion: external_exports.number().int().positive(), remove: external_exports.literal(true) })]), external_exports.strictObject({ resource: external_exports.strictObject({ ...kindName.shape, version: external_exports.number().int().positive() }), executableHash: hash2.optional(), closureHash: hash2.optional() }), ["definition-invalid", "documentation-incomplete", "reference-unresolved", "reference-cycle", "verification-incomplete", "verification-stale", "version-conflict"]),
|
|
28220
|
-
listChanges: apiContract("GET", "/api/v1/apps/{app}/changes", "installation-or-cookie", path, external_exports.strictObject({ resource: str.optional(), ...pageQuery }), noBody, page(external_exports.strictObject({ change: external_exports.number().int().positive(), kind: resourceKindSchema, name: str, version: external_exports.number().int().positive(), event: external_exports.enum(["published", "removed"]), publishedAt: iso }))),
|
|
28232
|
+
publishResource: apiContract("PUT", "/api/v1/apps/{app}/resources/{kind}/{name}", "installation", resourcePath, noQuery, external_exports.union([external_exports.strictObject({ requestId: uuid3, expectedVersion: external_exports.number().int().positive().nullable(), definition, verification: data.optional() }), external_exports.strictObject({ requestId: uuid3, expectedVersion: external_exports.number().int().positive(), remove: external_exports.literal(true) })]), external_exports.strictObject({ resource: external_exports.strictObject({ ...kindName.shape, version: external_exports.number().int().positive() }), executableHash: hash2.optional(), closureHash: hash2.optional(), distribution: external_exports.strictObject({ state: external_exports.enum(["available", "testing", "queued", "paused"]), reason: str.optional(), until: iso.optional() }).optional() }), ["definition-invalid", "documentation-incomplete", "reference-unresolved", "reference-cycle", "verification-incomplete", "verification-stale", "version-conflict"]),
|
|
28233
|
+
listChanges: apiContract("GET", "/api/v1/apps/{app}/changes", "installation-or-cookie", path, external_exports.strictObject({ resource: str.optional(), ...pageQuery }), noBody, page(external_exports.strictObject({ change: external_exports.number().int().positive(), kind: resourceKindSchema, name: str, version: external_exports.number().int().positive(), event: external_exports.enum(["published", "removed"]), distribution: external_exports.strictObject({ state: external_exports.enum(["available", "testing", "queued", "paused"]), reason: str.optional(), until: iso.optional() }).optional(), publishedAt: iso }))),
|
|
28221
28234
|
safetyReview: apiContract("GET", "/api/v1/apps/{app}/safety-review", "cookie", path, noQuery, noBody, safetyReview),
|
|
28222
28235
|
postExecutions: apiContract("POST", "/api/v1/executions", "installation", noParams, noQuery, external_exports.strictObject({ reports: external_exports.array(external_exports.unknown()).min(1).max(100) }), executionAcknowledgement),
|
|
28223
28236
|
postMeasurements: apiContract("POST", "/api/v1/measurements", "installation", noParams, noQuery, external_exports.strictObject({ executions: external_exports.array(external_exports.unknown()).max(100), baselines: external_exports.array(external_exports.unknown()).max(100) }).refine((body) => body.executions.length + body.baselines.length >= 1 && body.executions.length + body.baselines.length <= 100), measurementAcknowledgement),
|
|
@@ -28312,6 +28325,7 @@ function createCliApi(baseUrl, fetcher = fetch, token, sessionId) {
|
|
|
28312
28325
|
const transport = async (input2, init) => {
|
|
28313
28326
|
const method = init?.method ?? "GET";
|
|
28314
28327
|
const headers = new Headers(init?.headers);
|
|
28328
|
+
headers.set("Apilift-Capabilities", "distributed-rollouts-v1");
|
|
28315
28329
|
headers.set("Apilift-Client", `cli/${cliVersion}`);
|
|
28316
28330
|
if (token) headers.set("Authorization", `Bearer ${token}`);
|
|
28317
28331
|
if (sessionId) headers.set("Apilift-Session", sessionId);
|
|
@@ -31136,13 +31150,14 @@ var init_credentials = __esm({
|
|
|
31136
31150
|
constructor(root, vault) {
|
|
31137
31151
|
this.vault = vault;
|
|
31138
31152
|
this.state = new LocalState(root);
|
|
31139
|
-
this.state.db.exec(`CREATE TABLE IF NOT EXISTS credential_draft (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, app_id TEXT NOT NULL, transport_name TEXT NOT NULL, requirements_json TEXT NOT NULL, expires_at TEXT NOT NULL); CREATE TABLE IF NOT EXISTS credential_draft_source (id TEXT PRIMARY KEY, draft_id TEXT NOT NULL, session_id TEXT NOT NULL, fingerprint TEXT NOT NULL); CREATE TABLE IF NOT EXISTS credential_entry (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, app_id TEXT NOT NULL, transport_name TEXT NOT NULL, name TEXT NOT NULL, name_fold TEXT NOT NULL, requirements_json TEXT NOT NULL, ciphertext BLOB NOT NULL, iv BLOB NOT NULL, tag BLOB NOT NULL, created_at TEXT NOT NULL, UNIQUE(app_id,transport_name,name_fold));`);
|
|
31153
|
+
this.state.db.exec(`CREATE TABLE IF NOT EXISTS credential_scope (id TEXT PRIMARY KEY, contract TEXT NOT NULL); CREATE TABLE IF NOT EXISTS credential_draft (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, app_id TEXT NOT NULL, transport_name TEXT NOT NULL, requirements_json TEXT NOT NULL, expires_at TEXT NOT NULL); CREATE TABLE IF NOT EXISTS credential_draft_source (id TEXT PRIMARY KEY, draft_id TEXT NOT NULL, session_id TEXT NOT NULL, fingerprint TEXT NOT NULL); CREATE TABLE IF NOT EXISTS credential_entry (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, app_id TEXT NOT NULL, transport_name TEXT NOT NULL, name TEXT NOT NULL, name_fold TEXT NOT NULL, requirements_json TEXT NOT NULL, ciphertext BLOB NOT NULL, iv BLOB NOT NULL, tag BLOB NOT NULL, created_at TEXT NOT NULL, UNIQUE(app_id,transport_name,name_fold));`);
|
|
31140
31154
|
}
|
|
31141
31155
|
state;
|
|
31142
31156
|
registerDraft(binding2) {
|
|
31143
31157
|
this.verify(binding2);
|
|
31144
31158
|
if (!Number.isFinite(Date.parse(binding2.expiresAt)) || (Date.parse(binding2.expiresAt) <= Date.now() || Date.parse(binding2.expiresAt) > Date.now() + 30 * 6e4)) throw new CredentialError("draft-expired", "Credential draft has expired");
|
|
31145
31159
|
this.state.db.prepare("INSERT INTO credential_draft (id,workspace_id,app_id,transport_name,requirements_json,expires_at) VALUES (?,?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET workspace_id=excluded.workspace_id,app_id=excluded.app_id,transport_name=excluded.transport_name,requirements_json=excluded.requirements_json,expires_at=excluded.expires_at").run(binding2.draftId, binding2.workspaceId, binding2.appId, binding2.transportName, JSON.stringify(binding2.requirements), binding2.expiresAt);
|
|
31160
|
+
if (binding2.credentialContract) this.state.db.prepare("INSERT OR REPLACE INTO credential_scope (id,contract) VALUES (?,?)").run(binding2.draftId, binding2.credentialContract);
|
|
31146
31161
|
if (binding2.source) this.state.db.prepare("INSERT INTO credential_draft_source (id,draft_id,session_id,fingerprint) VALUES (?,?,?,?) ON CONFLICT(id) DO UPDATE SET draft_id=excluded.draft_id,session_id=excluded.session_id,fingerprint=excluded.fingerprint").run(binding2.draftId, binding2.source.draftId, binding2.source.sessionId, binding2.source.fingerprint);
|
|
31147
31162
|
}
|
|
31148
31163
|
resolveDraft(binding2) {
|
|
@@ -31164,7 +31179,10 @@ var init_credentials = __esm({
|
|
|
31164
31179
|
}
|
|
31165
31180
|
const requirements = JSON.parse(row.requirements_json);
|
|
31166
31181
|
if (!sameRequirements(requirements, binding2.requirements)) throw new CredentialError("requirements-mismatch", "Credential requirements changed. Ask the agent for a new link");
|
|
31167
|
-
|
|
31182
|
+
const scope2 = this.state.db.prepare("SELECT contract FROM credential_scope WHERE id=?").get(binding2.draftId);
|
|
31183
|
+
const contract = scope2?.contract;
|
|
31184
|
+
const destinations = contract ? JSON.parse(contract).origins : void 0;
|
|
31185
|
+
return { ...binding2, requirements, ...contract ? { credentialContract: contract, destinations } : {} };
|
|
31168
31186
|
}
|
|
31169
31187
|
verify(binding2) {
|
|
31170
31188
|
if (this.state.installation()?.workspaceId !== binding2.workspaceId) throw new CredentialError("workspace-mismatch", "Credential workspace does not match this installation");
|
|
@@ -31178,7 +31196,7 @@ var init_credentials = __esm({
|
|
|
31178
31196
|
}
|
|
31179
31197
|
async put(binding2) {
|
|
31180
31198
|
if (binding2.draftId) {
|
|
31181
|
-
this.resolveDraft(binding2);
|
|
31199
|
+
binding2 = { ...binding2, ...this.resolveDraft(binding2) };
|
|
31182
31200
|
const source = this.state.db.prepare("SELECT session_id FROM credential_draft_source WHERE id=?").get(binding2.draftId);
|
|
31183
31201
|
if (source && binding2.sessionId !== source.session_id) throw new CredentialError("session-mismatch", "Credential setup belongs to another requesting agent session");
|
|
31184
31202
|
}
|
|
@@ -31195,6 +31213,7 @@ var init_credentials = __esm({
|
|
|
31195
31213
|
this.state.db.exec("BEGIN EXCLUSIVE");
|
|
31196
31214
|
if (binding2.draftId) this.resolveDraft(binding2);
|
|
31197
31215
|
this.state.db.prepare("INSERT INTO credential_entry (id,workspace_id,app_id,transport_name,name,name_fold,requirements_json,ciphertext,iv,tag,created_at) VALUES (?,?,?,?,?,?,?,?,?,?,?)").run(id2, binding2.workspaceId, binding2.appId, binding2.transportName, name, name.toLocaleLowerCase(), JSON.stringify(binding2.requirements), ciphertext, iv, tag, (/* @__PURE__ */ new Date()).toISOString());
|
|
31216
|
+
if (binding2.credentialContract) this.state.db.prepare("INSERT INTO credential_scope (id,contract) VALUES (?,?)").run(id2, binding2.credentialContract);
|
|
31198
31217
|
if (binding2.sessionId) {
|
|
31199
31218
|
const current = this.state.useSession(binding2.sessionId, binding2.appId);
|
|
31200
31219
|
this.state.saveUseSession({ agentSessionId: binding2.sessionId, appId: binding2.appId, context: current?.credentials[binding2.transportName] === id2 ? current.context : {}, credentials: { ...current?.credentials, [binding2.transportName]: id2 } });
|
|
@@ -31238,6 +31257,7 @@ var init_credentials = __esm({
|
|
|
31238
31257
|
if (!sameRequirements(entry2.requirements, binding2.requirements)) throw new CredentialError("credential-incompatible", "Saved credential fields do not match the selected transport");
|
|
31239
31258
|
try {
|
|
31240
31259
|
this.state.db.prepare("UPDATE credential_entry SET app_id=?,transport_name=? WHERE id=? AND workspace_id=?").run(binding2.appId, binding2.transportName, id2, binding2.workspaceId);
|
|
31260
|
+
if (binding2.credentialContract) this.state.db.prepare("INSERT OR REPLACE INTO credential_scope (id,contract) VALUES (?,?)").run(id2, binding2.credentialContract);
|
|
31241
31261
|
} catch (error62) {
|
|
31242
31262
|
if (error62 instanceof Error && /UNIQUE constraint/.test(error62.message)) throw new CredentialError("credential-label-exists", "A credential with this label already exists for this app and transport");
|
|
31243
31263
|
throw error62;
|
|
@@ -31250,8 +31270,16 @@ var init_credentials = __esm({
|
|
|
31250
31270
|
if (!row) throw new CredentialError("credential-missing", "Credential entry does not belong to this app and transport");
|
|
31251
31271
|
const stored = JSON.parse(row.requirements_json);
|
|
31252
31272
|
if (!sameRequirements(stored, binding2.requirements)) throw new CredentialError("credential-requirements-changed", "Credential requirements changed; configure the entry again");
|
|
31273
|
+
let scope2 = this.state.db.prepare("SELECT contract FROM credential_scope WHERE id=?").get(id2);
|
|
31274
|
+
if (!scope2 && binding2.credentialContract && binding2.legacyCredentialContract === binding2.credentialContract) {
|
|
31275
|
+
this.state.db.prepare("INSERT OR IGNORE INTO credential_scope (id,contract) VALUES (?,?)").run(id2, binding2.credentialContract);
|
|
31276
|
+
scope2 = this.state.db.prepare("SELECT contract FROM credential_scope WHERE id=?").get(id2);
|
|
31277
|
+
}
|
|
31278
|
+
if (scope2?.contract !== binding2.credentialContract) throw new CredentialError("credential-destination-changed", "The saved credential is not bound to this destination and injection contract; complete connection setup");
|
|
31253
31279
|
const key = Buffer.from(await this.vault.get(id2), "base64");
|
|
31254
31280
|
if (binding2.draftId) this.resolveDraft(binding2);
|
|
31281
|
+
const stillBound = this.state.db.prepare("SELECT s.contract FROM credential_entry e LEFT JOIN credential_scope s ON s.id=e.id WHERE e.id=? AND e.workspace_id=? AND e.app_id=? AND e.transport_name=?").get(id2, binding2.workspaceId, binding2.appId, binding2.transportName);
|
|
31282
|
+
if (!stillBound || (stillBound.contract ?? void 0) !== binding2.credentialContract) throw new CredentialError("credential-binding-changed", "The selected credential changed while the vault was opening; complete connection setup");
|
|
31255
31283
|
if (key.length !== 32) throw new CredentialError("vault-key-invalid", "Credential vault key is invalid");
|
|
31256
31284
|
const decipher = createDecipheriv("aes-256-gcm", key, row.iv);
|
|
31257
31285
|
decipher.setAuthTag(row.tag);
|
|
@@ -31276,6 +31304,7 @@ var init_credentials = __esm({
|
|
|
31276
31304
|
if (!row) throw new CredentialError("credential-missing", "Credential entry was not found");
|
|
31277
31305
|
await this.vault.delete(binding2.credentialId);
|
|
31278
31306
|
this.state.db.prepare("DELETE FROM credential_entry WHERE id=?").run(binding2.credentialId);
|
|
31307
|
+
this.state.db.prepare("DELETE FROM credential_scope WHERE id=?").run(binding2.credentialId);
|
|
31279
31308
|
const sessions = this.state.db.prepare("SELECT agent_session_id,context_json,credentials_json FROM use_session WHERE app_id=?").all(binding2.appId);
|
|
31280
31309
|
for (const session of sessions) {
|
|
31281
31310
|
const credentials = JSON.parse(session.credentials_json);
|
|
@@ -31576,7 +31605,7 @@ async function send(fetcher, prepared, allowNonJsonProbe = false) {
|
|
|
31576
31605
|
const body = await responseBody(response, allowNonJsonProbe);
|
|
31577
31606
|
return { response, body };
|
|
31578
31607
|
}
|
|
31579
|
-
async function sendBrowser(root, appId, contextName, pageOrigin, effect2, transportName, transport, prepared, dispatched, credentialId, credentialDraftId, allowNonJsonProbe = false) {
|
|
31608
|
+
async function sendBrowser(root, appId, contextName, pageOrigin, effect2, transportName, transport, prepared, dispatched, credentialId, credentialDraftId, allowNonJsonProbe = false, dispatchBefore) {
|
|
31580
31609
|
const client = await captureClient(root);
|
|
31581
31610
|
const inspect = await client.openScope({ kind: "inspect", appId, contextId: contextName, pageOrigin, ownerPid: process.pid, ownerStartedAt: Date.now() - process.uptime() * 1e3 });
|
|
31582
31611
|
let candidates = [];
|
|
@@ -31597,9 +31626,9 @@ async function sendBrowser(root, appId, contextName, pageOrigin, effect2, transp
|
|
|
31597
31626
|
const headers = Object.fromEntries(new Headers(prepared.init.headers).entries());
|
|
31598
31627
|
const authRecipeDefinition = transport.inject?.length ? { inject: transport.inject } : void 0;
|
|
31599
31628
|
const authRecipeHash = authRecipeDefinition ? await hashJson(authRecipeDefinition) : void 0;
|
|
31600
|
-
const envelope = { job: { id: id2, kind: "replay", effect: effect2, method: prepared.init.method, url: prepared.url.href, headers, ...prepared.init.body ? { body: String(prepared.init.body) } : {}, pageOrigin, allowedRequestOrigin: prepared.url.origin, timeoutMs: 2e4, ...authRecipeDefinition ? { authRecipeDefinition, authRecipeHash, authRecipeId: `recipe-${authRecipeHash.slice(0, 12)}` } : {} }, ...credentialId ? { credentialRef: { appId, transportName, credentialId, ...credentialDraftId ? { draftId: credentialDraftId } : {}, requirements: transport.credentials ?? [] } } : {} };
|
|
31601
|
-
await client.enqueueJob(scope2.id, envelope);
|
|
31629
|
+
const envelope = { ...dispatchBefore ? { authorization: { dispatchBefore } } : {}, job: { id: id2, kind: "replay", effect: effect2, method: prepared.init.method, url: prepared.url.href, headers, ...prepared.init.body ? { body: String(prepared.init.body) } : {}, pageOrigin, allowedRequestOrigin: prepared.url.origin, timeoutMs: 2e4, ...authRecipeDefinition ? { authRecipeDefinition, authRecipeHash, authRecipeId: `recipe-${authRecipeHash.slice(0, 12)}` } : {} }, ...credentialId ? { credentialRef: { appId, transportName, credentialId, ...credentialDraftId ? { draftId: credentialDraftId } : {}, requirements: transport.credentials ?? [] } } : {} };
|
|
31602
31630
|
dispatched();
|
|
31631
|
+
await client.enqueueJob(scope2.id, envelope);
|
|
31603
31632
|
const deadline = Date.now() + 45e3;
|
|
31604
31633
|
do {
|
|
31605
31634
|
const held = await client.jobResult(id2);
|
|
@@ -31672,8 +31701,8 @@ No app request was sent.
|
|
|
31672
31701
|
`, 5);
|
|
31673
31702
|
let browserPage;
|
|
31674
31703
|
if (transport.mode === "browser") {
|
|
31675
|
-
const page2 =
|
|
31676
|
-
if (!
|
|
31704
|
+
const page2 = bundle2.closure.versions.find((item) => item.kind === "browser-context" && item.name === transport.browserContext);
|
|
31705
|
+
if (!page2) return fail2("browser-page-missing \u2014 The selected browser page is unavailable. No app request was sent.\n", 5);
|
|
31677
31706
|
browserPage = page2.definition;
|
|
31678
31707
|
}
|
|
31679
31708
|
try {
|
|
@@ -31693,16 +31722,18 @@ Inspect current action documentation: ${prefix(`actions show ${appName} ${action
|
|
|
31693
31722
|
}
|
|
31694
31723
|
let dispatchedAt;
|
|
31695
31724
|
const markDispatched = () => {
|
|
31725
|
+
if (!dispatchedAt && bundle2.receipt && Date.now() > Date.parse(bundle2.receipt.dispatchBefore)) throw new Error("Execution authorization expired before dispatch; start a new invocation");
|
|
31696
31726
|
dispatchedAt ??= (/* @__PURE__ */ new Date()).toISOString();
|
|
31697
31727
|
};
|
|
31698
31728
|
const sendRequest = async (request2, effect2) => {
|
|
31699
|
-
if (transport.mode === "browser") return sendBrowser(root, bundle2.app.id, transport.browserContext, browserPage.pageOrigin, effect2, action.transport, transport, request2, markDispatched, selectedCredential);
|
|
31729
|
+
if (transport.mode === "browser") return sendBrowser(root, bundle2.app.id, transport.browserContext, browserPage.pageOrigin, effect2, action.transport, transport, request2, markDispatched, selectedCredential, void 0, false, bundle2.receipt?.dispatchBefore);
|
|
31700
31730
|
if (selectedCredential) {
|
|
31701
31731
|
const store = new CredentialStore(root, new KeyringVault());
|
|
31702
31732
|
try {
|
|
31703
31733
|
const installation = state.installation();
|
|
31704
31734
|
if (!installation) throw new CredentialError("installation-required", "Installation is no longer linked");
|
|
31705
|
-
const
|
|
31735
|
+
const requirements = await api.call("getResource", { params: { app: bundle2.app.id, kind: "transport", name: action.transport }, query: { view: "requirements" } });
|
|
31736
|
+
const values = await store.read(selectedCredential, { workspaceId: installation.workspaceId, appId: bundle2.app.id, appTitle: bundle2.app.slug, transportName: action.transport, legacyCredentialContract: "legacyCredentialContract" in requirements ? requirements.legacyCredentialContract : void 0, requirements: transport.credentials ?? [], credentialContract: credentialContractKey(transport), destinations: transport.allowedOrigins });
|
|
31706
31737
|
const headers = new Headers(request2.init.headers);
|
|
31707
31738
|
for (const requirement2 of transport.credentials ?? []) headers.set(requirement2.header, `${requirement2.prefix ?? ""}${values[requirement2.name]}`);
|
|
31708
31739
|
request2 = { ...request2, init: { ...request2.init, headers } };
|
|
@@ -31763,7 +31794,7 @@ Inspect saved entries: ${prefix(`credentials list ${appName} ${action.transport}
|
|
|
31763
31794
|
`, 5, !!dispatchedAt);
|
|
31764
31795
|
}
|
|
31765
31796
|
}
|
|
31766
|
-
const report = { id: reportId, appId: bundle2.app.id, actionName, actionVersion: actionVersion.version, closureHash: bundle2.closure.hash, purpose: "run", clientFamily: "cli", agent: session.agent, outcome, ...diagnostic ? { diagnostic } : {}, startedAt, ...dispatchedAt ? { dispatchedAt } : {}, finishedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
31797
|
+
const report = { id: reportId, connectionFingerprint: await hashJson({ transport: transportVersion.executableHash, credential: selectedCredential ?? null, browser: browserPage?.pageOrigin ?? null }), ...bundle2.receipt ? { receiptId: bundle2.receipt.id } : {}, ...outcome === "success" && action.effect !== "read" ? { proof: "passed" } : {}, appId: bundle2.app.id, actionName, actionVersion: actionVersion.version, closureHash: bundle2.closure.hash, purpose: "run", clientFamily: "cli", agent: session.agent, outcome, ...diagnostic ? { diagnostic } : {}, startedAt, ...dispatchedAt ? { dispatchedAt } : {}, finishedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
31767
31798
|
state.queueExecutionReport(reportId, report);
|
|
31768
31799
|
onReport?.(reportId);
|
|
31769
31800
|
try {
|
|
@@ -31791,6 +31822,8 @@ Inspect saved entries: ${prefix(`credentials list ${appName} ${action.transport}
|
|
|
31791
31822
|
`, 12, true);
|
|
31792
31823
|
}
|
|
31793
31824
|
}
|
|
31825
|
+
if (bundle2.selection.fallback && !["prefer-verified", "pinned-selection"].includes(bundle2.selection.replaced?.reason ?? "")) output2.stderr += `Using a previously working revision (${bundle2.selection.replaced?.reason ?? "compatible-fallback"}). Selection recovers automatically when an eligible revision is available.${bundle2.selection.replaced?.until ? ` Protective pause ends ${bundle2.selection.replaced.until}.` : ""} Inspect distribution with ${prefix(`apps history ${appName}`)}.
|
|
31826
|
+
`;
|
|
31794
31827
|
return output2;
|
|
31795
31828
|
}
|
|
31796
31829
|
async function executeDraftVerification(input2) {
|
|
@@ -31836,7 +31869,7 @@ async function executeDraftVerification(input2) {
|
|
|
31836
31869
|
const store = new CredentialStore(input2.root, new KeyringVault());
|
|
31837
31870
|
try {
|
|
31838
31871
|
credentialDraftId = randomUUID3();
|
|
31839
|
-
store.registerDraft({ workspaceId: installation.workspaceId, appId: input2.appId, appTitle: input2.appSlug, transportName: input2.name, requirements: transport.credentials ?? [], draftId: credentialDraftId, expiresAt: new Date(Date.now() + 30 * 6e4).toISOString(), source: { draftId: selected.id, sessionId: input2.session.id, fingerprint: current.fingerprint } });
|
|
31872
|
+
store.registerDraft({ workspaceId: installation.workspaceId, appId: input2.appId, appTitle: input2.appSlug, transportName: input2.name, requirements: transport.credentials ?? [], credentialContract: credentialContractKey(transport), destinations: transport.allowedOrigins, draftId: credentialDraftId, expiresAt: new Date(Date.now() + 30 * 6e4).toISOString(), source: { draftId: selected.id, sessionId: input2.session.id, fingerprint: current.fingerprint } });
|
|
31840
31873
|
} finally {
|
|
31841
31874
|
store.close();
|
|
31842
31875
|
}
|
|
@@ -31851,7 +31884,7 @@ async function executeDraftVerification(input2) {
|
|
|
31851
31884
|
try {
|
|
31852
31885
|
const installation = input2.state.installation();
|
|
31853
31886
|
if (!installation) throw new CredentialError("installation-required", "Installation is no longer linked");
|
|
31854
|
-
const values2 = await store.read(credential2, { workspaceId: installation.workspaceId, ...credentialDraftId ? { draftId: credentialDraftId } : {}, appId: input2.appId, appTitle: input2.appSlug, transportName: input2.kind === "action" && action && "transport" in action ? action.transport : input2.name, requirements: transport.credentials ?? [] });
|
|
31887
|
+
const values2 = await store.read(credential2, { workspaceId: installation.workspaceId, ...credentialDraftId ? { draftId: credentialDraftId } : {}, appId: input2.appId, appTitle: input2.appSlug, transportName: input2.kind === "action" && action && "transport" in action ? action.transport : input2.name, requirements: transport.credentials ?? [], credentialContract: credentialContractKey(transport), destinations: transport.allowedOrigins });
|
|
31855
31888
|
const headers = new Headers(request2.init.headers);
|
|
31856
31889
|
for (const requirement2 of transport.credentials ?? []) headers.set(requirement2.header, `${requirement2.prefix ?? ""}${values2[requirement2.name]}`);
|
|
31857
31890
|
request2 = { ...request2, init: { ...request2.init, headers } };
|
|
@@ -31889,6 +31922,7 @@ var import__3, import_ajv_formats, ajv3, result, fail2, ResponseContractFailure,
|
|
|
31889
31922
|
var init_run = __esm({
|
|
31890
31923
|
"src/commands/run.ts"() {
|
|
31891
31924
|
"use strict";
|
|
31925
|
+
init_definitions();
|
|
31892
31926
|
init_json();
|
|
31893
31927
|
init_drafts();
|
|
31894
31928
|
init_credential_draft();
|
|
@@ -32404,7 +32438,7 @@ async function app(api, ref) {
|
|
|
32404
32438
|
async function binding(api, appId, appTitle, transportName, workspaceId) {
|
|
32405
32439
|
const resource = await api.call("getResource", { params: { app: appId, kind: "transport", name: transportName }, query: { view: "requirements" } });
|
|
32406
32440
|
if (!("credentials" in resource)) throw new CredentialError("transport-missing", "The named connection has no current credential contract");
|
|
32407
|
-
return { workspaceId, appId, appTitle, transportName, requirements: resource.credentials, instructions: resource.instructions, mode: resource.mode };
|
|
32441
|
+
return { workspaceId, appId, appTitle, transportName, requirements: resource.credentials, credentialContract: resource.credentialContract, legacyCredentialContract: resource.legacyCredentialContract, destinations: resource.destinations, instructions: resource.instructions, mode: resource.mode };
|
|
32408
32442
|
}
|
|
32409
32443
|
async function unboundEntries(store, api) {
|
|
32410
32444
|
const entries = store.entries();
|
|
@@ -32475,7 +32509,7 @@ Inspect its connections: ${command3(invocation, `transports show ${selectedApp.s
|
|
|
32475
32509
|
`, 2);
|
|
32476
32510
|
}
|
|
32477
32511
|
}
|
|
32478
|
-
const current = draftContract ? { workspaceId: installation.workspaceId, appId: selectedApp.id, appTitle: selectedApp.title, transportName, requirements: draftContract.transport.credentials ?? [], instructions: draftContract.transport.description, mode: draftContract.transport.mode } : await binding(api, selectedApp.id, selectedApp.title, transportName, installation.workspaceId);
|
|
32512
|
+
const current = draftContract ? { workspaceId: installation.workspaceId, appId: selectedApp.id, appTitle: selectedApp.title, transportName, requirements: draftContract.transport.credentials ?? [], credentialContract: credentialContractKey(draftContract.transport), destinations: draftContract.transport.allowedOrigins, instructions: draftContract.transport.description, mode: draftContract.transport.mode } : await binding(api, selectedApp.id, selectedApp.title, transportName, installation.workspaceId);
|
|
32479
32513
|
if (invocation.key === "credentialsList") {
|
|
32480
32514
|
const rows = store.entries(selectedApp.id, transportName);
|
|
32481
32515
|
const selectedId = session ? state.useSession(session.id, selectedApp.id)?.credentials[transportName] : void 0;
|
|
@@ -32564,6 +32598,7 @@ var ok3, fail4, command3, compatible;
|
|
|
32564
32598
|
var init_credentials2 = __esm({
|
|
32565
32599
|
"src/commands/credentials.ts"() {
|
|
32566
32600
|
"use strict";
|
|
32601
|
+
init_definitions();
|
|
32567
32602
|
init_drafts();
|
|
32568
32603
|
init_credential_draft();
|
|
32569
32604
|
init_json();
|
|
@@ -33426,7 +33461,7 @@ Leave discovery: ${command4(invocation, "discover close")}
|
|
|
33426
33461
|
const limit = Number(invocation.options.limit ?? 20);
|
|
33427
33462
|
if (!Number.isInteger(limit) || limit < 1 || limit > 100) return fail5("--limit must be from 1 to 100.\n");
|
|
33428
33463
|
const page2 = await api.call("listChanges", { params: { app: invocation.positionals[0] }, query: { limit, cursor: invocation.options.cursor, resource: invocation.options.resource } });
|
|
33429
|
-
return ok4(`${page2.items.length ? page2.items.map((item) => `${item.change}: ${item.event} ${item.kind}:${item.name} v${item.version} (${item.publishedAt})`).join("\n") : "No publication history is visible."}
|
|
33464
|
+
return ok4(`${page2.items.length ? page2.items.map((item) => `${item.change}: ${item.event} ${item.kind}:${item.name} v${item.version} (${item.publishedAt})${item.distribution ? ` \u2014 ${item.distribution.state}${item.distribution.until ? ` until ${item.distribution.until}` : ""}` : ""}`).join("\n") : "No publication history is visible."}
|
|
33430
33465
|
${page2.nextCursor ? `More publications remain. Continue with the exact cursor returned here:
|
|
33431
33466
|
${command4(invocation, `apps history ${invocation.positionals[0]} --limit ${limit} --cursor ${page2.nextCursor}${invocation.options.resource ? ` --resource ${invocation.options.resource}` : ""}`)}
|
|
33432
33467
|
Keep the same --resource filter when one is set. Choose page size with --limit <number> (default 20; maximum 100).
|
|
@@ -33653,6 +33688,10 @@ File: ${draft.filePath}
|
|
|
33653
33688
|
});
|
|
33654
33689
|
if (dependents.length) return blockedRemoval(draft, invocation, dependents, true);
|
|
33655
33690
|
}
|
|
33691
|
+
if (issue2.category !== "invalid") return fail5(`${issue2.code} \u2014 ${issue2.message}
|
|
33692
|
+
${issue2.hint}${typeof issue2.details.retryAfter === "string" ? ` Resume after ${issue2.details.retryAfter}.` : ""}
|
|
33693
|
+
Draft retained: ${draft.filePath}
|
|
33694
|
+
`, cliExitForError(issue2), true);
|
|
33656
33695
|
const details = Array.isArray(issue2.details.issues) ? `
|
|
33657
33696
|
${issue2.details.issues.map((item) => ` ${item.path ?? "/"}: ${item.message ?? "invalid"}`).join("\n")}` : "";
|
|
33658
33697
|
return fail5(`${issue2.code} \u2014 ${issue2.message}${details}
|
|
@@ -33689,6 +33728,9 @@ If no usable public route is found, record the evidence and use browser transpor
|
|
|
33689
33728
|
}
|
|
33690
33729
|
store.published(session.id, published.resource.version);
|
|
33691
33730
|
if (!removing && draft.kind === "action" && published.executableHash) withBaselines(root, (baselines) => baselines.published(draft.id, draft.name, published.executableHash));
|
|
33731
|
+
if (published.distribution && published.distribution.state !== "available") return ok4(`Published ${label(draft.kind)} ${draft.name}. Distribution is ${published.distribution.state}. ${published.distribution.reason === "confirmed-defect" ? "This executable revision was withdrawn. Continue developing and submit a corrected definition." : "You can continue developing and using your accepted revision. Wider distribution advances automatically as independent workspaces use it."}${published.distribution.until ? ` Protective pause ends ${published.distribution.until}.` : ""}
|
|
33732
|
+
Inspect distribution: ${command4(invocation, `apps history ${draft.appSlug} --resource ${backendKind(draft.kind)}:${draft.name}`)}
|
|
33733
|
+
`, true);
|
|
33692
33734
|
if (removing) return ok4(`Removed ${draft.kind} ${draft.name} from the published interface. App records were unchanged.
|
|
33693
33735
|
`, true);
|
|
33694
33736
|
if (draft.kind === "action" && checked.definition && "unavailable" in checked.definition) return ok4(`Published the documented unavailability of ${draft.name}. No app request was sent and this action is not executable.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@apilift/cli",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.20",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"engines": {
|
|
37
37
|
"node": ">=24.16.0 <27"
|
|
38
38
|
},
|
|
39
|
-
"gitHead": "
|
|
39
|
+
"gitHead": "8afe0b75f8a1e7c75819c5eca0dada8f0c817dc0",
|
|
40
40
|
"repository": {
|
|
41
41
|
"type": "git",
|
|
42
42
|
"url": "git+https://github.com/egor-sergeev/apilift.git",
|