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()
});