@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
- return { ...binding, requirements };
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
- return { ...binding2, requirements };
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 = await api.call("getResource", { params: { app: bundle2.app.id, kind: "browser-context", name: transport.browserContext } });
31676
- if (!("definition" in page2)) return fail2("browser-page-missing \u2014 The published browser page is unavailable. No app request was sent.\n", 5);
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 values = await store.read(selectedCredential, { workspaceId: installation.workspaceId, appId: bundle2.app.id, appTitle: bundle2.app.slug, transportName: action.transport, requirements: transport.credentials ?? [] });
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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "apilift",
3
- "version": "1.4.19",
3
+ "version": "1.4.20",
4
4
  "description": "Set up Apilift and use authenticated app interfaces.",
5
5
  "author": {
6
6
  "name": "Apilift"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "apilift",
3
- "version": "1.4.19",
3
+ "version": "1.4.20",
4
4
  "description": "Set up Apilift and use authenticated app interfaces.",
5
5
  "author": {
6
6
  "name": "Apilift"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apilift/cli",
3
- "version": "1.4.19",
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": "fa014e07f68cedb5bbbf5e134ede2f91bd77a6b7",
39
+ "gitHead": "8afe0b75f8a1e7c75819c5eca0dada8f0c817dc0",
40
40
  "repository": {
41
41
  "type": "git",
42
42
  "url": "git+https://github.com/egor-sergeev/apilift.git",