+
    iHàj‰\  ã                  ó*  € R t ^ RIHt ^ RIHtHt ^ RIHt ^ RIH	t	H
t
HtHtHtHtHt ^ RIHtHt ^ RIHt RtRtR	]R
RRRRRRRRRRRRRRR/	tR
RRRRRRRRRRRRR RR!/t0 RŸmtR" R# ltR$ R% ltR& R' ltR(R)R*R+R,R-R.R/R0R1R2R3R4R5/tR6tR7tR t R8R9R:R;R<R=/t!R> R? lt"R@ RA lt#RBt$R(RCR*]PK                  RDRE4      R,RFR.RGR0RHR2RIR4RJ/t&RKt'R¡t(RLt)RM RN lt*ROt+RPRQRRRS]+ RT2RU3t,R¢t-RVt.R£t/RWRXRYRZR[R\/t0R]t1R^t2R_t3R` Ra lt4Rb Rc lt5Rd Re3Rf Rg llt6Rh Ri lt7Rj Rk lt8Rl Rm lt9Rn Ro lt:Rp Rq lt;Rr Rs lt<Rt Ru lt=Rv Rw lt>RxRy RzR{ R|]:R}R~ R];R€]<R�R‚ RƒR„ R…]=! R†4      R‡]=! Rˆ4      R‰RŠ R‹RŒ R�RŽ R�R� /t?R‘ R’ lt@R“ R” ltAR• R– ltBR—R˜ 3R™ Rš lltCR› Rœ ltDR� Rž ltER—# )¤aœ  The words of first-run onboarding: the scripted greeting, the opening prompt, and the reminder
that rides on every ``setup_beat`` result. Pure; ``reminder(key, record, facts)`` renders the key
``agent/onboarding_flow.py::apply`` returns.

The rules for the whole run live in the opening prompt (a hidden user turn, so the system prompt
stays byte-stable); reminders say only what was picked and what comes next.
)Úannotations)ÚCallableÚMapping)ÚAny)ÚFIXED_IDÚ	MAX_LABELÚ	MAX_PICKSÚOWN_TASKÚ
TASK_BY_IDÚeligible_tasksÚtask_skills)ÚFactsÚ	next_beat)ÚACCENT_SWATCHESzGetting startedzPHi, I'm Hermes. Let's set things up for you. Then we'll get something cool done.ÚenÚarum   Ù…Ø±Ø­Ø¨Ù‹Ø§ØŒ Ø£Ù†Ø§ Hermes. Ù„Ù†Ø¬Ù‡Ù‘Ø² ÙƒÙ„ Ø´ÙŠØ¡ Ù„ÙƒØŒ Ø«Ù… Ù†Ù†Ø¬Ø² Ù…Ø¹Ù‹Ø§ Ø´ÙŠØ¦Ù‹Ø§ Ø±Ø§Ø¦Ø¹Ù‹Ø§.ÚdeuV   Hallo, ich bin Hermes. Richten wir alles fÃ¼r Sie ein. Danach machen wir etwas Cooles.ÚeszPHola, soy Hermes. Vamos a dejarlo todo listo para ti. Luego haremos algo genial.Úfruc   Bonjour, je suis Hermes. Configurons tout pour vous. Ensuite, nous ferons quelque chose de gÃ©nial.Újau—   ã�“ã‚“ã�«ã�¡ã�¯ã€�Hermes ã�§ã�™ã€‚ã�¾ã�šã�¯ã�‚ã�ªã�Ÿã�«å�ˆã‚�ã�›ã�¦è¨­å®šã�—ã�¾ã�—ã‚‡ã�†ã€‚ã��ã�®ã�‚ã�¨ã€�ä½•ã�‹ã�™ã�”ã�„ã‚‚ã�®ã‚’ä½œã‚Šã�¾ã�—ã‚‡ã�†ã€‚Úruu‘   ÐŸÑ€Ð¸Ð²ÐµÑ‚, Ñ� Hermes. Ð”Ð°Ð²Ð°Ð¹Ñ‚Ðµ Ð²Ñ�Ñ‘ Ð½Ð°Ñ�Ñ‚Ñ€Ð¾Ð¸Ð¼ Ð¿Ð¾Ð´ Ð²Ð°Ñ�. Ð� Ð¿Ð¾Ñ‚Ð¾Ð¼ Ñ�Ð´ÐµÐ»Ð°ÐµÐ¼ Ñ‡Ñ‚Ð¾-Ð½Ð¸Ð±ÑƒÐ´ÑŒ ÐºÐ»Ð°Ñ�Ñ�Ð½Ð¾Ðµ.Úzhu^   ä½ å¥½ï¼Œæˆ‘æ˜¯ Hermesã€‚æˆ‘ä»¬å…ˆå¸®ä½ æŠŠä¸€åˆ‡è®¾ç½®å¥½ï¼Œç„¶å�Žä¸€èµ·å�šç‚¹å¾ˆé…·çš„äº‹ã€‚úzh-hantu^   ä½ å¥½ï¼Œæˆ‘æ˜¯ Hermesã€‚æˆ‘å€‘å…ˆå¹«ä½ æŠŠä¸€åˆ‡è¨­å®šå¥½ï¼Œç„¶å¾Œä¸€èµ·å�šé»žå¾ˆé…·çš„äº‹ã€‚u   Ø¨Ù…Ø§Ø°Ø§ Ø£Ù†Ø§Ø¯ÙŠÙƒØŸzWie darf ich Sie nennen?u   Â¿CÃ³mo quieres que te llame?zComment dois-je vous appeler ?u-   ã�ªã‚“ã�¨ã�Šå‘¼ã�³ã�™ã‚Œã�°ã�„ã�„ã�§ã�™ã�‹ï¼Ÿu&   ÐšÐ°Ðº Ðº Ð²Ð°Ð¼ Ð¾Ð±Ñ€Ð°Ñ‰Ð°Ñ‚ÑŒÑ�Ñ�?u   æˆ‘è¯¥æ€Žä¹ˆç§°å‘¼ä½ ï¼Ÿu   æˆ‘è©²æ€Žéº¼ç¨±å‘¼ä½ ï¼Ÿc               ó    € V ^8„  d   QhRRRR/# ©é   Úlocaleú
str | NoneÚreturnÚstr© )Úformats   "Ú:/home/ubuntu/.hermes/hermes-agent/agent/onboarding_text.pyÚ__annotate__r#   5   s   € ÷ 6ñ 6˜
ð 6 sñ 6ó    c                ó2  € T ;'       g    RP                  4       P                  4       P                  RR4      P                  R4      pV^ ,          R8X  d'   \        P                  VR,          4      '       d   R# R# V^ ,          \        9   d
   V^ ,          # R# )ziA locale (``zh-hant``, ``de-DE``, ``zh_TW``) as the desktop language it reads in; English when
none fits.Ú Ú_Ú-r   :é   NNr   r   )ÚstripÚlowerÚreplaceÚsplitÚ_TRADITIONAL_CHINESEÚintersectionÚ
_GREETINGS)r   Útagss   & r"   Úui_languager2   5   s}   € ð �LˆL�b×ÑÓ!×'Ñ'Ó)×1Ñ1°#°sÓ;×AÑAÀ#ÓF€DØˆA…w�$„Ü0×=Ñ=¸dÀ2½h×GÒGˆyÐQÈTÐQØ˜1•g¤Ô+ˆ4��7Ð5°Ð5r$   c               ó    € V ^8„  d   QhRRRR/# r   r    )r!   s   "r"   r#   r#   >   s   € ÷ +ñ +�Zð + Cñ +r$   c                ó.   € \         \        V 4      ,          # ©N)r0   r2   )r   s   &r"   Úgreetingr6   >   s   € Ü”k &Ó)Õ*Ð*r$   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úbeatr   r   r   r   r    )r!   s   "r"   r#   r#   B   s!   € ÷ ñ �3ð  
ð ¨sñ r$   c                ó~   € V R8X  d+   \         P                  \        V4      \        R,          4      # \        V ,          # )zCThe card's own question; the name card asks in the user's language.Úname)Ú_NAME_QUESTIONSÚgetr2   Ú	QUESTIONS)r8   r   s   &&r"   Úquestionr>   B   s0   € àˆv„~Ü×"Ñ"¤;¨vÓ#6¼	À&Õ8IÓJÐJÜ�T�?Ðr$   r:   zWhat should I call you?ÚthemezPick a colour.ÚlayoutzWhich layout?Ú
connectorszWhich apps should I work with?ÚpluginszWant any of these?ÚtourzWant a look around first?Úbuildz Know what you'd like me to make?zJtool_call {"calls":[{"name":"set_theme","arguments":{"accent":"violet"}}]}zVtool_call {"calls":[{"name":"gui_tour","arguments":{"action":"start","preset":"%s"}}]}Ú	rtx_sparkzFIt is an NVIDIA RTX Spark (Windows on Arm), built to run local models.Ú	dgx_sparkzPIt is an NVIDIA DGX Spark (Linux on Arm with a GB10), built to run local models.ÚdiscretezIt has an NVIDIA GPU.c               ó    € V ^8„  d   QhRRRR/# ©r   Úfactsr   r   r   r    )r!   s   "r"   r#   r#   f   s   € ÷ ñ �uð  ñ r$   c           	     ó¸  € V P                   R 8X  d   RMRpRT RV P                   RV P                  ;'       g    R RV P                   R2	.pV P                  \
        9   d'   VP                  \
        V P                  ,          4       V P                  '       d    VP                  R	V P                   R24       VP                  R
4       RP                  V4      # )ÚremotezFthe computer running Hermes, which is not the one in front of the userzthis computerzWhat you know about ú: z on zan unknown architecturez, a Ú.zLocale: zfNever recite these. A fact that is missing is unknown. When the user says otherwise, believe the user.Ú )	Úfacts_sourceÚosÚarchÚmachine_kindÚnvidia_platformÚ_NVIDIAÚappendr   Újoin)rJ   ÚwhoseÚliness   &  r"   Úfacts_blockrZ   f   sÉ   € à×"Ñ" hÔ.ñ VØ4Cð 
à# E 7¨"¨U¯X©X¨J°d¸5¿:¹:×;bÐ;bÐIbÐ:cð dØ×$Ñ$Ð% Qð(ð )€Eà×Ñ¤Ô'Ø�‰”W˜U×2Ñ2Õ3Ô4Ø‡|‡|€|Ø�‰�x §¡˜~¨QÐ/Ô0Ø	‡L�Lð %ô &à�8‰8�E‹?Ðr$   c               ó    € V ^8„  d   QhRRRR/# rI   r    )r!   s   "r"   r#   r#   t   s   € ÷ ?ñ ?˜%ð ? Cñ ?r$   c                ó´   € RP                  R \         4       4      pR\        V 4       R\         RRP                  \        4       R\
        R,           R	V R
2# )zDThe hidden first turn of the onboarding chat: every rule of the run.Ú
c              3  ó6   "  € T F  w  rR V RV 2x € K  	  R# 5i)ú- rM   Nr    )Ú.0r:   Úbucketss   &  r"   Ú	<genexpr>Ú!opening_prompt.<locals>.<genexpr>v   s!   é € ÐZÑGY±m°d˜R ˜v R¨ yÕ1ÓGYùs   ‚a[	  [System note: This is the user's first time opening the Hermes desktop app. You run their first-run onboarding in this chat. The beats, in order: their name, the theme (accent colour; light or dark only if they ask), the layout, connectors, plugins, a tour, then the first thing you build for them.

How it works:
- setup_beat shows a beat's card and waits for the user. setup_beat(beat="next") shows the next beat. Its result carries their answer and a reminder of what to do next. Follow the reminder.
- Before a card, acknowledge in a few words and at most one more sentence. The card asks its own question and shows its own options: never ask it yourself, never list the options in text.
- After a pick, say it by its label in three words or fewer. No opinion, no praise, never the same words twice.
- If they write a message while a card waits, the card closes unanswered and their message comes as their next turn (words typed on the name card are the name). If the message answers the card, apply it yourself and move on. Otherwise answer it properly and briefly, then bring the card back in one line with setup_beat(beat=<that beat>). Never show a card again unless you are bringing it back.
- If they ask you to pick (a colour, a layout), pick from what you know and say why in one line.
- If they skip a beat in words, call setup_beat(beat=<that beat>, skip=true), take the default, and never ask it again in the same form. If they want to stop altogether, say in one line that the Skip setup button ends it, then carry on; only they can end it, with that button.
- Off-script requests are done now, then you bring the card back.
- You may look around this computer when they say yes: installed apps, developer tools, the OS and the hardware, read with the terminal. Never personal files, documents, browser data or messages without a specific ask. A yes to looking is an off-script request: act on it at any beat.

Voice: every word you write is spoken to the user. Never think out loud. Never mention beats, cards, tools, reminders or a script, and never call this setup or onboarding (the Skip setup button's name is the one exception). One or two short, plain sentences per message: warm, like the front desk of somewhere good. No thanks, no praise, no stock lines, no em dashes, no exclamation marks. Write in the user's language when the locale is not English, labels included.

zŸ
If they ask what you know about them, answer truthfully: these machine basics and what they picked.

Tools you reach through tool_call (their call shapes):
- z. accent: a swatch id (ú, zq) or a hex colour #rrggbb; mode: light, dark or system; layout: sidebar-left (Basic) or terminal-deck (Elite).
- ÚquickaG   (preset quick or full).

Local models: the model picker chooses one. Explain the download and how it fits this hardware first, then point to Settings, Providers, Local Models. Never install a model runtime or download a model yourself.
Ask before sending, deleting or scheduling anything. Never turn off a security setting.

As you go, form a coarse read of them on these seven dimensions, from what they say and pick and from what you see when they let you look. Use it to choose suggestions and words; never say it out loud. Presence of an app is not use, and absence is unknown.
z=

The app has already greeted them and is asking their name.])rW   ÚPROFILE_DIMENSIONSrZ   Ú
_SET_THEMEr   Ú
_TOUR_CALL)rJ   Ú
dimensionss   & r"   Úopening_promptrj   t   sr   € à—‘ÑZÕGYÓZÓZ€Jðô ˆUÓÐ ð ô €,Ð% d§i¡i´Ó&@Ð%Að BÜ�ÕÐð ð €ð <ð3?ð ?r$   a™  Before the card, offer once to look around this computer and suggest what to connect. Only on yes, and only installed apps, developer tools, the OS and the hardware; never personal files, documents, browser data or messages without a specific ask. Then show the card with what you suggest: setup_beat(beat="connectors", suggest=[<connector slugs>]). If they say no, show it with setup_beat(beat="connectors").z-setup_beat(beat="name", value="<their name>")z"accent":"violet"z"accent":"<colour>"zctool_call {"calls":[{"name":"set_theme","arguments":{"layout":"sidebar-left" or "terminal-deck"}}]}z^setup_beat(beat="connectors", value="continue") for "done" or "continue", skip=true for "skip"z[setup_beat(beat="plugins", value="continue") for "done" or "continue", skip=true for "skip"zesetup_beat(beat="tour", value="quick", "full" or "skip"), bucketing their words into one of the threez‹setup_beat(beat="build", value=<id>) for an option on the card; a task of their own is setup_beat(beat="build", value="own"), then build itzùWhen the first thing is built and shown, ask with clarify: "How does this look?" with the choices "Looks right", "Change something" and "Take it further", exactly. Put the next-step idea in your text. After they answer, call setup_beat(beat="done").z]tool_call {"calls":[{"name":"desktop_preview","arguments":{"action":"open","url":"<file>"}}]}c               ó    € V ^8„  d   QhRRRR/# rI   r    )r!   s   "r"   r#   r#   º   s   € ÷ Lñ L˜ð L 3ñ Lr$   c                óF   € V P                   R8X  d   RMRpR\         RV R2# )zdEvery host shows results in the app's preview pane, which watches a local file but not a remote one.rL   zKOn this host it does not reload by itself: open it again after each change.zhOpen it once, early: it reloads when the file changes, so keep improving the same file while they watch.z6Show results in the preview pane beside the chat with z"; it shows HTML, images and PDFs. z- Say it is open only after the call succeeds.)rP   Ú_PREVIEW_CALL)rJ   Úreloads   & r"   Ú_preview_linero   º   sF   € ð ×#Ñ# xÔ/ñ \ðð ð EÄ]ÀOð TØ�HÐIðKð Lr$   zhttps://cdn.jsdelivr.net/npm/z_One self-contained HTML file, laid out for the pane (often about 600px wide) and able to widen.z¤A standalone page: it sets its own background, font and colours. The preview pane does not theme it; the theme variables are only for ::preview widgets in the chat.ztIt moves within a second: a diagram that draws itself, a dot that runs a path, numbers that count up to real values.z4Libraries, only what the page needs, each pinned as au  <package>@<version>/<file>: gsap@3.13.0 for motion, with its DrawSVGPlugin, MotionPathPlugin and ScrollTrigger (register each); d3@7.9.0 for charts of real numbers; p5@1.11.3 for a 2D figure they drag or tune; matter-js@0.20.0 for physics; katex@0.16.11 with its CSS and auto-render for maths; tone@15.0.4 for sound, started on a click; roughjs@4.6.6 for a hand-drawn look.z„3D: three@0.170.0 is ES modules only. Use an import map: "three" to its build/three.module.js, "three/addons/" to its examples/jsm/.aî  Never route around a connector. Reading a connected app: check it with manage_connections(action="status"). Find its tools with tool_search using the app slug, then the slug plus an action (a bare slug misses actions). tool_describe every action you need in one batch, then call them through tool_call(calls=[{"name": "connectors__<slug>__<ACTION>", "arguments": {...}}]). Resolve names to ids before acting. Read only; ask before any write, and say that a write may run as the connector's bot.Úmacosz²This Mac: check with `which brew` and `ls -d /Applications/<App>.app`; install with `brew install --cask <app>`; on Apple silicon check `lipo -archs` for a binary's architecture.ÚwindowszÛThis PC: check with `winget list --accept-source-agreements`; install with `winget install <id> --accept-source-agreements --accept-package-agreements` (without both flags a fresh profile hangs on an agreements prompt).Úlinuxz½This Linux machine: check with `which`, and `flatpak list` when flatpak is there; install with `flatpak install -y flathub <id>`. Anything that needs sudo is listed for the user, never run.zuOn Windows on Arm, read arm64 vs x64 from winget's install output, not the manifest, and say when an app is x64 only.zQThis machine is built for local models; say so once when it fits what they asked.z\Hermes runs on another computer than the user's: say which machine anything is installed on.c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úoptionr   ÚlabelÚresolve_skillúCallable[[str], str | None]r   z	list[str]r    )r!   s   "r"   r#   r#   í   s0   € ÷ sñ s˜ð s Sð sÐ9Tð sÐYbñ sr$   c                óÌ  € \         P                  ! V \        4      pV'       g   VP                  '       d   R T;'       g    VP                   R2MRp\	        VP
                  ^4       UUu. uF  w  rVV RV 2NK  	  pppV RVP                   R2RRP                  \        W4      4       R2R.VOR	VP                   2NR
VP                   2NRVP                   2N# u uppi )zThey picked "z". r&   z. z
Your job: rN   z)Load these skills with skill_view first: rd   zSteps:zOutput: zQuality bar: zDone when: )r
   r<   r	   ru   Ú	enumerateÚstepsÚgoalrW   r   ÚoutputÚqualityÚdone)rt   ru   rv   ÚtaskÚpickedÚnÚsteprz   s   &&&     r"   Ú_task_promptrƒ   í   sõ   € Ü�>Š>˜&¤(Ó+€Dß:?À4Ç:Ç:À:ˆ}˜U×0Ð0 d§j¡jÐ1°Ñ5ÐTV€FÜ+4°T·Z±ZÀÔ+CÔDÑ+C¡ �ˆs�"�T�F‹^Ñ+C€EÑDØˆh�j §¡ ¨1Ð-Ø7¸¿	¹	Ä+ÈfÓBdÓ8eÐ7fÐfgÐhØðsàðsà (¨¯©¨Ð6ðsà:GÈÏÉÀ~Ð8VðsàZeÐfj×foÑfoÐepÐXqðsð sùó Es   Á+C c               ó    € V ^8„  d   QhRRRR/# )r   Útitler   r   r    )r!   s   "r"   r#   r#   ö   s   € ÷ Fñ F�Cð F 3ñ Fr$   c                ó>   € R P                  V  R2.R V 4       O4      # )r]   Ú:c              3  ó,   "  € T F
  pR V 2x € K  	  R# 5i)r_   Nr    )r`   Úlines   & r"   rb   Ú_bullets.<locals>.<genexpr>÷   s   é € Ð$C¹U°T r¨$¨¥[»Uùs   ‚©rW   )r…   rY   s   &&r"   Ú_bulletsrŒ   ö   s%   € Ø�9‰9˜˜˜q�kÐDÑ$C¹UÓ$CÐDÓEÐEr$   c                ó   € V # r5   r    ©r:   s   &r"   Ú<lambda>r�   ú   s   € Ñhlr$   r&   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   rt   r   rJ   r   rv   rw   ru   r   r    )r!   s   "r"   r#   r#   ú   s9   € ÷ [ñ [˜3ð [ uð [Ð=Xð [Øð[Ø'*ñ[r$   c           	     ó„  € . \         O\        V4      NV \        9   d   \        3MROpV \        9   d   \        R\        4      .M. p\        P                  VP                  \        R,          4      .pVP                  R8X  d'   VP                  R8X  d   VP                  \        4       VP                  R9   d   VP                  \        4       VP                  R8X  d   VP                  \         4       RP#                  RP#                  \%        WV4      4      \        RV4      .VO\        R	V4      NR
\&         2N4      # )zŸThe prompt once a first task is picked; ``label`` is the card text they clicked, ``resolve_skill``
names a skill as this install loads it (None: missing here).zWhen you make a pagerr   rq   Úarm64rL   z

r]   zHow to workzThis computerzWhen it is shown:
r    )rE   rF   )Ú_HOW_TO_WORKro   Ú_CONNECTOR_TASKSÚ_CONNECTORSÚ_PAGE_TASKSrŒ   Ú_PAGEÚ	_OS_LINESr<   rQ   rR   rV   Ú_ARM_WINDOWSrT   Ú_SPARK_LINErP   Ú_REMOTE_LINErW   rƒ   Ú_CLOSE)rt   rJ   rv   ru   ÚworkÚpageÚhosts   &&&&   r"   Úbuild_guidancer    ú   s  € ð jŒ\Ðiœ=¨Ó/ÐiÀVÔO_ÔE_´K±>ÐegÐi€DØ8>Ä+Ô8MŒHÐ+¬UÓ3Ñ4ÐSU€DÜ�M‰M˜%Ÿ(™(¤I¨gÕ$6Ó7Ð8€DØ‡x�x�9Ô §¡¨wÔ!6Ø�‰”LÔ!Ø×ÑÐ :Ô:Ø�‰”KÔ Ø×Ñ˜XÔ%Ø�‰”LÔ!Ø�;‰;˜Ÿ	™	¤,¨v¸mÓ"LÓMÌxÐXeÐgkÓOlð ZÐosð ZÜ! /°4Ó8ðZØ<OÔPVÈxÐ:XðZó [ð [r$   c               ó   € V ^8„  d   QhRR/# ©r   r   r   r    )r!   s   "r"   r#   r#     s   € ÷ 3ñ 3�cñ 3r$   c                ó8   € V '       d   R P                  V 4      # R# )rd   Únoner‹   )Úvaluess   &r"   Ú_namesr¦     s   € ß &ˆ4�9‰9�VÓÐ2¨FÐ2r$   c               ó    € V ^8„  d   QhRRRR/# ©r   ÚrecordúMapping[str, Any]r   r   r    )r!   s   "r"   r#   r#     s   € ÷ %ñ %Ð)ð %¨cñ %r$   c                óì   € \        \        P                  ! V R,          4      V R,          4      pRP                  R V 4       4      pR\         R\
         R\        \        ,          P                   RV 2# )	z-The rows the model picks the build card from.rJ   Úpicksr]   c              3  óv   "  € T F/  pR VP                    RVP                   RVP                   R2x € K1  	  R# 5i)r_   z (z): rN   N)Úidru   r{   )r`   r   s   & r"   rb   Ú_build_menu.<locals>.<genexpr>  s1   é € ÐTÉtÀt˜˜DŸG™G˜9 B t§z¡z l°#°d·i±i°[ÀÕBËtùs   ‚79zFor the build card, pick up to a    of these that fit what you learned about them, earlier rows first when they fit, and call setup_beat(beat="build", options=[{"id": ..., "label": ...}]). Reword each label to fit them and keep its energy: a short, specific action they would want to click, z+ characters max. Ids only from this list. "z" is added last by itself.
)	r   r   Úfrom_storedrW   r   r   r
   r   ru   )r©   ÚrowsÚlisteds   &  r"   Ú_build_menur³     sr   € äœ%×+Ò+¨F°7­OÓ<¸fÀW½oÓN€DØ�Y‰YÑTÉtÓTÓT€FØ-¬i¨[ð 9nô ˆkÐEÄjÔQYÕFZ×F`ÑF`ÐEað bØ!˜(ð	$ð %r$   c               ó    € V ^8„  d   QhRRRR/# r¨   r    )r!   s   "r"   r#   r#     s   € ÷ Hñ HÐ#ð H¨ñ Hr$   c                ób   € \        V 4      pVf   R# RV R2pVR8X  d   V R\        V 4       2# T# )NzjEvery beat is settled; after the build is shown and its close card answered, call setup_beat(beat="done").z(Next: setup_beat(beat="next") shows the z card.rD   rO   )r   r³   )r©   r8   r‰   s   &  r"   Ú_nextr¶     sD   € Ü�VÓ€DØ‚|Ù{Ø5°d°V¸6ÐB€DØ.2°g¬oˆdˆV�1”[ Ó(Ð)Ð*ÐGÀ4ÐGr$   c               ó   € V ^8„  d   QhRR/# r¢   r    )r!   s   "r"   r#   r#   "  s   € ÷ iñ i Cñ ir$   c                óˆ   € R RRR/P                  V R,          R,          V R,          R,          4      pRV R\        V 4       2# )zsidebar-leftÚBasiczterminal-deckÚEliter¬   r@   zLayout z= is on, already applied. Do not call set_theme for it again. )r<   r¶   )r©   rJ   ru   s   && r"   Ú_after_layoutr»   "  sP   € Ø˜W o°wÐ?×CÑCÀFÈ7ÅOÐT\ÕD]Ð_eÐfmÕ_nÐowÕ_xÓy€EØ�U�GÐXÔY^Ð_eÓYfÐXgÐhÐhr$   c               ó   € V ^8„  d   QhRR/# r¢   r    )r!   s   "r"   r#   r#   '  s   € ÷ (ñ (¨ñ (r$   c           
     ó¨   € V R ,          pVR,          '       d   RMRpR\        VR,          4       R\        VR,          4       RV R\        V 4       2# )	r¬   Ú	connectedz8 These are already connected; do not connect them again.r&   zConnected: z; newly connected: Únewly_connectedrN   rO   ©r¦   r¶   )r©   rJ   r¬   Úagains   &&  r"   Ú_after_connectorsrÂ   '  sa   € Ø�7�O€EØJOÐP[×J\ÔJ\ÑFÐbd€EØœ&  {Õ!3Ó4Ð5Ð5HÌÐPUÐVgÕPhÓIiÐHjÐjkØˆg�Q”u˜V“}�oð'ð (r$   c               ó   € V ^8„  d   QhRR/# r¢   r    )r!   s   "r"   r#   r#   .  s   € ÷ Mñ M Sñ Mr$   c                ót   € V R ,          R,          pV'       d   RMRpR\        V4       RV R\        V 4       2# )r¬   Ú	installedz7 They are already installed; do not install them again.r&   zInstalled plugins: rN   rO   rÀ   )r©   rJ   rÅ   rÁ   s   &&  r"   Ú_after_pluginsrÆ   .  s>   € Ø�w• Õ,€IßIRÑEÐXZ€EØ ¤¨	Ó!2Ð 3°1°U°G¸1¼UÀ6»]¸OÐLÐLr$   c               ó   € V ^8„  d   QhRR/# )r   Úpresetr   r    )r!   s   "r"   r#   r#   4  s   € ÷ fñ f�#ñ fr$   c                ó   a € V 3R  l# )c                ó<   <€ R \         S,           R\        V 4       2# )z>Say "Here's where things live." Then, in this same turn, call zW and then show the build card: it waits under the tour. Never bring the tour up again. )rh   r³   )r©   rJ   rÈ   s   &&€r"   r�   Ú_tour.<locals>.<lambda>5  s*   ø€ Ø
IÌ*ÐW]ÕJ]ÐI^ð _OÜOZÐ[aÓObÐNcñ	er$   r    )rÈ   s   fr"   Ú_tourrÌ   4  s   ø€ ôfð fr$   c               ó   € V ^8„  d   QhRR/# )r   r   r   r    )r!   s   "r"   r#   r#   :  s   € ÷ Jñ J˜Zñ Jr$   c                ó|   € V P                  R 4      ;'       g    / P                  R4      ;'       g    \        V 4      # )Úwaitingr8   )r<   r   ©r©   s   &r"   Ú_waiting_beatrÑ   :  s1   € Ø�J‰J�yÓ!×'Ð' R×,Ñ,¨VÓ4×IÐI¼	À&Ó8IÐIr$   Ú
after_namec                ó@   € R V R,          R,           R\        V 4       2# )zThey go by r¬   r:   z%. Greet them by name in a few words. ©r¶   ©ÚrÚfs   &&r"   r�   r�   ?  s$   €  ¨Q¨w­Z¸Õ-?Ð,@Ð@eÔfkÐlmÓfnÐeoÑpr$   Úafter_themec                óT   € R V R,          R,          ;'       g    R R\        V 4       2# )zAccent r¬   Úaccentz	Nous bluez\ is on, already applied. Do not call set_theme for it again. React in three words or fewer. rÔ   rÕ   s   &&r"   r�   r�   @  s3   €  7¨1¨W­:°hÕ+?×+NÐ+NÀ;Ð*Oð P[Ü[`ÐabÓ[cÐZdñ"fr$   Úafter_layoutÚoffer_firstc                ó   € R \          2# )z&The connectors card is not shown yet. )Ú_LOOK_AROUNDrÕ   s   &&r"   r�   r�   C  s   € Ð"HÌÈÑ Wr$   Úafter_connectorsÚafter_pluginsÚ
after_tourc                ó   € R \        V 4       2# )z4The tour is already running; do not start it again. rÔ   rÕ   s   &&r"   r�   r�   F  s   € Ð!UÔV[Ð\]ÓV^ÐU_Ñ`r$   Úafter_buildc                ó   € \        V 4      # r5   rÔ   rÕ   s   &&r"   r�   r�   G  s   € ¤ a¤r$   Ú
tour_quickre   Ú	tour_fullÚfullÚ	tour_skipc                ó   € R \        V 4       2# )z1No tour. In this same turn, show the build card. )r³   rÕ   s   &&r"   r�   r�   J  s   € Ð QÔR]Ð^_ÓR`ÐQaÑbr$   Úmoved_onc                ó   € R \        V 4       2# )z@That beat is skipped; take its default and do not ask it again. rÔ   rÕ   s   &&r"   r�   r�   K  s   € Ð_Ô`eÐfgÓ`hÐ_iÑjr$   Úskip_allc                ó   € R # )z–They ended setup. In one line, say they can ask you anything any time, then stop guiding. The onboarding rules no longer apply; this is a normal chat.r    rÕ   s   &&r"   r�   r�   L  s   € ñ fr$   Úcompletec                ó   € R # )zŽOnboarding is complete. Its rules no longer apply; this is a normal chat. Close in one short line: whenever they are stuck, they can just ask.r    rÕ   s   &&r"   r�   r�   N  s   € ñ \r$   c               ó    € V ^8„  d   QhRRRR/# ©r   r8   r   r   r    )r!   s   "r"   r#   r#   S  s   € ÷ .ñ .˜3ð . 3ñ .r$   c                ó$   € RV R\        V 4       2# )z]A repeat apply of a settled beat: steer the model forward instead of drawing another receipt.úThe ze was already set by the card or an earlier call. Do not apply it again unless they ask for a change. rÔ   ©r©   r8   s   &&r"   Ú_alreadyrõ   S  s!   € à�4�&ð Ü" 6›]˜Oð-ð .r$   c               ó    € V ^8„  d   QhRRRR/# rñ   r    )r!   s   "r"   r#   r#   Y  s   € ÷ ñ  ð ¨ñ r$   c                óV   € R V R2pVR9   d   VRV R\         V,           R2,          pV# )ró   zt card closed unanswered: they wrote a message instead. It comes next as their own turn; write nothing until it does.z7 If it asks what you think or which one fits, pick the za yourself: look around first if they asked, then say your pick and why in one line and apply it (z).)r?   r@   )Ú_TYPED_ANSWER)r©   rJ   r8   Útexts   &&& r"   Ú_wroterú   Y  sQ   € à�4�&ð +ð +€DàÐ"Ô"àÐJÈ4È&ð QUÜUbÐcgÕUhÐTiÐikðmõ 	nˆà€Kr$   c               ó    € V ^8„  d   QhRRRR/# rñ   r    )r!   s   "r"   r#   r#   d  s   € ÷ Fñ F Cð F¨Cñ Fr$   c                ó   € R V RV R2# )ró   zà card closed without an answer. If a message from them comes next, answer it first. Otherwise say one short line that they can pick up whenever they are back, then stop. When they return, bring it back with setup_beat(beat="z").r    )r©   rJ   r8   s   &&&r"   Ú
_timed_outrý   d  s!   € à�4�&ð ;à;?¸&ÀðEð Fr$   Nc                ó   € V # r5   r    rŽ   s   &r"   r�   r�   l  s   € Átr$   c               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# )r   Úkeyr   r©   rª   rJ   r   r8   r   rv   rw   r   r    )r!   s   "r"   r#   r#   k  s9   € ÷ *ñ *�#ð *Ð0ð *¸ð *Àjð *Ø7ð*ØPSñ*r$   c                óò  a€ V '       g   R# V R	9   d8   V R8X  d   \         M\        ! YT;'       g    \        V4      ;'       g    R4      # V P                  R4      '       dU   V P	                  R4      o\        V3R lVR,          P                  R4      ;'       g    R
 4       R4      p\        SW$V4      # V P                  R4      '       d   \        WP	                  R4      4      # \        V ,          ! W4      # )zÅThe text for a reminder key; ``beat`` names the card a ``wrote`` / ``timed_out`` result is about;
``resolve_skill`` names a first task's skill as this install loads it, None dropping a missing one.r&   ÚwroterD   Úbuild_c              3  óT   <"  € T F  qR ,          S8X  g   K  VR,          x € K  	  R# 5i)r®   ru   Nr    )r`   Úort   s   & €r"   rb   Úreminder.<locals>.<genexpr>u  s'   øé € ÐjÑ*T QÐZ^ÕX_ÐciÑXi”j�a˜—j’jÓ*Tùs   ƒ(—(r¬   Úbuild_optionsÚalready_)r  Ú	timed_outr    )
rú   rý   rÑ   Ú
startswithÚremoveprefixÚnextr<   r    rõ   Ú
_REMINDERS)r   r©   rJ   r8   rv   ru   rt   s   &&&&& @r"   Úreminderr  k  sÔ   ø€ ÷ ÙØ
Ð$Ô$Ø œ.•¬jÐ8¸&È×IqÐIqÔQ^Ð_eÓQf×IqÐIqÐjqÓrÐrØ
‡~�~�h×ÒØ×!Ñ! (Ó+ˆÜÔj¨&°­/×*=Ñ*=¸oÓ*N×*TÐ*TÐRTÐ*TÓjÐlnÓoˆÜ˜f e¸EÓBÐBØ
‡~�~�j×!Ò!Ü˜× 0Ñ 0°Ó <Ó=Ð=Ü�cŽ?˜6Ó)Ð)r$   c               ó    € V ^8„  d   QhRRRR/# r¨   r    )r!   s   "r"   r#   r#   |  s   € ÷ Bñ BÐ'ð B¨Cñ Br$   c                óR   € \        V 4      ;pf   R# RV R\        V,           RV R2# )zåThe note on a user turn while no card waits: which card is closed, how their message applies it
when it answers it, and how to bring it back. Empty once every card is settled: the build is under
way and nothing is left to reopen.r&   z([System note: Onboarding continues; the zA card is closed. If their message answers it, apply it yourself (zp) and move on. Otherwise answer their message first, then bring the card back in one line with setup_beat(beat="z").])rÑ   rø   rô   s   & r"   Ú	turn_noter  |  sF   € ô ˜fÓ%Ð%ˆÒ.ÙØ6°t°fð =Ü& tÕ,Ð-ð .6Ø6:°V¸4ðAð Br$   c               ó    € V ^8„  d   QhRRRR/# r¨   r    )r!   s   "r"   r#   r#   ‡  s   € ÷ ñ Ð-ð °#ñ r$   c                ó   € \        V 4      # r5   rÔ   rÐ   s   &r"   Úfinish_reminderr  ‡  s   € Ü�‹=Ðr$   >   ÚhkÚmoÚtwÚhant))zagent experiencezGnew to AI apps / chat apps only / has used local agents / builds agents)ztechnical depthz$non-developer / tinkerer / developer)zcreative workznone / hobby / regular)Úgamingznone / casual / enthusiast)zlocal computezScloud only / small local models / strong local (Spark, large GPU or unified memory))zwork contextzpersonal / work / mixed)zmachine rolez/daily driver / dedicated AI box / remote server)z]Real data only: this computer, their connected apps, the live web. Never mock or invent data.z—First reply: one line, then a tool call. At most two checks and one question before you start. Something visible within a minute, finished within five.zESave every file in ~/hermes-first-task/ and say where. No test files.zNInstall or connect anything once, with exact ids. Never search the whole disk.zAWrite the words they read with humanizer: short, plain, specific.)ÚhermesÚexplainÚbriefÚweekÚyoutubeÚsiteÚrepoÚown)r  r  )FÚ__doc__Ú
__future__r   Úcollections.abcr   r   Útypingr   Úagent.onboarding_first_tasksr   r   r   r	   r
   r   r   Úagent.onboarding_flowr   r   Útools.set_theme_toolr   Ú
CHAT_TITLEÚGREETINGr0   r;   r.   r2   r6   r>   r=   rg   rh   rf   rU   rZ   rj   rÞ   r,   rø   rœ   r“   rm   ro   Ú_NPMr—   r–   r•   r”   r˜   r™   rš   r›   rƒ   rŒ   r    r¦   r³   r¶   r»   rÂ   rÆ   rÌ   rÑ   r  rõ   rú   rý   r  r  r  r    r$   r"   Ú<module>r,     s  ðñõ #ç -Ý ÷÷ ñ ÷ 3Ý 0à€
Ø]€ð 	ˆ(ØÐ
yØÐ
bØÐ
\ØÐ
oØð  dØð  ^ØÐ
jØÐoð
€
ð 	Ð
%ØÐ
$ØÐ
)ØÐ
*ØÐ
9ØÐ
2ØÐ
$ØÐ)ð	€ò 2Ð õ6õ+õð Ð%ØÐØˆoØÐ2ØÐ#Ø
Ð'ØÐ/ð€	ð Z€
Øe€
ðÐ ð ÐYØÐcØÐ'ð€õõ?ðH%ð ð Ð;ØˆZ×ÑÐ 3Ð5JÓKØÐsØÐrØÐlØ
ÐsØð Eð	€ð=€ð€ð p€õLð '€àeðFðà:¸4¸&ð Að ð
,ð	€ð W€ð,ð ð %Ð ð ð oàð ,ð ð oð€	ð&€àa€Øm€õsõFñ \mØ "÷[õ"3õ%õHõiõ
(õMõfõJð
 ÑpØñ gà�MØÑWØÐ)Ø�^ØÑ`ØÑ(Ø‘%˜“.Ø‘�v“ØÑbØÑjØñ gàñ ]ð!€
õ*.õõFð TXÙ:K÷*õ"B÷r$   