@belonguniverseai/react-sdk 0.6.21 → 0.6.23

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 (226) hide show
  1. package/README.md +69 -0
  2. package/dist/api/account-connectors.d.ts +2 -2
  3. package/dist/api/api-keys.d.ts +22 -0
  4. package/dist/api/client-identity.d.ts +12 -0
  5. package/dist/api/client.d.ts +2453 -92
  6. package/dist/api/goals.d.ts +179 -0
  7. package/dist/api/issue-reports.d.ts +13 -0
  8. package/dist/api/query-keys.d.ts +19 -0
  9. package/dist/api/report-client-error.d.ts +3 -0
  10. package/dist/api/retry-fetch.d.ts +19 -0
  11. package/dist/api/session-end.d.ts +2 -0
  12. package/dist/api/skill-library.d.ts +100 -0
  13. package/dist/api/skills.d.ts +3 -1
  14. package/dist/api/task-schedule-sharing.d.ts +166 -0
  15. package/dist/api/task-schedules.d.ts +23 -1
  16. package/dist/app/BelongDock.d.ts +0 -28
  17. package/dist/app/dock-demo-features.d.ts +13 -0
  18. package/dist/app/dock-demo-transport.d.ts +37 -0
  19. package/dist/app/dock-outlet.d.ts +15 -5
  20. package/dist/app/dock-story-data.d.ts +116 -0
  21. package/dist/browser/allowed-ops.d.ts +18 -0
  22. package/dist/browser/host-mcp.d.ts +31 -0
  23. package/dist/component/THIRD_PARTY_NOTICES.txt +24 -0
  24. package/dist/component/{abnfDiagram-N423BO3Z-DZRUOUZQ.js → abnfDiagram-N423BO3Z-bM1BoI0O.js} +4 -4
  25. package/dist/component/{arc-B4biduil.js → arc-DaSgre52.js} +2 -2
  26. package/dist/component/{architectureDiagram-T3A2C74G-q8voStNN.js → architectureDiagram-T3A2C74G-avMCXzQw.js} +3 -3
  27. package/dist/component/{blockDiagram-VBNYF7ZC-C0TDyTgw.js → blockDiagram-VBNYF7ZC-Cg6EDrdt.js} +4 -4
  28. package/dist/component/{c4Diagram-5PPSVZJV-rxRyd6rh.js → c4Diagram-5PPSVZJV-DhUs6wdK.js} +3 -3
  29. package/dist/component/{channel-CUruDJSx.js → channel-DlmuDpcv.js} +2 -2
  30. package/dist/component/{chunk-2GRJ4B5K-Kff5Fvbi.js → chunk-2GRJ4B5K-Drdf-9Az.js} +2 -2
  31. package/dist/component/{chunk-2Q5K7J3B-BT3ZD31a.js → chunk-2Q5K7J3B-CG6mCJjr.js} +2 -2
  32. package/dist/component/{chunk-5RXB4S5H-CYZ36tQD.js → chunk-5RXB4S5H-DYJwqjr4.js} +5 -5
  33. package/dist/component/{chunk-5VM5RSS4-BweQRk7u.js → chunk-5VM5RSS4-B21XfkBj.js} +2 -2
  34. package/dist/component/{chunk-6Q2QTUOP-DHcoXRhe.js → chunk-6Q2QTUOP-DZkWqf90.js} +2 -2
  35. package/dist/component/{chunk-GF5L2VYU-DtE5ljCc.js → chunk-GF5L2VYU-5hBEo1f5.js} +6 -6
  36. package/dist/component/{chunk-JWPE2WC7-ClHq4gN2.js → chunk-JWPE2WC7-DAn-TcDC.js} +2 -2
  37. package/dist/component/{chunk-KBJHAD2P-BeCfHf5W.js → chunk-KBJHAD2P-CEMDhN2A.js} +2 -2
  38. package/dist/component/{chunk-RYQCIY6F-CuAngwHt.js → chunk-RYQCIY6F-BWL1otLK.js} +2 -2
  39. package/dist/component/{chunk-XXDRQBXY-D9c0CJyR.js → chunk-XXDRQBXY-D0TWnqlD.js} +2 -2
  40. package/dist/component/{classDiagram-JCYQIIEL-DdzIbKj1.js → classDiagram-JCYQIIEL-CjU-7xK0.js} +3 -3
  41. package/dist/component/{classDiagram-v2-OCEON4UE-DdzIbKj1.js → classDiagram-v2-OCEON4UE-CjU-7xK0.js} +3 -3
  42. package/dist/component/{cose-bilkent-JH36ORCC-hME9BYGm.js → cose-bilkent-JH36ORCC-MkPQhZKJ.js} +2 -2
  43. package/dist/component/{cynefinDiagram-MW4NZA55-BiceKBPh.js → cynefinDiagram-MW4NZA55-Wf-Eh_MR.js} +3 -3
  44. package/dist/component/{dagre-VZM6K2ZE-DiPOLAUX.js → dagre-VZM6K2ZE-D1ND11ws.js} +3 -3
  45. package/dist/component/{diagram-7IWD3JNH-BSDWgxjs.js → diagram-7IWD3JNH-ChO63Ikp.js} +4 -4
  46. package/dist/component/{diagram-B4RE2ZJO-BdpGOPaT.js → diagram-B4RE2ZJO-CFVIZBxd.js} +3 -3
  47. package/dist/component/{diagram-LBJQPF4R-B0V6_5ih.js → diagram-LBJQPF4R-BFErKt-H.js} +3 -3
  48. package/dist/component/{diagram-Q27KOJAE-CYDb40TJ.js → diagram-Q27KOJAE-3EA2fDKz.js} +4 -4
  49. package/dist/component/{diagram-UB23O5K3-DgwjRdl5.js → diagram-UB23O5K3-D914yr1r.js} +3 -3
  50. package/dist/component/{ebnfDiagram-BXEA7PRR-D-C7SWec.js → ebnfDiagram-BXEA7PRR-BlRDglJm.js} +4 -4
  51. package/dist/component/{erDiagram-JOGREHBK-DLJCjcXM.js → erDiagram-JOGREHBK-BgHUzm41.js} +5 -5
  52. package/dist/component/{flowDiagram-UKHOOZJN-BZfBucKB.js → flowDiagram-UKHOOZJN-Cf42sXVK.js} +7 -7
  53. package/dist/component/{ganttDiagram-PKOTCBZU-CxTHmusv.js → ganttDiagram-PKOTCBZU-Bqai8Nqw.js} +3 -3
  54. package/dist/component/{gitGraphDiagram-DS77QQ5N-B_dWXxMf.js → gitGraphDiagram-DS77QQ5N-M6yX_E4b.js} +4 -4
  55. package/dist/component/{highlighted-body-OFNGDK62-CQ1ZdhQ-.js → highlighted-body-OFNGDK62-C2rmuXAs.js} +2 -2
  56. package/dist/component/index.js +2 -2
  57. package/dist/component/{infoDiagram-6WML65LV-P4GO-aVw.js → infoDiagram-6WML65LV-Bk4qDfY4.js} +2 -2
  58. package/dist/component/{ishikawaDiagram-WSZJBQD7-BMXMrxKI.js → ishikawaDiagram-WSZJBQD7-CQ0-i0XP.js} +2 -2
  59. package/dist/component/{journeyDiagram-NVQOT4AX-DPdTmxkF.js → journeyDiagram-NVQOT4AX-CK9lX22d.js} +5 -5
  60. package/dist/component/{kanban-definition-27J2QSJJ-sYw64NrE.js → kanban-definition-27J2QSJJ-CrIKfzfe.js} +3 -3
  61. package/dist/component/{linear-DYjDg3gl.js → linear-CzN3Xd3g.js} +2 -2
  62. package/dist/component/{mermaid-GHXKKRXX-DfdCmrs3.js → mermaid-GHXKKRXX-B-ea5OKA.js} +116618 -105206
  63. package/dist/component/{mindmap-definition-FAOFIHXS-UkAbrucA.js → mindmap-definition-FAOFIHXS-DUDsEObz.js} +4 -4
  64. package/dist/component/{pegDiagram-VL7TDLO6-BGab1it6.js → pegDiagram-VL7TDLO6-DFJ-rOLH.js} +4 -4
  65. package/dist/component/{pieDiagram-7S7Q4E2Y-BnY70Pr-.js → pieDiagram-7S7Q4E2Y-OwliOUdN.js} +4 -4
  66. package/dist/component/{quadrantDiagram-CIZ2JOQS-Cv1bjdQb.js → quadrantDiagram-CIZ2JOQS-CLKxzqPi.js} +3 -3
  67. package/dist/component/{railroadDiagram-AXF67PYL-DJhLbGB_.js → railroadDiagram-AXF67PYL-_jBOX7-D.js} +4 -4
  68. package/dist/component/{requirementDiagram-LRYGKXZP-CLW3CgbU.js → requirementDiagram-LRYGKXZP-CxfMaDPH.js} +4 -4
  69. package/dist/component/{sankeyDiagram-W5VNT64P-vnapx0yf.js → sankeyDiagram-W5VNT64P-D-qOUzh7.js} +2 -2
  70. package/dist/component/{sequenceDiagram-SI44F4Z6-I43iQsY0.js → sequenceDiagram-SI44F4Z6-B57h29Ae.js} +4 -4
  71. package/dist/component/{sizeCapture-X5ZJPWSS-D9LGwwwC.js → sizeCapture-X5ZJPWSS-DlIoKfk1.js} +2 -2
  72. package/dist/component/snapdom-DkzCA8S0.js +7061 -0
  73. package/dist/component/{stateDiagram-OKZ733FA-BXejMYGk.js → stateDiagram-OKZ733FA-CNNoDNwB.js} +3 -3
  74. package/dist/component/{stateDiagram-v2-UEYNNEHI-BP05TJSl.js → stateDiagram-v2-UEYNNEHI-xYjW9R-s.js} +3 -3
  75. package/dist/component/{swimlanes-SLNWSIFB-CfmDVYhs.js → swimlanes-SLNWSIFB-Chjr6NCU.js} +4 -4
  76. package/dist/component/{swimlanesDiagram-ULZ7WXOC-DfjQBUfV.js → swimlanesDiagram-ULZ7WXOC-A9mWwnCX.js} +3 -3
  77. package/dist/component/{timeline-definition-Z64GVDOM-C0BwzTs3.js → timeline-definition-Z64GVDOM-DldyCd1l.js} +3 -3
  78. package/dist/component/{vennDiagram-T6HMQDX7-CRf8sGBL.js → vennDiagram-T6HMQDX7-BGfiPWG2.js} +2 -2
  79. package/dist/component/{wardleyDiagram-T6FBY63Y-C2h7TQ4a.js → wardleyDiagram-T6FBY63Y-Bzn9DJ27.js} +3 -3
  80. package/dist/component/{xychartDiagram-ELKLHX3M-CBcAwmdF.js → xychartDiagram-ELKLHX3M-nMaNgT12.js} +3 -3
  81. package/dist/components/ai-elements/message.d.ts +2 -2
  82. package/dist/components/ai-elements/prompt-input.d.ts +3 -1
  83. package/dist/components/ai-elements/task.d.ts +2 -1
  84. package/dist/components/ai-elements/terminal-task.d.ts +2 -1
  85. package/dist/components/connectors/portal-theme.d.ts +2 -8
  86. package/dist/components/embed/AgentChatIcon.d.ts +1 -1
  87. package/dist/components/embed/AgentPhaseIcon.d.ts +16 -14
  88. package/dist/components/embed/ApiKeysSettings.d.ts +1 -0
  89. package/dist/components/embed/BetaBadge.d.ts +8 -10
  90. package/dist/components/embed/ComposerContext.d.ts +9 -0
  91. package/dist/components/embed/EmbedAvatar.d.ts +19 -18
  92. package/dist/components/embed/EmbedComposer.d.ts +13 -1
  93. package/dist/components/embed/EmbedHeader.d.ts +13 -30
  94. package/dist/components/embed/EmbedRail.d.ts +29 -10
  95. package/dist/components/embed/EmbedSessions.d.ts +10 -12
  96. package/dist/components/embed/GoalActions.d.ts +15 -0
  97. package/dist/components/embed/GoalBadge.d.ts +17 -0
  98. package/dist/components/embed/GoalClearDialog.d.ts +6 -0
  99. package/dist/components/embed/GoalClearedLine.d.ts +3 -0
  100. package/dist/components/embed/GoalCompletionCard.d.ts +12 -0
  101. package/dist/components/embed/GoalComposeSheet.d.ts +20 -0
  102. package/dist/components/embed/GoalProposalCard.d.ts +29 -0
  103. package/dist/components/embed/GoalRailView.d.ts +15 -0
  104. package/dist/components/embed/GoalRefusalCard.d.ts +22 -0
  105. package/dist/components/embed/GoalSetCard.d.ts +5 -0
  106. package/dist/components/embed/GoalSnoozeMenu.d.ts +14 -0
  107. package/dist/components/embed/GoalStatusRow.d.ts +6 -0
  108. package/dist/components/embed/GoalTimeline.d.ts +6 -0
  109. package/dist/components/embed/LegalShortDisclaimer.d.ts +6 -8
  110. package/dist/components/embed/MentionInput.d.ts +9 -3
  111. package/dist/components/embed/MobileNavBar.d.ts +16 -10
  112. package/dist/components/embed/OnboardingOverlay.d.ts +3 -1
  113. package/dist/components/embed/OnboardingTour.d.ts +1 -10
  114. package/dist/components/embed/OnboardingWelcome.d.ts +1 -11
  115. package/dist/components/embed/PlanPanel.d.ts +3 -1
  116. package/dist/components/embed/PreviewPanel.d.ts +3 -1
  117. package/dist/components/embed/QuestionCard.d.ts +12 -1
  118. package/dist/components/embed/ScheduleNotices.d.ts +23 -0
  119. package/dist/components/embed/SentAsGoalTag.d.ts +1 -0
  120. package/dist/components/embed/SessionSwitcher.d.ts +12 -0
  121. package/dist/components/embed/SubagentAvatar.d.ts +8 -0
  122. package/dist/components/embed/SubagentsPaneBody.d.ts +3 -0
  123. package/dist/components/embed/WorkspacePane.d.ts +3 -1
  124. package/dist/components/embed/navigation-layout.d.ts +7 -0
  125. package/dist/components/embed/rail-flags.d.ts +6 -0
  126. package/dist/components/embed/use-prompt-invocations.d.ts +6 -1
  127. package/dist/components/feedback/IssueReportController.d.ts +1 -0
  128. package/dist/components/feedback/IssueReportDialog.d.ts +6 -0
  129. package/dist/components/prompts/PromptPreviewDialog.d.ts +10 -0
  130. package/dist/components/prompts/PromptsListSurface.d.ts +4 -4
  131. package/dist/components/scheduled/ConfirmDeleteScheduleDialog.d.ts +1 -0
  132. package/dist/components/scheduled/ScheduleDialog.d.ts +4 -0
  133. package/dist/components/scheduled/ScheduledDetailSurface.d.ts +1 -0
  134. package/dist/components/scheduled/ScheduledHeader.d.ts +3 -0
  135. package/dist/components/scheduled/ScheduledListSurface.d.ts +1 -1
  136. package/dist/components/scheduled/ShareScheduleDialog.d.ts +10 -0
  137. package/dist/components/scheduled/SharedSchedulesSurface.d.ts +1 -0
  138. package/dist/components/scheduled/schedule-dialog-model.d.ts +5 -2
  139. package/dist/components/skills/ConfirmDeleteSkillDialog.d.ts +9 -0
  140. package/dist/components/skills/SkillDiscover.d.ts +1 -0
  141. package/dist/components/skills/SkillLibraryToolSync.d.ts +4 -0
  142. package/dist/components/skills/SkillsListSurface.d.ts +29 -0
  143. package/dist/components/skills/UploadSkillDialog.d.ts +32 -0
  144. package/dist/components/skills/skill-archive-file.d.ts +15 -0
  145. package/dist/components/ui/card.d.ts +1 -1
  146. package/dist/components/ui/dialog.d.ts +1 -1
  147. package/dist/components/ui/dropdown-menu.d.ts +2 -2
  148. package/dist/components/ui/hover-card.d.ts +1 -1
  149. package/dist/components/ui/popover.d.ts +1 -1
  150. package/dist/components/ui/select.d.ts +1 -1
  151. package/dist/components/ui/shadow-dialog-focus.d.ts +5 -0
  152. package/dist/components/ui/tooltip.d.ts +1 -1
  153. package/dist/embed/brand-marks.d.ts +3 -3
  154. package/dist/embed/client-error-log.d.ts +72 -0
  155. package/dist/embed/copy.d.ts +8 -2
  156. package/dist/embed/dock-open-request.d.ts +32 -0
  157. package/dist/embed/dock-state.d.ts +1 -1
  158. package/dist/embed/goal-actions-model.d.ts +9 -0
  159. package/dist/embed/goal-cap-notice.d.ts +36 -0
  160. package/dist/embed/goal-deep-link.d.ts +24 -0
  161. package/dist/embed/goal-edit-command.d.ts +25 -0
  162. package/dist/embed/goal-journal.d.ts +53 -0
  163. package/dist/embed/goal-live-status.d.ts +2 -0
  164. package/dist/embed/goal-plain-units.d.ts +35 -0
  165. package/dist/embed/goal-progress.d.ts +15 -0
  166. package/dist/embed/goal-proposal-dismissal.d.ts +11 -0
  167. package/dist/embed/goal-resume-time.d.ts +22 -0
  168. package/dist/embed/goal-row-model.d.ts +27 -0
  169. package/dist/embed/goal-runway.d.ts +5 -0
  170. package/dist/embed/goal-schedule-handoff.d.ts +12 -0
  171. package/dist/embed/goal-status-label.d.ts +3 -0
  172. package/dist/embed/goal-time-usage.d.ts +19 -0
  173. package/dist/embed/issue-report-bus.d.ts +14 -0
  174. package/dist/embed/issue-report-open.d.ts +8 -0
  175. package/dist/embed/issue-report.d.ts +41 -0
  176. package/dist/embed/legal-disclaimer.d.ts +5 -1
  177. package/dist/embed/library-composer.d.ts +24 -0
  178. package/dist/embed/library-navigation.d.ts +6 -0
  179. package/dist/embed/portal-container.d.ts +17 -16
  180. package/dist/embed/presets.d.ts +2 -2
  181. package/dist/embed/schedule-invitation.d.ts +5 -0
  182. package/dist/embed/screen-capture.d.ts +74 -0
  183. package/dist/embed/slash-commands.d.ts +24 -0
  184. package/dist/embed/task-schedule-command.d.ts +7 -0
  185. package/dist/embed/use-session-draft.d.ts +11 -0
  186. package/dist/i18n/messages/en.d.ts +599 -4
  187. package/dist/i18n/messages/surfaces/feedback.d.ts +84 -0
  188. package/dist/i18n/messages/surfaces/files.d.ts +4 -0
  189. package/dist/i18n/messages/surfaces/header.d.ts +20 -0
  190. package/dist/i18n/messages/surfaces/navigation.d.ts +149 -0
  191. package/dist/i18n/messages/surfaces/prompts.d.ts +56 -5
  192. package/dist/i18n/messages/surfaces/scheduled.d.ts +233 -1
  193. package/dist/i18n/messages/surfaces/sessions.d.ts +16 -0
  194. package/dist/i18n/messages/surfaces/settings.d.ts +229 -0
  195. package/dist/i18n/messages/surfaces/skills.d.ts +299 -0
  196. package/dist/i18n/messages/surfaces/stream.d.ts +232 -0
  197. package/dist/i18n/messages/surfaces/usage.d.ts +56 -0
  198. package/dist/i18n/messages/surfaces/workspace.d.ts +20 -0
  199. package/dist/public-api.d.ts +1 -1
  200. package/dist/routes/chat/part-renderer-extra-props.d.ts +43 -0
  201. package/dist/routes/chat/use-goal-receipt.d.ts +37 -0
  202. package/dist/routes/chat/use-host-draft-request.d.ts +2 -0
  203. package/dist/routes/chat/use-session-goal.d.ts +227 -0
  204. package/dist/routes/chat.d.ts +11 -1
  205. package/dist/routes/goal.d.ts +1 -0
  206. package/dist/routes/library.d.ts +4 -0
  207. package/dist/routes/skills.d.ts +2 -0
  208. package/dist/stream/activity-items.d.ts +25 -0
  209. package/dist/stream/ai-sdk-part-renderers.d.ts +67 -32
  210. package/dist/stream/belong-chat-transport.d.ts +157 -2
  211. package/dist/stream/belong-data-parts.d.ts +56 -6
  212. package/dist/stream/goal-store.d.ts +43 -0
  213. package/dist/stream/message-metadata.d.ts +1 -0
  214. package/dist/stream/message-parts.d.ts +42 -0
  215. package/dist/stream/select-goal-set-part-id.d.ts +2 -0
  216. package/dist/stream/select-latest-goal.d.ts +13 -0
  217. package/dist/stream/subagent-controls-store.d.ts +20 -0
  218. package/dist/stream/subagent-lanes-model.d.ts +175 -0
  219. package/dist/stream/subagent-lanes.d.ts +90 -0
  220. package/dist/stream/use-publish-subagent-controls.d.ts +11 -0
  221. package/dist/stream/workspace-focus-store.d.ts +7 -1
  222. package/dist/test/render.d.ts +18 -1
  223. package/dist/test/subagent-fixtures.d.ts +24 -0
  224. package/dist/types/public.d.ts +54 -1
  225. package/package.json +1 -1
  226. package/dist/components/ai-elements/reasoning.d.ts +0 -26
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Skills — the rail surface for the user's OWN skill library in the current
3
+ * workspace (skill library spec §11.3): what they uploaded, or asked the
4
+ * assistant to save. Discover is a separate read-only catalog of available
5
+ * company skills; only the personal library exposes mutations (D3).
6
+ *
7
+ * PROPLESS, like `PromptsListSurface` and `ConnectorsListSurface`: it reads its
8
+ * own server state, so a route, a test and a story mount it the same way, and a
9
+ * reload renders what the live view rendered (§41).
10
+ *
11
+ * States, in the order they win:
12
+ *
13
+ * scope missing → feature absent → rows / empty → outage (+ Retry) → loading
14
+ *
15
+ * Rows beat an outage on purpose: a failed BACKGROUND refetch keeps the list
16
+ * the user is looking at instead of replacing it with an error.
17
+ *
18
+ * The on/off control is an inline SWITCH, not a menu item: turning a skill off
19
+ * is the frequent action, and a row has only two others (Download, Delete). It
20
+ * flips at once, locks while its own request runs, and snaps back on failure.
21
+ *
22
+ * NOTHING HERE IS RED (§42). An outage, a failed toggle, download or delete is
23
+ * an ordinary thing that happens to a working product, said in orange. The only
24
+ * red is the delete dialog's confirm button, and a refused upload inside the
25
+ * upload dialog. No search in v1 (at most 50 skills per workspace; spec §17).
26
+ */
27
+ export declare const SkillsListSurface: ({ initialView, }: {
28
+ readonly initialView?: "discover" | "library";
29
+ }) => import("react").JSX.Element;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Upload a skill someone shared with you — a `.zip` or `.skill` (skill library
3
+ * spec §11.4).
4
+ *
5
+ * THREE steps, one component each way through:
6
+ *
7
+ * choose (drop zone + trust line) → replace? (only on `name_taken`) → saved
8
+ *
9
+ * WARN, don't block, on scripts (D10). The trust line is ALWAYS visible before
10
+ * anything is sent, and the saved step badges "Has scripts". Clicking Upload
11
+ * is the user's explicit consent; the D4 approval card is for the agent acting
12
+ * on its own.
13
+ *
14
+ * EVERY server answer is a sentence, matched exhaustively (§19): a new refusal
15
+ * the route starts returning is a compile error here, never a silent "couldn't
16
+ * upload". The copy names the product only (§42) — never SKILL.md, frontmatter,
17
+ * archive or bundle.
18
+ *
19
+ * RED only for a refused submit, inside this dialog (§42). The surface behind
20
+ * it stays orange.
21
+ *
22
+ * The retry key: minted when the dialog opens and again on every accepted
23
+ * pick. A retry of the same pick reuses it (a lost response comes back
24
+ * `idempotent`); a different file never reuses it (the server would answer
25
+ * `client_save_id_reused`). If that retry fails AGAIN with the generic error
26
+ * (which is where `client_save_id_reused` lands), the file is kept and a new key
27
+ * is minted, so the user can never loop on the same 400.
28
+ */
29
+ export declare const UploadSkillDialog: (props: {
30
+ readonly open: boolean;
31
+ readonly onOpenChange: (open: boolean) => void;
32
+ }) => import("react").JSX.Element;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Client pre-checks for the archive a user picks in the upload dialog. The
3
+ * server stays the authority (it re-validates everything); these exist so an
4
+ * obviously wrong file is refused before 10 MB crosses the wire. Plain `.ts`
5
+ * so `UploadSkillDialog.tsx` stays a component-only Fast Refresh boundary.
6
+ */
7
+ export type SkillArchiveFileCheck = "ok" | "wrong_type" | "too_large";
8
+ /** The file input's `accept` list, derived from the shared extensions. */
9
+ export declare const SKILL_ARCHIVE_ACCEPT: string;
10
+ export declare const checkSkillArchiveFile: (file: {
11
+ readonly name: string;
12
+ readonly size: number;
13
+ }) => SkillArchiveFileCheck;
14
+ /** Whole megabytes for copy ("max 10 MB"). */
15
+ export declare const megabytesFloor: (bytes: number) => number;
@@ -6,4 +6,4 @@ declare function CardDescription({ className, ...props }: React.ComponentProps<"
6
6
  declare function CardAction({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
7
7
  declare function CardContent({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
8
8
  declare function CardFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
9
- export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent, };
9
+ export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent };
@@ -5,7 +5,7 @@ declare function DialogTrigger({ ...props }: React.ComponentProps<typeof DialogP
5
5
  declare function DialogPortal({ container, ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>): React.JSX.Element;
6
6
  declare function DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>): React.JSX.Element;
7
7
  declare function DialogOverlay({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Overlay>): React.JSX.Element;
8
- declare function DialogContent({ className, children, showCloseButton, ...props }: React.ComponentProps<typeof DialogPrimitive.Content> & {
8
+ declare function DialogContent({ className, style, children, showCloseButton, ...props }: React.ComponentProps<typeof DialogPrimitive.Content> & {
9
9
  showCloseButton?: boolean;
10
10
  }): React.JSX.Element;
11
11
  declare function DialogHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
@@ -3,7 +3,7 @@ import * as React from "react";
3
3
  declare function DropdownMenu({ modal, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>): React.JSX.Element;
4
4
  declare function DropdownMenuPortal({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>): React.JSX.Element;
5
5
  declare function DropdownMenuTrigger({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>): React.JSX.Element;
6
- declare function DropdownMenuContent({ className, sideOffset, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Content>): React.JSX.Element;
6
+ declare function DropdownMenuContent({ className, style, sideOffset, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Content>): React.JSX.Element;
7
7
  declare function DropdownMenuGroup({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Group>): React.JSX.Element;
8
8
  declare function DropdownMenuItem({ className, inset, variant, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {
9
9
  inset?: boolean;
@@ -21,5 +21,5 @@ declare function DropdownMenuSub({ ...props }: React.ComponentProps<typeof Dropd
21
21
  declare function DropdownMenuSubTrigger({ className, inset, children, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {
22
22
  inset?: boolean;
23
23
  }): React.JSX.Element;
24
- declare function DropdownMenuSubContent({ className, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>): React.JSX.Element;
24
+ declare function DropdownMenuSubContent({ className, style, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>): React.JSX.Element;
25
25
  export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, };
@@ -2,5 +2,5 @@ import { HoverCard as HoverCardPrimitive } from 'radix-ui';
2
2
  import * as React from "react";
3
3
  declare function HoverCard({ ...props }: React.ComponentProps<typeof HoverCardPrimitive.Root>): React.JSX.Element;
4
4
  declare function HoverCardTrigger({ ...props }: React.ComponentProps<typeof HoverCardPrimitive.Trigger>): React.JSX.Element;
5
- declare function HoverCardContent({ className, align, sideOffset, ...props }: React.ComponentProps<typeof HoverCardPrimitive.Content>): React.JSX.Element;
5
+ declare function HoverCardContent({ className, style, align, sideOffset, ...props }: React.ComponentProps<typeof HoverCardPrimitive.Content>): React.JSX.Element;
6
6
  export { HoverCard, HoverCardTrigger, HoverCardContent };
@@ -2,7 +2,7 @@ import { Popover as PopoverPrimitive } from 'radix-ui';
2
2
  import * as React from "react";
3
3
  declare function Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>): React.JSX.Element;
4
4
  declare function PopoverTrigger({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>): React.JSX.Element;
5
- declare function PopoverContent({ className, align, sideOffset, ...props }: React.ComponentProps<typeof PopoverPrimitive.Content>): React.JSX.Element;
5
+ declare function PopoverContent({ className, style, align, sideOffset, ...props }: React.ComponentProps<typeof PopoverPrimitive.Content>): React.JSX.Element;
6
6
  declare function PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>): React.JSX.Element;
7
7
  declare function PopoverHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
8
8
  declare function PopoverTitle({ className, ...props }: React.ComponentProps<"h2">): React.JSX.Element;
@@ -6,7 +6,7 @@ declare function SelectValue({ ...props }: React.ComponentProps<typeof SelectPri
6
6
  declare function SelectTrigger({ className, size, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Trigger> & {
7
7
  size?: "sm" | "default";
8
8
  }): React.JSX.Element;
9
- declare function SelectContent({ className, children, position, align, ...props }: React.ComponentProps<typeof SelectPrimitive.Content>): React.JSX.Element;
9
+ declare function SelectContent({ className, style, children, position, align, ...props }: React.ComponentProps<typeof SelectPrimitive.Content>): React.JSX.Element;
10
10
  declare function SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>): React.JSX.Element;
11
11
  declare function SelectItem({ className, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Item>): React.JSX.Element;
12
12
  declare function SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>): React.JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { KeyboardEvent } from 'react';
2
+ /** Radix's focus loop reads document.activeElement, which is the embed host
3
+ * inside Shadow DOM. Use the actual focused control at the modal's Tab edges.
4
+ */
5
+ export declare const loopShadowDialogFocus: (event: KeyboardEvent<HTMLDivElement>) => void;
@@ -3,5 +3,5 @@ import * as React from "react";
3
3
  declare function TooltipProvider({ delayDuration, ...props }: React.ComponentProps<typeof TooltipPrimitive.Provider>): React.JSX.Element;
4
4
  declare function Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>): React.JSX.Element;
5
5
  declare function TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>): React.JSX.Element;
6
- declare function TooltipContent({ className, sideOffset, children, ...props }: React.ComponentProps<typeof TooltipPrimitive.Content>): React.JSX.Element;
6
+ declare function TooltipContent({ className, style, sideOffset, children, ...props }: React.ComponentProps<typeof TooltipPrimitive.Content>): React.JSX.Element;
7
7
  export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
@@ -2,10 +2,10 @@
2
2
  * Brand marks as inline data-URLs. The Belong mark is the existing
3
3
  * multicolour organic glyph (moved here from BelongMark.tsx so the component
4
4
  * and the Belong preset's logo build from one source), an inline SVG. The
5
- * Simetrik mark is the agent-theme icon — a multicolour pinwheel glyph —
6
- * supplied as an inline PNG.
5
+ * Simetrik mark is the distinct agent glyph from the approved design proposal,
6
+ * embedded unchanged as WebP rather than the company pinwheel.
7
7
  * Both are static strings: nothing host-controlled reaches the DOM.
8
8
  */
9
9
  export declare const BELONG_INNER = "<defs><linearGradient id=\"g0\" gradientUnits=\"userSpaceOnUse\" x1=\"103\" y1=\"17\" x2=\"30\" y2=\"41\"><stop offset=\"0\" stop-color=\"#0F1B2E\"></stop><stop offset=\"1\" stop-color=\"#0F1B2E\"></stop></linearGradient><linearGradient id=\"g1\" gradientUnits=\"userSpaceOnUse\" x1=\"103\" y1=\"17\" x2=\"154\" y2=\"81\"><stop offset=\"0\" stop-color=\"#0F1B2E\"></stop><stop offset=\"1\" stop-color=\"#2D6F66\"></stop></linearGradient><linearGradient id=\"g2\" gradientUnits=\"userSpaceOnUse\" x1=\"154\" y1=\"81\" x2=\"112\" y2=\"142\"><stop offset=\"0\" stop-color=\"#2D6F66\"></stop><stop offset=\"1\" stop-color=\"#D9A441\"></stop></linearGradient><linearGradient id=\"g3\" gradientUnits=\"userSpaceOnUse\" x1=\"112\" y1=\"142\" x2=\"34\" y2=\"124\"><stop offset=\"0\" stop-color=\"#D9A441\"></stop><stop offset=\"1\" stop-color=\"#E06A4F\"></stop></linearGradient><linearGradient id=\"g4\" gradientUnits=\"userSpaceOnUse\" x1=\"34\" y1=\"124\" x2=\"30\" y2=\"41\"><stop offset=\"0\" stop-color=\"#E06A4F\"></stop><stop offset=\"1\" stop-color=\"#0F1B2E\"></stop></linearGradient></defs>\n <g>\n <path d=\"M 102.3,6.5 L 100.4,7.3 L 98.5,8.1 L 96.6,8.9 L 94.7,9.7 L 92.9,10.5 L 91.0,11.3 L 89.2,12.1 L 87.4,12.9 L 85.6,13.7 L 83.9,14.5 L 82.1,15.3 L 80.4,16.1 L 78.6,16.9 L 76.9,17.6 L 75.2,18.4 L 73.5,19.1 L 71.8,19.8 L 70.1,20.5 L 68.4,21.2 L 66.8,21.9 L 65.1,22.5 L 63.3,23.1 L 61.6,23.6 L 59.8,24.1 L 58.1,24.5 L 56.3,24.9 L 54.5,25.3 L 52.7,25.7 L 50.9,26.1 L 49.0,26.4 L 47.2,26.8 L 45.3,27.1 L 43.4,27.5 L 41.5,27.8 L 39.6,28.1 L 37.6,28.4 L 35.6,28.8 L 33.6,29.1 L 31.6,29.4 L 29.6,29.7 L 27.5,30.0 L 25.4,30.3 L 23.3,30.7 L 36.7,51.3 L 37.6,49.7 L 38.6,48.1 L 39.7,46.5 L 40.7,45.0 L 41.8,43.5 L 43.0,42.1 L 44.2,40.7 L 45.4,39.3 L 46.7,38.0 L 48.0,36.7 L 49.3,35.5 L 50.7,34.3 L 52.1,33.2 L 53.5,32.1 L 55.0,31.1 L 56.5,30.1 L 58.0,29.2 L 59.5,28.3 L 61.1,27.5 L 62.7,26.8 L 64.4,26.2 L 66.0,25.6 L 67.8,25.2 L 69.5,24.8 L 71.2,24.5 L 73.0,24.2 L 74.8,24.0 L 76.6,23.9 L 78.4,23.8 L 80.2,23.8 L 82.0,23.8 L 83.8,23.9 L 85.6,24.0 L 87.4,24.2 L 89.2,24.4 L 91.1,24.6 L 92.9,24.9 L 94.7,25.2 L 96.5,25.6 L 98.3,26.0 L 100.1,26.5 L 101.9,27.0 L 103.7,27.5 Z\" fill=\"url(#g0)\"></path>\n <path d=\"M 96.7,25.4 L 98.6,26.0 L 100.4,26.6 L 102.3,27.3 L 104.1,28.0 L 105.9,28.7 L 107.7,29.5 L 109.5,30.3 L 111.2,31.2 L 112.9,32.1 L 114.6,33.0 L 116.3,34.0 L 117.9,35.0 L 119.5,36.1 L 121.0,37.2 L 122.6,38.3 L 124.1,39.5 L 125.5,40.7 L 126.9,42.0 L 128.3,43.3 L 129.6,44.6 L 130.9,46.0 L 132.0,47.5 L 133.1,49.1 L 134.2,50.6 L 135.1,52.3 L 136.0,53.9 L 136.9,55.6 L 137.7,57.3 L 138.4,59.1 L 139.1,60.9 L 139.8,62.7 L 140.3,64.5 L 140.9,66.3 L 141.4,68.2 L 141.8,70.1 L 142.2,72.0 L 142.5,73.9 L 142.8,75.8 L 143.0,77.8 L 143.2,79.8 L 143.3,81.7 L 143.4,83.7 L 143.4,85.7 L 164.6,76.3 L 163.0,74.7 L 161.4,73.2 L 159.9,71.6 L 158.4,70.1 L 156.8,68.6 L 155.3,67.1 L 153.8,65.7 L 152.3,64.2 L 150.9,62.7 L 149.4,61.3 L 148.0,59.8 L 146.6,58.4 L 145.2,57.0 L 143.8,55.6 L 142.4,54.1 L 141.1,52.7 L 139.7,51.3 L 138.4,49.9 L 137.1,48.4 L 135.8,47.0 L 134.6,45.5 L 133.4,44.0 L 132.2,42.5 L 131.1,40.9 L 130.0,39.3 L 128.9,37.7 L 127.8,36.1 L 126.7,34.5 L 125.6,32.8 L 124.5,31.2 L 123.4,29.5 L 122.3,27.8 L 121.2,26.1 L 120.0,24.4 L 118.9,22.7 L 117.8,21.0 L 116.6,19.2 L 115.4,17.5 L 114.2,15.7 L 113.0,14.0 L 111.8,12.2 L 110.6,10.4 L 109.3,8.6 Z\" fill=\"url(#g1)\"></path>\n <path d=\"M 143.1,77.1 L 143.3,78.9 L 143.4,80.7 L 143.5,82.5 L 143.5,84.3 L 143.5,86.1 L 143.4,87.8 L 143.3,89.6 L 143.1,91.4 L 142.9,93.1 L 142.6,94.8 L 142.3,96.6 L 141.9,98.3 L 141.5,99.9 L 141.0,101.6 L 140.5,103.2 L 139.9,104.9 L 139.3,106.5 L 138.6,108.0 L 137.9,109.6 L 137.0,111.1 L 136.2,112.5 L 135.2,113.9 L 134.2,115.3 L 133.0,116.6 L 131.9,117.8 L 130.7,119.0 L 129.4,120.2 L 128.1,121.3 L 126.8,122.4 L 125.4,123.5 L 124.0,124.5 L 122.5,125.5 L 121.1,126.4 L 119.5,127.3 L 118.0,128.2 L 116.5,129.0 L 114.9,129.8 L 113.3,130.6 L 111.6,131.3 L 110.0,132.0 L 108.3,132.6 L 106.6,133.2 L 104.9,133.8 L 119.1,150.2 L 120.1,148.4 L 121.0,146.7 L 122.0,144.9 L 122.9,143.1 L 123.8,141.4 L 124.7,139.7 L 125.6,138.0 L 126.5,136.3 L 127.4,134.6 L 128.2,133.0 L 129.1,131.3 L 129.9,129.7 L 130.8,128.1 L 131.7,126.5 L 132.5,124.9 L 133.4,123.3 L 134.2,121.8 L 135.1,120.3 L 136.0,118.7 L 136.9,117.3 L 137.9,115.8 L 138.8,114.3 L 139.9,112.9 L 141.0,111.6 L 142.1,110.2 L 143.2,108.8 L 144.3,107.5 L 145.5,106.1 L 146.7,104.8 L 147.9,103.4 L 149.1,102.0 L 150.3,100.7 L 151.6,99.3 L 152.8,97.9 L 154.1,96.5 L 155.4,95.1 L 156.7,93.7 L 158.1,92.3 L 159.4,90.9 L 160.7,89.4 L 162.1,87.9 L 163.5,86.5 L 164.9,84.9 Z\" fill=\"url(#g2)\"></path>\n <path d=\"M 111.7,131.1 L 109.9,131.9 L 108.1,132.5 L 106.3,133.2 L 104.5,133.8 L 102.6,134.4 L 100.8,134.9 L 98.9,135.4 L 97.1,135.8 L 95.2,136.2 L 93.4,136.5 L 91.5,136.8 L 89.6,137.0 L 87.8,137.2 L 85.9,137.4 L 84.0,137.4 L 82.2,137.5 L 80.3,137.4 L 78.4,137.3 L 76.6,137.2 L 74.8,137.0 L 72.9,136.7 L 71.2,136.2 L 69.4,135.7 L 67.6,135.1 L 65.9,134.4 L 64.2,133.7 L 62.5,132.9 L 60.9,132.1 L 59.3,131.1 L 57.7,130.2 L 56.1,129.1 L 54.6,128.1 L 53.1,126.9 L 51.6,125.8 L 50.1,124.5 L 48.7,123.3 L 47.3,121.9 L 46.0,120.6 L 44.6,119.2 L 43.4,117.7 L 42.1,116.2 L 40.9,114.7 L 39.7,113.1 L 28.3,134.9 L 30.5,135.1 L 32.7,135.3 L 34.8,135.4 L 37.0,135.6 L 39.1,135.8 L 41.2,135.9 L 43.3,136.1 L 45.3,136.3 L 47.3,136.4 L 49.3,136.6 L 51.3,136.8 L 53.3,137.0 L 55.3,137.2 L 57.2,137.4 L 59.1,137.7 L 61.0,137.9 L 62.9,138.1 L 64.8,138.4 L 66.7,138.7 L 68.6,139.0 L 70.4,139.4 L 72.2,139.8 L 74.1,140.3 L 75.9,140.8 L 77.7,141.4 L 79.5,142.0 L 81.3,142.5 L 83.2,143.1 L 85.0,143.8 L 86.9,144.4 L 88.7,145.0 L 90.6,145.7 L 92.5,146.3 L 94.4,147.0 L 96.3,147.6 L 98.2,148.3 L 100.2,148.9 L 102.2,149.6 L 104.1,150.3 L 106.1,150.9 L 108.2,151.6 L 110.2,152.2 L 112.3,152.9 Z\" fill=\"url(#g3)\"></path>\n <path d=\"M 45.8,120.3 L 44.4,118.8 L 43.1,117.2 L 41.9,115.6 L 40.7,114.0 L 39.5,112.4 L 38.4,110.7 L 37.3,109.0 L 36.3,107.3 L 35.3,105.6 L 34.4,103.8 L 33.6,102.1 L 32.8,100.3 L 32.0,98.5 L 31.3,96.6 L 30.7,94.8 L 30.1,93.0 L 29.6,91.1 L 29.2,89.2 L 28.8,87.3 L 28.5,85.4 L 28.3,83.5 L 28.2,81.6 L 28.2,79.7 L 28.3,77.8 L 28.5,75.9 L 28.8,74.0 L 29.1,72.1 L 29.5,70.2 L 29.9,68.3 L 30.5,66.4 L 31.0,64.6 L 31.7,62.7 L 32.4,60.9 L 33.1,59.1 L 33.9,57.3 L 34.7,55.5 L 35.6,53.7 L 36.6,52.0 L 37.6,50.2 L 38.6,48.5 L 39.7,46.8 L 40.9,45.2 L 42.1,43.5 L 17.9,38.5 L 18.3,40.7 L 18.7,42.9 L 19.1,45.1 L 19.5,47.3 L 19.9,49.5 L 20.3,51.6 L 20.7,53.7 L 21.1,55.8 L 21.4,57.9 L 21.8,59.9 L 22.2,62.0 L 22.5,64.0 L 22.8,66.0 L 23.2,68.0 L 23.5,70.0 L 23.8,72.0 L 24.1,73.9 L 24.3,75.9 L 24.6,77.9 L 24.8,79.8 L 24.9,81.8 L 25.0,83.7 L 25.1,85.7 L 25.0,87.6 L 25.0,89.6 L 24.9,91.6 L 24.8,93.6 L 24.7,95.6 L 24.6,97.6 L 24.5,99.6 L 24.3,101.6 L 24.2,103.7 L 24.0,105.8 L 23.8,107.9 L 23.7,110.0 L 23.5,112.1 L 23.3,114.3 L 23.1,116.5 L 22.9,118.6 L 22.8,120.9 L 22.6,123.1 L 22.4,125.4 L 22.2,127.7 Z\" fill=\"url(#g4)\"></path>\n <circle cx=\"30\" cy=\"41\" r=\"17\" fill=\"#0F1B2E\"></circle>\n <circle cx=\"103\" cy=\"17\" r=\"14.5\" fill=\"#0F1B2E\"></circle>\n <circle cx=\"154\" cy=\"81\" r=\"16\" fill=\"#2D6F66\"></circle>\n <circle cx=\"112\" cy=\"142\" r=\"15\" fill=\"#D9A441\"></circle>\n <circle cx=\"34\" cy=\"124\" r=\"17\" fill=\"#E06A4F\"></circle>\n </g>";
10
10
  export declare const BELONG_MARK_DATA_URL: string;
11
- export declare const SIMETRIK_MARK_DATA_URL = "data:image/png;base64,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";
11
+ export declare const SIMETRIK_MARK_DATA_URL = "data:image/webp;base64,UklGRhgBAABXRUJQVlA4WAoAAAAQAAAADwAADwAAQUxQSFgAAAABV0AQQJo7gjMa6YiIeEqZwmlt2050yEgsDonE4rC0MiWMSg3kFtJp84caIvo/AeQ+9sikVXDSERg+egAeqjOb0eoW61NLrOEarMBXjwVw1x5g0SrgvZILVlA4IJoAAAAwAwCdASoQABAAAgA0JbACdD3gNKY/aP4APIzBSFjhxZrAAP7uofENbNCU14kn7Y9fiMx5hQC6tBG8hCxAsScHwJbICDxmUpCHQnDif7BjJucv/85jnx+f3/ulPRtln+pGzcAk03x/u1nW2V7Pkq/tXvKU3X+Ars96FjUnypyP37/VIut/GTG69Xhlu4TKR3xP4dwefdEF+uAA";
@@ -0,0 +1,72 @@
1
+ /**
2
+ * A bounded tail of what already went wrong in this browser tab, so an issue
3
+ * report can carry it (issue-report-open.ts reads this).
4
+ *
5
+ * This is the ONE input to a report that is unrecoverable after the fact: a
6
+ * render that threw or a 500 on a dock route leaves no server-side trace tied
7
+ * to the user's complaint.
8
+ *
9
+ * Deliberately narrow: kind, a truncated message, and for a request failure
10
+ * the route and status. We never read a response body into this buffer
11
+ * ourselves — our own failures (`reportClientError`'s call sites) record a
12
+ * route and a status code, never the body. But the two global listeners
13
+ * below capture host-authored error text verbatim, and a host application
14
+ * can legally do `throw new Error(await response.text())` — at that point
15
+ * the "message" a window `error`/`unhandledrejection` event carries IS a
16
+ * response body, word for word. There is no way to strip that out without
17
+ * inspecting arbitrary Error objects we cannot parse, so the mitigation is a
18
+ * hard cap: host-originated text gets
19
+ * `MAX_HOST_CLIENT_ERROR_MESSAGE_CHARS` (120), well short of a useful
20
+ * response body, while our own controlled messages keep the full
21
+ * `MAX_CLIENT_ERROR_MESSAGE_CHARS` (500). See `recordClientError` vs.
22
+ * `recordHostClientError` below.
23
+ *
24
+ * Module-level store in the same grain as approval-bus.ts: one per page, no
25
+ * React, readable from anywhere in the dock.
26
+ */
27
+ export declare const MAX_CLIENT_ERROR_ENTRIES = 20;
28
+ /**
29
+ * Cap for a message recorded through the CONTROLLED path — our own
30
+ * `reportClientError` call sites (`api/report-client-error.ts`). We author
31
+ * that text ourselves (a fixed set of transport-failure kinds), so it is
32
+ * known-safe at the full length.
33
+ */
34
+ export declare const MAX_CLIENT_ERROR_MESSAGE_CHARS = 500;
35
+ /**
36
+ * Cap for a message recorded through the UNCONTROLLED path — the global
37
+ * `window` `error` / `unhandledrejection` listeners below. That text is
38
+ * authored by the HOST PAGE, not by us: a host that does
39
+ * `throw new Error(await response.text())` hands its rejection message
40
+ * straight to `onRejection`, and without a hard cap a response body would
41
+ * ride into the next issue report intact. Kept far below the controlled cap
42
+ * on purpose — this is a privacy boundary, not a display truncation.
43
+ */
44
+ export declare const MAX_HOST_CLIENT_ERROR_MESSAGE_CHARS = 120;
45
+ export type ClientErrorEntry = {
46
+ readonly at: string;
47
+ readonly kind: string;
48
+ readonly message: string;
49
+ readonly route?: string;
50
+ readonly status?: number;
51
+ };
52
+ type ClientErrorInput = {
53
+ readonly kind: string;
54
+ readonly message: string;
55
+ readonly route?: string;
56
+ readonly status?: number;
57
+ readonly at?: string;
58
+ };
59
+ /**
60
+ * Record an error from the CONTROLLED path: our own `reportClientError` call
61
+ * sites. Gets the full `MAX_CLIENT_ERROR_MESSAGE_CHARS` cap — see that
62
+ * constant's doc comment for why the two paths are capped differently.
63
+ */
64
+ export declare const recordClientError: (entry: ClientErrorInput) => void;
65
+ export declare const peekClientErrors: () => readonly ClientErrorEntry[];
66
+ /**
67
+ * Subscribe to uncaught errors and unhandled rejections. Returns the
68
+ * uninstaller; safe to call more than once (each call returns its own).
69
+ */
70
+ export declare const installGlobalClientErrorCapture: (target: Window) => (() => void);
71
+ export declare const __resetClientErrorLogForTest: () => void;
72
+ export {};
@@ -47,6 +47,7 @@ export type TourLabels = {
47
47
  type TourStepContent = {
48
48
  readonly title: string;
49
49
  readonly body: (voiceKeyLabel: string) => string;
50
+ readonly bodyTouch?: string;
50
51
  };
51
52
  export type TourCopy = TourLabels & {
52
53
  readonly steps: {
@@ -177,7 +178,10 @@ export declare const voiceKeyLabel: (code: string, locale: Locale) => string;
177
178
  * tenant supplies one — Simetrik's preset, or a published theme.json. A
178
179
  * neutral host with no override gets the variant copy as-is.
179
180
  */
180
- export declare const resolveWelcomeCardCopy: (locale: Locale, variant: DockCopyVariant, keyLabel: string, override?: DockCopyOverride) => WelcomeCardCopy;
181
+ export declare const resolveWelcomeCardCopy: (locale: Locale, variant: DockCopyVariant, keyLabel: string, override?: DockCopyOverride, options?: {
182
+ readonly mobile?: boolean;
183
+ readonly voiceAvailable?: boolean;
184
+ }) => WelcomeCardCopy;
181
185
  /**
182
186
  * The empty-state intro body + suggestion chips for a locale + variant,
183
187
  * overridden by the active theme's per-locale `copy` when a tenant supplies
@@ -190,5 +194,7 @@ export type ResolvedWelcomeCopy = {
190
194
  export declare const resolveWelcomeCopy: (locale: Locale, variant: DockCopyVariant, override: DockCopyOverride | undefined) => ResolvedWelcomeCopy;
191
195
  /** Merge the locale-independent step defs with this locale's titles/bodies,
192
196
  * injecting the LIVE voice key label and picking the variant's `/` step. */
193
- export declare const buildTourSteps: (locale: Locale, keyLabel: string, variant: DockCopyVariant) => readonly TourStep[];
197
+ export declare const buildTourSteps: (locale: Locale, keyLabel: string, variant: DockCopyVariant, options?: {
198
+ readonly mobile?: boolean;
199
+ }) => readonly TourStep[];
194
200
  export {};
@@ -0,0 +1,32 @@
1
+ import { DockResizeState } from './dock-layout.ts';
2
+ type DockOpenSize = "expanded" | "fullscreen";
3
+ /** A pending size: an explicit one, or `default` = `open()` with no size. */
4
+ type PendingDockSize = DockOpenSize | "default";
5
+ /** The public `BelongOpenOptions.draft` ceiling. */
6
+ export declare const DOCK_OPEN_DRAFT_MAX_CHARS = 4000;
7
+ /**
8
+ * Record a host open request and notify the dock. Parsed at the host boundary
9
+ * (§4): an invalid request is ignored with one console warning — never a throw
10
+ * into the host page. A request without a draft leaves a still-pending draft
11
+ * in place (it did not ask to cancel it); a newer draft replaces it.
12
+ */
13
+ export declare const requestDockOpen: (options: unknown) => void;
14
+ /** The pending size WITHOUT consuming it — for render-time initializers. */
15
+ export declare const peekPendingDockSize: () => PendingDockSize | null;
16
+ /** Consume the pending size: returned once, then null. */
17
+ export declare const takePendingDockSize: () => PendingDockSize | null;
18
+ /** Consume the pending draft: returned once, then null. */
19
+ export declare const takePendingDockDraft: () => string | null;
20
+ /** Notified once per accepted request; returns an unsubscribe. */
21
+ export declare const subscribeDockOpenRequest: (listener: () => void) => (() => void);
22
+ /**
23
+ * The size a request resolves to from the dock's current one. `default` shows
24
+ * the dock without changing an open size (a collapsed dock opens); an explicit
25
+ * size wins. Fullscreen is a desktop size: on a phone the open sheet already
26
+ * fills the viewport, so it resolves to `expanded` — the same rule the dock's
27
+ * initializer applies to a persisted fullscreen.
28
+ */
29
+ export declare const resolveRequestedDockSize: (requested: PendingDockSize, current: DockResizeState, mobile: boolean) => DockResizeState;
30
+ /** Test-only: nothing pending, no subscribers. */
31
+ export declare const __resetDockOpenRequestForTest: () => void;
32
+ export {};
@@ -5,7 +5,7 @@
5
5
  * in the stream-state store; this module owns only view + size. Best-effort:
6
6
  * disabled/quota'd storage just means no cross-reload restore.
7
7
  */
8
- export type DockView = "chat" | "files" | "scheduled" | "prompts" | "connectors";
8
+ export type DockView = "chat" | "goal" | "files" | "scheduled" | "prompts" | "connectors" | "skills";
9
9
  export type DockSize = "collapsed" | "expanded" | "fullscreen";
10
10
  export type DockState = {
11
11
  readonly view: DockView;
@@ -0,0 +1,9 @@
1
+ import { GoalStatus } from '../api/goals.ts';
2
+ export type GoalActionAvailability = {
3
+ readonly pause: boolean;
4
+ readonly resume: boolean;
5
+ readonly wake: boolean;
6
+ readonly snooze: boolean;
7
+ readonly clear: boolean;
8
+ };
9
+ export declare const goalActionAvailability: (status: GoalStatus) => GoalActionAvailability;
@@ -0,0 +1,36 @@
1
+ import { PostMessageError } from '../stream/belong-chat-transport.ts';
2
+ export type GoalRefusal = {
3
+ readonly kind: "exists";
4
+ } | {
5
+ readonly kind: "disabled";
6
+ } | {
7
+ readonly kind: "cap_user";
8
+ readonly limit: number;
9
+ } | {
10
+ readonly kind: "cap_tenant";
11
+ } | {
12
+ readonly kind: "plan_mode";
13
+ } | {
14
+ readonly kind: "not_sent";
15
+ };
16
+ /**
17
+ * Classify a refused `goal` send. `null` when the error is not a goal
18
+ * refusal at all — the caller's existing stream-error path still owns that.
19
+ *
20
+ * A non-`PostMessageError` means the send never reached the server (a
21
+ * network failure, an aborted fetch, …) — that is always `not_sent`,
22
+ * whatever the JS error happens to be, because the caller only classifies
23
+ * failures of a send IT started (see `handleCreateSendError` in
24
+ * `use-session-goal.ts`). A `PostMessageError` whose status/body the server
25
+ * never documented for `/goal` (a 500 `run_failed`, say) is left to the
26
+ * chat's own generic error surface instead of being misread as a refusal.
27
+ */
28
+ export declare const goalRefusalFromError: (error: unknown) => GoalRefusal | null;
29
+ /**
30
+ * A refused POST, whatever the reason. `PostMessageError.message` embeds the
31
+ * server's status AND its raw body (a wire enum, untranslated English prose,
32
+ * or a Zod issue list) — never show that to a user: the dock renders its own
33
+ * i18n'd fallback instead. The memory note "server prose isn't localized" is
34
+ * exactly this failure, and §42's "reads as breakage" is the cost.
35
+ */
36
+ export declare const isPostMessageRefusal: (error: unknown) => error is PostMessageError;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Ruling 4's exact contract (spec §4/§9) — a goal-transition email carries a
3
+ * button back into the dock: `<base>?belongSession=<id>&belongView=goal`
4
+ * (`goalDeepLinkUrl` on the cloud side builds it; this reads it). Two rules:
5
+ * the param names are `belongSession` and `belongView` — a typo on either
6
+ * side is a link that silently does nothing — and the params are STRIPPED
7
+ * once read, so a reload of the dock does not yank the user back into a
8
+ * goal they have already looked at.
9
+ *
10
+ * `view` is accepted ONLY when it is exactly `"goal"` — no other value is a
11
+ * link this reader recognizes — so `GoalDeepLink` can carry the literal type
12
+ * rather than a wider `EmbedView`, and a caller never has to re-check it.
13
+ * Any other combination (missing `belongSession`, missing/mismatched
14
+ * `belongView`, or no params at all) returns `null` and leaves the query
15
+ * string untouched — a page whose query string was never ours to rewrite.
16
+ */
17
+ export type GoalDeepLink = {
18
+ readonly sessionId: string;
19
+ readonly view: "goal";
20
+ };
21
+ export declare const consumeGoalDeepLink: (location: {
22
+ readonly search: string;
23
+ readonly replaceSearch: (next: string) => void;
24
+ }) => GoalDeepLink | null;
@@ -0,0 +1,25 @@
1
+ import { GoalActionOutcome, GoalEditInput } from '../api/goals.ts';
2
+ import { BuiltinCommand } from './slash-commands.ts';
3
+ /** The three `/goal` sub-commands that map onto `POST .../goal/edit`. */
4
+ type GoalEditCommand = Extract<BuiltinCommand, {
5
+ readonly action: "edit";
6
+ } | {
7
+ readonly action: "turns";
8
+ } | {
9
+ readonly action: "budget";
10
+ }>;
11
+ /** `editSessionGoal`'s full outcome union, including the client-only
12
+ * `"no_change"` case (`api/goals.ts`'s 400 `goal_edit_no_change` mapping). */
13
+ type GoalEditOutcome = GoalActionOutcome | {
14
+ readonly status: "no_change";
15
+ };
16
+ type GoalEditNoticeKey = "goal.revived" | "goal.edited" | "goal.notEditable" | "goal.editUsage" | "goal.none" | "goal.disabled" | "goal.error";
17
+ /** Command → `POST .../goal/edit` request body. */
18
+ export declare const goalEditRequestBody: (command: GoalEditCommand) => GoalEditInput;
19
+ /**
20
+ * `editSessionGoal` outcome → the i18n key for the local notice. A `revived`
21
+ * edit (a raised cap that un-stalled a `budget_limited` goal) gets its own
22
+ * copy distinct from a plain edit — see `GoalActionOutcome`'s `revived` flag.
23
+ */
24
+ export declare const goalEditNoticeKey: (outcome: GoalEditOutcome) => GoalEditNoticeKey;
25
+ export {};
@@ -0,0 +1,53 @@
1
+ import { GoalJournalEntry } from '../api/goals.ts';
2
+ /**
3
+ * A status change is named by the status it reached — the dock already has
4
+ * localized words for all twelve, and "blocked" tells the reader more than
5
+ * "transition" ever could. Everything else is named by its kind.
6
+ *
7
+ * `deferred` is the one exception (final review, Medium 2). `statusLabel`
8
+ * words are written for the PILL, where they answer "what is this goal doing
9
+ * right now": "waiting for a time" is right there and wrong in a history,
10
+ * where each line is something that HAPPENED at a named moment — and, since
11
+ * `/goal snooze` now writes no note, that label would be the whole line.
12
+ * The kind's own "Went to sleep" reads as an event, which is what the
13
+ * timeline is made of.
14
+ */
15
+ export declare const goalJournalLabelKey: (entry: GoalJournalEntry) => string;
16
+ /**
17
+ * An entry earns a line when it SAYS something: it changed the status, or it
18
+ * carries a note. A bare accounting row (kind `turn`, no note, no status
19
+ * move) is bookkeeping — putting it in History would push the things that
20
+ * actually happened out of a ten-row window.
21
+ */
22
+ export declare const visibleGoalJournal: (journal: readonly GoalJournalEntry[] | undefined) => readonly GoalJournalEntry[];
23
+ export type GoalJournalDay = {
24
+ readonly key: string;
25
+ readonly entries: readonly GoalJournalEntry[];
26
+ };
27
+ /**
28
+ * Local calendar day key (yyyy-mm-dd) for `date`, in the VIEWER's zone —
29
+ * not `toISOString()`, which is UTC and would put a 21:00 local entry on
30
+ * tomorrow's list for half the world. Shared by `groupGoalJournalByDay` and
31
+ * `isYesterdayKey` so both use one definition of "day".
32
+ */
33
+ export declare const goalDayKey: (date: Date) => string;
34
+ /**
35
+ * True when `dayKey` (as produced by `goalDayKey`) names the calendar day
36
+ * immediately before `now`'s day, in the viewer's zone. Backs the
37
+ * Timeline's "Yesterday" heading (appendix B "Timeline": `Today`,
38
+ * `Yesterday`, `Sep 12`). Walks `now` back one calendar day via the `Date`
39
+ * constructor's day-of-month rollover rather than subtracting 24h of
40
+ * milliseconds, so a DST-transition day still lands on the correct date.
41
+ */
42
+ export declare const isYesterdayKey: (dayKey: string, now: Date) => boolean;
43
+ /**
44
+ * Day buckets for the History timeline (appendix B "Timeline"), computed in
45
+ * the VIEWER's zone — the reader's "today" is the only one that matters, and
46
+ * the server's midnight is not it. `now` is injected (§25) so "Today" is
47
+ * testable.
48
+ *
49
+ * An entry whose `at` will not parse keeps its place in the list rather than
50
+ * disappearing: losing a line of history to a bad timestamp is a §41 loss,
51
+ * and the label is the load-bearing half of the row anyway.
52
+ */
53
+ export declare const groupGoalJournalByDay: (entries: readonly GoalJournalEntry[], now: Date) => readonly GoalJournalDay[];
@@ -0,0 +1,2 @@
1
+ import { GoalStatus } from '../api/goals.ts';
2
+ export declare const isLiveGoalStatus: (status: GoalStatus) => boolean;
@@ -0,0 +1,35 @@
1
+ import { GoalView } from '../api/goals.ts';
2
+ export type GoalElapsed = {
3
+ readonly kind: "just_started";
4
+ } | {
5
+ readonly kind: "minutes";
6
+ readonly minutes: number;
7
+ } | {
8
+ readonly kind: "hours";
9
+ readonly hours: number;
10
+ readonly minutes: number;
11
+ } | {
12
+ readonly kind: "days";
13
+ readonly days: number;
14
+ };
15
+ export declare const goalElapsed: (input: {
16
+ readonly startedAt: string | null | undefined;
17
+ readonly now: Date;
18
+ }) => GoalElapsed | null;
19
+ /** Turns left, but only once the cap is close enough that the number changes
20
+ * what the reader does about it. `null` otherwise, and `null` for a cap of
21
+ * zero (never a division by it — §10). */
22
+ export declare const goalTurnsRemaining: (goal: Pick<GoalView, "turnsUsed" | "maxTurns">) => number | null;
23
+ /**
24
+ * The runway's plain numbers read straight off the goal's OWN stored caps,
25
+ * never a preset name — task-15 review, Low 4. `GoalSetCard` used to fall
26
+ * back to `runway ?? "normal"` for a pre-0071 row (`runway: null`), which
27
+ * labeled a goal that actually carries the Long preset's numbers as "Normal".
28
+ * When there is no preset to name honestly, describe the ACTUAL caps in the
29
+ * same steps-and-days vocabulary `goal-runway.ts`'s preset copy uses (spec
30
+ * ruling 1) instead of claiming a preset the row doesn't carry.
31
+ */
32
+ export declare const goalRunwayPlain: (goal: Pick<GoalView, "maxTurns" | "maxActiveSeconds">) => {
33
+ readonly steps: number;
34
+ readonly days: number;
35
+ };
@@ -0,0 +1,15 @@
1
+ import { GoalView } from '../api/goals.ts';
2
+ export type GoalProgressModel = {
3
+ readonly percent: number;
4
+ readonly band: "barely" | "normal" | "almost_out";
5
+ readonly turnsUsed: number;
6
+ readonly maxTurns: number;
7
+ readonly runningSeconds: number;
8
+ readonly exact: {
9
+ readonly tokensUsed: number;
10
+ readonly tokenBudget: number;
11
+ readonly activeSeconds: number;
12
+ readonly maxActiveSeconds: number;
13
+ };
14
+ };
15
+ export declare const goalProgressModel: (goal: GoalView) => GoalProgressModel;