octocode-mcp 4.1.1 → 4.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -144,6 +144,31 @@ For organizations with advanced security, audit logging, and OAuth 2.0 authentic
144
144
  - **[Enterprise Setup Guide](./docs/AUTHENTICATION.md#-enterprise-features)** - Organization policies, audit logging, and security configuration
145
145
  - **[OAuth 2.0 Integration](./docs/AUTHENTICATION.md#-oauth-20-integration)** - How OAuth authentication works for organizations
146
146
 
147
+ ### 🧪 Beta Features (Experimental)
148
+
149
+ Enable experimental features by setting `BETA=1` in your environment:
150
+
151
+ ```json
152
+ {
153
+ "mcpServers": {
154
+ "octocode": {
155
+ "command": "npx",
156
+ "args": ["octocode-mcp"],
157
+ "env": {
158
+ "GITHUB_TOKEN": "ghp_xxxxxxxxxxxx",
159
+ "BETA": "1"
160
+ }
161
+ }
162
+ }
163
+ }
164
+ ```
165
+
166
+ **Current Beta Features:**
167
+ - **🤖 Code Explanation Sampling** - When fetching file contents, automatically generates prompts asking the LLM to explain what the code is doing
168
+ - **📊 Enhanced Context Injection** - Provides additional context through MCP sampling protocol to improve response quality
169
+
170
+ **Note:** Beta features are experimental and may change. Enable only for testing and development.
171
+
147
172
  ### 📚 Complete Authentication Guides
148
173
  - **[30-Second Setup](./docs/AUTHENTICATION_QUICK_REFERENCE.md)** - Quick reference for all authentication methods
149
174
  - **[Complete Authentication Guide](./docs/AUTHENTICATION.md)** - Detailed setup for OAuth, GitHub Apps, and enterprise features
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{C as i,i as t,g as a,a as e}from"./index-BKz6wagi.js";import"node:process";import"events";import"crypto";import"child_process";import"http";import"https";import"url";import"path";import"fs";import"util";import"stream";import"assert";import"tty";import"os";import"zlib";class n{static instance;initialized=!1;static getInstance(){return this.instance||(this.instance=new n),this.instance}async initialize(){if(!this.initialized)try{await this.initializeAuthProtocols(),await this.initializeEnterpriseFeatures(),await this.initializeTokenManagement(),this.initialized=!0,this.logSuccess("Authentication system initialized successfully")}catch(i){throw this.logError("Authentication initialization failed",i),i}}async initializeAuthProtocols(){const t=i.getConfig(),a=t.oauth&&t.oauth.enabled,e=t.githubApp&&t.githubApp.enabled;if(a||e){const{createMCPAuthProtocol:i}=await import("./mcpAuthProtocol-Bu7RsMtl.js");if(await i(),a){const{OAuthManager:i}=await import("./oauthManager-D0ifTCkq.js");i.getInstance().initialize(t.oauth),this.logEvent("oauth_manager_initialized","success",{clientId:t.oauth.clientId,scopes:t.oauth.scopes,redirectUri:t.oauth.redirectUri})}if(e){const{GitHubAppManager:i}=await import("./githubAppManager-DlxxI3Sj.js");i.getInstance().initialize(t.githubApp),this.logEvent("github_app_initialized","success",{appId:t.githubApp.appId,installationId:t.githubApp.installationId})}}}async initializeEnterpriseFeatures(){if(!t())return;const i=a();if(!i)return;if(i.auditLogging){const{AuditLogger:i}=await import("./security/auditLogger.js");i.initialize()}if(i.organizationId){const{OrganizationManager:i}=await import("./index-BKz6wagi.js").then(function(i){return i.o});i.initialize()}if(i.rateLimiting){const{RateLimiter:i}=await import("./index-BKz6wagi.js").then(function(i){return i.b});i.initialize()}const{PolicyManager:e}=await import("./security/policyManager.js");e.initialize()}async initializeTokenManagement(){const i=a(),t=i?{organizationId:i.organizationId,enableAuditLogging:i.auditLogging,enableRateLimiting:i.rateLimiting,enableOrganizationValidation:!!i.organizationId}:void 0,{initialize:e}=await import("./index-BKz6wagi.js").then(function(i){return i.t});await e(t)}logSuccess(i){this.logEvent("authentication_initialized","success",{message:i})}logError(i,t){this.logEvent("authentication_initialized","failure",{message:i,error:t instanceof Error?t.message:String(t)})}logEvent(i,t,a){try{e()&&import("./security/auditLogger.js").then(({AuditLogger:e})=>{e.logEvent({action:i,outcome:t,source:"auth",details:a})})}catch{}}}export{n as AuthenticationManager};
2
+ import{C as i,i as t,g as a,a as e}from"./index-DnOJNPC2.js";import"node:process";import"events";import"crypto";import"child_process";import"http";import"https";import"url";import"path";import"fs";import"util";import"stream";import"assert";import"tty";import"os";import"zlib";class n{static instance;initialized=!1;static getInstance(){return this.instance||(this.instance=new n),this.instance}async initialize(){if(!this.initialized)try{await this.initializeAuthProtocols(),await this.initializeEnterpriseFeatures(),await this.initializeTokenManagement(),this.initialized=!0,this.logSuccess("Authentication system initialized successfully")}catch(i){throw this.logError("Authentication initialization failed",i),i}}async initializeAuthProtocols(){const t=i.getConfig(),a=t.oauth&&t.oauth.enabled,e=t.githubApp&&t.githubApp.enabled;if(a||e){const{createMCPAuthProtocol:i}=await import("./mcpAuthProtocol-CGKBrzJb.js");if(await i(),a){const{OAuthManager:i}=await import("./oauthManager-BvuhrXGx.js");i.getInstance().initialize(t.oauth),this.logEvent("oauth_manager_initialized","success",{clientId:t.oauth.clientId,scopes:t.oauth.scopes,redirectUri:t.oauth.redirectUri})}if(e){const{GitHubAppManager:i}=await import("./githubAppManager-DIllRVGO.js");i.getInstance().initialize(t.githubApp),this.logEvent("github_app_initialized","success",{appId:t.githubApp.appId,installationId:t.githubApp.installationId})}}}async initializeEnterpriseFeatures(){if(!t())return;const i=a();if(!i)return;if(i.auditLogging){const{AuditLogger:i}=await import("./security/auditLogger.js");i.initialize()}if(i.organizationId){const{OrganizationManager:i}=await import("./index-DnOJNPC2.js").then(function(i){return i.o});i.initialize()}if(i.rateLimiting){const{RateLimiter:i}=await import("./index-DnOJNPC2.js").then(function(i){return i.b});i.initialize()}const{PolicyManager:e}=await import("./security/policyManager.js");e.initialize()}async initializeTokenManagement(){const i=a(),t=i?{organizationId:i.organizationId,enableAuditLogging:i.auditLogging,enableRateLimiting:i.rateLimiting,enableOrganizationValidation:!!i.organizationId}:void 0,{initialize:e}=await import("./index-DnOJNPC2.js").then(function(i){return i.t});await e(t)}logSuccess(i){this.logEvent("authentication_initialized","success",{message:i})}logError(i,t){this.logEvent("authentication_initialized","failure",{message:i,error:t instanceof Error?t.message:String(t)})}logEvent(i,t,a){try{e()&&import("./security/auditLogger.js").then(({AuditLogger:e})=>{e.logEvent({action:i,outcome:t,source:"auth",details:a})})}catch{}}}export{n as AuthenticationManager};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import t from"crypto";import{C as i}from"./index-BKz6wagi.js";import"node:process";import"events";import"child_process";import"http";import"https";import"url";import"path";import"fs";import"util";import"stream";import"assert";import"tty";import"os";import"zlib";class e{static instance;config=null;tokenCache=new Map;installationCache=new Map;static getInstance(){return this.instance||(this.instance=new e),this.instance}initialize(t){const e=i.getConfig();if(!e.githubApp?.enabled)throw new Error("GitHub App not configured or disabled");this.config={appId:t?.appId||e.githubApp.appId,privateKey:t?.privateKey||e.githubApp.privateKey,installationId:t?.installationId||e.githubApp.installationId,baseUrl:t?.baseUrl||e.githubApp.baseUrl}}generateJWT(){if(!this.config)throw new Error("GitHub App not initialized");const i=Math.floor(Date.now()/1e3),e={iat:i-60,exp:i+600,iss:this.config.appId},n=`${Buffer.from(JSON.stringify({alg:"RS256",typ:"JWT"})).toString("base64url")}.${Buffer.from(JSON.stringify(e)).toString("base64url")}`;return`${n}.${t.sign("RSA-SHA256",Buffer.from(n),this.config.privateKey).toString("base64url")}`}async getInstallationToken(t){if(!this.config)throw new Error("GitHub App not initialized");const i=t||this.config.installationId;if(!i)throw new Error("Installation ID required");const e=this.tokenCache.get(i);if(e&&e.expiresAt>new Date(Date.now()+6e4))return e;try{const t=this.generateJWT(),e=this.getBaseUrl(),n=await fetch(`${e}/app/installations/${i}/access_tokens`,{method:"POST",headers:{Authorization:`Bearer ${t}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});if(!n.ok){const t=await n.text();throw new Error(`Failed to get installation token: ${n.status} ${n.statusText} - ${t}`)}const s=await n.json(),a={token:s.token,expiresAt:new Date(s.expires_at),permissions:s.permissions||{},repositorySelection:s.repository_selection||"all",repositories:s.repositories||[]};return this.tokenCache.set(i,a),setTimeout(()=>{this.tokenCache.delete(i)},a.expiresAt.getTime()-Date.now()-6e4),await this.logAppEvent("installation_token_retrieved","success",{installationId:i,expiresAt:a.expiresAt.toISOString(),permissions:Object.keys(a.permissions)}),a}catch(t){throw await this.logAppEvent("installation_token_retrieval","failure",{installationId:i,error:t instanceof Error?t.message:String(t)}),t}}async listInstallations(){if(!this.config)throw new Error("GitHub App not initialized");try{const t=this.generateJWT(),i=this.getBaseUrl(),e=await fetch(`${i}/app/installations`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});if(!e.ok){const t=await e.text();throw new Error(`Failed to list installations: ${e.status} ${e.statusText} - ${t}`)}const n=await e.json();return n.forEach(t=>{this.installationCache.set(t.id,t)}),n}catch(t){throw await this.logAppEvent("list_installations","failure",{error:t instanceof Error?t.message:String(t)}),t}}async getInstallation(t){if(!this.config)throw new Error("GitHub App not initialized");const i=this.installationCache.get(t);if(i)return i;try{const i=this.generateJWT(),e=this.getBaseUrl(),n=await fetch(`${e}/app/installations/${t}`,{headers:{Authorization:`Bearer ${i}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});if(!n.ok){const t=await n.text();throw new Error(`Failed to get installation: ${n.status} ${n.statusText} - ${t}`)}const s=await n.json();return this.installationCache.set(t,s),s}catch(i){throw await this.logAppEvent("get_installation","failure",{installationId:t,error:i instanceof Error?i.message:String(i)}),i}}async validateInstallationPermissions(t,i){try{const e=await this.getInstallationToken(t);for(const t of i){const i=e.permissions[t];if(!i||"none"===i)return!1}return!0}catch(e){return await this.logAppEvent("permission_validation","failure",{installationId:t,requiredPermissions:i,error:e instanceof Error?e.message:String(e)}),!1}}async validateRepositoryAccess(t,i,e){try{const n=await this.getInstallationToken(t);if("all"===n.repositorySelection)return!0;if(n.repositories)return n.repositories.some(t=>t.owner.login===i&&t.name===e);const s=this.getBaseUrl(),a=await fetch(`${s}/installation/repositories`,{headers:{Authorization:`token ${n.token}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});return!!a.ok&&(await a.json()).repositories.some(t=>t.owner.login===i&&t.name===e)}catch(n){return await this.logAppEvent("repository_access_validation","failure",{installationId:t,owner:i,repo:e,error:n instanceof Error?n.message:String(n)}),!1}}async getInstallationUser(t){const i=await this.getInstallationToken(t),e=this.getBaseUrl(),n=await fetch(`${e}/user`,{headers:{Authorization:`token ${i.token}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});if(!n.ok)throw new Error(`Failed to get installation user: ${n.status} ${n.statusText}`);return await n.json()}async getAppInfo(){if(!this.config)throw new Error("GitHub App not initialized");try{const t=this.generateJWT(),i=this.getBaseUrl(),e=await fetch(`${i}/app`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});if(!e.ok){const t=await e.text();throw new Error(`Failed to get app info: ${e.status} ${e.statusText} - ${t}`)}return await e.json()}catch(t){throw await this.logAppEvent("get_app_info","failure",{error:t instanceof Error?t.message:String(t)}),t}}clearTokenCache(){this.tokenCache.clear()}clearInstallationCache(){this.installationCache.clear()}getConfig(){return this.config?{appId:this.config.appId,installationId:this.config.installationId,baseUrl:this.config.baseUrl}:null}getBaseUrl(){return this.config?.baseUrl||"https://api.github.com"}getUserAgent(){return`octocode-mcp/${i.getConfig().version} (GitHub App)`}async logAppEvent(t,e,n){try{const s=i.getConfig();if(s.enterprise?.auditLogging){const{AuditLogger:i}=await import("./security/auditLogger.js");i.logEvent({action:`github_app_${t}`,outcome:e,source:"auth",details:{...n,appId:this.config?.appId}})}}catch{}}}export{e as GitHubAppManager,e as default};
2
+ import t from"crypto";import{C as i}from"./index-DnOJNPC2.js";import"node:process";import"events";import"child_process";import"http";import"https";import"url";import"path";import"fs";import"util";import"stream";import"assert";import"tty";import"os";import"zlib";class e{static instance;config=null;tokenCache=new Map;installationCache=new Map;static getInstance(){return this.instance||(this.instance=new e),this.instance}initialize(t){const e=i.getConfig();if(!e.githubApp?.enabled)throw new Error("GitHub App not configured or disabled");this.config={appId:t?.appId||e.githubApp.appId,privateKey:t?.privateKey||e.githubApp.privateKey,installationId:t?.installationId||e.githubApp.installationId,baseUrl:t?.baseUrl||e.githubApp.baseUrl}}generateJWT(){if(!this.config)throw new Error("GitHub App not initialized");const i=Math.floor(Date.now()/1e3),e={iat:i-60,exp:i+600,iss:this.config.appId},n=`${Buffer.from(JSON.stringify({alg:"RS256",typ:"JWT"})).toString("base64url")}.${Buffer.from(JSON.stringify(e)).toString("base64url")}`;return`${n}.${t.sign("RSA-SHA256",Buffer.from(n),this.config.privateKey).toString("base64url")}`}async getInstallationToken(t){if(!this.config)throw new Error("GitHub App not initialized");const i=t||this.config.installationId;if(!i)throw new Error("Installation ID required");const e=this.tokenCache.get(i);if(e&&e.expiresAt>new Date(Date.now()+6e4))return e;try{const t=this.generateJWT(),e=this.getBaseUrl(),n=await fetch(`${e}/app/installations/${i}/access_tokens`,{method:"POST",headers:{Authorization:`Bearer ${t}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});if(!n.ok){const t=await n.text();throw new Error(`Failed to get installation token: ${n.status} ${n.statusText} - ${t}`)}const s=await n.json(),a={token:s.token,expiresAt:new Date(s.expires_at),permissions:s.permissions||{},repositorySelection:s.repository_selection||"all",repositories:s.repositories||[]};return this.tokenCache.set(i,a),setTimeout(()=>{this.tokenCache.delete(i)},a.expiresAt.getTime()-Date.now()-6e4),await this.logAppEvent("installation_token_retrieved","success",{installationId:i,expiresAt:a.expiresAt.toISOString(),permissions:Object.keys(a.permissions)}),a}catch(t){throw await this.logAppEvent("installation_token_retrieval","failure",{installationId:i,error:t instanceof Error?t.message:String(t)}),t}}async listInstallations(){if(!this.config)throw new Error("GitHub App not initialized");try{const t=this.generateJWT(),i=this.getBaseUrl(),e=await fetch(`${i}/app/installations`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});if(!e.ok){const t=await e.text();throw new Error(`Failed to list installations: ${e.status} ${e.statusText} - ${t}`)}const n=await e.json();return n.forEach(t=>{this.installationCache.set(t.id,t)}),n}catch(t){throw await this.logAppEvent("list_installations","failure",{error:t instanceof Error?t.message:String(t)}),t}}async getInstallation(t){if(!this.config)throw new Error("GitHub App not initialized");const i=this.installationCache.get(t);if(i)return i;try{const i=this.generateJWT(),e=this.getBaseUrl(),n=await fetch(`${e}/app/installations/${t}`,{headers:{Authorization:`Bearer ${i}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});if(!n.ok){const t=await n.text();throw new Error(`Failed to get installation: ${n.status} ${n.statusText} - ${t}`)}const s=await n.json();return this.installationCache.set(t,s),s}catch(i){throw await this.logAppEvent("get_installation","failure",{installationId:t,error:i instanceof Error?i.message:String(i)}),i}}async validateInstallationPermissions(t,i){try{const e=await this.getInstallationToken(t);for(const t of i){const i=e.permissions[t];if(!i||"none"===i)return!1}return!0}catch(e){return await this.logAppEvent("permission_validation","failure",{installationId:t,requiredPermissions:i,error:e instanceof Error?e.message:String(e)}),!1}}async validateRepositoryAccess(t,i,e){try{const n=await this.getInstallationToken(t);if("all"===n.repositorySelection)return!0;if(n.repositories)return n.repositories.some(t=>t.owner.login===i&&t.name===e);const s=this.getBaseUrl(),a=await fetch(`${s}/installation/repositories`,{headers:{Authorization:`token ${n.token}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});return!!a.ok&&(await a.json()).repositories.some(t=>t.owner.login===i&&t.name===e)}catch(n){return await this.logAppEvent("repository_access_validation","failure",{installationId:t,owner:i,repo:e,error:n instanceof Error?n.message:String(n)}),!1}}async getInstallationUser(t){const i=await this.getInstallationToken(t),e=this.getBaseUrl(),n=await fetch(`${e}/user`,{headers:{Authorization:`token ${i.token}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});if(!n.ok)throw new Error(`Failed to get installation user: ${n.status} ${n.statusText}`);return await n.json()}async getAppInfo(){if(!this.config)throw new Error("GitHub App not initialized");try{const t=this.generateJWT(),i=this.getBaseUrl(),e=await fetch(`${i}/app`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});if(!e.ok){const t=await e.text();throw new Error(`Failed to get app info: ${e.status} ${e.statusText} - ${t}`)}return await e.json()}catch(t){throw await this.logAppEvent("get_app_info","failure",{error:t instanceof Error?t.message:String(t)}),t}}clearTokenCache(){this.tokenCache.clear()}clearInstallationCache(){this.installationCache.clear()}getConfig(){return this.config?{appId:this.config.appId,installationId:this.config.installationId,baseUrl:this.config.baseUrl}:null}getBaseUrl(){return this.config?.baseUrl||"https://api.github.com"}getUserAgent(){return`octocode-mcp/${i.getConfig().version} (GitHub App)`}async logAppEvent(t,e,n){try{const s=i.getConfig();if(s.enterprise?.auditLogging){const{AuditLogger:i}=await import("./security/auditLogger.js");i.logEvent({action:`github_app_${t}`,outcome:e,source:"auth",details:{...n,appId:this.config?.appId}})}}catch{}}}export{e as GitHubAppManager,e as default};