98e40dac97
CLI Smoke Test / smoke-test-linux (20) (push) Has been cancelled
CLI Smoke Test / smoke-test-linux (24) (push) Has been cancelled
CLI Smoke Test / smoke-test-windows (20) (push) Has been cancelled
CLI Smoke Test / smoke-test-windows (24) (push) Has been cancelled
Expo App TypeScript typecheck / typecheck (push) Has been cancelled
354 lines
9.8 KiB
Markdown
354 lines
9.8 KiB
Markdown
# APi eeror?
|
|
|
|
API Error: 500 {"type":"error","error":{"type":"api_error","message":"Overloaded"}}
|
|
|
|
Not showng
|
|
Session
|
|
213d643d-fc52-4d43-83cd-d4d1e1b45fc6
|
|
logs /Users/kirilldubovitskiy/.happy/logs/2025-07-20-20-48-12.log
|
|
|
|
|
|
|
|
|
|
# July 20
|
|
|
|
3) permission cancelling
|
|
5) nice to have - live activity
|
|
6) possible crash when disconnects?
|
|
|
|
Push notification on result
|
|
Test how permission mode is exited from when in remote
|
|
|
|
Expired permission requests?
|
|
|
|
How do we know that Claude is waiting for us in interactive session
|
|
|
|
On decline - what happens?
|
|
On timeout?
|
|
|
|
Cli version report
|
|
|
|
Not kirill
|
|
4) permission ui
|
|
|
|
updateMetadata - update with usage
|
|
|
|
- Permission request times out
|
|
|
|
Failed to get or create session - crashes the cli
|
|
Ideally we want remote mode to be optional.
|
|
Should do this with lazy initialization
|
|
|
|
|
|
show we are stuck - likely waiting for permissions?
|
|
|
|
### Edge cases:
|
|
- When we are stuck in permissions - we are unable to text & get a response
|
|
|
|
- User write lol.txt
|
|
- Permission blocks for 5 minutes
|
|
- If they don't respond within 4.5 minutes,
|
|
- we should abort ourselves, keep the permission up on the client
|
|
- Lets look at async generator to abort
|
|
- When they approve permission next time
|
|
- We should continue
|
|
- We should cache permissions previously approved - so on repeat requests - we will auto approve? - later
|
|
|
|
? Where is the timeout actually coming from?
|
|
- Is it claude or mcp server configuration?
|
|
- If MCP has defualt timeouts
|
|
- Trying from MCP debug tool - timeout maxx start at 2:35
|
|
|
|
|
|
- Calling interrupt & blocking on mcp server does not yield results. MIght have to do it at the same time
|
|
|
|
-
|
|
|
|
[14:09:13.746] [MessageQueue] waitForNext() adding waiter. Total waiters: 1
|
|
[14:13:40.716] [claudeRemote] Received message from SDK: user
|
|
[14:13:40.717] [CLAUDE] Message from non interactive & remote mode:
|
|
{
|
|
"type": "user",
|
|
"message": {
|
|
"role": "user",
|
|
"content": [
|
|
{
|
|
"type": "tool_result",
|
|
"content": "Error calling tool",
|
|
"is_error": true,
|
|
"tool_use_id": "toolu_01BHgTzQcaoa7KMq8sMe1HU1"
|
|
}
|
|
]
|
|
},
|
|
"parent_tool_use_id": null,
|
|
"session_id": "8226266e-9953-4ea2-b6f1-17384bb4d469"
|
|
}
|
|
|
|
|
|
Anoterh sample
|
|
|
|
[14:13:45.662] [CLAUDE] Message from non interactive & remote mode:
|
|
|
|
14:18:46.683 - error
|
|
|
|
Basically exactly 5 minutes.
|
|
|
|
? How do we get the expiration?
|
|
? We should reset the permissions?
|
|
|
|
Or we should allow them to
|
|
|
|
|
|
Now it fails after 5 minutes and tries again with a different permissions? or same
|
|
|
|
We want to
|
|
|
|
##
|
|
|
|
[15:01:29.481] [SOCKET] Sending message through socket:
|
|
{
|
|
"role": "agent",
|
|
"content": {
|
|
"type": "output",
|
|
"data": {
|
|
"cwd": "/Users/kirilldubovitskiy/projects/happy/handy-cli",
|
|
"sessionId": "329df624-b37c-4849-ab83-65722d321c29",
|
|
"version": "1.0.51",
|
|
"uuid": "072e0a05-5480-4a83-9f63-802da615b66b",
|
|
"timestamp": "2025-07-20T22:01:29.464Z",
|
|
"type": "assistant",
|
|
"message": {
|
|
"id": "msg_01H9en68JmbGQJb3Mfob2rs8",
|
|
"type": "message",
|
|
"role": "assistant",
|
|
"model": "claude-opus-4-20250514",
|
|
"content": [
|
|
{
|
|
"type": "text",
|
|
"text": "I'll create the file `lol.txt` in the parent directory."
|
|
}
|
|
],
|
|
"stop_reason": null,
|
|
"stop_sequence": null
|
|
},
|
|
"requestId": "req_011CRK2MXhzGmZ255atcGVzF"
|
|
}
|
|
}
|
|
}
|
|
|
|
[15:39:05.950] [SOCKET] Sending message through socket:
|
|
{
|
|
"role": "agent",
|
|
"content": {
|
|
"type": "output",
|
|
"data": {
|
|
"cwd": "/Users/kirilldubovitskiy/projects/happy/handy-cli",
|
|
"sessionId": "329df624-b37c-4849-ab83-65722d321c29",
|
|
"version": "1.0.51",
|
|
"uuid": "8b1593e4-c56e-4785-9dd0-741587021c95",
|
|
"timestamp": "2025-07-20T22:39:03.317Z",
|
|
"type": "assistant",
|
|
"message": {
|
|
"id": "msg_01H9en68JmbGQJb3Mfob2rs8",
|
|
"type": "message",
|
|
"role": "assistant",
|
|
"model": "claude-opus-4-20250514",
|
|
"content": [
|
|
{
|
|
"type": "text",
|
|
"text": "I'll create the file `lol.txt` in the parent directory."
|
|
}
|
|
],
|
|
"stop_reason": null,
|
|
"stop_sequence": null
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- 'result' message type is not sent to history. Its only for sdk
|
|
|
|
- Remote is maintaned - Starting claudeRemote with messages:
|
|
|
|
|
|
I found the MCP permission tool call timeout configuration!
|
|
|
|
Key findings:
|
|
|
|
1. Timeout Configuration Location: The timeout is configured via the RC6() function which reads from the environment variable MCP_TOOL_TIMEOUT:
|
|
function RC6() { return parseInt(process.env.MCP_TOOL_TIMEOUT || "", 10) || 1e8 }
|
|
2. Default Timeout: If MCP_TOOL_TIMEOUT is not set, it defaults to 1e8 milliseconds (100,000,000 ms = ~27.8 hours)
|
|
3. Where it's used: This timeout is passed to the MCP client's callTool method in the Uq2 function:
|
|
let G = await A.callTool({ name: Q, arguments: D }, vm, { signal: I, timeout: RC6() });
|
|
4. Connection Timeout: There's also a separate connection timeout configured via Kq2():
|
|
function Kq2() { return parseInt(process.env.MCP_TIMEOUT || "", 10) || 30000 }
|
|
4. This defaults to 30 seconds and is used for establishing the initial MCP server connection.
|
|
|
|
To configure the timeout, you can set the environment variable:
|
|
- MCP_TOOL_TIMEOUT - for individual tool/permission calls (defaults to ~27.8 hours)
|
|
- MCP_TIMEOUT - for initial connection timeout (defaults to 30 seconds)
|
|
|
|
- interrupt
|
|
|
|
# July 19
|
|
|
|
|
|
- Lazy initialize our shit - immediatelly drop to claude. If we are ofline - still do it
|
|
- Passthrough claude parameters
|
|
- Server diying test
|
|
- lsof -ti tcp:3005 | xargs kill -9
|
|
- This kills the app :D and cli
|
|
-
|
|
|
|
- Interruptions add UI to stop (stop button)
|
|
- Show that its doing someting, fix thingking
|
|
|
|
# UI
|
|
- Permission request
|
|
- Bash
|
|
- Edit / Create (show too much info)
|
|
- Tools
|
|
- MultiEdit
|
|
- Task
|
|
|
|
|
|
|
|
## Nice to have
|
|
- Chat titles - big ux boost
|
|
- Proxy to show the token count so we know its doing something
|
|
|
|
## Nice nice to have
|
|
- Embed amphetamine into it?? -> adderal
|
|
|
|
|
|
# July 18
|
|
|
|
# CLI
|
|
|
|
- Permissions fix
|
|
- Test what happens when we timeout the response, how
|
|
|
|
- Test end to end & rollout new version
|
|
|
|
CLI dies with
|
|
error Command failed with exit code 137.
|
|
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
|
|
kirilldubovitskiy@MacBookPro handy-cli % node:events:496
|
|
throw er; // Unhandled 'error' event
|
|
^
|
|
|
|
Error: read EIO
|
|
at TTY.onStreamRead (node:internal/stream_base_commons:216:20)
|
|
Emitted 'error' event on ReadStream instance at:
|
|
at emitErrorNT (node:internal/streams/destroy:170:8)
|
|
at emitErrorCloseNT (node:internal/streams/destroy:129:3)
|
|
at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
|
|
errno: -5,
|
|
code: 'EIO',
|
|
syscall: 'read'
|
|
}
|
|
|
|
- Dogfood for issues
|
|
- Refactor existing code
|
|
- Make it feel nicer
|
|
|
|
- Embed amphetamine into it?
|
|
|
|
- Permissions - fix mcp server integration
|
|
|
|
- Deep link to a website
|
|
|
|
# App
|
|
- Logout - make a full reload
|
|
- Make scroll work nicely
|
|
|
|
# Big ideas
|
|
- Coordinator agent - will ensure claude keeps working at max token usage - juice the most out of it
|
|
- Social component
|
|
- Notifications
|
|
- Real time voice
|
|
|
|
# Archive July 18
|
|
|
|
# Roadmap
|
|
|
|
## App
|
|
- Make key messages render
|
|
- [later] Wrapping claude in an http proxy, allows us to snoop on token usage to show its doing something in the ui when running in remote mode
|
|
- For local mode, same approach will work
|
|
|
|
- Distribution
|
|
- Website - happyinc.ai?
|
|
- App Store
|
|
- Google Play
|
|
|
|
- Deep link to download app from cli link
|
|
|
|
## Server
|
|
|
|
- Session management
|
|
- Keep track of who is controlling the session - remote or local
|
|
|
|
|
|
## CLI
|
|
- Make it stable to be a drop in replacement for claude
|
|
- Fix snooping on existing conversation bug, after switching back and forth stops watching the session file for new messages
|
|
- [later] Test it works on linux, windows, lower node version
|
|
|
|
Conversation continuity
|
|
- Some things will not expect as you would want such as /clear ing the conversation, or forking (press 2 escape on empty input)
|
|
- We might want to be better at switching between sessions for full compatibility with claude
|
|
|
|
MCP
|
|
- Permissions
|
|
- I think we should reuse the format from .claude/settings.local.json, so interactive & our checking will be similar
|
|
- Impelement checking logic
|
|
- Implement blessing command logic ()
|
|
- Implement conversation naming
|
|
- I wonder if the server can initiate an llm call on its own accord?
|
|
|
|
Permission automatic checking
|
|
- Pull antropic token from secrets
|
|
|
|
|
|
Blocking
|
|
- Permission checking [steve]
|
|
- use mcp
|
|
- see if it has a timeout or we can block forever (ideally)
|
|
- copy cc system (deterministic splitting, prefix checking, injection detection, prefix whitelist suggest)
|
|
- use cc settings local file & format for compatibility
|
|
- figure out extra path permissions
|
|
|
|
- CLI dies if server disconnects :D
|
|
|
|
- Need to make agent state work. Most important state - permissions
|
|
- Try logging out of Claude and see how to handle that case
|
|
- Make sure to use Claude from our package. Kill other Claudes
|
|
- Make sure interruption of remote controlled session works
|
|
|
|
### Nice to have
|
|
- UX final touches - onboarding make sure terminal, add session icons or something catchy
|
|
- See if I can simplify / get rid of a likely race condition in pty related code
|
|
- Pass --local-installation to setup .happy folder locally and avoid clashing with global installation
|
|
|
|
# Distribution
|
|
|
|
- Post on hacker news
|
|
- Send to friends to try
|
|
- Send to influencers who reviewed similar products
|
|
- Mass email people who have starred claudecodeui
|
|
|
|
|
|
# Later, low priority
|
|
|
|
|
|
- Permissions callout:
|
|
- permission checking will not be visible on the client nor will we be aware of it
|
|
- ✻ Enchanting… (5s · ↑ 27 tokens · esc to interrupt)
|
|
- We can parse the terminal output
|
|
|
|
- e2e single tests
|
|
- Would be nice to be able to run the whole thing - including pty to emulate a simple scenario and make sure a single multi step happy path works fine
|
|
|