#Bobby, a new voice assistant and Snowy successor
1 messages Β· Page 8 of 1
cubium
the remaining hole being google shaped would carry some meaning too I'm sure
You can but it'll be very unstable if you do
Sounds about right.
The pieces also have magnets to stick together so it may be more stable than I'd expect
The award for getting things done to ensure the project runs smoothly
I miss when organisations gave me prizes all the time.
I also made over ten thousand dollars in spot bonuses in 2019, I think
Now I just get burnout and forced to use phones I hate instead.
This cube came with a free trip to Hawaii
The trip was scheduled for April 2020
It did not work out.
Aww sad
The per person budget for the trip was two thousand dollars, so eventually they just let me spend it on whatever I wanted
I'm still sad about the maps.
Is there a secret maps-but-may-crash build I can run?
Because I am also sad about the maps
the server won't generate maps for you
though I guess I may as well ship that
since it has no effect if the client doesn't support them, and involved some other rework to make the maps practical
Wonderful
I don't know whether I want to ship the wild system where I replaced all memory-allocating calls I could find with my own versions that try to free up some memory if the allocation fails
(by throwing away images or the beginning of the conversation)
I was thinking, if the picture size makes debugging hard due to memory limitations, could you do with half-sized images during the bug-hunting process?
that only helps if the whole thing fits into memory once any memory leaks are plugged of course
Would it be any better to have the map view appear as an option if you hold Right instead of automatically? Less convenient maybe, but maybe the conversation view could be unloaded and the map could get the "fullscreen" treatment and not be competing for resources. The conversation and the option to dictate more could just go away for a little while.
Alright, I finally found some time to toss together some ideas for how this could work on the Round, in the most basic form.
I was trying to stay as close to the original design as possible in order to minimize the need for code changes β with this proposal, widgets could remain more or less unchanged, outside of some metric/alignment changes. Thoughts? @edgy flame @wooden wedge
Seems reasonable to me
Excellent, if you approve of the general look I can give it a go in the code when I get a chance
I explored some more avant garde designs, but IMO those would also necessitate new designs for the other watches, which felt out of scope hah
I need to figure out what I want to do with all the code changes I made for maps
Which among other things included replacing all logging calls and all memory allocation
They will not merge cleanly later.
could the refactors be included but with the actual functionality turned off via preprocessor directives?
or would that still cause all the memory madness
This would require me to decide I like the refactors
ah, fair haha
And this stuff: https://github.com/pebble-dev/bobby-assistant/tree/visible-pois/app/src/c/util/memory
oh wow fancy custom memory code...did it affect performance of the non-maps functionality at all?
Not that I noticed
It doesn't do anything very fancy unless the allocation fails
Then there's a system where parts of the app can volunteer to try to free memory and it runs through those until the allocation succeeds
the two volunteers were maps - (they'd be tossed out) and the conversation (the oldest parts would be deleted)
ah i see
it does seem to add a lot of nonstandardness, which to me feels somewhat like a Bad Thingβ’ -- maybe it could be shuffled into an experimental branch in case it's needed to try and solve a memory issue in the future?
Custom allocators are not particularly unusual
This one isn't even custom, it just wraps the normal one
admittedly my C memory allocation knowledge is exceedingly rudimentary
when some guy on github rewrote all of TimeStyle's persistence code and made it load like 5x faster i was amazed haha
so i suppose it's best to go with what you think is the cleanest option π€
The custom SDK methods are funkier
blayer_create
oh i thought that's what you were referring to by custom allocators hah
By that I mostly referred to bmalloc
Incidentally did you know that allocating a menu layer costs 456 bytes? Fun facts.
(on basalt, anyway)
Life should be better on the core time 2, assuming it inherited Emery's 128k memory limit
That's the same amount that the original pebble got for the entire system
that plus the touchscreen should make for some interesting CT2 exclusives
i plan to make an RPN calculator app
"bobby, which way am I facing?"
"i'm sorry, your watch lacks a compass because eric said no one used the compass"
"You are facing despair"
I want a judgemental Bobby that actively pokes me for my habits
The killer feature for bobby is XIP. 512k of code space would be basically unlimited.
CT2 would probably be 256kB though
i guess it would only require a fairly small prompt alteration to make bobby sarcastic and condescending
anyway re: custom sdk methods, i vote "no" because it makes the codebase mildly more nonstandard (if this is votable hah)
It's not votable and that doesn't seem very compelling as an argument π
"because you're refusing to show me one!"
Is anything bobby does particularly standard?
Not really
It's almost all custom layers and stuff anyway
true, i am concerned that will make paginating it trickier
but hopefully i can get away with lots of preprocessor directives to change margins or whatever
PBL IF ROUND ELSE π
i mean it's actually shockingly usable on round right now -- just adding padding would be enough to make it 100% usable (though not compliant with the you-shouldn't-scroll-stuff-on-round guideline)
I want the sarcastic health insights that pebble once had
but with Bobby and LLM magic
extra damage dealt to my self esteem
i don't really remember the old ones, but i guess they were memorably condescending hah
I guess it hurt too many people haha
I wrote all those release notes so that's basically just my opinion but Official
I think I'll probably keep most of the refactors
And see if I can ifdef out a minimal amount of the map stuff so it is compiled but then optimised out
Keep it building
I'll have to fix the behaviour when moving up the last conversation entries though
Last time I tried it, the last entry didn't get shifted appropriately
Though maybe I should just not shift it up and instead draw a big grey box past the top or something
I'm not entirely sure how text actually works with this, how do you make sure that one line is visible below and above the widget
assuming it's paginated?
I think you would have to duplicate it, especially since it's in a different font (which is not, it must be said, minimal code changes)
I don't know how pagination works for scroll layer, can you somehow force page break?
Pagination of text and pagination of the scroll layer are independent things
Stuff just goes at the specified coordinates on the scroll layer
And then it scrolls through in page sized jumps
You can't specify break points though.
(you could if you built it yourself, the scroll layer pagination is a trivial button behaviour change)
Yeah my intent was to duplicate the text so that there would be a visual hint as to the next page contents (basically kind of how menu layer works, visually), but I havenβt played with it enough to know how horribly difficult implementation will be
My hope is that it will be at least somewhat straightforward
This isn't very elegant because during the animation you'd see the text twice
I would opt for full screen widgets myself, since it seems less complex
You could do it properly and not duplicate the text, but you'd have to override all the paging and wrapping behaviour
My concern there would be the need to reimplement every widget, which while doable feels like a lot
(doable; a custom wrapping perimeter is used on the root screen)
Reimplementing all the widgets is probably the lesser evil here
They all need adjusting anyway.
Really all the segment types need work no matter what.
I think the animation with paging is mostly a lost cause, and it would need to just not auto-page
It would be a weird experience IMO to briefly see a page and then get jumped to the next one
I mean when you hit the button it animates the page transition
You'll see the duplicate text
I was thinking the smaller hint text would disappear on animation start β hopefully not too jarring maybe? π€
on the bright side, they could look really nice that way
you would have more space allowance to make them pretty on round
There's also not exactly a large number of segments
That is true haha, I donβt actually like most of the way the widgets look now π
IMO full screen would look better on all the watches, not just round
(For the widgets, I mean)
I explicitly don't want them to be full screen; I want them to be part of the flow, with conversational elucidation
Full screen would be particularly terrible for the timer or number widgets, and also for the info segments
And it's unaffordable for map widgets - we don't have that sort of memory
I don't like full screen because it removes them from the flow of the conversation
that's fair
(consequently I don't like round at all)
most of the screen might be better anyway
this is kinda the reason for the left bar ideas, because they ground everything to the conversation
I do not know what a map would look like with that design tho
I am currently defending my rectangular choices.
Full screen widgets are probably the Circle Way
map is gonna be interesting regardless on the round
Certainly not shipping over a 180x180 map
that's true, but also since you don't actually like round you probably don't want to maintain an entire round UI for every new feature
maybe the left bar approach is the least-bad option actually
Good news: there's no room for new features π
Adding round is a lifetime commitment to 100% more UI work regardless
Maybe 50% more UI work given the impending arrival of Larger Rectangle
But for the most part Larger Rectangle is cheap
Now put an invisible right bar in and skip the paginating completely
Minimal changes achieved
tbh it would work -- like i said Bobby is already like 90% usable on round
maybe that should be the MVP
Also rather departing from Bobby's generally Very Pebble philosophy, mind.
Though apparently being Very Pebble requires doing everything from scratch because pebble didn't include most of the tools
IMO if bobby wanted to be the most Very Pebble possible it would look like a stack of notification cards π
But it isn't notifications.
the notification interface isn't that good for it
it is a good source of inspiration
it's the same basic idea though -- a list of messages
Not related messages, and not necessarily messages
Notifications are just a pile of Random Stuff
Which is not what Bobby provides
I guess a reasonable argument could be made that lots of scrolling is not especially pebble, but I don't think adding artificial breaks would improve that
quick notification card concept -- i think it basically functions, though perhaps the lack of a hint as to whats next is disappointing
Hey I've seen this one
yeah, we went over this before
Mic is a better icon for you
that it is
yup, it's pretty similar to some of y'all's earlier sketches
I still like my hand pointing at you
another variation that, like your earlier ones, tries to add a visual "what's next" hint:
Bobby accuses you
Except you can't actually use any of the system support for paging things
Now it is high effort to make the animations sane
now that it's open source i suppose theoretically one could just copy paste the entire notifications app
but i suppose that is complete overkill hah
You couldn't, it uses private APIs all over
alas
The status bar layer has many cool features you aren't allowed to have
Someone should package up all the Kino stuff as a pebble package, that'd be handy
The animations you'd need for that design are pretty simple though, I think
here's a more conversational non-paged concept that i felt looked too much like it belonged on a Moto 360β’
it's very pebble noncompliant
Move the circle up while enlarging it and show the text when the enlarging circle is passing over
yeah, that sounds about right
yup the notifications app does exactly that i believe
animations weee
this conversation has convinced me that we should just add margins to the existing version, then say that real Round support with paging is 
I am just annoyed that any good round implementation will have its own reimplementation of the session window
Which is the single most cursed thing in the app
Now there can be two of them
Maybe the round one is less cursed because instead of calculating heights and offsets everywhere it just starts over for each segment
Also probably needs some refactoring to pull the behaviour part away from the layout part
Meh
exactly! the complexity and maintenance implications of doing a "true" round implementation is so high, and interest is so low, that i am now convinced of the m a r g i n s approach
Maybe the soon to be 2% of users who use a round pebble just don't get bobby 
i have 4 pebble rounds in shipping that are eagerly waiting to experience the little horse
blasphemy!
there's presumably a reason why I don't use round
not sure if mauve GColorRichBrilliantLavender is an appropriate margin color for the brand
but this would truly support minimal code changes and would, i think, be usable
I'm pretty burnt out on Bobby right now but some day I will come back and give it circle support I like
Also my month of leave from work is coming to a close and I don't want to spend the remainder of it writing software
As I basically did the first two weeks
fair enough haha
admittedly, i personally would like to use bobby on my round, so i'll still probably add these lovely margins at least for my personal use (and create an MR just in case)
behold: m a r g i n s
tbh if i were to fill in the left gutter i don't think it would be a terrible experience overall (certainly better than nothing, IMO!)
that would be a good place to put the icons tbh
bobby works on rockwork yay
I wonder why it doesn't work on Cobble
oh well :D
I was hoping Bobby would give me a sarcastic answer
i think this looks very good! the dot at the end of the thread is a very nice touch, and this is much simpler to actually implement than lcp's and my ideas for tearing everything up and redoing it
it fits in with the rect look and it is actually doable
im a little disappointed we don't get to shove in art and colors everywhere, alas
my personal favorite is probably the notification-cards concept (super similar to your earlier one)
this one ^
either way, it sounds like probably whatever i make isn't likely to get merged, so I'm probably just going to do a custom fork where I add left and right margins so that it's usable π (still holding out some hope that it's mergeable though!)
Call it "Robby"
I'm not a big fan, honestly - it feels a bit like a cop-out, since these are not notifications. i tried to draw a distinction in my own sketches
they do look very good though
they work really well
that's a fair point! my general logic was that each element in the conversation is effectively a "card", much like notifications
but i can also see why treating it that way breaks the "flow" of the conversation
100% it's a good thought to have - i imagined it'd scroll like notifications do, but I don't want it to look exactly like notifications, if that makes sense
this is an excellent point, my first concept with the peeks and fullscreen widgets breaks the flow more than anything
my ideas were mostly just trying to do something sensible with the icons, but I clearly can't get that to work very well
"that's an interesting question!" should be read as the snark response
It always says that when it thinks you asked something stupid
If the changes are sufficiently minimal I might merge it but not actually ship it to the appstore
that just sounds like it's trying to be smart
I want Bobby to ask me if I'm dumb
does Bobby have a "test mode" of some kind where it can show content without interacting with the backend? (testing the layout changes is burning through my quota faster than i'd prefer!)
It does not
alas
[03:03:15] process_heap.c:17> Double free detected on pointer <0x200246e0>
[03:03:15] ault_handling.c:97> App fault! {1d272bb4-cf00-4e3e-a7f3-7394309e0341} PC: 0x801c1f3 LR: ???
Program Counter (PC) : 0x801c1f3 ???
Link Register (LR) : ??? ???
oh dear.
absolutely no way to discover what, exactly, was double freed
It would be nice if the pebble SDK itself behaved remotely predictibly under low memory conditions
dictation especially is a disaster
(also 1,744 bytes free should not be "low memory")
"I understand, I'm running on a Pebble smartwatch and sometimes the display can be a little glitchy"
I'm glad the unreliability of Pebble displays is internalised knowledge of Gemini
I thought you could attach a debugger and break on the fault
I probably could if I could reproduce it
or am I hallucinating that there is a way to attach a debugger the long way around
also if I could run bobby in an emulator, which it currently hates
There is a convenient pebble gdb for this purpose (which comes with a preset break on the fault, IIRC)
running it in an emulator would have some win to the effect of having a special pebblekit that could send it lots of messages and run in the background thrashing it
true
Glad I'm not the only one who struggled with this
apparently the websocket implementation is insufficiently correct
I don't know how - Bobby only does trivial websocket things
I took a break but this is still aggravating:
[03:46:11] malloc.c:32> Out of memory! Need to allocate 3616 bytes; 5652 bytes free.
Or the entire sequence:
[03:46:11] malloc.c:32> Out of memory! Need to allocate 3616 bytes; 5652 bytes free.
[03:46:11] pressure.c:70> Memory emergency! Trying to free memory.
[03:46:11] ation_manager.c:402> Memory pressure detected.
[03:46:11] ation_manager.c:410> Deleting oldest entry from conversation.
[03:46:11] segment_layer.c:121> destroying SegmentLayer 0x20025aa8.
[03:46:11] pressure.c:85> Freed some memory!
[03:46:11] malloc.c:41> Freed 452 bytes, heap size is now 6104. Retrying allocation of 3616 bytes.
[03:46:11] pressure.c:70> Memory emergency! Trying to free memory.
[03:46:11] pressure.c:88> No joy.
[03:46:11] malloc.c:37> Failed to allocate memory.
fragmentation indeed
apparently creating a dictation session eats 3,660 bytes
so that's the mystery of where my extra four kilobytes are going answered
(those 3,660 bytes do not, incidentally, include a buffer to store the response)
I guess if I wanted to juggle my dictation session I could have those available for use when displaying results, and then throw away old content if necessary when the user goes for the next response
additional reason the debugger doesn't help: my crashes don't seem to happen in the emulator
Now trying that concept out
fragmentation wins again.
[04:59:25] malloc.c:33> Out of memory! Need to allocate 2048 bytes; 6028 bytes free.
I found the stupid fragmentation
which was obviously also a memory leak
unfortunately, it is a memory leak that apparently the universe depends on
not sure how I built that
There is an array of pointers to conversation entries. When the array is full, a new one is made and its contents are copied over.
and that's it, the original is never freed.
The problem is that many things hold pointers into that array (or some version of the array), so freeing it ruins everything.
well that's an exciting problem for another day
Obviously you gotta doubly link the pointers so you can update the pointers to the array when you allocate the new one π
that's not all the fragmentation, but fixing that (through the cunning temporary approach of just making the original size sufficiently large) makes it at least possible to construct a large contiguous region by freeing old conversation segments
this is still not great though:
[05:29:18] malloc.c:25> malloc request: 1830; free: 6428
[05:29:18] malloc.c:25> malloc request: 1830; free: 4592
[05:29:18] malloc.c:25> malloc request: 1024; free: 2768
[05:29:18] malloc.c:25> malloc request: 1024; free: 1740
[05:29:18] malloc.c:33> Out of memory! Need to allocate 1024 bytes; 1740 bytes free.
[05:29:18] ation_manager.c:410> Deleting oldest entry from conversation.
[05:29:18] malloc.c:42> Freed 680 bytes, heap size is now 2420. Retrying allocation of 1024 bytes.
[05:29:18] malloc.c:33> Out of memory! Need to allocate 1024 bytes; 2420 bytes free.
[05:29:18] ation_manager.c:410> Deleting oldest entry from conversation.
[05:29:18] malloc.c:42> Freed 500 bytes, heap size is now 2920. Retrying allocation of 1024 bytes.
[05:29:18] malloc.c:33> Out of memory! Need to allocate 1024 bytes; 2920 bytes free.
[05:29:18] ation_manager.c:410> Deleting oldest entry from conversation.
[05:29:18] malloc.c:42> Freed 444 bytes, heap size is now 3364. Retrying allocation of 1024 bytes.
[05:29:18] malloc.c:33> Out of memory! Need to allocate 1024 bytes; 3364 bytes free.
[05:29:18] ation_manager.c:410> Deleting oldest entry from conversation.
[05:29:18] malloc.c:42> Freed 460 bytes, heap size is now 3824. Retrying allocation of 1024 bytes.
[05:29:18] malloc.c:33> Out of memory! Need to allocate 1024 bytes; 3824 bytes free.
[05:29:18] ation_manager.c:410> Deleting oldest entry from conversation.
[05:29:18] malloc.c:42> Freed 652 bytes, heap size is now 4476. Retrying allocation of 1024 bytes.
success!
the fact that starting dictation essentially requires six kilobytes is, incidentally, absurd
(4k to be able to create the session at all; 2k for it to not hang on the pulsing dot)
that really sounds like it should also be reserved by the system and not the app
also, it should be mentioned in the documentation and not require discovery
Where does persistent storage live? Is it possible to offload stuff there?
Not practically
I wonder whether I should split the maps into multiple bitmaps, reducing the size of the contiguous memory required.
this feature is really becoming complex
Mostly I'm not even doing the maps at the moment
The thing runs out of memory without them too
Just slower
It'd be nice to have a diagram of the heap layout annotated with what, if anything, points to each allocated block
Apparently this is an existing feature, but only if the firmware was built with --malloc_instrumentation
ah, and also, you can't replace it with your own allocator because the system calls into the allocator
though you could potentially do something slabby with small objects to reduce fragmentation that could prevent you from allocating big blocks?
Potentially, yeah
Though the majority of my small allocations are promptly followed by system-controlled allocations so the available gain may be minimal
Though I guess I could reuse those too
I might be able to learn something useful by building the firmware with malloc instrumentation and getting bobby to work sufficiently in the emulator environment to figure out what the current situation actually is
Not sure this is the place to poke
But does the app store (pebble app) bobby require any apps or setup alongside to function? Got a voice prompt to be understood but it just kinda waits on presumably Gemini to proceed further and just... Gets stuck like shown
Paired with Motorola Razr 5G, Android 12, Pebble App with WearOS and Gemini installed on the phone
Gemini the Google product is unrelated
Definitely just have to remove all references to it, everyone is always very confused
That said, no, there is no setup required
I don't know why it's just sitting there
all good, just was trying to add all the possibly relevant info, just got it working, for some reason the app didnt bind my rebble account
Huhh
thanks for the reply super quick lol
By "the app" do you mean Bobby or the Pebble app?
Pebble App had the boot.rebble config but didnt jump into the account til i re-ran the config, just odd time-to-time
pebble.
Ah, that would probably explain it
Should definitely error better
I thought it did error better
it actually never presented errors which made it odd for me to dig into
Why show errors when you can pretend to be loading forever
as someone that dug around in XDA for modding phones... you crack me up
assuming zero chance it can work on gadgetbridge? just testing on the razr to avoid the whole mess with Play Protect, API and junk
Definitely not
Gadgetbridge doesn't implement JavaScript at all, and would be morally opposed to Bobby's whole deal anyway
good to know, cant wait for that core app then haha....
I wonder whether it'll work there
It's very broken under Cobble for reasons nobody really understands
I suspect Core will inherit a lot of that
itll at least be a new baseline that runs under A16 (presently beta)
oh god the mic on my pebble 2 is atrocious
Disappointing
I tried asking a question and it transcripted to "3999 1000"
and bobby brought out the calculator
What is the answer to 3999 1000?
4999
I should've taken a photo
ok let's enable audio debug
huh
how did it pull those numbers from this audio
Machine Learning
Surprised it didn't give you the classic ]
I should probably actually handle the lone ] as an error given how common it is as a transcription of nothing
I have also noticed ever since the introduction of the auto transcription language, transcription has been awfully slow
before it was almost instant
now it takes a few seconds
You are the first person to point this out
Seems plausible though given the pipeline is completely changed
Though probably not really fixable
oh well
Aside from turning back to the old system, anyway
Which is actually still running, just not actively used
(It is also definitely slower if you turn on audio debug mode)
(since it uploads your recording before responding)
I see
though it is still slow with audio debug turned off
it was much faster before
the bar would barely start loading before I would get a response, and now it goes to almost a quarter or halfway before I get a response
Weird, I always get that
I don't know what about the model change could've changed the behaviour for you only
kinda funny that the big bobby banner at the top of the rebble store shows even if you only use a round
but bobby doesn't show in the list of apps or in search
same, but OG/Steel lol
I think I was going to look at fixing this and then didn't
Currently it's not technically possible to avoid it, we'd have to build things
Just think of it as an ad for the good watches 
At some point it might get round support and then it's just the mic-less watches missing out
bobby t3 when /s
You jest, and yet
The problem with that of course is that Bobby has way over 24k of code
best way would be if it had like an autocomplete/suggestion bar, kind of like a phone keyboard
I am mostly joking
It is also impossible due to this π
I could save somewhere north of 7k if I didn't have the session code and the menu code (which are mutually exclusive screens) loaded at the same time
Also, not sure how that would work with Pebble's design rules. Would be interesting π
Pulling that apart sounds like a really exciting trip into the build system
pain
indeed. But IMO configuring the wscript (at least in my Pebble apps, YMMV) is much more friendly than CMakeLists or Makefile neither of which I can never get to work right
not good, but less terrible and painful
I don't know that configuring the wscript would be sufficient here
oh! In which case, much more pain I presume?
very interesting. Kind of interesting to see the ways you can cram as much as possible into Pebbles π
I have never really had to think about these limitations until I started working with Pebbles haha
I think at minimum I'd need to get it to use a custom linker script, make sure the relevant parts go into the right sections, pull out the parts that aren't part of the main binary and stuff them into resources, and probably do the same position independent fixups the pebble OS does when loading them in
Unfortunately I don't understand any of these things
excitement
I think hacking this into the build system is more trouble than it is worth. I also think it causes a (strictly speaking unnecessary) circular dependency, since we end up needing to generate resources out of the compiled binary, and the compiled binary depends on all the resources.
putting that aside for now.
finally got my stupid diagram
I think Heiko did a segmented pebble app at some point
He did
and some attributions, of a sort:
...
Size: 108, Addr: 0x20024eb0 PC: 0x20021577 /pebble-dev/build/../src/c/util/memory/sdk.c:39
Size: 36, Addr: 0x20024f1c PC: 0x00000000 FREE
Size: 28, Addr: 0x20024f40 PC: 0x2001b03f /pebble-dev/build/../src/c/converse/conversation_manager.c:55
Size: 160, Addr: 0x20024f5c PC: 0x00000000 FREE
Size: 92, Addr: 0x20024ffc PC: 0x2001e455 /pebble-dev/build/../src/c/converse/session_window.c:85
Size: 40, Addr: 0x20025058 PC: 0x08036f79 ??:0
Size: 152, Addr: 0x20025080 PC: 0x00000000 FREE
Size: 64, Addr: 0x20025118 PC: 0x2001a9cd /pebble-dev/build/../src/c/converse/conversation.c:47
Size: 32, Addr: 0x20025158 PC: 0x2001a9df /pebble-dev/build/../src/c/converse/conversation.c:51
Size: 28, Addr: 0x20025178 PC: 0x20022d43 /Users/katharine/projects/pebble-events/build/../src/c/appmessage.c:118
Size: 20, Addr: 0x20025194 PC: 0x20022f6d /Users/matthewtole/Documents/Apps/smallstoneapps/libraries/linked-list/build/../src/c/linked-list.c:167
Size: 20, Addr: 0x200251a8 PC: 0x200213e7 /pebble-dev/build/../src/c/util/memory/pressure.c:49
Size: 20, Addr: 0x200251bc PC: 0x20022f6d /Users/matthewtole/Documents/Apps/smallstoneapps/libraries/linked-list/build/../src/c/linked-list.c:167
Size: 20, Addr: 0x200251d0 PC: 0x2001dc23 /pebble-dev/build/../src/c/converse/session_window.c:142
...
Now if Bobby actually ran usefully in an emulator I might be able to figure out what's doing the fragmenting
what is this linked-list.c? is something dropping cons cells around?
yes. in this instance I think it is being used to assemble the event listeners
IIRC it isn't used any more once the conversation is actually set up, but I may misremember
git grep
aha pebble-events uses it, yes
it looks like it should not have much traffic after init
I assume it does not
unfortunately I cannot actually get to the interesting part in the emulator for now
we die here
I should just hack something up to send random replies
tomorrow.
yeah, sending random appmessages back (and lots of them) using a pkjs distinct from what actually runs on a watch seems like a good way to stress test it
hm, having kernel-allocated memory in the user heap is pretty good. I should go inspect that and see if chaos can be done with it. as if there weren't already enough ways to crash a watch, I suppose
all the _create methods do this
Whoa cool, is that like memory usage? How did you make that?
It is
I compiled the firmware with malloc instrumentation enabled and also hacked some fixes to stop it from crashing when I tried to read the results
Neat! I wish I could just rebble dump-memory-usage hahaha
No clue how to compile the firmware
With some difficulty
Bobby should probably handle the case of launching the app while disconnected from your phone- right now it just shows this screen
It should, though I'd argue it's a firmware bug
I told the dictation session to show error messages but it doesn't feel like showing an error message for this
huh
All the other errors do show up, it's just this one that's not considered an error
do we have room for more resources (specifically the big vector art the fw uses for disconnected phone)?
Yes, there's no shortage of space
Especially for graphics that are mutually exclusive with actually doing anything
right - the big crunch is memory on the conversation screen
Aw, Gemini 2.5 flash is a chunk more expensive than 2.0 flash
50% more with reasoning disabled
Time to add a pro tier to rebble web services /s
natural cork with silver ptr14
for your consideration
it is a banger combo in my view
nice! if you are extremely impatient you can run my highly incomplete branch with round support: https://github.com/freakified/bobby-assistant/tree/experimental-round-support
Things that it has so far:
- Paging for consent screen
- Extra margins for session screen so that it is readable
That's pretty much it but you know it's basically usable hah
Probably I was going to tackle the talking horse screen next, since that should just be adjusting coordinates until everything is in the right place
nice, I will have a look
I guess I'm doing something really wrong with bobby. I use a Time Steel. And every time I dictate something, the system says that it encountered an error. (The German message is: "Ein Fehler ist aufgetreten") I enabled the audio debug mode - but there are no recordings there. So it seems as if there is a general problem with recording and transmitting the audio. Is this problem known?
sanity check - you have an active rebble subscription, right? can you use voice in any other apps?
yeah, that does look pretty nice, though cobble is not making it very useful
oh
@karmic lion good news, it sometimes works, first time I've seen this one
I do love the inverted bubble, it's very funny
Cobble has
may need a new pony art with some neck and body
and right align the clock and bubble
neat stuff
you can move bobby to the right still
it's not like it's going to reveal its lack of body that way
sick
we'll need to do emery/G screens but i doubt anyone will care until either emulator websockets work or evt units are in hand
can we use 25px icons instead of 18 on the cards? that's the only note I have
I do kinda wish cobble on round was pages still
it isn't?
I assume the goal would be to have it paged and widgets centered
this was just the bare minimum to get it usable
can you shoot me that pbw, by the way?
sure
I like how you can never see the 17:00 in full wherever you scroll in that widget
also great recording quality where you can barely see the screen because of the lighting
spalding moment
it's so much worse than time steel it's shocking
if someone were to make a new round I'd rather they not change the screen, just glue it to the glass please please please
I've got an active subscription. Can you recommend another app? I haven't used any other voice app before. I subscribed only because of bobby.
but larger screen though
true
there are a few notes apps on the Pebble store
try running boot in your web browser again, and see if it helps with the error
With "boot" you mean the option "repeat the initial setup"? I now did this. And this changed something. Now the weather works again. But audio still doesn't work. I tried with "Simple Notes" and I get the same problem. So it is something on my system. Do I need to perform some other step? Like possibly a factory reset of the watch?
hmm
you need to select language in voice settings iirc
That fixed it! Thanks a lot!
and make developers support yet another resolution?
youll program your layouts the way youre supposed to or youll drown in adaptation work
π€
@karmic lion probably worth adding an error message if that's the case?
But Bobby could have a message saying the language isn't set right?
There is no way to know that that's why it didnt get a dictation response
Just an idea. I guess the correct method would be the os showing a pop up if dictation is triggered but no language is set
And is probably the least likely answer
No language being set isn't possible under the assumptions the OS makes; it's a Rebble artifact.
(because we charge for dictation, and if you don't pay us the language list is empty. If you start paying us it doesn't necessarily pick a default.)
Gotcha, appreciate the explanation!
it turned out enabling paging was fairly easy, but the problem is i couldn't figure out how to do page breaks at specific points, so sometimes the widgets would get paged, like, at the halfway point
i assume there is some way to do it but i was not enthusiastic enough to figure out what it is haha
mmm that sounds about right
sighhhh.
well I rigged up bobby to work in an emulator by playing back prerecorded messages
this doesn't really help anything because transcription is also broken in emulators.
despite the existence of pebble transcribe, which presumably worked at one point
oh actually I assume it's not broken in the emulator, it's broken in the firmware.
that would make sense
doesn't help me at all but it makes sense.
well this is what memory looks like when showing a conversation with a map and some text
no way to generate more content though.
after a bunch more back and forth, during which it has jettisoned the map image
(the text and response are the same every time because I just hardcoded a dictation response in bobby)
that's fun, I sent another message and it apparently had to jettison the entire conversation
I wonder what that looks like
so the obvious question is: what are those stripes ruining my contiguous blocks?
instrumentation blames all of them on /pebble-dev/build/../src/c/util/memory/malloc.c:32, which is not very helpful
okay, merged my two sets of addresses to resolve that to meaningful output
Size: 104, Addr: 0x200261a8 PC: 0x2001a9a3 /pebble-dev/build/../src/c/converse/conversation.c:140
Size: 56, Addr: 0x20026210 PC: 0x00000000 FREE
Size: 88, Addr: 0x20026248 PC: 0x2001a9a3 /pebble-dev/build/../src/c/converse/conversation.c:140
Size: 40, Addr: 0x200262a0 PC: 0x00000000 FREE
Size: 36, Addr: 0x200262c8 PC: 0x2001aacd /pebble-dev/build/../src/c/converse/conversation.c:152
Size: 440, Addr: 0x200262ec PC: 0x00000000 FREE
Size: 96, Addr: 0x200264a4 PC: 0x2001a9a3 /pebble-dev/build/../src/c/converse/conversation.c:140
Size: 676, Addr: 0x20026504 PC: 0x00000000 FREE
Size: 128, Addr: 0x200267a8 PC: 0x2001a9a3 /pebble-dev/build/../src/c/converse/conversation.c:140
Size: 32, Addr: 0x20026828 PC: 0x00000000 FREE
Size: 112, Addr: 0x20026848 PC: 0x2001a9a3 /pebble-dev/build/../src/c/converse/conversation.c:140
Size: 40, Addr: 0x200268b8 PC: 0x2001abff /pebble-dev/build/../src/c/converse/conversation.c:233
Size: 44, Addr: 0x200268e0 PC: 0x2001abff /pebble-dev/build/../src/c/converse/conversation.c:233
Size: 440, Addr: 0x2002690c PC: 0x00000000 FREE
Size: 120, Addr: 0x20026ac4 PC: 0x2001a9a3 /pebble-dev/build/../src/c/converse/conversation.c:140
Size: 2088, Addr: 0x20026b3c PC: 0x00000000 FREE
Size: 136, Addr: 0x20027364 PC: 0x2001a9a3 /pebble-dev/build/../src/c/converse/conversation.c:140
Size: 444, Addr: 0x200273ec PC: 0x00000000 FREE
Size: 144, Addr: 0x200275a8 PC: 0x2001a9a3 /pebble-dev/build/../src/c/converse/conversation.c:140
Size: 580, Addr: 0x20027638 PC: 0x00000000 FREE
Size: 520, Addr: 0x2002787c PC: 0x2001ab4f /pebble-dev/build/../src/c/converse/conversation.c:185
Size: 520, Addr: 0x20027a84 PC: 0x2001ab4f /pebble-dev/build/../src/c/converse/conversation.c:185
Size: 520, Addr: 0x20027c8c PC: 0x2001ab4f /pebble-dev/build/../src/c/converse/conversation.c:185
oh it's the stupid leak that I accidentally unhackfixed
well that wasn't interesting
how about the other ones
thought->thought = bmalloc(strlen(thought_text) + 1); is interesting
there are no thoughts on screen, that must be a leak
I don't know how, though, thought text freed when thought entries are destroyed
got it, stale thoughts are never destroyed, they just stop being displayed
hm, this shouldn't be quite true, they should still be destroyed when the cleanup process runs past them, which clearly it did in this case.
hm.
And additional problem could be if the user doesn't use English (I'm German). There had been some value selected - but of course not German. Would it be an idea to add a small FAQ in the app? Like: "If you newly subscribed please repeat the initial setup and set a language in the app"?
in which app?
with some bugfixes(?), after the map has been dumped but before conversation pruning occurs
huh, once again it had to discard the entire conversation.
sigh.
much less stripy, though
the tiny stripe in the middle of my big free block is apparently the prompt text
well that works, but the question then is why the entire conversation history has to be purged to make enough space.
unfortunately I can't easily inspect the state while it's in the middle of doing that
and so the circle repeats.
this time it only did a partial cleanup, apparently
ooh, caught a crash
#0 app_crashed () at ../src/fw/kernel/fault_handling.c:191
#1 0x0800b3d8 in prv_kill_user_process (stashed_lr=stashed_lr@entry=0) at ../src/fw/kernel/fault_handling.c:197
#2 0x0800b47a in hardware_fault_landing_zone () at ../src/fw/kernel/fault_handling.c:233
#3 0x2001e240 in prv_conversation_entry_deleted_handler (context=0x20025450, index=<optimized out>)
at ../src/c/converse/session_window.c:393
#4 prv_conversation_entry_deleted_handler (index=<optimized out>, context=0x20025450)
at ../src/c/converse/session_window.c:385
#5 0x20024dec in ?? ()
that is quite exciting
is that an indication that user code is running with higher privileges than it should??
nah, I meant an app crash.
into which I dumped the full firmware symbols instead of the usual redacted set because why not
I am guessing the cause here is that 0xe4001b is probably not a very good pointer.
it sounds bad
not sure how it came to be a pointer, mind
aha I now see the fault_handling bits there.
#3 0x2001e240 in prv_conversation_entry_deleted_handler (context=0x20025450, index=<optimized out>) at ../src/c/converse/session_window.c:393
sw = 0x20025450
to_delete = 0xe4001b
removed_height = <optimized out>
new_offset = {x = 28704, y = 26994}
new_size = {w = 8313, h = 49}
current_offset = {x = 26999, y = 26740}
current_size = {w = 29295, h = 29801}
index = <optimized out>
sw = <optimized out>
to_delete = <optimized out>
removed_height = <optimized out>
current_offset = <optimized out>
new_offset = <optimized out>
current_size = <optimized out>
new_size = <optimized out>
i = <optimized out>
layer = <optimized out>
frame = <optimized out>
to the extent any of these are not optimised out, they are clearly all garbage
(except for sw, which is probably actually correct.)
Why is it putting the prompt text into the middle of the free space? π€
I am assuming the prompt text is put there before the memory emergency forces it to start cleaning things out
Since the prompt text is not eligible to be cleaned out, it stays there
on further thought it's mostly meaningless, because it gets as far as looking up to_delete before it tries to dereference it and promptly crashes
so I guess the rest is just whatever was on the stack before.
to_delete does not look like lower case ascii, unfortunately
So if you require a big continuous area, you could also need some defragmentation?
the stack contained "priy 1withorit".
essentially blindly, though.
my current general hope is that if I don't leave detritus around then cleaning things up will always make large contiguous areas.
well, or preallocation of regions that you know will always be long-lived
which does appear to be true except when it crashes before it tries to delete something that is decidedly not a pointer.
I tried this, but ran into the new problem of most things never being allocated most of the time
and being unable to all exist concurrently.
right.
if you know when you are going to be done allocating long-lived things, then you can overallocate a big chunk and just keep bumping a pointer within there, and then realloc it down to size once you are 'done'
on this note, I am done and it is bed time
a good idea
I guess I am fairly content with how this behaves now.
although if an alarm goes off in a low memory condition apparently it silently fails to render the appropriate animation
ld: /pebble-dev/build/diorite/pebble-app.elf section `.text' will not fit in region `APP'
ld: region `APP' overflowed by 2860 bytes
oh.
Bobby continues to be a work horse!
I will say that recently I noticed you introduced an app timeout
I think this is something I suggested way back but now I actually prefer to have to timeout
Sometimes I was pleasantly surprised to find Bobby still on my wrist with the info I had looked up
And I could continue the conversation
Although sometimes after too long the session expired
Anyway, having Bobby stay on wrist is good
Also, did the map stuff get shipped?
Oh yay you accounted for timeout in settings!
@wooden wedge you did such a good job with the character
So clean and expressive
I designed it 2.5 years ago or something like that
bobby was in development for a while
well the icon is pretty much the same as it was
all the icons that are related to the store and locker are the original asset too
to be fair I should probably improve them a bit, but they work for now
Bobby will only timeout if you open via quick launch, and there is an option to turn it off in the app's config page
only checked the settings page after I rambled xD
i like the timeout a lot
it's very nice to fire off a timer or reminder and then just go back to what I was doing
silk has a good enough mic that I don't usually need to double check it
No, I've fallen into a hole of making memory reclamation work
It's basically there except when I exit the conversation view it crashes now
found that one, the map widget thought it owned the map bitmap but it doesn't
I think I have just about dug myself out of this two week long hole
yay!
also it's now possible to run in an emulator, though it'll just give you some prerecorded responses
https://github.com/pebble-dev/bobby-assistant/blob/visible-pois/app/src/pkjs/emulator/prerecorded.js
yeah, wearing mine also makes it slightly worse
I don't see how that works exactly, but it does
that doesn't sound right
I'm surprised Gemini got this one: https://gemini.google.com/share/f2571ae0e125
anyway Pebble can't render those
I dunno, the model used it when I asked about opening times.
I do get using nbsp there
I'm just confused about narrow
I guess nnbsp makes sense given that an entire space between the AM and the PM is overkill
fair
can pebble render normal non-breaking spaces?
great question
cool stuff
nnbsp is old enough that pebble could have known about it
tho its purpose is Mongolian
I guess I will replace narrow non breaking spaces with regular non breaking spaces
this should be a firmware bug too presumably
Perhaps
round support is becoming more and more interesting
especially since it'll try to send a 180x100 map on round
yeah
maps are easy if you don't have forty kilobytes of other code
yeah, no doubt
uber app does sound relatively easier
since the content is generally not long text output with various widgets
the new state of memory management probabls means round can actually afford to put a big map on
the problem you will end up with instead is that the pins might be cropped off because circular maps are another problem
yeah, realistically you have a small area in the middle square that ends up being where the points can be
which does make the big map kinda pointless
currently I actually let google figure out how to scale the map given the points
but I cannot express "don't use the corners"
yeah
on the plus side if I did the calculation myself I'd actually know where on the map the points should go
which would mean I could just draw the location in on top instead of relying on Google putting a special pixel on the map to mark it
the pixel is a problem because if another marker hides it I can't recover from that
hmm, yeah
if userLocation != nil {
mapMarkers = append(mapMarkers, gmaps.Marker{
Location: []gmaps.LatLng{{
Lat: userLocation.Latitude,
Lng: userLocation.Longitude,
}},
CustomIcon: gmaps.CustomIcon{
// This is a single blue pixel with the magic 16-bit colour rgb(2827, 5911, 56540)
IconURL: "https://storage.googleapis.com/bobby-assets/user-location-pixel.png",
Anchor: "center",
},
})
}
very advanced
thanks discord
maps are ridiculously cool this is amazing
the maps are a pile of ridiculous hacks
my hand-drawn google logo that I stamp over the provided one that dies horribly in the quantisation process
also this ugly 1-bit version
diorite edition
map is surprisingly not bad on diorite
thin lines are awful but dithering covers a lot of rough spots
it's shockingly good for what it is
the 2-bit version snowy gets is much better.
I actually have a 6-bit version but I've never even tried it on a watch because it wouldn't fit
maybe the core time 2 can get 6-bit maps
it's sort of frustrating, I actually have Google give me a pure black and white map
but I can't stop them from antialiasing it
which is workable on snowy but basically just has to be undone on silk
it is not very effectively undone.
how large would a 6-bit image at that screen size be?
18 kilobytes, give or take
maybe a bit more actually
23?
it'd be a bunch
but with 128k of app memory that's not wholly implausible
functionally, on basalt bobby has 20k of memory after code space. on emery it'd have 85k
or maybe someone will implement xip on snowy and save me from my problems
oh right, 6-bit is also not actually a thing, so a bit more than that
(it jumps from 4 to 8)
Β―_(γ)_/Β―
maybe they'll give us more than 128k to play with.
surely we could at least have 4-bit
though two of those bits are used for shades of grey
new appstore image
i always thought it was interesting that pebble did the uber app in-house
is that your actual location in those images?
it is, in fact, my actual location.
all right
though my residence in Redwood City is no secret
Pebble did most of the big partners apps in-house.
There are three ways to get apps on your platform:
- be big enough that they don't have a choice
- pay them
- convince them to let you do it yourself
the first never applied to Pebble, so it was between the latter two
and I think in basically every case, the last one
the last option does get you the nice in-house ui and art style
which i view as a plus
pebble is a weird platform in terms of making an app good to use
-------------------------------------------------------
EMERY APP MEMORY USAGE
Total size of resources: 21635 bytes / 256KB
Total footprint in RAM: 42824 bytes / 128KB
Free RAM available (heap): 88248 bytes
-------------------------------------------------------
look at all that free memory
pebble_uber_middle_finger.pdc
pff
Way too cool π
Great work @karmic lion π
likes like B, C, and D got lost. Whatever they are.
I'm guessing that's this:
bobby-5c9fd7cb7b-fvqrq bobby 2025/04/20 00:01:56 Error parsing index 1: strconv.Atoi: parsing " 1": invalid syntax
bobby-5c9fd7cb7b-fvqrq bobby 2025/04/20 00:01:56 Error parsing index 8: strconv.Atoi: parsing " 8": invalid syntax
bobby-5c9fd7cb7b-fvqrq bobby 2025/04/20 00:01:56 Error parsing index 9: strconv.Atoi: parsing " 9": invalid syntax
I'm all yours if you need more test cases π
Well, that's looking better, heh
(Especially with the language pack)
yup. though "nearby" seems like maybe a fail
I was asking "Show me a map of the immediate area", if that helps
it probably doesn't know that it can just show a map? like, divorced from the POI feature
looks up some places so it can plot them on a map
This is certainly more helpful
It used to be able to show maps but the results were occasionally very bad
same way that timeline is abstracted behind the reminders tool
in this case it literally can't show a map unless it plots a previous POI result on it
otherwise occasionally it would screw up and just plot a map of the whole earth
taking the control away seemed like the way to go
that 180x100 map looks pretty decent
will probably run with that whenever I get to round properly
seems to me like it wouldn't be harder than any other widget, assuming that we get centered widgets to play nice with pagination? i'd make the map a bit taller on round, to taste
Yeah!! When it's in the middle of the screen, even at its current size, it's totally usable
Not that this would specifically be a Bobby feature, but displaying Japanese hiragana and katakana as romaji would be a huge QoL improvement for me
|| so that I can further postpone getting good ||
kana are easy enough
learning to actually write them was the killer memorization thing for me
it helps a ton with differentiating ones like γΎ and γ or γ and γ
kanji though, woof
That's a universal mood, from what I've heard
@karmic lion Just reported a conversation that claimed to show a map but did not
yeah, it does that sometimes, I have not figured out how to make that more reliable
you can prod it by saying "you forgot the map" or something and it'll show up
Made me crack up TBH
amazing.
for good measure it's false, it does get given back the same content from before.
I have had some stupid arguments with this thing.
Not sure if this is a "round dev build thing", but scroll height calculation seems to be off/inconsistent
Sometimes I've got a huge crimson-chin-esque whitespace at the end of the scroll layer, other times, only a pixel or two
that is a bug across all platforms
yeah I have no idea what's up with it
The calculation of segment heights (and therefore overall height) is definitely some of the most terrifying code in there.
It's never too short so I have not considered it that high-priority
But it's not very polished.
actually thinking about it maybe it's caused by the snap-to-size of an underestimated text segment to its final, correct size
It'd be overestimated, no?
I am curious whether using 2.5 flash instead of 2.0 flash would reuslt in any noticeable improvements to general response quality
No, I think text segment size is only ever underestimated
But when that segment is completed the real size is measured and it gets adjusted
I could imagine that the handling of that adjustment at the level above is wrong and inadvertently applies it twice, or something
The height isn't measured the easy way on every received fragment because the performance cost is awful
So instead it does a running estimate until the text stops showing up
Ahhh
Interesting.
I've just been trying to create a "fail case" by getting a very long list of names as output, the response hung after a snippy back-and-forth π
It's double the cost, right?
Would it be palatable to allow users to opt-in with a warning of reduced quota?
50% higher cost
(with thinking disabled. it's more complicated with thinking enabled)
For the most part, LLM quota usage isn't a major issue anyway; more is spent on other things
But when an entire wikipedia article gets dumped in, that's not true
gonna give it a go myself and see whether it's any good to start with
I've found a reliable way to get the response to hang: Spell "Tokyo" in hiragana.
Okay that's adorable, but didn't hang?
So strange... It's hung every time I've tried
I'm cackling
No idea what's going on here but it's not that specific of a case
I'll stop posting these now, but I want you to know I'm having a great time
I wonder whether it's some sort of unicode thing. somehow.
The server-side logs show nothing wrong - whatever is breaking is apparently breaking on your phone
or watch
can you report the thread? (is that even permitted while it's hanging?)
Can't report when it's hanging sadly
I did get one success
The report can't be generated until it has a whole response because it gets the ID it needs to use at the end
I have a flash 2.5 version on my watch now.
let's see how this goes
interestingly I am seeing it hang after it responds
which appears to be because google is having problems
2025/04/19 17:53:10 find lies failed: Error 503, Message: The model is overloaded. Please try again later., Status: UNAVAILABLE, Details: []
ooh, I crashed my watch again
I have now had it hang
but in this case it's due to a fun bug where if the watch crashes and then you launch the same app again, you get attched to the previous instance of it
and it doesn't like the state loss
I reckon the conversation shouldn't timeout if it's not idle; this change, to me, feels a little on the "hacky patch" side, but also I don't have any concrete objection. What say you?
static void prv_timed_out(SessionWindow* sw) {
if (!conversation_is_idle(conversation_manager_get_conversation(sw->manager))) {
return;
}
BOBBY_LOG(APP_LOG_LEVEL_DEBUG, "Timed out");
window_stack_pop(true);
}
This is true, though a response also shouldn't take sixty seconds
Agreed π
Happy to leave the point be, just finding excuses to prod and poke for best practices in the codebase
It could be in Bobby. And on the Rebble account page it might be an idea to add some information when you are subscribing.
Weirdly, when I run bobby locally, the lie detector is getting UNAVAILABLE errors from Google
but when I run it in production, it's fine
anyway now it won't spend more than 1.5 seconds waiting for a verdict on whether it lied
(the P99 response time is 600ms)
I think the hanging issue is related to quotes being returned by the transcription service!
Hm
Double quotes seem okay
And single quotes I guess.
If you can get bobby's logs that'd be helpful
I assume you can given you have screenshots
(make sure you redact the logged query URL, which has both your authentication token and your exact location in it)
yeah, fair
|| Not too bothered about my location, I'm leaving Japan tomorrow π’ ||
[15:46:50] pkjs> Bobby:392 loadScript /data/user/0/com.getpebble.android.basalt/app_js_app_files/1d272bb4-cf00-4e3e-a7f3-7394309e0341/pebble-js-app.js
[15:46:50] pkjs> Bobby:372 signalLoaded
[15:46:50] pkjs> Bobby:374 inside try-bridge-active
[15:46:50] pkjs> Bobby:383 signalLoaded (finalized)
[15:46:50] pkjs> Bobby:177 Bobby 1.3.0
[15:46:50] pkjs> Bobby:185 Entering real mode.
[15:46:50] pkjs> Bobby:1865 Fetching quota from https://bobby-api.rebble.io/quota?token=heeheehoohoo
[15:46:50] pkjs> Bobby:225 Cached location restored: (35.6648153, 139.7559956)
[15:46:51] pkjs> Bobby:1871 Got quota response: {"hasSubscription":true,"remaining":72719327,"used":7280673}
[15:46:52] pkjs> Bobby:231 position updated: (35.6647929, 139.7560164)
[15:47:01] pkjs> Bobby:236 failed to JSON.parse data passed in
[15:47:01] pkjs> Bobby:129 Inbound app message!
[15:47:01] pkjs> Bobby:130 {"isTrusted":false,"payload":{},"data":{}}
Bobby:236 failed to JSON.parse data passed in
is confusing; there's no console log (or relevant other cause) at that location inpebble-js-app.jsyet the other mentioned lines do correlate
Oh is this going to be another stupid android app JavaScript bridge bug
Yeaaaah sure looks like it
What is on that line?
Prompt is just missing in the "Spell "Tokyo" ..." case
I feel like I've run into this already actually
Ooo! Lovely.
I proceeded to ignore it because I'd never seen the transcription generate quotes anyway
(I ran into it making the example queries)
Man, that's a really, really annoying bug
The android app's JS bridge is super jank
It's clearly genuinely on another thread, too (which shouldn't be possible for JS [of that era])
And also constructs JSON by string concatenation for some reason
I don't think it's on another thread, it's just happening elsewhere and in further jank the android app doesn't report the filenames
It's actually just loaded into a browser so it shouldn't have magic
(now pypkjs actually did inadvertently multithread JavaScript until I added a proper event loop)
Ah yeah no you're right; sorry, thought I saw the "failed to parse" between console.logs from the same function
can you force transcription to generate double quotes somehow?
I suspect Steffan is not using Rebble asr
I probably have to completely ridiculously escape the double quotes in C
Which will break on all other implementations
Grr.
wait I need to try this
I was literally about to implement a real dirty "replace " with β" fix
I think sending a "double-quote lookalike" to the backend might be an acceptable bodge
Though pretty sure the transcription response is a plain C string isn't it
It is
Womp womp
For your sanity and also to avoid reallocations you'd probably want to replace them with something that fits in a single byte
Yeah exactly
Yeah
Would you like the implementation of that S/R function in a specific place for "string utils" or is putting it inline within conversation.c::conversation_add_prompt fine?
strings_fix_android_bridge_bodge? (I was going to call it strings_replace_all_char but if you prefer a business-logic-oriented name this is more pleasing to my tongue xD)
Love a good bodge with spinning lights on it
Sure
Actually calling it will be fun
Probably have to allocate something anyway, it's const char* all the way down
(and sometimes it has string literals passed in)
Delightful
Maybe have the method return a new string, call it from conversation_manager_add_input, pass it to the appmessage, then free it
As a bonus, the user still sees the prettier one.
That's what I was thinking too! I assumed there's no β glyph; but it would never matter 'cause it's just for transmit (still doing ' now tho)
I'll add the Google copyright header to strings
You should probably add your own unless you're assigning your copyright to Google.
I can just free() the pointer from bmalloc(), yeah?
I cannot make transcription generate a response with double quotes
meh
oh wait do I need to get Gemini to create a response with quotes?
Try Spell Tokyo in hiragana - I've also had success with adding quote unquote before the word you want quoted. It'll transcribe the words and quote them IME
I tried that. It just transcribed "quote unquote" instead
hm
Correct
Bosh!
Hurrah
why is it doing this to me
Yeah it does that
I don't understand why, it's the most useless possible way to handle spoken punctuation
I can't postprocess it to turn it into real punctuation because I don't know where the spaces should go
Gemini seems to repeat everything even if you start a new instance apparently
fun
Yes
anyway quotes work here apparently, that's fun
or maybe I'm testing it wrong
now the transcription is pissing me off
how do you have quotes in transcription
No idea! Maybe it's my speech cadence and/or accent.
https://github.com/pebble-dev/bobby-assistant/pull/3 - nearly forgot to read CONTRIBUTING in my excitement. Please accept my humble bodge.
it knows I want quotes, but it doesn't actually quote
I should try changing language
Can you put it under the Apache license (still with your copyright)?
You also missed the license header on the implementation
Probably there should be a linter for this sort of thing.
Sure, can do. Was following similar examples in the codebase WRT impl. header!
Where those are there it is an error π
All the files should have an Apache 2 header
The "created by" is my IDE's default
Alright, done! Force-pushed because that's a lesser sin than fixup commits πΌ
hurrah
π₯³
Ah, just as I was packing up - realised I should probably check for other instances of transcription -> phone
It's a two line change, I can make have made a pull request but I figure less faff if you do it. Bonus, in this case no alloc π
the maps are super cool, for what it's worth! I'm glad they were able to make it in after all
Sadly it remains the case that I'm basically out of space
I wonder how much the rodata and text segments contribute to your app space
time to do streaming of content of the view from the phone
to avoid storing all the conversation all the time
remove the disclaimers on first app start and send them from the phone
Way ahead of you
All nontrivial text blocks are read in from resources when needed
Hi everyone! I tried to use Bobby in Russian, but after a voice request, the app freezes every time and the watch reboots. Just so you know
I think it has previously been mentioned that the Russian language pack causes the watch to crash here
Unfortunately there is probably nothing we can do about it
I thought as much. in any case, you are great guys. thanks for the answer π
I am still very interested why that is, it seems so random
These emails are always fun.
Just, flawless presentation, truly
I especially love the automatic hyperlinks
Is Bobby working for anyone else?
I get server errors.
Oh I probably have a build pointing at my desktop
works here
for some reason when I ask Bobby a question in german it seems to get stuck on the 3 dots loading thingy
it doesn't crash, but it just never seems to get a response
Working here.
Yeah I figured
Sadly I have no good way to install the production version
Once you sideload an app you had installed from the appstore you then can't install it from the appstore again because it doesn't know you uninstalled it (this is android specific; iOS does remove it from your locker when you do this)
So I can't add it from the store without database prodding
I can't sideload it by opening the pbw because that's broken in modern Android
Oh well, a problem for later
And the fix for this is also unavailable because Rebble is bad at paperwork
you just need to find a mirror of the sideloader
apkmirror should have it
But sideloading phone apps is also forbidden
didn't you have to sideload the pebble app?
I can do it with adb but that is more hoop jumping than I'm up for.
fair
If I were in a position to use adb I'd also be in a position to use the pebble tool
fair
Also why is this still a problem
nobody resolved it on play store side
I think it can only be done by admins there
which is annoying
I think it requires a) being a play store admin, and also b) probably being a member of the entity Google wants to verify
Since I am neither a nor b this is beyond my capabilities.
I do enjoy the implication that if we had ever shipped cobble it would probably have ceased to exist after a year because nobody filled out the existing paperwork
yeah, I think lav tried getting it fixed, but was unable to for both reasons
and admins seem too busy for it

I generally agree actually - I think apps are mostly the wrong thing for pebbles. Certainly apps that take more than one button input.
with occasional exceptions like long-running control tasks (e.g. music)
(I also think this about other smartwatches)
i largely agree
yeah i think that was what apple eventually learned as well, watch apps are typically not super useful
also whenever I do launch an app I'm annoyed when I look at my watch half an hour later and it's still there
"I stopped caring about this half an hour ago, what time is it?"
apple has an option for that, i guess pebbles never did (i think it's called "return to clock" and can be set to 30min, 1hr, or never)
wear os I feel is a little too aggressive about returning to the watch face
i actually turned it off, if i started an app i want it to stay there until i explicitly quit
it would be a good default behavior for pebble
Wear OS doesn't actually return to the watch face
it just shows an overlay of the clock over the app
but the app is still there when you activate the watch again
I mostly find this annoying.
for the opposite reason
time to DEMAND that product copy the return to clock function
the watch should just read my mind and figure out when I forget about the task I started
ah yeah i was wrong about that
(apps can actually supersede that overlay, it's just the default ambient mode experience)
you get that when the watch is saving power by not running the main CPU.
OnePlus has a dumb behavior that is much more annoying: it doesn't blur or dim the app you're using, it instead has a generic blur-looking color effect that is the same every time