@lunora/codegen 1.0.0-alpha.124 → 1.0.0-alpha.125

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1767,6 +1767,29 @@ interface FlagSecurityDefaultIR {
1767
1767
  /** 1-based line of the `ctx.flags.boolean` call, or `0` when unknown. */
1768
1768
  line: number;
1769
1769
  }
1770
+ /**
1771
+ * One `ctx.flags` read lexically inside a `query(...)` handler — the
1772
+ * `flag_read_in_subscription` advisor lint input. Flag changes append nothing to
1773
+ * `__cdc_log`, so a subscribed query is never re-run when a flag flips and keeps
1774
+ * serving the branch it last picked; `useFlag` is the reactive path. Structurally
1775
+ * identical to the advisor's `AdvisorFlagRead` (same field set) so values pass
1776
+ * straight through `lintSchema` without conversion, exactly as `R2sqlCallIR` does.
1777
+ *
1778
+ * Only `query` handlers are recorded — unlike `R2sqlCallIR` / `NondeterministicCallIR`
1779
+ * there is no `kind` field, because `mutation`/`action` handlers run once and have
1780
+ * no subscription staleness to warn about, so the feeder drops them rather than
1781
+ * handing the lint rows it would discard.
1782
+ */
1783
+ interface FlagReadIR {
1784
+ /** The accessed `ctx.flags` surface, e.g. `ctx.flags.boolean` / `ctx.flags.details.string`. */
1785
+ callee: string;
1786
+ /** Export binding name of the query performing the read. */
1787
+ exportName: string;
1788
+ /** Source file relative to `<projectRoot>/lunora/`, without extension (the api namespace). */
1789
+ file: string;
1790
+ /** 1-based line of the read, or `0` when unknown. */
1791
+ line: number;
1792
+ }
1770
1793
  /**
1771
1794
  * One `generateText` / `streamText` call in `lunora/` whose `tools` reach a
1772
1795
  * privileged side effect (a DB write, function dispatch, or outbound
@@ -1998,6 +2021,7 @@ interface LintSchemaOptions {
1998
2021
  containers?: ReadonlyArray<ContainerIR>;
1999
2022
  exportSinks?: ReadonlyArray<AdvisorExportSink>;
2000
2023
  failOpenGuards?: ReadonlyArray<FailOpenGuardIR>;
2024
+ flagReads?: ReadonlyArray<FlagReadIR>;
2001
2025
  flagSecurityDefaults?: ReadonlyArray<FlagSecurityDefaultIR>;
2002
2026
  geoIndexUsages?: ReadonlyArray<AdvisorGeoIndexUsage>;
2003
2027
  httpActionGuards?: ReadonlyArray<HttpActionGuardIR>;
package/dist/index.d.ts CHANGED
@@ -1767,6 +1767,29 @@ interface FlagSecurityDefaultIR {
1767
1767
  /** 1-based line of the `ctx.flags.boolean` call, or `0` when unknown. */
1768
1768
  line: number;
1769
1769
  }
1770
+ /**
1771
+ * One `ctx.flags` read lexically inside a `query(...)` handler — the
1772
+ * `flag_read_in_subscription` advisor lint input. Flag changes append nothing to
1773
+ * `__cdc_log`, so a subscribed query is never re-run when a flag flips and keeps
1774
+ * serving the branch it last picked; `useFlag` is the reactive path. Structurally
1775
+ * identical to the advisor's `AdvisorFlagRead` (same field set) so values pass
1776
+ * straight through `lintSchema` without conversion, exactly as `R2sqlCallIR` does.
1777
+ *
1778
+ * Only `query` handlers are recorded — unlike `R2sqlCallIR` / `NondeterministicCallIR`
1779
+ * there is no `kind` field, because `mutation`/`action` handlers run once and have
1780
+ * no subscription staleness to warn about, so the feeder drops them rather than
1781
+ * handing the lint rows it would discard.
1782
+ */
1783
+ interface FlagReadIR {
1784
+ /** The accessed `ctx.flags` surface, e.g. `ctx.flags.boolean` / `ctx.flags.details.string`. */
1785
+ callee: string;
1786
+ /** Export binding name of the query performing the read. */
1787
+ exportName: string;
1788
+ /** Source file relative to `<projectRoot>/lunora/`, without extension (the api namespace). */
1789
+ file: string;
1790
+ /** 1-based line of the read, or `0` when unknown. */
1791
+ line: number;
1792
+ }
1770
1793
  /**
1771
1794
  * One `generateText` / `streamText` call in `lunora/` whose `tools` reach a
1772
1795
  * privileged side effect (a DB write, function dispatch, or outbound
@@ -1998,6 +2021,7 @@ interface LintSchemaOptions {
1998
2021
  containers?: ReadonlyArray<ContainerIR>;
1999
2022
  exportSinks?: ReadonlyArray<AdvisorExportSink>;
2000
2023
  failOpenGuards?: ReadonlyArray<FailOpenGuardIR>;
2024
+ flagReads?: ReadonlyArray<FlagReadIR>;
2001
2025
  flagSecurityDefaults?: ReadonlyArray<FlagSecurityDefaultIR>;
2002
2026
  geoIndexUsages?: ReadonlyArray<AdvisorGeoIndexUsage>;
2003
2027
  httpActionGuards?: ReadonlyArray<HttpActionGuardIR>;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{SCHEMA_SNAPSHOT_VERSION as t,diffSchemaSnapshots as s,serializeSchemaSnapshot as a}from"./packem_shared/SCHEMA_SNAPSHOT_VERSION-CftvRWB8.mjs";import{formatAdvisories as m,lintSchema as d,toAdvisorContext as f}from"./packem_shared/formatAdvisories-CkEu1eye.mjs";import{describeErrorLevelFindings as c,errorAdvisoryNames as n,errorPlatformDiagnosticNames as S}from"./packem_shared/describeErrorLevelFindings-D23VSkFP.mjs";import{CodegenDiagnosticError as E,diagnosticAt as x}from"./packem_shared/CodegenDiagnosticError-BUXlG3P-.mjs";import{AGENTS_FILENAME as u,discoverAgents as v}from"./packem_shared/AGENTS_FILENAME-CPHo8Se5.mjs";import{default as g}from"./packem_shared/discoverAuthApiCalls-DUjcl0SB.mjs";import{CONTAINERS_FILENAME as R,discoverContainers as M}from"./packem_shared/CONTAINERS_FILENAME-Bvn6LZP6.mjs";import{default as C}from"./packem_shared/discoverCrons-BUJO2ipU.mjs";import{FLAGS_FILENAME as T,discoverFlags as I}from"./packem_shared/FLAGS_FILENAME-DtBWyUKq.mjs";import{discoverFunctions as F}from"./packem_shared/discoverFunctions-CYHtspcp.mjs";import{default as P}from"./packem_shared/discoverHttpRoutes-BkwEwmK0.mjs";import{default as G}from"./packem_shared/discoverInserts-YX8AmrzL.mjs";import{default as b}from"./packem_shared/discoverMaskProcedures-DExWLcsu.mjs";import{default as y}from"./packem_shared/discoverMigrations-4Jjf5DJE.mjs";import{MUTATORS_FILENAME as j,discoverMutators as K}from"./packem_shared/MUTATORS_FILENAME-DJerSBO-.mjs";import{default as z}from"./packem_shared/discoverNondeterministicCalls-xRw6-4OU.mjs";import{NOTIFY_FILENAME as w,discoverNotifyCalls as q,discoverNotifyConfig as B}from"./packem_shared/NOTIFY_FILENAME-CPg7zlsb.mjs";import{default as Y}from"./packem_shared/readPackageDependencies-C6h6FZuP.mjs";import{d as Z}from"./packem_shared/discover-queries-Dfj_0WJG.mjs";import{QUEUES_FILENAME as ee,discoverQueues as re}from"./packem_shared/QUEUES_FILENAME-BnGLtAIu.mjs";import{default as te}from"./packem_shared/discoverR2sqlCalls-Ciq0-bVB.mjs";import{discoverRlsMetadata as ae,default as ie}from"./packem_shared/discoverRlsMetadata-Bnn3zDlc.mjs";import{discoverSandboxUsage as de}from"./packem_shared/discoverSandboxUsage-L0lV17de.mjs";import{default as pe}from"./packem_shared/discoverSchema-gJ93Xjpx.mjs";import{SHAPES_FILENAME as ne,discoverShapes as Se}from"./packem_shared/SHAPES_FILENAME-DTp6VI6K.mjs";import{default as Ee}from"./packem_shared/discoverStorageRulesMetadata-DYAgRSL6.mjs";import{WORKFLOWS_FILENAME as Ae,discoverWorkflows as ue}from"./packem_shared/WORKFLOWS_FILENAME-B8y51Frf.mjs";import{G as Ne,e as ge,a as Oe,b as Re,c as Me,d as he,f as Ce,g as _e,h as Te,i as Ie,j as Le,k as Fe,l as De,m as Pe}from"./packem_shared/emit-C_sJaMGR.mjs";import{emitApp as Ge}from"./packem_shared/emitApp-BuPtPsJ1.mjs";import{buildOpenApiDocument as be,emitOpenApi as ke,emitOpenApiModule as ye}from"./packem_shared/buildOpenApiDocument-DvTuBr8Z.mjs";import{OPENRPC_VERSION as je,buildOpenRpcDocument as Ke,emitOpenRpc as Ve,emitOpenRpcModule as ze}from"./packem_shared/OPENRPC_VERSION-DRHMcH-x.mjs";import{DEFAULT_TARGET as we,platformMatrixIds as qe,readProjectTarget as Be,resolveCodegenTarget as Je}from"./packem_shared/DEFAULT_TARGET-CrhWLUK7.mjs";import{SCHEMA_SNAPSHOT_FILENAME as Xe,createCodegenProject as Ze,findTsconfig as $e,refreshCodegenProject as er,runCodegen as rr}from"./packem_shared/SCHEMA_SNAPSHOT_FILENAME-Bb_4PKpT.mjs";import{SchemaSnapshotParseError as tr,buildSchemaSnapshot as sr,evaluateSchemaDrift as ar,parseSchemaSnapshot as ir}from"./packem_shared/SchemaSnapshotParseError-D2h88OHU.mjs";import{schemaFromIr as dr}from"./packem_shared/schemaFromIr-BWFnvCVg.mjs";import{LUNORA_ERROR_CODES as pr,validatorIrToJsonSchema as cr}from"./packem_shared/LUNORA_ERROR_CODES-BYg8Lpgb.mjs";import{SDK_LANGUAGES as Sr,SDK_TARGETS as lr,generateSdk as Er}from"./packem_shared/SDK_LANGUAGES-CFyux-74.mjs";import{redact as Ar,secretKindOf as ur}from"./packem_shared/redact-Cy14LEnc.mjs";import{MESSAGE_SOLUTIONS as Nr,findSolutionByMessage as gr}from"@lunora/errors";import{isTypedSchema as Rr}from"./packem_shared/isTypedSchema-B_qlBbE-.mjs";const e="0.0.0";export{u as AGENTS_FILENAME,R as CONTAINERS_FILENAME,E as CodegenDiagnosticError,we as DEFAULT_TARGET,T as FLAGS_FILENAME,Ne as GENERATED_HEADER,pr as LUNORA_ERROR_CODES,Nr as LUNORA_SOLUTION_RULES,j as MUTATORS_FILENAME,w as NOTIFY_FILENAME,je as OPENRPC_VERSION,ee as QUEUES_FILENAME,Xe as SCHEMA_SNAPSHOT_FILENAME,t as SCHEMA_SNAPSHOT_VERSION,Sr as SDK_LANGUAGES,lr as SDK_TARGETS,ne as SHAPES_FILENAME,tr as SchemaSnapshotParseError,e as VERSION,Ae as WORKFLOWS_FILENAME,be as buildOpenApiDocument,Ke as buildOpenRpcDocument,sr as buildSchemaSnapshot,Ze as createCodegenProject,c as describeErrorLevelFindings,x as diagnosticAt,s as diffSchemaSnapshots,v as discoverAgents,g as discoverAuthApiCalls,M as discoverContainers,C as discoverCrons,I as discoverFlags,F as discoverFunctions,P as discoverHttpRoutes,G as discoverInserts,b as discoverMaskProcedures,y as discoverMigrations,K as discoverMutators,z as discoverNondeterministicCalls,q as discoverNotifyCalls,B as discoverNotifyConfig,Z as discoverQueries,re as discoverQueues,te as discoverR2sqlCalls,ae as discoverRlsMetadata,ie as discoverRlsProcedures,de as discoverSandboxUsage,pe as discoverSchema,Se as discoverShapes,Ee as discoverStorageRulesMetadata,ue as discoverWorkflows,ge as emitAgents,Oe as emitApi,Ge as emitApp,Re as emitCollections,Me as emitContainers,he as emitCrons,Ce as emitDataModel,_e as emitDrizzleSchema,Te as emitFunctions,ke as emitOpenApi,ye as emitOpenApiModule,Ve as emitOpenRpc,ze as emitOpenRpcModule,Ie as emitServer,Le as emitShard,Fe as emitVectors,De as emitWorkflows,Pe as emitWranglerCronTriggers,n as errorAdvisoryNames,S as errorPlatformDiagnosticNames,ar as evaluateSchemaDrift,gr as findLunoraSolution,$e as findTsconfig,m as formatAdvisories,Er as generateSdk,Rr as isTypedSchema,d as lintSchema,ir as parseSchemaSnapshot,qe as platformMatrixIds,Y as readPackageDependencies,Be as readProjectTarget,Ar as redact,er as refreshCodegenProject,Je as resolveCodegenTarget,rr as runCodegen,dr as schemaFromIr,ur as secretKindOf,a as serializeSchemaSnapshot,f as toAdvisorContext,cr as validatorIrToJsonSchema};
1
+ import{SCHEMA_SNAPSHOT_VERSION as t,diffSchemaSnapshots as s,serializeSchemaSnapshot as a}from"./packem_shared/SCHEMA_SNAPSHOT_VERSION-CftvRWB8.mjs";import{formatAdvisories as m,lintSchema as d,toAdvisorContext as f}from"./packem_shared/formatAdvisories-CkEu1eye.mjs";import{describeErrorLevelFindings as c,errorAdvisoryNames as n,errorPlatformDiagnosticNames as S}from"./packem_shared/describeErrorLevelFindings-D23VSkFP.mjs";import{CodegenDiagnosticError as E,diagnosticAt as x}from"./packem_shared/CodegenDiagnosticError-BUXlG3P-.mjs";import{AGENTS_FILENAME as u,discoverAgents as v}from"./packem_shared/AGENTS_FILENAME-CPHo8Se5.mjs";import{default as g}from"./packem_shared/discoverAuthApiCalls-DUjcl0SB.mjs";import{CONTAINERS_FILENAME as R,discoverContainers as M}from"./packem_shared/CONTAINERS_FILENAME-Bvn6LZP6.mjs";import{default as C}from"./packem_shared/discoverCrons-BUJO2ipU.mjs";import{FLAGS_FILENAME as T,discoverFlags as I}from"./packem_shared/FLAGS_FILENAME-DtBWyUKq.mjs";import{discoverFunctions as F}from"./packem_shared/discoverFunctions-CYHtspcp.mjs";import{default as P}from"./packem_shared/discoverHttpRoutes-BkwEwmK0.mjs";import{default as G}from"./packem_shared/discoverInserts-YX8AmrzL.mjs";import{default as b}from"./packem_shared/discoverMaskProcedures-DExWLcsu.mjs";import{default as y}from"./packem_shared/discoverMigrations-4Jjf5DJE.mjs";import{MUTATORS_FILENAME as j,discoverMutators as K}from"./packem_shared/MUTATORS_FILENAME-DJerSBO-.mjs";import{default as z}from"./packem_shared/discoverNondeterministicCalls-xRw6-4OU.mjs";import{NOTIFY_FILENAME as w,discoverNotifyCalls as q,discoverNotifyConfig as B}from"./packem_shared/NOTIFY_FILENAME-CPg7zlsb.mjs";import{default as Y}from"./packem_shared/readPackageDependencies-C6h6FZuP.mjs";import{d as Z}from"./packem_shared/discover-queries-Dfj_0WJG.mjs";import{QUEUES_FILENAME as ee,discoverQueues as re}from"./packem_shared/QUEUES_FILENAME-BnGLtAIu.mjs";import{default as te}from"./packem_shared/discoverR2sqlCalls-Ciq0-bVB.mjs";import{discoverRlsMetadata as ae,default as ie}from"./packem_shared/discoverRlsMetadata-Bnn3zDlc.mjs";import{discoverSandboxUsage as de}from"./packem_shared/discoverSandboxUsage-L0lV17de.mjs";import{default as pe}from"./packem_shared/discoverSchema-gJ93Xjpx.mjs";import{SHAPES_FILENAME as ne,discoverShapes as Se}from"./packem_shared/SHAPES_FILENAME-DTp6VI6K.mjs";import{default as Ee}from"./packem_shared/discoverStorageRulesMetadata-DYAgRSL6.mjs";import{WORKFLOWS_FILENAME as Ae,discoverWorkflows as ue}from"./packem_shared/WORKFLOWS_FILENAME-B8y51Frf.mjs";import{G as Ne,e as ge,a as Oe,b as Re,c as Me,d as he,f as Ce,g as _e,h as Te,i as Ie,j as Le,k as Fe,l as De,m as Pe}from"./packem_shared/emit-Cly81Hl-.mjs";import{emitApp as Ge}from"./packem_shared/emitApp-B0viR4Z7.mjs";import{buildOpenApiDocument as be,emitOpenApi as ke,emitOpenApiModule as ye}from"./packem_shared/buildOpenApiDocument-2Fhd0Abq.mjs";import{OPENRPC_VERSION as je,buildOpenRpcDocument as Ke,emitOpenRpc as Ve,emitOpenRpcModule as ze}from"./packem_shared/OPENRPC_VERSION-NPLC0BNX.mjs";import{DEFAULT_TARGET as we,platformMatrixIds as qe,readProjectTarget as Be,resolveCodegenTarget as Je}from"./packem_shared/DEFAULT_TARGET-CrhWLUK7.mjs";import{SCHEMA_SNAPSHOT_FILENAME as Xe,createCodegenProject as Ze,findTsconfig as $e,refreshCodegenProject as er,runCodegen as rr}from"./packem_shared/SCHEMA_SNAPSHOT_FILENAME-DCm3d4iA.mjs";import{SchemaSnapshotParseError as tr,buildSchemaSnapshot as sr,evaluateSchemaDrift as ar,parseSchemaSnapshot as ir}from"./packem_shared/SchemaSnapshotParseError-D2h88OHU.mjs";import{schemaFromIr as dr}from"./packem_shared/schemaFromIr-BWFnvCVg.mjs";import{LUNORA_ERROR_CODES as pr,validatorIrToJsonSchema as cr}from"./packem_shared/LUNORA_ERROR_CODES-BYg8Lpgb.mjs";import{SDK_LANGUAGES as Sr,SDK_TARGETS as lr,generateSdk as Er}from"./packem_shared/SDK_LANGUAGES-CFyux-74.mjs";import{redact as Ar,secretKindOf as ur}from"./packem_shared/redact-Cy14LEnc.mjs";import{MESSAGE_SOLUTIONS as Nr,findSolutionByMessage as gr}from"@lunora/errors";import{isTypedSchema as Rr}from"./packem_shared/isTypedSchema-B_qlBbE-.mjs";const e="0.0.0";export{u as AGENTS_FILENAME,R as CONTAINERS_FILENAME,E as CodegenDiagnosticError,we as DEFAULT_TARGET,T as FLAGS_FILENAME,Ne as GENERATED_HEADER,pr as LUNORA_ERROR_CODES,Nr as LUNORA_SOLUTION_RULES,j as MUTATORS_FILENAME,w as NOTIFY_FILENAME,je as OPENRPC_VERSION,ee as QUEUES_FILENAME,Xe as SCHEMA_SNAPSHOT_FILENAME,t as SCHEMA_SNAPSHOT_VERSION,Sr as SDK_LANGUAGES,lr as SDK_TARGETS,ne as SHAPES_FILENAME,tr as SchemaSnapshotParseError,e as VERSION,Ae as WORKFLOWS_FILENAME,be as buildOpenApiDocument,Ke as buildOpenRpcDocument,sr as buildSchemaSnapshot,Ze as createCodegenProject,c as describeErrorLevelFindings,x as diagnosticAt,s as diffSchemaSnapshots,v as discoverAgents,g as discoverAuthApiCalls,M as discoverContainers,C as discoverCrons,I as discoverFlags,F as discoverFunctions,P as discoverHttpRoutes,G as discoverInserts,b as discoverMaskProcedures,y as discoverMigrations,K as discoverMutators,z as discoverNondeterministicCalls,q as discoverNotifyCalls,B as discoverNotifyConfig,Z as discoverQueries,re as discoverQueues,te as discoverR2sqlCalls,ae as discoverRlsMetadata,ie as discoverRlsProcedures,de as discoverSandboxUsage,pe as discoverSchema,Se as discoverShapes,Ee as discoverStorageRulesMetadata,ue as discoverWorkflows,ge as emitAgents,Oe as emitApi,Ge as emitApp,Re as emitCollections,Me as emitContainers,he as emitCrons,Ce as emitDataModel,_e as emitDrizzleSchema,Te as emitFunctions,ke as emitOpenApi,ye as emitOpenApiModule,Ve as emitOpenRpc,ze as emitOpenRpcModule,Ie as emitServer,Le as emitShard,Fe as emitVectors,De as emitWorkflows,Pe as emitWranglerCronTriggers,n as errorAdvisoryNames,S as errorPlatformDiagnosticNames,ar as evaluateSchemaDrift,gr as findLunoraSolution,$e as findTsconfig,m as formatAdvisories,Er as generateSdk,Rr as isTypedSchema,d as lintSchema,ir as parseSchemaSnapshot,qe as platformMatrixIds,Y as readPackageDependencies,Be as readProjectTarget,Ar as redact,er as refreshCodegenProject,Je as resolveCodegenTarget,rr as runCodegen,dr as schemaFromIr,ur as secretKindOf,a as serializeSchemaSnapshot,f as toAdvisorContext,cr as validatorIrToJsonSchema};
@@ -1 +1 @@
1
- import"./SCHEMA_SNAPSHOT_VERSION-CftvRWB8.mjs";import{G as t,U as m,n as r,e as o,a as n,b as l,c as A,d as E,f as S,g,h as C,o as c,p as d,i as p,j as u,k as D,l as f,m as h}from"./emit-C_sJaMGR.mjs";import"./paths-C-9fwEgQ.mjs";export{t as GENERATED_HEADER,m as UMBRELLA_BASE_PACKAGES,r as buildStorageColumns,o as emitAgents,n as emitApi,l as emitCollections,A as emitContainers,E as emitCrons,S as emitDataModel,g as emitDrizzleSchema,C as emitFunctions,c as emitQueues,d as emitSeed,p as emitServer,u as emitShard,D as emitVectors,f as emitWorkflows,h as emitWranglerCronTriggers};
1
+ import"./SCHEMA_SNAPSHOT_VERSION-CftvRWB8.mjs";import{G as t,U as m,n as r,e as o,a as n,b as l,c as A,d as E,f as S,g,h as C,o as c,p as d,i as p,j as u,k as D,l as f,m as h}from"./emit-Cly81Hl-.mjs";import"./paths-C-9fwEgQ.mjs";export{t as GENERATED_HEADER,m as UMBRELLA_BASE_PACKAGES,r as buildStorageColumns,o as emitAgents,n as emitApi,l as emitCollections,A as emitContainers,E as emitCrons,S as emitDataModel,g as emitDrizzleSchema,C as emitFunctions,c as emitQueues,d as emitSeed,p as emitServer,u as emitShard,D as emitVectors,f as emitWorkflows,h as emitWranglerCronTriggers};
@@ -1,3 +1,3 @@
1
- import{G as c}from"./emit-C_sJaMGR.mjs";import{s as u}from"./paths-C-9fwEgQ.mjs";import{validatorIrToJsonSchema as m,objectSchema as p,LUNORA_ERROR_CODES as i}from"./LUNORA_ERROR_CODES-BYg8Lpgb.mjs";const l="1.3.2",d={description:"Result is TS-inferred from the function's return type (no `.output()` declared); best-effort — any JSON."},R=e=>{const n=u(e.filePath),o=`${n}:${e.exportName}`;return{description:`Invoke the \`${e.kind}\` \`${o}\` over the Lunora RPC envelope (POST /_lunora/rpc, body \`{ "functionPath": "${o}", "args": { … } }\`).`,errors:i.map((r,s)=>({code:-32e3-s,data:{code:r},message:r})),name:o,params:[{description:"The function's argument object (the RPC envelope's `args`).",name:"args",required:Object.keys(e.args).length>0,schema:p(e.args)}],result:{name:"result",schema:e.output?m(e.output):d},summary:`${e.kind}: ${o}`,"x-lunora-function-kind":e.kind,"x-tags":[{name:n}]}},g=e=>{const n=e.version??"0.0.0",r=e.functions.filter(t=>t.visibility!=="internal"&&t.kind!=="stream").map(t=>R(t)).toSorted((t,a)=>t.name.localeCompare(a.name));return{info:{description:"Auto-generated from @lunora/values-typed functions by @lunora/codegen. Do not edit — run `lunora codegen` to regenerate.",title:"Lunora RPC",version:n},methods:r,openrpc:l}},S=e=>`${JSON.stringify(g(e),void 0,2)}
1
+ import{G as c}from"./emit-Cly81Hl-.mjs";import{s as u}from"./paths-C-9fwEgQ.mjs";import{validatorIrToJsonSchema as m,objectSchema as p,LUNORA_ERROR_CODES as i}from"./LUNORA_ERROR_CODES-BYg8Lpgb.mjs";const l="1.3.2",d={description:"Result is TS-inferred from the function's return type (no `.output()` declared); best-effort — any JSON."},R=e=>{const n=u(e.filePath),o=`${n}:${e.exportName}`;return{description:`Invoke the \`${e.kind}\` \`${o}\` over the Lunora RPC envelope (POST /_lunora/rpc, body \`{ "functionPath": "${o}", "args": { … } }\`).`,errors:i.map((r,s)=>({code:-32e3-s,data:{code:r},message:r})),name:o,params:[{description:"The function's argument object (the RPC envelope's `args`).",name:"args",required:Object.keys(e.args).length>0,schema:p(e.args)}],result:{name:"result",schema:e.output?m(e.output):d},summary:`${e.kind}: ${o}`,"x-lunora-function-kind":e.kind,"x-tags":[{name:n}]}},g=e=>{const n=e.version??"0.0.0",r=e.functions.filter(t=>t.visibility!=="internal"&&t.kind!=="stream").map(t=>R(t)).toSorted((t,a)=>t.name.localeCompare(a.name));return{info:{description:"Auto-generated from @lunora/values-typed functions by @lunora/codegen. Do not edit — run `lunora codegen` to regenerate.",title:"Lunora RPC",version:n},methods:r,openrpc:l}},S=e=>`${JSON.stringify(g(e),void 0,2)}
2
2
  `,v=e=>`${c}export const openRpcSpec: Record<string, unknown> = ${JSON.stringify(e,void 0,4)};
3
3
  `;export{l as OPENRPC_VERSION,g as buildOpenRpcDocument,S as emitOpenRpc,v as emitOpenRpcModule};
@@ -0,0 +1,9 @@
1
+ import{existsSync as N,mkdirSync as jt,readFileSync as xt,writeFileSync as Wt,rmSync as Ht}from"node:fs";import{join as f,dirname as ue}from"node:path";import{performance as de}from"node:perf_hooks";import{runAdvisor as Gt}from"@lunora/advisor";import{LunoraError as R}from"@lunora/errors";import{SyntaxKind as l,Node as i,Project as Qe}from"ts-morph";import{serializeSchemaSnapshot as Yt}from"./SCHEMA_SNAPSHOT_VERSION-CftvRWB8.mjs";import{toAdvisorContext as Qt}from"./formatAdvisories-CkEu1eye.mjs";import{discoverAgents as Xt}from"./AGENTS_FILENAME-CPHo8Se5.mjs";import{discoverContainers as Zt}from"./CONTAINERS_FILENAME-Bvn6LZP6.mjs";import{diagnosticAt as J}from"./CodegenDiagnosticError-BUXlG3P-.mjs";import{b as ee}from"./module-specifiers-WF8iAydP.mjs";import{C as fe,i as Jt,f as es,n as ts,a as ss,h as ns,j as rs,b as is,c as os,l as as,e as cs,o as ls,d as us,k as ds,g as fs,p as ps,m as gs}from"./emit-Cly81Hl-.mjs";import{l as g,a as x,c as y,p as S,f as Et,h as ms,i as hs,r as vt,e as xs}from"./discover-ast-D33zP-NZ.mjs";import Es from"./readPackageDependencies-C6h6FZuP.mjs";import{discoverQueues as vs}from"./QUEUES_FILENAME-BnGLtAIu.mjs";import{discoverSandboxUsage as Ss}from"./discoverSandboxUsage-L0lV17de.mjs";import As from"./discoverStorageRulesMetadata-DYAgRSL6.mjs";import{discoverWorkflows as Ns}from"./WORKFLOWS_FILENAME-B8y51Frf.mjs";import{gatePlatformFeatures as ys,resolveCodegenTarget as bs}from"./DEFAULT_TARGET-CrhWLUK7.mjs";import{i as T,a as F,e as E,c as I,r as Is,b as Ps,s as te,f as ws,g as Ts,d as Cs}from"./discover-queries-Dfj_0WJG.mjs";import{classifyProcedureCall as D,inlineHandler as Os,procedureHandler as St,chainUsesWrappedCall as At,isDatabaseAccessor as _,chainHasStep as Rs,discoverFunctions as Fs,resolveStandardSchemaType as Ls}from"./discoverFunctions-CYHtspcp.mjs";import Ds from"./discoverAuthApiCalls-DUjcl0SB.mjs";import ks from"./discoverCrons-BUJO2ipU.mjs";import{discoverFlagKeys as Ms}from"./FLAGS_FILENAME-DtBWyUKq.mjs";import Ks from"./discoverHttpRoutes-BkwEwmK0.mjs";import _s from"./discoverInserts-YX8AmrzL.mjs";import zs,{discoverMaskStrategies as Us,discoverMaskMetadata as Bs,discoverMaskHasNonLiteralPolicy as qs}from"./discoverMaskProcedures-DExWLcsu.mjs";import $s from"./discoverMigrations-4Jjf5DJE.mjs";import{MUTATORS_FILENAME as Vs,isDefineMutatorCallee as js,discoverMutators as Ws}from"./MUTATORS_FILENAME-DJerSBO-.mjs";import Hs from"./discoverNondeterministicCalls-xRw6-4OU.mjs";import{discoverNotifyConfig as Gs,discoverNotifyCalls as Ys}from"./NOTIFY_FILENAME-CPg7zlsb.mjs";import Qs from"./discoverR2sqlCalls-Ciq0-bVB.mjs";import Xs,{discoverRlsMetadata as Zs}from"./discoverRlsMetadata-Bnn3zDlc.mjs";import Js from"./discoverSchema-gJ93Xjpx.mjs";import{secretKindOf as en,redact as tn,isHeuristicSecretKind as sn,isSecretishName as nn}from"./redact-Cy14LEnc.mjs";import{discoverShapes as rn}from"./SHAPES_FILENAME-DTp6VI6K.mjs";import{emitApp as on}from"./emitApp-B0viR4Z7.mjs";import{buildOpenApiDocument as an,emitOpenApiModule as cn}from"./buildOpenApiDocument-2Fhd0Abq.mjs";import{buildOpenRpcDocument as ln,emitOpenRpcModule as un}from"./OPENRPC_VERSION-NPLC0BNX.mjs";import{s as dn}from"./parse-validator-C5ycrhR3.mjs";import{buildSchemaSnapshot as fn}from"./SchemaSnapshotParseError-D2h88OHU.mjs";const pn=e=>{const t=[],s=e.tables.filter(n=>n.shardMode==="global");return s.some(n=>n.globalBackend!=="hyperdrive")&&t.push({name:"@lunora/d1",reason:"`.global()` tables are D1-backed, so `_generated/app.ts` imports the D1 `ctx.db` adapter"}),s.some(n=>n.globalBackend==="hyperdrive")&&t.push({name:"@lunora/hyperdrive",reason:'`.global({ backend: "hyperdrive" })` tables route through `@lunora/hyperdrive/global`'}),e.vectorIndexes.length>0&&t.push({name:"@lunora/bindings",reason:"`.vectorize()` indexes make `_generated/vectors.ts` import `@lunora/bindings/vectors`"}),t},gn=(e,t)=>{if(t===void 0)return;const s=pn(e).filter(o=>!t.has(o.name));if(s.length===0)return;const n=s.map(o=>` - ${o.name} — ${o.reason}`).join(`
2
+ `);throw new R("INTERNAL",`@lunora/codegen: this schema's generated code imports packages the project does not declare:
3
+ ${n}
4
+
5
+ Install them with your package manager, then re-run codegen.`)},mn="env.ts",hn=e=>{const t=e.getSymbol();if(!t)return e.getText()==="defineEnv";for(const s of t.getDeclarations())if(i.isImportSpecifier(s))return ee(s.getImportDeclaration().getModuleSpecifierValue())?s.getNameNode().getText()==="defineEnv":!1;return!1},xn=e=>{const t=e.getSymbol();if(!t)return!1;for(const s of t.getDeclarations()){if(!i.isNamespaceImport(s))continue;const n=s.getFirstAncestorByKind(l.ImportDeclaration);return n!==void 0&&ee(n.getModuleSpecifierValue())}return!1},En=e=>{if(i.isIdentifier(e))return hn(e);if(i.isPropertyAccessExpression(e)){const t=e.getExpression();return e.getName()==="defineEnv"&&i.isIdentifier(t)&&xn(t)}return!1},vn=e=>{const t=[];for(const s of e.getVariableDeclarations()){if(!s.isExported())continue;const n=s.getInitializer();if(n?.getKind()!==l.CallExpression||!En(n.getExpression()))continue;const r=s.getNameNode();if(!i.isIdentifier(r))throw J(r,"defineEnv exports must be plain named exports (no destructuring)");t.push({exportName:r.getText()})}return t},Sn=(e,t)=>{const s=f(t,mn);if(!N(s))return;const n=e.getSourceFile(s)??e.addSourceFileAtPath(s),o=vn(n);if(o.length!==0){if(o.length>1)throw J(n,`lunora/env.ts declares ${o.length.toString()} defineEnv() contracts (${o.map(r=>r.exportName).join(", ")}); exactly one is allowed`);return o[0]}},An=e=>{const t=n=>i.isIdentifier(n)&&n.getText()==="ctx",s=new Set;for(const n of e.getDescendantsOfKind(l.PropertyAccessExpression))t(n.getExpression())&&s.add(n.getName());for(const n of e.getDescendantsOfKind(l.VariableDeclaration)){const o=n.getInitializer(),r=n.getNameNode();if(!(o===void 0||!t(o)||!i.isObjectBindingPattern(r)))for(const a of r.getElements()){const c=a.getPropertyNameNode()?.getText()??a.getName();c&&s.add(c)}}return s},Nn=(e,t)=>{const s=Object.fromEntries(fe.map(n=>[n.key,!1]));for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n),r=new Set(o.getImportDeclarations().map(c=>c.getModuleSpecifierValue())),a=An(o);for(const c of fe)if(!s[c.key]){if(r.has(c.moduleSpecifier)){s[c.key]=!0;continue}c.contextProperty!==void 0&&a.has(c.contextProperty)&&(s[c.key]=!0)}if(fe.every(c=>s[c.key]))break}return s},yn=["providerSubscriptionId","state"],bn=["providerEventId","processedAt"],Xe=(e,t)=>t.every(s=>s in e.shape),In=e=>{const t=e.find(n=>n.name==="subscriptions"),s=e.find(n=>n.name==="events");return t!==void 0&&s!==void 0&&Xe(t,yn)&&Xe(s,bn)},Pn=(e,t)=>({analytics:e.analytics||t.dependencies.has("@lunora/bindings/analytics"),auth:t.dependencies.has("@lunora/auth"),containers:e.container||t.containerCount>0||t.dependencies.has("@lunora/container"),flags:e.flags||t.dependencies.has("@lunora/flags"),kv:e.kv||t.dependencies.has("@lunora/bindings/kv"),mail:e.mail||t.dependencies.has("@lunora/mail"),notifications:e.notify||t.dependencies.has("@lunora/notify"),payments:e.payments||t.hasPaymentTables,queues:t.queueCount>0||t.dependencies.has("@lunora/queue"),scheduler:e.scheduler||t.cronCount>0||t.dependencies.has("@lunora/scheduler"),storage:e.storage||t.storageRuleCount>0||t.storageColumnCount>0||t.dependencies.has("@lunora/storage"),vectors:e.vectors||t.vectorIndexCount>0||t.dependencies.has("@lunora/bindings/vectors"),workflows:e.workflows||t.workflowCount>0||t.dependencies.has("@lunora/workflow")}),Nt="identity.ts",wn=e=>{const t=e.getSymbol();if(!t)return e.getText()==="defineIdentity";for(const s of t.getDeclarations())if(i.isImportSpecifier(s))return ee(s.getImportDeclaration().getModuleSpecifierValue())?s.getNameNode().getText()==="defineIdentity":!1;return!1},Tn=e=>{const t=e.getSymbol();if(!t)return!1;for(const s of t.getDeclarations()){if(!i.isNamespaceImport(s))continue;const n=s.getFirstAncestorByKind(l.ImportDeclaration);return n!==void 0&&ee(n.getModuleSpecifierValue())}return!1},Cn=e=>{if(i.isIdentifier(e))return wn(e);if(i.isPropertyAccessExpression(e)){const t=e.getExpression();return e.getName()==="defineIdentity"&&i.isIdentifier(t)&&Tn(t)}return!1},On=e=>{const t=[];for(const s of e.getVariableDeclarations()){if(!s.isExported())continue;const n=s.getInitializer();if(n?.getKind()!==l.CallExpression||!Cn(n.getExpression()))continue;const r=s.getNameNode();if(!i.isIdentifier(r))throw J(r,"defineIdentity exports must be plain named exports (no destructuring)");t.push({exportName:r.getText()})}return t},Rn=(e,t)=>{const s=f(t,Nt);if(!N(s))return;const n=e.getSourceFile(s)??e.addSourceFileAtPath(s),o=On(n);if(o.length!==0){if(o.length>1)throw J(n,`lunora/identity.ts declares ${o.length.toString()} defineIdentity() contracts (${o.map(r=>r.exportName).join(", ")}); exactly one is allowed`);return o[0]}},Fn=(e,t)=>{const s=new Map,n=new Map,o=new Map;for(const r of e)s.set(r.name,`workflow "${r.exportName}"`),n.set(r.bindingName,`workflow "${r.exportName}"`),o.set(r.className,`workflow "${r.exportName}"`);for(const r of t){const a=s.get(r.name);if(a!==void 0)throw new R("DUPLICATE_WORKFLOW_NAME",`Duplicate deployed name "${r.name}": produced by both ${a} and agent "${r.exportName}". Workflow and agent names share the same wrangler workflows[] array and must be unique together.`,{status:500});const c=n.get(r.bindingName);if(c!==void 0)throw new R("DUPLICATE_WORKFLOW_BINDING",`Duplicate binding "${r.bindingName}": produced by both ${c} and agent "${r.exportName}". Workflow and agent bindings share the same wrangler workflows[] array and must be unique together.`,{status:500});const u=o.get(r.className);if(u!==void 0)throw new R("DUPLICATE_WORKFLOW_CLASS",`Duplicate generated class "${r.className}": produced by both ${u} and agent "${r.exportName}". Workflow and agent export names must yield unique generated class names.`,{status:500})}},Ln=e=>{const{lunoraDirectory:t,project:s,projectRoot:n,schema:o}=e,r=Rn(s,t),a=Sn(s,t),c=Ns(s,t),u=vs(s,t),d=Xt(s,t);Fn(c,d);const v=Zt(s,t),P=As(s,t),p=ys(Nn(s,t),bs(n,e.target)),A=p.usage,k=Ss(s,t),z=A.browser||k.usesSandboxBrowser,U=Es(n),V=U??new Set,C=V.has("lunorash");gn(o,U);const M=N(f(t,"flags.ts")),B=N(f(t,"notify.ts"));return{agents:d,containers:v,dataModelContent:es(o),declaredDependencies:U,dependencies:V,env:a,featureUsage:A,hasBrowser:z,hasFlags:M,hasNotify:B,identity:r,platformGate:p,queues:u,serverContent:Jt({agents:d,containers:v,env:a,hasAccessFacade:A.access,hasAi:A.ai,hasAnalytics:A.analytics,hasBrowser:z,hasFlags:M,hasHyperdrive:A.hyperdrive,hasImages:A.images,hasKv:A.kv,hasNotify:B,hasPayments:A.payments,hasPipelines:A.pipelines,hasR2sql:A.r2sql,hasX402:A.x402,identity:r,queues:u,schema:o,storageRuleBuckets:P.rules.map(ne=>ne.bucket),useUmbrella:C,workflows:c}),storageRulesMetadata:P,usesSandbox:k.usesSandboxBrowser||k.usesSandboxContainer,useUmbrella:C,workflows:c}},yt=new Set(["delete","get","head","options","patch","post","put"]),Dn=new Set(["handler","stream"]),kn=/\/(?:_|admin|internal|superuser|sudo|root|debug)/iu,Ze=new Set(["ADMIN_TOKEN","adminToken","assertAdmin","assertAuth","auth","Authorization","getSession","identity","isAdmin","requireAdmin","requireAuth","requireRole","verifyAdmin"]),Mn=e=>{if(!i.isCallExpression(e))return;const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||!yt.has(t.getName()))return;const s=t.getExpression();if(!i.isIdentifier(s)||s.getText()!=="httpRoute")return;const n=e.getArguments()[0];if(!(!n||!i.isStringLiteral(n)))return{method:t.getName().toUpperCase(),path:n.getLiteralValue()}},Kn=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t))return;let s=t.getExpression();for(;i.isCallExpression(s);){const n=s.getExpression();if(!i.isPropertyAccessExpression(n)||yt.has(n.getName()))break;s=n.getExpression()}return Mn(s)},_n=e=>{for(const t of e.getDescendantsOfKind(l.PropertyAccessExpression))if(Ze.has(t.getName()))return!0;for(const t of e.getDescendantsOfKind(l.CallExpression)){const s=t.getExpression();if(i.isIdentifier(s)&&Ze.has(s.getText()))return!0}return!1},zn=(e,t)=>{const s=e.getInitializer();if(!s||!i.isCallExpression(s))return;const n=s.getExpression();if(!i.isPropertyAccessExpression(n)||!Dn.has(n.getName()))return;const o=Kn(s);if(!o||!kn.test(o.path))return;const r=s.getArguments()[0],a=r!==void 0&&(i.isArrowFunction(r)||i.isFunctionExpression(r))&&_n(r);return{exportName:e.getName(),file:t,method:o.method,path:o.path,usesGuard:a}},Un=(e,t)=>{const s=[];for(const n of e.getVariableStatements())if(n.isExported())for(const o of n.getDeclarations()){const r=zn(o,t);r&&s.push(r)}return s},Bn=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...Un(o,x(t,n)))}return s},qn=e=>!i.isPropertyAccessExpression(e)||e.getName()!=="run"?!1:e.getExpression().getText()==="ctx.ai",$n=(e,t)=>{if(!qn(e.getExpression()))return;const s=e.getArguments()[0];if(!(!s||!T(s)||F(s)))return{exportName:E(e),file:t,line:e.getStartLineNumber()}},Vn=(e,t)=>y(e,t,$n),jn=new Set(["generateText","streamText"]),Wn=new Set(["messages","prompt","system"]),Hn=[{methods:new Set(["delete","insert","insertManyUnsafe","patch","replace"]),prefixes:["context.db","ctx.db"]},{methods:new Set(["run","runAction","runMutation"]),prefixes:["context","ctx"]},{methods:new Set(["fetch"]),prefixes:["context","ctx"]},{methods:new Set(["queue","send"]),prefixes:["context.email","context.mail","ctx.email","ctx.mail"]}],Gn=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t))return;const s=t.getName(),n=t.getExpression().getText();for(const o of Hn)if(o.methods.has(s)&&o.prefixes.some(r=>n===r||n.startsWith(`${r}.`)))return`${n}.${s}`},Yn=e=>{for(const t of e.getDescendantsOfKind(l.CallExpression)){const s=Gn(t);if(s!==void 0)return s}},Qn=e=>{const t=new Set,s=e.getFirstAncestor(r=>i.isArrowFunction(r)||i.isFunctionExpression(r)||i.isFunctionDeclaration(r)),[n]=s?.getParameters()??[],o=n?.getNameNode();if(o===void 0||!i.isObjectBindingPattern(o))return t;for(const r of o.getElements()){const a=r.getPropertyNameNode()?.getText()??r.getName(),c=r.getNameNode();if(a==="args"&&i.isObjectBindingPattern(c))for(const u of c.getElements())t.add(u.getName())}return t},Xn=e=>{if(Is(e))return!0;const t=Qn(e);return t.size===0?!1:e.getDescendantsOfKind(l.Identifier).some(s=>t.has(s.getText()))},Zn=e=>{for(const t of e.getProperties()){if(!i.isPropertyAssignment(t)||!Wn.has(t.getName()))continue;const s=t.getInitializer();if(s!==void 0&&Xn(s))return!0}return!1},Jn=(e,t)=>{const s=[];for(const n of e.getDescendantsOfKind(l.CallExpression)){const o=I(n.getExpression());if(o===void 0||!jn.has(o))continue;const[r]=n.getArguments();if(r===void 0||!i.isObjectLiteralExpression(r))continue;let a;for(const c of r.getDescendantsOfKind(l.CallExpression))if(I(c.getExpression())==="tool"&&(a=Yn(c),a!==void 0))break;a!==void 0&&s.push({exportName:E(n),file:t,line:n.getStartLineNumber(),method:o,sideEffect:a,userInputDerived:Zn(r)})}return s},er=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...Jn(o,x(t,n)))}return s},tr=e=>{if(!i.isPropertyAccessExpression(e)||e.getName()!=="fetch")return!1;const t=e.getExpression();return i.isIdentifier(t)&&t.getText()==="ctx"},sr=(e,t)=>{if(!tr(e.getExpression()))return;const s=e.getArguments()[0];if(!(!s||!T(s)))return{exportName:E(e),file:t,line:e.getStartLineNumber()}},nr=(e,t)=>y(e,t,sr),bt=e=>e.getProperties().some(t=>i.isSpreadAssignment(t)),rr=e=>{const t=e.getArguments()[0];if(!t||!i.isObjectLiteralExpression(t))return{objects:[],opaque:!0};const s=t.getProperty("args");if(!s)return{objects:[],opaque:!1};if(!i.isPropertyAssignment(s))return{objects:[],opaque:!0};const n=s.getInitializer();return!n||!i.isObjectLiteralExpression(n)?{objects:[],opaque:!0}:{objects:[n],opaque:bt(n)}},ir=e=>{const t=[];let s=!1,n=e;for(;i.isCallExpression(n);){const o=n.getExpression();if(!i.isPropertyAccessExpression(o))break;if(o.getName()==="input"){const r=n.getArguments()[0];r&&i.isObjectLiteralExpression(r)?(t.push(r),s||=bt(r)):s=!0}n=o.getExpression()}return{objects:t,opaque:s}},It=(e,t)=>t?ir(t):rr(e),or=e=>e.flatMap(t=>t.getProperties().filter(s=>i.isPropertyAssignment(s)||i.isShorthandPropertyAssignment(s)).map(s=>s.getName())),ar=/\.check\(|\.meta\(|length|max/iu,cr=/\bv\.any\s*\(/u,lr=/\bv\.string\s*\(/u,ur=e=>cr.test(e),dr=e=>lr.test(e)&&!ar.test(e),fr=e=>{const t=[],s=[];for(const n of e)for(const o of n.getProperties()){if(!i.isPropertyAssignment(o))continue;const r=o.getInitializer();if(!r)continue;const a=r.getText(),c=o.getName();ur(a)?t.push(c):dr(a)&&s.push(c)}return{anyArgs:t,unboundedStringArgs:s}},pr=(e,t)=>{const s=e.getInitializer();if(!s||!i.isCallExpression(s))return;const n=D(s);if(n?.visibility!=="public")return;const{objects:o}=It(s,n.receiver),{anyArgs:r,unboundedStringArgs:a}=fr(o);if(!(r.length===0&&a.length===0))return{anyArgs:r,exportName:e.getName(),file:t,line:s.getStartLineNumber(),unboundedStringArgs:a}},gr=(e,t)=>{const s=[];for(const n of e.getVariableStatements())if(n.isExported())for(const o of n.getDeclarations()){const r=pr(o,t);r&&s.push(r)}return s},mr=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...gr(o,x(t,n)))}return s},pe=e=>e?.getKind()===l.TrueKeyword,hr=e=>e?.getKind()===l.FalseKeyword,xr=e=>e!==void 0&&i.isNumericLiteral(e)&&e.getLiteralValue()===0,Er=new Set(["lunoraAuthAdapter","lunoraD1Adapter"]),vr=e=>!e||!i.isArrayLiteralExpression(e)?!1:e.getElements().some(t=>i.isCallExpression(t)&&I(t.getExpression())==="scim"),Sr=e=>e!==void 0&&i.isCallExpression(e)&&Er.has(I(e.getExpression())??""),Ar=e=>!e||!i.isArrayLiteralExpression(e)?!1:e.getElements().some(t=>i.isStringLiteral(t)&&t.getLiteralText()==="*"),Nr=e=>{const t=S(e,"advanced"),s=S(e,"emailAndPassword"),n=S(e,"session");return{analyzable:!0,disableCsrfCheck:pe(S(t,"disableCSRFCheck")),emailPasswordEnabled:pe(S(s,"enabled")),requireEmailVerification:pe(S(s,"requireEmailVerification")),scimOnNonTransactionalAdapter:vr(S(e,"plugins"))&&Sr(S(e,"database")),secureCookiesDisabled:hr(S(t,"useSecureCookies")),sessionFreshAgeZero:xr(S(n,"freshAge")),trustedOriginsWildcard:Ar(S(e,"trustedOrigins"))}},yr=()=>({analyzable:!1,disableCsrfCheck:!1,emailPasswordEnabled:!1,requireEmailVerification:!1,scimOnNonTransactionalAdapter:!1,secureCookiesDisabled:!1,sessionFreshAgeZero:!1,trustedOriginsWildcard:!1}),br=(e,t)=>{if(I(e.getExpression())!=="createAuth")return;const s=e.getArguments()[0],n=s!==void 0&&i.isObjectLiteralExpression(s)&&s.getProperties().some(r=>i.isSpreadAssignment(r)),o=s!==void 0&&i.isObjectLiteralExpression(s)&&!n?Nr(s):yr();return{exportName:E(e),file:t,line:e.getStartLineNumber(),...o}},Ir=(e,t)=>y(e,t,br),Pr=(e,t)=>{if(!i.isPropertyAccessExpression(e))return;const s=e.getName();if(t.methods.has(s))return t.matchReceiver(e.getExpression().getText())?s:void 0},wr=(e,t,s)=>{const n=Pr(e.getExpression(),s);if(n===void 0)return;const o=e.getArguments()[s.argIndex];if(!(!o||!T(o)||F(o))&&!(s.requireUnmodifiedReach===!0&&!Ps(o)))return{exportName:E(e),file:t,line:e.getStartLineNumber(),method:n}},Tr=(e,t,s)=>{const n=[];for(const o of e.getDescendantsOfKind(l.CallExpression)){const r=wr(o,t,s);r&&n.push(r)}return n},se=(e,t,s)=>{const n=[];for(const o of g(t)){const r=e.getSourceFile(o)??e.addSourceFileAtPath(o);n.push(...Tr(r,x(t,o),s))}return n},Cr=new Set(["content","pdf","scrape","screenshot"]),Or=(e,t)=>se(e,t,{argIndex:0,matchReceiver:s=>s==="ctx.browser",methods:Cr}),Rr=new Set(["createBrowser","createInboundEmailHandler","createPayment"]),Fr=new Set(["RateLimiter"]),Lr=new Set(["extend"]),Pt=e=>{const t=[],s=[];let n=!1;for(const o of e.getProperties()){if(i.isSpreadAssignment(o)){n=!0;continue}if(i.isPropertyAssignment(o)){const r=o.getName();t.push(r),o.getInitializer()?.getKind()===l.TrueKeyword&&s.push(r);continue}(i.isShorthandPropertyAssignment(o)||i.isMethodDeclaration(o))&&t.push(o.getName())}return{analyzable:!n,presentKeys:t,trueKeys:s}},Je=e=>e&&i.isObjectLiteralExpression(e)?Pt(e):{analyzable:!1,presentKeys:[],trueKeys:[]},Dr=e=>{const t=e.getStatements(),[s]=t;if(t.length!==1||s===void 0||!i.isReturnStatement(s))return;const n=s.getExpression();return n!==void 0&&i.isObjectLiteralExpression(n)?n:void 0},kr=e=>{if(i.isObjectLiteralExpression(e))return e;if(i.isParenthesizedExpression(e)){const t=e.getExpression();return i.isObjectLiteralExpression(t)?t:void 0}return i.isBlock(e)?Dr(e):void 0},Mr=e=>{const t=e&&(i.isArrowFunction(e)||i.isFunctionExpression(e))?e:void 0,s=t&&kr(t.getBody());return s?Pt(s):{analyzable:!1,presentKeys:[],trueKeys:[]}},Kr=(e,t)=>{const s=[];for(const n of e.getDescendantsOfKind(l.CallExpression)){const o=I(n.getExpression());o!==void 0&&(Rr.has(o)?s.push({callee:o,file:t,line:n.getStartLineNumber(),...Je(n.getArguments()[0])}):Lr.has(o)&&s.push({callee:o,file:t,line:n.getStartLineNumber(),...Mr(n.getArguments()[0])}))}for(const n of e.getDescendantsOfKind(l.NewExpression)){const o=I(n.getExpression());o===void 0||!Fr.has(o)||s.push({callee:o,file:t,line:n.getStartLineNumber(),...Je(n.getArguments()[0])})}return s},_r=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...Kr(o,x(t,n)))}return s},et="ctx.containers.",zr=e=>{if(!e.startsWith(et))return!1;const t=e.slice(et.length);return t.length>0&&!t.includes(".")},Ur=(e,t)=>se(e,t,{argIndex:0,matchReceiver:zr,methods:new Set(["get"])}),Br=new Set(["allow","deny","setAllowed"]),qr=e=>{const t=e.getArguments()[0];if(!t||!i.isObjectLiteralExpression(t))return!1;const s=t.getProperty("enableInternet");return s!==void 0&&i.isPropertyAssignment(s)&&i.isTrueLiteral(s.getInitializerOrThrow())},$r=(e,t)=>{const s=e.getExpression();if(!(!i.isPropertyAccessExpression(s)||s.getName()!=="start"||!qr(e)))return{detail:"enableInternet: true",exportName:E(e),file:t,kind:"enable_internet",line:e.getStartLineNumber()}},Vr=(e,t)=>{const s=e.getExpression();if(!i.isPropertyAccessExpression(s)||!Br.has(s.getName()))return;const n=s.getExpression();if(!(!i.isPropertyAccessExpression(n)||n.getName()!=="egress"))return{detail:s.getName(),exportName:E(e),file:t,kind:"egress_relaxation",line:e.getStartLineNumber()}},jr=(e,t)=>$r(e,t)??Vr(e,t),Wr=(e,t)=>y(e,t,jr),Hr=new Set(["defineExportSink","r2Sink","webhookExportSink"]),Gr=e=>{const t=e.getExpression();if(!i.isIdentifier(t))return;const s=t.getText();return Hr.has(s)?s:void 0},Yr=e=>{const t=[],s=[];for(const n of e.getProperties()){if(i.isSpreadAssignment(n))return{analyzable:!1,emptyKeys:[],presentKeys:[]};if(i.isPropertyAssignment(n)){const o=n.getName();t.push(o);const r=n.getInitializer();r&&i.isStringLiteral(r)&&r.getLiteralText()===""&&s.push(o);continue}(i.isShorthandPropertyAssignment(n)||i.isMethodDeclaration(n)||i.isGetAccessorDeclaration(n))&&t.push(n.getName())}return{analyzable:!0,emptyKeys:s,presentKeys:t}},Qr=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n),r=x(t,n);for(const a of o.getDescendantsOfKind(l.CallExpression)){const c=Gr(a);if(c===void 0)continue;const u=a.getArguments()[0],d=u&&i.isObjectLiteralExpression(u)?Yr(u):{analyzable:!1,emptyKeys:[],presentKeys:[]};s.push({analyzable:d.analyzable,emptyKeys:d.emptyKeys,factory:c,file:r,line:a.getStartLineNumber(),presentKeys:d.presentKeys})}}return s},Xr=new Map([["dbRateLimit",2],["rateLimit",2],["verifyTurnstileMiddleware",0]]),Zr=new Set(["dbRateLimit","rateLimit"]),Jr=e=>{if(!e||!i.isObjectLiteralExpression(e))return!1;const t=e.getProperty("failOpen");return t!==void 0&&i.isPropertyAssignment(t)&&t.getInitializer()?.getKind()===l.TrueKeyword},ei=(e,t)=>{const s=I(e.getExpression());if(s===void 0)return;const n=Xr.get(s);if(n!==void 0)return{callee:s,exportName:E(e),failOpen:Jr(e.getArguments()[n]),file:t,limitName:Zr.has(s)?Et(e):"",line:e.getStartLineNumber()}},ti=(e,t)=>y(e,t,ei),si=e=>{const t=e.getInitializer();if(!t||!i.isCallExpression(t))return;const s=D(t);if(s?.kind!=="query")return;const n=ms(t,s.receiver);return n?{exportName:e.getName(),handler:n}:void 0},tt=e=>{const t=e.getParent();return t&&i.isPropertyAccessExpression(t)&&t.getExpression()===e?t:void 0},ni=e=>{if(!i.isPropertyAccessExpression(e)||e.getName()!=="flags")return;const t=e.getExpression();if(!i.isIdentifier(t)||t.getText()!=="ctx")return;const s=tt(e);if(!s)return"ctx.flags";if(s.getName()==="details"){const n=tt(s);return n?`ctx.flags.details.${n.getName()}`:"ctx.flags.details"}return`ctx.flags.${s.getName()}`},ri=(e,t)=>{const s=[];for(const n of e.handler.getDescendantsOfKind(l.PropertyAccessExpression)){const o=ni(n);o!==void 0&&s.push({callee:o,exportName:e.exportName,file:t,line:n.getStartLineNumber()})}return s},ii=(e,t)=>{const s=[];for(const n of e.getVariableStatements())if(n.isExported())for(const o of n.getDeclarations()){const r=si(o);r&&s.push(...ri(r,t))}return s},oi=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...ii(o,x(t,n)))}return s},ai=e=>{if(!i.isPropertyAccessExpression(e)||e.getName()!=="boolean")return!1;const t=e.getExpression();return i.isPropertyAccessExpression(t)&&t.getName()==="flags"&&hs(t.getExpression())},ci=e=>{if(e?.getKind()===l.TrueKeyword)return!0;if(e?.getKind()===l.FalseKeyword)return!1},li=(e,t)=>{if(!ai(e.getExpression()))return;const[s,n]=e.getArguments();if(!s||!(i.isStringLiteral(s)||i.isNoSubstitutionTemplateLiteral(s)))return;const o=s.getLiteralValue(),r=ci(n);if(!(o.length===0||r===void 0))return{defaultValue:r,exportName:E(e),file:t,key:o,line:e.getStartLineNumber()}},ui=(e,t)=>y(e,t,li),di=e=>{const t=e.getExpression();return i.isPropertyAccessExpression(t)&&t.getName()==="withGeoIndex"},fi=e=>{const t=e.getArguments()[0];return t&&i.isStringLiteral(t)?t.getLiteralText():""},pi=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n),r=x(t,n);for(const a of o.getDescendantsOfKind(l.CallExpression))di(a)&&s.push({file:r,indexName:fi(a),line:a.getStartLineNumber()})}return s},gi=new Set(["delete","get","head","options","patch","post","put"]),mi=new Set(["handler","stream"]),hi=new Set(["runAction","runMutation"]),xi=new Set(["delete","insert","insertManyUnsafe","patch","replace"]),Q=(e,t)=>e!==void 0&&i.isIdentifier(e)&&e.getText()===t,st=e=>e!==void 0&&(i.isArrowFunction(e)||i.isFunctionExpression(e))?e:void 0,nt=(e,t)=>{const s=e.getParameters()[0];if(s===void 0)return;const n=s.getNameNode();if(t)return i.isIdentifier(n)?n.getText():void 0;if(i.isObjectBindingPattern(n)){for(const o of n.getElements())if((o.getPropertyNameNode()?.getText()??o.getNameNode().getText())==="ctx"){const a=o.getNameNode();return i.isIdentifier(a)?a.getText():void 0}}},rt=(e,t)=>{const s=e.getBody(),n=s.getDescendantsOfKind(l.CallExpression);i.isCallExpression(s)&&n.unshift(s);for(const o of n){const r=o.getExpression();if(!i.isPropertyAccessExpression(r))continue;const a=r.getName(),c=r.getExpression();if(hi.has(a)&&Q(c,t))return a;if(xi.has(a)&&i.isPropertyAccessExpression(c)&&c.getName()==="db"&&Q(c.getExpression(),t))return`db.${a}`}},it=(e,t)=>{const s=e.getBody();for(const n of s.getDescendantsOfKind(l.PropertyAccessExpression))if(n.getName()==="auth"&&Q(n.getExpression(),t))return!0;for(const n of s.getDescendantsOfKind(l.VariableDeclaration)){const o=n.getNameNode();if(!(!i.isObjectBindingPattern(o)||!Q(n.getInitializer(),t))){for(const r of o.getElements())if((r.getPropertyNameNode()?.getText()??r.getNameNode().getText())==="auth")return!0}}return!1},Ei=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||!mi.has(t.getName()))return;let s=t.getExpression();for(;i.isCallExpression(s);){const n=s.getExpression();if(!i.isPropertyAccessExpression(n))return;const o=n.getName();if(gi.has(o)){const r=n.getExpression();return i.isIdentifier(r)&&r.getText()==="httpRoute"?o.toUpperCase():void 0}s=n.getExpression()}},vi=(e,t)=>{const s=e.getExpression();if(i.isIdentifier(s)&&s.getText()==="httpAction"){const c=st(e.getArguments()[0]),u=c&&nt(c,!0);if(!c||u===void 0)return;const d=rt(c,u);return d===void 0?void 0:{exportName:E(e),file:t,kind:"httpAction",line:e.getStartLineNumber(),readsAuth:it(c,u),sideEffect:d}}const n=Ei(e);if(n===void 0)return;const o=st(e.getArguments()[0]),r=o&&nt(o,!1);if(!o||r===void 0)return;const a=rt(o,r);return a===void 0?void 0:{exportName:E(e),file:t,kind:"httpRoute",line:e.getStartLineNumber(),method:n,readsAuth:it(o,r),sideEffect:a}},Si=(e,t)=>y(e,t,vi),Ai=new Set(["btoa","encodeURI","encodeURIComponent","isSafeHeaderValue","Number","parseFloat","parseInt"]),Ni=new Set(["append","set"]),Ee=e=>i.isIdentifier(e)?e.getText():i.isPropertyAccessExpression(e)?e.getName():"",wt=e=>e!==void 0&&(i.isStringLiteral(e)||i.isNoSubstitutionTemplateLiteral(e))?e.getLiteralText():"",ot=(e,t)=>(i.isCallExpression(e)?[e,...e.getDescendantsOfKind(l.CallExpression)]:e.getDescendantsOfKind(l.CallExpression)).some(n=>Ai.has(Ee(n.getExpression()))&&Ts(n,t)),yi=(e,t)=>{if(ot(e,t))return!0;const s=te(e);return s!==void 0&&ot(s,t)},he=(e,t)=>ws(e,t)&&!yi(e,t),bi=e=>{if(i.isPropertyAccessExpression(e)&&e.getName()==="headers")return!0;const t=te(e);return t!==void 0&&i.isNewExpression(t)&&Ee(t.getExpression())==="Headers"},X=e=>{if(e===void 0)return;if(i.isObjectLiteralExpression(e))return e;const t=te(e);return t!==void 0&&i.isObjectLiteralExpression(t)?t:void 0},ve=(e,t,s)=>{for(const n of e.getProperties())if(i.isPropertyAssignment(n)){const o=n.getInitializer();o!==void 0&&he(o,s.requestName)&&s.rows.push({exportName:s.exportName,file:s.relativePath,headerName:wt(n.getNameNode()),line:o.getStartLineNumber(),via:t})}else if(i.isShorthandPropertyAssignment(n)){const o=n.getNameNode();he(o,s.requestName)&&s.rows.push({exportName:s.exportName,file:s.relativePath,headerName:n.getName(),line:o.getStartLineNumber(),via:t})}else if(i.isSpreadAssignment(n)){const o=X(n.getExpression());o!==void 0&&ve(o,t,s)}},Tt=(e,t)=>{const s=X(e);if(s===void 0)return;const n=s.getProperty("headers");if(n===void 0||!i.isPropertyAssignment(n))return;const o=X(n.getInitializer());o!==void 0&&ve(o,"response-init",t)},Ii=(e,t)=>{const s=Ee(e.getExpression());if(s==="Response")Tt(e.getArguments()[1],t);else if(s==="Headers"){const n=X(e.getArguments()[0]);n!==void 0&&ve(n,"headers-ctor",t)}},Pi=(e,t)=>{const s=e.getExpression();if(!i.isPropertyAccessExpression(s))return;const n=s.getName(),o=s.getExpression();if(n==="json"&&i.isIdentifier(o)&&o.getText()==="Response"){Tt(e.getArguments()[1],t);return}if(Ni.has(n)&&bi(o)){const r=e.getArguments()[1];r!==void 0&&he(r,t.requestName)&&t.rows.push({exportName:t.exportName,file:t.relativePath,headerName:wt(e.getArguments()[0]),line:r.getStartLineNumber(),via:n==="set"?"headers-set":"headers-append"})}},wi=(e,t)=>{for(const s of e.getDescendantsOfKind(l.NewExpression))Ii(s,t);for(const s of e.getDescendantsOfKind(l.CallExpression))Pi(s,t)},Ti=(e,t)=>{const s=e.getExpression();if(!i.isIdentifier(s)||s.getText()!=="httpAction")return[];const n=Os(e.getArguments()[0]);if(n===void 0)return[];const o=n.getParameters()[1];if(o===void 0)return[];const r=o.getNameNode();if(!i.isIdentifier(r))return[];const a=[];return wi(n,{exportName:E(e),relativePath:t,requestName:r.getText(),rows:a}),a},Ci=(e,t)=>{const s=[];for(const n of e.getDescendantsOfKind(l.CallExpression))s.push(...Ti(n,t));return s},Oi=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...Ci(o,x(t,n)))}return s},Ri=new Set(["auth","context.auth","ctx.auth"]),Fi="userId",Li=e=>{const t=new Set;for(const s of e.getProperties()){if(i.isSpreadAssignment(s))return;(i.isPropertyAssignment(s)||i.isShorthandPropertyAssignment(s)||i.isMethodDeclaration(s))&&t.add(s.getName())}return t},Di=(e,t)=>{const s=f(t,Nt);if(!N(s))return;const n=e.getSourceFile(s)??e.addSourceFileAtPath(s);for(const o of n.getDescendantsOfKind(l.CallExpression)){if(I(o.getExpression())!=="defineIdentity")continue;const[r]=o.getArguments();return r&&i.isObjectLiteralExpression(r)?Li(r):void 0}},at=e=>{if(!(e===void 0||!i.isPropertyAccessExpression(e)||e.getName()!=="identity"))return Ri.has(e.getExpression().getText())?e:void 0},ki=e=>{if(i.isPropertyAccessExpression(e)&&at(e.getExpression())!==void 0)return e.getName();if(i.isElementAccessExpression(e)&&at(e.getExpression())!==void 0){const t=e.getArgumentExpression();return t&&i.isStringLiteral(t)?t.getLiteralValue():void 0}},Mi=(e,t,s)=>{const n=[];for(const o of e.getDescendants()){const r=ki(o);r!==void 0&&n.push({declared:r===Fi||s.has(r),exportName:E(o),file:t,key:r,line:o.getStartLineNumber()})}return n},Ki=(e,t)=>{const s=Di(e,t);if(s===void 0)return[];const n=[];for(const o of g(t)){const r=e.getSourceFile(o)??e.addSourceFileAtPath(o);n.push(...Mi(r,x(t,o),s))}return n},_i=(e,t)=>{if(I(e.getExpression())!=="buildImageDeliveryUrl")return;const s=e.getArguments()[0];if(!s)return;const n=S(s,"key");if(!(!n||!T(n)||F(n)))return{exportName:E(e),file:t,line:e.getStartLineNumber()}},zi=(e,t)=>y(e,t,_i),Ui=new Set(["delete","get","getRaw","getWithMetadata","put"]),Bi=(e,t)=>se(e,t,{argIndex:0,matchReceiver:s=>s==="ctx.kv"||s.startsWith("ctx.kv."),methods:Ui}),qi=new Set(["queue","send"]),ct=new Set(["bcc","cc","to"]),$i=e=>{if(!i.isPropertyAccessExpression(e))return;const t=e.getName();if(!qi.has(t))return;const s=e.getExpression().getText();return s==="ctx.mail"||s==="ctx.email"?t:void 0},Vi=e=>i.isObjectLiteralExpression(e)?e.getProperties().some(t=>{if(i.isShorthandPropertyAssignment(t)){const n=t.getNameNode();return ct.has(t.getName())&&T(n)&&!F(n)}if(!i.isPropertyAssignment(t)||!ct.has(t.getName()))return!1;const s=t.getInitializer();return s!==void 0&&T(s)&&!F(s)}):!1,ji=(e,t)=>{const s=$i(e.getExpression());if(s===void 0)return;const n=e.getArguments()[0];if(!(!n||!Vi(n)))return{exportName:E(e),file:t,line:e.getStartLineNumber(),method:s}},Wi=(e,t)=>y(e,t,ji),Hi=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||t.getName()!=="replace")return!1;const s=t.getExpression();return i.isPropertyAccessExpression(s)?s.getName()==="db":i.isIdentifier(s)&&s.getText()==="db"},Gi=e=>{const t=e.getArguments()[0];if(t===void 0||!i.isObjectLiteralExpression(t))return;const s=t.getProperty("server");if(s!==void 0)return i.isPropertyAssignment(s)?s.getInitializer():s},Yi=e=>{if(!e.isExported())return;const t=e.getInitializer();if(t?.getKind()!==l.CallExpression)return;const s=t;return js(s.getExpression())?s:void 0},Qi=e=>{const t=Yi(e),s=t===void 0?void 0:Gi(t);if(s===void 0)return[];const n=e.getNameNode(),o=i.isIdentifier(n)?n.getText():"";return s.getDescendantsOfKind(l.CallExpression).filter(r=>Hi(r)).map(r=>({exportName:o,file:"lunora/mutators.ts",line:r.getStartLineNumber()}))},Xi=e=>e.getVariableDeclarations().flatMap(t=>Qi(t)),Zi=(e,t)=>{const s=f(t,Vs);if(!N(s))return[];const n=e.getSourceFile(s)??e.addSourceFileAtPath(s);return Xi(n)},Ji=new Set(["delete","get","patch"]),eo=new Set(["accountId","authorId","companyId","createdBy","createdById","customerId","groupId","memberId","organizationId","orgId","ownerId","projectId","teamId","tenantId","userId","workspaceId"]),to=new Set(["auth","identity","session","user"]),so=new Set([l.EqualsEqualsEqualsToken,l.EqualsEqualsToken,l.ExclamationEqualsEqualsToken,l.ExclamationEqualsToken]),no=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||t.getName()!=="normalizeId"||!_(t.getExpression()))return;const s=e.getArguments()[0];return s&&i.isStringLiteral(s)?s.getLiteralText():""},ro=e=>{let t=e,s=t.getParent();for(;s!==void 0&&(i.isAsExpression(s)||i.isParenthesizedExpression(s)||i.isNonNullExpression(s));)t=s,s=t.getParent();if(s===void 0||!i.isVariableDeclaration(s))return;const n=s.getNameNode();return i.isIdentifier(n)?n.getText():void 0},io=(e,t)=>e.getDescendantsOfKind(l.Identifier).some(s=>s.getText()===t),oo=e=>i.isThrowStatement(e)||i.isReturnStatement(e)||e.getDescendantsOfKind(l.ThrowStatement).length>0||e.getDescendantsOfKind(l.ReturnStatement).length>0,ao=(e,t)=>e.getDescendantsOfKind(l.IfStatement).some(s=>io(s.getExpression(),t)&&oo(s.getThenStatement())),co=(e,t)=>{for(const s of e.getDescendantsOfKind(l.CallExpression)){const n=s.getExpression();if(!i.isPropertyAccessExpression(n))continue;const o=n.getName();if(!Ji.has(o))continue;const r=n.getExpression();if(!(_(r)||i.isPropertyAccessExpression(r)&&_(r.getExpression())))continue;const c=s.getArguments()[0];if(c!==void 0&&i.isIdentifier(c)&&c.getText()===t)return o}},lo=e=>{let t=e;for(;i.isPropertyAccessExpression(t)||i.isElementAccessExpression(t)||i.isNonNullExpression(t)||i.isParenthesizedExpression(t)||i.isAsExpression(t)||i.isAwaitExpression(t);)t=t.getExpression();return i.isIdentifier(t)?t.getText():void 0},uo=e=>e.getDescendantsOfKind(l.CallExpression).some(t=>t.getArguments().some(s=>lo(s)==="ctx")),fo=e=>e.getDescendantsOfKind(l.BinaryExpression).some(t=>so.has(t.getOperatorToken().getKind())?i.isPropertyAccessExpression(t.getLeft())||i.isPropertyAccessExpression(t.getRight()):!1),po=e=>{for(const t of e.getDescendantsOfKind(l.Identifier))if(eo.has(t.getText()))return!0;for(const t of e.getDescendantsOfKind(l.PropertyAccessExpression)){const s=t.getExpression();if(i.isIdentifier(s)&&s.getText()==="ctx"&&to.has(t.getName()))return!0}return uo(e)||fo(e)},go=(e,t)=>{if(!i.isVariableDeclaration(e))return[];const s=e.getInitializer();if(s===void 0||!i.isCallExpression(s))return[];const n=D(s);if(n?.kind!=="query"&&n?.kind!=="mutation")return[];const o=St(s);if(o===void 0)return[];const r=n.receiver!==void 0&&At(n.receiver,"use","rls"),a=po(o),c=new Set,u=[];for(const d of o.getDescendantsOfKind(l.CallExpression)){const v=no(d);if(v===void 0)continue;const P=ro(d);if(P===void 0||c.has(P)||!ao(o,P))continue;const p=co(o,P);p!==void 0&&(c.add(P),u.push({exportName:e.getName(),file:t,line:d.getStartLineNumber(),mentionsOwnership:a,sinkMethod:p,table:v,usesRls:r,visibility:n.visibility}))}return u},mo=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n),r=x(t,n);for(const a of o.getVariableStatements())if(a.isExported())for(const c of a.getDeclarations())s.push(...go(c,r))}return s},ho=new Set(["accountId","authorId","createdBy","createdById","organizationId","orgId","ownerId","tenantId","updatedBy","userId","workspaceId"]),xo=new Set(["insert","insertManyUnsafe","patch","replace"]),Eo=e=>{if(!i.isPropertyAccessExpression(e))return;const t=e.getName();if(!xo.has(t))return;const s=e.getExpression();if(!i.isPropertyAccessExpression(s)||s.getName()!=="db")return;const n=s.getExpression();return i.isIdentifier(n)&&n.getText()==="ctx"?t:void 0},vo=(e,t)=>{if(t!=="insertManyUnsafe")return i.isObjectLiteralExpression(e)?[e]:[];if(!i.isArrayLiteralExpression(e))return[];const s=[];for(const n of e.getElements())i.isObjectLiteralExpression(n)&&s.push(n);return s},So=(e,t,s,n)=>{const o=[];for(const r of e.getProperties()){let a,c;i.isPropertyAssignment(r)?(a=r.getName(),c=r.getInitializer()):i.isShorthandPropertyAssignment(r)&&(a=r.getName(),c=r.getNameNode()),!(a===void 0||c===void 0||!ho.has(a))&&T(c)&&!F(c)&&o.push({exportName:E(s),field:a,file:n,line:s.getStartLineNumber(),method:t})}return o},Ao=(e,t)=>{const s=Eo(e.getExpression());if(s===void 0)return[];const n=e.getArguments()[1];return n?vo(n,s).flatMap(o=>So(o,s,e,t)):[]},No=(e,t,s)=>{const n=[];for(const o of e.getDescendantsOfKind(l.CallExpression))for(const r of Ao(o,t)){const a=s(r.exportName);n.push(a===void 0?r:{...r,visibility:a})}return n},yo=(e,t,s=[])=>{const n=[],o=new Map(s.map(r=>[`${r.filePath}:${r.exportName}`,r.visibility]));for(const r of g(t)){const a=e.getSourceFile(r)??e.addSourceFileAtPath(r),c=x(t,r);n.push(...No(a,c,u=>o.get(`${c}:${u}`)))}return n},bo=new Set(["createAutumnAdapter","createDodoPaymentsAdapter","createPolarAdapter","createStripeAdapter"]),Io=e=>e&&i.isNumericLiteral(e)?Number(e.getText()):void 0,Po=e=>{const t=e.getProperty("webhookToleranceSeconds");return t&&i.isPropertyAssignment(t)?Io(t.getInitializer()):void 0},wo=(e,t)=>{const s=I(e.getExpression());if(s===void 0||!bo.has(s))return;const[n]=e.getArguments(),o=n&&i.isObjectLiteralExpression(n)?Po(n):void 0;return{callee:s,exportName:E(e),file:t,line:e.getStartLineNumber(),...o===void 0?{}:{toleranceSeconds:o}}},To=(e,t)=>y(e,t,wo),Co=new Set(["defineQueue","defineWorkflow"]),Oo=new Set(["run","runAction","runMutation","runQuery"]),Ro=new Set(["api","internal"]),Fo=e=>{const t=e.getExpression();return i.isIdentifier(t)?t.getText():void 0},Lo=e=>{const t=e.getArguments()[0];if(!t||!i.isObjectLiteralExpression(t))return;const s=t.getProperty("handler");if(s===void 0||!i.isPropertyAssignment(s))return;const n=s.getInitializer();if(n&&(i.isArrowFunction(n)||i.isFunctionExpression(n)))return n},Ct=(e,t)=>{const s=e.getParameters()[t]?.getNameNode();return s&&i.isIdentifier(s)?s.getText():void 0},Ot=(e,t)=>e===t||e.startsWith(`${t}.`),Rt=e=>{const t=e.getDescendantsOfKind(l.PropertyAccessExpression);return i.isPropertyAccessExpression(e)&&t.push(e),t},lt=e=>{const t=e.getParent();return i.isPropertyAccessExpression(t)&&t.getNameNode()===e||i.isPropertyAssignment(t)&&t.getNameNode()===e?!1:!(i.isBindingElement(t)&&t.getNameNode()===e)},Ft=e=>{const t=e.getDescendantsOfKind(l.Identifier).filter(s=>lt(s));return i.isIdentifier(e)&&lt(e)&&t.push(e),t},Do=e=>{if(!i.isVariableDeclaration(e))return[];const t=e.getNameNode();return i.isIdentifier(t)?[t.getText()]:t.getDescendantsOfKind(l.BindingElement).map(s=>s.getName())},ko=e=>{const t=Ct(e,1);if(t===void 0)return[];const s=[`${t}.messages`];for(const n of e.getDescendantsOfKind(l.ForOfStatement)){if(n.getExpression().getText()!==`${t}.messages`)continue;const o=n.getInitializer(),r=i.isVariableDeclarationList(o)?o.getDeclarations()[0]?.getNameNode():void 0;r&&i.isIdentifier(r)&&s.push(`${r.getText()}.body`)}return s},Mo=(e,t,s)=>{const n=t==="workflow"?[`${s}.params`]:ko(e),o=new Set,r=a=>Rt(a).some(c=>n.some(u=>Ot(c.getText(),u)))?!0:Ft(a).some(c=>o.has(c.getText()));for(const a of e.getDescendantsOfKind(l.VariableDeclaration)){const c=a.getInitializer();if(c&&r(c))for(const u of Do(a))o.add(u)}return{names:o,prefixes:n}},Ko=(e,t)=>Rt(e).some(s=>t.prefixes.some(n=>Ot(s.getText(),n)))?!0:Ft(e).some(s=>t.names.has(s.getText())),_o=e=>{if(e===void 0||!i.isPropertyAccessExpression(e))return;const t=[];let s=e;for(;i.isPropertyAccessExpression(s);)t.unshift(s.getName()),s=s.getExpression();const n=t.at(-1);if(!(n===void 0||!i.isIdentifier(s)||!Ro.has(s.getText())||t.length<2))return{exportName:n,file:t.slice(0,-1).join("/")}},zo=(e,t,s)=>{const n=Ct(e,0);if(n===void 0)return[];const o=Mo(e,t,n),r=[];for(const a of e.getDescendantsOfKind(l.CallExpression)){const c=a.getExpression();if(!i.isPropertyAccessExpression(c)||!Oo.has(c.getName())||c.getExpression().getText()!==n)continue;const u=a.getArguments()[1];if(!u||!Ko(u,o))continue;const d=_o(a.getArguments()[0]);d!==void 0&&r.push({dispatchKind:t,file:s,handlerExport:E(a),line:a.getStartLineNumber(),targetExport:d.exportName,targetFile:d.file})}return r},Uo=(e,t)=>{const s=[];for(const n of e.getDescendantsOfKind(l.CallExpression)){const o=Fo(n);if(o===void 0||!Co.has(o))continue;const r=Lo(n);r!==void 0&&s.push(...zo(r,o==="defineQueue"?"queue":"workflow",t))}return s},Bo=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...Uo(o,x(t,n)))}return s},ut={dbRateLimit:"usesRateLimit",emailGateMiddleware:"usesEmailGate",mask:"usesMask",rateLimit:"usesRateLimit",rls:"usesRls",verifyTurnstile:"usesCaptcha",verifyTurnstileMiddleware:"usesCaptcha"},dt=new Set(["account","credential","member","passkey","session","user"]),qo=e=>e.replaceAll(/[-_]/gu," ").replaceAll(/([a-z0-9])([A-Z])/gu,"$1 $2").split(" ").filter(Boolean).map(t=>t.toLowerCase()),$o=e=>{const s=qo(e).at(-1);if(!s)return!1;const n=s.endsWith("s")?s.slice(0,-1):s;return dt.has(s)||dt.has(n)},Vo=e=>{const t=e.replaceAll(/[^a-z0-9]/giu,"").toLowerCase();return t.endsWith("email")||t.endsWith("emailaddress")},jo=(e,t)=>{const{objects:s,opaque:n}=It(e,t);return or(s).some(o=>Vo(o))?!0:n?void 0:!1},Se=e=>{const t=e.getExpression();if(i.isIdentifier(t))return t.getText();if(i.isPropertyAccessExpression(t))return t.getName()},Wo=e=>{const t=e.getArguments()[0];return!t||!i.isObjectLiteralExpression(t)?{usesCaptcha:!1,usesRateLimit:!1}:{usesCaptcha:!!t.getProperty("captcha"),usesRateLimit:!!t.getProperty("rateLimit")}},Ho=e=>{if(i.isCallExpression(e))return e;if(!i.isIdentifier(e))return;const s=e.getSourceFile().getVariableDeclaration(e.getText())?.getInitializer();return s&&i.isCallExpression(s)?s:void 0},Y={usesCaptcha:!1,usesEmailGate:!1,usesMask:!1,usesRateLimit:!1,usesRls:!1},Go=e=>{const t=Ho(e),s=t?Se(t):void 0;if(t&&s==="protectPublic"){const n=Wo(t);return{...Y,usesCaptcha:n.usesCaptcha,usesRateLimit:n.usesRateLimit}}return s!==void 0&&s in ut?{...Y,[ut[s]]:!0}:Y},Yo=e=>{const t={...Y};let s=e;for(;i.isCallExpression(s);){const n=s.getExpression();if(!i.isPropertyAccessExpression(n))break;const o=n.getName()==="use"?s.getArguments()[0]:void 0;if(o){const r=Go(o);t.usesCaptcha||=r.usesCaptcha,t.usesEmailGate||=r.usesEmailGate,t.usesMask||=r.usesMask,t.usesRateLimit||=r.usesRateLimit,t.usesRls||=r.usesRls}s=n.getExpression()}return t},Qo=new Set(["insert","insertMany","insertManyUnsafe","replace"]),Xo=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||!Qo.has(t.getName()))return!1;const s=t.getExpression();if(!(i.isPropertyAccessExpression(s)?s.getName()==="db":i.isIdentifier(s)&&s.getText()==="db"))return!1;const o=e.getArguments()[0];return!o||!(i.isStringLiteral(o)||i.isNoSubstitutionTemplateLiteral(o))?!1:$o(o.getLiteralText())},Zo=new Set(["create","runAfter","runAt","send","sendBatch"]),Jo=new Set(["queues","scheduler","workflows"]),ea=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||!Zo.has(t.getName()))return!1;let s=t.getExpression();for(;i.isCallExpression(s)||i.isElementAccessExpression(s)||i.isPropertyAccessExpression(s);){if(i.isPropertyAccessExpression(s)&&Jo.has(s.getName())){const n=s.getExpression();if(i.isIdentifier(n)&&n.getText()==="ctx")return!0}s=s.getExpression()}return!1},ta=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||t.getName()!=="insertManyUnsafe")return!1;const s=t.getExpression();return i.isPropertyAccessExpression(s)?s.getName()==="db":i.isIdentifier(s)&&s.getText()==="db"},Lt=new Set(["generateObject","generateText","streamObject","streamText"]),sa=e=>{const t=Se(e);return t!==void 0&&Lt.has(t)},na=e=>{const t=Se(e);if(t===void 0||!Lt.has(t))return!1;const s=e.getArguments()[0];return!s||!i.isObjectLiteralExpression(s)||s.getProperties().some(n=>i.isSpreadAssignment(n))?!1:!s.getProperty("maxOutputTokens")},ra=new Set(["log","span","trace"]),ia=new Set(["ai"]),oa=new Set(["email","mail"]),aa=new Set(["ai","browser","fetch","mail","notify","queues","sql","storage","workflows"]),ge=(e,t)=>e.getDescendantsOfKind(l.PropertyAccessExpression).some(s=>{if(!t.has(s.getName()))return!1;const n=s.getExpression();return i.isIdentifier(n)&&n.getText()==="ctx"}),ca=new Set([l.ArrowFunction,l.FunctionDeclaration,l.FunctionExpression,l.GetAccessor,l.MethodDeclaration,l.SetAccessor]),la=new Set(["every","filter","flatMap","forEach","map","some"]),ua=new Set(["all","allSettled","race"]),da=e=>{const t=e.getParent();if(!t||!i.isCallExpression(t)||!t.getArguments().includes(e))return;const s=t.getExpression();if(!i.isPropertyAccessExpression(s))return;const n=s.getName();if(la.has(n))return t;const o=s.getExpression();if(i.isIdentifier(o)&&o.getText()==="Promise"&&ua.has(n))return t},fa=e=>{let t=e.getParent();for(;t;){if(i.isTryStatement(t)){const s=t.getTryBlock();if(e.getPos()>=s.getPos()&&e.getEnd()<=s.getEnd())return!0}if(ca.has(t.getKind())){const s=da(t);if(!s)return!1;t=s;continue}t=t.getParent()}return!1},pa=e=>{let t=e;for(;;){const s=t.getParent();if(!i.isPropertyAccessExpression(s)||s.getExpression()!==t)return!1;if(s.getName()==="catch")return!0;if(s.getName()!=="then"&&s.getName()!=="finally")return!1;const n=s.getParent();if(!i.isCallExpression(n)||n.getExpression()!==s)return!1;t=n}},ga=e=>{let t=e;for(;;){const s=t.getParent();if(i.isPropertyAccessExpression(s)&&s.getExpression()===t){t=s;continue}return i.isCallExpression(s)&&s.getExpression()===t?s:void 0}},ma=e=>{let t=!1,s=!0;for(const n of e.getDescendantsOfKind(l.PropertyAccessExpression)){if(!aa.has(n.getName()))continue;const o=n.getExpression();if(!i.isIdentifier(o)||o.getText()!=="ctx")continue;const r=ga(n);r&&(t=!0,!fa(r)&&!pa(r)&&(s=!1))}return{handlesErrors:t&&s,reachesOutbound:t}},ha=e=>e.getDescendantsOfKind(l.ThrowStatement).some(t=>{const s=t.getExpression();if(!i.isNewExpression(s))return!1;const n=s.getExpression();return i.isIdentifier(n)&&n.getText()==="Error"}),ft="lunora-advisor-exempt",xa=/^[\s*/]+/u,Ea=/[\w-]/u,va=e=>{const s=(e.getFirstAncestorByKind(l.VariableStatement)??e).getLeadingCommentRanges().map(n=>n.getText()).join(`
6
+ `);for(const n of s.split(`
7
+ `)){const o=n.replace(xa,"");if(!o.startsWith(ft))continue;const r=o.slice(ft.length);if(Ea.test(r.charAt(0)))continue;const a=r.indexOf("--");return{exempt:!0,exemptReason:(a===-1?"":r.slice(a+2).split("*")[0]??"").trim()}}return{exempt:!1,exemptReason:""}},Sa=e=>{const[t]=e.getArguments();if(t){if(i.isObjectLiteralExpression(t)){const s=t.getProperty("handler");return s?i.isPropertyAssignment(s)?s.getInitializer():i.isShorthandPropertyAssignment(s)?s.getNameNode():i.isMethodDeclaration(s)?s:void 0:void 0}return t}},Aa=(e,t)=>{const s=Sa(t);if(!s)return;if(i.isArrowFunction(s)||i.isFunctionExpression(s)||i.isMethodDeclaration(s))return e;if(!i.isIdentifier(s))return;const n=s.getSourceFile(),o=s.getText(),r=n.getVariableDeclaration(o)?.getInitializer();return r&&(i.isArrowFunction(r)||i.isFunctionExpression(r))?r:n.getFunction(o)},Na=e=>{let t=!1,s=!1,n=!1,o=!1,r=!1;for(const u of e.getDescendantsOfKind(l.CallExpression))if(Xo(u)&&(r=!0),ea(u)&&(t=!0),ta(u)&&(o=!0),sa(u)&&(s=!0),na(u)&&(n=!0),r&&t&&o&&n)break;const{handlesErrors:a,reachesOutbound:c}=ma(e);return{callsMail:ge(e,oa),emitsEvent:ge(e,ra),fanOut:t,handlesErrors:a,reachesOutbound:c,runsAiGeneration:s||ge(e,ia),throwsBareError:ha(e),unboundedAiGeneration:n,usesInsertManyUnsafe:o,writesUserTable:r}},ya=(e,t)=>{const s=e.getInitializer();if(!s||!i.isCallExpression(s))return;const n=D(s);if(!n||n.kind!=="query"&&n.kind!=="mutation"&&n.kind!=="action")return;const o=n.receiver?Yo(n.receiver):{usesCaptcha:!1,usesEmailGate:!1,usesMask:!1,usesRateLimit:!1,usesRls:!1},r=Aa(e,s);return{...r?Na(r):{},...va(e),...o,analyzableBody:r!==void 0,exportName:e.getName(),file:t,hasEmailArg:jo(s,n.receiver),kind:n.kind,visibility:n.visibility}},ba=(e,t)=>{const s=[];for(const n of e.getVariableStatements())if(n.isExported())for(const o of n.getDeclarations()){const r=ya(o,t);r&&s.push(r)}return s},Ia=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...ba(o,x(t,n)))}return s},Pa=new Set(["dbRateLimit","rateLimit"]),wa=e=>i.isArrowFunction(e)?e.getBody():e,Ta=(e,t)=>{const s=I(e.getExpression());if(s===void 0||!Pa.has(s))return;const n=e.getArguments()[2];if(!n)return;const o=S(n,"key");if(!o)return;const r=wa(o);if(!(!T(r)||F(r)))return{callee:s,exportName:E(e),file:t,limitName:Et(e),line:e.getStartLineNumber()}},Ca=(e,t)=>y(e,t,Ta),Oa=new Set(["findFirst","findFirstOrThrow","findMany","get"]),Ra=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||!Oa.has(t.getName()))return;const s=t.getExpression();if(_(s)){const n=e.getArguments()[0];return n&&i.isStringLiteral(n)?n.getLiteralText():""}if(i.isPropertyAccessExpression(s)&&_(s.getExpression()))return s.getName()},Fa=e=>{let t=e;for(;i.isCallExpression(t);){const s=t.getExpression();if(!i.isPropertyAccessExpression(s))return;if(s.getName()==="query"&&_(s.getExpression())){const n=t.getArguments()[0];return n&&i.isStringLiteral(n)?n.getLiteralText():""}t=s.getExpression()}},La=e=>{let t=e;for(;i.isAwaitExpression(t)||i.isParenthesizedExpression(t)||i.isNonNullExpression(t)||i.isAsExpression(t);)t=t.getExpression();return t},Dt=(e,t=!1)=>{const s=La(e);if(i.isIdentifier(s)){if(t)return;const n=te(s);return n===void 0?void 0:Dt(n,!0)}if(i.isCallExpression(s))return Ra(s)??Fa(s)},Da=e=>{const t=e.getBody();if(!i.isBlock(t))return[t];const s=[];for(const n of e.getDescendantsOfKind(l.ReturnStatement)){const o=n.getFirstAncestor(a=>i.isArrowFunction(a)||i.isFunctionExpression(a)||i.isFunctionDeclaration(a)),r=n.getExpression();o===e&&r!==void 0&&s.push(r)}return s},ka=(e,t)=>{if(!i.isVariableDeclaration(e))return[];const s=e.getInitializer();if(s===void 0||!i.isCallExpression(s))return[];const n=D(s);if(n?.kind!=="query")return[];const o=St(s);if(o===void 0)return[];const r=n.receiver!==void 0&&Rs(n.receiver,"output"),a=n.receiver!==void 0&&At(n.receiver,"use","mask"),c=new Set,u=[];for(const d of Da(o)){const v=Dt(d);v===void 0||c.has(v)||(c.add(v),u.push({exportName:e.getName(),file:t,line:d.getStartLineNumber(),table:v,usesMask:a,usesOutput:r,visibility:n.visibility}))}return u},Ma=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n),r=x(t,n);for(const a of o.getVariableStatements())if(a.isExported())for(const c of a.getDeclarations())s.push(...ka(c,r))}return s},Ka=e=>{if(!e||!i.isObjectLiteralExpression(e))return[];const t=[];for(const s of e.getProperties())(i.isPropertyAssignment(s)||i.isShorthandPropertyAssignment(s)||i.isMethodDeclaration(s)||i.isGetAccessorDeclaration(s))&&t.push(s.getName());return t},_a=(e,t)=>{if(!i.isVariableDeclaration(e))return[];const s=e.getInitializer(),n=s&&i.isCallExpression(s)?D(s):void 0;if(!n)return[];const o=[];for(const r of e.getDescendantsOfKind(l.CallExpression)){const a=vt(r);if(a===void 0)continue;const c=Ka(S(a.options,"with"));c.length!==0&&o.push({exportName:e.getName(),file:t,line:r.getStartLineNumber(),parentTable:a.table,relations:c,visibility:n.visibility})}return o},za=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n),r=x(t,n);for(const a of o.getVariableStatements())if(a.isExported())for(const c of a.getDeclarations())s.push(..._a(c,r))}return s},Z=e=>{if(i.isStringLiteral(e)||i.isNoSubstitutionTemplateLiteral(e))return e.getLiteralText();if(i.isBinaryExpression(e)&&e.getOperatorToken().getKind()===l.PlusToken){const t=Z(e.getLeft()),s=Z(e.getRight());return t!==void 0&&s!==void 0?t+s:void 0}},Ua=e=>{let t=e,s=t.getParent();for(;s!==void 0&&i.isBinaryExpression(s)&&s.getOperatorToken().getKind()===l.PlusToken;)t=s,s=t.getParent();return t!==e&&Z(t)!==void 0},Ba=/(?:^|\/)__tests__\//u,qa=/\.(?:spec|test)$/u,$a=e=>Ba.test(e)||qa.test(e),Va=e=>{const t=e.getParent();if(t!==void 0){if(i.isVariableDeclaration(t)||i.isPropertyAssignment(t)||i.isPropertySignature(t))return t.getName();if(i.isBinaryExpression(t)&&t.getOperatorToken().getKind()===l.EqualsToken)return t.getLeft().getText()}},ja=(e,t,s)=>sn(e)?!$a(s)&&nn(Va(t)):!0,Wa=(e,t)=>{const s=[],n=[...e.getDescendantsOfKind(l.BinaryExpression),...e.getDescendantsOfKind(l.StringLiteral),...e.getDescendantsOfKind(l.NoSubstitutionTemplateLiteral)],o=new Set;for(const r of n){if(Ua(r))continue;const a=Z(r);if(a===void 0)continue;const c=en(a);if(c===void 0||!ja(c,r,t))continue;const u=r.getStartLineNumber(),d=`${String(u)}:${c}`;o.has(d)||(o.add(d),s.push({file:t,kind:c,line:u,preview:tn(a)}))}return s},Ha=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...Wa(o,x(t,n)))}return s},Ga=(e,t)=>{if(!i.isVariableDeclaration(e))return[];const s=e.getInitializer(),n=s&&i.isCallExpression(s)?D(s):void 0;if(!n)return[];const o=[];for(const r of e.getDescendantsOfKind(l.CallExpression)){const a=vt(r);if(a===void 0)continue;const c=S(a.options,"includeDeleted");if(c===void 0)continue;const u=i.isTrueLiteral(c),d=!u&&T(c);!u&&!d||o.push({exportName:e.getName(),file:t,fromArgs:d,hardcodedTrue:u,line:r.getStartLineNumber(),table:a.table,visibility:n.visibility})}return o},Ya=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n),r=x(t,n);for(const a of o.getVariableStatements())if(a.isExported())for(const c of a.getDeclarations())s.push(...Ga(c,r))}return s},Qa=new Set(["query","unsafe"]),Xa=e=>{if(!i.isPropertyAccessExpression(e)||!Qa.has(e.getName()))return!1;const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||t.getName()!=="sql")return!1;const s=t.getExpression();return i.isIdentifier(s)&&s.getText()==="ctx"},Za=e=>i.isBinaryExpression(e)||i.isTemplateExpression(e),Ja=e=>e.getFirstAncestorByKind(l.VariableDeclaration)?.getName()??"<module>",ec=(e,t)=>{if(!Xa(e.getExpression()))return;const s=e.getArguments()[0];if(!(!s||!Za(s)))return{exportName:Ja(e),file:t,line:s.getStartLineNumber()}},tc=(e,t)=>y(e,t,ec),sc=[["convex",["convex","@convex-dev/"]],["supabase",["@supabase/"]],["firebase",["firebase","@firebase/","firebase-admin"]]],nc=e=>{for(const[t,s]of sc)for(const n of s)if(e===n||e.startsWith(n.endsWith("/")?n:`${n}/`))return t},rc=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n);for(const r of o.getImportDeclarations()){const a=r.getModuleSpecifierValue(),c=nc(a);c!==void 0&&s.push({file:x(t,n),line:r.getStartLineNumber(),moduleSpecifier:a,platform:c})}}return s},ic=new Set(["createMultipartUpload","delete","download","generateUploadUrl","get","getMetadata","getPresignedUrl","getSignedUrl","getUrl","head","put","resumeMultipartUpload","store","upload"]),oc=(e,t,s=[])=>{const n=new Map(s.map(r=>[`${r.filePath}:${r.exportName}`,r.visibility]));return se(e,t,{argIndex:0,matchReceiver:r=>r==="ctx.storage"||r.startsWith("ctx.storage."),methods:ic,requireUnmodifiedReach:!0}).map(r=>{const a=n.get(`${r.file}:${r.exportName}`);return a===void 0?r:{...r,visibility:a}})},ac=new Map([["generateUploadUrl",1],["getPresignedUrl",1],["getSignedUrl",1],["store",2],["upload",2]]),cc=e=>e&&i.isNumericLiteral(e)?Number(e.getText()):void 0,lc=e=>{if(e===void 0)return{analyzable:!0,presentKeys:[]};if(!i.isObjectLiteralExpression(e))return{analyzable:!1,presentKeys:[]};const t=[];let s,n=!1;for(const o of e.getProperties()){if(i.isSpreadAssignment(o)){n=!0;continue}if(i.isPropertyAssignment(o)){const r=o.getName();t.push(r),r==="expiresInSeconds"&&(s=cc(o.getInitializer()));continue}(i.isShorthandPropertyAssignment(o)||i.isMethodDeclaration(o))&&t.push(o.getName())}return{analyzable:!n,expiresInSeconds:s,presentKeys:t}},uc=e=>{if(!i.isPropertyAccessExpression(e))return;const t=e.getName(),s=ac.get(t);if(s===void 0)return;const n=e.getExpression().getText();return n==="ctx.storage"||n.startsWith("ctx.storage.")?{method:t,optionsIndex:s}:void 0},dc=(e,t)=>{const s=uc(e.getExpression());if(s!==void 0)return{exportName:E(e),file:t,line:e.getStartLineNumber(),method:s.method,...lc(e.getArguments()[s.optionsIndex])}},fc=(e,t)=>y(e,t,dc),pc=new Set(["RegisteredAction","RegisteredMutation","RegisteredQuery"]),Ae=e=>{const t=e.getType(),s=t.getAliasSymbol()?.getName()??t.getSymbol()?.getName();return s!==void 0&&pc.has(s)?s:void 0},kt=e=>{const t=e.getInitializer();return t===void 0?!1:i.isCallExpression(t)||i.isIdentifier(t)||i.isPropertyAccessExpression(t)},Mt={cause:"codegen recognises a procedure only when the initializer is a builder chain, and this one is produced by a call or an alias",remediation:"A factory that returns a procedure cannot be read statically — inline it, or export the chain the factory builds."},gc={cause:"the binding is exported by a separate `export { … }` statement, and codegen reads the `export` keyword on the declaration itself",remediation:"Move the keyword onto the declaration and drop the separate export statement."},Ne=(e,t,s,n,o)=>({cacheKey:`procedure_not_registered:${e}:${t}`,categories:["SCHEMA"],description:"Codegen registers an export only when the declaration carries `export` and its initializer is literally a builder chain. A procedure written any other way exists at runtime but never reaches `_generated/api.ts`, so no caller can address it.",detail:`\`${t}\` in \`${e}\` (line ${n.toString()}) has type \`${s}\` but was not registered — ${o.cause}.`,facing:"INTERNAL",level:"WARN",metadata:{exportName:t,filePath:e,line:n,typeName:s},name:"procedure_not_registered",remediation:`Assign the builder chain directly: \`export const ${t} = query.input({ … }).query(handler);\`. ${o.remediation}`,title:"Procedure exists at runtime but is missing from the generated API"}),mc=(e,t,s)=>{const n=[];for(const o of e.getVariableStatements().filter(r=>r.isExported()))for(const r of o.getDeclarations()){const a=r.getName();if(s.has(`${t}:${a}`)||!kt(r))continue;const c=Ae(r);c!==void 0&&n.push(Ne(t,a,c,r.getStartLineNumber(),Mt))}return n},hc=(e,t,s)=>{if(s.has(`${t}:default`))return[];const n=[];for(const o of e.getExportAssignments().filter(r=>!r.isExportEquals())){const r=Ae(o.getExpression());r!==void 0&&n.push(Ne(t,"default",r,o.getStartLineNumber(),Mt))}return n},xc=(e,t,s)=>{const n=[];for(const o of e.getExportDeclarations().filter(r=>r.getModuleSpecifier()===void 0))for(const r of o.getNamedExports()){const a=r.getAliasNode()?.getText()??r.getName();if(s.has(`${t}:${a}`))continue;const c=r.getLocalTargetDeclarations().find(d=>i.isVariableDeclaration(d));if(c===void 0||!kt(c))continue;const u=Ae(c);u!==void 0&&n.push(Ne(t,a,u,r.getStartLineNumber(),gc))}return n},Ec=(e,t,s)=>[...mc(e,t,s),...hc(e,t,s),...xc(e,t,s)],vc=(e,t,s)=>{const n=new Set(s.map(r=>`${r.filePath}:${r.exportName}`)),o=[];for(const r of g(t)){const a=e.getSourceFile(r);a!==void 0&&o.push(...Ec(a,x(t,r),n))}return o.toSorted((r,a)=>r.cacheKey.localeCompare(a.cacheKey))},Sc=new Set(["when","where"]),me=new Set(["definePolicy","defineShape"]),Ac=e=>{if(!i.isCallExpression(e))return;const t=e.getExpression();if(i.isPropertyAccessExpression(t)){const n=t.getName();return me.has(n)?n:void 0}if(!i.isIdentifier(t))return;for(const n of t.getSymbol()?.getDeclarations()??[])if(i.isImportSpecifier(n)){const o=n.getNameNode().getText();return me.has(o)?o:void 0}const s=t.getText();return me.has(s)?s:void 0},Nc=e=>i.isObjectLiteralExpression(e)&&e.getProperties().length===0,Kt=e=>{if(e!==void 0){if(i.isReturnStatement(e)&&e.getExpression()===void 0||e.getKind()===l.UndefinedKeyword||e.getText()==="undefined")return"undefined";if(Nc(e))return"empty-object";if(i.isParenthesizedExpression(e))return Kt(e.getExpression())}},ye=e=>e.getAncestors().find(t=>i.isArrowFunction(t)||i.isFunctionExpression(t)||i.isFunctionDeclaration(t)),yc=e=>e.getDescendantsOfKind(l.ReturnStatement).filter(t=>ye(t)===e),_t=e=>e.getDescendantsOfKind(l.ConditionalExpression).filter(t=>ye(t)===e),bc=e=>{const t=yc(e);return t.length>1?!0:t.some(s=>s.getFirstAncestorByKind(l.IfStatement)!==void 0)||_t(e).length>0},Ic=e=>e.getDescendantsOfKind(l.IfStatement).filter(t=>ye(t)===e),xe=e=>e.getKind()===l.NullKeyword||e.getKind()===l.FalseKeyword||i.isIdentifier(e)&&e.getText()==="undefined"?!0:i.isNumericLiteral(e)?e.getLiteralValue()===0:i.isStringLiteral(e)&&e.getLiteralValue()==="",Pc=(e,t)=>xe(e)||xe(t),wc=new Map([[l.EqualsEqualsEqualsToken,"positive"],[l.EqualsEqualsToken,"positive"],[l.ExclamationEqualsEqualsToken,"negative"],[l.ExclamationEqualsToken,"negative"]]),pt=e=>!xe(e)&&(i.isLiteralExpression(e)||e.getKind()===l.TrueKeyword),Tc=(e,t,s)=>{const n=wc.get(e);if(n!==void 0)return Pc(t,s)?n==="positive"?"negative":"positive":pt(t)||pt(s)?void 0:n},$=e=>{if(i.isParenthesizedExpression(e))return $(e.getExpression());if(i.isPrefixUnaryExpression(e)&&e.getOperatorToken()===l.ExclamationToken)return"negative";if(i.isBinaryExpression(e)){const t=e.getOperatorToken().getKind(),s=Tc(t,e.getLeft(),e.getRight());if(s!==void 0)return s;if(t===l.AmpersandAmpersandToken||t===l.BarBarToken){const n=$(e.getLeft()),o=$(e.getRight());return n===o?n:"indeterminate"}}return i.isIdentifier(e)||i.isPropertyAccessExpression(e)||i.isElementAccessExpression(e)||i.isCallExpression(e)?"positive":"indeterminate"},gt=e=>{if(e!==void 0){if(i.isReturnStatement(e))return e;if(i.isBlock(e)){const t=e.getStatements().at(-1);return t!==void 0&&i.isReturnStatement(t)?t:void 0}}},Cc=e=>{if(e.getElseStatement()!==void 0)return;const t=e.getNextSiblingIfKind(l.ReturnStatement);return t!==void 0&&t.getNextSibling()===void 0?t:void 0},Oc=e=>i.isReturnStatement(e)?e.getExpression()??e:e,Rc=e=>{const t=[];for(const s of _t(e)){const n=$(s.getCondition());n==="positive"?t.push(s.getWhenFalse()):n==="negative"&&t.push(s.getWhenTrue())}for(const s of Ic(e)){const n=$(s.getExpression());if(n==="indeterminate")continue;const o=n==="negative"?gt(s.getThenStatement()):gt(s.getElseStatement())??Cc(s);o!==void 0&&t.push(Oc(o))}return t},Fc=e=>{for(const t of e.getAncestors())if(i.isVariableDeclaration(t)){const s=t.getNameNode();if(i.isIdentifier(s))return s.getText()}return"<anonymous>"},Lc=(e,t,s)=>{if(!i.isCallExpression(e))return[];const[n]=e.getArguments();if(!n||!i.isObjectLiteralExpression(n))return[];const o=[];for(const r of n.getProperties()){if(!i.isPropertyAssignment(r)||!Sc.has(r.getName()))continue;const a=r.getInitializer();if(!(!a||!(i.isArrowFunction(a)||i.isFunctionExpression(a)))&&bc(a))for(const c of Rc(a)){const u=Kt(c);u!==void 0&&o.push({exportName:Fc(e),file:s,form:u,key:r.getName(),line:c.getStartLineNumber(),owner:t})}}return o},Dc=(e,t)=>{const s=[];for(const n of e.getDescendantsOfKind(l.CallExpression)){const o=Ac(n);o!==void 0&&s.push(...Lc(n,o,t))}return s},kc=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...Dc(o,x(t,n)))}return s},Mc=new Set(["query","upsert","upsertMany"]),Kc=e=>{if(!i.isPropertyAccessExpression(e))return;const t=e.getName();if(Mc.has(t))return e.getExpression().getText()==="ctx.vectors"?t:void 0},_c=(e,t)=>{const s=Kc(e.getExpression());if(s===void 0)return;const n=e.getArguments()[1];if(!n)return;const o=S(n,"namespace");if(!(!o||!T(o)||F(o)))return{exportName:E(e),file:t,line:e.getStartLineNumber(),method:s}},zc=(e,t)=>y(e,t,_c),Uc=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||t.getName()!=="get")return!1;const s=t.getExpression();return i.isPropertyAccessExpression(s)?s.getName()==="workflows":i.isIdentifier(s)&&s.getText()==="workflows"},Bc=e=>{const t=e.getArguments()[0];return t&&i.isStringLiteral(t)?t.getLiteralText():""},qc=(e,t)=>{const s=[];for(const n of g(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n),r=x(t,n);for(const a of o.getDescendantsOfKind(l.CallExpression)){if(!Uc(a))continue;const c=xs(a);c!==""&&s.push({exportName:c,file:r,line:a.getStartLineNumber(),workflow:Bc(a)})}}return s},$c=".lunora-schema.json",b=(e,t)=>{N(e)&&xt(e,"utf8")===t||Wt(e,t,"utf8")},w=(e,t)=>{if(t===""){Ht(e,{force:!0});return}b(e,t)},Vc=e=>{const t=f(e,"package.json");if(N(t))try{const s=JSON.parse(xt(t,"utf8"));return typeof s.version=="string"&&s.version!==""?s.version:void 0}catch{return}},jc=()=>{const e=process.env.LUNORA_CODEGEN_TIMING;return e!==void 0&&e!==""},Wc=e=>{let t=N(e)?e:ue(e);for(;t&&t!==ue(t);){const s=f(t,"tsconfig.json");if(N(s))return s;t=ue(t)}},mt=e=>e.replaceAll("\\","/"),Hc=(e,t,s)=>{if(s&&e.length>0){const r=e.map(a=>`"${a.exportName}"`).join(", ");throw new R("MASK_UNSUPPORTED",`This project declares a \`mask(...)\` policy whose argument isn't a plain object literal (e.g. \`mask(sharedPolicies)\` referencing a hoisted variable), or contains a spread (\`...shared\`) or computed key (\`[name]:\`) codegen can't enumerate, so codegen can't tell which columns it masks. Because the project also declares replication shape(s) (${r}), codegen can't verify none of them replicate a table that policy masks — inline every table and column as literal keys so codegen can verify it, or remove the affected shape(s).`,{status:422})}const n=new Map;for(const r of t.columns){const a=n.get(r.table)??[];a.push(r.column),n.set(r.table,a)}const o=t.columns.length>0;for(const r of e){if(r.table===void 0){if(o)throw new R("MASK_UNSUPPORTED",`defineShape "${r.exportName}" has a non-literal \`table\` (a variable or expression, not a string literal), so codegen can't statically verify it doesn't replicate a table that masks a column. This project masks at least one column elsewhere, so the combination can't be proven safe — change "${r.exportName}"'s \`table\` to a plain string literal so codegen can verify it, or remove the mask(s) on the table it targets.`,{status:422});continue}const a=n.get(r.table);if(a===void 0)continue;const c=a.map(u=>`"${u}"`).join(", ");throw new R("MASK_UNSUPPORTED",`defineShape "${r.exportName}" replicates table "${r.table}", which masks column(s) ${c} on at least one procedure. A shape runs no procedure, so \`.use(mask(...))\` never applies to its replicated rows — remove the shape, unmask the table, or wait for shape-masking support.`,{status:422})}},ht=(e,t,s)=>{const n=e.getSourceFile(t);if(n===void 0){e.createSourceFile(t,s,{overwrite:!0});return}n.getFullText()!==s&&n.replaceWithText(s)},Gc=e=>{const t=Wc(e);return t?new Qe({skipAddingFilesFromTsConfig:!1,tsConfigFilePath:t,useInMemoryFileSystem:!1}):new Qe({skipAddingFilesFromTsConfig:!0,useInMemoryFileSystem:!1})},Kl=(e,t)=>{const s=g(t),n=f(t,"schema.ts");N(n)&&s.push(n);for(const c of s){const u=e.getSourceFile(c);u===void 0?e.addSourceFileAtPath(c):u.refreshFromFileSystemSync()}const o=new Set(s.map(c=>mt(c))),r=mt(t),a=`${r}/`;for(const c of e.getSourceFiles()){const u=c.getFilePath();(u===r||u.startsWith(a))&&!o.has(u)&&e.removeSourceFile(c)}for(const c of e.getSourceFiles()){const u=c.getFilePath();if(!(u===r||u.startsWith(a)||u.includes("/node_modules/")))try{c.refreshFromFileSystemSync()}catch{e.removeSourceFile(c)}}},_l=e=>{const t=jc(),s=t?de.now():0,n=f(e.projectRoot,e.lunoraDirectory??"lunora"),o=f(n,"schema.ts");if(!N(o))throw new R("INTERNAL",`schema.ts not found at ${o}`);const r=e.project??Gc(n);dn(Ls);const a=Js(r,o,e.projectRoot),{agents:c,containers:u,dataModelContent:d,dependencies:v,env:P,featureUsage:p,hasBrowser:A,hasFlags:k,hasNotify:z,identity:U,platformGate:V,queues:C,serverContent:M,storageRulesMetadata:B,usesSandbox:ne,useUmbrella:K,workflows:O}=Ln({lunoraDirectory:n,project:r,projectRoot:e.projectRoot,schema:a,target:e.target}),m=f(n,"_generated"),be=f(m,"dataModel.ts"),Ie=f(m,"server.ts");ht(r,be,d),ht(r,Ie,M);const L=Fs(r,n),Pe=Ks(r,n),we=$s(r,n),q=rn(r,n),re=Ws(r,n),ie=ks(r,n,O,c),j=e.lint===!1?void 0:Qt({adminRoutes:Bn(r,n),aiRawRuns:Vn(r,n),aiToolSideEffects:er(r,n),argumentDerivedFetches:nr(r,n),argumentValidators:mr(r,n),authApiCalls:Ds(r,n),authConfigs:Ir(r,n),browserUrlAccesses:Or(r,n),configCalls:_r(r,n),containerKeyAccesses:Ur(r,n),containerOverrides:Wr(r,n),containers:u,exportSinks:Qr(r,n),staleMigrationImports:rc(r,n),failOpenGuards:ti(r,n),flagReads:oi(r,n),flagSecurityDefaults:ui(r,n),geoIndexUsages:pi(r,n),httpActionGuards:Si(r,n),httpHeaderWrites:Oi(r,n),identityClaimReads:Ki(r,n),imageDeliveryUrlAccesses:zi(r,n),inserts:_s(r,n),kvKeyAccesses:Bi(r,n),mailRecipientAccesses:Wi(r,n),maskProcedures:zs(r,n),maskStrategies:Us(r,n),mutatorWrites:Zi(r,n),nondeterministicCalls:Hs(r,n),normalizeIdAuthorizations:mo(r,n),notifyCalls:Ys(r,n),notifyConfig:Gs(r,n),ownerFieldWrites:yo(r,n,L),unrestrictedWhereBranches:kc(r,n),paymentWebhooks:To(r,n),privilegedDispatches:Bo(r,n),procedureProtections:Ia(r,n),queries:Cs(r,n),queues:C,r2sqlCalls:Qs(r,n),ratelimitKeySelectors:Ca(r,n),rawRowReturns:Ma(r,n),relationLoads:za(r,n),rlsProcedures:Xs(r,n),schema:a,secretLiterals:Ha(r,n),shapes:q,softDeleteReads:Ya(r,n),sqlInterpolations:tc(r,n),storageKeyAccesses:oc(r,n,L),storageUploads:fc(r,n),vectorNamespaceAccesses:zc(r,n),workflowCalls:qc(r,n),workflows:O,wranglerVariables:e.wranglerVariables}),Te=j===void 0?[]:[...Gt(j,{source:"static"}),...vc(r,n,L)],zt=Zs(r,n),Ce=Bs(r,n);Hc(q,Ce,qs(r,n));const Ut=k?Ms(r,n):[],W=Pn(p,{containerCount:u.length,cronCount:ie.length,dependencies:v,hasPaymentTables:In(a.tables),queueCount:C.length,storageColumnCount:Object.keys(ts(a)).length,storageRuleCount:B.rules.length,vectorIndexCount:a.vectorIndexes.length,workflowCount:O.length}),Oe=t?de.now():0,Re=ss({agents:c,functions:L,httpRoutes:Pe,mutators:re,useUmbrella:K,workflows:O}),Fe=ns({agents:c,functions:L,migrations:we,mutators:re,shapes:q,useUmbrella:K,usesSandbox:ne}),oe=fn(a,we.map(h=>h.id)),Le=rs({advisories:Te,advisorProcedures:j?.procedureProtections??[],agents:c,containers:u,env:P,flagKeys:Ut,hasAccessFacade:p.access,hasAi:p.ai,hasAnalytics:p.analytics,hasBrowser:A,hasFlags:k,hasHyperdrive:p.hyperdrive,hasImages:p.images,hasKv:p.kv,hasNotify:z,hasPayments:p.payments,hasPipelines:p.pipelines,hasR2sql:p.r2sql,hasX402:p.x402,maskMetadata:Ce,mutators:re,queues:C,rlsMetadata:zt,schema:a,schemaSnapshot:oe,shapes:q,storageRules:B,studioFeatures:W,useUmbrella:K,workflows:O}),De=is(q,v.has("@lunora/db"),K),ke=os(u,a.jurisdiction),Me=as(O),Ke=cs(c),_e=ls(C),ze=us(ie),Ue=ds(a.vectorIndexes),H=fs(a,K),Be=ps(v.has("@lunora/seed")),G=e.apiSpec??"openapi",ae=G==="openapi"||G==="both",ce=G==="openrpc"||G==="both",qe=on({emailAgents:c.filter(h=>h.onEmail===!0).map(h=>({bindingName:h.bindingName,exportName:h.exportName})),hasAccess:v.has("@lunora/cloudflare-access"),hasAi:p.ai,hasAnalytics:p.analytics,hasAuth:v.has("@lunora/auth"),hasBrowser:A,hasFramework:v.has("@lunora/astro")||v.has("@lunora/svelte")||v.has("@lunora/vue"),hasGlobal:a.tables.some(h=>h.shardMode==="global"&&h.globalBackend!=="hyperdrive"),hasHyperdrive:p.hyperdrive,hasHyperdriveGlobal:a.tables.some(h=>h.shardMode==="global"&&h.globalBackend==="hyperdrive"),hasImages:p.images,hasKv:W.kv,hasNotify:z,hasPayments:p.payments,hasR2sql:p.r2sql,hasQueue:C.some(h=>h.mode==="push"),hasScheduler:W.scheduler,hasStorage:W.storage,hasVectors:a.vectorIndexes.length>0,hasWorkflow:O.length>0,hasX402:p.x402,identity:U,jurisdiction:a.jurisdiction,useUmbrella:K,voiceAgents:c.filter(h=>h.voice===!0&&h.voiceBindingName!==void 0).map(h=>({bindingName:h.voiceBindingName,exportName:h.exportName})),wantsOpenApi:ae,wantsOpenRpc:ce}),$e=Vc(e.projectRoot),Ve=an({functions:L,httpRoutes:Pe,version:$e}),je=ln({functions:L,version:$e}),We=`${JSON.stringify(Ve,void 0,2)}
8
+ `,He=`${JSON.stringify(je,void 0,2)}
9
+ `,Ge=cn(Ve),Ye=un(je),le=f(n,$c),Bt=N(le);if(e.dryRun||(N(m)||jt(m,{recursive:!0}),b(f(m,"app.ts"),qe),b(be,d),b(f(m,"api.ts"),Re),b(Ie,M),b(f(m,"functions.ts"),Fe),b(f(m,"shard.ts"),Le),b(f(m,"crons.ts"),ze),b(f(m,"vectors.ts"),Ue),b(f(m,"drizzle.global.ts"),H.global),b(f(m,"drizzle.shard.ts"),H.shard),w(f(m,"containers.ts"),ke),w(f(m,"workflows.ts"),Me),w(f(m,"agents.ts"),Ke),w(f(m,"queues.ts"),_e),w(f(m,"seed.ts"),Be),w(f(m,"collections.ts"),De),w(f(m,"openapi.json"),ae?We:""),w(f(m,"openapi.ts"),ae?Ge:""),w(f(m,"openrpc.json"),ce?He:""),w(f(m,"openrpc.ts"),ce?Ye:""),(!Bt||e.updateSchemaBaseline===!0)&&b(le,Yt(oe))),t){const h=de.now(),qt=Math.round(h-s),$t=Math.round(Oe-s),Vt=Math.round(h-Oe);console.error(`@lunora/codegen: codegen took ${qt.toString()}ms (discovery ${$t.toString()}ms, emit ${Vt.toString()}ms)`)}return{advisories:Te,advisorContext:j,agents:c,containers:u,cronTriggers:gs(ie),generated:{agents:Ke,api:Re,app:qe,collections:De,containers:ke,crons:ze,dataModel:d,drizzleGlobal:H.global,drizzleShard:H.shard,functions:Fe,openApi:We,openApiModule:Ge,openRpc:He,openRpcModule:Ye,queues:_e,seed:Be,server:M,shard:Le,vectors:Ue,workflows:Me},outputDirectory:m,platformDiagnostics:V.diagnostics,queues:C,schemaSnapshot:oe,schemaSnapshotPath:le,workflows:O}};export{$c as SCHEMA_SNAPSHOT_FILENAME,Gc as createCodegenProject,Wc as findTsconfig,Kl as refreshCodegenProject,_l as runCodegen};
@@ -1,3 +1,3 @@
1
- import{G as S}from"./emit-C_sJaMGR.mjs";import{s as p}from"./paths-C-9fwEgQ.mjs";import{LUNORA_ERROR_CODES as O,objectSchema as h,validatorIrToJsonSchema as u}from"./LUNORA_ERROR_CODES-BYg8Lpgb.mjs";const E="/_lunora/rest",A=["authorization","cf-access-jwt-assertion","cookie","x-payment"],f=["x-d1-bookmark","x-lunora-shard-key"],P=e=>[...A,...(e.credentialHeaders??[]).map(t=>t.toLowerCase())],g=e=>Number.isFinite(e)?Math.max(0,Math.floor(e)):0,y=(...e)=>{const t=[];for(const r of e)for(const o of r?.split(",")??[]){const s=o.trim().toLowerCase();s!==""&&!t.includes(s)&&t.push(s)}return t.length===0?void 0:t.join(", ")},T=(e,t)=>{const r=[t,`max-age=${String(g(e.maxAge))}`];return e.staleWhileRevalidate!==void 0&&r.push(`stale-while-revalidate=${String(g(e.staleWhileRevalidate))}`),r.join(", ")},b=e=>e.scope==="public"?y(e.vary,...P(e),...f):y(e.vary,...f),x=e=>{const t=e.indexOf(":");if(!(t<=0||t>=e.length-1||e.indexOf(":",t+1)!==-1))return{name:e.slice(t+1),namespace:e.slice(0,t)}},N=e=>{const t=x(e);if(t!==void 0)return`${E}/${t.namespace}/${t.name}`},k=e=>e==="query"?"GET":"POST",m="#/components/responses/LunoraError",v=/:([A-Za-z_$][\w$]*)/gu,q=e=>[...e.matchAll(v)].map(t=>t[1]),_=e=>e.replaceAll(v,"{$1}"),l=e=>e.kind==="optional"?e.inner??e:e,j=e=>{const t=new Set(q(e.path)),r=[];for(const[o,s]of Object.entries(e.searchParams)){const c=l(s);r.push({description:`Query parameter \`${o}\``,in:"query",name:o,required:s.kind!=="optional",schema:u(c)})}for(const[o,s]of Object.entries(e.params)){const c=l(s);r.push({description:`Path parameter \`${o}\``,in:t.has(o)?"path":"query",name:o,required:t.has(o)?!0:s.kind!=="optional",schema:u(c)})}return r},$=e=>e?{content:{"application/json":{schema:u(e)}},description:"Successful response."}:{content:{"application/json":{schema:{description:"Return shape is TS-inferred (no `.output()` declared); best-effort — any JSON."}}},description:"Successful response. The return shape is TypeScript-inferred and not declared via `.output()`, so it is documented best-effort."},C=e=>{const t=p(e.filePath),r=j(e),o={description:`${e.stream?"Streaming (SSE) ":""}HTTP route handler \`${e.exportName}\` (${e.method} ${e.path}).`,operationId:`${e.method.toLowerCase()}_${p(e.path)}`,responses:{200:$(e.output),204:{description:"No content (handler returned `undefined`)."},default:{$ref:m}},summary:`${e.method} ${e.path}`,tags:[t]};return r.length>0&&(o.parameters=r),Object.keys(e.body).length>0&&(o.requestBody={content:{"application/json":{schema:h(e.body)}},required:!0}),e.stream&&(o["x-lunora-stream"]="text/event-stream"),o},w=e=>{const t=p(e.filePath),r=`${t}:${e.exportName}`,o={additionalProperties:!1,properties:{args:h(e.args),functionPath:{const:r,type:"string"},shardKey:{description:"Optional shard key; omitted routes to the default shard.",type:"string"}},required:["functionPath"],type:"object"};return{operation:{description:`Invoke the \`${e.kind}\` \`${r}\` over the Lunora RPC envelope (POST /_lunora/rpc).`,operationId:r,requestBody:{content:{"application/json":{schema:o}},required:!0},responses:{200:$(e.output),default:{$ref:m}},summary:`${e.kind}: ${r}`,tags:[t],"x-lunora-function-kind":e.kind},pathKey:`/_lunora/rpc#${r}`}},D=(e,t)=>{if(e===void 0||t!=="get"||e.scope===void 0||e.maxAge===void 0)return{};const r={maxAge:e.maxAge,scope:e.scope,...e.staleWhileRevalidate===void 0?{}:{staleWhileRevalidate:e.staleWhileRevalidate},...e.tag===void 0?{}:{tag:e.tag},...e.vary===void 0?{}:{vary:e.vary}},o={"Cache-Control":{description:r.scope==="public"?"Caching policy. `public` applies only to an uncredentialed request — a request carrying `Authorization` or `Cookie` is always answered `private`.":"Caching policy. Restricted to the caller's own cache; never stored by a shared/edge cache.",schema:{example:T(r,r.scope),type:"string"}}};r.tag!==void 0&&(o["Cache-Tag"]={description:"Purge tag for `ctx.cache.purge({ tags: [...] })`.",schema:{example:r.tag,type:"string"}});const s=b(r);return s!==void 0&&(o.Vary={description:"Request headers this response varies by. The endpoint's own negotiated headers are merged in at runtime.",schema:{example:s,type:"string"}}),{headers:o}},L=e=>{const t=p(e.filePath),r=`${t}:${e.exportName}`,o=N(r);if(o===void 0)return;const s=k(e.kind),c=s==="GET",d={description:`Public REST endpoint for the \`${e.kind}\` \`${r}\` (opt-in via \`.expose({ rest: true })\`). Routed through the procedure, so auth / RLS / validators are enforced.`,operationId:`rest_${p(o)}`,responses:{200:{content:{"application/json":{schema:{description:"Procedure result. The shape is TS-inferred from the return type; best-effort — any JSON."}}},description:"Successful result (TypeScript-inferred return shape, documented best-effort).",...D(e.expose?.cache,c?"get":"post")},default:{$ref:m}},summary:`${s} ${o}`,tags:[t],"x-lunora-function-kind":e.kind};if(c){const n=Object.entries(e.args).map(([a,i])=>{const R=l(i);return{description:`Argument \`${a}\` (JSON-encoded for non-string values).`,in:"query",name:a,required:i.kind!=="optional",schema:u(R)}});return n.length>0&&(d.parameters=n),{method:"get",operation:d,path:o}}return d.requestBody={content:{"application/json":{schema:h(e.args)}},required:Object.keys(e.args).length>0},{method:"post",operation:d,path:o}},I=e=>{const t=e.version??"0.0.0",r={},o=new Set;for(const n of e.httpRoutes){const a=_(n.path),i=r[a]??{};i[n.method.toLowerCase()]=C(n),r[a]=i,o.add(p(n.filePath))}const s=e.functions.filter(n=>n.visibility!=="internal"&&n.kind!=="stream");for(const n of s){const{operation:a,pathKey:i}=w(n);r[i]={post:a},o.add(p(n.filePath))}for(const n of s){if(n.expose?.rest!==!0)continue;const a=L(n);if(a===void 0)continue;const i=r[a.path]??{};i[a.method]=a.operation,r[a.path]=i}const c=[...o].toSorted((n,a)=>n.localeCompare(a)).map(n=>({description:`Operations declared in \`lunora/${n}\`.`,name:n}));return{components:{responses:{LunoraError:{content:{"application/json":{schema:{additionalProperties:!1,description:"Standard Lunora error envelope.",properties:{error:{additionalProperties:!1,properties:{code:{description:"Machine-readable error code. Clients switch on this value.",enum:O,type:"string"},message:{description:"Human-readable error message (never echoes internal details).",type:"string"}},required:["code","message"],type:"object"}},required:["error"],type:"object"}}},description:"A Lunora error response. The HTTP status reflects the error code (e.g. BAD_REQUEST→400, UNAUTHORIZED→401, FORBIDDEN→403, NOT_FOUND→404)."}}},info:{description:"Auto-generated from @lunora/values-typed functions by @lunora/codegen. Do not edit — run `lunora codegen` to regenerate.",title:"Lunora API",version:t},openapi:"3.1.0",paths:r,tags:c}},J=e=>`${JSON.stringify(I(e),void 0,2)}
1
+ import{G as S}from"./emit-Cly81Hl-.mjs";import{s as p}from"./paths-C-9fwEgQ.mjs";import{LUNORA_ERROR_CODES as O,objectSchema as h,validatorIrToJsonSchema as u}from"./LUNORA_ERROR_CODES-BYg8Lpgb.mjs";const E="/_lunora/rest",A=["authorization","cf-access-jwt-assertion","cookie","x-payment"],f=["x-d1-bookmark","x-lunora-shard-key"],P=e=>[...A,...(e.credentialHeaders??[]).map(t=>t.toLowerCase())],g=e=>Number.isFinite(e)?Math.max(0,Math.floor(e)):0,y=(...e)=>{const t=[];for(const r of e)for(const o of r?.split(",")??[]){const s=o.trim().toLowerCase();s!==""&&!t.includes(s)&&t.push(s)}return t.length===0?void 0:t.join(", ")},T=(e,t)=>{const r=[t,`max-age=${String(g(e.maxAge))}`];return e.staleWhileRevalidate!==void 0&&r.push(`stale-while-revalidate=${String(g(e.staleWhileRevalidate))}`),r.join(", ")},b=e=>e.scope==="public"?y(e.vary,...P(e),...f):y(e.vary,...f),x=e=>{const t=e.indexOf(":");if(!(t<=0||t>=e.length-1||e.indexOf(":",t+1)!==-1))return{name:e.slice(t+1),namespace:e.slice(0,t)}},N=e=>{const t=x(e);if(t!==void 0)return`${E}/${t.namespace}/${t.name}`},k=e=>e==="query"?"GET":"POST",m="#/components/responses/LunoraError",v=/:([A-Za-z_$][\w$]*)/gu,q=e=>[...e.matchAll(v)].map(t=>t[1]),_=e=>e.replaceAll(v,"{$1}"),l=e=>e.kind==="optional"?e.inner??e:e,j=e=>{const t=new Set(q(e.path)),r=[];for(const[o,s]of Object.entries(e.searchParams)){const c=l(s);r.push({description:`Query parameter \`${o}\``,in:"query",name:o,required:s.kind!=="optional",schema:u(c)})}for(const[o,s]of Object.entries(e.params)){const c=l(s);r.push({description:`Path parameter \`${o}\``,in:t.has(o)?"path":"query",name:o,required:t.has(o)?!0:s.kind!=="optional",schema:u(c)})}return r},$=e=>e?{content:{"application/json":{schema:u(e)}},description:"Successful response."}:{content:{"application/json":{schema:{description:"Return shape is TS-inferred (no `.output()` declared); best-effort — any JSON."}}},description:"Successful response. The return shape is TypeScript-inferred and not declared via `.output()`, so it is documented best-effort."},C=e=>{const t=p(e.filePath),r=j(e),o={description:`${e.stream?"Streaming (SSE) ":""}HTTP route handler \`${e.exportName}\` (${e.method} ${e.path}).`,operationId:`${e.method.toLowerCase()}_${p(e.path)}`,responses:{200:$(e.output),204:{description:"No content (handler returned `undefined`)."},default:{$ref:m}},summary:`${e.method} ${e.path}`,tags:[t]};return r.length>0&&(o.parameters=r),Object.keys(e.body).length>0&&(o.requestBody={content:{"application/json":{schema:h(e.body)}},required:!0}),e.stream&&(o["x-lunora-stream"]="text/event-stream"),o},w=e=>{const t=p(e.filePath),r=`${t}:${e.exportName}`,o={additionalProperties:!1,properties:{args:h(e.args),functionPath:{const:r,type:"string"},shardKey:{description:"Optional shard key; omitted routes to the default shard.",type:"string"}},required:["functionPath"],type:"object"};return{operation:{description:`Invoke the \`${e.kind}\` \`${r}\` over the Lunora RPC envelope (POST /_lunora/rpc).`,operationId:r,requestBody:{content:{"application/json":{schema:o}},required:!0},responses:{200:$(e.output),default:{$ref:m}},summary:`${e.kind}: ${r}`,tags:[t],"x-lunora-function-kind":e.kind},pathKey:`/_lunora/rpc#${r}`}},D=(e,t)=>{if(e===void 0||t!=="get"||e.scope===void 0||e.maxAge===void 0)return{};const r={maxAge:e.maxAge,scope:e.scope,...e.staleWhileRevalidate===void 0?{}:{staleWhileRevalidate:e.staleWhileRevalidate},...e.tag===void 0?{}:{tag:e.tag},...e.vary===void 0?{}:{vary:e.vary}},o={"Cache-Control":{description:r.scope==="public"?"Caching policy. `public` applies only to an uncredentialed request — a request carrying `Authorization` or `Cookie` is always answered `private`.":"Caching policy. Restricted to the caller's own cache; never stored by a shared/edge cache.",schema:{example:T(r,r.scope),type:"string"}}};r.tag!==void 0&&(o["Cache-Tag"]={description:"Purge tag for `ctx.cache.purge({ tags: [...] })`.",schema:{example:r.tag,type:"string"}});const s=b(r);return s!==void 0&&(o.Vary={description:"Request headers this response varies by. The endpoint's own negotiated headers are merged in at runtime.",schema:{example:s,type:"string"}}),{headers:o}},L=e=>{const t=p(e.filePath),r=`${t}:${e.exportName}`,o=N(r);if(o===void 0)return;const s=k(e.kind),c=s==="GET",d={description:`Public REST endpoint for the \`${e.kind}\` \`${r}\` (opt-in via \`.expose({ rest: true })\`). Routed through the procedure, so auth / RLS / validators are enforced.`,operationId:`rest_${p(o)}`,responses:{200:{content:{"application/json":{schema:{description:"Procedure result. The shape is TS-inferred from the return type; best-effort — any JSON."}}},description:"Successful result (TypeScript-inferred return shape, documented best-effort).",...D(e.expose?.cache,c?"get":"post")},default:{$ref:m}},summary:`${s} ${o}`,tags:[t],"x-lunora-function-kind":e.kind};if(c){const n=Object.entries(e.args).map(([a,i])=>{const R=l(i);return{description:`Argument \`${a}\` (JSON-encoded for non-string values).`,in:"query",name:a,required:i.kind!=="optional",schema:u(R)}});return n.length>0&&(d.parameters=n),{method:"get",operation:d,path:o}}return d.requestBody={content:{"application/json":{schema:h(e.args)}},required:Object.keys(e.args).length>0},{method:"post",operation:d,path:o}},I=e=>{const t=e.version??"0.0.0",r={},o=new Set;for(const n of e.httpRoutes){const a=_(n.path),i=r[a]??{};i[n.method.toLowerCase()]=C(n),r[a]=i,o.add(p(n.filePath))}const s=e.functions.filter(n=>n.visibility!=="internal"&&n.kind!=="stream");for(const n of s){const{operation:a,pathKey:i}=w(n);r[i]={post:a},o.add(p(n.filePath))}for(const n of s){if(n.expose?.rest!==!0)continue;const a=L(n);if(a===void 0)continue;const i=r[a.path]??{};i[a.method]=a.operation,r[a.path]=i}const c=[...o].toSorted((n,a)=>n.localeCompare(a)).map(n=>({description:`Operations declared in \`lunora/${n}\`.`,name:n}));return{components:{responses:{LunoraError:{content:{"application/json":{schema:{additionalProperties:!1,description:"Standard Lunora error envelope.",properties:{error:{additionalProperties:!1,properties:{code:{description:"Machine-readable error code. Clients switch on this value.",enum:O,type:"string"},message:{description:"Human-readable error message (never echoes internal details).",type:"string"}},required:["code","message"],type:"object"}},required:["error"],type:"object"}}},description:"A Lunora error response. The HTTP status reflects the error code (e.g. BAD_REQUEST→400, UNAUTHORIZED→401, FORBIDDEN→403, NOT_FOUND→404)."}}},info:{description:"Auto-generated from @lunora/values-typed functions by @lunora/codegen. Do not edit — run `lunora codegen` to regenerate.",title:"Lunora API",version:t},openapi:"3.1.0",paths:r,tags:c}},J=e=>`${JSON.stringify(I(e),void 0,2)}
2
2
  `,U=e=>`${S}export const openApiSpec: Record<string, unknown> = ${JSON.stringify(e,void 0,4)};
3
3
  `;export{I as buildOpenApiDocument,J as emitOpenApi,U as emitOpenApiModule};