@sailfish-ai/sf-veritas 0.2.1 → 0.2.2

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.
@@ -142,4 +142,4 @@
142
142
  gitSha: $gitSha,
143
143
  )
144
144
  }
145
- `,t=this.getVariables({serviceIdentifier:l().serviceIdentifier,serviceVersion:l().serviceVersion,serviceAdditionalMetadata:l().serviceAdditionalMetadata,gitSha:l().gitSha||""});F(this.endpoint,this.operationName,e,t)}}function Ne(){return{capture_arguments:w(process.env.SF_FUNCSPAN_CAPTURE_ARGUMENTS,!0),capture_return_value:w(process.env.SF_FUNCSPAN_CAPTURE_RETURN_VALUE,!0),arg_limit_mb:parseInt(process.env.SF_FUNCSPAN_ARG_LIMIT_MB||"1",10),return_limit_mb:parseInt(process.env.SF_FUNCSPAN_RETURN_LIMIT_MB||"1",10),autocapture_all_child_functions:w(process.env.SF_FUNCSPAN_AUTOCAPTURE_ALL_CHILD_FUNCTIONS,!1),sample_rate:parseFloat(process.env.SF_FUNCSPAN_SAMPLE_RATE||"1.0"),enable_sampling:w(process.env.SF_FUNCSPAN_ENABLE_SAMPLING,!1),capture_sf_veritas:w(process.env.SF_FUNCSPAN_CAPTURE_SF_VERITAS,!1),parse_json_strings:w(process.env.SF_FUNCSPAN_PARSE_JSON_STRINGS,!1)}}function Pe(){return{capture_arguments:!1,capture_return_value:!1,arg_limit_mb:1,return_limit_mb:1,autocapture_all_child_functions:!1,sample_rate:1,enable_sampling:!1,capture_sf_veritas:!1,parse_json_strings:!1}}function pe(o){try{const e=o.split("-");return e.length!==9?(console.error(`[FuncSpan] Invalid header format: expected 9 parts, got ${e.length}`),null):{capture_arguments:e[0]==="1",capture_return_value:e[1]==="1",arg_limit_mb:parseInt(e[2],10),return_limit_mb:parseInt(e[3],10),autocapture_all_child_functions:e[4]==="1",sample_rate:parseFloat(e[5]),enable_sampling:e[6]==="1",capture_sf_veritas:e[7]==="1",parse_json_strings:e[8]==="1"}}catch(e){return console.error(`[FuncSpan] Failed to parse header override "${o}":`,e),null}}function w(o,e){if(!o)return e;const t=o.toLowerCase();return t==="true"||t==="1"||t==="yes"}const te=new ne.AsyncLocalStorage;function he(){return te.getStore()}function E(...o){const e={};for(const t of o)for(const i in t)t[i]!==void 0&&(e[i]=t[i]);return e}function ee(o,e){try{const t=JSON.stringify(o).length/1048576;return t<=e?o:{_truncated:!0,_originalSizeMB:t.toFixed(2),_limitMB:e,_preview:JSON.stringify(o).substring(0,500)+"..."}}catch{return{_error:"Failed to serialize data",_type:typeof o}}}class Me{constructor(e=[process.cwd()],t=!1){u(this,"rootPaths");u(this,"fileConfigs",new Map);u(this,"functionConfigs",new Map);u(this,"directoryConfigs",new Map);u(this,"hasSailfishFiles",!1);u(this,"debug");this.rootPaths=e,this.debug=t||process.env.SF_DEBUG==="true"}async loadAllConfigs(){this.debug&&console.log("[FuncSpan ConfigLoader] Scanning for .sailfish files in:",this.rootPaths);const e=[];for(const t of this.rootPaths)k.existsSync(t)?await this._walkDirectory(t,e):this.debug&&console.log(`[FuncSpan ConfigLoader] Root path does not exist: ${t}`);e.length>0?(this.hasSailfishFiles=!0,this.debug&&(console.log(`[FuncSpan ConfigLoader] Found ${e.length} .sailfish files:`),e.forEach(t=>console.log(`[FuncSpan ConfigLoader] - ${t}`)))):this.debug&&console.log("[FuncSpan ConfigLoader] No .sailfish files found - function spans disabled by default");for(const t of e)await this._loadConfigFile(t);await this._resolveInheritance(),this.debug&&console.log(`[FuncSpan ConfigLoader] Loaded ${this.fileConfigs.size} file configs, ${this.functionConfigs.size} function configs`)}getConfig(e,t){const i=this.hasSailfishFiles?Ne():{capture_arguments:!1,capture_return_value:!1,arg_limit_mb:1,return_limit_mb:1,autocapture_all_child_functions:!1,sample_rate:1,enable_sampling:!1,capture_sf_veritas:!1,parse_json_strings:!1},n=this._getDirectoryConfig(e),s=v.normalize(e),a=this.fileConfigs.get(s)||{};let r={};if(t){const g=this.functionConfigs.get(s);g&&(r=g.get(t)||{})}return E(i,n,a,r)}async _walkDirectory(e,t){try{const i=k.readdirSync(e,{withFileTypes:!0});for(const n of i){const s=v.join(e,n.name);n.name==="node_modules"||n.name===".git"||n.name.startsWith(".")||(n.isDirectory()?await this._walkDirectory(s,t):n.name===".sailfish"&&t.push(s))}}catch(i){this.debug&&console.error(`[FuncSpan ConfigLoader] Error walking directory ${e}:`,i)}}async _loadConfigFile(e){try{const t=k.readFileSync(e,"utf-8"),i=v.dirname(e);let n=null;try{n=JSON.parse(t)}catch{try{n=require("js-yaml").load(t)}catch(s){return void(this.debug&&console.error(`[FuncSpan ConfigLoader] Failed to parse ${e} as JSON or YAML:`,s))}}if(!n)return;n.default&&this.directoryConfigs.set(i,n.default),n.files&&await this._expandFileGlobs(i,n.files,n.default||{}),n.functions&&this._storeFunctionConfigs(i,n.functions,n.default||{}),this.debug&&(console.log(`[FuncSpan ConfigLoader] Loaded config from ${e}`),console.log(`[FuncSpan ConfigLoader] Directory: ${i}`),console.log(`[FuncSpan ConfigLoader] Has default: ${!!n.default}`),console.log(`[FuncSpan ConfigLoader] File patterns: ${Object.keys(n.files||{}).length}`),console.log(`[FuncSpan ConfigLoader] Functions: ${Object.keys(n.functions||{}).length}`))}catch(t){this.debug&&console.error(`[FuncSpan ConfigLoader] Error loading ${e}:`,t)}}async _expandFileGlobs(e,t,i){for(const[n,s]of Object.entries(t))try{const a=v.join(e,n),r=await He.glob(a,{absolute:!0,nodir:!0,ignore:["**/node_modules/**","**/.git/**"]});this.debug&&console.log(`[FuncSpan ConfigLoader] Pattern '${n}' matched ${r.length} files`);for(const g of r){const c=v.normalize(g),I=E(i,s);this.fileConfigs.set(c,I),this.debug&&r.length<=5&&console.log(`[FuncSpan ConfigLoader] - ${g}`)}}catch(a){this.debug&&console.error(`[FuncSpan ConfigLoader] Error expanding glob '${n}':`,a)}}_storeFunctionConfigs(e,t,i){for(const[n,s]of Object.entries(t)){const a=n.split("::");if(a.length!==2){this.debug&&console.warn(`[FuncSpan ConfigLoader] Invalid function pattern '${n}' (expected format: 'file.ts::functionName')`);continue}const[r,g]=a,c=v.normalize(v.join(e,r));this.functionConfigs.has(c)||this.functionConfigs.set(c,new Map);const I=this.functionConfigs.get(c),d=E(i,s);I.set(g,d),this.debug&&console.log(`[FuncSpan ConfigLoader] Function config: ${c}::${g}`)}}async _resolveInheritance(){}_getDirectoryConfig(e){let t=v.dirname(v.normalize(e));const i=[];for(;t&&t!==v.dirname(t);){const n=this.directoryConfigs.get(t);n&&i.unshift(n),t=v.dirname(t)}return i.reduce((n,s)=>E(n,s),{})}}let J=null;async function Ae(o,e){J=new Me(o,e),await J.loadAllConfigs()}function be(o,e){return J?J.getConfig(o,e):{capture_arguments:!1,capture_return_value:!1,arg_limit_mb:1,return_limit_mb:1,autocapture_all_child_functions:!1,sample_rate:1,enable_sampling:!1,capture_sf_veritas:!1,parse_json_strings:!1}}function me(){return J!==null}function D(o){process.env.SF_VERITAS_DEBUG==="true"&&console.log("[FuncSpan Capture]",{function:o.functionName,file:o.filePath,duration:`${o.duration}ms`,async:o.async,error:o.error}),ve(()=>{})}exports.ContextManager=G,exports.addOrUpdateMetadata=function(o,e={},t,i=!1){const n=l();new ge(n.apiKey).addOrUpdateMetadata(o,e,t,i)},exports.captureFunctionSpan=function(o,e,t,i){const n=function(...s){const a=(function(C,p){const h=he();if(h){const A=pe(h);if(A)return process.env.SF_DEBUG==="true"&&console.log(`[FuncSpan] Using HTTP header override for ${C}::${p}`),A}return be(C,p)})(t,e);if(a.enable_sampling&&a.sample_rate<1&&Math.random()>a.sample_rate)return o.apply(this,s);if(a.sample_rate===0)return o.apply(this,s);const r=G.getInstance(),g=r.getCurrentFunctionSpanId(),c=H();r.setCurrentFunctionSpanId(c);const I=Date.now();let d=null;a.capture_arguments&&(d={},i.paramNames.forEach((C,p)=>{p<s.length&&(d[C]=s[p])}),d&&a.arg_limit_mb>0&&(d=ee(d,a.arg_limit_mb)));try{const C=o.apply(this,s);if(C&&typeof C.then=="function")return C.then(A=>{const m=Date.now();let Z=null;return a.capture_return_value&&a.return_limit_mb>0&&(Z=ee(A,a.return_limit_mb)),D({functionName:e,filePath:t,metadata:i,args:d,result:Z,error:null,duration:m-I,async:!0,spanId:c}),g?r.setCurrentFunctionSpanId(g):r.clearCurrentFunctionSpanId(),A},A=>{const m=Date.now();throw D({functionName:e,filePath:t,metadata:i,args:d,result:null,error:A?.message||String(A),duration:m-I,async:!0,spanId:c}),g?r.setCurrentFunctionSpanId(g):r.clearCurrentFunctionSpanId(),A});const p=Date.now();let h=null;return a.capture_return_value&&a.return_limit_mb>0&&(h=ee(C,a.return_limit_mb)),D({functionName:e,filePath:t,metadata:i,args:d,result:h,error:null,duration:p-I,async:!1,spanId:c}),g?r.setCurrentFunctionSpanId(g):r.clearCurrentFunctionSpanId(),C}catch(C){const p=Date.now();throw D({functionName:e,filePath:t,error:C?.message||String(C),duration:p-I,async:!1}),g?r.setCurrentFunctionSpanId(g):r.clearCurrentFunctionSpanId(),C}};Object.defineProperty(n,"name",{value:e,writable:!1});for(const s in o)o.hasOwnProperty(s)&&(n[s]=o[s]);return n},exports.clearFuncspanOverride=function(){te.enterWith(void 0)},exports.getCurrentFunctionSpanId=L,exports.getDefaultConfig=Pe,exports.getEnvConfig=Ne,exports.getFuncspanOverride=he,exports.getGlobalConfig=be,exports.identify=function(o,e,t,i=!1){const n=l();new ge(n.apiKey).identify(o,e,t,i)},exports.initializeConfigLoader=Ae,exports.isConfigLoaderInitialized=me,exports.parseHeaderOverride=pe,exports.runWithContext=ve,exports.setFuncspanOverride=function(o){te.enterWith(o)},exports.setupInterceptors=function(o){if(!o||!o.apiKey){const n=`The required API Key is not provided: ${JSON.stringify(o)}`;console.error(n)}const{config:e}=Ke(o);if(e.sfDebug&&console.log("Updated configuration after applying options:",e),!e.apiKey||!e.apiGraphqlEndpoint){const n=`The required config is not provided: ${JSON.stringify(e)}`;throw console.error(n),new Error(n)}me()||Ae(void 0,e.sfDebug).catch(n=>{e.sfDebug&&console.error("[FuncSpan] Failed to initialize config loader:",n)});const t=new oe;t.setServiceUUID(e.serviceUUID),(function(n){function s(d,C){n.setOperationName("CollectLogs"),n.doSend([C,d])}const a=console.log.bind(console),r=console.error.bind(console),g=console.warn.bind(console),c=console.info.bind(console),I=console.debug.bind(console);console.log=(...d)=>{s("INFO",d.join(" ")),a(...d)},console.error=(...d)=>{s("ERROR",d.join(" ")),r(...d)},console.warn=(...d)=>{s("WARN",d.join(" ")),g(...d)},console.info=(...d)=>{s("INFO",d.join(" ")),c(...d)},l().logLevel==="DEBUG"&&(console.debug=(...d)=>{s("DEBUG",d.join(" ")),I(...d)})})(t),(function(n=[]){const s=new ke(n);new ze().doSend(s.getExcludedDomains());const a=new xe,r=new $e;s.patchFetch(a,r),s.patchHttp(a,r)})(e.domainsToNotPropagateHeadersTo);const i=new De;i.setServiceUUID(e.serviceUUID),Te(i),Le(),new Oe().send()};
145
+ `,t=this.getVariables({serviceIdentifier:l().serviceIdentifier,serviceVersion:l().serviceVersion,serviceAdditionalMetadata:l().serviceAdditionalMetadata,gitSha:l().gitSha||""});F(this.endpoint,this.operationName,e,t)}}function Ne(){return{capture_arguments:w(process.env.SF_FUNCSPAN_CAPTURE_ARGUMENTS,!0),capture_return_value:w(process.env.SF_FUNCSPAN_CAPTURE_RETURN_VALUE,!0),arg_limit_mb:parseInt(process.env.SF_FUNCSPAN_ARG_LIMIT_MB||"1",10),return_limit_mb:parseInt(process.env.SF_FUNCSPAN_RETURN_LIMIT_MB||"1",10),autocapture_all_child_functions:w(process.env.SF_FUNCSPAN_AUTOCAPTURE_ALL_CHILD_FUNCTIONS,!1),sample_rate:parseFloat(process.env.SF_FUNCSPAN_SAMPLE_RATE||"1.0"),enable_sampling:w(process.env.SF_FUNCSPAN_ENABLE_SAMPLING,!1),capture_sf_veritas:w(process.env.SF_FUNCSPAN_CAPTURE_SF_VERITAS,!1),parse_json_strings:w(process.env.SF_FUNCSPAN_PARSE_JSON_STRINGS,!1)}}function Pe(){return{capture_arguments:!1,capture_return_value:!1,arg_limit_mb:1,return_limit_mb:1,autocapture_all_child_functions:!1,sample_rate:0,enable_sampling:!1,capture_sf_veritas:!1,parse_json_strings:!1}}function pe(o){try{const e=o.split("-");return e.length!==9?(console.error(`[FuncSpan] Invalid header format: expected 9 parts, got ${e.length}`),null):{capture_arguments:e[0]==="1",capture_return_value:e[1]==="1",arg_limit_mb:parseInt(e[2],10),return_limit_mb:parseInt(e[3],10),autocapture_all_child_functions:e[4]==="1",sample_rate:parseFloat(e[5]),enable_sampling:e[6]==="1",capture_sf_veritas:e[7]==="1",parse_json_strings:e[8]==="1"}}catch(e){return console.error(`[FuncSpan] Failed to parse header override "${o}":`,e),null}}function w(o,e){if(!o)return e;const t=o.toLowerCase();return t==="true"||t==="1"||t==="yes"}const te=new ne.AsyncLocalStorage;function he(){return te.getStore()}function E(...o){const e={};for(const t of o)for(const i in t)t[i]!==void 0&&(e[i]=t[i]);return e}function ee(o,e){try{const t=JSON.stringify(o).length/1048576;return t<=e?o:{_truncated:!0,_originalSizeMB:t.toFixed(2),_limitMB:e,_preview:JSON.stringify(o).substring(0,500)+"..."}}catch{return{_error:"Failed to serialize data",_type:typeof o}}}class Me{constructor(e=[process.cwd()],t=!1){u(this,"rootPaths");u(this,"fileConfigs",new Map);u(this,"functionConfigs",new Map);u(this,"directoryConfigs",new Map);u(this,"hasSailfishFiles",!1);u(this,"debug");this.rootPaths=e,this.debug=t||process.env.SF_DEBUG==="true"}async loadAllConfigs(){this.debug&&console.log("[FuncSpan ConfigLoader] Scanning for .sailfish files in:",this.rootPaths);const e=[];for(const t of this.rootPaths)k.existsSync(t)?await this._walkDirectory(t,e):this.debug&&console.log(`[FuncSpan ConfigLoader] Root path does not exist: ${t}`);e.length>0?(this.hasSailfishFiles=!0,this.debug&&(console.log(`[FuncSpan ConfigLoader] Found ${e.length} .sailfish files:`),e.forEach(t=>console.log(`[FuncSpan ConfigLoader] - ${t}`)))):this.debug&&console.log("[FuncSpan ConfigLoader] No .sailfish files found - function spans disabled by default");for(const t of e)await this._loadConfigFile(t);await this._resolveInheritance(),this.debug&&console.log(`[FuncSpan ConfigLoader] Loaded ${this.fileConfigs.size} file configs, ${this.functionConfigs.size} function configs`)}getConfig(e,t){const i=this.hasSailfishFiles?Ne():{capture_arguments:!1,capture_return_value:!1,arg_limit_mb:1,return_limit_mb:1,autocapture_all_child_functions:!1,sample_rate:0,enable_sampling:!1,capture_sf_veritas:!1,parse_json_strings:!1},n=this._getDirectoryConfig(e),s=v.normalize(e),a=this.fileConfigs.get(s)||{};let r={};if(t){const g=this.functionConfigs.get(s);g&&(r=g.get(t)||{})}return E(i,n,a,r)}async _walkDirectory(e,t){try{const i=k.readdirSync(e,{withFileTypes:!0});for(const n of i){const s=v.join(e,n.name);n.name==="node_modules"||n.name===".git"||n.name.startsWith(".")||(n.isDirectory()?await this._walkDirectory(s,t):n.name===".sailfish"&&t.push(s))}}catch(i){this.debug&&console.error(`[FuncSpan ConfigLoader] Error walking directory ${e}:`,i)}}async _loadConfigFile(e){try{const t=k.readFileSync(e,"utf-8"),i=v.dirname(e);let n=null;try{n=JSON.parse(t)}catch{try{n=require("js-yaml").load(t)}catch(s){return void(this.debug&&console.error(`[FuncSpan ConfigLoader] Failed to parse ${e} as JSON or YAML:`,s))}}if(!n)return;n.default&&this.directoryConfigs.set(i,n.default),n.files&&await this._expandFileGlobs(i,n.files,n.default||{}),n.functions&&this._storeFunctionConfigs(i,n.functions,n.default||{}),this.debug&&(console.log(`[FuncSpan ConfigLoader] Loaded config from ${e}`),console.log(`[FuncSpan ConfigLoader] Directory: ${i}`),console.log(`[FuncSpan ConfigLoader] Has default: ${!!n.default}`),console.log(`[FuncSpan ConfigLoader] File patterns: ${Object.keys(n.files||{}).length}`),console.log(`[FuncSpan ConfigLoader] Functions: ${Object.keys(n.functions||{}).length}`))}catch(t){this.debug&&console.error(`[FuncSpan ConfigLoader] Error loading ${e}:`,t)}}async _expandFileGlobs(e,t,i){for(const[n,s]of Object.entries(t))try{const a=v.join(e,n),r=await He.glob(a,{absolute:!0,nodir:!0,ignore:["**/node_modules/**","**/.git/**"]});this.debug&&console.log(`[FuncSpan ConfigLoader] Pattern '${n}' matched ${r.length} files`);for(const g of r){const c=v.normalize(g),I=E(i,s);this.fileConfigs.set(c,I),this.debug&&r.length<=5&&console.log(`[FuncSpan ConfigLoader] - ${g}`)}}catch(a){this.debug&&console.error(`[FuncSpan ConfigLoader] Error expanding glob '${n}':`,a)}}_storeFunctionConfigs(e,t,i){for(const[n,s]of Object.entries(t)){const a=n.split("::");if(a.length!==2){this.debug&&console.warn(`[FuncSpan ConfigLoader] Invalid function pattern '${n}' (expected format: 'file.ts::functionName')`);continue}const[r,g]=a,c=v.normalize(v.join(e,r));this.functionConfigs.has(c)||this.functionConfigs.set(c,new Map);const I=this.functionConfigs.get(c),d=E(i,s);I.set(g,d),this.debug&&console.log(`[FuncSpan ConfigLoader] Function config: ${c}::${g}`)}}async _resolveInheritance(){}_getDirectoryConfig(e){let t=v.dirname(v.normalize(e));const i=[];for(;t&&t!==v.dirname(t);){const n=this.directoryConfigs.get(t);n&&i.unshift(n),t=v.dirname(t)}return i.reduce((n,s)=>E(n,s),{})}}let J=null;async function Ae(o,e){J=new Me(o,e),await J.loadAllConfigs()}function be(o,e){return J?J.getConfig(o,e):{capture_arguments:!1,capture_return_value:!1,arg_limit_mb:1,return_limit_mb:1,autocapture_all_child_functions:!1,sample_rate:0,enable_sampling:!1,capture_sf_veritas:!1,parse_json_strings:!1}}function me(){return J!==null}function D(o){process.env.SF_VERITAS_DEBUG==="true"&&console.log("[FuncSpan Capture]",{function:o.functionName,file:o.filePath,duration:`${o.duration}ms`,async:o.async,error:o.error}),ve(()=>{})}exports.ContextManager=G,exports.addOrUpdateMetadata=function(o,e={},t,i=!1){const n=l();new ge(n.apiKey).addOrUpdateMetadata(o,e,t,i)},exports.captureFunctionSpan=function(o,e,t,i){const n=function(...s){const a=(function(C,p){const h=he();if(h){const A=pe(h);if(A)return process.env.SF_DEBUG==="true"&&console.log(`[FuncSpan] Using HTTP header override for ${C}::${p}`),A}return be(C,p)})(t,e);if(a.enable_sampling&&a.sample_rate<1&&Math.random()>a.sample_rate)return o.apply(this,s);if(a.sample_rate===0)return o.apply(this,s);const r=G.getInstance(),g=r.getCurrentFunctionSpanId(),c=H();r.setCurrentFunctionSpanId(c);const I=Date.now();let d=null;a.capture_arguments&&(d={},i.paramNames.forEach((C,p)=>{p<s.length&&(d[C]=s[p])}),d&&a.arg_limit_mb>0&&(d=ee(d,a.arg_limit_mb)));try{const C=o.apply(this,s);if(C&&typeof C.then=="function")return C.then(A=>{const m=Date.now();let Z=null;return a.capture_return_value&&a.return_limit_mb>0&&(Z=ee(A,a.return_limit_mb)),D({functionName:e,filePath:t,metadata:i,args:d,result:Z,error:null,duration:m-I,async:!0,spanId:c}),g?r.setCurrentFunctionSpanId(g):r.clearCurrentFunctionSpanId(),A},A=>{const m=Date.now();throw D({functionName:e,filePath:t,metadata:i,args:d,result:null,error:A?.message||String(A),duration:m-I,async:!0,spanId:c}),g?r.setCurrentFunctionSpanId(g):r.clearCurrentFunctionSpanId(),A});const p=Date.now();let h=null;return a.capture_return_value&&a.return_limit_mb>0&&(h=ee(C,a.return_limit_mb)),D({functionName:e,filePath:t,metadata:i,args:d,result:h,error:null,duration:p-I,async:!1,spanId:c}),g?r.setCurrentFunctionSpanId(g):r.clearCurrentFunctionSpanId(),C}catch(C){const p=Date.now();throw D({functionName:e,filePath:t,error:C?.message||String(C),duration:p-I,async:!1}),g?r.setCurrentFunctionSpanId(g):r.clearCurrentFunctionSpanId(),C}};Object.defineProperty(n,"name",{value:e,writable:!1});for(const s in o)o.hasOwnProperty(s)&&(n[s]=o[s]);return n},exports.clearFuncspanOverride=function(){te.enterWith(void 0)},exports.getCurrentFunctionSpanId=L,exports.getDefaultConfig=Pe,exports.getEnvConfig=Ne,exports.getFuncspanOverride=he,exports.getGlobalConfig=be,exports.identify=function(o,e,t,i=!1){const n=l();new ge(n.apiKey).identify(o,e,t,i)},exports.initializeConfigLoader=Ae,exports.isConfigLoaderInitialized=me,exports.parseHeaderOverride=pe,exports.runWithContext=ve,exports.setFuncspanOverride=function(o){te.enterWith(o)},exports.setupInterceptors=function(o){if(!o||!o.apiKey){const n=`The required API Key is not provided: ${JSON.stringify(o)}`;console.error(n)}const{config:e}=Ke(o);if(e.sfDebug&&console.log("Updated configuration after applying options:",e),!e.apiKey||!e.apiGraphqlEndpoint){const n=`The required config is not provided: ${JSON.stringify(e)}`;throw console.error(n),new Error(n)}me()||Ae(void 0,e.sfDebug).catch(n=>{e.sfDebug&&console.error("[FuncSpan] Failed to initialize config loader:",n)});const t=new oe;t.setServiceUUID(e.serviceUUID),(function(n){function s(d,C){n.setOperationName("CollectLogs"),n.doSend([C,d])}const a=console.log.bind(console),r=console.error.bind(console),g=console.warn.bind(console),c=console.info.bind(console),I=console.debug.bind(console);console.log=(...d)=>{s("INFO",d.join(" ")),a(...d)},console.error=(...d)=>{s("ERROR",d.join(" ")),r(...d)},console.warn=(...d)=>{s("WARN",d.join(" ")),g(...d)},console.info=(...d)=>{s("INFO",d.join(" ")),c(...d)},l().logLevel==="DEBUG"&&(console.debug=(...d)=>{s("DEBUG",d.join(" ")),I(...d)})})(t),(function(n=[]){const s=new ke(n);new ze().doSend(s.getExcludedDomains());const a=new xe,r=new $e;s.patchFetch(a,r),s.patchHttp(a,r)})(e.domainsToNotPropagateHeadersTo);const i=new De;i.setServiceUUID(e.serviceUUID),Te(i),Le(),new Oe().send()};
@@ -987,7 +987,7 @@ function Ee() {
987
987
  return { capture_arguments: w(process.env.SF_FUNCSPAN_CAPTURE_ARGUMENTS, !0), capture_return_value: w(process.env.SF_FUNCSPAN_CAPTURE_RETURN_VALUE, !0), arg_limit_mb: parseInt(process.env.SF_FUNCSPAN_ARG_LIMIT_MB || "1", 10), return_limit_mb: parseInt(process.env.SF_FUNCSPAN_RETURN_LIMIT_MB || "1", 10), autocapture_all_child_functions: w(process.env.SF_FUNCSPAN_AUTOCAPTURE_ALL_CHILD_FUNCTIONS, !1), sample_rate: parseFloat(process.env.SF_FUNCSPAN_SAMPLE_RATE || "1.0"), enable_sampling: w(process.env.SF_FUNCSPAN_ENABLE_SAMPLING, !1), capture_sf_veritas: w(process.env.SF_FUNCSPAN_CAPTURE_SF_VERITAS, !1), parse_json_strings: w(process.env.SF_FUNCSPAN_PARSE_JSON_STRINGS, !1) };
988
988
  }
989
989
  function et() {
990
- return { capture_arguments: !1, capture_return_value: !1, arg_limit_mb: 1, return_limit_mb: 1, autocapture_all_child_functions: !1, sample_rate: 1, enable_sampling: !1, capture_sf_veritas: !1, parse_json_strings: !1 };
990
+ return { capture_arguments: !1, capture_return_value: !1, arg_limit_mb: 1, return_limit_mb: 1, autocapture_all_child_functions: !1, sample_rate: 0, enable_sampling: !1, capture_sf_veritas: !1, parse_json_strings: !1 };
991
991
  }
992
992
  function De(s) {
993
993
  try {
@@ -1044,7 +1044,7 @@ class ze {
1044
1044
  await this._resolveInheritance(), this.debug && console.log(`[FuncSpan ConfigLoader] Loaded ${this.fileConfigs.size} file configs, ${this.functionConfigs.size} function configs`);
1045
1045
  }
1046
1046
  getConfig(e, t) {
1047
- const i = this.hasSailfishFiles ? Ee() : { capture_arguments: !1, capture_return_value: !1, arg_limit_mb: 1, return_limit_mb: 1, autocapture_all_child_functions: !1, sample_rate: 1, enable_sampling: !1, capture_sf_veritas: !1, parse_json_strings: !1 }, n = this._getDirectoryConfig(e), o = v.normalize(e), a = this.fileConfigs.get(o) || {};
1047
+ const i = this.hasSailfishFiles ? Ee() : { capture_arguments: !1, capture_return_value: !1, arg_limit_mb: 1, return_limit_mb: 1, autocapture_all_child_functions: !1, sample_rate: 0, enable_sampling: !1, capture_sf_veritas: !1, parse_json_strings: !1 }, n = this._getDirectoryConfig(e), o = v.normalize(e), a = this.fileConfigs.get(o) || {};
1048
1048
  let r = {};
1049
1049
  if (t) {
1050
1050
  const g = this.functionConfigs.get(o);
@@ -1124,7 +1124,7 @@ async function xe(s, e) {
1124
1124
  J = new ze(s, e), await J.loadAllConfigs();
1125
1125
  }
1126
1126
  function $e(s, e) {
1127
- return J ? J.getConfig(s, e) : { capture_arguments: !1, capture_return_value: !1, arg_limit_mb: 1, return_limit_mb: 1, autocapture_all_child_functions: !1, sample_rate: 1, enable_sampling: !1, capture_sf_veritas: !1, parse_json_strings: !1 };
1127
+ return J ? J.getConfig(s, e) : { capture_arguments: !1, capture_return_value: !1, arg_limit_mb: 1, return_limit_mb: 1, autocapture_all_child_functions: !1, sample_rate: 0, enable_sampling: !1, capture_sf_veritas: !1, parse_json_strings: !1 };
1128
1128
  }
1129
1129
  function ke() {
1130
1130
  return J !== null;
@@ -46,6 +46,9 @@ export interface FuncspanHeaderOverride extends FuncspanConfig {
46
46
  export declare function getEnvConfig(): FuncspanConfig;
47
47
  /**
48
48
  * Default configuration (used when no .sailfish files exist)
49
+ *
50
+ * Sets sample_rate to 0.0 to completely disable capture when no .sailfish files are present.
51
+ * This makes function span capture opt-in: you must create a .sailfish file to enable it.
49
52
  */
50
53
  export declare function getDefaultConfig(): FuncspanConfig;
51
54
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sailfish-ai/sf-veritas",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "publishPublicly": true,
5
5
  "description": "A versatile Edge Runtime-compatible package for JavaScript and TypeScript backend systems and scripts.",
6
6
  "main": "./dist/sf-veritas.cjs",