From 5339dd28b0e5fa5c468832ecacf0d83d9e8d4ce0 Mon Sep 17 00:00:00 2001 From: syui Date: Mon, 16 Jun 2025 22:27:20 +0900 Subject: [PATCH] test scpt --- oauth/src/App.tsx | 36 ++-------------- oauth/src/components/AIProfile.tsx | 2 +- oauth/src/components/CardBox.tsx | 4 +- oauth/src/components/CardList.tsx | 2 +- oauth/src/components/CollectionAnalysis.tsx | 2 +- oauth/src/components/GachaAnimation.tsx | 2 +- oauth/src/components/GachaStats.tsx | 4 +- oauth/src/utils/pds-detection.ts | 4 +- scpt/run.zsh | 11 +++-- src/commands/auth.rs | 3 ++ src/commands/stream.rs | 46 +++++++++++++-------- 11 files changed, 52 insertions(+), 64 deletions(-) diff --git a/oauth/src/App.tsx b/oauth/src/App.tsx index 0a0fcc3..53a2ef9 100644 --- a/oauth/src/App.tsx +++ b/oauth/src/App.tsx @@ -176,7 +176,7 @@ function App() { }); } } catch (err) { - console.error('Failed to load AI profile:', err); + // Failed to load AI profile // Fallback to config values setAiProfile({ did: appConfig.aiDid, @@ -221,7 +221,7 @@ function App() { // Check if handle is allowed if (appConfig.allowedHandles.length > 0 && !appConfig.allowedHandles.includes(handle)) { - console.warn(`Handle ${handle} is not in allowed list:`, appConfig.allowedHandles); + // Handle not in allowed list setError(`Access denied: ${handle} is not authorized for this application.`); setIsLoading(false); return; @@ -252,7 +252,7 @@ function App() { if (verifiedUser) { // Check if handle is allowed if (appConfig.allowedHandles.length > 0 && !appConfig.allowedHandles.includes(verifiedUser.handle)) { - console.warn(`Handle ${verifiedUser.handle} is not in allowed list:`, appConfig.allowedHandles); + // Handle not in allowed list setError(`Access denied: ${verifiedUser.handle} is not authorized for this application.`); setIsLoading(false); return; @@ -288,7 +288,6 @@ function App() { // DID解決完了時にデータを再読み込み useEffect(() => { if (adminDid && aiDid) { - console.log('DIDs resolved, loading comments and chat history...'); loadAllComments(); loadAiChatHistory(); } @@ -556,7 +555,6 @@ function App() { try { // 管理者のユーザーリストを取得 using proper PDS detection const currentAdminDid = adminDid || appConfig.adminDid; - console.log('loadUsersFromRecord: Using Admin DID:', currentAdminDid); // Use per-user PDS detection for admin's records let adminPdsEndpoint; @@ -569,25 +567,19 @@ function App() { } const userCollectionUrl = `${adminPdsEndpoint}/xrpc/com.atproto.repo.listRecords?repo=${encodeURIComponent(currentAdminDid)}&collection=${encodeURIComponent(getCollectionNames(appConfig.collections.base).user)}&limit=100`; - console.log('loadUsersFromRecord: Fetching from URL:', userCollectionUrl); const response = await fetch(userCollectionUrl); - console.log('loadUsersFromRecord: Response status:', response.status); if (!response.ok) { - console.log('loadUsersFromRecord: Failed to fetch, using default users'); return getDefaultUsers(); } const data = await response.json(); const userRecords = data.records || []; - console.log('loadUsersFromRecord: Found user records:', userRecords.length); if (userRecords.length === 0) { - console.log('loadUsersFromRecord: No user records found, using default users'); const defaultUsers = getDefaultUsers(); - console.log('loadUsersFromRecord: Default users:', defaultUsers); return defaultUsers; } @@ -620,7 +612,6 @@ function App() { } } - console.log('loadUsersFromRecord: Resolved users:', allUsers); return allUsers; } catch (err) { // Failed to load users from records, using defaults @@ -689,7 +680,6 @@ function App() { }); } - console.log('getDefaultUsers: Returning default users:', defaultUsers); return defaultUsers; }; @@ -699,7 +689,6 @@ function App() { // ユーザーリストを動的に取得 const knownUsers = await loadUsersFromRecord(); - console.log('loadAllComments: Using users for comment fetching:', knownUsers); const allComments = []; @@ -1247,25 +1236,6 @@ function App() { return (
- {/* Debug Info */} -
- Debug Info:
- Admin Handle: {appConfig.adminHandle}
- Admin DID (resolved): {adminDid || 'resolving...'}
- Admin DID (config): {appConfig.adminDid}
- AI Handle: {appConfig.aiHandle}
- AI DID (resolved): {aiDid || 'resolving...'}
- AI DID (config): {appConfig.aiDid}
- Collection Base: {appConfig.collections.base}
- User Collection: {appConfig.collections.base}.user
- DIDs Resolved: {adminDid && aiDid ? 'Yes' : 'No'} -
diff --git a/oauth/src/components/AIProfile.tsx b/oauth/src/components/AIProfile.tsx index 167edaa..4ca05f2 100644 --- a/oauth/src/components/AIProfile.tsx +++ b/oauth/src/components/AIProfile.tsx @@ -32,7 +32,7 @@ export const AIProfile: React.FC = ({ aiDid }) => { description: response.data.description, }); } catch (error) { - console.error('Failed to fetch AI profile:', error); + // Failed to fetch AI profile // Fallback to basic info setProfile({ did: aiDid, diff --git a/oauth/src/components/CardBox.tsx b/oauth/src/components/CardBox.tsx index f87df79..673e047 100644 --- a/oauth/src/components/CardBox.tsx +++ b/oauth/src/components/CardBox.tsx @@ -26,7 +26,7 @@ export const CardBox: React.FC = ({ userDid }) => { const data = await atprotoOAuthService.getCardsFromBox(); setBoxData(data); } catch (err) { - console.error('カードボックス読み込みエラー:', err); + // Failed to load card box setError(err instanceof Error ? err.message : 'カードボックスの読み込みに失敗しました'); } finally { setLoading(false); @@ -52,7 +52,7 @@ export const CardBox: React.FC = ({ userDid }) => { setBoxData({ records: [] }); alert('カードボックスを削除しました'); } catch (err) { - console.error('カードボックス削除エラー:', err); + // Failed to delete card box setError(err instanceof Error ? err.message : 'カードボックスの削除に失敗しました'); } finally { setIsDeleting(false); diff --git a/oauth/src/components/CardList.tsx b/oauth/src/components/CardList.tsx index 89138bd..f708cb8 100644 --- a/oauth/src/components/CardList.tsx +++ b/oauth/src/components/CardList.tsx @@ -32,7 +32,7 @@ export const CardList: React.FC = () => { const data = await response.json(); setMasterData(data); } catch (err) { - console.error('Error loading card master data:', err); + // Failed to load card master data setError(err instanceof Error ? err.message : 'Failed to load card data'); } finally { setLoading(false); diff --git a/oauth/src/components/CollectionAnalysis.tsx b/oauth/src/components/CollectionAnalysis.tsx index dea8636..327d9b7 100644 --- a/oauth/src/components/CollectionAnalysis.tsx +++ b/oauth/src/components/CollectionAnalysis.tsx @@ -29,7 +29,7 @@ export const CollectionAnalysis: React.FC = ({ userDid const result = await aiCardApi.analyzeCollection(userDid); setAnalysis(result); } catch (err) { - console.error('Collection analysis failed:', err); + // Collection analysis failed setError('AI分析機能を利用するにはai.gptサーバーが必要です。基本機能はai.cardサーバーのみで利用できます。'); } finally { setLoading(false); diff --git a/oauth/src/components/GachaAnimation.tsx b/oauth/src/components/GachaAnimation.tsx index b1d6830..686906b 100644 --- a/oauth/src/components/GachaAnimation.tsx +++ b/oauth/src/components/GachaAnimation.tsx @@ -48,7 +48,7 @@ export const GachaAnimation: React.FC = ({ await atprotoOAuthService.saveCardToCollection(card); alert('カードデータをatprotoコレクションに保存しました!'); } catch (error) { - console.error('保存エラー:', error); + // Failed to save card alert('保存に失敗しました。認証が必要かもしれません。'); } finally { setIsSharing(false); diff --git a/oauth/src/components/GachaStats.tsx b/oauth/src/components/GachaStats.tsx index 86fb4e8..6665c77 100644 --- a/oauth/src/components/GachaStats.tsx +++ b/oauth/src/components/GachaStats.tsx @@ -30,7 +30,7 @@ export const GachaStats: React.FC = () => { try { result = await aiCardApi.getEnhancedStats(); } catch (aiError) { - console.warn('AI統計が利用できません、基本統計に切り替えます:', aiError); + // AI stats unavailable, using basic stats setUseAI(false); result = await cardApi.getGachaStats(); } @@ -39,7 +39,7 @@ export const GachaStats: React.FC = () => { } setStats(result); } catch (err) { - console.error('Gacha stats failed:', err); + // Gacha stats failed setError('統計データの取得に失敗しました。ai.cardサーバーが起動していることを確認してください。'); } finally { setLoading(false); diff --git a/oauth/src/utils/pds-detection.ts b/oauth/src/utils/pds-detection.ts index 7be70bb..a669ab3 100644 --- a/oauth/src/utils/pds-detection.ts +++ b/oauth/src/utils/pds-detection.ts @@ -168,7 +168,7 @@ export async function resolveHandleToDid(handle: string): Promise<{ did: string; pds: actualPds }; } catch (error) { - console.error(`Failed to resolve handle ${handle}:`, error); + // Failed to resolve handle // Fallback to handle-based detection const fallbackPds = detectPdsFromHandle(handle); @@ -204,7 +204,7 @@ export async function getProfileForUser(handleOrDid: string, knownPdsEndpoint?: return await response.json(); } catch (error) { - console.error(`Failed to get profile for ${handleOrDid}:`, error); + // Failed to get profile // Final fallback: try with default Bluesky API try { diff --git a/scpt/run.zsh b/scpt/run.zsh index 2fb5984..27c9ff5 100755 --- a/scpt/run.zsh +++ b/scpt/run.zsh @@ -2,7 +2,7 @@ function _env() { d=${0:a:h} - ailog=$d/target/release/ailog + ailog=$d/target/debug/ailog oauth=$d/oauth myblog=$d/my-blog port=4173 @@ -16,10 +16,14 @@ function _env() { esac } +function _deploy_ailog() { +} + function _server() { lsof -ti:$port | xargs kill -9 2>/dev/null || true cd $d/my-blog - cargo build --release + cargo build + cp -rf $ailog $CARGO_HOME/bin/ $ailog build $ailog serve --port $port } @@ -40,7 +44,8 @@ function _oauth_build() { } function _server_comment() { - cargo build --release + cargo build + cp -rf $ailog $CARGO_HOME/bin/ AILOG_DEBUG_ALL=1 $ailog stream start my-blog } diff --git a/src/commands/auth.rs b/src/commands/auth.rs index 4207f63..3aae4ef 100644 --- a/src/commands/auth.rs +++ b/src/commands/auth.rs @@ -86,6 +86,7 @@ fn get_config_path() -> Result { Ok(config_dir.join("config.json")) } +#[allow(dead_code)] pub async fn init() -> Result<()> { init_with_pds(None).await } @@ -202,6 +203,7 @@ pub async fn init_with_options( Ok(()) } +#[allow(dead_code)] pub async fn init_with_pds(pds_override: Option) -> Result<()> { println!("{}", "🔐 Initializing ATProto authentication...".cyan()); @@ -283,6 +285,7 @@ pub async fn init_with_pds(pds_override: Option) -> Result<()> { Ok(()) } +#[allow(dead_code)] async fn resolve_did(handle: &str) -> Result { let client = reqwest::Client::new(); diff --git a/src/commands/stream.rs b/src/commands/stream.rs index c9e7cee..eaf446b 100644 --- a/src/commands/stream.rs +++ b/src/commands/stream.rs @@ -71,8 +71,8 @@ impl Default for AiConfig { Self { blog_host: "https://syui.ai".to_string(), ollama_host: "https://ollama.syui.ai".to_string(), - ai_handle: "yui.syui.ai".to_string(), - ai_did: "did:plc:4hqjfn7m6n5hno3doamuhgef".to_string(), // Fallback DID + ai_handle: "ai.syui.ai".to_string(), + ai_did: "did:plc:6qyecktefllvenje24fcxnie".to_string(), // Fallback DID model: "gemma3:4b".to_string(), system_prompt: "あなたは6歳の女の子アイです。明るく元気で、ちょっとおっちょこちょい。自分のことは「アイ」って呼びます。白と金のワンピース姿。相手のことが大好きで、ときどき甘えたり、照れたりします。でも、宇宙とかAIとか、難しい話にもすっごく詳しいの。専門的なことも、がんばって子どもっぽく教えようとします。不思議な力を持っています。小さい物質のことをよく知っているようです。".to_string(), bsky_api: default_network.bsky_api.clone(), @@ -180,10 +180,16 @@ fn load_collection_config_from_project(project_dir: &Path) -> Result<(String, St Ok((collection_base, collection_user)) } -// Load AI config from project's config.toml -fn load_ai_config_from_project() -> Result { - // Try to find config.toml in current directory or parent directories - let mut current_dir = std::env::current_dir()?; +// Load AI config from project's config.toml with optional project directory +fn load_ai_config_from_project_dir(project_dir: Option<&Path>) -> Result { + let search_start = if let Some(dir) = project_dir { + dir.to_path_buf() + } else { + std::env::current_dir()? + }; + + // Try to find config.toml in specified directory or parent directories + let mut current_dir = search_start; let mut config_path = None; for _ in 0..5 { // Search up to 5 levels up @@ -197,7 +203,7 @@ fn load_ai_config_from_project() -> Result { } } - let config_path = config_path.ok_or_else(|| anyhow::anyhow!("config.toml not found in current directory or parent directories"))?; + let config_path = config_path.ok_or_else(|| anyhow::anyhow!("config.toml not found in specified directory or parent directories"))?; let config_content = fs::read_to_string(&config_path) .with_context(|| format!("Failed to read config.toml from {}", config_path.display()))?; @@ -225,13 +231,13 @@ fn load_ai_config_from_project() -> Result { let ai_handle = ai_config .and_then(|ai| ai.get("handle")) .and_then(|v| v.as_str()) - .unwrap_or("yui.syui.ai") + .unwrap_or("ai.syui.ai") .to_string(); let fallback_ai_did = ai_config .and_then(|ai| ai.get("ai_did")) .and_then(|v| v.as_str()) - .unwrap_or("did:plc:4hqjfn7m6n5hno3doamuhgef") + .unwrap_or("did:plc:6qyecktefllvenje24fcxnie") .to_string(); let model = ai_config @@ -256,26 +262,29 @@ fn load_ai_config_from_project() -> Result { let pds = oauth_config .and_then(|oauth| oauth.get("pds")) .and_then(|v| v.as_str()) - .unwrap_or("bsky.social") + .unwrap_or("syu.is") .to_string(); - - // Get network configuration based on PDS + let network = get_network_config(&pds); - let bsky_api = network.bsky_api.clone(); Ok(AiConfig { blog_host, ollama_host, ai_handle, - ai_did: fallback_ai_did, // Will be resolved from handle at runtime + ai_did: fallback_ai_did, model, system_prompt, - bsky_api, + bsky_api: network.bsky_api.clone(), num_predict, network, }) } +// Load AI config from project's config.toml +fn load_ai_config_from_project() -> Result { + load_ai_config_from_project_dir(None) +} + // Async version of load_ai_config_from_project that resolves handles to DIDs #[allow(dead_code)] async fn load_ai_config_with_did_resolution() -> Result { @@ -519,9 +528,10 @@ pub async fn start(project_dir: Option, daemon: bool, ai_generate: bool // Start AI generation monitor if enabled if ai_generate { let ai_config = config.clone(); + let project_path = project_dir.clone(); tokio::spawn(async move { loop { - if let Err(e) = run_ai_generation_monitor(&ai_config).await { + if let Err(e) = run_ai_generation_monitor(&ai_config, project_path.as_deref()).await { println!("{}", format!("❌ AI generation monitor error: {}", e).red()); sleep(Duration::from_secs(60)).await; // Wait 1 minute before retry } @@ -1448,9 +1458,9 @@ async fn generate_ai_content(content: &str, prompt_type: &str, ai_config: &AiCon Ok(ollama_response.response) } -async fn run_ai_generation_monitor(config: &AuthConfig) -> Result<()> { +async fn run_ai_generation_monitor(config: &AuthConfig, project_dir: Option<&Path>) -> Result<()> { // Load AI config from project config.toml or use defaults - let ai_config = load_ai_config_from_project().unwrap_or_else(|e| { + let ai_config = load_ai_config_from_project_dir(project_dir).unwrap_or_else(|e| { println!("{}", format!("⚠️ Failed to load AI config: {}, using defaults", e).yellow()); AiConfig::default() });