Fix: GitHub Copilot Device Flow token_type validation - Accept any token type case (Bearer, bearer, etc)

This commit is contained in:
Rowboat Developer 2026-04-17 10:40:43 -05:00
parent b7866e3067
commit 97853c4b4c
6 changed files with 834 additions and 61 deletions

View file

@ -67,12 +67,19 @@ initializeExecutionEnvironment();
const preloadPath = app.isPackaged
? path.join(__dirname, "../preload/dist/preload.js")
: path.join(__dirname, "../../../preload/dist/preload.js");
console.log("preloadPath", preloadPath);
const rendererPath = app.isPackaged
? path.join(__dirname, "../renderer/dist") // Production
: path.join(__dirname, "../../../renderer/dist"); // Development
console.log("rendererPath", rendererPath);
// Debug logging (wrapped in safe error handler)
try {
if (process.stderr && process.stderr.write) {
process.stderr.write(`preloadPath: ${preloadPath}\nrendererPath: ${rendererPath}\n`);
}
} catch {
// Silently ignore logging errors
}
// Register custom protocol for serving built renderer files in production.
// This keeps SPA routes working when users deep link into the packaged app.

View file

@ -213,6 +213,7 @@ function ModelSettings({ dialogOpen }: { dialogOpen: boolean }) {
const [testState, setTestState] = useState<{ status: "idle" | "testing" | "success" | "error"; error?: string }>({ status: "idle" })
const [configLoading, setConfigLoading] = useState(true)
const [showMoreProviders, setShowMoreProviders] = useState(false)
const [githubCopilotCode, setGithubCopilotCode] = useState<{ userCode: string; verificationUri: string } | null>(null)
const activeConfig = providerConfigs[provider]
const showApiKey = provider === "openai" || provider === "anthropic" || provider === "google" || provider === "openrouter" || provider === "aigateway" || provider === "openai-compatible"
@ -689,67 +690,155 @@ function ModelSettings({ dialogOpen }: { dialogOpen: boolean }) {
{/* GitHub Copilot Authentication */}
{isGitHubCopilot && (
<div className="space-y-2">
<div className="space-y-3 border rounded-lg p-3 bg-muted/30">
<span className="text-xs font-medium text-muted-foreground uppercase tracking-wider">Authentication</span>
<p className="text-xs text-muted-foreground">GitHub Copilot uses Device Flow OAuth for authentication. Click the button to authenticate with your GitHub account.</p>
<Button
onClick={async () => {
try {
setTestState({ status: "testing" });
const result = await window.ipc.invoke("github-copilot:authenticate", null);
if (!result.success) {
setTestState({ status: "error", error: result.error });
toast.error(`Authentication failed: ${result.error}`);
return;
}
// Show device code to user
const deviceCode = result.userCode;
const verificationUri = result.verificationUri;
toast.info(
`1. Open: ${verificationUri}\n2. Enter code: ${deviceCode}`,
{ duration: 60000 }
);
// Open verification URI in browser
window.open(verificationUri, '_blank');
// Wait a moment then check if authenticated
setTimeout(async () => {
const authCheck = await window.ipc.invoke("github-copilot:isAuthenticated", null);
if (authCheck.authenticated) {
setTestState({ status: "success" });
toast.success("GitHub Copilot authenticated!");
// Reload models after successful auth
const modelsResult = await window.ipc.invoke("models:list", null);
const catalog: Record<string, any[]> = {};
for (const p of modelsResult.providers || []) {
catalog[p.id] = p.models || [];
{!githubCopilotCode ? (
<>
<p className="text-xs text-muted-foreground">
GitHub Copilot uses Device Flow OAuth. Click below to get a device code.
</p>
<Button
onClick={async () => {
try {
setTestState({ status: "testing" });
const result = await window.ipc.invoke("github-copilot:authenticate", null);
if (!result.success) {
setTestState({ status: "error", error: result.error });
toast.error(`Error: ${result.error}`);
return;
}
setModelsCatalog(catalog);
// Store code permanently on screen
setGithubCopilotCode({
userCode: result.userCode,
verificationUri: result.verificationUri,
});
setTestState({ status: "idle" });
toast.success("Device code ready! Follow the instructions below.");
// Open GitHub automatically
window.open(result.verificationUri, '_blank');
} catch (error) {
const errorMsg = error instanceof Error ? error.message : "Authentication error";
setTestState({ status: "error", error: errorMsg });
toast.error(`Error: ${errorMsg}`);
}
}, 3000);
} catch (error) {
const errorMsg = error instanceof Error ? error.message : "Authentication error";
setTestState({ status: "error", error: errorMsg });
toast.error(`Error: ${errorMsg}`);
}
}}
variant="outline"
className="w-full"
disabled={testState.status === "testing"}
>
{testState.status === "testing" ? (
<>
<Loader2 className="size-4 animate-spin mr-2" />
Authenticating...
</>
) : (
"Authenticate with GitHub"
)}
</Button>
}}
variant="outline"
className="w-full"
disabled={testState.status === "testing"}
>
{testState.status === "testing" ? (
<>
<Loader2 className="size-4 animate-spin mr-2" />
Getting device code...
</>
) : (
"Get Device Code"
)}
</Button>
</>
) : (
<>
<div className="space-y-3">
<div>
<p className="text-xs text-muted-foreground mb-1">1. Enter this code on GitHub:</p>
<div className="flex gap-2">
<code className="flex-1 bg-background border rounded px-3 py-2 text-sm font-mono text-foreground">
{githubCopilotCode.userCode}
</code>
<Button
size="sm"
variant="outline"
onClick={() => {
navigator.clipboard.writeText(githubCopilotCode.userCode);
toast.success("Code copied!");
}}
>
Copy
</Button>
</div>
</div>
<div>
<p className="text-xs text-muted-foreground mb-1">2. Open this URL (already opened in browser):</p>
<Button
variant="link"
size="sm"
className="h-auto p-0 text-xs"
onClick={() => window.open(githubCopilotCode.verificationUri, '_blank')}
>
{githubCopilotCode.verificationUri}
</Button>
</div>
<div>
<p className="text-xs text-muted-foreground mb-2">3. After authorizing on GitHub, click the button below:</p>
<Button
onClick={async () => {
try {
setTestState({ status: "testing" });
const authCheck = await window.ipc.invoke("github-copilot:isAuthenticated", null);
if (authCheck.authenticated) {
setTestState({ status: "success" });
setGithubCopilotCode(null);
toast.success("GitHub Copilot authenticated!");
// Reload models
const modelsResult = await window.ipc.invoke("models:list", null);
const catalog: Record<string, any[]> = {};
for (const p of modelsResult.providers || []) {
catalog[p.id] = p.models || [];
}
setModelsCatalog(catalog);
} else {
setTestState({ status: "error", error: "Not authenticated yet. Please complete authorization on GitHub." });
toast.error("Not authenticated yet");
}
} catch (error) {
const errorMsg = error instanceof Error ? error.message : "Error checking auth";
setTestState({ status: "error", error: errorMsg });
toast.error(`Error: ${errorMsg}`);
}
}}
className="w-full"
disabled={testState.status === "testing"}
>
{testState.status === "testing" ? (
<>
<Loader2 className="size-4 animate-spin mr-2" />
Checking...
</>
) : (
"I've Authorized on GitHub"
)}
</Button>
</div>
<Button
variant="ghost"
size="sm"
className="w-full text-xs"
onClick={() => {
setGithubCopilotCode(null);
setTestState({ status: "idle" });
}}
>
Cancel
</Button>
</div>
</>
)}
{testState.status === "error" && (
<div className="text-xs text-destructive">
{testState.error}
</div>
)}
</div>
)}

475
apps/x/dev-server.log Normal file
View file

@ -0,0 +1,475 @@
> x@0.1.0 dev
> npm run deps && concurrently -k "npm:renderer" "npm:main"
> x@0.1.0 deps
> npm run shared && npm run core && npm run preload
> x@0.1.0 shared
> cd packages/shared && npm run build
> build
> rm -rf dist && tsc
> x@0.1.0 core
> cd packages/core && npm run build
> build
> rm -rf dist && tsc
> x@0.1.0 preload
> cd apps/preload && npm run build
> build
> rm -rf dist && tsc && esbuild dist/preload.js --bundle --platform=node --format=cjs --external:electron --outfile=dist/preload.bundle.js && mv dist/preload.bundle.js dist/preload.js
dist/preload.bundle.js 526.8kb
⚡ Done in 16ms
[main]
[main] > x@0.1.0 main
[main] > wait-on http://localhost:5173 && cd apps/main && npm run build && npm run start
[main]
[renderer]
[renderer] > x@0.1.0 renderer
[renderer] > cd apps/renderer && npm run dev
[renderer]
[renderer]
[renderer] > dev
[renderer] > vite
[renderer]
[renderer]
[renderer] VITE v7.3.0 ready in 179 ms
[renderer]
[renderer] ➜ Local: http://localhost:5173/
[renderer] ➜ Network: use --host to expose
[main]
[main] > rowboat@0.1.0 build
[main] > rm -rf dist && tsc && node bundle.mjs
[main]
[main] ✅ Main process bundled to .package/dist-bundle/main.js
[main]
[main] > rowboat@0.1.0 start
[main] > electron .
[main]
[main] preloadPath: /home/wilber/rowboat/apps/x/apps/preload/dist/preload.js
[main] rendererPath: /home/wilber/rowboat/apps/x/apps/renderer/dist
[main] Starting Gmail Sync (TS)...
[main] Will sync every 300 seconds.
[main] Starting Google Calendar & Notes Sync (TS)...
[main] Will sync every 300 seconds.
[main] [Fireflies] Starting Fireflies Sync...
[main] [Fireflies] Will sync every 1800 seconds.
[main] [Fireflies] Syncing transcripts from the last 7 days.
[main] [Granola] Starting Granola Sync...
[main] [Granola] Will sync every 5 minutes.
[main] [Granola] Notes will be saved to: /home/wilber/.rowboat/knowledge/Meetings/granola
[main] [Granola] Starting sync...
[main] [GraphBuilder] Starting Knowledge Graph Builder Service...
[main] [GraphBuilder] Monitoring folders: gmail_sync, knowledge/Meetings/fireflies, knowledge/Meetings/granola, knowledge/Voice Memos
[main] [GraphBuilder] Will check for new content every 15 seconds
[main] [GraphBuilder] Checking for new content in all sources...
[main] [GraphBuilder] Starting voice memo processing...
[main] [GraphBuilder] Checking directory: /home/wilber/.rowboat/knowledge/Voice Memos
[main] [GraphBuilder] Directory does not exist
[main] [GraphBuilder] No unprocessed voice memos found
[main] [EmailLabeling] Starting Email Labeling Service...
[main] [EmailLabeling] Will check for unlabeled emails every 15 seconds
[main] [EmailLabeling] Checking for unlabeled emails...
[main] [EmailLabeling] No unlabeled emails found
[main] [NoteTagging] Starting Note Tagging Service...
[main] [NoteTagging] Will check for untagged notes every 15 seconds
[main] [NoteTagging] Checking for untagged notes...
[main] [NoteTagging] No untagged notes found
[main] [InlineTasks] Starting Inline Task Service...
[main] [InlineTasks] Will check for task blocks every 15 seconds
[main] [InlineTasks] Checking live notes...
[main] [InlineTasks] Found 1 pending task(s) in knowledge/Today.md
[main] [InlineTasks] Running task: "Create a daily brief for me..."
[main] [AgentRunner] Starting background agent runner service
[main] [AgentNotes] Starting Agent Notes Service...
[main] [AgentNotes] Will process every 10 seconds
[main] [ChromeSync] Server disabled, watching config for changes...
[main] [GraphBuilder] No new content to process
[main] [Fireflies] Starting sync...
[main] [Granola] Sync disabled in config
[main] [Granola] Sleeping for 5 minutes...
[main] Google OAuth credentials not available or missing required Gmail scope. Sleeping...
[main] Sleeping for 300 seconds...
[main] [Fireflies] Clearing auth cache
[main] [Fireflies] No valid client available
[main] [Fireflies] Sleeping for 1800 seconds...
[main] Google OAuth credentials not available or missing required Calendar/Drive scopes. Sleeping...
[main] Sleeping for 300 seconds...
[main] [OAuth] Clearing Google auth cache
[main] 2026-04-17T15:25:10.180Z [run-2026-04-17T15-25-09Z-0047239-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T15:25:10.180Z [run-2026-04-17T15-25-09Z-0047239-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T15:25:10.180Z [run-2026-04-17T15-25-09Z-0047239-000-inline_task_agent] [iter-1] dequeued user message 2026-04-17T15-25-09Z-0047239-001
[main] 2026-04-17T15:25:10.181Z [run-2026-04-17T15-25-09Z-0047239-000-inline_task_agent] [iter-1] running llm turn
[main] ! SENDING payload to model: [{"role":"user","content":"Execute the following instruction from the note \"knowledge/Today.md\":\n\n**Instruction:** Create a daily brief for me\n\n**Full note content for context:**\n```markdown\n---\nlive_note: true\n---\n# Today\n\n```task\n{\"instruction\":\"Create a daily brief for me\",\"schedule\":{\"type\":\"cron\",\"expression\":\"*/15 * * * *\",\"startDate\":\"2026-04-17T14:33:30.959Z\",\"endDate\":\"2027-04-17T14:33:30.959Z\"},\"schedule-label\":\"runs every 15 minutes\",\"targetId\":\"dailybrief\"}\n```\n\n<!--task-target:dailybrief-->\n<!--/task-target:dailybrief-->\n\n```"}]
[main] -> stream event {"type":"start"}
[main] unknown stream event: {"type":"start"}
[main] LoadAPIKeyError [AI_LoadAPIKeyError]: OpenAI API key is missing. Pass it using the 'apiKey' parameter or the OPENAI_API_KEY environment variable.
[main] at loadApiKey (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:939836:11)
[main] at Object.getHeaders2 [as headers] (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:953594:32)
[main] at OpenAIResponsesLanguageModel.doStream (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:952713:43)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948085:27)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944794:22
[main] at async _retryWithExponentialBackoff (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944933:12)
[main] at async streamStep (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948041:15)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948382:9)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944794:22 {
[main] cause: undefined,
[main] [Symbol(vercel.ai.error)]: true,
[main] [Symbol(vercel.ai.error.AI_LoadAPIKeyError)]: true
[main] }
[main] -> stream event {"type":"error","error":{"name":"AI_LoadAPIKeyError"}}
[main] 2026-04-17T15:25:10.218Z [run-2026-04-17T15-25-09Z-0047239-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T15:25:10.218Z [run-2026-04-17T15-25-09Z-0047239-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T15:25:10.218Z [run-2026-04-17T15-25-09Z-0047239-000-inline_task_agent] [iter-1] exiting loop, reason: last message is from assistant and text
[main] [InlineTasks] No response from agent for task
[main] [InlineTasks] Updated knowledge/Today.md
[main] [InlineTasks] No pending tasks found
[main] Error occurred in handler for 'workspace:readFile': [Error: ENOENT: no such file or directory, lstat '/home/wilber/.rowboat/config/exa-search.json'] {
[main] errno: -2,
[main] code: 'ENOENT',
[main] syscall: 'lstat',
[main] path: '/home/wilber/.rowboat/config/exa-search.json'
[main] }
[main] Error occurred in handler for 'workspace:readFile': [Error: ENOENT: no such file or directory, lstat '/home/wilber/.rowboat/config/exa-search.json'] {
[main] errno: -2,
[main] code: 'ENOENT',
[main] syscall: 'lstat',
[main] path: '/home/wilber/.rowboat/config/exa-search.json'
[main] }
[main] [OAuth] Clearing Google auth cache
[main] [GitHub Copilot] Starting Device Flow authentication...
[main] [GitHub Copilot] Requesting device code...
[main] [GitHub Copilot] Device code received. User code: C39B-A859
[main] [GitHub Copilot] Verification URI: https://github.com/login/device
[main] [GitHub Copilot] Polling for token...
[main] Abriendo en una sesión existente del navegador
[main] [GitHub Copilot] Authorization pending, polling again...
[main] [EmailLabeling] Checking for unlabeled emails...
[main] [EmailLabeling] No unlabeled emails found
[main] [NoteTagging] Checking for untagged notes...
[main] [NoteTagging] No untagged notes found
[main] [GraphBuilder] Checking for new content in all sources...
[main] [GraphBuilder] Starting voice memo processing...
[main] [GraphBuilder] Checking directory: /home/wilber/.rowboat/knowledge/Voice Memos
[main] [GraphBuilder] Directory does not exist
[main] [GraphBuilder] No unprocessed voice memos found
[main] [GraphBuilder] No new content to process
[main] [InlineTasks] Checking live notes...
[main] [InlineTasks] Found 1 pending task(s) in knowledge/Today.md
[main] [InlineTasks] Running task: "Create a daily brief for me..."
[main] 2026-04-17T15:25:25.228Z [run-2026-04-17T15-25-25Z-0047239-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T15:25:25.228Z [run-2026-04-17T15-25-25Z-0047239-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T15:25:25.228Z [run-2026-04-17T15-25-25Z-0047239-000-inline_task_agent] [iter-1] dequeued user message 2026-04-17T15-25-25Z-0047239-001
[main] 2026-04-17T15:25:25.229Z [run-2026-04-17T15-25-25Z-0047239-000-inline_task_agent] [iter-1] running llm turn
[main] ! SENDING payload to model: [{"role":"user","content":"Execute the following instruction from the note \"knowledge/Today.md\":\n\n**Instruction:** Create a daily brief for me\n\n**Full note content for context:**\n```markdown\n---\nlive_note: true\n---\n# Today\n\n```task\n{\"instruction\":\"Create a daily brief for me\",\"schedule\":{\"type\":\"cron\",\"expression\":\"*/15 * * * *\",\"startDate\":\"2026-04-17T14:33:30.959Z\",\"endDate\":\"2027-04-17T14:33:30.959Z\"},\"schedule-label\":\"runs every 15 minutes\",\"targetId\":\"dailybrief\"}\n```\n\n<!--task-target:dailybrief-->\n<!--/task-target:dailybrief-->\n\n```"}]
[main] -> stream event {"type":"start"}
[main] unknown stream event: {"type":"start"}
[main] LoadAPIKeyError [AI_LoadAPIKeyError]: OpenAI API key is missing. Pass it using the 'apiKey' parameter or the OPENAI_API_KEY environment variable.
[main] at loadApiKey (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:939836:11)
[main] at Object.getHeaders2 [as headers] (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:953594:32)
[main] at OpenAIResponsesLanguageModel.doStream (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:952713:43)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948085:27)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944794:22
[main] at async _retryWithExponentialBackoff (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944933:12)
[main] at async streamStep (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948041:15)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948382:9)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944794:22 {
[main] cause: undefined,
[main] [Symbol(vercel.ai.error)]: true,
[main] [Symbol(vercel.ai.error.AI_LoadAPIKeyError)]: true
[main] }
[main] -> stream event {"type":"error","error":{"name":"AI_LoadAPIKeyError"}}
[main] 2026-04-17T15:25:25.240Z [run-2026-04-17T15-25-25Z-0047239-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T15:25:25.240Z [run-2026-04-17T15-25-25Z-0047239-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T15:25:25.240Z [run-2026-04-17T15-25-25Z-0047239-000-inline_task_agent] [iter-1] exiting loop, reason: last message is from assistant and text
[main] [InlineTasks] No response from agent for task
[main] [InlineTasks] Updated knowledge/Today.md
[main] [InlineTasks] No pending tasks found
[main] [GitHub Copilot] Authorization pending, polling again...
[main] [OAuth] Clearing Google auth cache
[main] [GitHub Copilot] Authorization pending, polling again...
[main] [GitHub Copilot] Authorization pending, polling again...
[main] [EmailLabeling] Checking for unlabeled emails...
[main] [EmailLabeling] No unlabeled emails found
[main] [NoteTagging] Checking for untagged notes...
[main] [NoteTagging] No untagged notes found
[main] [GraphBuilder] Checking for new content in all sources...
[main] [GraphBuilder] Starting voice memo processing...
[main] [GraphBuilder] Checking directory: /home/wilber/.rowboat/knowledge/Voice Memos
[main] [GraphBuilder] Directory does not exist
[main] [GraphBuilder] No unprocessed voice memos found
[main] [GraphBuilder] No new content to process
[main] [OAuth] Clearing Google auth cache
[main] [InlineTasks] Checking live notes...
[main] [InlineTasks] Found 1 pending task(s) in knowledge/Today.md
[main] [InlineTasks] Running task: "Create a daily brief for me..."
[main] 2026-04-17T15:25:40.250Z [run-2026-04-17T15-25-40Z-0047239-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T15:25:40.250Z [run-2026-04-17T15-25-40Z-0047239-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T15:25:40.250Z [run-2026-04-17T15-25-40Z-0047239-000-inline_task_agent] [iter-1] dequeued user message 2026-04-17T15-25-40Z-0047239-001
[main] 2026-04-17T15:25:40.251Z [run-2026-04-17T15-25-40Z-0047239-000-inline_task_agent] [iter-1] running llm turn
[main] ! SENDING payload to model: [{"role":"user","content":"Execute the following instruction from the note \"knowledge/Today.md\":\n\n**Instruction:** Create a daily brief for me\n\n**Full note content for context:**\n```markdown\n---\nlive_note: true\n---\n# Today\n\n```task\n{\"instruction\":\"Create a daily brief for me\",\"schedule\":{\"type\":\"cron\",\"expression\":\"*/15 * * * *\",\"startDate\":\"2026-04-17T14:33:30.959Z\",\"endDate\":\"2027-04-17T14:33:30.959Z\"},\"schedule-label\":\"runs every 15 minutes\",\"targetId\":\"dailybrief\"}\n```\n\n<!--task-target:dailybrief-->\n<!--/task-target:dailybrief-->\n\n```"}]
[main] -> stream event {"type":"start"}
[main] unknown stream event: {"type":"start"}
[main] LoadAPIKeyError [AI_LoadAPIKeyError]: OpenAI API key is missing. Pass it using the 'apiKey' parameter or the OPENAI_API_KEY environment variable.
[main] at loadApiKey (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:939836:11)
[main] at Object.getHeaders2 [as headers] (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:953594:32)
[main] at OpenAIResponsesLanguageModel.doStream (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:952713:43)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948085:27)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944794:22
[main] at async _retryWithExponentialBackoff (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944933:12)
[main] at async streamStep (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948041:15)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948382:9)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944794:22 {
[main] cause: undefined,
[main] [Symbol(vercel.ai.error)]: true,
[main] [Symbol(vercel.ai.error.AI_LoadAPIKeyError)]: true
[main] }
[main] -> stream event {"type":"error","error":{"name":"AI_LoadAPIKeyError"}}
[main] 2026-04-17T15:25:40.263Z [run-2026-04-17T15-25-40Z-0047239-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T15:25:40.263Z [run-2026-04-17T15-25-40Z-0047239-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T15:25:40.263Z [run-2026-04-17T15-25-40Z-0047239-000-inline_task_agent] [iter-1] exiting loop, reason: last message is from assistant and text
[main] [InlineTasks] No response from agent for task
[main] [InlineTasks] Updated knowledge/Today.md
[main] [InlineTasks] No pending tasks found
[main] [GitHub Copilot] Authorization pending, polling again...
[main] [OAuth] Clearing Google auth cache
[main] [GitHub Copilot] Authorization pending, polling again...
[main] [EmailLabeling] Checking for unlabeled emails...
[main] [EmailLabeling] No unlabeled emails found
[main] [NoteTagging] Checking for untagged notes...
[main] [NoteTagging] No untagged notes found
[main] [GraphBuilder] Checking for new content in all sources...
[main] [GraphBuilder] Starting voice memo processing...
[main] [GraphBuilder] Checking directory: /home/wilber/.rowboat/knowledge/Voice Memos
[main] [GraphBuilder] Directory does not exist
[main] [GraphBuilder] No unprocessed voice memos found
[main] [GraphBuilder] No new content to process
[main] [InlineTasks] Checking live notes...
[main] [InlineTasks] Found 1 pending task(s) in knowledge/Today.md
[main] [InlineTasks] Running task: "Create a daily brief for me..."
[main] 2026-04-17T15:25:55.274Z [run-2026-04-17T15-25-55Z-0047239-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T15:25:55.274Z [run-2026-04-17T15-25-55Z-0047239-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T15:25:55.274Z [run-2026-04-17T15-25-55Z-0047239-000-inline_task_agent] [iter-1] dequeued user message 2026-04-17T15-25-55Z-0047239-001
[main] 2026-04-17T15:25:55.274Z [run-2026-04-17T15-25-55Z-0047239-000-inline_task_agent] [iter-1] running llm turn
[main] ! SENDING payload to model: [{"role":"user","content":"Execute the following instruction from the note \"knowledge/Today.md\":\n\n**Instruction:** Create a daily brief for me\n\n**Full note content for context:**\n```markdown\n---\nlive_note: true\n---\n# Today\n\n```task\n{\"instruction\":\"Create a daily brief for me\",\"schedule\":{\"type\":\"cron\",\"expression\":\"*/15 * * * *\",\"startDate\":\"2026-04-17T14:33:30.959Z\",\"endDate\":\"2027-04-17T14:33:30.959Z\"},\"schedule-label\":\"runs every 15 minutes\",\"targetId\":\"dailybrief\"}\n```\n\n<!--task-target:dailybrief-->\n<!--/task-target:dailybrief-->\n\n```"}]
[main] -> stream event {"type":"start"}
[main] unknown stream event: {"type":"start"}
[main] LoadAPIKeyError [AI_LoadAPIKeyError]: OpenAI API key is missing. Pass it using the 'apiKey' parameter or the OPENAI_API_KEY environment variable.
[main] at loadApiKey (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:939836:11)
[main] at Object.getHeaders2 [as headers] (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:953594:32)
[main] at OpenAIResponsesLanguageModel.doStream (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:952713:43)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948085:27)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944794:22
[main] at async _retryWithExponentialBackoff (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944933:12)
[main] at async streamStep (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948041:15)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948382:9)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944794:22 {
[main] cause: undefined,
[main] [Symbol(vercel.ai.error)]: true,
[main] [Symbol(vercel.ai.error.AI_LoadAPIKeyError)]: true
[main] }
[main] -> stream event {"type":"error","error":{"name":"AI_LoadAPIKeyError"}}
[main] 2026-04-17T15:25:55.290Z [run-2026-04-17T15-25-55Z-0047239-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T15:25:55.290Z [run-2026-04-17T15-25-55Z-0047239-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T15:25:55.290Z [run-2026-04-17T15-25-55Z-0047239-000-inline_task_agent] [iter-1] exiting loop, reason: last message is from assistant and text
[main] [InlineTasks] No response from agent for task
[main] [InlineTasks] Updated knowledge/Today.md
[main] [InlineTasks] No pending tasks found
[main] [GitHub Copilot] Authorization pending, polling again...
[main] [OAuth] Clearing Google auth cache
[main] [GitHub Copilot] Authorization pending, polling again...
[main] Abriendo en una sesión existente del navegador
[main] [GitHub Copilot] Authorization pending, polling again...
[main] [EmailLabeling] Checking for unlabeled emails...
[main] [EmailLabeling] No unlabeled emails found
[main] [NoteTagging] Checking for untagged notes...
[main] [NoteTagging] No untagged notes found
[main] [GraphBuilder] Checking for new content in all sources...
[main] [GraphBuilder] Starting voice memo processing...
[main] [GraphBuilder] Checking directory: /home/wilber/.rowboat/knowledge/Voice Memos
[main] [GraphBuilder] Directory does not exist
[main] [GraphBuilder] No unprocessed voice memos found
[main] [GraphBuilder] No new content to process
[main] [OAuth] Clearing Google auth cache
[main] [InlineTasks] Checking live notes...
[main] [InlineTasks] Found 1 pending task(s) in knowledge/Today.md
[main] [InlineTasks] Running task: "Create a daily brief for me..."
[main] 2026-04-17T15:26:10.299Z [run-2026-04-17T15-26-10Z-0047239-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T15:26:10.299Z [run-2026-04-17T15-26-10Z-0047239-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T15:26:10.299Z [run-2026-04-17T15-26-10Z-0047239-000-inline_task_agent] [iter-1] dequeued user message 2026-04-17T15-26-10Z-0047239-001
[main] 2026-04-17T15:26:10.299Z [run-2026-04-17T15-26-10Z-0047239-000-inline_task_agent] [iter-1] running llm turn
[main] ! SENDING payload to model: [{"role":"user","content":"Execute the following instruction from the note \"knowledge/Today.md\":\n\n**Instruction:** Create a daily brief for me\n\n**Full note content for context:**\n```markdown\n---\nlive_note: true\n---\n# Today\n\n```task\n{\"instruction\":\"Create a daily brief for me\",\"schedule\":{\"type\":\"cron\",\"expression\":\"*/15 * * * *\",\"startDate\":\"2026-04-17T14:33:30.959Z\",\"endDate\":\"2027-04-17T14:33:30.959Z\"},\"schedule-label\":\"runs every 15 minutes\",\"targetId\":\"dailybrief\"}\n```\n\n<!--task-target:dailybrief-->\n<!--/task-target:dailybrief-->\n\n```"}]
[main] -> stream event {"type":"start"}
[main] unknown stream event: {"type":"start"}
[main] LoadAPIKeyError [AI_LoadAPIKeyError]: OpenAI API key is missing. Pass it using the 'apiKey' parameter or the OPENAI_API_KEY environment variable.
[main] at loadApiKey (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:939836:11)
[main] at Object.getHeaders2 [as headers] (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:953594:32)
[main] at OpenAIResponsesLanguageModel.doStream (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:952713:43)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948085:27)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944794:22
[main] at async _retryWithExponentialBackoff (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944933:12)
[main] at async streamStep (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948041:15)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948382:9)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944794:22 {
[main] cause: undefined,
[main] [Symbol(vercel.ai.error)]: true,
[main] [Symbol(vercel.ai.error.AI_LoadAPIKeyError)]: true
[main] }
[main] -> stream event {"type":"error","error":{"name":"AI_LoadAPIKeyError"}}
[main] 2026-04-17T15:26:10.308Z [run-2026-04-17T15-26-10Z-0047239-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T15:26:10.308Z [run-2026-04-17T15-26-10Z-0047239-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T15:26:10.308Z [run-2026-04-17T15-26-10Z-0047239-000-inline_task_agent] [iter-1] exiting loop, reason: last message is from assistant and text
[main] [InlineTasks] No response from agent for task
[main] [InlineTasks] Updated knowledge/Today.md
[main] [InlineTasks] No pending tasks found
[main] [GitHub Copilot] Authorization pending, polling again...
[main] [GitHub Copilot] Authorization pending, polling again...
[main] [OAuth] Clearing Google auth cache
[main] [GitHub Copilot] Authorization pending, polling again...
[main] [EmailLabeling] Checking for unlabeled emails...
[main] [EmailLabeling] No unlabeled emails found
[main] [NoteTagging] Checking for untagged notes...
[main] [NoteTagging] No untagged notes found
[main] [GraphBuilder] Checking for new content in all sources...
[main] [GraphBuilder] Starting voice memo processing...
[main] [GraphBuilder] Checking directory: /home/wilber/.rowboat/knowledge/Voice Memos
[main] [GraphBuilder] Directory does not exist
[main] [GraphBuilder] No unprocessed voice memos found
[main] [GraphBuilder] No new content to process
[main] [InlineTasks] Checking live notes...
[main] [InlineTasks] Found 1 pending task(s) in knowledge/Today.md
[main] [InlineTasks] Running task: "Create a daily brief for me..."
[main] 2026-04-17T15:26:25.316Z [run-2026-04-17T15-26-25Z-0047239-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T15:26:25.316Z [run-2026-04-17T15-26-25Z-0047239-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T15:26:25.316Z [run-2026-04-17T15-26-25Z-0047239-000-inline_task_agent] [iter-1] dequeued user message 2026-04-17T15-26-25Z-0047239-001
[main] 2026-04-17T15:26:25.316Z [run-2026-04-17T15-26-25Z-0047239-000-inline_task_agent] [iter-1] running llm turn
[main] ! SENDING payload to model: [{"role":"user","content":"Execute the following instruction from the note \"knowledge/Today.md\":\n\n**Instruction:** Create a daily brief for me\n\n**Full note content for context:**\n```markdown\n---\nlive_note: true\n---\n# Today\n\n```task\n{\"instruction\":\"Create a daily brief for me\",\"schedule\":{\"type\":\"cron\",\"expression\":\"*/15 * * * *\",\"startDate\":\"2026-04-17T14:33:30.959Z\",\"endDate\":\"2027-04-17T14:33:30.959Z\"},\"schedule-label\":\"runs every 15 minutes\",\"targetId\":\"dailybrief\"}\n```\n\n<!--task-target:dailybrief-->\n<!--/task-target:dailybrief-->\n\n```"}]
[main] -> stream event {"type":"start"}
[main] unknown stream event: {"type":"start"}
[main] LoadAPIKeyError [AI_LoadAPIKeyError]: OpenAI API key is missing. Pass it using the 'apiKey' parameter or the OPENAI_API_KEY environment variable.
[main] at loadApiKey (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:939836:11)
[main] at Object.getHeaders2 [as headers] (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:953594:32)
[main] at OpenAIResponsesLanguageModel.doStream (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:952713:43)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948085:27)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944794:22
[main] at async _retryWithExponentialBackoff (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944933:12)
[main] at async streamStep (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948041:15)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948382:9)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944794:22 {
[main] cause: undefined,
[main] [Symbol(vercel.ai.error)]: true,
[main] [Symbol(vercel.ai.error.AI_LoadAPIKeyError)]: true
[main] }
[main] -> stream event {"type":"error","error":{"name":"AI_LoadAPIKeyError"}}
[main] 2026-04-17T15:26:25.324Z [run-2026-04-17T15-26-25Z-0047239-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T15:26:25.324Z [run-2026-04-17T15-26-25Z-0047239-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T15:26:25.324Z [run-2026-04-17T15-26-25Z-0047239-000-inline_task_agent] [iter-1] exiting loop, reason: last message is from assistant and text
[main] [InlineTasks] No response from agent for task
[main] [InlineTasks] Updated knowledge/Today.md
[main] [InlineTasks] No pending tasks found
[main] [GitHub Copilot] Authorization pending, polling again...
[main] [OAuth] Clearing Google auth cache
[main] [GitHub Copilot] Authorization pending, polling again...
[main] [GitHub Copilot] Polling error: ZodError: [
[main] {
[main] "code": "invalid_value",
[main] "values": [
[main] "Bearer"
[main] ],
[main] "path": [
[main] "token_type"
[main] ],
[main] "message": "Invalid input: expected \"Bearer\""
[main] }
[main] ]
[main] at pollForToken (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:965133:34)
[main] at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
[main] [EmailLabeling] Checking for unlabeled emails...
[main] [EmailLabeling] No unlabeled emails found
[main] [NoteTagging] Checking for untagged notes...
[main] [NoteTagging] No untagged notes found
[main] [GraphBuilder] Checking for new content in all sources...
[main] [GraphBuilder] Starting voice memo processing...
[main] [GraphBuilder] Checking directory: /home/wilber/.rowboat/knowledge/Voice Memos
[main] [GraphBuilder] Directory does not exist
[main] [GraphBuilder] No unprocessed voice memos found
[main] [GraphBuilder] No new content to process
[main] [OAuth] Clearing Google auth cache
[main] [InlineTasks] Checking live notes...
[main] [InlineTasks] Found 1 pending task(s) in knowledge/Today.md
[main] [InlineTasks] Running task: "Create a daily brief for me..."
[main] 2026-04-17T15:26:40.332Z [run-2026-04-17T15-26-40Z-0047239-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T15:26:40.332Z [run-2026-04-17T15-26-40Z-0047239-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T15:26:40.332Z [run-2026-04-17T15-26-40Z-0047239-000-inline_task_agent] [iter-1] dequeued user message 2026-04-17T15-26-40Z-0047239-001
[main] 2026-04-17T15:26:40.333Z [run-2026-04-17T15-26-40Z-0047239-000-inline_task_agent] [iter-1] running llm turn
[main] ! SENDING payload to model: [{"role":"user","content":"Execute the following instruction from the note \"knowledge/Today.md\":\n\n**Instruction:** Create a daily brief for me\n\n**Full note content for context:**\n```markdown\n---\nlive_note: true\n---\n# Today\n\n```task\n{\"instruction\":\"Create a daily brief for me\",\"schedule\":{\"type\":\"cron\",\"expression\":\"*/15 * * * *\",\"startDate\":\"2026-04-17T14:33:30.959Z\",\"endDate\":\"2027-04-17T14:33:30.959Z\"},\"schedule-label\":\"runs every 15 minutes\",\"targetId\":\"dailybrief\"}\n```\n\n<!--task-target:dailybrief-->\n<!--/task-target:dailybrief-->\n\n```"}]
[main] -> stream event {"type":"start"}
[main] unknown stream event: {"type":"start"}
[main] LoadAPIKeyError [AI_LoadAPIKeyError]: OpenAI API key is missing. Pass it using the 'apiKey' parameter or the OPENAI_API_KEY environment variable.
[main] at loadApiKey (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:939836:11)
[main] at Object.getHeaders2 [as headers] (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:953594:32)
[main] at OpenAIResponsesLanguageModel.doStream (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:952713:43)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948085:27)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944794:22
[main] at async _retryWithExponentialBackoff (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944933:12)
[main] at async streamStep (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948041:15)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948382:9)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944794:22 {
[main] cause: undefined,
[main] [Symbol(vercel.ai.error)]: true,
[main] [Symbol(vercel.ai.error.AI_LoadAPIKeyError)]: true
[main] }
[main] -> stream event {"type":"error","error":{"name":"AI_LoadAPIKeyError"}}
[main] 2026-04-17T15:26:40.343Z [run-2026-04-17T15-26-40Z-0047239-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T15:26:40.343Z [run-2026-04-17T15-26-40Z-0047239-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T15:26:40.343Z [run-2026-04-17T15-26-40Z-0047239-000-inline_task_agent] [iter-1] exiting loop, reason: last message is from assistant and text
[main] [InlineTasks] No response from agent for task
[main] [InlineTasks] Updated knowledge/Today.md
[main] [InlineTasks] No pending tasks found
[main] [GitHub Copilot] Polling error: ZodError: [
[main] {
[main] "code": "invalid_value",
[main] "values": [
[main] "Bearer"
[main] ],
[main] "path": [
[main] "token_type"
[main] ],
[main] "message": "Invalid input: expected \"Bearer\""
[main] }
[main] ]
[main] at pollForToken (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:965133:34)
[main] at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
[main] [GitHub Copilot] Polling error: ZodError: [
[main] {
[main] "code": "invalid_value",
[main] "values": [
[main] "Bearer"
[main] ],
[main] "path": [
[main] "token_type"
[main] ],
[main] "message": "Invalid input: expected \"Bearer\""
[main] }
[main] ]
[main] at pollForToken (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:965133:34)
[main] at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
[main] [OAuth] Clearing Google auth cache
[renderer] npm run renderer exited with code SIGTERM
--> Sending SIGTERM to other processes..
[main] /home/wilber/rowboat/apps/x/node_modules/.pnpm/electron@39.2.7/node_modules/electron/dist/electron exited with signal SIGTERM
[main] npm run main exited with code SIGTERM

194
apps/x/dev.log Normal file
View file

@ -0,0 +1,194 @@
> x@0.1.0 dev
> npm run deps && concurrently -k "npm:renderer" "npm:main"
> x@0.1.0 deps
> npm run shared && npm run core && npm run preload
> x@0.1.0 shared
> cd packages/shared && npm run build
> build
> rm -rf dist && tsc
> x@0.1.0 core
> cd packages/core && npm run build
> build
> rm -rf dist && tsc
> x@0.1.0 preload
> cd apps/preload && npm run build
> build
> rm -rf dist && tsc && esbuild dist/preload.js --bundle --platform=node --format=cjs --external:electron --outfile=dist/preload.bundle.js && mv dist/preload.bundle.js dist/preload.js
dist/preload.bundle.js 525.9kb
⚡ Done in 15ms
[renderer]
[renderer] > x@0.1.0 renderer
[renderer] > cd apps/renderer && npm run dev
[renderer]
[main]
[main] > x@0.1.0 main
[main] > wait-on http://localhost:5173 && cd apps/main && npm run build && npm run start
[main]
[renderer]
[renderer] > dev
[renderer] > vite
[renderer]
[renderer]
[renderer] VITE v7.3.0 ready in 221 ms
[renderer]
[renderer] ➜ Local: http://localhost:5173/
[renderer] ➜ Network: use --host to expose
[main]
[main] > rowboat@0.1.0 build
[main] > rm -rf dist && tsc && node bundle.mjs
[main]
[main] ✅ Main process bundled to .package/dist-bundle/main.js
[main]
[main] > rowboat@0.1.0 start
[main] > electron .
[main]
[main] preloadPath /home/wilber/rowboat/apps/x/apps/preload/dist/preload.js
[main] rendererPath /home/wilber/rowboat/apps/x/apps/renderer/dist
[main] Starting Gmail Sync (TS)...
[main] Will sync every 300 seconds.
[main] Starting Google Calendar & Notes Sync (TS)...
[main] Will sync every 300 seconds.
[main] [Fireflies] Starting Fireflies Sync...
[main] [Fireflies] Will sync every 1800 seconds.
[main] [Fireflies] Syncing transcripts from the last 7 days.
[main] [Granola] Starting Granola Sync...
[main] [Granola] Will sync every 5 minutes.
[main] [Granola] Notes will be saved to: /home/wilber/.rowboat/knowledge/Meetings/granola
[main] [Granola] Starting sync...
[main] [GraphBuilder] Starting Knowledge Graph Builder Service...
[main] [GraphBuilder] Monitoring folders: gmail_sync, knowledge/Meetings/fireflies, knowledge/Meetings/granola, knowledge/Voice Memos
[main] [GraphBuilder] Will check for new content every 15 seconds
[main] [GraphBuilder] Checking for new content in all sources...
[main] [GraphBuilder] Starting voice memo processing...
[main] [GraphBuilder] Checking directory: /home/wilber/.rowboat/knowledge/Voice Memos
[main] [GraphBuilder] Directory does not exist
[main] [GraphBuilder] No unprocessed voice memos found
[main] [EmailLabeling] Starting Email Labeling Service...
[main] [EmailLabeling] Will check for unlabeled emails every 15 seconds
[main] [EmailLabeling] Checking for unlabeled emails...
[main] [EmailLabeling] No unlabeled emails found
[main] [NoteTagging] Starting Note Tagging Service...
[main] [NoteTagging] Will check for untagged notes every 15 seconds
[main] [NoteTagging] Checking for untagged notes...
[main] [NoteTagging] No untagged notes found
[main] [InlineTasks] Starting Inline Task Service...
[main] [InlineTasks] Will check for task blocks every 15 seconds
[main] [InlineTasks] Checking live notes...
[main] [InlineTasks] Found 1 pending task(s) in knowledge/Today.md
[main] [InlineTasks] Running task: "Create a daily brief for me..."
[main] [AgentRunner] Starting background agent runner service
[main] [AgentNotes] Starting Agent Notes Service...
[main] [AgentNotes] Will process every 10 seconds
[main] [ChromeSync] Server disabled, watching config for changes...
[main] [GraphBuilder] No new content to process
[main] [Fireflies] Starting sync...
[main] [Granola] Sync disabled in config
[main] [Granola] Sleeping for 5 minutes...
[main] Google OAuth credentials not available or missing required Gmail scope. Sleeping...
[main] Sleeping for 300 seconds...
[main] Google OAuth credentials not available or missing required Calendar/Drive scopes. Sleeping...
[main] Sleeping for 300 seconds...
[main] [Fireflies] Clearing auth cache
[main] [Fireflies] No valid client available
[main] [Fireflies] Sleeping for 1800 seconds...
[main] [OAuth] Clearing Google auth cache
[main] 2026-04-17T14:51:34.860Z [run-2026-04-17T14-51-34Z-0033765-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T14:51:34.860Z [run-2026-04-17T14-51-34Z-0033765-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T14:51:34.860Z [run-2026-04-17T14-51-34Z-0033765-000-inline_task_agent] [iter-1] dequeued user message 2026-04-17T14-51-34Z-0033765-001
[main] 2026-04-17T14:51:34.862Z [run-2026-04-17T14-51-34Z-0033765-000-inline_task_agent] [iter-1] running llm turn
[main] ! SENDING payload to model: [{"role":"user","content":"Execute the following instruction from the note \"knowledge/Today.md\":\n\n**Instruction:** Create a daily brief for me\n\n**Full note content for context:**\n```markdown\n---\nlive_note: true\n---\n# Today\n\n```task\n{\"instruction\":\"Create a daily brief for me\",\"schedule\":{\"type\":\"cron\",\"expression\":\"*/15 * * * *\",\"startDate\":\"2026-04-17T14:33:30.959Z\",\"endDate\":\"2027-04-17T14:33:30.959Z\"},\"schedule-label\":\"runs every 15 minutes\",\"targetId\":\"dailybrief\"}\n```\n\n<!--task-target:dailybrief-->\n<!--/task-target:dailybrief-->\n\n```"}]
[main] -> stream event {"type":"start"}
[main] unknown stream event: {"type":"start"}
[main] LoadAPIKeyError [AI_LoadAPIKeyError]: OpenAI API key is missing. Pass it using the 'apiKey' parameter or the OPENAI_API_KEY environment variable.
[main] at loadApiKey (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:939803:11)
[main] at Object.getHeaders2 [as headers] (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:953561:32)
[main] at OpenAIResponsesLanguageModel.doStream (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:952680:43)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948052:27)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944761:22
[main] at async _retryWithExponentialBackoff (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944900:12)
[main] at async streamStep (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948008:15)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948349:9)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944761:22 {
[main] cause: undefined,
[main] [Symbol(vercel.ai.error)]: true,
[main] [Symbol(vercel.ai.error.AI_LoadAPIKeyError)]: true
[main] }
[main] -> stream event {"type":"error","error":{"name":"AI_LoadAPIKeyError"}}
[main] 2026-04-17T14:51:34.901Z [run-2026-04-17T14-51-34Z-0033765-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T14:51:34.902Z [run-2026-04-17T14-51-34Z-0033765-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T14:51:34.902Z [run-2026-04-17T14-51-34Z-0033765-000-inline_task_agent] [iter-1] exiting loop, reason: last message is from assistant and text
[main] [InlineTasks] No response from agent for task
[main] [InlineTasks] Updated knowledge/Today.md
[main] [InlineTasks] No pending tasks found
[main] Error occurred in handler for 'workspace:readFile': [Error: ENOENT: no such file or directory, lstat '/home/wilber/.rowboat/config/exa-search.json'] {
[main] errno: -2,
[main] code: 'ENOENT',
[main] syscall: 'lstat',
[main] path: '/home/wilber/.rowboat/config/exa-search.json'
[main] }
[main] Error occurred in handler for 'workspace:readFile': [Error: ENOENT: no such file or directory, lstat '/home/wilber/.rowboat/config/exa-search.json'] {
[main] errno: -2,
[main] code: 'ENOENT',
[main] syscall: 'lstat',
[main] path: '/home/wilber/.rowboat/config/exa-search.json'
[main] }
[main] [OAuth] Clearing Google auth cache
[main] [EmailLabeling] Checking for unlabeled emails...
[main] [EmailLabeling] No unlabeled emails found
[main] [NoteTagging] Checking for untagged notes...
[main] [NoteTagging] No untagged notes found
[main] [GraphBuilder] Checking for new content in all sources...
[main] [GraphBuilder] Starting voice memo processing...
[main] [GraphBuilder] Checking directory: /home/wilber/.rowboat/knowledge/Voice Memos
[main] [GraphBuilder] Directory does not exist
[main] [GraphBuilder] No unprocessed voice memos found
[main] [GraphBuilder] No new content to process
[main] [InlineTasks] Checking live notes...
[main] [InlineTasks] Found 1 pending task(s) in knowledge/Today.md
[main] [InlineTasks] Running task: "Create a daily brief for me..."
[main] 2026-04-17T14:51:49.911Z [run-2026-04-17T14-51-49Z-0033765-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T14:51:49.911Z [run-2026-04-17T14-51-49Z-0033765-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T14:51:49.911Z [run-2026-04-17T14-51-49Z-0033765-000-inline_task_agent] [iter-1] dequeued user message 2026-04-17T14-51-49Z-0033765-001
[main] 2026-04-17T14:51:49.912Z [run-2026-04-17T14-51-49Z-0033765-000-inline_task_agent] [iter-1] running llm turn
[main] ! SENDING payload to model: [{"role":"user","content":"Execute the following instruction from the note \"knowledge/Today.md\":\n\n**Instruction:** Create a daily brief for me\n\n**Full note content for context:**\n```markdown\n---\nlive_note: true\n---\n# Today\n\n```task\n{\"instruction\":\"Create a daily brief for me\",\"schedule\":{\"type\":\"cron\",\"expression\":\"*/15 * * * *\",\"startDate\":\"2026-04-17T14:33:30.959Z\",\"endDate\":\"2027-04-17T14:33:30.959Z\"},\"schedule-label\":\"runs every 15 minutes\",\"targetId\":\"dailybrief\"}\n```\n\n<!--task-target:dailybrief-->\n<!--/task-target:dailybrief-->\n\n```"}]
[main] -> stream event {"type":"start"}
[main] unknown stream event: {"type":"start"}
[main] LoadAPIKeyError [AI_LoadAPIKeyError]: OpenAI API key is missing. Pass it using the 'apiKey' parameter or the OPENAI_API_KEY environment variable.
[main] at loadApiKey (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:939803:11)
[main] at Object.getHeaders2 [as headers] (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:953561:32)
[main] at OpenAIResponsesLanguageModel.doStream (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:952680:43)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948052:27)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944761:22
[main] at async _retryWithExponentialBackoff (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944900:12)
[main] at async streamStep (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948008:15)
[main] at async fn (/home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:948349:9)
[main] at async /home/wilber/rowboat/apps/x/apps/main/.package/dist/main.cjs:944761:22 {
[main] cause: undefined,
[main] [Symbol(vercel.ai.error)]: true,
[main] [Symbol(vercel.ai.error.AI_LoadAPIKeyError)]: true
[main] }
[main] -> stream event {"type":"error","error":{"name":"AI_LoadAPIKeyError"}}
[main] 2026-04-17T14:51:49.925Z [run-2026-04-17T14-51-49Z-0033765-000-inline_task_agent] using model: gpt-5.4
[main] 2026-04-17T14:51:49.925Z [run-2026-04-17T14-51-49Z-0033765-000-inline_task_agent] [iter-1] starting loop iteration
[main] 2026-04-17T14:51:49.925Z [run-2026-04-17T14-51-49Z-0033765-000-inline_task_agent] [iter-1] exiting loop, reason: last message is from assistant and text
[main] [InlineTasks] No response from agent for task
[main] [InlineTasks] Updated knowledge/Today.md
[main] [InlineTasks] No pending tasks found

View file

@ -7,7 +7,7 @@ export const OAuthTokens = z.object({
access_token: z.string(),
refresh_token: z.string().nullable(),
expires_at: z.number(), // Unix timestamp
token_type: z.literal('Bearer').optional(),
token_type: z.string().optional(), // Accept any token type (Bearer, bearer, etc.)
scopes: z.array(z.string()).optional(), // Granted scopes from OAuth response
});

8
compile-output.log Normal file
View file

@ -0,0 +1,8 @@
npm error code ENOENT
npm error syscall open
npm error path /home/wilber/rowboat/package.json
npm error errno -2
npm error enoent Could not read package.json: Error: ENOENT: no such file or directory, open '/home/wilber/rowboat/package.json'
npm error enoent This is related to npm not being able to find a file.
npm error enoent
npm error A complete log of this run can be found in: /home/wilber/.npm/_logs/2026-04-17T15_19_27_924Z-debug-0.log