{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://forge.smol.ai/spec/deploy/v1/schema.json","title":"Forge Deploy configuration v1","description":"The plain-data contract returned by a repository's forgeBuild.ts.","type":"object","additionalProperties":false,"required":["version","app","routes"],"properties":{"version":{"const":1},"name":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$"},"build":{"$ref":"#/$defs/build"},"app":{"$ref":"#/$defs/application"},"routes":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/route"}},"provider":{"$ref":"#/$defs/providers"}},"allOf":[{"if":{"properties":{"app":{"required":["runtime"],"properties":{"runtime":{"const":"opennext-cloudflare"}}}}},"then":{"required":["provider"],"not":{"required":["build"]}}}],"$defs":{"repositoryPath":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*[\\\\\\u0000])[^/]+(?:/[^/]+)*$"},"byteSize":{"type":"string","pattern":"^[1-9][0-9]*(?:KiB|MiB)$"},"build":{"type":"object","additionalProperties":false,"required":["command"],"properties":{"command":{"type":"string","minLength":1,"maxLength":4096},"workingDirectory":{"anyOf":[{"const":"."},{"$ref":"#/$defs/repositoryPath"}]},"context":{"type":"object","additionalProperties":false,"required":["exclude"],"description":"Start with the full project source, apply exclusions, then restore explicit include exceptions.","properties":{"exclude":{"type":"array","minItems":1,"maxItems":256,"items":{"$ref":"#/$defs/buildContextPath"}},"include":{"type":"array","maxItems":256,"items":{"$ref":"#/$defs/buildContextPath"}}}}}},"buildContextPath":{"type":"string","minLength":1,"maxLength":512,"pattern":"^(?:\\*\\*|(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*[\\\\\\u0000])(?:(?!\\*)[^/]+)(?:/(?:(?!\\*)[^/]+))*(?:/\\*\\*)?)$"},"assets":{"type":"object","additionalProperties":false,"required":["directory"],"properties":{"directory":{"$ref":"#/$defs/repositoryPath"},"index":{"$ref":"#/$defs/repositoryPath"},"fallback":{"$ref":"#/$defs/repositoryPath"}}},"stateLimits":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"maxScopes":{"type":"integer","minimum":1,"maximum":1000},"maxStoredBytes":{"$ref":"#/$defs/byteSize"}}},"realtimeLimits":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"maxProjectConnections":{"type":"integer","minimum":0,"maximum":200},"maxActiveTopics":{"type":"integer","minimum":1,"maximum":100},"maxEventBytes":{"$ref":"#/$defs/byteSize"},"maxProjectEventsPerMinute":{"type":"integer","minimum":1,"maximum":300},"maxRecipientsPerEvent":{"type":"integer","minimum":1,"maximum":50},"maxDailyBytes":{"$ref":"#/$defs/byteSize"}}},"limits":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"state":{"$ref":"#/$defs/stateLimits"},"realtime":{"$ref":"#/$defs/realtimeLimits"}}},"identity":{"type":"object","additionalProperties":false,"required":["scopes"],"properties":{"scopes":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["user:basic","accounts:read","teams:read"]}}}},"aiProfileLimits":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"requestsPerMinute":{"type":"integer","minimum":1,"maximum":1000000000},"hostCostMicrosPerDay":{"type":"integer","minimum":1,"maximum":1000000000},"previewHostCostMicrosPerDay":{"type":"integer","minimum":1,"maximum":1000000000}}},"aiJsonSchemaResponse":{"type":"object","additionalProperties":false,"required":["type","name","schema"],"properties":{"type":{"const":"json_schema"},"name":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_-]{0,63}$"},"schema":{"type":"object"}}},"aiProfile":{"type":"object","additionalProperties":false,"required":["model","audience","funding"],"properties":{"model":{"const":"forge/text-fast@1"},"audience":{"enum":["server","signed_in","anonymous"]},"funding":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["host","visitor_byok"]}},"maxInputTokens":{"type":"integer","minimum":1,"maximum":32000},"maxOutputTokens":{"type":"integer","minimum":1,"maximum":4096},"response":{"$ref":"#/$defs/aiJsonSchemaResponse"},"limits":{"$ref":"#/$defs/aiProfileLimits"},"privacy":{"type":"object","additionalProperties":false,"required":["contentLogging"],"properties":{"contentLogging":{"const":"off"}}}}},"ai":{"type":"object","additionalProperties":false,"required":["profiles"],"properties":{"profiles":{"type":"object","minProperties":1,"maxProperties":32,"propertyNames":{"pattern":"^[A-Za-z][A-Za-z0-9_-]{0,63}$"},"additionalProperties":{"$ref":"#/$defs/aiProfile"}}}},"application":{"oneOf":[{"type":"object","additionalProperties":false,"required":["entrypoint"],"properties":{"entrypoint":{"$ref":"#/$defs/repositoryPath"},"assets":{"$ref":"#/$defs/assets"},"limits":{"$ref":"#/$defs/limits"},"identity":{"$ref":"#/$defs/identity"},"ai":{"$ref":"#/$defs/ai"}}},{"type":"object","additionalProperties":false,"required":["assets"],"properties":{"assets":{"$ref":"#/$defs/assets"},"identity":{"$ref":"#/$defs/identity"},"ai":{"$ref":"#/$defs/ai"}}},{"type":"object","additionalProperties":false,"required":["runtime"],"properties":{"runtime":{"const":"opennext-cloudflare"},"identity":{"$ref":"#/$defs/identity"},"ai":{"$ref":"#/$defs/ai"}}}]},"route":{"type":"object","additionalProperties":false,"required":["pattern","to"],"properties":{"pattern":{"type":"string","pattern":"^/(?:[^\\\\?#\\u0000-\\u001f\\u007f]*?)(?:\\*)?$"},"to":{"enum":["app.http","app.assets"]}}},"wranglerReference":{"type":"object","additionalProperties":false,"required":["path","shareProductionResources"],"properties":{"path":{"allOf":[{"$ref":"#/$defs/repositoryPath"},{"pattern":"\\.toml$"}]},"shareProductionResources":{"const":true}}},"providers":{"type":"object","additionalProperties":false,"required":["cloudflare"],"properties":{"cloudflare":{"type":"object","additionalProperties":false,"required":["wrangler"],"properties":{"wrangler":{"$ref":"#/$defs/wranglerReference"}}}}}}}