@humain/terminal 0.2.2 → 0.3.0

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.
Files changed (156) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/bundle/chunks/{chunk-NMPIM7MN.js → chunk-CBTAWCW5.js} +1 -1
  3. package/dist/bundle/chunks/{chunk-D6HHRSB5.js → chunk-S43N4JYF.js} +14 -29
  4. package/dist/bundle/chunks/{chunk-ADQYVZ6A.js → chunk-WKLAQTQ4.js} +104 -128
  5. package/dist/bundle/chunks/{compat-CN7WN6DA.js → compat-L5WILLPV.js} +1 -1
  6. package/dist/bundle/chunks/{extract-CTIFQZDJ.js → extract-2YP6VMY4.js} +3 -3
  7. package/dist/bundle/cli.js +1 -1
  8. package/dist/bundle/index.js +1 -1
  9. package/dist/bundle/rpc-entry.js +1 -1
  10. package/dist/core/tools/subagent.d.ts +2 -0
  11. package/dist/core/tools/subagent.d.ts.map +1 -1
  12. package/dist/core/tools/subagent.js +46 -16
  13. package/dist/core/tools/subagent.js.map +1 -1
  14. package/dist/humain/web-access/vendor/anysearch.d.ts.map +1 -1
  15. package/dist/humain/web-access/vendor/anysearch.js +4 -14
  16. package/dist/humain/web-access/vendor/anysearch.js.map +1 -1
  17. package/dist/humain/web-access/vendor/bocha.d.ts.map +1 -1
  18. package/dist/humain/web-access/vendor/bocha.js +3 -24
  19. package/dist/humain/web-access/vendor/bocha.js.map +1 -1
  20. package/dist/humain/web-access/vendor/brave.d.ts.map +1 -1
  21. package/dist/humain/web-access/vendor/brave.js +3 -24
  22. package/dist/humain/web-access/vendor/brave.js.map +1 -1
  23. package/dist/humain/web-access/vendor/brightdata.d.ts.map +1 -1
  24. package/dist/humain/web-access/vendor/brightdata.js +5 -34
  25. package/dist/humain/web-access/vendor/brightdata.js.map +1 -1
  26. package/dist/humain/web-access/vendor/content-find.d.ts.map +1 -1
  27. package/dist/humain/web-access/vendor/content-find.js +186 -51
  28. package/dist/humain/web-access/vendor/content-find.js.map +1 -1
  29. package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -1
  30. package/dist/humain/web-access/vendor/curator-page.js +4 -1
  31. package/dist/humain/web-access/vendor/curator-page.js.map +1 -1
  32. package/dist/humain/web-access/vendor/curator-run.d.ts.map +1 -1
  33. package/dist/humain/web-access/vendor/curator-run.js +3 -1
  34. package/dist/humain/web-access/vendor/curator-run.js.map +1 -1
  35. package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -1
  36. package/dist/humain/web-access/vendor/curator-server.js +2 -0
  37. package/dist/humain/web-access/vendor/curator-server.js.map +1 -1
  38. package/dist/humain/web-access/vendor/domain-filter-normalization.d.ts +2 -0
  39. package/dist/humain/web-access/vendor/domain-filter-normalization.d.ts.map +1 -0
  40. package/dist/humain/web-access/vendor/domain-filter-normalization.js +19 -0
  41. package/dist/humain/web-access/vendor/domain-filter-normalization.js.map +1 -0
  42. package/dist/humain/web-access/vendor/duckduckgo.d.ts.map +1 -1
  43. package/dist/humain/web-access/vendor/duckduckgo.js +3 -24
  44. package/dist/humain/web-access/vendor/duckduckgo.js.map +1 -1
  45. package/dist/humain/web-access/vendor/extract.d.ts.map +1 -1
  46. package/dist/humain/web-access/vendor/extract.js +3 -1
  47. package/dist/humain/web-access/vendor/extract.js.map +1 -1
  48. package/dist/humain/web-access/vendor/firecrawl.d.ts.map +1 -1
  49. package/dist/humain/web-access/vendor/firecrawl.js +5 -32
  50. package/dist/humain/web-access/vendor/firecrawl.js.map +1 -1
  51. package/dist/humain/web-access/vendor/gemini-search.d.ts +5 -2
  52. package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -1
  53. package/dist/humain/web-access/vendor/gemini-search.js +85 -37
  54. package/dist/humain/web-access/vendor/gemini-search.js.map +1 -1
  55. package/dist/humain/web-access/vendor/index.d.ts +3 -3
  56. package/dist/humain/web-access/vendor/index.d.ts.map +1 -1
  57. package/dist/humain/web-access/vendor/index.js +135 -157
  58. package/dist/humain/web-access/vendor/index.js.map +1 -1
  59. package/dist/humain/web-access/vendor/jina-search.d.ts.map +1 -1
  60. package/dist/humain/web-access/vendor/jina-search.js +4 -14
  61. package/dist/humain/web-access/vendor/jina-search.js.map +1 -1
  62. package/dist/humain/web-access/vendor/kagi.d.ts.map +1 -1
  63. package/dist/humain/web-access/vendor/kagi.js +4 -12
  64. package/dist/humain/web-access/vendor/kagi.js.map +1 -1
  65. package/dist/humain/web-access/vendor/kimi-search.d.ts.map +1 -1
  66. package/dist/humain/web-access/vendor/kimi-search.js +5 -32
  67. package/dist/humain/web-access/vendor/kimi-search.js.map +1 -1
  68. package/dist/humain/web-access/vendor/mistral-search.d.ts.map +1 -1
  69. package/dist/humain/web-access/vendor/mistral-search.js +1 -18
  70. package/dist/humain/web-access/vendor/mistral-search.js.map +1 -1
  71. package/dist/humain/web-access/vendor/ollama.d.ts.map +1 -1
  72. package/dist/humain/web-access/vendor/ollama.js +2 -6
  73. package/dist/humain/web-access/vendor/ollama.js.map +1 -1
  74. package/dist/humain/web-access/vendor/openai-search.d.ts +3 -0
  75. package/dist/humain/web-access/vendor/openai-search.d.ts.map +1 -1
  76. package/dist/humain/web-access/vendor/openai-search.js +181 -38
  77. package/dist/humain/web-access/vendor/openai-search.js.map +1 -1
  78. package/dist/humain/web-access/vendor/opencode-session-headers.d.ts +10 -0
  79. package/dist/humain/web-access/vendor/opencode-session-headers.d.ts.map +1 -0
  80. package/dist/humain/web-access/vendor/opencode-session-headers.js +23 -0
  81. package/dist/humain/web-access/vendor/opencode-session-headers.js.map +1 -0
  82. package/dist/humain/web-access/vendor/page-query.d.ts.map +1 -1
  83. package/dist/humain/web-access/vendor/page-query.js +10 -2
  84. package/dist/humain/web-access/vendor/page-query.js.map +1 -1
  85. package/dist/humain/web-access/vendor/parallel.d.ts.map +1 -1
  86. package/dist/humain/web-access/vendor/parallel.js +1 -18
  87. package/dist/humain/web-access/vendor/parallel.js.map +1 -1
  88. package/dist/humain/web-access/vendor/pdf-extract.d.ts +2 -0
  89. package/dist/humain/web-access/vendor/pdf-extract.d.ts.map +1 -1
  90. package/dist/humain/web-access/vendor/pdf-extract.js +1 -0
  91. package/dist/humain/web-access/vendor/pdf-extract.js.map +1 -1
  92. package/dist/humain/web-access/vendor/querit.d.ts.map +1 -1
  93. package/dist/humain/web-access/vendor/querit.js +5 -32
  94. package/dist/humain/web-access/vendor/querit.js.map +1 -1
  95. package/dist/humain/web-access/vendor/search-answer-formatting.d.ts +8 -0
  96. package/dist/humain/web-access/vendor/search-answer-formatting.d.ts.map +1 -0
  97. package/dist/humain/web-access/vendor/search-answer-formatting.js +6 -0
  98. package/dist/humain/web-access/vendor/search-answer-formatting.js.map +1 -0
  99. package/dist/humain/web-access/vendor/search-result-count-normalization.d.ts +2 -0
  100. package/dist/humain/web-access/vendor/search-result-count-normalization.d.ts.map +1 -0
  101. package/dist/humain/web-access/vendor/search-result-count-normalization.js +6 -0
  102. package/dist/humain/web-access/vendor/search-result-count-normalization.js.map +1 -0
  103. package/dist/humain/web-access/vendor/search1api.d.ts.map +1 -1
  104. package/dist/humain/web-access/vendor/search1api.js +5 -32
  105. package/dist/humain/web-access/vendor/search1api.js.map +1 -1
  106. package/dist/humain/web-access/vendor/searchinfinity.d.ts.map +1 -1
  107. package/dist/humain/web-access/vendor/searchinfinity.js +5 -32
  108. package/dist/humain/web-access/vendor/searchinfinity.js.map +1 -1
  109. package/dist/humain/web-access/vendor/searxng.d.ts.map +1 -1
  110. package/dist/humain/web-access/vendor/searxng.js +3 -24
  111. package/dist/humain/web-access/vendor/searxng.js.map +1 -1
  112. package/dist/humain/web-access/vendor/serpapi.d.ts.map +1 -1
  113. package/dist/humain/web-access/vendor/serpapi.js +5 -30
  114. package/dist/humain/web-access/vendor/serpapi.js.map +1 -1
  115. package/dist/humain/web-access/vendor/serpbase.d.ts.map +1 -1
  116. package/dist/humain/web-access/vendor/serpbase.js +3 -24
  117. package/dist/humain/web-access/vendor/serpbase.js.map +1 -1
  118. package/dist/humain/web-access/vendor/serpdive.d.ts.map +1 -1
  119. package/dist/humain/web-access/vendor/serpdive.js +3 -24
  120. package/dist/humain/web-access/vendor/serpdive.js.map +1 -1
  121. package/dist/humain/web-access/vendor/serper.d.ts.map +1 -1
  122. package/dist/humain/web-access/vendor/serper.js +5 -30
  123. package/dist/humain/web-access/vendor/serper.js.map +1 -1
  124. package/dist/humain/web-access/vendor/serply.d.ts +4 -0
  125. package/dist/humain/web-access/vendor/serply.d.ts.map +1 -0
  126. package/dist/humain/web-access/vendor/serply.js +191 -0
  127. package/dist/humain/web-access/vendor/serply.js.map +1 -0
  128. package/dist/humain/web-access/vendor/source-check.d.ts.map +1 -1
  129. package/dist/humain/web-access/vendor/source-check.js +11 -47
  130. package/dist/humain/web-access/vendor/source-check.js.map +1 -1
  131. package/dist/humain/web-access/vendor/summary-review.d.ts +1 -1
  132. package/dist/humain/web-access/vendor/summary-review.d.ts.map +1 -1
  133. package/dist/humain/web-access/vendor/summary-review.js +6 -2
  134. package/dist/humain/web-access/vendor/summary-review.js.map +1 -1
  135. package/dist/humain/web-access/vendor/tavily.d.ts.map +1 -1
  136. package/dist/humain/web-access/vendor/tavily.js +3 -24
  137. package/dist/humain/web-access/vendor/tavily.js.map +1 -1
  138. package/dist/humain/web-access/vendor/tinyfish.d.ts.map +1 -1
  139. package/dist/humain/web-access/vendor/tinyfish.js +5 -32
  140. package/dist/humain/web-access/vendor/tinyfish.js.map +1 -1
  141. package/dist/humain/web-access/vendor/utils.d.ts.map +1 -1
  142. package/dist/humain/web-access/vendor/utils.js +2 -0
  143. package/dist/humain/web-access/vendor/utils.js.map +1 -1
  144. package/dist/humain/web-access/vendor/valyu.d.ts.map +1 -1
  145. package/dist/humain/web-access/vendor/valyu.js +5 -30
  146. package/dist/humain/web-access/vendor/valyu.js.map +1 -1
  147. package/dist/humain/web-access/vendor/xai-search.d.ts.map +1 -1
  148. package/dist/humain/web-access/vendor/xai-search.js +1 -18
  149. package/dist/humain/web-access/vendor/xai-search.js.map +1 -1
  150. package/dist/humain/web-access/vendor/xcrawl.d.ts.map +1 -1
  151. package/dist/humain/web-access/vendor/xcrawl.js +5 -34
  152. package/dist/humain/web-access/vendor/xcrawl.js.map +1 -1
  153. package/npm-shrinkwrap.json +6 -6
  154. package/package.json +2 -2
  155. package/src/humain/web-access/UPSTREAM.md +33 -1
  156. package/src/humain/web-access/upstream.json +6 -5
@@ -1,2 +1,2 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
2
- import{ANTHROPIC_API_KEY_ENV,ANTHROPIC_AUTH_TOKEN_ENV,ANTHROPIC_OAUTH_TOKEN_ENV,anthropicMessagesApi,azureOpenAIResponsesApi,bedrockConverseStreamApi,complete,completeSimple,findEnvKeys,generateImages,generateImagesOpenRouter,getApiProvider,getApiProviders,getEnvApiKey,getImageModel,getImageModels,getImageProviders,getImagesApiProvider,getModel,getModels,getProviders,googleGenerativeAIApi,googleVertexApi,mistralConversationsApi,openAICodexResponsesApi,openAICompletionsApi,openAIResponsesApi,piMessagesApi,registerApiProvider,registerBuiltInApiProviders,registerBuiltInImagesApiProviders,registerFauxProvider,registerImagesApiProvider,resetApiProviders,setBedrockProviderModule,stream,streamAnthropic,streamAzureOpenAIResponses,streamGoogle,streamGoogleVertex,streamMistral,streamOpenAICodexResponses,streamOpenAICompletions,streamOpenAIResponses,streamSimple,streamSimpleAnthropic,streamSimpleAzureOpenAIResponses,streamSimpleGoogle,streamSimpleGoogleVertex,streamSimpleMistral,streamSimpleOpenAICodexResponses,streamSimpleOpenAICompletions,streamSimpleOpenAIResponses,unregisterApiProviders}from"./chunk-NMPIM7MN.js";import{AssistantMessageFrameEncoder,StringEnum,contentText,createFauxCore,createImagesModels,createImagesProvider,envApiKeyAuth,fauxAssistantMessage,fauxProvider,fauxText,fauxThinking,fauxToolCall,getAssistantRetryDelayMs,getOverflowPatterns,isContextOverflow,isRecoverableLength,isRetryableAssistantError,lazyOAuth,reduceAssistantMessageFrames,retryAssistantCall,typebox_exports,validateToolArguments,validateToolCall}from"./chunk-7T6XCLJF.js";import{cleanupSessionResources,registerSessionResourceCleanup,uuidv7}from"./chunk-USJZMAIR.js";import"./chunk-7DDKXS2Q.js";import{parseJsonWithRepair,parseStreamingJson,repairJson}from"./chunk-D7XAASZM.js";import{InMemoryCredentialStore,InMemoryModelsStore,ModelsError,calculateCost,clampThinkingLevel,createModels,createProvider,defaultProviderAuthContext,getSupportedThinkingLevels,hasApi,lazyApi,lazyStream,modelsAreEqual}from"./chunk-E6KP6V7F.js";import{AssistantMessageEventStream,EventStream,appendAssistantMessageDiagnostic,createAssistantMessageDiagnostic,createAssistantMessageEventStream,extractDiagnosticError,formatThrownValue}from"./chunk-72KO4OMP.js";import"./chunk-JXWJOIH4.js";export{ANTHROPIC_API_KEY_ENV,ANTHROPIC_AUTH_TOKEN_ENV,ANTHROPIC_OAUTH_TOKEN_ENV,AssistantMessageEventStream,AssistantMessageFrameEncoder,EventStream,InMemoryCredentialStore,InMemoryModelsStore,ModelsError,StringEnum,typebox_exports as Type,anthropicMessagesApi,appendAssistantMessageDiagnostic,azureOpenAIResponsesApi,bedrockConverseStreamApi,calculateCost,clampThinkingLevel,cleanupSessionResources,complete,completeSimple,contentText,createAssistantMessageDiagnostic,createAssistantMessageEventStream,createFauxCore,createImagesModels,createImagesProvider,createModels,createProvider,defaultProviderAuthContext,envApiKeyAuth,extractDiagnosticError,fauxAssistantMessage,fauxProvider,fauxText,fauxThinking,fauxToolCall,findEnvKeys,formatThrownValue,generateImages,generateImagesOpenRouter,getApiProvider,getApiProviders,getAssistantRetryDelayMs,getEnvApiKey,getImageModel,getImageModels,getImageProviders,getImagesApiProvider,getModel,getModels,getOverflowPatterns,getProviders,getSupportedThinkingLevels,googleGenerativeAIApi,googleVertexApi,hasApi,isContextOverflow,isRecoverableLength,isRetryableAssistantError,lazyApi,lazyOAuth,lazyStream,mistralConversationsApi,modelsAreEqual,openAICodexResponsesApi,openAICompletionsApi,openAIResponsesApi,parseJsonWithRepair,parseStreamingJson,piMessagesApi,reduceAssistantMessageFrames,registerApiProvider,registerBuiltInApiProviders,registerBuiltInImagesApiProviders,registerFauxProvider,registerImagesApiProvider,registerSessionResourceCleanup,repairJson,resetApiProviders,retryAssistantCall,setBedrockProviderModule,stream,streamAnthropic,streamAzureOpenAIResponses,streamGoogle,streamGoogleVertex,streamMistral,streamOpenAICodexResponses,streamOpenAICompletions,streamOpenAIResponses,streamSimple,streamSimpleAnthropic,streamSimpleAzureOpenAIResponses,streamSimpleGoogle,streamSimpleGoogleVertex,streamSimpleMistral,streamSimpleOpenAICodexResponses,streamSimpleOpenAICompletions,streamSimpleOpenAIResponses,unregisterApiProviders,uuidv7,validateToolArguments,validateToolCall};
2
+ import{ANTHROPIC_API_KEY_ENV,ANTHROPIC_AUTH_TOKEN_ENV,ANTHROPIC_OAUTH_TOKEN_ENV,anthropicMessagesApi,azureOpenAIResponsesApi,bedrockConverseStreamApi,complete,completeSimple,findEnvKeys,generateImages,generateImagesOpenRouter,getApiProvider,getApiProviders,getEnvApiKey,getImageModel,getImageModels,getImageProviders,getImagesApiProvider,getModel,getModels,getProviders,googleGenerativeAIApi,googleVertexApi,mistralConversationsApi,openAICodexResponsesApi,openAICompletionsApi,openAIResponsesApi,piMessagesApi,registerApiProvider,registerBuiltInApiProviders,registerBuiltInImagesApiProviders,registerFauxProvider,registerImagesApiProvider,resetApiProviders,setBedrockProviderModule,stream,streamAnthropic,streamAzureOpenAIResponses,streamGoogle,streamGoogleVertex,streamMistral,streamOpenAICodexResponses,streamOpenAICompletions,streamOpenAIResponses,streamSimple,streamSimpleAnthropic,streamSimpleAzureOpenAIResponses,streamSimpleGoogle,streamSimpleGoogleVertex,streamSimpleMistral,streamSimpleOpenAICodexResponses,streamSimpleOpenAICompletions,streamSimpleOpenAIResponses,unregisterApiProviders}from"./chunk-CBTAWCW5.js";import{AssistantMessageFrameEncoder,StringEnum,contentText,createFauxCore,createImagesModels,createImagesProvider,envApiKeyAuth,fauxAssistantMessage,fauxProvider,fauxText,fauxThinking,fauxToolCall,getAssistantRetryDelayMs,getOverflowPatterns,isContextOverflow,isRecoverableLength,isRetryableAssistantError,lazyOAuth,reduceAssistantMessageFrames,retryAssistantCall,typebox_exports,validateToolArguments,validateToolCall}from"./chunk-7T6XCLJF.js";import{cleanupSessionResources,registerSessionResourceCleanup,uuidv7}from"./chunk-USJZMAIR.js";import"./chunk-7DDKXS2Q.js";import{parseJsonWithRepair,parseStreamingJson,repairJson}from"./chunk-D7XAASZM.js";import{InMemoryCredentialStore,InMemoryModelsStore,ModelsError,calculateCost,clampThinkingLevel,createModels,createProvider,defaultProviderAuthContext,getSupportedThinkingLevels,hasApi,lazyApi,lazyStream,modelsAreEqual}from"./chunk-E6KP6V7F.js";import{AssistantMessageEventStream,EventStream,appendAssistantMessageDiagnostic,createAssistantMessageDiagnostic,createAssistantMessageEventStream,extractDiagnosticError,formatThrownValue}from"./chunk-72KO4OMP.js";import"./chunk-JXWJOIH4.js";export{ANTHROPIC_API_KEY_ENV,ANTHROPIC_AUTH_TOKEN_ENV,ANTHROPIC_OAUTH_TOKEN_ENV,AssistantMessageEventStream,AssistantMessageFrameEncoder,EventStream,InMemoryCredentialStore,InMemoryModelsStore,ModelsError,StringEnum,typebox_exports as Type,anthropicMessagesApi,appendAssistantMessageDiagnostic,azureOpenAIResponsesApi,bedrockConverseStreamApi,calculateCost,clampThinkingLevel,cleanupSessionResources,complete,completeSimple,contentText,createAssistantMessageDiagnostic,createAssistantMessageEventStream,createFauxCore,createImagesModels,createImagesProvider,createModels,createProvider,defaultProviderAuthContext,envApiKeyAuth,extractDiagnosticError,fauxAssistantMessage,fauxProvider,fauxText,fauxThinking,fauxToolCall,findEnvKeys,formatThrownValue,generateImages,generateImagesOpenRouter,getApiProvider,getApiProviders,getAssistantRetryDelayMs,getEnvApiKey,getImageModel,getImageModels,getImageProviders,getImagesApiProvider,getModel,getModels,getOverflowPatterns,getProviders,getSupportedThinkingLevels,googleGenerativeAIApi,googleVertexApi,hasApi,isContextOverflow,isRecoverableLength,isRetryableAssistantError,lazyApi,lazyOAuth,lazyStream,mistralConversationsApi,modelsAreEqual,openAICodexResponsesApi,openAICompletionsApi,openAIResponsesApi,parseJsonWithRepair,parseStreamingJson,piMessagesApi,reduceAssistantMessageFrames,registerApiProvider,registerBuiltInApiProviders,registerBuiltInImagesApiProviders,registerFauxProvider,registerImagesApiProvider,registerSessionResourceCleanup,repairJson,resetApiProviders,retryAssistantCall,setBedrockProviderModule,stream,streamAnthropic,streamAzureOpenAIResponses,streamGoogle,streamGoogleVertex,streamMistral,streamOpenAICodexResponses,streamOpenAICompletions,streamOpenAIResponses,streamSimple,streamSimpleAnthropic,streamSimpleAzureOpenAIResponses,streamSimpleGoogle,streamSimpleGoogleVertex,streamSimpleMistral,streamSimpleOpenAICodexResponses,streamSimpleOpenAICompletions,streamSimpleOpenAIResponses,unregisterApiProviders,uuidv7,validateToolArguments,validateToolCall};
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
2
- import{CredentialResolutionError,DEFAULT_MODEL,activityMonitor,assertAuthFetchUrl,authFetchRedirectGuard,checkGhAvailable,extractGitHub,extractWithFirecrawl,extractWithKagi,extractWithOllama,extractWithParallel,extractWithParallelMcp,extractWithQuerit,extractWithSearch1API,extractWithTinyFish,fetchGeminiApi,fetchRemoteUrl,formatSeconds,getApiKey,getBrowserCookiesForHosts,getLastBrowserCookieDiagnostic,getUploadBase,getVersionedApiBase,getWebSearchConfigPath,hasCredentialSource,isFirecrawlAvailable,isGatewayConfigured,isGeminiAdcAvailable,isGeminiApiAvailable,isGeminiApiAvailableWithVideo,isGeminiWebAvailable,isKagiExtractAvailable,isOllamaFetchAvailable,isParallelAvailable,isPerplexityAvailable,isQueritAvailable,isSearch1APIAvailable,isTimeoutError,isTinyFishAvailable,loadFetchContentDomainPolicy,loadSsrfConfig,mapFfmpegError,pLimit,queryGeminiApiWithInlineData,queryGeminiApiWithVideo,queryWithCookies,readExecError,redactCredential,redactGeminiApiResponse,resolveCredential,searchWithPerplexity,showGhHint,trimErrorText,validateRemoteUrl}from"./chunk-D6HHRSB5.js";import"./chunk-LI2YVPWP.js";import"./chunk-JXWJOIH4.js";import{existsSync as existsSync9,readFileSync as readFileSync9}from"node:fs";function extractRSCContent(html){if(!html.includes("self.__next_f.push"))return null;let chunkMap=new Map,scriptRegex=/<script>self\.__next_f\.push\(\[1,"([\s\S]*?)"\]\)<\/script>/g;for(let match of html.matchAll(scriptRegex)){let content2;try{content2=JSON.parse('"'+match[1]+'"')}catch{continue}for(let line of content2.split(`
2
+ import{CredentialResolutionError,DEFAULT_MODEL,activityMonitor,assertAuthFetchUrl,authFetchRedirectGuard,checkGhAvailable,extractGitHub,extractWithFirecrawl,extractWithKagi,extractWithOllama,extractWithParallel,extractWithParallelMcp,extractWithQuerit,extractWithSearch1API,extractWithTinyFish,fetchGeminiApi,fetchRemoteUrl,formatSeconds,getApiKey,getBrowserCookiesForHosts,getLastBrowserCookieDiagnostic,getUploadBase,getVersionedApiBase,getWebSearchConfigPath,hasCredentialSource,isFirecrawlAvailable,isGatewayConfigured,isGeminiAdcAvailable,isGeminiApiAvailable,isGeminiApiAvailableWithVideo,isGeminiWebAvailable,isKagiExtractAvailable,isOllamaFetchAvailable,isParallelAvailable,isPerplexityAvailable,isQueritAvailable,isSearch1APIAvailable,isTimeoutError,isTinyFishAvailable,loadFetchContentDomainPolicy,loadSsrfConfig,mapFfmpegError,pLimit,queryGeminiApiWithInlineData,queryGeminiApiWithVideo,queryWithCookies,readExecError,redactCredential,redactGeminiApiResponse,resolveCredential,searchWithPerplexity,showGhHint,trimErrorText,validateRemoteUrl}from"./chunk-S43N4JYF.js";import"./chunk-LI2YVPWP.js";import"./chunk-JXWJOIH4.js";import{existsSync as existsSync9,readFileSync as readFileSync9}from"node:fs";function extractRSCContent(html){if(!html.includes("self.__next_f.push"))return null;let chunkMap=new Map,scriptRegex=/<script>self\.__next_f\.push\(\[1,"([\s\S]*?)"\]\)<\/script>/g;for(let match of html.matchAll(scriptRegex)){let content2;try{content2=JSON.parse('"'+match[1]+'"')}catch{continue}for(let line of content2.split(`
3
3
  `)){if(!line.trim())continue;let colonIdx=line.indexOf(":");if(colonIdx<=0||colonIdx>4)continue;let id=line.slice(0,colonIdx);if(!/^[0-9a-f]+$/i.test(id))continue;let payload=line.slice(colonIdx+1);if(!payload)continue;let existing=chunkMap.get(id);(!existing||payload.length>existing.length)&&chunkMap.set(id,payload)}}if(chunkMap.size===0)return null;let title=html.match(/<title[^>]*>([^<]+)<\/title>/)?.[1]?.split("|")[0]?.trim()||"",parsedCache=new Map;function getParsedChunk(id){if(parsedCache.has(id))return parsedCache.get(id);let chunk=chunkMap.get(id);if(!chunk||!chunk.startsWith("["))return parsedCache.set(id,null),null;try{let parsed=JSON.parse(chunk);return parsedCache.set(id,parsed),parsed}catch{return parsedCache.set(id,null),null}}let visitedRefs=new Set;function extractNode(node,ctx={inTable:!1,inCode:!1}){if(node==null)return"";if(typeof node=="string"){let refMatch=node.match(/^\$L([0-9a-f]+)$/i);if(refMatch){let refId=refMatch[1];if(visitedRefs.has(refId))return"";visitedRefs.add(refId);let refNode=getParsedChunk(refId),result=refNode?extractNode(refNode,ctx):"";return visitedRefs.delete(refId),result}return!ctx.inCode&&(node==="$undefined"||node==="$"||/^\$[A-Z]/.test(node))?"":node.trim()?node:""}if(typeof node=="number")return String(node);if(typeof node=="boolean"||!Array.isArray(node))return"";if(node[0]==="$"&&typeof node[1]=="string"){let tag=node[1],props=node[3]||{};if(["script","style","svg","path","circle","link","meta","template","button","input","nav","footer","aside"].includes(tag))return"";if(tag.startsWith("$L")){let refId=tag.slice(2);if(visitedRefs.has(refId))return"";if(props.baseId&&props.children)return`## ${String(props.children)}
4
4
 
5
5
  `;visitedRefs.add(refId);let refNode=getParsedChunk(refId),result="";return refNode?result=extractNode(refNode,ctx):props.children&&(result=extractNode(props.children,ctx)),visitedRefs.delete(refId),result}let children=props.children,content2=children?extractNode(children,ctx):"";switch(tag){case"h1":return`# ${content2.trim()}
@@ -45,7 +45,7 @@ Requirements:
45
45
  - If text is unreadable, mark it as [unreadable] rather than guessing.
46
46
  - Return only Markdown, without an enclosing code fence or commentary.`}function stripEnclosingMarkdownFence(value){let trimmed=value.trim();return(trimmed.match(/^```(?:markdown|md)?[ \t]*\n([\s\S]*?)\n```$/i)?.[1]??trimmed).trim()}function validatePageMarkers(markdown,maxPages,exactPageCount){let markers=[...markdown.matchAll(PAGE_MARKER_PATTERN)].map(match=>Number(match[1]));if(markers.length===0)throw new Error("Gemini PDF extraction returned no page markers");if(exactPageCount&&markers.length!==maxPages)throw new Error(`Gemini PDF extraction returned ${markers.length} page markers; expected ${maxPages}`);if(markers.length>maxPages)throw new Error(`Gemini PDF extraction returned ${markers.length} page markers; expected at most ${maxPages}`);for(let index=0;index<markers.length;index+=1){let expected=index+1;if(markers[index]!==expected)throw new Error(`Gemini PDF extraction page markers are out of sequence at page ${expected}`)}}function removeDuplicateInitialTitle(markdown,title){let match=markdown.match(/^(<!-- Page 1 -->\s*\n+)#\s+(.+?)\s*\n+/);return!match||normalizeTitle(match[2])!==normalizeTitle(title)?markdown:`${match[1]}${markdown.slice(match[0].length)}`.trim()}function normalizeTitle(value){return value.normalize("NFKC").toLocaleLowerCase().replace(/[`*_~]/g,"").replace(/[\p{P}\p{S}\s]+/gu,"")}var PDF_PROVIDER_VALUES=new Set(["auto","gemini","datalab","unpdf"]),DEFAULT_PDF_MAX_SIZE_MB=20,MAX_PDF_MAX_SIZE_MB=50,MAX_DATALAB_TIMEOUT_MS=3e5,DEFAULT_MAX_PAGES=100,DEFAULT_OUTPUT_DIR=join(tmpdir(),"pi-web-pdf"),CONFIG_PATH2=getWebSearchConfigPath(),PAGE_MARKER_PATTERN2=/^<!-- Page (\d+) -->$/gm;function loadPDFConfig(){if(!existsSync2(CONFIG_PATH2))return{enabled:!0,maxSizeMB:DEFAULT_PDF_MAX_SIZE_MB,maxPages:DEFAULT_MAX_PAGES,provider:"auto",datalabMode:normalizeDatalabMode(process.env.DATALAB_MODE),datalabTimeoutMs:DEFAULT_DATALAB_TIMEOUT_MS};let rawText=readFileSync2(CONFIG_PATH2,"utf-8"),raw;try{raw=JSON.parse(rawText)}catch(err){let message=err instanceof Error?err.message:String(err);throw new Error(`Failed to parse ${CONFIG_PATH2}: ${message}`)}let root=raw&&typeof raw=="object"?raw:{},pdf=root.pdf&&typeof root.pdf=="object"?root.pdf:{},enabled=pdf.enabled!==!1,configured=pdf.maxSizeMB,normalized=typeof configured=="number"&&Number.isFinite(configured)&&configured>0?Math.min(configured,MAX_PDF_MAX_SIZE_MB):DEFAULT_PDF_MAX_SIZE_MB,configuredMaxPages=pdf.maxPages,maxPages=typeof configuredMaxPages=="number"&&Number.isFinite(configuredMaxPages)&&configuredMaxPages>0?Math.max(1,Math.floor(configuredMaxPages)):DEFAULT_MAX_PAGES,provider=typeof pdf.provider=="string"&&PDF_PROVIDER_VALUES.has(pdf.provider)?pdf.provider:"auto",datalabMode=typeof pdf.datalabMode=="string"&&DATALAB_MODE_VALUES.has(pdf.datalabMode)?pdf.datalabMode:normalizeDatalabMode(process.env.DATALAB_MODE),configuredTimeout=pdf.datalabTimeoutMs,datalabTimeoutMs=typeof configuredTimeout=="number"&&Number.isFinite(configuredTimeout)&&configuredTimeout>0?Math.min(configuredTimeout,MAX_DATALAB_TIMEOUT_MS):DEFAULT_DATALAB_TIMEOUT_MS;return{enabled,maxSizeMB:normalized,maxPages,provider,datalabMode,datalabTimeoutMs}}async function getUnpdf(){if(typeof Promise.try!="function"){let{default:promiseTry}=await import("./promise-J5TGSM32.js");promiseTry.shim()}let[unpdf,pdfjs]=await Promise.all([import("./dist-BXEVYJIO.js"),import("./pdfjs-UKQT3OWY.js")]),{VerbosityLevel}=pdfjs;return{getDocumentProxy:unpdf.getDocumentProxy,VerbosityLevel}}async function extractPDFToMarkdown(buffer,url,options={}){let{maxPages,outputDir=DEFAULT_OUTPUT_DIR,filename,signal,geminiTimeoutMs}=options,pdfConfig=loadPDFConfig(),safeMaxPages=maxPages===void 0?pdfConfig.maxPages:Number.isFinite(maxPages)?Math.max(1,Math.floor(maxPages)):DEFAULT_MAX_PAGES,urlTitle=extractTitleFromURL(url),provider=pdfConfig.provider;if(provider==="auto"||provider==="datalab")try{if(isDatalabApiAvailable()){let result=await extractPDFViaDatalab(buffer,{maxPages:safeMaxPages,title:urlTitle,mode:pdfConfig.datalabMode,timeoutMs:pdfConfig.datalabTimeoutMs,...signal?{signal}:{}});return writeMarkdownResult({markdownBody:result.markdown,title:urlTitle,pages:result.pages,outputDir,filename,url})}}catch(err){if(shouldRethrowExtractionError(err,signal))throw err}if(provider==="auto"||provider==="gemini")try{if(isGeminiApiAvailable()){let markdownBody=await extractPDFViaGemini(buffer,{maxPages:safeMaxPages,title:urlTitle,...signal?{signal}:{},...geminiTimeoutMs!==void 0?{timeoutMs:geminiTimeoutMs}:{}});return writeMarkdownResult({markdownBody,title:urlTitle,pages:countPageMarkers2(markdownBody),outputDir,filename,url})}}catch(err){if(shouldRethrowExtractionError(err,signal))throw err}let{getDocumentProxy,VerbosityLevel}=await getUnpdf(),pdf=await getDocumentProxy(new Uint8Array(buffer),{verbosity:VerbosityLevel.ERRORS}),metadata=await pdf.getMetadata(),metadataInfo=metadata.info&&typeof metadata.info=="object"?metadata.info:null,metaTitle=typeof metadataInfo?.Title=="string"?metadataInfo.Title:void 0,metaAuthor=typeof metadataInfo?.Author=="string"?metadataInfo.Author:void 0,title=metaTitle?.trim()||urlTitle,pagesToExtract=Math.min(pdf.numPages,safeMaxPages),truncated=pdf.numPages>safeMaxPages,pages=[];for(let i=1;i<=pagesToExtract;i++){let pageText=(await(await pdf.getPage(i)).getTextContent()).items.map(item=>item.str||"").join(" ").replace(/\s+/g," ").trim();pageText&&pages.push({pageNum:i,text:pageText})}let bodyLines=[];for(let i=0;i<pages.length;i++)i>0&&(bodyLines.push(""),bodyLines.push(`<!-- Page ${pages[i].pageNum} -->`),bodyLines.push("")),bodyLines.push(pages[i].text);return writeMarkdownResult({markdownBody:bodyLines.join(`
47
47
  `),title,pages:pdf.numPages,outputDir,filename,url,metaAuthor,truncated,pagesToExtract})}async function writeMarkdownResult(options){let lines=[];lines.push(`# ${options.title}`),lines.push(""),lines.push(`> Source: ${options.url}`),lines.push(`> Pages: ${options.pages}${options.truncated?` (extracted first ${options.pagesToExtract})`:""}`),options.metaAuthor&&lines.push(`> Author: ${options.metaAuthor}`),lines.push(""),lines.push("---"),lines.push(""),options.markdownBody&&lines.push(options.markdownBody),options.truncated&&(lines.push(""),lines.push("---"),lines.push(""),lines.push(`*[Truncated: Only first ${options.pagesToExtract} of ${options.pages} pages extracted]*`));let content=lines.join(`
48
- `),outputFilename=options.filename||sanitizeFilename(options.title)+".md",outputPath=join(options.outputDir,outputFilename);return await mkdir(options.outputDir,{recursive:!0}),await writeFile(outputPath,content,"utf-8"),{title:options.title,pages:options.pages,chars:content.length,outputPath}}function countPageMarkers2(markdown){return[...markdown.matchAll(PAGE_MARKER_PATTERN2)].length}function shouldRethrowExtractionError(err,signal){return signal?.aborted||err instanceof CredentialResolutionError?!0:(err instanceof Error?err.message:String(err)).startsWith("Failed to parse ")}function extractTitleFromURL(url){try{let urlObj=new URL(url),pathname=urlObj.pathname,filename=basename(pathname,".pdf");if(urlObj.hostname.includes("arxiv.org")){let match=pathname.match(/\/(?:pdf|abs)\/(\d+\.\d+)/);match&&(filename=`arxiv-${match[1]}`)}return filename=filename.replace(/[_-]+/g," ").replace(/\s+/g," ").trim(),filename||"document"}catch{return"document"}}function sanitizeFilename(name){return name.toLowerCase().replace(/[^a-z0-9\s-]/g,"").replace(/\s+/g,"-").replace(/-+/g,"-").slice(0,100).replace(/^-|-$/g,"")||"document"}function isPDF(url,contentType){if(contentType?.includes("application/pdf"))return!0;try{return new URL(url).pathname.toLowerCase().endsWith(".pdf")}catch{return!1}}import{execFile}from"node:child_process";import{existsSync as existsSync3,readFileSync as readFileSync3}from"node:fs";var CONFIG_PATH3=getWebSearchConfigPath(),GH_TIMEOUT_MS=1e4,GH_TOTAL_TIMEOUT_MS=2e4,MAX_DOC_CHARS=15e4,BODY_INLINE_CHARS=4e3,COMMENT_INLINE_CHARS=700,MAX_INLINE_COMMENTS=15,MAX_INLINE_REVIEWS=10,MAX_INLINE_CHECKS=15,MAX_INLINE_FILES=50,MAX_INLINE_COMMITS=20,MAX_INLINE_REVIEW_THREADS=30,REST_HEADERS={Accept:"application/vnd.github+json","User-Agent":"pi-web-access"},PR_SUBPATHS=new Set(["files","commits","checks","conversation"]),PR_FIELDS=["title","number","state","isDraft","author","baseRefName","headRefName","headRepositoryOwner","createdAt","mergedAt","closedAt","labels","milestone","additions","deletions","changedFiles","files","commits","reviews","statusCheckRollup","comments","body","closingIssuesReferences","url"],PR_CORE_FIELDS=["title","number","state","isDraft","author","baseRefName","headRefName","headRepositoryOwner","createdAt","mergedAt","closedAt","labels","milestone","additions","deletions","changedFiles","files","commits","reviews","comments","body","url"],ISSUE_FIELDS=["title","number","state","stateReason","author","createdAt","closedAt","labels","assignees","milestone","comments","body","closedByPullRequestsReferences","url"],ISSUE_CORE_FIELDS=["title","number","state","author","createdAt","closedAt","labels","assignees","milestone","comments","body","url"],cachedConfig2=null;function loadConfig2(){if(cachedConfig2)return cachedConfig2;let defaults2={enabled:!0};if(!existsSync3(CONFIG_PATH3))return cachedConfig2=defaults2,cachedConfig2;let parsed;try{parsed=JSON.parse(readFileSync3(CONFIG_PATH3,"utf-8"))}catch(err){let message=err instanceof Error?err.message:String(err);throw new Error(`Failed to parse ${CONFIG_PATH3}: ${message}`)}let value=(parsed&&typeof parsed=="object"&&!Array.isArray(parsed)?parsed:{}).githubPrIssue;if(value!==void 0&&(typeof value!="object"||value===null||Array.isArray(value)))throw new Error(`githubPrIssue in ${CONFIG_PATH3} must be an object`);return cachedConfig2={enabled:typeof value?.enabled=="boolean"?value.enabled:!0},cachedConfig2}function validOwner(owner){return/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,37}[A-Za-z0-9])?$/.test(owner)&&!owner.includes("--")}function validRepo(repo){return/^[A-Za-z0-9._-]{1,100}$/.test(repo)&&repo!=="."&&repo!==".."}function errorMessage(err){return err instanceof Error?err.message:String(err)}function isAbortError(err){return errorMessage(err).toLowerCase().includes("abort")}function parseGitHubIssuePrUrl(url){let parsed;try{parsed=new URL(url)}catch{return null}let host=parsed.hostname.toLowerCase();if(host!=="github.com"&&host!=="www.github.com")return null;let segments=[];for(let segment of parsed.pathname.split("/").filter(Boolean))try{segments.push(decodeURIComponent(segment))}catch{return null}if(segments.length<4)return null;let owner=segments[0],repo=segments[1].replace(/\.git$/,"");if(!validOwner(owner)||!validRepo(repo))return null;let route=segments[2].toLowerCase();if(route!=="pull"&&route!=="issues"||!/^\d+$/.test(segments[3]))return null;let subpath=segments[4]?.toLowerCase();if(route==="pull"&&subpath&&!PR_SUBPATHS.has(subpath)||route==="issues"&&subpath)return null;let number=Number.parseInt(segments[3],10);if(!Number.isSafeInteger(number)||number<=0)return null;let fragment=parsed.hash.slice(1),anchor=(route==="pull"?/^(?:issuecomment-\d+|discussion_r\d+)$/i:/^issuecomment-\d+$/i).test(fragment)?fragment:void 0;return{owner,repo,kind:route==="pull"?"pull":"issue",number,...anchor?{anchor}:{}}}function runGh(args,timeoutMs=GH_TIMEOUT_MS,signal){return new Promise(resolve2=>{execFile("gh",args,{timeout:timeoutMs,maxBuffer:10*1024*1024,...signal?{signal}:{},env:{...process.env,GH_PROMPT_DISABLED:"1",GIT_TERMINAL_PROMPT:"0"}},(err,stdout,stderr)=>{let nodeErr=err;resolve2({ok:!err,stdout,stderr,code:typeof nodeErr?.code=="number"?nodeErr.code:null,...err?{error:nodeErr?.message??String(err)}:{}})})})}function remainingGhTimeout(deadlineMs){return Math.max(1,Math.min(GH_TIMEOUT_MS,deadlineMs-Date.now()))}function unknownJsonField(result){return/unknown (?:json )?field|UnknownField|Unknown JSON field/i.test(`${result.stderr}
48
+ `),outputFilename=options.filename||sanitizeFilename(options.title)+".md",outputPath=join(options.outputDir,outputFilename);return await mkdir(options.outputDir,{recursive:!0}),await writeFile(outputPath,content,"utf-8"),{title:options.title,content,pages:options.pages,chars:content.length,outputPath}}function countPageMarkers2(markdown){return[...markdown.matchAll(PAGE_MARKER_PATTERN2)].length}function shouldRethrowExtractionError(err,signal){return signal?.aborted||err instanceof CredentialResolutionError?!0:(err instanceof Error?err.message:String(err)).startsWith("Failed to parse ")}function extractTitleFromURL(url){try{let urlObj=new URL(url),pathname=urlObj.pathname,filename=basename(pathname,".pdf");if(urlObj.hostname.includes("arxiv.org")){let match=pathname.match(/\/(?:pdf|abs)\/(\d+\.\d+)/);match&&(filename=`arxiv-${match[1]}`)}return filename=filename.replace(/[_-]+/g," ").replace(/\s+/g," ").trim(),filename||"document"}catch{return"document"}}function sanitizeFilename(name){return name.toLowerCase().replace(/[^a-z0-9\s-]/g,"").replace(/\s+/g,"-").replace(/-+/g,"-").slice(0,100).replace(/^-|-$/g,"")||"document"}function isPDF(url,contentType){if(contentType?.includes("application/pdf"))return!0;try{return new URL(url).pathname.toLowerCase().endsWith(".pdf")}catch{return!1}}import{execFile}from"node:child_process";import{existsSync as existsSync3,readFileSync as readFileSync3}from"node:fs";var CONFIG_PATH3=getWebSearchConfigPath(),GH_TIMEOUT_MS=1e4,GH_TOTAL_TIMEOUT_MS=2e4,MAX_DOC_CHARS=15e4,BODY_INLINE_CHARS=4e3,COMMENT_INLINE_CHARS=700,MAX_INLINE_COMMENTS=15,MAX_INLINE_REVIEWS=10,MAX_INLINE_CHECKS=15,MAX_INLINE_FILES=50,MAX_INLINE_COMMITS=20,MAX_INLINE_REVIEW_THREADS=30,REST_HEADERS={Accept:"application/vnd.github+json","User-Agent":"pi-web-access"},PR_SUBPATHS=new Set(["files","commits","checks","conversation"]),PR_FIELDS=["title","number","state","isDraft","author","baseRefName","headRefName","headRepositoryOwner","createdAt","mergedAt","closedAt","labels","milestone","additions","deletions","changedFiles","files","commits","reviews","statusCheckRollup","comments","body","closingIssuesReferences","url"],PR_CORE_FIELDS=["title","number","state","isDraft","author","baseRefName","headRefName","headRepositoryOwner","createdAt","mergedAt","closedAt","labels","milestone","additions","deletions","changedFiles","files","commits","reviews","comments","body","url"],ISSUE_FIELDS=["title","number","state","stateReason","author","createdAt","closedAt","labels","assignees","milestone","comments","body","closedByPullRequestsReferences","url"],ISSUE_CORE_FIELDS=["title","number","state","author","createdAt","closedAt","labels","assignees","milestone","comments","body","url"],cachedConfig2=null;function loadConfig2(){if(cachedConfig2)return cachedConfig2;let defaults2={enabled:!0};if(!existsSync3(CONFIG_PATH3))return cachedConfig2=defaults2,cachedConfig2;let parsed;try{parsed=JSON.parse(readFileSync3(CONFIG_PATH3,"utf-8"))}catch(err){let message=err instanceof Error?err.message:String(err);throw new Error(`Failed to parse ${CONFIG_PATH3}: ${message}`)}let value=(parsed&&typeof parsed=="object"&&!Array.isArray(parsed)?parsed:{}).githubPrIssue;if(value!==void 0&&(typeof value!="object"||value===null||Array.isArray(value)))throw new Error(`githubPrIssue in ${CONFIG_PATH3} must be an object`);return cachedConfig2={enabled:typeof value?.enabled=="boolean"?value.enabled:!0},cachedConfig2}function validOwner(owner){return/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,37}[A-Za-z0-9])?$/.test(owner)&&!owner.includes("--")}function validRepo(repo){return/^[A-Za-z0-9._-]{1,100}$/.test(repo)&&repo!=="."&&repo!==".."}function errorMessage(err){return err instanceof Error?err.message:String(err)}function isAbortError(err){return errorMessage(err).toLowerCase().includes("abort")}function parseGitHubIssuePrUrl(url){let parsed;try{parsed=new URL(url)}catch{return null}let host=parsed.hostname.toLowerCase();if(host!=="github.com"&&host!=="www.github.com")return null;let segments=[];for(let segment of parsed.pathname.split("/").filter(Boolean))try{segments.push(decodeURIComponent(segment))}catch{return null}if(segments.length<4)return null;let owner=segments[0],repo=segments[1].replace(/\.git$/,"");if(!validOwner(owner)||!validRepo(repo))return null;let route=segments[2].toLowerCase();if(route!=="pull"&&route!=="issues"||!/^\d+$/.test(segments[3]))return null;let subpath=segments[4]?.toLowerCase();if(route==="pull"&&subpath&&!PR_SUBPATHS.has(subpath)||route==="issues"&&subpath)return null;let number=Number.parseInt(segments[3],10);if(!Number.isSafeInteger(number)||number<=0)return null;let fragment=parsed.hash.slice(1),anchor=(route==="pull"?/^(?:issuecomment-\d+|discussion_r\d+)$/i:/^issuecomment-\d+$/i).test(fragment)?fragment:void 0;return{owner,repo,kind:route==="pull"?"pull":"issue",number,...anchor?{anchor}:{}}}function runGh(args,timeoutMs=GH_TIMEOUT_MS,signal){return new Promise(resolve2=>{execFile("gh",args,{timeout:timeoutMs,maxBuffer:10*1024*1024,...signal?{signal}:{},env:{...process.env,GH_PROMPT_DISABLED:"1",GIT_TERMINAL_PROMPT:"0"}},(err,stdout,stderr)=>{let nodeErr=err;resolve2({ok:!err,stdout,stderr,code:typeof nodeErr?.code=="number"?nodeErr.code:null,...err?{error:nodeErr?.message??String(err)}:{}})})})}function remainingGhTimeout(deadlineMs){return Math.max(1,Math.min(GH_TIMEOUT_MS,deadlineMs-Date.now()))}function unknownJsonField(result){return/unknown (?:json )?field|UnknownField|Unknown JSON field/i.test(`${result.stderr}
49
49
  ${result.error??""}`)}async function ghView(info,deadlineMs,signal){let repoArg=`${info.owner}/${info.repo}`,command=info.kind==="pull"?"pr":"issue",fields=info.kind==="pull"?PR_FIELDS:ISSUE_FIELDS,coreFields=info.kind==="pull"?PR_CORE_FIELDS:ISSUE_CORE_FIELDS,result=await runGh([command,"view",String(info.number),"--repo",repoArg,"--json",fields.join(",")],remainingGhTimeout(deadlineMs),signal),notes=[],linkedReferencesUnavailable=!1;if(!result.ok&&unknownJsonField(result)&&(result=await runGh([command,"view",String(info.number),"--repo",repoArg,"--json",coreFields.join(",")],remainingGhTimeout(deadlineMs),signal),notes.push("Some GitHub fields were unavailable from this gh version; retried with the core field set."),linkedReferencesUnavailable=!0),!result.ok)return null;try{let parsed=JSON.parse(result.stdout);if(!parsed||typeof parsed!="object"||Array.isArray(parsed))return null;let view=parsed;return linkedReferencesUnavailable&&(view.linkedReferencesUnavailable=!0),{view,notes}}catch{return null}}async function ghReviewThreads(info,deadlineMs,signal){if(info.kind!=="pull")return{comments:[]};let comments=[],bounded=!1,pageFailed=!1;for(let page=1;page<=3;page++){let result=await runGh(["api",`repos/${info.owner}/${info.repo}/pulls/${info.number}/comments?per_page=100&page=${page}`],remainingGhTimeout(deadlineMs),signal);if(!result.ok){pageFailed=!0;break}let pageItems;try{pageItems=JSON.parse(result.stdout)}catch{pageFailed=!0;break}if(!Array.isArray(pageItems)||pageItems.length===0||(comments.push(...pageItems.filter(item=>!!item&&typeof item=="object"&&!Array.isArray(item))),pageItems.length<100))break;page===3&&(bounded=!0)}let discussionId=anchorId(info.anchor,"discussion_r");if(discussionId&&!hasCommentId(comments,discussionId)){let result=await runGh(["api",`repos/${info.owner}/${info.repo}/pulls/comments/${discussionId}`],remainingGhTimeout(deadlineMs),signal);if(result.ok)try{let comment=JSON.parse(result.stdout);if(comment&&typeof comment=="object"&&!Array.isArray(comment)&&belongsToPull(comment,discussionId,info))comments.push(comment);else return{comments,bounded:bounded||pageFailed&&comments.length>0,unavailable:pageFailed&&comments.length===0,anchorUnavailable:!0}}catch{return{comments,bounded:bounded||pageFailed&&comments.length>0,unavailable:pageFailed&&comments.length===0,note:"Anchored review thread comment unavailable from gh."}}else return{comments,bounded:bounded||pageFailed&&comments.length>0,unavailable:pageFailed&&comments.length===0,anchorUnavailable:!0}}return{comments,bounded:bounded||pageFailed&&comments.length>0,unavailable:pageFailed&&comments.length===0}}function isRateLimited(response){return response.status===403&&response.headers.get("x-ratelimit-remaining")==="0"}function anchorId(anchor,prefix){return anchor?.match(prefix==="issuecomment"?/^issuecomment-(\d+)$/i:/^discussion_r(\d+)$/i)?.[1]??null}function hasCommentId(comments,id){return comments.some(comment=>commentId(comment)===id)}function belongsToIssue(comment,id,info){return commentId(comment)===id&&associationMatches(comment.issue_url,info,"issues")}function belongsToPull(comment,id,info){return commentId(comment)===id&&associationMatches(comment.pull_request_url,info,"pulls")}function associationMatches(value,info,route){if(typeof value!="string")return!1;try{let parsed=new URL(value);return parsed.protocol!=="https:"||parsed.hostname.toLowerCase()!=="api.github.com"?!1:parsed.pathname.toLowerCase()===`/repos/${info.owner}/${info.repo}/${route}/${info.number}`.toLowerCase()}catch{return!1}}function rateLimitResult(url,info,response){let reset=response.headers.get("x-ratelimit-reset"),resetNote=reset?` Rate limit resets at Unix time ${reset}.`:"";return{url,title:`${info.owner}/${info.repo}#${info.number}`,content:`GitHub API rate limit reached for ${info.owner}/${info.repo} ${info.kind} #${info.number}.${resetNote}
50
50
 
51
51
  Authenticate the gh CLI and retry:
@@ -101,7 +101,7 @@ ${section}`:section}function addDeclaredLink(links,candidate){if(!candidate.url|
101
101
  `)}function abortedResult(url){return{url,title:"",content:"",error:"Aborted"}}var turndownInstance;async function loadTurndown(){let{default:TurndownService}=await import("./turndown.cjs-HRMZVRUL.js");return new TurndownService({headingStyle:"atx",codeBlockStyle:"fenced"})}function getTurndown(){return turndownInstance??=loadTurndown(),turndownInstance}var fetchLimit=pLimit(CONCURRENT_LIMIT);function resolveFetchTimeoutMs(options){return options?.timeoutMs??loadFetchTimeoutMs()}var JINA_READER_BASE="https://r.jina.ai/";async function extractWithJinaReader(url,timeoutMs,signal,lookup){let jinaUrl=JINA_READER_BASE+url,activityId=activityMonitor.logStart({type:"api",query:`jina: ${url}`});try{let ssrf=loadSsrfConfig(),domainPolicy=loadFetchContentDomainPolicy();await validateRemoteUrl(url,{allowRanges:ssrf.allowRanges,trustEnvProxy:ssrf.trustEnvProxy,domainPolicy,...lookup?{lookup}:{}});let res=await fetch(jinaUrl,{headers:{Accept:"text/markdown","X-No-Cache":"true"},signal:AbortSignal.any([AbortSignal.timeout(timeoutMs),...signal?[signal]:[]])});if(!res.ok)return activityMonitor.logComplete(activityId,res.status),null;let content=await res.text();activityMonitor.logComplete(activityId,res.status);let contentStart=content.indexOf("Markdown Content:");if(contentStart<0)return null;let markdownPart=content.slice(contentStart+17).trim();if(markdownPart.length<100||markdownPart.startsWith("Loading...")||markdownPart.startsWith("Please enable JavaScript"))return null;let title=extractHeadingTitle(markdownPart)??(new URL(url).pathname.split("/").pop()||url);return{url,title,content:markdownPart,error:null}}catch(err){let message=err instanceof Error?err.message:String(err);return message.toLowerCase().includes("abort")?activityMonitor.logComplete(activityId,0):activityMonitor.logError(activityId,message),null}}function parseTimestamp(ts){let num=Number(ts);if(!isNaN(num)&&num>=0)return Math.floor(num);let parts=ts.split(":").map(Number);return parts.some(p=>isNaN(p)||p<0)?null:parts.length===3?Math.floor(parts[0]*3600+parts[1]*60+parts[2]):parts.length===2?Math.floor(parts[0]*60+parts[1]):null}function parseTimestampSpec(ts){let dashIdx=ts.indexOf("-",1);if(dashIdx>0){let start=parseTimestamp(ts.slice(0,dashIdx)),end=parseTimestamp(ts.slice(dashIdx+1));if(start!==null&&end!==null&&end>start)return{type:"range",start,end}}let seconds=parseTimestamp(ts);return seconds!==null?{type:"single",seconds}:null}var DEFAULT_RANGE_FRAMES=6,MIN_FRAME_INTERVAL=5;function computeRangeTimestamps(start,end,maxFrames=DEFAULT_RANGE_FRAMES){if(maxFrames<=1)return[start];let idealInterval=(end-start)/(maxFrames-1);if(idealInterval<MIN_FRAME_INTERVAL){let timestamps=[];for(let t=start;t<=end&&timestamps.length<maxFrames;t+=MIN_FRAME_INTERVAL)timestamps.push(t);return timestamps}return Array.from({length:maxFrames},(_,i)=>Math.round(start+i*idealInterval))}function buildFrameResult(url,label,requestedCount,frames,error,duration){if(frames.length===0){let msg=error??"Frame extraction failed";return{url,title:`Frames ${label} (0/${requestedCount})`,content:msg,error:msg}}return{url,title:`Frames ${label} (${frames.length}/${requestedCount})`,content:`${frames.length} frames extracted from ${label}`,error:null,frames,...duration!==void 0?{duration}:{}}}async function extractLocalFrames(filePath,timestamps){let results=await Promise.all(timestamps.map(async t=>{let frame=await extractVideoFrame(filePath,t);return"error"in frame?{error:frame.error}:{...frame,timestamp:formatSeconds(t)}})),frames=results.filter(f=>"data"in f),firstError=results.find(f=>"error"in f);return{frames,error:frames.length===0&&firstError?firstError.error:null}}function safeVideoInfo(url){try{let info=isVideoFile(url);return info?{status:"video",info}:{status:"not-video"}}catch(err){return{status:"invalid",error:errorMessage5(err)}}}async function extractContent(url,signal,options){if(signal?.aborted)return{url,title:"",content:"",error:"Aborted"};let remoteUrl=null;try{let parsed=new URL(url);(parsed.protocol==="http:"||parsed.protocol==="https:")&&(remoteUrl=parsed)}catch{}if(remoteUrl)try{let ssrf=loadSsrfConfig(),domainPolicy=loadFetchContentDomainPolicy();await validateRemoteUrl(remoteUrl,{allowRanges:ssrf.allowRanges,trustEnvProxy:ssrf.trustEnvProxy,domainPolicy,...options?.lookup?{lookup:options.lookup}:{}})}catch(err){return{url,title:"",content:"",error:errorMessage5(err)}}if(options?.authFetchProfile||options?.mode==="raw")try{return await extractViaHttp(url,resolveFetchTimeoutMs(options),signal,options)}catch(err){return{url,title:"",content:"",error:errorMessage5(err)}}if(options?.frames||options?.timestamp){let disabled=imageGateError();if(disabled)return{url,title:"",content:"",error:disabled}}if(options?.frames&&!options.timestamp){let frameCount=options.frames,ytInfo2=isYouTubeURL(url);if(ytInfo2.isYouTube&&ytInfo2.videoId){let streamInfo=await getYouTubeStreamInfo(ytInfo2.videoId);if("error"in streamInfo)return{url,title:"Frames",content:streamInfo.error,error:streamInfo.error};if(streamInfo.duration===null){let error="Cannot determine video duration. Use a timestamp range instead.";return{url,title:"Frames",content:error,error}}let dur=Math.floor(streamInfo.duration),timestamps=computeRangeTimestamps(0,dur,frameCount),result=await extractYouTubeFrames(ytInfo2.videoId,timestamps,streamInfo),label=`${formatSeconds(0)}-${formatSeconds(dur)}`;return buildFrameResult(url,label,timestamps.length,result.frames,result.error,streamInfo.duration)}let localVideo2=safeVideoInfo(url);if(localVideo2.status==="invalid")return{url,title:"",content:"",error:localVideo2.error};if(localVideo2.status==="video"){let durationResult=await getLocalVideoDuration(localVideo2.info.absolutePath);if(typeof durationResult!="number")return{url,title:"Frames",content:durationResult.error,error:durationResult.error};let dur=Math.floor(durationResult),timestamps=computeRangeTimestamps(0,dur,frameCount),result=await extractLocalFrames(localVideo2.info.absolutePath,timestamps),label=`${formatSeconds(0)}-${formatSeconds(dur)}`;return buildFrameResult(url,label,timestamps.length,result.frames,result.error,durationResult)}return{url,title:"",content:"",error:"Frame extraction only works with YouTube and local video files"}}if(options?.timestamp){let spec=parseTimestampSpec(options.timestamp);if(!spec)return{url,title:"",content:"",error:`Invalid timestamp format: "${options.timestamp}". Use "H:MM:SS", "MM:SS", "85", or "start-end".`};let frameCount=options.frames,ytInfo2=isYouTubeURL(url);if(ytInfo2.isYouTube&&ytInfo2.videoId){let streamInfo=await getYouTubeStreamInfo(ytInfo2.videoId);if("error"in streamInfo){if(spec.type==="range"){let label=`${formatSeconds(spec.start)}-${formatSeconds(spec.end)}`;return{url,title:`Frames ${label}`,content:streamInfo.error,error:streamInfo.error}}if(frameCount){let end=spec.seconds+(frameCount-1)*MIN_FRAME_INTERVAL,label=`${formatSeconds(spec.seconds)}-${formatSeconds(end)}`;return{url,title:`Frames ${label}`,content:streamInfo.error,error:streamInfo.error}}return{url,title:`Frame at ${options.timestamp}`,content:streamInfo.error,error:streamInfo.error}}if(spec.type==="range"){let label=`${formatSeconds(spec.start)}-${formatSeconds(spec.end)}`;if(streamInfo.duration!==null&&spec.end>streamInfo.duration){let error=`Timestamp ${formatSeconds(spec.end)} exceeds video duration (${formatSeconds(Math.floor(streamInfo.duration))})`;return{url,title:`Frames ${label}`,content:error,error}}let timestamps=frameCount?computeRangeTimestamps(spec.start,spec.end,frameCount):computeRangeTimestamps(spec.start,spec.end),result=await extractYouTubeFrames(ytInfo2.videoId,timestamps,streamInfo);return buildFrameResult(url,label,timestamps.length,result.frames,result.error,result.duration??void 0)}if(frameCount){let end=spec.seconds+(frameCount-1)*MIN_FRAME_INTERVAL,label=`${formatSeconds(spec.seconds)}-${formatSeconds(end)}`;if(streamInfo.duration!==null&&end>streamInfo.duration){let error=`Timestamp ${formatSeconds(end)} exceeds video duration (${formatSeconds(Math.floor(streamInfo.duration))})`;return{url,title:`Frames ${label}`,content:error,error}}let timestamps=computeRangeTimestamps(spec.seconds,end,frameCount),result=await extractYouTubeFrames(ytInfo2.videoId,timestamps,streamInfo);return buildFrameResult(url,label,timestamps.length,result.frames,result.error,result.duration??void 0)}if(streamInfo.duration!==null&&spec.seconds>streamInfo.duration){let error=`Timestamp ${formatSeconds(spec.seconds)} exceeds video duration (${formatSeconds(Math.floor(streamInfo.duration))})`;return{url,title:`Frame at ${options.timestamp}`,content:error,error}}let frame=await extractYouTubeFrame(ytInfo2.videoId,spec.seconds,streamInfo);return"error"in frame?{url,title:`Frame at ${options.timestamp}`,content:frame.error,error:frame.error}:{url,title:`Frame at ${options.timestamp}`,content:`Video frame at ${options.timestamp}`,error:null,thumbnail:frame}}let localVideo2=safeVideoInfo(url);if(localVideo2.status==="invalid")return{url,title:"",content:"",error:localVideo2.error};if(localVideo2.status==="video"){if(spec.type==="range"){let timestamps=frameCount?computeRangeTimestamps(spec.start,spec.end,frameCount):computeRangeTimestamps(spec.start,spec.end),result=await extractLocalFrames(localVideo2.info.absolutePath,timestamps),label=`${formatSeconds(spec.start)}-${formatSeconds(spec.end)}`;return buildFrameResult(url,label,timestamps.length,result.frames,result.error)}if(frameCount){let end=spec.seconds+(frameCount-1)*MIN_FRAME_INTERVAL,timestamps=computeRangeTimestamps(spec.seconds,end,frameCount),result=await extractLocalFrames(localVideo2.info.absolutePath,timestamps),label=`${formatSeconds(spec.seconds)}-${formatSeconds(end)}`;return buildFrameResult(url,label,timestamps.length,result.frames,result.error)}let frame=await extractVideoFrame(localVideo2.info.absolutePath,spec.seconds);return"error"in frame?{url,title:`Frame at ${options.timestamp}`,content:frame.error,error:frame.error}:{url,title:`Frame at ${options.timestamp}`,content:`Video frame at ${options.timestamp}`,error:null,thumbnail:frame}}return{url,title:"",content:"",error:"Timestamp extraction only works with YouTube and local video files"}}let localVideo=safeVideoInfo(url);if(localVideo.status==="invalid")return{url,title:"",content:"",error:localVideo.error};if(localVideo.status==="video")try{let result=await extractVideo(localVideo.info,signal,options);return signal?.aborted?abortedResult(url):result??{url,title:"",content:"",error:`Video analysis requires Gemini access. Either:
102
102
  1. Sign into gemini.google.com in Chrome (free, uses cookies)
103
103
  2. Set GEMINI_API_KEY in ${WEB_SEARCH_CONFIG_PATH}`}}catch(err){return isAbortError3(err)?abortedResult(url):{url,title:"",content:"",error:errorMessage5(err)}}try{remoteUrl||new URL(url)}catch(err){return{url,title:"",content:"",error:errorMessage5(err)}}try{let ghIssuePrResult=await extractGitHubIssuePr(url,signal,options);if(ghIssuePrResult)return ghIssuePrResult;if(signal?.aborted)return abortedResult(url)}catch(err){let message=errorMessage5(err);if(isAbortError3(err))return abortedResult(url);if(isConfigParseError(err))return{url,title:"",content:"",error:message}}try{let ghResult=await extractGitHub(url,signal,options?.forceClone);if(ghResult)return ghResult;if(signal?.aborted)return abortedResult(url)}catch(err){let message=errorMessage5(err);if(isAbortError3(err))return abortedResult(url);if(isConfigParseError(err))return{url,title:"",content:"",error:message}}let ytInfo=isYouTubeURL(url),youtubeEnabled=!1;try{youtubeEnabled=isYouTubeEnabled()}catch(err){return{url,title:"",content:"",error:errorMessage5(err)}}if(ytInfo.isYouTube&&youtubeEnabled){try{let ytResult=await extractYouTube(url,signal,options?.prompt,options?.model);if(ytResult)return ytResult;if(signal?.aborted)return abortedResult(url)}catch(err){let message=errorMessage5(err);return isAbortError3(err)?abortedResult(url):{url,title:"",content:"",error:message}}return{url,title:"",content:"",error:"Could not extract YouTube video content. Sign into Google in a supported Chromium browser for automatic access, or set GEMINI_API_KEY."}}if(signal?.aborted)return abortedResult(url);let fetchTimeoutMs;try{fetchTimeoutMs=resolveFetchTimeoutMs(options)}catch(err){return{url,title:"",content:"",error:errorMessage5(err)}}let fetchRouting;try{fetchRouting=loadFetchRouting()}catch(err){return{url,title:"",content:"",error:errorMessage5(err)}}let providerOrder=remoteUrl&&!fetchRouting.allowRemoteHostedProviders?fetchRouting.providers.filter(provider=>!REMOTE_HOSTED_FETCH_PROVIDERS.has(provider)):fetchRouting.providers;if(providerOrder.length===0)return{url,title:"",content:"",error:"Remote hosted fetch providers are disabled unless fetchRouting.allowRemoteHostedProviders is true"};let httpResult=null,declaredLinks=[],withDeclaredLinks=result=>({...result,content:appendDeclaredWebLinks(result.content,declaredLinks)}),parseErrorResult=message=>httpResult?{...httpResult,error:message}:{url,title:"",content:"",error:message},runHttpProvider=async()=>{let{declaredLinks:discoveredLinks=[],...result}=await extractViaHttp(url,fetchTimeoutMs,signal,options);return httpResult=result,declaredLinks=discoveredLinks,signal?.aborted?abortedResult(url):!httpResult.error||NON_RECOVERABLE_ERRORS.some(prefix=>httpResult.error.startsWith(prefix))||isRedirectPolicyError(httpResult.error)||isConfigParseError(httpResult.error)?httpResult:null},firecrawlError=null,crawl4aiError=null,tinyfishError=null,search1apiError=null,queritError=null,kagiError=null,ollamaError=null,parallelError=null,parallelMcpError=null,brightdataError=null;if(remoteUrl&&providerOrder[0]!=="http"){let httpGateResult=await runHttpProvider();if(httpGateResult)return httpGateResult}for(let provider of providerOrder){if(signal?.aborted)return abortedResult(url);if(provider==="http"){let result=await runHttpProvider();if(result)return result;continue}if(provider==="firecrawl"){try{if(isFirecrawlAvailable()){let ssrf=loadSsrfConfig(),firecrawlResult=await extractWithFirecrawl(url,signal,{timeoutMs:options?.timeoutMs,...options?.lookup?{lookup:options.lookup}:{},ssrf});if(firecrawlResult)return withDeclaredLinks(firecrawlResult)}}catch(err){if(isAbortError3(err))return abortedResult(url);if(firecrawlError=errorMessage5(err),isConfigParseError(err))return parseErrorResult(firecrawlError)}continue}if(provider==="crawl4ai"){try{if(isCrawl4aiAvailable()){let ssrf=loadSsrfConfig(),crawl4aiResult=await extractWithCrawl4ai(url,signal,{timeoutMs:options?.timeoutMs,...options?.lookup?{lookup:options.lookup}:{},ssrf});if(crawl4aiResult)return withDeclaredLinks(crawl4aiResult)}}catch(err){if(signal?.aborted||isAbortException2(err))return abortedResult(url);if(crawl4aiError=errorMessage5(err),isConfigParseError(err))return parseErrorResult(crawl4aiError)}continue}if(provider==="jina"){let jinaResult=await extractWithJinaReader(url,fetchTimeoutMs,signal,options?.lookup);if(jinaResult)return withDeclaredLinks(jinaResult);continue}if(provider==="tinyfish"){try{if(isTinyFishAvailable()){let tinyfishResult=await extractWithTinyFish(url,signal,options);if(tinyfishResult)return withDeclaredLinks(tinyfishResult)}}catch(err){if(isAbortError3(err))return abortedResult(url);if(tinyfishError=errorMessage5(err),isConfigParseError(err))return parseErrorResult(tinyfishError)}continue}if(provider==="search1api"){try{if(isSearch1APIAvailable()){let search1apiResult=await extractWithSearch1API(url,signal,options);if(search1apiResult)return withDeclaredLinks(search1apiResult)}}catch(err){if(isAbortError3(err))return abortedResult(url);if(search1apiError=errorMessage5(err),isConfigParseError(err))return parseErrorResult(search1apiError)}continue}if(provider==="querit"){try{if(isQueritAvailable()){let queritResult=await extractWithQuerit(url,signal,options);if(queritResult)return withDeclaredLinks(queritResult)}}catch(err){if(isAbortError3(err))return abortedResult(url);if(queritError=errorMessage5(err),isConfigParseError(err))return parseErrorResult(queritError)}continue}if(provider==="kagi"){try{if(isKagiExtractAvailable()){let ssrf=loadSsrfConfig(),kagiResult=await extractWithKagi(url,signal,{timeoutMs:options?.timeoutMs,...options?.lookup?{lookup:options.lookup}:{},ssrf});if(kagiResult)return withDeclaredLinks(kagiResult)}}catch(err){if(isAbortError3(err))return abortedResult(url);if(kagiError=errorMessage5(err),isConfigParseError(err))return parseErrorResult(kagiError)}continue}if(provider==="ollama"){try{if(isOllamaFetchAvailable()){let ssrf=loadSsrfConfig(),ollamaResult=await extractWithOllama(url,signal,{timeoutMs:options?.timeoutMs,...options?.lookup?{lookup:options.lookup}:{},ssrf});if(ollamaResult)return withDeclaredLinks(ollamaResult)}}catch(err){if(isAbortError3(err))return abortedResult(url);if(ollamaError=errorMessage5(err),isConfigParseError(err))return parseErrorResult(ollamaError)}continue}if(provider==="parallel"){try{if(isParallelAvailable()){let parallelResult=await extractWithParallel(url,signal,options);if(parallelResult)return withDeclaredLinks(parallelResult)}}catch(err){if(isAbortError3(err))return abortedResult(url);if(parallelError=errorMessage5(err),isConfigParseError(err))return parseErrorResult(parallelError)}continue}if(provider==="parallel-mcp"){try{let parallelMcpResult=await extractWithParallelMcp(url,signal,options);if(parallelMcpResult)return withDeclaredLinks(parallelMcpResult)}catch(err){if(isAbortError3(err))return abortedResult(url);if(parallelMcpError=errorMessage5(err),isConfigParseError(err))return parseErrorResult(parallelMcpError)}continue}if(provider==="brightdata"){try{if(isBrightDataUnlockerAvailable()){let ssrf=loadSsrfConfig(),brightdataResult=await extractWithBrightDataUnlocker(url,signal,{timeoutMs:options?.timeoutMs,...options?.lookup?{lookup:options.lookup}:{},ssrf});if(brightdataResult)return withDeclaredLinks(brightdataResult)}}catch(err){if(isAbortError3(err))return abortedResult(url);if(brightdataError=errorMessage5(err),isConfigParseError(err))return parseErrorResult(brightdataError)}continue}if(provider==="gemini"){let geminiResult=null;try{geminiResult=await extractWithUrlContext(url,signal)??await extractWithGeminiWeb(url,signal)}catch(err){if(isAbortError3(err))return abortedResult(url);if(err instanceof CredentialResolutionError||isConfigParseError(err))return parseErrorResult(errorMessage5(err))}if(geminiResult)return withDeclaredLinks(geminiResult)}}if(signal?.aborted)return abortedResult(url);let finalHttpResult=httpResult;if(finalHttpResult&&declaredLinks.length>0)return{...finalHttpResult,error:null};if(finalHttpResult?.status===404||finalHttpResult?.status===410)return{...finalHttpResult,error:notFoundGuidance(finalHttpResult,options?.toolNames)};let searchToolName=options?.toolNames?.webSearch,guidance=[finalHttpResult?.error??"No fetch_content provider returned content",...firecrawlError?[`Firecrawl fallback failed: ${firecrawlError}`]:[],...crawl4aiError?[`Crawl4AI fallback failed: ${crawl4aiError}`]:[],...tinyfishError?[`TinyFish fallback failed: ${tinyfishError}`]:[],...search1apiError?[`Search1API fallback failed: ${search1apiError}`]:[],...queritError?[`Querit fallback failed: ${queritError}`]:[],...kagiError?[`Kagi fallback failed: ${kagiError}`]:[],...ollamaError?[`Ollama fallback failed: ${ollamaError}`]:[],...parallelError?[`Parallel fallback failed: ${parallelError}`]:[],...parallelMcpError?[`Parallel MCP fallback failed: ${parallelMcpError}`]:[],...brightdataError?[`Bright Data fallback failed: ${brightdataError}`]:[],"","Fallback options:",` \u2022 Set firecrawlBaseUrl in ${WEB_SEARCH_CONFIG_PATH} to a self-hosted Firecrawl instance`,` \u2022 Set crawl4aiBaseUrl in ${WEB_SEARCH_CONFIG_PATH} to a self-hosted Crawl4AI instance`,` \u2022 Set tinyfishApiKey in ${WEB_SEARCH_CONFIG_PATH} or TINYFISH_API_KEY`,` \u2022 Set search1apiApiKey in ${WEB_SEARCH_CONFIG_PATH} or SEARCH1API_KEY`,` \u2022 Set queritApiKey in ${WEB_SEARCH_CONFIG_PATH} or QUERIT_API_KEY`,` \u2022 Set kagiApiKey in ${WEB_SEARCH_CONFIG_PATH} or KAGI_API_KEY`,` \u2022 Set ollamaApiKey in ${WEB_SEARCH_CONFIG_PATH} or OLLAMA_API_KEY`,` \u2022 Set parallelApiKey in ${WEB_SEARCH_CONFIG_PATH} or PARALLEL_API_KEY`,` \u2022 Set brightdataApiKey and brightdataUnlockerZone in ${WEB_SEARCH_CONFIG_PATH} or BRIGHTDATA_API_KEY and BRIGHTDATA_UNLOCKER_ZONE`,` \u2022 Set GEMINI_API_KEY in ${WEB_SEARCH_CONFIG_PATH}`," \u2022 Sign into gemini.google.com in Chrome",...searchToolName?[` \u2022 Use ${searchToolName} to find content about this topic`]:[]].join(`
104
- `);return{...finalHttpResult??{url,title:"",content:"",error:null},error:guidance}}function isLikelyJSRendered(html){let bodyMatch=html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);if(!bodyMatch)return!1;let textContent=bodyMatch[1].replace(/<script[\s\S]*?<\/script>/gi,"").replace(/<style[\s\S]*?<\/style>/gi,"").replace(/<[^>]+>/g,"").replace(/\s+/g," ").trim(),scriptCount=(html.match(/<script/gi)||[]).length;return textContent.length<500&&scriptCount>3}async function readPDFResponseBuffer(response,maxSizeMB){let maxBytes=maxSizeMB*1024*1024;return readResponseBufferWithLimit(response,maxBytes,()=>pdfSizeLimitError(maxSizeMB))}async function readTextResponseWithLimit(response,maxBytes){let buffer=await readResponseBufferWithLimit(response,maxBytes,()=>responseSizeLimitError(maxBytes)),charset=response.headers.get("content-type")?.match(/charset\s*=\s*["']?([^;"'\s]+)/i)?.[1];try{return new TextDecoder(charset||"utf-8").decode(buffer)}catch{return new TextDecoder("utf-8").decode(buffer)}}function isTextContentType(contentType){let mimeType=contentType.split(";",1)[0]?.trim().toLowerCase()??"";return mimeType.startsWith("text/")||mimeType==="application/json"||mimeType==="application/ld+json"||mimeType==="application/xml"||mimeType==="application/xhtml+xml"||mimeType==="application/javascript"||mimeType==="application/x-javascript"||mimeType.endsWith("+json")||mimeType.endsWith("+xml")}async function readResponseBufferWithLimit(response,maxBytes,buildError){let reader=response.body?.getReader();if(!reader){let buffer=await response.arrayBuffer();if(buffer.byteLength>maxBytes)throw buildError();return buffer}let chunks=[],totalBytes=0;try{for(;;){let{done,value}=await reader.read();if(done)break;if(value){if(totalBytes+=value.byteLength,totalBytes>maxBytes)throw await reader.cancel(),buildError();chunks.push(value)}}}finally{reader.releaseLock()}let combined=new Uint8Array(totalBytes),offset=0;for(let chunk of chunks)combined.set(chunk,offset),offset+=chunk.byteLength;return combined.buffer}function pdfSizeLimitError(maxSizeMB){return new Error(`PDF exceeds configured pdf.maxSizeMB limit (${maxSizeMB} MB)`)}function responseSizeLimitError(maxBytes){return new Error(`Response too large (${Math.round(maxBytes/1024/1024)}MB)`)}async function extractViaHttp(url,timeoutMs,signal,options){let activityId=activityMonitor.logStart({type:"fetch",url}),controller=new AbortController,startedAt=Date.now(),timeoutId=setTimeout(()=>controller.abort(),timeoutMs),onAbort=()=>controller.abort();signal?.addEventListener("abort",onAbort);try{let ssrf=loadSsrfConfig(),domainPolicy=loadFetchContentDomainPolicy(),authProfile=options?.authFetchProfile,trustEnvProxy=options?.proxy===void 0&&ssrf.trustEnvProxy,requestInit={signal:controller.signal,__proxy:options?.proxy,headers:{"User-Agent":"OpenAI File Downloader, XaiImageApiFetch/1.0",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cache-Control":"no-cache","Sec-Fetch-Dest":"document","Sec-Fetch-Mode":"navigate","Sec-Fetch-Site":"none","Sec-Fetch-User":"?1","Upgrade-Insecure-Requests":"1"}},response=authProfile?await fetchAuthenticatedRemoteUrl(url,requestInit,{ssrf:{...ssrf,trustEnvProxy},domainPolicy,...options?.lookup?{lookup:options.lookup}:{}},authProfile):await fetchRemoteUrl(url,requestInit,{allowRanges:ssrf.allowRanges,trustEnvProxy,domainPolicy,...options?.lookup?{lookup:options.lookup}:{}});if(!response.ok&&options?.mode!=="raw")return activityMonitor.logComplete(activityId,response.status),{url,title:"",content:"",error:`HTTP ${response.status}: ${response.statusText}`,status:response.status};let contentLengthHeader=response.headers.get("content-length"),contentType=response.headers.get("content-type")||"",mimeType=contentType.split(";",1)[0]?.trim().toLowerCase()??"",isPDFContent=isPDF(url,contentType),pdfConfig=isPDFContent?loadPDFConfig():null;if(isPDFContent&&pdfConfig&&!pdfConfig.enabled)return activityMonitor.logComplete(activityId,response.status),{url,title:"",content:"",error:"PDF extraction is disabled by pdf.enabled",mimeType,status:response.status};let maxResponseSize=(pdfConfig?.maxSizeMB??5)*1024*1024;if(contentLengthHeader){let contentLength=Number.parseInt(contentLengthHeader,10);if(Number.isFinite(contentLength)&&contentLength>maxResponseSize)return activityMonitor.logComplete(activityId,response.status),{url,title:"",content:"",error:pdfConfig?pdfSizeLimitError(pdfConfig.maxSizeMB).message:`Response too large (${Math.round(contentLength/1024/1024)}MB)`}}if(options?.mode==="raw"){if(!isTextContentType(contentType))return activityMonitor.logComplete(activityId,response.status),{url,title:"",content:"",error:`Unsupported content type in raw mode: ${mimeType||"missing"}`,mimeType,status:response.status};let text2=await readTextResponseWithLimit(response,maxResponseSize);return activityMonitor.logComplete(activityId,response.status),{url,title:extractTextTitle(text2,url),content:text2,error:null,mimeType,status:response.status}}if(SUPPORTED_IMAGE_TYPES.has(mimeType)){let disabled=imageGateError();if(disabled)return activityMonitor.logComplete(activityId,response.status),{url,title:"",content:"",error:disabled,mimeType,status:response.status};try{let buffer=await readResponseBufferWithLimit(response,maxResponseSize,()=>responseSizeLimitError(maxResponseSize)),{resizeImage}=await import("./host-WP3MVKS2.js"),resized=await resizeImage(new Uint8Array(buffer),mimeType,{maxWidth:2e3,maxHeight:2e3});if(activityMonitor.logComplete(activityId,response.status),!resized)return{url,title:"",content:"",error:`Could not decode image: ${mimeType}`,mimeType,status:response.status};let title=new URL(response.url||url).pathname.split("/").pop()||url;return{url,title,content:`Image fetched (${resized.width}\xD7${resized.height}, ${resized.mimeType})`,error:null,thumbnail:{data:resized.data,mimeType:resized.mimeType},mimeType:resized.mimeType,status:response.status}}catch(err){let message=errorMessage5(err);return activityMonitor.logError(activityId,message),{url,title:"",content:"",error:message,mimeType,status:response.status}}}if(isPDFContent&&pdfConfig)try{let buffer=await readPDFResponseBuffer(response,pdfConfig.maxSizeMB);if(signal?.aborted)return abortedResult(url);let result=await extractPDFToMarkdown(buffer,url,{signal});return activityMonitor.logComplete(activityId,response.status),{url,title:result.title,content:`PDF extracted and saved to: ${result.outputPath}
104
+ `);return{...finalHttpResult??{url,title:"",content:"",error:null},error:guidance}}function isLikelyJSRendered(html){let bodyMatch=html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);if(!bodyMatch)return!1;let textContent=bodyMatch[1].replace(/<script[\s\S]*?<\/script>/gi,"").replace(/<style[\s\S]*?<\/style>/gi,"").replace(/<[^>]+>/g,"").replace(/\s+/g," ").trim(),scriptCount=(html.match(/<script/gi)||[]).length;return textContent.length<500&&scriptCount>3}async function readPDFResponseBuffer(response,maxSizeMB){let maxBytes=maxSizeMB*1024*1024;return readResponseBufferWithLimit(response,maxBytes,()=>pdfSizeLimitError(maxSizeMB))}async function readTextResponseWithLimit(response,maxBytes){let buffer=await readResponseBufferWithLimit(response,maxBytes,()=>responseSizeLimitError(maxBytes)),charset=response.headers.get("content-type")?.match(/charset\s*=\s*["']?([^;"'\s]+)/i)?.[1];try{return new TextDecoder(charset||"utf-8").decode(buffer)}catch{return new TextDecoder("utf-8").decode(buffer)}}function isTextContentType(contentType){let mimeType=contentType.split(";",1)[0]?.trim().toLowerCase()??"";return mimeType.startsWith("text/")||mimeType==="application/json"||mimeType==="application/ld+json"||mimeType==="application/xml"||mimeType==="application/xhtml+xml"||mimeType==="application/javascript"||mimeType==="application/x-javascript"||mimeType.endsWith("+json")||mimeType.endsWith("+xml")}async function readResponseBufferWithLimit(response,maxBytes,buildError){let reader=response.body?.getReader();if(!reader){let buffer=await response.arrayBuffer();if(buffer.byteLength>maxBytes)throw buildError();return buffer}let chunks=[],totalBytes=0;try{for(;;){let{done,value}=await reader.read();if(done)break;if(value){if(totalBytes+=value.byteLength,totalBytes>maxBytes)throw await reader.cancel(),buildError();chunks.push(value)}}}finally{reader.releaseLock()}let combined=new Uint8Array(totalBytes),offset=0;for(let chunk of chunks)combined.set(chunk,offset),offset+=chunk.byteLength;return combined.buffer}function pdfSizeLimitError(maxSizeMB){return new Error(`PDF exceeds configured pdf.maxSizeMB limit (${maxSizeMB} MB)`)}function responseSizeLimitError(maxBytes){return new Error(`Response too large (${Math.round(maxBytes/1024/1024)}MB)`)}async function extractViaHttp(url,timeoutMs,signal,options){let activityId=activityMonitor.logStart({type:"fetch",url}),controller=new AbortController,startedAt=Date.now(),timeoutId=setTimeout(()=>controller.abort(),timeoutMs),onAbort=()=>controller.abort();signal?.addEventListener("abort",onAbort);try{let ssrf=loadSsrfConfig(),domainPolicy=loadFetchContentDomainPolicy(),authProfile=options?.authFetchProfile,trustEnvProxy=options?.proxy===void 0&&ssrf.trustEnvProxy,requestInit={signal:controller.signal,__proxy:options?.proxy,headers:{"User-Agent":"OpenAI File Downloader, XaiImageApiFetch/1.0",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cache-Control":"no-cache","Sec-Fetch-Dest":"document","Sec-Fetch-Mode":"navigate","Sec-Fetch-Site":"none","Sec-Fetch-User":"?1","Upgrade-Insecure-Requests":"1"}},response=authProfile?await fetchAuthenticatedRemoteUrl(url,requestInit,{ssrf:{...ssrf,trustEnvProxy},domainPolicy,...options?.lookup?{lookup:options.lookup}:{}},authProfile):await fetchRemoteUrl(url,requestInit,{allowRanges:ssrf.allowRanges,trustEnvProxy,domainPolicy,...options?.lookup?{lookup:options.lookup}:{}});if(!response.ok&&options?.mode!=="raw")return activityMonitor.logComplete(activityId,response.status),{url,title:"",content:"",error:`HTTP ${response.status}: ${response.statusText}`,status:response.status};let contentLengthHeader=response.headers.get("content-length"),contentType=response.headers.get("content-type")||"",mimeType=contentType.split(";",1)[0]?.trim().toLowerCase()??"",isPDFContent=isPDF(url,contentType),pdfConfig=isPDFContent?loadPDFConfig():null;if(isPDFContent&&pdfConfig&&!pdfConfig.enabled)return activityMonitor.logComplete(activityId,response.status),{url,title:"",content:"",error:"PDF extraction is disabled by pdf.enabled",mimeType,status:response.status};let maxResponseSize=(pdfConfig?.maxSizeMB??5)*1024*1024;if(contentLengthHeader){let contentLength=Number.parseInt(contentLengthHeader,10);if(Number.isFinite(contentLength)&&contentLength>maxResponseSize)return activityMonitor.logComplete(activityId,response.status),{url,title:"",content:"",error:pdfConfig?pdfSizeLimitError(pdfConfig.maxSizeMB).message:`Response too large (${Math.round(contentLength/1024/1024)}MB)`}}if(options?.mode==="raw"){if(!isTextContentType(contentType))return activityMonitor.logComplete(activityId,response.status),{url,title:"",content:"",error:`Unsupported content type in raw mode: ${mimeType||"missing"}`,mimeType,status:response.status};let text2=await readTextResponseWithLimit(response,maxResponseSize);return activityMonitor.logComplete(activityId,response.status),{url,title:extractTextTitle(text2,url),content:text2,error:null,mimeType,status:response.status}}if(SUPPORTED_IMAGE_TYPES.has(mimeType)){let disabled=imageGateError();if(disabled)return activityMonitor.logComplete(activityId,response.status),{url,title:"",content:"",error:disabled,mimeType,status:response.status};try{let buffer=await readResponseBufferWithLimit(response,maxResponseSize,()=>responseSizeLimitError(maxResponseSize)),{resizeImage}=await import("./host-WP3MVKS2.js"),resized=await resizeImage(new Uint8Array(buffer),mimeType,{maxWidth:2e3,maxHeight:2e3});if(activityMonitor.logComplete(activityId,response.status),!resized)return{url,title:"",content:"",error:`Could not decode image: ${mimeType}`,mimeType,status:response.status};let title=new URL(response.url||url).pathname.split("/").pop()||url;return{url,title,content:`Image fetched (${resized.width}\xD7${resized.height}, ${resized.mimeType})`,error:null,thumbnail:{data:resized.data,mimeType:resized.mimeType},mimeType:resized.mimeType,status:response.status}}catch(err){let message=errorMessage5(err);return activityMonitor.logError(activityId,message),{url,title:"",content:"",error:message,mimeType,status:response.status}}}if(isPDFContent&&pdfConfig)try{let buffer=await readPDFResponseBuffer(response,pdfConfig.maxSizeMB);if(signal?.aborted)return abortedResult(url);let result=await extractPDFToMarkdown(buffer,url,{signal});return activityMonitor.logComplete(activityId,response.status),{url,title:result.title,content:options?.mode==="answer"?result.content:`PDF extracted and saved to: ${result.outputPath}
105
105
 
106
106
  Pages: ${result.pages}
107
107
  Characters: ${result.chars}`,error:null}}catch(err){let message=err instanceof Error?err.message:String(err);return activityMonitor.logError(activityId,message),message.startsWith("PDF exceeds configured pdf.maxSizeMB limit")?{url,title:"",content:"",error:message}:err instanceof CredentialResolutionError||isConfigParseError(err)?{url,title:"",content:"",error:message}:{url,title:"",content:"",error:`PDF extraction failed: ${message}`}}if(contentType.includes("application/octet-stream")||contentType.includes("image/")||contentType.includes("audio/")||contentType.includes("video/")||contentType.includes("application/zip"))return activityMonitor.logComplete(activityId,response.status),{url,title:"",content:"",error:`Unsupported content type: ${contentType.split(";")[0]}`};let text=await readTextResponseWithLimit(response,maxResponseSize);if(!(contentType.includes("text/html")||contentType.includes("application/xhtml+xml"))){activityMonitor.logComplete(activityId,response.status);let title=extractTextTitle(text,url);return{url,title,content:text,error:null}}let{parseHTML}=await import("./esm-E7UVEYTO.js"),{document}=parseHTML(text),documentTitle=document.title?.trim()??"",declaredLinks=discoverDeclaredWebLinks(document,response.headers.get("link"),response.url||url),{Readability}=await import("./readability-LAGF34IB.js"),article=new Readability(document).parse();if(!article){let rscResult=extractRSCContent(text);if(rscResult&&rscResult.content.length>=MIN_USEFUL_CONTENT)return activityMonitor.logComplete(activityId,response.status),{url,title:rscResult.title,content:appendDeclaredWebLinks(rscResult.content,declaredLinks),error:null,declaredLinks};controller.signal.throwIfAborted();let defuddleResult=await extractWithDefuddle(text,response.url||url);if(controller.signal.throwIfAborted(),defuddleResult&&defuddleResult.content.length>=MIN_USEFUL_CONTENT)return activityMonitor.logComplete(activityId,response.status),{url,title:documentTitle||defuddleResult.title,content:appendDeclaredWebLinks(defuddleResult.content,declaredLinks),error:null,declaredLinks};activityMonitor.logComplete(activityId,response.status);let errorMsg=isLikelyJSRendered(text)?"Page appears to be JavaScript-rendered (content loads dynamically)":"Could not extract readable content from HTML structure";return{url,title:documentTitle,content:appendDeclaredWebLinks("",declaredLinks),error:errorMsg,declaredLinks}}if(typeof article.content!="string")throw new Error("Readability returned invalid article content");let markdown=(await getTurndown()).turndown(article.content);if(activityMonitor.logComplete(activityId,response.status),markdown.length<MIN_USEFUL_CONTENT){let rscResult=extractRSCContent(text);if(rscResult&&rscResult.content.length>=MIN_USEFUL_CONTENT)return{url,title:rscResult.title,content:appendDeclaredWebLinks(rscResult.content,declaredLinks),error:null,declaredLinks};controller.signal.throwIfAborted();let defuddleResult=await extractWithDefuddle(text,response.url||url);return controller.signal.throwIfAborted(),defuddleResult&&defuddleResult.content.length>=MIN_USEFUL_CONTENT?{url,title:article.title||documentTitle||defuddleResult.title,content:appendDeclaredWebLinks(defuddleResult.content,declaredLinks),error:null,declaredLinks}:{url,title:article.title||documentTitle,content:appendDeclaredWebLinks(markdown,declaredLinks),error:isLikelyJSRendered(text)?"Page appears to be JavaScript-rendered (content loads dynamically)":"Extracted content appears incomplete",declaredLinks}}return{url,title:article.title||documentTitle,content:appendDeclaredWebLinks(markdown,declaredLinks),error:null,declaredLinks}}catch(err){let message=err instanceof Error?err.message:String(err);return message.toLowerCase().includes("abort")?activityMonitor.logComplete(activityId,0):activityMonitor.logError(activityId,message),{url,title:"",content:"",error:message}}finally{if(clearTimeout(timeoutId),signal?.removeEventListener("abort",onAbort),signal?.aborted)return abortedResult(url);if(controller.signal.aborted||Date.now()-startedAt>=timeoutMs)return{url,title:"",content:"",error:"The operation was aborted."}}}function extractHeadingTitle(text){let match=text.match(/^#{1,2}\s+(.+)/m);return match&&match[1].replace(/\*+/g,"").trim()||null}function extractTextTitle(text,url){return extractHeadingTitle(text)??(new URL(url).pathname.split("/").pop()||url)}async function fetchAllContent(urls,signal,options){let results=await Promise.all(urls.map(url=>fetchLimit(()=>extractContent(url,signal,options))));return options?.mode==="raw"?results:results.map((result,index)=>{if(!result.content)return result;let sanitized=sanitizeInlineDataUris(result.content,`urls[${index}].content`);return sanitized.omissions.length>0?{...result,content:sanitized.text}:result})}export{extractContent,extractHeadingTitle,fetchAllContent,loadSsrfAllowRanges,loadSsrfConfig,readPDFResponseBuffer,resolveFetchTimeoutMs};
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
3
- import{configureHttpDispatcher,main}from"./chunks/chunk-ADQYVZ6A.js";import"./chunks/chunk-D6HHRSB5.js";import{APP_NAME,ENV_PREFIX}from"./chunks/chunk-LI2YVPWP.js";import"./chunks/chunk-NMPIM7MN.js";import"./chunks/chunk-SGTGQNNP.js";import"./chunks/chunk-ECWELYBH.js";import"./chunks/chunk-74NVHVNZ.js";import"./chunks/chunk-PL7O7J4J.js";import"./chunks/chunk-7T6XCLJF.js";import"./chunks/chunk-USJZMAIR.js";import"./chunks/chunk-7DDKXS2Q.js";import"./chunks/chunk-D7XAASZM.js";import"./chunks/chunk-E6KP6V7F.js";import"./chunks/chunk-72KO4OMP.js";import"./chunks/chunk-JXWJOIH4.js";function setupCli(){process.title=APP_NAME,process.env.PI_CODING_AGENT="true",process.env[`${ENV_PREFIX}_CODING_AGENT`]="true",process.env.AI_AGENT="pi",process.emitWarning=(()=>{}),configureHttpDispatcher()}setupCli();main(process.argv.slice(2));
3
+ import{configureHttpDispatcher,main}from"./chunks/chunk-WKLAQTQ4.js";import"./chunks/chunk-S43N4JYF.js";import{APP_NAME,ENV_PREFIX}from"./chunks/chunk-LI2YVPWP.js";import"./chunks/chunk-CBTAWCW5.js";import"./chunks/chunk-SGTGQNNP.js";import"./chunks/chunk-ECWELYBH.js";import"./chunks/chunk-74NVHVNZ.js";import"./chunks/chunk-PL7O7J4J.js";import"./chunks/chunk-7T6XCLJF.js";import"./chunks/chunk-USJZMAIR.js";import"./chunks/chunk-7DDKXS2Q.js";import"./chunks/chunk-D7XAASZM.js";import"./chunks/chunk-E6KP6V7F.js";import"./chunks/chunk-72KO4OMP.js";import"./chunks/chunk-JXWJOIH4.js";function setupCli(){process.title=APP_NAME,process.env.PI_CODING_AGENT="true",process.env[`${ENV_PREFIX}_CODING_AGENT`]="true",process.env.AI_AGENT="pi",process.emitWarning=(()=>{}),configureHttpDispatcher()}setupCli();main(process.argv.slice(2));
@@ -1,2 +1,2 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
2
- import{AgentExecInputError,AgentSession,AgentSessionRuntime,ArminComponent,AssistantMessageComponent,BashExecutionComponent,BorderedLoader,BranchSummaryMessageComponent,CURRENT_SESSION_VERSION,CompactionSummaryMessageComponent,CredentialSynchronizationError,CustomEditor,CustomMessageComponent,DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,DefaultPackageManager,DefaultResourceLoader,DynamicBorder,ExtensionEditorComponent,ExtensionInputComponent,ExtensionRunner,ExtensionSelectorComponent,FooterComponent,HUMAIN_AGENT_EXECUTION_FAILURE_CODES,HUMAIN_AGENT_EXECUTION_SCHEMA_VERSION,HumainAgentArtifactSchema,HumainAgentExecutionClaimSchema,HumainAgentExecutionControlsSchema,HumainAgentExecutionOutcomeSchema,HumainAgentExecutionRequestSchema,HumainAgentExecutionResponseSchema,HumainAgentRouteRefSchema,HumainAgentUsageSchema,InteractiveMode,LoginDialogComponent,ModelRegistry,ModelRuntime,ModelSelectorComponent,OAuthSelectorComponent,ProjectTrustStore,RpcClient,SessionManager,SessionSelectorComponent,SettingsManager,SettingsSelectorComponent,ShowImagesSelectorComponent,SkillInvocationMessageComponent,Theme,ThemeSelectorComponent,ThinkingSelectorComponent,ToolExecutionComponent,TreeSelectorComponent,UserMessageComponent,UserMessageSelectorComponent,buildContextEntries,buildSessionContext,calculateContextTokens,collectEntriesForBranchSummary,compact,convertToLlm,convertToPng,copyToClipboard,createAgentSession,createAgentSessionFromServices,createAgentSessionRuntime,createAgentSessionServices,createBashTool,createBashToolDefinition,createCodingTools,createEditTool,createEditToolDefinition,createEventBus,createExtensionRuntime,createFindTool,createFindToolDefinition,createGrepTool,createGrepToolDefinition,createLocalBashOperations,createLocalPowerShellOperations,createLsTool,createLsToolDefinition,createPiAgentExecutionHost,createPowerShellTool,createPowerShellToolDefinition,createReadOnlyTools,createReadTool,createReadToolDefinition,createSyntheticSourceInfo,createWriteTool,createWriteToolDefinition,defineTool,detectSupportedImageMimeTypeFromFile,discoverAndLoadExtensions,estimateTokens,executeHumainAgentRequest,findCutPoint,findTurnStartIndex,formatSize,formatSkillsForPrompt,generateBranchSummary,generateDiffString,generateSummary,generateSummaryWithUsage,generateUnifiedPatch,getLanguageFromPath,getLastAssistantUsage,getLatestCompactionEntry,getMarkdownTheme,getPowerShellConfig,getSelectListTheme,getSettingsListTheme,getShellConfig,hasTrustRequiringProjectResources,highlightCode,initTheme,isBashToolResult,isEditToolResult,isFindToolResult,isGrepToolResult,isLsToolResult,isPowerShellToolResult,isReadToolResult,isToolCallEventType,isWriteToolResult,keyHint,keyText,loadProjectContextFiles,loadSkills,loadSkillsFromDir,main,migrateSessionEntries,parseArgs,parseFrontmatter,parseHumainAgentExecutionRequest,parseHumainAgentExecutionResponse,parseSessionEntries,parseSkillBlock,prepareBranchEntries,rawKeyHint,readStoredCredential,renderDiff,resolveCliModel,resolveModelScopeWithDiagnostics,runAgentExecMode,runPrintMode,runRpcMode,serializeConversation,sessionEntryToContextMessages,shouldCompact,stripFrontmatter,truncateHead,truncateLine,truncateTail,truncateToVisualLines,withFileMutationQueue,wrapRegisteredTool,wrapRegisteredTools}from"./chunks/chunk-ADQYVZ6A.js";import"./chunks/chunk-D6HHRSB5.js";import{CONFIG_DIR_NAME,UPSTREAM_PI_VERSION,VERSION,formatDimensionNote,getAgentDir,getDocsPath,getExamplesPath,getPackageDir,getReadmePath,resizeImage}from"./chunks/chunk-LI2YVPWP.js";import"./chunks/chunk-NMPIM7MN.js";import"./chunks/chunk-SGTGQNNP.js";import"./chunks/chunk-ECWELYBH.js";import"./chunks/chunk-74NVHVNZ.js";import"./chunks/chunk-PL7O7J4J.js";import"./chunks/chunk-7T6XCLJF.js";import"./chunks/chunk-USJZMAIR.js";import"./chunks/chunk-7DDKXS2Q.js";import"./chunks/chunk-D7XAASZM.js";import"./chunks/chunk-E6KP6V7F.js";import"./chunks/chunk-72KO4OMP.js";import"./chunks/chunk-JXWJOIH4.js";export{AgentExecInputError,AgentSession,AgentSessionRuntime,ArminComponent,AssistantMessageComponent,BashExecutionComponent,BorderedLoader,BranchSummaryMessageComponent,CONFIG_DIR_NAME,CURRENT_SESSION_VERSION,CompactionSummaryMessageComponent,CredentialSynchronizationError,CustomEditor,CustomMessageComponent,DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,DefaultPackageManager,DefaultResourceLoader,DynamicBorder,ExtensionEditorComponent,ExtensionInputComponent,ExtensionRunner,ExtensionSelectorComponent,FooterComponent,HUMAIN_AGENT_EXECUTION_FAILURE_CODES,HUMAIN_AGENT_EXECUTION_SCHEMA_VERSION,HumainAgentArtifactSchema,HumainAgentExecutionClaimSchema,HumainAgentExecutionControlsSchema,HumainAgentExecutionOutcomeSchema,HumainAgentExecutionRequestSchema,HumainAgentExecutionResponseSchema,HumainAgentRouteRefSchema,HumainAgentUsageSchema,InteractiveMode,LoginDialogComponent,ModelRegistry,ModelRuntime,ModelSelectorComponent,OAuthSelectorComponent,ProjectTrustStore,RpcClient,SessionManager,SessionSelectorComponent,SettingsManager,SettingsSelectorComponent,ShowImagesSelectorComponent,SkillInvocationMessageComponent,Theme,ThemeSelectorComponent,ThinkingSelectorComponent,ToolExecutionComponent,TreeSelectorComponent,UPSTREAM_PI_VERSION,UserMessageComponent,UserMessageSelectorComponent,VERSION,buildContextEntries,buildSessionContext,calculateContextTokens,collectEntriesForBranchSummary,compact,convertToLlm,convertToPng,copyToClipboard,createAgentSession,createAgentSessionFromServices,createAgentSessionRuntime,createAgentSessionServices,createBashTool,createBashToolDefinition,createCodingTools,createEditTool,createEditToolDefinition,createEventBus,createExtensionRuntime,createFindTool,createFindToolDefinition,createGrepTool,createGrepToolDefinition,createLocalBashOperations,createLocalPowerShellOperations,createLsTool,createLsToolDefinition,createPiAgentExecutionHost,createPowerShellTool,createPowerShellToolDefinition,createReadOnlyTools,createReadTool,createReadToolDefinition,createSyntheticSourceInfo,createWriteTool,createWriteToolDefinition,defineTool,detectSupportedImageMimeTypeFromFile,discoverAndLoadExtensions,estimateTokens,executeHumainAgentRequest,findCutPoint,findTurnStartIndex,formatDimensionNote,formatSize,formatSkillsForPrompt,generateBranchSummary,generateDiffString,generateSummary,generateSummaryWithUsage,generateUnifiedPatch,getAgentDir,getDocsPath,getExamplesPath,getLanguageFromPath,getLastAssistantUsage,getLatestCompactionEntry,getMarkdownTheme,getPackageDir,getPowerShellConfig,getReadmePath,getSelectListTheme,getSettingsListTheme,getShellConfig,hasTrustRequiringProjectResources,highlightCode,initTheme,isBashToolResult,isEditToolResult,isFindToolResult,isGrepToolResult,isLsToolResult,isPowerShellToolResult,isReadToolResult,isToolCallEventType,isWriteToolResult,keyHint,keyText,loadProjectContextFiles,loadSkills,loadSkillsFromDir,main,migrateSessionEntries,parseArgs,parseFrontmatter,parseHumainAgentExecutionRequest,parseHumainAgentExecutionResponse,parseSessionEntries,parseSkillBlock,prepareBranchEntries,rawKeyHint,readStoredCredential,renderDiff,resizeImage,resolveCliModel,resolveModelScopeWithDiagnostics,runAgentExecMode,runPrintMode,runRpcMode,serializeConversation,sessionEntryToContextMessages,shouldCompact,stripFrontmatter,truncateHead,truncateLine,truncateTail,truncateToVisualLines,withFileMutationQueue,wrapRegisteredTool,wrapRegisteredTools};
2
+ import{AgentExecInputError,AgentSession,AgentSessionRuntime,ArminComponent,AssistantMessageComponent,BashExecutionComponent,BorderedLoader,BranchSummaryMessageComponent,CURRENT_SESSION_VERSION,CompactionSummaryMessageComponent,CredentialSynchronizationError,CustomEditor,CustomMessageComponent,DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,DefaultPackageManager,DefaultResourceLoader,DynamicBorder,ExtensionEditorComponent,ExtensionInputComponent,ExtensionRunner,ExtensionSelectorComponent,FooterComponent,HUMAIN_AGENT_EXECUTION_FAILURE_CODES,HUMAIN_AGENT_EXECUTION_SCHEMA_VERSION,HumainAgentArtifactSchema,HumainAgentExecutionClaimSchema,HumainAgentExecutionControlsSchema,HumainAgentExecutionOutcomeSchema,HumainAgentExecutionRequestSchema,HumainAgentExecutionResponseSchema,HumainAgentRouteRefSchema,HumainAgentUsageSchema,InteractiveMode,LoginDialogComponent,ModelRegistry,ModelRuntime,ModelSelectorComponent,OAuthSelectorComponent,ProjectTrustStore,RpcClient,SessionManager,SessionSelectorComponent,SettingsManager,SettingsSelectorComponent,ShowImagesSelectorComponent,SkillInvocationMessageComponent,Theme,ThemeSelectorComponent,ThinkingSelectorComponent,ToolExecutionComponent,TreeSelectorComponent,UserMessageComponent,UserMessageSelectorComponent,buildContextEntries,buildSessionContext,calculateContextTokens,collectEntriesForBranchSummary,compact,convertToLlm,convertToPng,copyToClipboard,createAgentSession,createAgentSessionFromServices,createAgentSessionRuntime,createAgentSessionServices,createBashTool,createBashToolDefinition,createCodingTools,createEditTool,createEditToolDefinition,createEventBus,createExtensionRuntime,createFindTool,createFindToolDefinition,createGrepTool,createGrepToolDefinition,createLocalBashOperations,createLocalPowerShellOperations,createLsTool,createLsToolDefinition,createPiAgentExecutionHost,createPowerShellTool,createPowerShellToolDefinition,createReadOnlyTools,createReadTool,createReadToolDefinition,createSyntheticSourceInfo,createWriteTool,createWriteToolDefinition,defineTool,detectSupportedImageMimeTypeFromFile,discoverAndLoadExtensions,estimateTokens,executeHumainAgentRequest,findCutPoint,findTurnStartIndex,formatSize,formatSkillsForPrompt,generateBranchSummary,generateDiffString,generateSummary,generateSummaryWithUsage,generateUnifiedPatch,getLanguageFromPath,getLastAssistantUsage,getLatestCompactionEntry,getMarkdownTheme,getPowerShellConfig,getSelectListTheme,getSettingsListTheme,getShellConfig,hasTrustRequiringProjectResources,highlightCode,initTheme,isBashToolResult,isEditToolResult,isFindToolResult,isGrepToolResult,isLsToolResult,isPowerShellToolResult,isReadToolResult,isToolCallEventType,isWriteToolResult,keyHint,keyText,loadProjectContextFiles,loadSkills,loadSkillsFromDir,main,migrateSessionEntries,parseArgs,parseFrontmatter,parseHumainAgentExecutionRequest,parseHumainAgentExecutionResponse,parseSessionEntries,parseSkillBlock,prepareBranchEntries,rawKeyHint,readStoredCredential,renderDiff,resolveCliModel,resolveModelScopeWithDiagnostics,runAgentExecMode,runPrintMode,runRpcMode,serializeConversation,sessionEntryToContextMessages,shouldCompact,stripFrontmatter,truncateHead,truncateLine,truncateTail,truncateToVisualLines,withFileMutationQueue,wrapRegisteredTool,wrapRegisteredTools}from"./chunks/chunk-WKLAQTQ4.js";import"./chunks/chunk-S43N4JYF.js";import{CONFIG_DIR_NAME,UPSTREAM_PI_VERSION,VERSION,formatDimensionNote,getAgentDir,getDocsPath,getExamplesPath,getPackageDir,getReadmePath,resizeImage}from"./chunks/chunk-LI2YVPWP.js";import"./chunks/chunk-CBTAWCW5.js";import"./chunks/chunk-SGTGQNNP.js";import"./chunks/chunk-ECWELYBH.js";import"./chunks/chunk-74NVHVNZ.js";import"./chunks/chunk-PL7O7J4J.js";import"./chunks/chunk-7T6XCLJF.js";import"./chunks/chunk-USJZMAIR.js";import"./chunks/chunk-7DDKXS2Q.js";import"./chunks/chunk-D7XAASZM.js";import"./chunks/chunk-E6KP6V7F.js";import"./chunks/chunk-72KO4OMP.js";import"./chunks/chunk-JXWJOIH4.js";export{AgentExecInputError,AgentSession,AgentSessionRuntime,ArminComponent,AssistantMessageComponent,BashExecutionComponent,BorderedLoader,BranchSummaryMessageComponent,CONFIG_DIR_NAME,CURRENT_SESSION_VERSION,CompactionSummaryMessageComponent,CredentialSynchronizationError,CustomEditor,CustomMessageComponent,DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,DefaultPackageManager,DefaultResourceLoader,DynamicBorder,ExtensionEditorComponent,ExtensionInputComponent,ExtensionRunner,ExtensionSelectorComponent,FooterComponent,HUMAIN_AGENT_EXECUTION_FAILURE_CODES,HUMAIN_AGENT_EXECUTION_SCHEMA_VERSION,HumainAgentArtifactSchema,HumainAgentExecutionClaimSchema,HumainAgentExecutionControlsSchema,HumainAgentExecutionOutcomeSchema,HumainAgentExecutionRequestSchema,HumainAgentExecutionResponseSchema,HumainAgentRouteRefSchema,HumainAgentUsageSchema,InteractiveMode,LoginDialogComponent,ModelRegistry,ModelRuntime,ModelSelectorComponent,OAuthSelectorComponent,ProjectTrustStore,RpcClient,SessionManager,SessionSelectorComponent,SettingsManager,SettingsSelectorComponent,ShowImagesSelectorComponent,SkillInvocationMessageComponent,Theme,ThemeSelectorComponent,ThinkingSelectorComponent,ToolExecutionComponent,TreeSelectorComponent,UPSTREAM_PI_VERSION,UserMessageComponent,UserMessageSelectorComponent,VERSION,buildContextEntries,buildSessionContext,calculateContextTokens,collectEntriesForBranchSummary,compact,convertToLlm,convertToPng,copyToClipboard,createAgentSession,createAgentSessionFromServices,createAgentSessionRuntime,createAgentSessionServices,createBashTool,createBashToolDefinition,createCodingTools,createEditTool,createEditToolDefinition,createEventBus,createExtensionRuntime,createFindTool,createFindToolDefinition,createGrepTool,createGrepToolDefinition,createLocalBashOperations,createLocalPowerShellOperations,createLsTool,createLsToolDefinition,createPiAgentExecutionHost,createPowerShellTool,createPowerShellToolDefinition,createReadOnlyTools,createReadTool,createReadToolDefinition,createSyntheticSourceInfo,createWriteTool,createWriteToolDefinition,defineTool,detectSupportedImageMimeTypeFromFile,discoverAndLoadExtensions,estimateTokens,executeHumainAgentRequest,findCutPoint,findTurnStartIndex,formatDimensionNote,formatSize,formatSkillsForPrompt,generateBranchSummary,generateDiffString,generateSummary,generateSummaryWithUsage,generateUnifiedPatch,getAgentDir,getDocsPath,getExamplesPath,getLanguageFromPath,getLastAssistantUsage,getLatestCompactionEntry,getMarkdownTheme,getPackageDir,getPowerShellConfig,getReadmePath,getSelectListTheme,getSettingsListTheme,getShellConfig,hasTrustRequiringProjectResources,highlightCode,initTheme,isBashToolResult,isEditToolResult,isFindToolResult,isGrepToolResult,isLsToolResult,isPowerShellToolResult,isReadToolResult,isToolCallEventType,isWriteToolResult,keyHint,keyText,loadProjectContextFiles,loadSkills,loadSkillsFromDir,main,migrateSessionEntries,parseArgs,parseFrontmatter,parseHumainAgentExecutionRequest,parseHumainAgentExecutionResponse,parseSessionEntries,parseSkillBlock,prepareBranchEntries,rawKeyHint,readStoredCredential,renderDiff,resizeImage,resolveCliModel,resolveModelScopeWithDiagnostics,runAgentExecMode,runPrintMode,runRpcMode,serializeConversation,sessionEntryToContextMessages,shouldCompact,stripFrontmatter,truncateHead,truncateLine,truncateTail,truncateToVisualLines,withFileMutationQueue,wrapRegisteredTool,wrapRegisteredTools};
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
3
- import{configureHttpDispatcher,main}from"./chunks/chunk-ADQYVZ6A.js";import"./chunks/chunk-D6HHRSB5.js";import{APP_NAME}from"./chunks/chunk-LI2YVPWP.js";import"./chunks/chunk-NMPIM7MN.js";import"./chunks/chunk-SGTGQNNP.js";import"./chunks/chunk-ECWELYBH.js";import"./chunks/chunk-74NVHVNZ.js";import"./chunks/chunk-PL7O7J4J.js";import"./chunks/chunk-7T6XCLJF.js";import"./chunks/chunk-USJZMAIR.js";import"./chunks/chunk-7DDKXS2Q.js";import"./chunks/chunk-D7XAASZM.js";import"./chunks/chunk-E6KP6V7F.js";import"./chunks/chunk-72KO4OMP.js";import"./chunks/chunk-JXWJOIH4.js";process.title=`${APP_NAME}-rpc`;process.env.PI_CODING_AGENT="true";process.env.AI_AGENT="pi";process.emitWarning=(()=>{});configureHttpDispatcher();main(["--mode","rpc",...process.argv.slice(2)]);
3
+ import{configureHttpDispatcher,main}from"./chunks/chunk-WKLAQTQ4.js";import"./chunks/chunk-S43N4JYF.js";import{APP_NAME}from"./chunks/chunk-LI2YVPWP.js";import"./chunks/chunk-CBTAWCW5.js";import"./chunks/chunk-SGTGQNNP.js";import"./chunks/chunk-ECWELYBH.js";import"./chunks/chunk-74NVHVNZ.js";import"./chunks/chunk-PL7O7J4J.js";import"./chunks/chunk-7T6XCLJF.js";import"./chunks/chunk-USJZMAIR.js";import"./chunks/chunk-7DDKXS2Q.js";import"./chunks/chunk-D7XAASZM.js";import"./chunks/chunk-E6KP6V7F.js";import"./chunks/chunk-72KO4OMP.js";import"./chunks/chunk-JXWJOIH4.js";process.title=`${APP_NAME}-rpc`;process.env.PI_CODING_AGENT="true";process.env.AI_AGENT="pi";process.emitWarning=(()=>{});configureHttpDispatcher();main(["--mode","rpc",...process.argv.slice(2)]);
@@ -13,6 +13,7 @@
13
13
  */
14
14
  import type { Message } from "@earendil-works/pi-ai";
15
15
  import { Type } from "typebox";
16
+ import type { ResourceDiagnostic } from "../diagnostics.ts";
16
17
  import type { ToolDefinition } from "../extensions/types.ts";
17
18
  export { SUBAGENT_DEPTH_ENV } from "./subagent-env.ts";
18
19
  import { type SubagentIsolation, type SubagentMergeOutcome } from "./subagent-worktree.ts";
@@ -29,6 +30,7 @@ export interface AgentConfig {
29
30
  export interface AgentDiscoveryResult {
30
31
  agents: AgentConfig[];
31
32
  projectAgentsDir: string | null;
33
+ diagnostics: ResourceDiagnostic[];
32
34
  }
33
35
  export declare function discoverAgents(cwd: string, scope: AgentScope): AgentDiscoveryResult;
34
36
  export interface SubagentUsageStats {
@@ -1 +1 @@
1
- {"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../../src/core/tools/subagent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../../src/core/tools/subagent.ts"],"names":[],"mappings":"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"}
@@ -32,15 +32,16 @@ const COLLAPSED_ITEM_COUNT = 10;
32
32
  const PER_TASK_OUTPUT_CAP = 50 * 1024;
33
33
  function loadAgentsFromDir(dir, source) {
34
34
  const agents = [];
35
+ const diagnostics = [];
35
36
  if (!fs.existsSync(dir)) {
36
- return agents;
37
+ return { agents, diagnostics };
37
38
  }
38
39
  let entries;
39
40
  try {
40
41
  entries = fs.readdirSync(dir, { withFileTypes: true });
41
42
  }
42
43
  catch {
43
- return agents;
44
+ return { agents, diagnostics };
44
45
  }
45
46
  for (const entry of entries) {
46
47
  if (!entry.name.endsWith(".md"))
@@ -55,8 +56,27 @@ function loadAgentsFromDir(dir, source) {
55
56
  catch {
56
57
  continue;
57
58
  }
58
- const { frontmatter, body } = parseFrontmatter(content);
59
+ let frontmatter;
60
+ let body;
61
+ try {
62
+ ({ frontmatter, body } = parseFrontmatter(content));
63
+ }
64
+ catch (error) {
65
+ // Malformed frontmatter (e.g. invalid YAML) must not take down the whole
66
+ // directory — skip this one file and surface a diagnostic instead.
67
+ const message = error instanceof Error ? error.message : "failed to parse agent file";
68
+ diagnostics.push({ type: "warning", message, path: filePath });
69
+ continue;
70
+ }
59
71
  if (!frontmatter.name || !frontmatter.description) {
72
+ const missing = [!frontmatter.name && "name", !frontmatter.description && "description"]
73
+ .filter(Boolean)
74
+ .join(" and ");
75
+ diagnostics.push({
76
+ type: "warning",
77
+ message: `missing required frontmatter field(s): ${missing}`,
78
+ path: filePath,
79
+ });
60
80
  continue;
61
81
  }
62
82
  const tools = frontmatter.tools
@@ -73,7 +93,7 @@ function loadAgentsFromDir(dir, source) {
73
93
  filePath,
74
94
  });
75
95
  }
76
- return agents;
96
+ return { agents, diagnostics };
77
97
  }
78
98
  function isDirectory(p) {
79
99
  try {
@@ -98,24 +118,29 @@ function findNearestProjectAgentsDir(cwd) {
98
118
  export function discoverAgents(cwd, scope) {
99
119
  const userDir = path.join(getAgentDir(), "agents");
100
120
  const projectAgentsDir = findNearestProjectAgentsDir(cwd);
101
- const userAgents = scope === "project" ? [] : loadAgentsFromDir(userDir, "user");
102
- const projectAgents = scope === "user" || !projectAgentsDir ? [] : loadAgentsFromDir(projectAgentsDir, "project");
121
+ const emptyResult = { agents: [], diagnostics: [] };
122
+ const userResult = scope === "project" ? emptyResult : loadAgentsFromDir(userDir, "user");
123
+ const projectResult = scope === "user" || !projectAgentsDir ? emptyResult : loadAgentsFromDir(projectAgentsDir, "project");
103
124
  const agentMap = new Map();
104
125
  if (scope === "both") {
105
- for (const agent of userAgents)
126
+ for (const agent of userResult.agents)
106
127
  agentMap.set(agent.name, agent);
107
- for (const agent of projectAgents)
128
+ for (const agent of projectResult.agents)
108
129
  agentMap.set(agent.name, agent);
109
130
  }
110
131
  else if (scope === "user") {
111
- for (const agent of userAgents)
132
+ for (const agent of userResult.agents)
112
133
  agentMap.set(agent.name, agent);
113
134
  }
114
135
  else {
115
- for (const agent of projectAgents)
136
+ for (const agent of projectResult.agents)
116
137
  agentMap.set(agent.name, agent);
117
138
  }
118
- return { agents: Array.from(agentMap.values()), projectAgentsDir };
139
+ return {
140
+ agents: Array.from(agentMap.values()),
141
+ projectAgentsDir,
142
+ diagnostics: [...userResult.diagnostics, ...projectResult.diagnostics],
143
+ };
119
144
  }
120
145
  // --- Formatting helpers ---
121
146
  function formatTokens(count) {
@@ -285,12 +310,17 @@ function getCliInvocation(args) {
285
310
  }
286
311
  return { command: "humain-terminal", args };
287
312
  }
288
- async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, isolation, step, model, parentModel, signal, onUpdate, makeDetails, toolCallId, childIndex, options) {
313
+ async function runSingleAgent(defaultCwd, agents, agentDiagnostics, agentName, task, cwd, isolation, step, model, parentModel, signal, onUpdate, makeDetails, toolCallId, childIndex, options) {
289
314
  const childDepth = currentSubagentDepth() + 1;
290
315
  const parentTaskId = currentTaskId() ?? toolCallId;
291
316
  const agent = agents.find((a) => a.name === agentName);
292
317
  if (!agent) {
293
318
  const available = agents.map((a) => `"${a.name}"`).join(", ") || "none";
319
+ const skippedNote = agentDiagnostics.length > 0
320
+ ? ` ${agentDiagnostics.length} agent file(s) failed to load and were skipped: ${agentDiagnostics
321
+ .map((d) => `${d.path ?? "(unknown path)"} (${d.message})`)
322
+ .join("; ")}.`
323
+ : "";
294
324
  return {
295
325
  agent: agentName,
296
326
  agentSource: "unknown",
@@ -300,7 +330,7 @@ async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, isolatio
300
330
  depth: childDepth,
301
331
  exitCode: 1,
302
332
  messages: [],
303
- stderr: `Unknown agent: "${agentName}". Available agents: ${available}.`,
333
+ stderr: `Unknown agent: "${agentName}". Available agents: ${available}.${skippedNote}`,
304
334
  usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },
305
335
  step,
306
336
  isolation: "shared",
@@ -773,7 +803,7 @@ export function createSubagentToolDefinition(cwd) {
773
803
  }
774
804
  }
775
805
  : undefined;
776
- const result = await runSingleAgent(defaultCwd, agents, step.agent, taskWithContext, step.cwd, undefined, i + 1, step.model, parentModel, signal, chainUpdate, makeDetails("chain"), toolCallId, i, { taskId: `${toolCallId}-${i}`, thinking: step.thinking });
806
+ const result = await runSingleAgent(defaultCwd, agents, discovery.diagnostics, step.agent, taskWithContext, step.cwd, undefined, i + 1, step.model, parentModel, signal, chainUpdate, makeDetails("chain"), toolCallId, i, { taskId: `${toolCallId}-${i}`, thinking: step.thinking });
777
807
  results.push(result);
778
808
  const isError = isFailedResult(result);
779
809
  if (isError) {
@@ -873,7 +903,7 @@ export function createSubagentToolDefinition(cwd) {
873
903
  let result;
874
904
  for (;;) {
875
905
  emitTaskEvent({ type: "start", taskId: g.id, attempt, at: now() });
876
- result = await runSingleAgent(defaultCwd, agents, g.agent, g.task, g.cwd, g.isolation, undefined, model, parentModel, signal, (partial) => {
906
+ result = await runSingleAgent(defaultCwd, agents, discovery.diagnostics, g.agent, g.task, g.cwd, g.isolation, undefined, model, parentModel, signal, (partial) => {
877
907
  if (partial.details?.results[0]) {
878
908
  allResults[index] = partial.details.results[0];
879
909
  emitParallelUpdate();
@@ -957,7 +987,7 @@ export function createSubagentToolDefinition(cwd) {
957
987
  };
958
988
  }
959
989
  if (params.agent && params.task) {
960
- const result = await runSingleAgent(defaultCwd, agents, params.agent, params.task, params.cwd, params.isolation, undefined, params.model, parentModel, signal, onUpdate, makeDetails("single"), toolCallId, 0, { taskId: `${toolCallId}-0`, thinking: params.thinking });
990
+ const result = await runSingleAgent(defaultCwd, agents, discovery.diagnostics, params.agent, params.task, params.cwd, params.isolation, undefined, params.model, parentModel, signal, onUpdate, makeDetails("single"), toolCallId, 0, { taskId: `${toolCallId}-0`, thinking: params.thinking });
961
991
  const isError = isFailedResult(result);
962
992
  if (isError) {
963
993
  const errorMsg = getResultOutput(result);