@roackb2/heddle 0.0.24 → 0.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +11 -1
  2. package/dist/examples/repo-investigator.js +2 -2
  3. package/dist/examples/repo-investigator.js.map +1 -1
  4. package/dist/src/cli/chat/App.d.ts.map +1 -1
  5. package/dist/src/cli/chat/App.js +51 -324
  6. package/dist/src/cli/chat/App.js.map +1 -1
  7. package/dist/src/cli/chat/hooks/useChatDrift.d.ts +22 -0
  8. package/dist/src/cli/chat/hooks/useChatDrift.d.ts.map +1 -0
  9. package/dist/src/cli/chat/hooks/useChatDrift.js +43 -0
  10. package/dist/src/cli/chat/hooks/useChatDrift.js.map +1 -0
  11. package/dist/src/cli/chat/hooks/useChatPickers.d.ts +44 -0
  12. package/dist/src/cli/chat/hooks/useChatPickers.d.ts.map +1 -0
  13. package/dist/src/cli/chat/hooks/useChatPickers.js +142 -0
  14. package/dist/src/cli/chat/hooks/useChatPickers.js.map +1 -0
  15. package/dist/src/cli/chat/hooks/useLocalIds.d.ts +2 -0
  16. package/dist/src/cli/chat/hooks/useLocalIds.d.ts.map +1 -0
  17. package/dist/src/cli/chat/hooks/useLocalIds.js +6 -0
  18. package/dist/src/cli/chat/hooks/useLocalIds.js.map +1 -0
  19. package/dist/src/cli/chat/hooks/usePromptDraft.d.ts +9 -0
  20. package/dist/src/cli/chat/hooks/usePromptDraft.d.ts.map +1 -0
  21. package/dist/src/cli/chat/hooks/usePromptDraft.js +22 -0
  22. package/dist/src/cli/chat/hooks/usePromptDraft.js.map +1 -0
  23. package/dist/src/cli/chat/hooks/usePromptSubmission.d.ts +58 -0
  24. package/dist/src/cli/chat/hooks/usePromptSubmission.d.ts.map +1 -0
  25. package/dist/src/cli/chat/hooks/usePromptSubmission.js +144 -0
  26. package/dist/src/cli/chat/hooks/usePromptSubmission.js.map +1 -0
  27. package/dist/src/cli/chat/state/local-commands.js +1 -1
  28. package/dist/src/cli/chat/state/local-commands.js.map +1 -1
  29. package/dist/src/cli/chat/utils/format.d.ts +5 -5
  30. package/dist/src/cli/chat/utils/format.d.ts.map +1 -1
  31. package/dist/src/cli/chat/utils/format.js +5 -2
  32. package/dist/src/cli/chat/utils/format.js.map +1 -1
  33. package/dist/src/cli/heartbeat/args.d.ts +11 -0
  34. package/dist/src/cli/heartbeat/args.d.ts.map +1 -0
  35. package/dist/src/cli/heartbeat/args.js +147 -0
  36. package/dist/src/cli/heartbeat/args.js.map +1 -0
  37. package/dist/src/cli/heartbeat/duration.d.ts +3 -0
  38. package/dist/src/cli/heartbeat/duration.d.ts.map +1 -0
  39. package/dist/src/cli/heartbeat/duration.js +33 -0
  40. package/dist/src/cli/heartbeat/duration.js.map +1 -0
  41. package/dist/src/cli/heartbeat/output.d.ts +5 -0
  42. package/dist/src/cli/heartbeat/output.d.ts.map +1 -0
  43. package/dist/src/cli/heartbeat/output.js +89 -0
  44. package/dist/src/cli/heartbeat/output.js.map +1 -0
  45. package/dist/src/cli/heartbeat/run-commands.d.ts +4 -0
  46. package/dist/src/cli/heartbeat/run-commands.d.ts.map +1 -0
  47. package/dist/src/cli/heartbeat/run-commands.js +58 -0
  48. package/dist/src/cli/heartbeat/run-commands.js.map +1 -0
  49. package/dist/src/cli/heartbeat/store.d.ts +3 -0
  50. package/dist/src/cli/heartbeat/store.d.ts.map +1 -0
  51. package/dist/src/cli/heartbeat/store.js +10 -0
  52. package/dist/src/cli/heartbeat/store.js.map +1 -0
  53. package/dist/src/cli/heartbeat/summary.d.ts +3 -0
  54. package/dist/src/cli/heartbeat/summary.d.ts.map +1 -0
  55. package/dist/src/cli/heartbeat/summary.js +9 -0
  56. package/dist/src/cli/heartbeat/summary.js.map +1 -0
  57. package/dist/src/cli/heartbeat/task-commands.d.ts +4 -0
  58. package/dist/src/cli/heartbeat/task-commands.d.ts.map +1 -0
  59. package/dist/src/cli/heartbeat/task-commands.js +117 -0
  60. package/dist/src/cli/heartbeat/task-commands.js.map +1 -0
  61. package/dist/src/cli/heartbeat/types.d.ts +11 -0
  62. package/dist/src/cli/heartbeat/types.d.ts.map +1 -0
  63. package/dist/src/cli/heartbeat/types.js +2 -0
  64. package/dist/src/cli/heartbeat/types.js.map +1 -0
  65. package/dist/src/cli/heartbeat/worker.d.ts +5 -0
  66. package/dist/src/cli/heartbeat/worker.d.ts.map +1 -0
  67. package/dist/src/cli/heartbeat/worker.js +92 -0
  68. package/dist/src/cli/heartbeat/worker.js.map +1 -0
  69. package/dist/src/cli/heartbeat.d.ts +4 -18
  70. package/dist/src/cli/heartbeat.d.ts.map +1 -1
  71. package/dist/src/cli/heartbeat.js +9 -525
  72. package/dist/src/cli/heartbeat.js.map +1 -1
  73. package/dist/src/core/chat/conversation-lines.d.ts +4 -0
  74. package/dist/src/core/chat/conversation-lines.d.ts.map +1 -0
  75. package/dist/src/core/chat/conversation-lines.js +48 -0
  76. package/dist/src/core/chat/conversation-lines.js.map +1 -0
  77. package/dist/src/core/chat/failure-messages.d.ts +6 -0
  78. package/dist/src/core/chat/failure-messages.d.ts.map +1 -0
  79. package/dist/src/core/chat/failure-messages.js +24 -0
  80. package/dist/src/core/chat/failure-messages.js.map +1 -0
  81. package/dist/src/core/chat/session-submit.d.ts.map +1 -1
  82. package/dist/src/core/chat/session-submit.js +3 -1
  83. package/dist/src/core/chat/session-submit.js.map +1 -1
  84. package/dist/src/core/chat/storage.js +1 -1
  85. package/dist/src/core/chat/storage.js.map +1 -1
  86. package/dist/src/core/chat/trace-summary.d.ts +4 -0
  87. package/dist/src/core/chat/trace-summary.d.ts.map +1 -0
  88. package/dist/src/core/chat/trace-summary.js +64 -0
  89. package/dist/src/core/chat/trace-summary.js.map +1 -0
  90. package/dist/src/core/runtime/heartbeat-lucid.d.ts +2 -1
  91. package/dist/src/core/runtime/heartbeat-lucid.d.ts.map +1 -1
  92. package/dist/src/core/runtime/heartbeat-lucid.js.map +1 -1
  93. package/dist/src/core/runtime/heartbeat-scheduler.d.ts +3 -58
  94. package/dist/src/core/runtime/heartbeat-scheduler.d.ts.map +1 -1
  95. package/dist/src/core/runtime/heartbeat-scheduler.js +6 -177
  96. package/dist/src/core/runtime/heartbeat-scheduler.js.map +1 -1
  97. package/dist/src/core/runtime/heartbeat-task-state.d.ts +5 -0
  98. package/dist/src/core/runtime/heartbeat-task-state.d.ts.map +1 -0
  99. package/dist/src/core/runtime/heartbeat-task-state.js +81 -0
  100. package/dist/src/core/runtime/heartbeat-task-state.js.map +1 -0
  101. package/dist/src/core/runtime/heartbeat-task-store.d.ts +63 -0
  102. package/dist/src/core/runtime/heartbeat-task-store.d.ts.map +1 -0
  103. package/dist/src/core/runtime/heartbeat-task-store.js +95 -0
  104. package/dist/src/core/runtime/heartbeat-task-store.js.map +1 -0
  105. package/dist/src/core/runtime/heartbeat-views.d.ts +1 -1
  106. package/dist/src/core/runtime/heartbeat-views.d.ts.map +1 -1
  107. package/dist/src/core/utils/text.d.ts +2 -0
  108. package/dist/src/core/utils/text.d.ts.map +1 -0
  109. package/dist/src/core/utils/text.js +7 -0
  110. package/dist/src/core/utils/text.js.map +1 -0
  111. package/dist/src/index.d.ts +4 -2
  112. package/dist/src/index.d.ts.map +1 -1
  113. package/dist/src/index.js +2 -1
  114. package/dist/src/index.js.map +1 -1
  115. package/dist/src/server/features/control-plane/router.d.ts +7 -0
  116. package/dist/src/server/features/control-plane/router.d.ts.map +1 -1
  117. package/dist/src/server/features/control-plane/router.js +7 -0
  118. package/dist/src/server/features/control-plane/router.js.map +1 -1
  119. package/dist/src/server/features/control-plane/services/layout-snapshots.d.ts +6 -0
  120. package/dist/src/server/features/control-plane/services/layout-snapshots.d.ts.map +1 -0
  121. package/dist/src/server/features/control-plane/services/layout-snapshots.js +68 -0
  122. package/dist/src/server/features/control-plane/services/layout-snapshots.js.map +1 -0
  123. package/dist/src/server/router.d.ts +7 -0
  124. package/dist/src/server/router.d.ts.map +1 -1
  125. package/dist/src/web/assets/index-C9ux8zc8.js +12 -0
  126. package/dist/src/web/assets/index-D6c7O-7y.css +2 -0
  127. package/dist/src/web/index.html +2 -2
  128. package/package.json +15 -16
  129. package/dist/examples/conversation.d.ts +0 -2
  130. package/dist/examples/conversation.d.ts.map +0 -1
  131. package/dist/examples/conversation.js +0 -3
  132. package/dist/examples/conversation.js.map +0 -1
  133. package/dist/src/core/chat/format.d.ts +0 -12
  134. package/dist/src/core/chat/format.d.ts.map +0 -1
  135. package/dist/src/core/chat/format.js +0 -139
  136. package/dist/src/core/chat/format.js.map +0 -1
  137. package/dist/src/web/assets/index-B5Df7Ey_.js +0 -12
  138. package/dist/src/web/assets/index-Cu-enbes.css +0 -1
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--font-weight-medium:500;--font-weight-semibold:600;--tracking-normal:0em;--radius-md:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-background:#090c11;--color-foreground:#e4ebf1;--color-card:#0e1420;--color-popover:#0e1420;--color-popover-foreground:#e4ebf1;--color-primary:#72d7f8;--color-primary-foreground:#03131c;--color-secondary:#212936;--color-secondary-foreground:#e4ebf1;--color-muted:#29313d;--color-muted-foreground:#97a3b4;--color-accent:#8adbf0;--color-accent-foreground:#03131c;--color-destructive:#fca1af;--color-destructive-foreground:#21080c;--color-border:#313a49;--color-input:#313a49;--color-ring:#72d7f8}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.relative{position:relative}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-11{top:calc(var(--spacing) * 11)}.right-0{right:calc(var(--spacing) * 0)}.z-50{z-index:50}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing) * 0)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-dvh{height:100dvh}.h-full{height:100%}.max-h-24{max-height:calc(var(--spacing) * 24)}.max-h-\[24dvh\]{max-height:24dvh}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-\[60px\]{min-height:60px}.min-h-full{min-height:100%}.w-9{width:calc(var(--spacing) * 9)}.w-\[76px\]{width:76px}.w-full{width:100%}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-44{min-width:calc(var(--spacing) * 44)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.list-none{list-style-type:none}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-columns:auto minmax(0,1fr) auto}.flex-col{flex-direction:column}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-border{border-color:var(--color-border)}.border-destructive\/20{border-color:#fca1af33}@supports (color:color-mix(in lab, red, red)){.border-destructive\/20{border-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.border-destructive\/40{border-color:#fca1af66}@supports (color:color-mix(in lab, red, red)){.border-destructive\/40{border-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}.border-input{border-color:var(--color-input)}.border-transparent{border-color:#0000}.bg-background{background-color:var(--color-background)}.bg-card{background-color:var(--color-card)}.bg-card\/95{background-color:#0e1420f2}@supports (color:color-mix(in lab, red, red)){.bg-card\/95{background-color:color-mix(in oklab, var(--color-card) 95%, transparent)}}.bg-destructive{background-color:var(--color-destructive)}.bg-destructive\/10{background-color:#fca1af1a}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--color-destructive) 10%, transparent)}}.bg-muted{background-color:var(--color-muted)}.bg-popover{background-color:var(--color-popover)}.bg-primary{background-color:var(--color-primary)}.bg-secondary{background-color:var(--color-secondary)}.bg-transparent{background-color:#0000}.p-1{padding:calc(var(--spacing) * 1)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.pt-\[env\(safe-area-inset-top\)\]{padding-top:env(safe-area-inset-top)}.pb-\[calc\(env\(safe-area-inset-bottom\)\+0\.5rem\)\]{padding-bottom:calc(env(safe-area-inset-bottom) + .5rem)}.text-center{text-align:center}.text-left{text-align:left}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[11px\]{font-size:11px}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-destructive-foreground{color:var(--color-destructive-foreground)}.text-foreground{color:var(--color-foreground)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-popover-foreground{color:var(--color-popover-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.underline-offset-4{text-underline-offset:4px}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.marker\:hidden ::marker{display:none}.marker\:hidden::marker{display:none}.marker\:hidden ::-webkit-details-marker{display:none}.marker\:hidden::-webkit-details-marker{display:none}.placeholder\:text-muted-foreground::placeholder{color:var(--color-muted-foreground)}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-destructive\/80:hover{background-color:#fca1afcc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/80:hover{background-color:color-mix(in oklab, var(--color-destructive) 80%, transparent)}}.hover\:bg-destructive\/90:hover{background-color:#fca1afe6}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--color-destructive) 90%, transparent)}}.hover\:bg-primary\/80:hover{background-color:#72d7f8cc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab, var(--color-primary) 80%, transparent)}}.hover\:bg-primary\/90:hover{background-color:#72d7f8e6}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--color-primary) 90%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:#212936cc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--color-secondary) 80%, transparent)}}.hover\:text-accent-foreground:hover{color:var(--color-accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--color-ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--color-ring)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (width>=48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#0b0f14;--panel:#111827;--panel-alt:#0f172a;--panel-muted:#0b1220;--text:#e5e7eb;--muted:#94a3b8;--line:#94a3b829;--line-strong:#94a3b847;--accent:#7dd3fc;--good:#86efac;--warn:#fcd34d;--bad:#fda4af}*{box-sizing:border-box}html,body,#root{height:100vh}body{background:var(--bg);color:var(--text);margin:0;font:14px/1.5 ui-sans-serif,-apple-system,BlinkMacSystemFont,SF Pro Text,Segoe UI,sans-serif;overflow:hidden}button,textarea{font:inherit;color:inherit}button{cursor:pointer}h1,h2,h3,p{margin-top:0}h1{letter-spacing:-.03em;margin-bottom:8px;font-size:28px;line-height:1.1}h2{letter-spacing:-.02em;margin-bottom:4px;font-size:18px}h3{letter-spacing:-.01em;margin-bottom:10px;font-size:14px}.app-shell{flex-direction:column;gap:14px;height:100vh;padding:16px;display:flex;overflow:hidden}.topbar{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.toolbar{justify-content:space-between;align-items:center;gap:16px;display:flex}.toolbar-tabs{min-width:0}.toolbar-status{flex-direction:row;justify-content:flex-end;align-items:center;gap:12px;min-width:0;display:flex}.toolbar-debug{display:none}.debug-snapshot-menu{position:relative}.debug-button{color:var(--muted);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;background:#94a3b814;border:1px solid #94a3b833;border-radius:8px;padding:6px 8px;font-size:11px;font-weight:700;list-style:none}.debug-button::-webkit-details-marker{display:none}.debug-button:hover{color:var(--text);border-color:#7dd3fc4d}.debug-snapshot-options{z-index:30;border:1px solid var(--line-strong);background:#0b1220fa;border-radius:8px;gap:4px;min-width:180px;padding:6px;display:grid;position:absolute;top:calc(100% + 6px);right:0;box-shadow:0 16px 36px #00000057}.debug-snapshot-options button{width:100%;color:var(--text);text-align:left;background:0 0;border:0;border-radius:6px;padding:8px 9px}.debug-snapshot-options button:hover{background:#7dd3fc1f}.topbar-title-row{justify-content:flex-end;align-items:center;gap:12px;max-width:100%;display:flex}.topbar-eyebrow{color:var(--accent);letter-spacing:.12em;text-transform:uppercase;margin:0;font-size:11px;font-weight:700;line-height:1}.workspace-path-label{max-width:220px;color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:1;overflow:hidden}.topbar-copy,.muted,.button-copy.muted-copy,.list-button span,.kv-key,.event-line{color:var(--muted)}.topbar-copy{max-width:760px;margin:0}.status-badge{border:1px solid var(--line);max-width:min(260px,100%);color:var(--muted);text-overflow:ellipsis;white-space:nowrap;background:#111827eb;border-radius:999px;align-items:center;padding:7px 12px;font-size:12px;line-height:1;display:inline-flex;overflow:hidden}.status-badge.bad{color:var(--bad);border-color:#fda4af4d}.tabs{flex-wrap:wrap;gap:8px;display:flex}.tab-button{border:1px solid var(--line);background:var(--panel);color:var(--muted);border-radius:10px;padding:8px 12px}.tab-button.active,.side-tabs button.active{color:var(--text);background:#7dd3fc1f;border-color:#7dd3fc57}.overview-grid{flex:auto;grid-template-columns:repeat(12,minmax(0,1fr));gap:14px;min-height:0;display:grid;overflow:auto}.panel{border:1px solid var(--line);background:var(--panel);border-radius:16px;grid-column:span 4;min-width:0;padding:18px}.panel.wide{grid-column:span 6}.metric{letter-spacing:-.04em;margin-bottom:6px;font-size:40px;font-weight:800;line-height:1}.workspace-shell{grid-template-columns:minmax(260px, var(--session-sidebar-width,288px)) 6px minmax(560px, 1fr) 6px minmax(320px, var(--session-side-width,344px));border:1px solid var(--line);background:linear-gradient(#111827fa,#0f172af5);border-radius:18px;flex:auto;min-height:0;display:grid;overflow:hidden;box-shadow:0 20px 48px #0000003d}.workspace-sidebar,.workspace-main,.workspace-side{flex-direction:column;min-height:0;display:flex}.workspace-sidebar,.workspace-side{background:var(--panel-muted)}.workspace-sidebar{border-right:0}.workspace-side{border-left:0}.workspace-main{background:var(--panel-alt);grid-template-rows:auto minmax(0,1fr) auto;min-height:0;display:grid;overflow:hidden}.workspace-resizer{cursor:col-resize;touch-action:none;background:#080c1457;border:0;border-left:1px solid #94a3b81f;border-right:1px solid #94a3b81f;border-radius:0;width:6px;min-width:6px}.workspace-resizer:hover,.workspace-resizer:focus-visible{background:#7dd3fc29;border-color:#7dd3fc4d;outline:none}.workspace-header{border-bottom:1px solid #94a3b81f;justify-content:space-between;align-items:flex-start;gap:12px;padding:14px 16px;display:flex}.workspace-header h2{margin-bottom:2px}.workspace-header .muted{font-size:12px;line-height:1.45}.session-controls{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px;display:flex}.select-control{color:var(--muted);align-items:center;gap:6px;font-size:12px;display:flex}.select-control select{border:1px solid var(--line);max-width:190px;color:var(--text);background:#0f172acc;border-radius:8px;padding:5px 8px}.drift-button{color:var(--muted);background:0 0;border:1px solid #94a3b838;border-radius:999px;padding:3px 9px;font-size:12px}.drift-button.active{color:var(--good);border-color:#86efac47}.drift-button:disabled,.select-control select:disabled{opacity:.65;cursor:not-allowed}.sidebar-scroll,.conversation-scroll,.side-scroll,.task-detail-scroll{flex:auto;min-height:0;overflow:auto}.sidebar-scroll,.side-scroll,.task-detail-scroll{padding:12px}.split-scroll{flex-direction:column;gap:16px;display:flex}.stack-list{flex-direction:column;gap:10px;display:flex}.stack-list.compact{gap:8px}.list-button{text-align:left;background:#0f172a8a;border:1px solid #94a3b814;border-radius:12px;width:100%;padding:11px;transition:border-color .12s,background .12s,transform .12s}.list-button:hover{background:#1e293bc7;border-color:#7dd3fc2e}.list-button.active{background:linear-gradient(#7dd3fc1f,#7dd3fc0f);border-color:#7dd3fc57;box-shadow:inset 0 0 0 1px #7dd3fc14}.list-button-header{justify-content:space-between;gap:8px;margin-bottom:6px;display:flex}.list-button-header strong{font-size:13px}.compact-button{padding:10px}.button-copy{color:var(--text);white-space:pre-wrap;overflow-wrap:anywhere;margin:6px 0 0;font-size:13px}.pills{flex-wrap:wrap;gap:6px;margin:8px 0;display:flex}.compact-pills{margin:0}.pill{color:var(--muted);border:1px solid #94a3b838;border-radius:999px;align-items:center;padding:2px 8px;font-size:12px;display:inline-flex}.pill.good{color:var(--good);border-color:#86efac47}.pill.warn{color:var(--warn);border-color:#fcd34d47}.pill.bad{color:var(--bad);border-color:#fda4af47}.conversation-scroll{flex-direction:column;min-height:0;padding:14px 18px 28px;display:flex;overflow:auto}.conversation-stack{flex-direction:column;gap:16px;min-height:100%;display:flex}.conversation-spacer{flex:1 0 32px}.message{overflow-wrap:anywhere;background:#111827e0;border:1px solid #94a3b81f;border-radius:14px;min-width:0;max-width:min(760px,84%);padding:12px 13px;box-shadow:0 8px 18px #00000029}.message.user{background:linear-gradient(#38bdf829,#38bdf81a);border-color:#7dd3fc3d;align-self:flex-end}.message.assistant{align-self:flex-start}.message.tool-result{background:#0f172ab8;border-color:#94a3b82e;max-width:min(820px,88%)}.message.working{border-color:#fcd34d47;box-shadow:inset 0 0 0 1px #fcd34d14}.message-header{color:var(--muted);justify-content:space-between;align-items:center;gap:8px;margin-bottom:8px;font-size:12px;display:flex}.message-body,.summary,.kv-value{white-space:pre-wrap;overflow-wrap:anywhere}.markdown-body{white-space:normal;line-height:1.65}.markdown-body>:last-child{margin-bottom:0}.markdown-body p,.markdown-body ul,.markdown-body ol,.markdown-body pre,.markdown-body blockquote,.markdown-body table{margin:0 0 12px}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4{margin:0 0 10px;line-height:1.25}.markdown-body ul,.markdown-body ol{padding-left:20px}.markdown-body li+li{margin-top:4px}.markdown-body blockquote{color:var(--muted);border-left:3px solid #7dd3fc47;padding-left:12px}.markdown-body table{border-collapse:collapse;width:100%;font-size:13px}.markdown-body th,.markdown-body td{border:1px solid var(--line);text-align:left;vertical-align:top;padding:8px 10px}.markdown-body th{background:#94a3b814}.tool-result-body{flex-direction:column;gap:8px;display:flex}.tool-result-meta{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.tool-command{color:var(--muted);overflow-wrap:anywhere;font:12px/1.45 ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace}.tool-error{color:var(--bad);margin:0}.tool-output{color:#dbe4f3;white-space:pre-wrap;background:#070b10d1;border:1px solid #94a3b81a;border-radius:8px;max-height:280px;margin:0;padding:10px;font:12px/1.5 ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;overflow:auto}.inline-code{background:#94a3b81f;border-radius:6px;padding:1px 5px;font:12px/1.45 ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace}.composer-shell{background:#080c1457;border-top:1px solid #94a3b81f;padding:14px 16px 16px;position:relative}.composer-shell textarea{resize:none;background:#0b1220e6;border:1px solid #94a3b824;border-radius:12px;width:100%;min-height:96px;padding:12px 13px;transition:border-color .12s,box-shadow .12s}.composer-shell textarea:focus{border-color:#7dd3fc57;outline:none;box-shadow:0 0 0 3px #7dd3fc14}.composer-shell textarea::placeholder{color:var(--muted)}.mention-menu{z-index:12;border:1px solid var(--line-strong);background:#0b1220fa;border-radius:8px;max-height:260px;padding:8px;position:absolute;bottom:calc(100% - 8px);left:16px;right:16px;overflow:auto;box-shadow:0 16px 36px #00000057}.mention-menu-header{color:var(--muted);justify-content:space-between;gap:12px;padding:4px 6px 8px;font-size:12px;display:flex}.mention-option{width:100%;color:var(--text);text-align:left;background:0 0;border:1px solid #0000;border-radius:8px;padding:8px 9px}.mention-option.active,.mention-option:hover{background:#7dd3fc1f;border-color:#7dd3fc47}.mention-option span{overflow-wrap:anywhere;font:12px/1.45 ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace}.mention-empty{color:var(--muted);margin:0;padding:10px 8px}.composer-footer{justify-content:space-between;align-items:flex-end;gap:12px;margin-top:8px;display:flex}.composer-status{flex-flow:wrap;flex:auto;align-items:center;gap:6px;min-width:0;display:flex}.composer-status p{max-width:560px;margin:0;font-size:12px;line-height:1.35}.composer-actions{flex-shrink:0;justify-content:flex-end}.primary-button{color:#03131c;background:linear-gradient(#8ee3ff,#67c7ef);border:0;border-radius:10px;padding:9px 14px;font-weight:700;box-shadow:0 8px 18px #67c7ef33}.sidebar-action-button{color:var(--text);white-space:nowrap;background:#7dd3fc1a;border:1px solid #7dd3fc38;border-radius:10px;padding:7px 11px;font-size:12px;font-weight:600;transition:border-color .12s,background .12s,transform .12s}.sidebar-action-button:hover{background:#7dd3fc29;border-color:#7dd3fc57}.sidebar-action-button:disabled{opacity:.65;cursor:not-allowed}.primary-button:disabled,.composer-shell textarea:disabled{opacity:.6;cursor:not-allowed}.side-tabs{border-bottom:1px solid var(--line);gap:8px;padding:14px;display:flex}.side-tabs button{border:1px solid var(--line);color:var(--muted);background:0 0;border-radius:10px;padding:8px 12px}.side-section{flex-direction:column;gap:10px;display:flex}.detail-stack{flex-direction:column;gap:14px;display:flex}.compact-stack{gap:10px}.detail-card,.empty-state{background:#0f172a8f;border:1px solid #94a3b81a;border-radius:12px;padding:12px}.error-card{border-color:#fda4af3d}.approval-card{flex-direction:column;gap:8px;max-height:min(520px,58vh);display:flex;overflow:hidden}.approval-card .muted{overflow-wrap:anywhere}.approval-card .code-block{overscroll-behavior:contain;-webkit-overflow-scrolling:touch;border-radius:8px;flex:auto;min-height:84px;max-height:min(360px,36vh);overflow:auto}.approval-actions{flex:none;margin-bottom:0}.card-title,.section-label{margin-bottom:6px;font-size:13px;font-weight:700}.kv-list{gap:8px;display:grid}.kv-list>div{gap:2px;display:grid}.kv-key{text-transform:uppercase;letter-spacing:.08em;font-size:11px}.path{word-break:break-all}.event-list{flex-direction:column;gap:8px;display:flex}.event-line{border-left:2px solid #94a3b83d;margin:0;padding-left:10px;font-size:13px}.code-block{color:#dbe4f3;white-space:pre-wrap;background:#070b10;border-radius:12px;margin:0;padding:12px;font:12px/1.45 ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;overflow:auto}.empty-state{flex-direction:column;gap:6px;display:flex}.sidebar-empty-state{padding-top:8px}.toast-viewport{z-index:20;pointer-events:none;flex-direction:column;gap:10px;width:min(380px,100vw - 36px);display:flex;position:fixed;bottom:18px;right:18px}.toast{border:1px solid var(--line-strong);pointer-events:auto;background:#0f172af5;border-radius:8px;justify-content:space-between;align-items:flex-start;gap:12px;padding:12px;display:flex;box-shadow:0 16px 36px #00000052}.toast.success{border-color:#86efac5c}.toast.error{border-color:#fda4af61}.toast-title{margin:0;font-weight:700}.toast-body{color:var(--muted);overflow-wrap:anywhere;margin:4px 0 0;font-size:13px}.toast-dismiss{border:1px solid var(--line);width:26px;height:26px;color:var(--muted);background:#0b1220b8;border-radius:8px;flex:none}@media (width<=1180px){.workspace-shell{grid-template-columns:minmax(232px, var(--session-sidebar-width,252px)) 6px minmax(420px, 1fr) 6px minmax(280px, var(--session-side-width,312px))}}@media (width<=980px){html,body,#root{height:100dvh;min-height:100dvh}body{overflow:hidden}.app-shell{gap:10px;height:100dvh;min-height:100dvh;padding:10px;overflow:hidden}.topbar{flex-direction:column}.toolbar{flex-direction:row;align-items:center;gap:8px}.toolbar-status{flex:auto;justify-content:flex-end;gap:8px;width:auto}.toolbar-tabs{flex:none}.toolbar-debug{margin-left:auto;display:block}.tab-button{padding:7px 10px}.topbar-title-row{gap:8px}.workspace-path-label{max-width:150px}.status-badge{max-width:180px;padding:6px 10px}.composer-footer{flex-direction:column;align-items:stretch}.composer-actions{justify-content:flex-start}.overview-grid{grid-template-columns:1fr}.panel,.panel.wide{grid-column:auto}}.mobile-nav-button,.mobile-side-header,.mobile-task-shell,.mobile-task-screen,.mobile-task-header,.mobile-task-segmented,.mobile-task-meta{display:none}@media (width<=760px){.workspace-shell{display:none}.mobile-session-screen,.mobile-task-screen{flex:auto;height:100%;min-height:0;display:flex;overflow:hidden}.mobile-pane{border:1px solid var(--line);border-radius:12px;width:100%;min-height:0;overflow:hidden}.mobile-session-list .mobile-pane,.mobile-session-review .mobile-pane,.mobile-task-screen .mobile-pane{background:var(--panel-muted);flex-direction:column;display:flex}.mobile-session-chat,.mobile-task-screen{min-height:0}.mobile-chat-pane{background:var(--panel-alt);flex-direction:column;min-height:0;display:flex}.workspace-resizer{display:none}.mobile-nav-button{color:var(--text);background:#7dd3fc14;border:1px solid #7dd3fc38;border-radius:10px;align-items:center;padding:7px 10px;font-size:12px;font-weight:600;display:inline-flex}.mobile-side-header,.mobile-task-header{background:var(--panel-muted);padding:12px 12px 0;display:block}.workspace-header,.mobile-task-segmented,.mobile-task-meta{padding:12px}.workspace-sidebar .workspace-header .muted{display:none}.workspace-header h2{font-size:17px}.workspace-header>div{min-width:0}.workspace-header .muted{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.session-controls{justify-content:flex-start;width:100%}.select-control{flex:180px}.select-control select{width:100%;max-width:none}.conversation-scroll{overscroll-behavior:contain;-webkit-overflow-scrolling:touch;flex:auto;min-height:0;padding:12px 12px 20px;overflow:auto}.conversation-stack{gap:12px}.conversation-spacer{flex-basis:10px}.message,.message.tool-result{border-radius:10px;max-width:100%}.composer-shell{z-index:1;overscroll-behavior:contain;max-height:58dvh;padding:10px 12px env(safe-area-inset-bottom,0px);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);-webkit-overflow-scrolling:touch;background:#080c14f5;flex-direction:column;flex:none;display:flex;position:relative;overflow:auto}.approval-card{flex:0 auto;max-height:min(330px,38dvh)}.approval-card .code-block{max-height:min(190px,22dvh)}.composer-shell textarea{border-radius:8px;flex:none;min-height:78px}.composer-actions{justify-content:flex-end;width:100%}.composer-actions .primary-button{margin-left:auto}}@media (width<=620px){.toolbar{align-items:flex-start}.workspace-header{flex-direction:column;align-items:stretch}.toolbar-status{flex-wrap:wrap}.topbar-eyebrow{font-size:10px}.workspace-path-label{max-width:120px}.status-badge{max-width:150px}}.mobile-task-segmented{border-bottom:1px solid var(--line);background:var(--panel-muted);gap:8px;display:flex}.mobile-task-segmented button{border:1px solid var(--line);color:var(--muted);background:0 0;border-radius:10px;flex:1 1 0;padding:8px 12px}.mobile-task-segmented button.active{color:var(--text);background:#7dd3fc1f;border-color:#7dd3fc57}.mobile-task-meta{border-bottom:1px solid var(--line);background:var(--panel-muted);flex-direction:column;gap:8px;display:flex}@media (width<=500px){.toolbar{flex-wrap:wrap}.toolbar-tabs,.toolbar-status,.topbar-title-row,.topbar-eyebrow,.workspace-path-label,.status-badge,.workspace-header .muted,.composer-status,.pills.compact-pills,.mobile-inspector-button,.select-control,.drift-button,.session-controls .pill{display:none}.toolbar-debug{margin-left:auto;display:block}.workspace-main{height:auto;min-height:0}.workspace-header{gap:8px}.workspace-header,.side-tabs,.sidebar-scroll,.side-scroll,.task-detail-scroll,.mobile-task-segmented,.mobile-task-meta{padding:10px}.workspace-header h2{font-size:15px;line-height:1.2}.session-controls{gap:6px}.conversation-scroll{padding:8px 10px 12px}.message,.message.tool-result{max-width:100%;padding:10px 11px}.message.user{max-width:92%}.message-header{margin-bottom:6px}.composer-shell{max-height:62dvh;padding:8px 10px env(safe-area-inset-bottom,0px)}.approval-card{max-height:min(300px,40dvh)}.approval-card .code-block{max-height:min(170px,23dvh)}.composer-footer{gap:8px;margin-top:8px}.composer-actions{justify-content:space-between}.composer-actions .tab-button:not(:last-child){display:none}.composer-actions .primary-button{width:100%;margin-left:0}}
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" type="image/jpeg" href="/assets/favicon-CT3fFV8g.jpeg" />
7
7
  <title>Heddle Control Plane</title>
8
- <script type="module" crossorigin src="/assets/index-B5Df7Ey_.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-Cu-enbes.css">
8
+ <script type="module" crossorigin src="/assets/index-C9ux8zc8.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-D6c7O-7y.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roackb2/heddle",
3
- "version": "0.0.24",
3
+ "version": "0.0.25",
4
4
  "description": "An open-source terminal coding agent runtime and CLI for real repositories, with sessions, approvals, memory, heartbeat, and a browser control plane",
5
5
  "author": "Jay / Fienna Liang <roackb2@gmail.com>",
6
6
  "license": "MIT",
@@ -36,27 +36,20 @@
36
36
  "typecheck": "tsc -p tsconfig.build.json --noEmit",
37
37
  "eslint": "eslint .",
38
38
  "release:context": "node scripts/release-context.mjs",
39
- "build": "yarn clean && tsc -p tsconfig.build.json && yarn control-plane:build",
40
- "web:build": "tsc -p src/web/tsconfig.json --noEmit && vite build --config src/web/vite.config.ts",
41
- "web:dev": "vite --config src/web/vite.config.ts",
39
+ "build": "yarn clean && tsc -p tsconfig.build.json && yarn client:build",
40
+ "client:build": "tsc -p src/web/tsconfig.json --noEmit && vite build --config src/web/vite.config.ts",
41
+ "client:dev": "vite --config src/web/vite.config.ts",
42
42
  "server:dev": "tsx --no-cache src/server/dev.ts",
43
- "client:dev": "yarn web:dev",
44
- "control-plane:build": "yarn web:build",
45
- "control-plane:dev": "yarn web:dev",
46
- "dev": "tsx --no-cache examples/repo-investigator.ts",
43
+ "cli:dev": "tsx --no-cache src/cli/main.ts",
44
+ "chat:dev": "tsx --no-cache src/cli/main.ts chat",
45
+ "chat:dev:openai": "OPENAI_API_KEY=\"$PERSONAL_OPENAI_API_KEY\" tsx --no-cache src/cli/main.ts chat",
46
+ "chat:dev:anthropic": "ANTHROPIC_API_KEY=\"$PERSONAL_ANTHROPIC_API_KEY\" tsx --no-cache src/cli/main.ts chat",
47
+ "example:repo-investigator": "tsx --no-cache examples/repo-investigator.ts",
47
48
  "example:programmatic": "tsx --no-cache examples/programmatic-loop.ts",
48
49
  "example:heartbeat": "tsx --no-cache examples/heartbeat.ts",
49
50
  "example:heartbeat-scheduler": "tsx --no-cache examples/heartbeat-scheduler.ts",
50
51
  "example:host-events": "tsx --no-cache examples/host-events.ts",
51
52
  "example:cyberloop-observer": "tsx --no-cache examples/cyberloop-observer.ts",
52
- "cli:dev": "tsx --no-cache src/cli/main.ts",
53
- "chat": "tsx --no-cache examples/conversation.tsx",
54
- "chat:light": "OPENAI_MODEL=gpt-5.1-codex-mini tsx --no-cache examples/conversation.tsx",
55
- "repo-investigator:dev": "OPENAI_API_KEY=\"$PERSONAL_OPENAI_API_KEY\" tsx --no-cache examples/repo-investigator.ts",
56
- "chat:dev": "tsx --no-cache examples/conversation.tsx",
57
- "chat:dev:openai": "OPENAI_API_KEY=\"$PERSONAL_OPENAI_API_KEY\" tsx --no-cache examples/conversation.tsx",
58
- "chat:dev:openai:light": "OPENAI_API_KEY=\"$PERSONAL_OPENAI_API_KEY\" OPENAI_MODEL=gpt-5.1-codex-mini tsx --no-cache examples/conversation.tsx",
59
- "chat:dev:anthropic": "ANTHROPIC_API_KEY=\"$PERSONAL_ANTHROPIC_API_KEY\" tsx --no-cache examples/conversation.tsx",
60
53
  "test": "vitest run src/__tests__",
61
54
  "prepare": "yarn build"
62
55
  },
@@ -107,8 +100,12 @@
107
100
  "dependencies": {
108
101
  "@anthropic-ai/sdk": "^0.54.0",
109
102
  "@inkjs/ui": "^2.0.0",
103
+ "@radix-ui/react-slot": "^1.2.4",
104
+ "@tailwindcss/vite": "^4.2.2",
110
105
  "@trpc/client": "^11.16.0",
111
106
  "@trpc/server": "^11.16.0",
107
+ "class-variance-authority": "^0.7.1",
108
+ "clsx": "^2.1.1",
112
109
  "commander": "^14.0.1",
113
110
  "express": "^5.2.1",
114
111
  "ink": "^6.8.0",
@@ -116,6 +113,8 @@
116
113
  "pino": "^10.3.1",
117
114
  "pino-pretty": "^13.1.3",
118
115
  "react": "19.2.5",
116
+ "tailwind-merge": "^3.5.0",
117
+ "tailwindcss": "^4.2.2",
119
118
  "zod": "^4.3.6"
120
119
  },
121
120
  "devDependencies": {
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=conversation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../examples/conversation.tsx"],"names":[],"mappings":""}
@@ -1,3 +0,0 @@
1
- import { startChatCli } from '../src/cli/chat/index.js';
2
- startChatCli();
3
- //# sourceMappingURL=conversation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../examples/conversation.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,YAAY,EAAE,CAAC"}
@@ -1,12 +0,0 @@
1
- import type { ChatMessage, TraceEvent } from '../../index.js';
2
- import type { ConversationLine } from './types.js';
3
- export type ChatFailureHintOptions = {
4
- model: string;
5
- estimatedHistoryTokens?: number;
6
- };
7
- export declare function buildConversationMessages(history: ChatMessage[]): ConversationLine[];
8
- export declare function summarizeTrace(trace: TraceEvent[]): string[];
9
- export declare function countAssistantSteps(trace: TraceEvent[]): number;
10
- export declare function formatChatFailureMessage(message: string, options: ChatFailureHintOptions): string;
11
- export declare function truncate(value: string, maxLength: number): string;
12
- //# sourceMappingURL=format.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../../src/core/chat/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,gBAAgB,EAAE,CA6BpF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAgC5D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAE/D;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAcjG;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAMjE"}
@@ -1,139 +0,0 @@
1
- import { isCompactedHistorySummary } from './compaction.js';
2
- const MAX_TOOL_CALL_SUMMARY_CHARS = 96;
3
- export function buildConversationMessages(history) {
4
- return history.flatMap((message, index) => {
5
- if (isCompactedHistorySummary(message)) {
6
- return [{
7
- id: `compacted-${index}`,
8
- role: 'assistant',
9
- text: 'Earlier conversation history was compacted to preserve context for longer chats.',
10
- }];
11
- }
12
- if (message.role === 'user' || message.role === 'assistant') {
13
- if (!message.content.trim()) {
14
- return [];
15
- }
16
- return [{ id: `${message.role}-${index}-${message.content}`, role: message.role, text: message.content }];
17
- }
18
- if (message.role === 'tool') {
19
- const rendered = renderToolHistoryMessage(message, history, index);
20
- if (!rendered) {
21
- return [];
22
- }
23
- return [{ id: `tool-${index}-${rendered}`, role: 'assistant', text: rendered }];
24
- }
25
- return [];
26
- });
27
- }
28
- export function summarizeTrace(trace) {
29
- return trace.flatMap((event) => {
30
- switch (event.type) {
31
- case 'assistant.turn':
32
- return [
33
- ...(event.diagnostics?.rationale ? [`reasoning: ${truncate(event.diagnostics.rationale, 140)}`] : []),
34
- event.requestedTools ?
35
- `assistant requested ${event.toolCalls?.map((call) => summarizeToolCall(call.tool, call.input)).join(', ')}`
36
- : 'assistant answered',
37
- ];
38
- case 'tool.approval_requested':
39
- return [`approval requested for ${summarizeToolCall(event.call.tool, event.call.input)}`];
40
- case 'tool.approval_resolved':
41
- return [
42
- `approval ${event.approved ? 'granted' : 'denied'} for ${summarizeToolCall(event.call.tool, event.call.input)}${event.reason ? ` (${truncate(event.reason, 80)})` : ''}`,
43
- ];
44
- case 'tool.fallback':
45
- return [
46
- `fallback ${summarizeToolCall(event.fromCall.tool, event.fromCall.input)} -> ${summarizeToolCall(event.toCall.tool, event.toCall.input)} (${event.reason})`,
47
- ];
48
- case 'tool.call':
49
- return [`tool call ${summarizeToolCall(event.call.tool, event.call.input)}`];
50
- case 'tool.result':
51
- return [
52
- `tool result ${event.tool}: ${event.result.ok ? 'ok' : event.result.error ?? 'error'}`,
53
- ];
54
- case 'run.finished':
55
- return [`run finished: ${event.outcome}`];
56
- default:
57
- return [];
58
- }
59
- });
60
- }
61
- export function countAssistantSteps(trace) {
62
- return trace.filter((event) => event.type === 'assistant.turn').length;
63
- }
64
- export function formatChatFailureMessage(message, options) {
65
- if (looksLikeAnthropicInputRateLimit(message)) {
66
- const sizeHint = typeof options.estimatedHistoryTokens === 'number' ?
67
- ` Current session history is estimated at about ${options.estimatedHistoryTokens.toLocaleString()} tokens before the next request.`
68
- : '';
69
- return `${message}\n\nThis likely failed because the current prompt plus session history are too large for ${options.model}'s input-token-per-minute limit.${sizeHint} Try /compact, /clear, or /session new, then retry.`;
70
- }
71
- if (looksLikeOpenAiQuotaError(message)) {
72
- return `${message}\n\nThis looks like an OpenAI quota or billing limit for the active key, not a transient prompt-size issue. Switch providers or check the OpenAI account quota and billing state.`;
73
- }
74
- return message;
75
- }
76
- export function truncate(value, maxLength) {
77
- if (value.length <= maxLength) {
78
- return value;
79
- }
80
- return `${value.slice(0, maxLength - 1)}…`;
81
- }
82
- function summarizeToolCall(tool, input) {
83
- const shellCommand = extractShellCommand(input);
84
- if (shellCommand) {
85
- return `${tool} (${truncate(shellCommand, MAX_TOOL_CALL_SUMMARY_CHARS)})`;
86
- }
87
- const path = extractPathField(input);
88
- if (path) {
89
- return `${tool} (${truncate(path, MAX_TOOL_CALL_SUMMARY_CHARS)})`;
90
- }
91
- return tool;
92
- }
93
- function extractShellCommand(value) {
94
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
95
- return undefined;
96
- }
97
- const command = value.command;
98
- return typeof command === 'string' && command.trim() ? command.trim() : undefined;
99
- }
100
- function extractPathField(value) {
101
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
102
- return undefined;
103
- }
104
- const path = value.path;
105
- return typeof path === 'string' && path.trim() ? path.trim() : undefined;
106
- }
107
- function renderToolHistoryMessage(message, history, index) {
108
- const priorAssistant = findPriorAssistantWithToolCall(history, index, message.toolCallId);
109
- const toolName = priorAssistant?.toolCalls?.find((call) => call.id === message.toolCallId)?.tool ?? 'tool';
110
- const summary = message.content.trim();
111
- if (!summary) {
112
- return `${toolName} returned no visible output.`;
113
- }
114
- return `${toolName}: ${summary}`;
115
- }
116
- function findPriorAssistantWithToolCall(history, index, toolCallId) {
117
- for (let cursor = index - 1; cursor >= 0; cursor--) {
118
- const candidate = history[cursor];
119
- if (candidate?.role !== 'assistant' || !candidate.toolCalls?.length) {
120
- continue;
121
- }
122
- if (candidate.toolCalls.some((call) => call.id === toolCallId)) {
123
- return candidate;
124
- }
125
- }
126
- return undefined;
127
- }
128
- function looksLikeAnthropicInputRateLimit(message) {
129
- const normalized = message.toLowerCase();
130
- return (normalized.includes('input tokens per minute')
131
- || (normalized.includes('reduce the prompt length') && normalized.includes('maximum tokens requested'))
132
- || (normalized.includes('rate_limit_error') && normalized.includes('tokens per minute')));
133
- }
134
- function looksLikeOpenAiQuotaError(message) {
135
- const normalized = message.toLowerCase();
136
- return (normalized.includes('exceeded your current quota')
137
- || (normalized.includes('billing details') && normalized.includes('quota')));
138
- }
139
- //# sourceMappingURL=format.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../../src/core/chat/format.ts"],"names":[],"mappings":"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"}