auricui-skill 0.0.0-stage → 0.1.2

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 (362) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +29 -2
  3. package/bin/install.mjs +66 -0
  4. package/package.json +29 -4
  5. package/skill/SKILL.md +64 -0
  6. package/skill/agents/openai.yaml +4 -0
  7. package/skill/assets/examples/ApprovalCard.tsx +8 -0
  8. package/skill/assets/examples/BasicApp.tsx +38 -0
  9. package/skill/assets/examples/BriefingCard.tsx +8 -0
  10. package/skill/assets/examples/ChatControls.tsx +49 -0
  11. package/skill/assets/examples/ChatPanel.tsx +73 -0
  12. package/skill/assets/examples/Checkbox.tsx +13 -0
  13. package/skill/assets/examples/Combobox.tsx +14 -0
  14. package/skill/assets/examples/Drawer.tsx +10 -0
  15. package/skill/assets/examples/MemoryCard.tsx +9 -0
  16. package/skill/assets/examples/MessageList.tsx +8 -0
  17. package/skill/assets/examples/Theme.tsx +14 -0
  18. package/skill/assets/examples/ToolCall.tsx +8 -0
  19. package/skill/assets/examples/Tree.tsx +15 -0
  20. package/skill/assets/examples/examples.css +11 -0
  21. package/skill/assets/library/auricui-0.1.0-preview.1.tgz +0 -0
  22. package/skill/assets/library/auricui-0.1.0-preview.3.tgz +0 -0
  23. package/skill/assets/library/auricui-0.1.0-preview.4.tgz +0 -0
  24. package/skill/assets/upstream/LICENSE +21 -0
  25. package/skill/assets/upstream/apps/desktop/chat/src/App.tsx +1099 -0
  26. package/skill/assets/upstream/apps/desktop/chat/src/app-bridge.ts +154 -0
  27. package/skill/assets/upstream/apps/desktop/chat/src/chat.css +1812 -0
  28. package/skill/assets/upstream/apps/desktop/chat/src/components/AddSkill.tsx +223 -0
  29. package/skill/assets/upstream/apps/desktop/chat/src/components/AgentActivityRow.tsx +716 -0
  30. package/skill/assets/upstream/apps/desktop/chat/src/components/AgentIcons.tsx +46 -0
  31. package/skill/assets/upstream/apps/desktop/chat/src/components/AttachmentCard.tsx +34 -0
  32. package/skill/assets/upstream/apps/desktop/chat/src/components/AttachmentPreview.tsx +331 -0
  33. package/skill/assets/upstream/apps/desktop/chat/src/components/BalanceNotice.tsx +22 -0
  34. package/skill/assets/upstream/apps/desktop/chat/src/components/BrandLogo.tsx +35 -0
  35. package/skill/assets/upstream/apps/desktop/chat/src/components/ComposerCard.tsx +182 -0
  36. package/skill/assets/upstream/apps/desktop/chat/src/components/ConversationSessionBar.tsx +292 -0
  37. package/skill/assets/upstream/apps/desktop/chat/src/components/CopyDiagnostics.tsx +24 -0
  38. package/skill/assets/upstream/apps/desktop/chat/src/components/Divider.tsx +47 -0
  39. package/skill/assets/upstream/apps/desktop/chat/src/components/FileChangesList.tsx +119 -0
  40. package/skill/assets/upstream/apps/desktop/chat/src/components/Markdown.tsx +198 -0
  41. package/skill/assets/upstream/apps/desktop/chat/src/components/ModelPopover.tsx +280 -0
  42. package/skill/assets/upstream/apps/desktop/chat/src/components/NoticeCard.tsx +87 -0
  43. package/skill/assets/upstream/apps/desktop/chat/src/components/Popover.tsx +195 -0
  44. package/skill/assets/upstream/apps/desktop/chat/src/components/PreviewFrame.tsx +129 -0
  45. package/skill/assets/upstream/apps/desktop/chat/src/components/ProjectConversation.tsx +852 -0
  46. package/skill/assets/upstream/apps/desktop/chat/src/components/ProjectStarters.tsx +118 -0
  47. package/skill/assets/upstream/apps/desktop/chat/src/components/Tooltip.tsx +191 -0
  48. package/skill/assets/upstream/apps/desktop/chat/src/components/TurnLog.tsx +583 -0
  49. package/skill/assets/upstream/apps/desktop/chat/src/components/TurnQuestionCard.tsx +133 -0
  50. package/skill/assets/upstream/apps/desktop/chat/src/components/dock-pane-bar.ts +14 -0
  51. package/skill/assets/upstream/apps/desktop/chat/src/components/project-version.ts +37 -0
  52. package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/MentionMenuPlugin.tsx +372 -0
  53. package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/PromptEditor.tsx +476 -0
  54. package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/PromptPill.tsx +399 -0
  55. package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/PromptReferenceNode.tsx +164 -0
  56. package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/index.ts +31 -0
  57. package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/mention-menu.ts +206 -0
  58. package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/prompt-text.ts +171 -0
  59. package/skill/assets/upstream/apps/desktop/chat/src/components/useStickToBottom.ts +320 -0
  60. package/skill/assets/upstream/apps/desktop/chat/src/components/useTicker.ts +55 -0
  61. package/skill/assets/upstream/apps/desktop/chat/src/i18n/index.ts +42 -0
  62. package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/en-US.ts +408 -0
  63. package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/es.ts +407 -0
  64. package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/ja.ts +407 -0
  65. package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/ko.ts +403 -0
  66. package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/words.ts +6 -0
  67. package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/zh-CN.ts +407 -0
  68. package/skill/assets/upstream/apps/desktop/chat/src/i18n/lookup.ts +12 -0
  69. package/skill/assets/upstream/apps/desktop/chat/src/lib/agent-activity-runs.ts +154 -0
  70. package/skill/assets/upstream/apps/desktop/chat/src/lib/agent-menu-rows.ts +41 -0
  71. package/skill/assets/upstream/apps/desktop/chat/src/lib/agent-refs.ts +105 -0
  72. package/skill/assets/upstream/apps/desktop/chat/src/lib/agent-transcript.ts +440 -0
  73. package/skill/assets/upstream/apps/desktop/chat/src/lib/asset-lists.ts +75 -0
  74. package/skill/assets/upstream/apps/desktop/chat/src/lib/attachment-place.ts +17 -0
  75. package/skill/assets/upstream/apps/desktop/chat/src/lib/balance.ts +16 -0
  76. package/skill/assets/upstream/apps/desktop/chat/src/lib/chat-layer.ts +10 -0
  77. package/skill/assets/upstream/apps/desktop/chat/src/lib/chat-menu.ts +18 -0
  78. package/skill/assets/upstream/apps/desktop/chat/src/lib/chat-store.ts +101 -0
  79. package/skill/assets/upstream/apps/desktop/chat/src/lib/composer-attachments.ts +189 -0
  80. package/skill/assets/upstream/apps/desktop/chat/src/lib/desktop-attachments.ts +178 -0
  81. package/skill/assets/upstream/apps/desktop/chat/src/lib/desktop-bridge.ts +291 -0
  82. package/skill/assets/upstream/apps/desktop/chat/src/lib/developer.ts +39 -0
  83. package/skill/assets/upstream/apps/desktop/chat/src/lib/esc-stop.ts +23 -0
  84. package/skill/assets/upstream/apps/desktop/chat/src/lib/file-changes.ts +32 -0
  85. package/skill/assets/upstream/apps/desktop/chat/src/lib/live-activity.ts +20 -0
  86. package/skill/assets/upstream/apps/desktop/chat/src/lib/local-agent-run.ts +1174 -0
  87. package/skill/assets/upstream/apps/desktop/chat/src/lib/local-sessions.ts +25 -0
  88. package/skill/assets/upstream/apps/desktop/chat/src/lib/model-calls.ts +87 -0
  89. package/skill/assets/upstream/apps/desktop/chat/src/lib/pretty-json.ts +12 -0
  90. package/skill/assets/upstream/apps/desktop/chat/src/lib/preview-top.ts +15 -0
  91. package/skill/assets/upstream/apps/desktop/chat/src/lib/project-resources.ts +66 -0
  92. package/skill/assets/upstream/apps/desktop/chat/src/lib/project-sessions.ts +66 -0
  93. package/skill/assets/upstream/apps/desktop/chat/src/lib/project-versions.ts +116 -0
  94. package/skill/assets/upstream/apps/desktop/chat/src/lib/ref-pictures.ts +119 -0
  95. package/skill/assets/upstream/apps/desktop/chat/src/lib/relative-time.ts +46 -0
  96. package/skill/assets/upstream/apps/desktop/chat/src/lib/skill-pages.ts +29 -0
  97. package/skill/assets/upstream/apps/desktop/chat/src/lib/step-file.ts +23 -0
  98. package/skill/assets/upstream/apps/desktop/chat/src/lib/structural-share.ts +52 -0
  99. package/skill/assets/upstream/apps/desktop/chat/src/lib/studio-film.ts +44 -0
  100. package/skill/assets/upstream/apps/desktop/chat/src/lib/studio-transfer.ts +40 -0
  101. package/skill/assets/upstream/apps/desktop/chat/src/lib/unprompted.ts +27 -0
  102. package/skill/assets/upstream/apps/desktop/chat/src/lib/upload-limits.ts +53 -0
  103. package/skill/assets/upstream/apps/desktop/chat/src/mount.tsx +19 -0
  104. package/skill/assets/upstream/apps/desktop/chat/src/state/local-agent-store.ts +296 -0
  105. package/skill/assets/upstream/apps/desktop/chat/src/studio-refs.ts +307 -0
  106. package/skill/assets/upstream/apps/desktop/package.json +51 -0
  107. package/skill/assets/upstream/apps/desktop/shell/bridge.ts +415 -0
  108. package/skill/assets/upstream/apps/desktop/shell/index.html +27 -0
  109. package/skill/assets/upstream/apps/desktop/shell/main.tsx +17 -0
  110. package/skill/assets/upstream/apps/desktop/shell/shell.css +17 -0
  111. package/skill/assets/upstream/apps/desktop/shell/vite.config.ts +65 -0
  112. package/skill/assets/upstream/apps/desktop/src/agent-definitions.mjs +31 -0
  113. package/skill/assets/upstream/packages/openfilm/LICENSE +21 -0
  114. package/skill/assets/upstream/packages/openfilm/package.json +88 -0
  115. package/skill/assets/upstream/packages/openfilm/src/film-doc.d.mts +125 -0
  116. package/skill/assets/upstream/packages/openfilm/src/film-doc.mjs +986 -0
  117. package/skill/assets/upstream/packages/openfilm/src/overrides.mjs +73 -0
  118. package/skill/assets/upstream/packages/openfilm/src/timeline.mjs +1280 -0
  119. package/skill/assets/upstream/packages/openfilm/studio/server/bridge.js +209 -0
  120. package/skill/assets/upstream/packages/openfilm/studio/server/film-subtitle.mjs +785 -0
  121. package/skill/assets/upstream/packages/openfilm/studio/server/ops.mjs +403 -0
  122. package/skill/assets/upstream/packages/openfilm/studio/server/stage.js +1649 -0
  123. package/skill/assets/upstream/packages/openfilm/studio/server/track-layout.mjs +43 -0
  124. package/skill/assets/upstream/packages/openfilm/studio/ui/src/App.tsx +156 -0
  125. package/skill/assets/upstream/packages/openfilm/studio/ui/src/api.ts +328 -0
  126. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/AudioMeters.tsx +188 -0
  127. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/BlockThumbs.tsx +84 -0
  128. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/BlockWaveform.tsx +201 -0
  129. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/BrandLoadingScreen.tsx +56 -0
  130. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/BrandLogo.tsx +25 -0
  131. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Card.tsx +89 -0
  132. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ColorPicker.tsx +204 -0
  133. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ConfirmDialog.tsx +96 -0
  134. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ContextMenu.tsx +422 -0
  135. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/DesktopDialog.tsx +271 -0
  136. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ExamplesGallery.tsx +372 -0
  137. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FilmFullscreenBar.tsx +147 -0
  138. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FilmInspector.tsx +2310 -0
  139. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FilmStageSelect.tsx +3296 -0
  140. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FocusNav.tsx +28 -0
  141. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FontFamilyPicker.tsx +293 -0
  142. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FramePicker.tsx +69 -0
  143. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/InspectorPanel.tsx +25 -0
  144. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Launcher.tsx +38 -0
  145. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/LayersPanel.tsx +277 -0
  146. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/LiveTime.tsx +101 -0
  147. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/MediaPool.tsx +1413 -0
  148. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/MediaPreview.tsx +188 -0
  149. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/MenuSelect.tsx +161 -0
  150. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/MgOutline.tsx +24 -0
  151. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/OperationHistory.tsx +184 -0
  152. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/PaneDivider.tsx +292 -0
  153. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/PasteAttrsDialog.tsx +69 -0
  154. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/PlaybackMenu.tsx +110 -0
  155. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Popover.tsx +159 -0
  156. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectCover.tsx +60 -0
  157. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectHistoryControls.tsx +748 -0
  158. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectLayoutMenu.tsx +82 -0
  159. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectMenu.tsx +111 -0
  160. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectSources.tsx +587 -0
  161. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectView.tsx +3222 -0
  162. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectsLibrary.tsx +567 -0
  163. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectsView.tsx +1593 -0
  164. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/PropertiesSection.tsx +418 -0
  165. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ResourceInspector.tsx +100 -0
  166. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SelectionToolbar.tsx +157 -0
  167. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SkillsLibrary.tsx +504 -0
  168. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SourcePreview.tsx +464 -0
  169. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SpendAsks.tsx +88 -0
  170. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/StageMaskOverlay.tsx +299 -0
  171. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/StageTransformFrame.tsx +246 -0
  172. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SubtitleInspector.module.css +46 -0
  173. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SubtitleInspector.tsx +884 -0
  174. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SubtitleOverlay.tsx +148 -0
  175. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SubtitleRow.tsx +419 -0
  176. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/TabStrip.tsx +188 -0
  177. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Timeline.tsx +4911 -0
  178. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/TimelineMarkers.tsx +329 -0
  179. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Toast.tsx +55 -0
  180. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Tooltip.tsx +193 -0
  181. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/UpdateButton.tsx +104 -0
  182. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ViewerBar.tsx +98 -0
  183. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/WhatsNew.tsx +147 -0
  184. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/dock-pane-bar.ts +16 -0
  185. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/export/ExportCenter.tsx +1502 -0
  186. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/export/ExportTray.tsx +284 -0
  187. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/film-stage-hit.ts +18 -0
  188. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/inspector-fields.tsx +863 -0
  189. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/inspector-look.tsx +1357 -0
  190. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/player-controls/controls-bar.tsx +397 -0
  191. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/player-controls/transport.tsx +294 -0
  192. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/replace-drop.ts +20 -0
  193. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/AgentsSection.tsx +613 -0
  194. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/CustomServices.tsx +104 -0
  195. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/DiagnosticsGroup.tsx +202 -0
  196. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ModelsSection.tsx +179 -0
  197. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ProviderMark.tsx +24 -0
  198. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ProvidersSection.tsx +177 -0
  199. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/SettingsModal.tsx +511 -0
  200. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/SettingsSelect.tsx +84 -0
  201. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ShortcutsSection.tsx +291 -0
  202. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/StorageGroup.tsx +119 -0
  203. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/theme.ts +47 -0
  204. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ui.tsx +139 -0
  205. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/use-settings.ts +10 -0
  206. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/stage-menu.tsx +283 -0
  207. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/timeline-head-extras.tsx +91 -0
  208. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/typing-target.ts +45 -0
  209. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/use-editor-tools.tsx +408 -0
  210. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/use-page-changes.ts +48 -0
  211. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/use-project-history.ts +113 -0
  212. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/useBlockDrag.ts +639 -0
  213. package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/Preview.tsx +426 -0
  214. package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/player.ts +558 -0
  215. package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/preview-frames.ts +36 -0
  216. package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/steps.ts +36 -0
  217. package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/undo.ts +156 -0
  218. package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/use-film.ts +212 -0
  219. package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/use-preview-renders.ts +89 -0
  220. package/skill/assets/upstream/packages/openfilm/studio/ui/src/globals.css +559 -0
  221. package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/en.ts +1901 -0
  222. package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/es.ts +1900 -0
  223. package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/index.ts +130 -0
  224. package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/ja.ts +1900 -0
  225. package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/ko.ts +1896 -0
  226. package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/words.ts +6 -0
  227. package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/zh-CN.ts +1901 -0
  228. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/agent-row.ts +21 -0
  229. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/asset-timeline.ts +469 -0
  230. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/audio-levels.ts +60 -0
  231. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/batch-map.ts +28 -0
  232. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/browser.ts +10 -0
  233. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/canvas-fit.ts +116 -0
  234. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/chat-marks.ts +114 -0
  235. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-attrs.ts +102 -0
  236. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-fade.ts +70 -0
  237. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-look.ts +520 -0
  238. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-mask.ts +536 -0
  239. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-replace.ts +60 -0
  240. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/component-props.ts +128 -0
  241. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/context-length.ts +12 -0
  242. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/desktop-build.ts +44 -0
  243. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/diagnostics.ts +68 -0
  244. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/double-press.ts +22 -0
  245. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/dropped-overrides.ts +139 -0
  246. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/export-jobs.ts +191 -0
  247. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/export-spec.ts +261 -0
  248. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/field-input.ts +155 -0
  249. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film-clip-edits.ts +82 -0
  250. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film-frame.ts +134 -0
  251. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film-overrides.ts +107 -0
  252. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film-shape.ts +172 -0
  253. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film.ts +80 -0
  254. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/font-menu.ts +236 -0
  255. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/font-styles.ts +129 -0
  256. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/freeze-frame.ts +49 -0
  257. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/host.ts +438 -0
  258. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/inspect-scrub.ts +26 -0
  259. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/keymap-store.ts +74 -0
  260. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/keymap.ts +529 -0
  261. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/layers-tree.ts +133 -0
  262. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/look.ts +83 -0
  263. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/loudness.ts +58 -0
  264. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/markers.ts +152 -0
  265. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-bar.ts +58 -0
  266. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-folders.ts +45 -0
  267. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-place.ts +102 -0
  268. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-queue.ts +107 -0
  269. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-selection.ts +64 -0
  270. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/menu-position.ts +77 -0
  271. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/mg-transform.ts +111 -0
  272. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/mixed.ts +3 -0
  273. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/page-changes.ts +45 -0
  274. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/picture-files.ts +19 -0
  275. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/preview-prefs.ts +46 -0
  276. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/preview-renders.ts +71 -0
  277. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/project-delete.ts +20 -0
  278. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/project-folders.ts +144 -0
  279. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/project-history.ts +188 -0
  280. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/project-sources.ts +283 -0
  281. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/projects-page.ts +40 -0
  282. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/provider-marks.ts +35 -0
  283. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/providers.ts +163 -0
  284. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/resource-drag.ts +131 -0
  285. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/retry-image.ts +17 -0
  286. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/saved-insert.ts +40 -0
  287. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/saved.ts +125 -0
  288. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/selection-toolbar.ts +158 -0
  289. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/shortcut-hint.ts +21 -0
  290. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/similar-layers.ts +46 -0
  291. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/solo.ts +19 -0
  292. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-clip.ts +60 -0
  293. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-crop.ts +232 -0
  294. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-gesture.ts +277 -0
  295. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-layers.ts +71 -0
  296. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-mask.ts +176 -0
  297. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-measure.ts +53 -0
  298. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-types.ts +155 -0
  299. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/studio-refs.ts +248 -0
  300. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/studio-version.ts +41 -0
  301. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/subtitle-cues.ts +238 -0
  302. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/subtitles.ts +263 -0
  303. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/tab-menu.ts +6 -0
  304. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/template-controls.ts +131 -0
  305. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/theme-changes.ts +31 -0
  306. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/thumb-cache.ts +63 -0
  307. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/thumb-cell.ts +8 -0
  308. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/thumb-frame.ts +76 -0
  309. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/thumb-pick.ts +42 -0
  310. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timecode.ts +161 -0
  311. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-clipboard.ts +279 -0
  312. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-drag.ts +589 -0
  313. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-edit.ts +1138 -0
  314. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-keys.ts +63 -0
  315. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-layout.ts +1038 -0
  316. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-nav.ts +160 -0
  317. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-prefs.ts +73 -0
  318. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-split.ts +40 -0
  319. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-view.ts +105 -0
  320. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/title.ts +39 -0
  321. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/track-heights.ts +55 -0
  322. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/track-lock.ts +27 -0
  323. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/transitions.ts +459 -0
  324. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/type-metrics.ts +83 -0
  325. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-film-subtitles.ts +111 -0
  326. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-fonts.ts +181 -0
  327. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-loaded-thumbs.ts +91 -0
  328. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-subtitle-edits.ts +134 -0
  329. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-subtitle-font.ts +51 -0
  330. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-subtitle-style.ts +68 -0
  331. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/waveform-columns.ts +48 -0
  332. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/web-update.ts +41 -0
  333. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/whats-new.ts +401 -0
  334. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/workspace-resources.ts +373 -0
  335. package/skill/assets/upstream/packages/openfilm/studio/ui/src/main.tsx +10 -0
  336. package/skill/assets/upstream/packages/openfilm/studio/ui/vite.config.ts +12 -0
  337. package/skill/assets/upstream/packages/shared/package.json +45 -0
  338. package/skill/assets/upstream/packages/shared/src/agent-activity.ts +263 -0
  339. package/skill/assets/upstream/packages/shared/src/contract.ts +285 -0
  340. package/skill/assets/upstream/packages/shared/src/index.ts +17 -0
  341. package/skill/assets/upstream/packages/shared/src/markdown-blocks.ts +252 -0
  342. package/skill/assets/upstream/packages/shared/src/modality.ts +4 -0
  343. package/skill/assets/upstream/packages/shared/src/prompt-reference.ts +113 -0
  344. package/skill/assets/upstream/packages/shared/src/title.ts +76 -0
  345. package/skill/assets/upstream/packages/shared/src/turn.ts +68 -0
  346. package/skill/assets/upstream/packages/shared/src/video.ts +26 -0
  347. package/skill/references/agent-components.md +33 -0
  348. package/skill/references/api-index.json +2693 -0
  349. package/skill/references/chat-components.md +65 -0
  350. package/skill/references/components.md +23 -0
  351. package/skill/references/core-components.md +44 -0
  352. package/skill/references/dependencies.md +22 -0
  353. package/skill/references/esm-package.md +48 -0
  354. package/skill/references/integration.md +43 -0
  355. package/skill/references/library-manifest.json +12 -0
  356. package/skill/references/source-manifest.json +325 -0
  357. package/skill/references/studio-components.md +24 -0
  358. package/skill/references/theme-motion.md +49 -0
  359. package/skill/references/troubleshooting.md +27 -0
  360. package/skill/references/verification.md +13 -0
  361. package/skill/scripts/check_dependencies.py +109 -0
  362. package/skill/scripts/inspect_api.py +60 -0
@@ -0,0 +1,252 @@
1
+ /**
2
+ * Markdown → blocks and inline pieces: parsing only, no DOM; each view decides its own sizes and colors.
3
+ *
4
+ * Deliberately not CommonMark: a chat reply grows token by token and is parsed again each time, so the rules are small.
5
+ * Half-written syntax (an open ``` fence, a lone `**`) reads as not finished yet: plain text for now, never an error.
6
+ */
7
+
8
+ export type MarkdownBlock =
9
+ | { kind: 'heading'; level: number; text: string; id: string }
10
+ | { kind: 'paragraph'; text: string }
11
+ | { kind: 'quote'; text: string }
12
+ /** `start`: an ordered list's first number, when not 1 (items split by blank lines would all read "1."). */
13
+ | { kind: 'list'; ordered: boolean; lines: string[]; start?: number }
14
+ | { kind: 'code'; language: string; text: string }
15
+ | { kind: 'table'; rows: string[][] }
16
+ | { kind: 'hr' };
17
+
18
+ /** What ends a paragraph: the line starts a block of another kind. */
19
+ const BLOCK_START = /^(#{1,6}\s|```|[-*]\s|\d+\.\s|\||>)/;
20
+
21
+ /** A block and the line it starts on (incremental parsing rescans from there). */
22
+ export interface ScannedBlock {
23
+ block: MarkdownBlock;
24
+ startLine: number;
25
+ }
26
+
27
+ function headingSlugBase(text: string): string {
28
+ return text.trim().toLowerCase()
29
+ .replace(/[^\w\u4e00-\u9fff]+/g, '-')
30
+ .replace(/^-|-$/g, '') || 'section';
31
+ }
32
+
33
+ /**
34
+ * Scans from line `from` to the end (starting midway keeps unchanged blocks as the same objects; see rescanMarkdown).
35
+ * `priorHeadings` are the kept headings' texts, so heading ids stay unique across the whole text.
36
+ */
37
+ export function scanMarkdownBlocks(
38
+ lines: string[],
39
+ from = 0,
40
+ priorHeadings: readonly string[] = [],
41
+ ): ScannedBlock[] {
42
+ const blocks: ScannedBlock[] = [];
43
+ const slugCount = new Map<string, number>();
44
+ for (const heading of priorHeadings) {
45
+ const base = headingSlugBase(heading);
46
+ slugCount.set(base, (slugCount.get(base) ?? 0) + 1);
47
+ }
48
+ let start = from;
49
+ const push = (block: MarkdownBlock) => { blocks.push({ block, startLine: start }); };
50
+ const pushHeading = (level: number, raw: string) => {
51
+ const clean = raw.trim();
52
+ const base = headingSlugBase(clean);
53
+ const n = slugCount.get(base) ?? 0;
54
+ slugCount.set(base, n + 1);
55
+ push({ kind: 'heading', level, text: clean, id: n ? `${base}-${n + 1}` : base });
56
+ };
57
+ let i = from;
58
+ while (i < lines.length) {
59
+ const raw = lines[i] ?? '';
60
+ const trimmed = raw.trim();
61
+ if (!trimmed) { i += 1; continue; }
62
+ // blank lines belong to no block: a block starts on this line
63
+ start = i;
64
+ if (trimmed.startsWith('```')) {
65
+ const language = trimmed.slice(3).trim();
66
+ const code: string[] = [];
67
+ i += 1;
68
+ // an unclosed fence runs to the end: normal while streaming
69
+ while (i < lines.length && !(lines[i] ?? '').trim().startsWith('```')) {
70
+ code.push(lines[i] ?? '');
71
+ i += 1;
72
+ }
73
+ i += 1;
74
+ push({ kind: 'code', language, text: code.join('\n') });
75
+ continue;
76
+ }
77
+ if (/^---+$/.test(trimmed)) { push({ kind: 'hr' }); i += 1; continue; }
78
+ const heading = /^(#{1,6})\s+(\S.*)$/.exec(trimmed);
79
+ if (heading) { pushHeading(heading[1]!.length, heading[2]!); i += 1; continue; }
80
+ if (trimmed.startsWith('>')) {
81
+ const quoted: string[] = [];
82
+ while (i < lines.length) {
83
+ const ct = (lines[i] ?? '').trim();
84
+ if (!ct.startsWith('>')) break;
85
+ // one level only: a nested `>` stays in the text
86
+ quoted.push(ct.replace(/^>\s?/, ''));
87
+ i += 1;
88
+ }
89
+ push({ kind: 'quote', text: quoted.join('\n').trim() });
90
+ continue;
91
+ }
92
+ if (trimmed.startsWith('|') && trimmed.endsWith('|') && i + 1 < lines.length) {
93
+ const sep = (lines[i + 1] ?? '').trim();
94
+ if (/^\|[\s:-]+\|/.test(sep)) {
95
+ const rows: string[][] = [];
96
+ while (i < lines.length) {
97
+ const row = (lines[i] ?? '').trim();
98
+ if (!row.startsWith('|') || !row.endsWith('|')) break;
99
+ if (/^\|[\s:-]+\|/.test(row)) { i += 1; continue; }
100
+ rows.push(row.replace(/^\||\|$/g, '').split('|').map((c) => c.trim()));
101
+ i += 1;
102
+ }
103
+ push({ kind: 'table', rows });
104
+ continue;
105
+ }
106
+ }
107
+ if (/^[-*]\s/.test(trimmed) || /^\d+\.\s/.test(trimmed)) {
108
+ const ordered = /^\d+\.\s/.test(trimmed);
109
+ const start = ordered ? Number(/^(\d+)\./.exec(trimmed)![1]) : 1;
110
+ const acc: string[] = [];
111
+ while (i < lines.length) {
112
+ const ct = (lines[i] ?? '').trim();
113
+ if (ordered ? /^\d+\.\s/.test(ct) : /^[-*]\s/.test(ct)) {
114
+ acc.push(ct.replace(ordered ? /^\d+\.\s/ : /^[-*]\s/, ''));
115
+ i += 1;
116
+ } else break;
117
+ }
118
+ push({ kind: 'list', ordered, lines: acc, ...(ordered && start !== 1 ? { start } : {}) });
119
+ continue;
120
+ }
121
+ const para = [trimmed];
122
+ i += 1;
123
+ while (i < lines.length) {
124
+ const ct = (lines[i] ?? '').trim();
125
+ if (!ct || BLOCK_START.test(ct)) break;
126
+ para.push(ct);
127
+ i += 1;
128
+ }
129
+ // newlines inside a paragraph are kept: whether they are spaces or breaks is the view's choice
130
+ push({ kind: 'paragraph', text: para.join('\n') });
131
+ }
132
+ return blocks;
133
+ }
134
+
135
+ /** A scan and the text it was made from (the next scan checks whether it can continue). */
136
+ export interface MarkdownScan {
137
+ text: string;
138
+ blocks: ScannedBlock[];
139
+ }
140
+
141
+ /**
142
+ * The first block that must be rescanned: the ones before it cannot change, whatever is appended.
143
+ *
144
+ * Only a boundary at a blank line is stable (a list can still grow when its next line becomes `- item`); headings and
145
+ * rules are one line, so the boundary after them is stable too. With no stable boundary, everything is rescanned.
146
+ */
147
+ function frozenBefore(blocks: readonly ScannedBlock[], lines: readonly string[]): number {
148
+ for (let k = blocks.length - 1; k > 0; k -= 1) {
149
+ const kind = blocks[k - 1]!.block.kind;
150
+ if (kind === 'heading' || kind === 'hr') return k;
151
+ const start = blocks[k]!.startLine;
152
+ if (start > 0 && !(lines[start - 1] ?? '').trim()) return k;
153
+ }
154
+ return 0;
155
+ }
156
+
157
+ /**
158
+ * Continues the previous scan: only the part that may still change is rescanned (see frozenBefore); earlier blocks keep
159
+ * their identity, so memoized views skip them. Text that does not extend the previous one is scanned whole.
160
+ */
161
+ export function rescanMarkdown(prev: MarkdownScan | null, text: string): MarkdownScan {
162
+ if (prev && prev.text === text) return prev;
163
+ const lines = text.split('\n');
164
+ if (!prev || prev.blocks.length === 0 || !text.startsWith(prev.text)) {
165
+ return { text, blocks: scanMarkdownBlocks(lines) };
166
+ }
167
+ const from = frozenBefore(prev.blocks, lines);
168
+ if (from === 0) return { text, blocks: scanMarkdownBlocks(lines) };
169
+ const kept = prev.blocks.slice(0, from);
170
+ const priorHeadings = kept
171
+ .map((entry) => (entry.block.kind === 'heading' ? entry.block.text : null))
172
+ .filter((heading): heading is string => heading !== null);
173
+ const rest = scanMarkdownBlocks(lines, prev.blocks[from]!.startLine, priorHeadings);
174
+ return { text, blocks: kept.concat(rest) };
175
+ }
176
+
177
+ export type MarkdownInline =
178
+ | { kind: 'text'; text: string }
179
+ | { kind: 'code'; text: string }
180
+ | { kind: 'strong'; text: string }
181
+ | { kind: 'em'; text: string }
182
+ | { kind: 'link'; text: string; href: string };
183
+
184
+ /**
185
+ * Inline tokens. Code comes first (`` `**x**` `` is code, not emphasis). Italics take a single `*` only, never `_`,
186
+ * which would split identifiers like `file_path`.
187
+ */
188
+ const INLINE_TOKEN = /`([^`]+)`|\*\*([^*]+)\*\*|\*([^*\s][^*]*)\*|\[([^[\]\n]*)\]\(([^()\s]*)\)/g;
189
+
190
+ /** A line → inline pieces. Anything not recognized stays plain text, so half-written syntax spoils nothing. */
191
+ export function parseInlineMarkdown(text: string): MarkdownInline[] {
192
+ const out: MarkdownInline[] = [];
193
+ const pushText = (chunk: string) => {
194
+ if (!chunk) return;
195
+ const last = out[out.length - 1];
196
+ if (last?.kind === 'text') last.text += chunk;
197
+ else out.push({ kind: 'text', text: chunk });
198
+ };
199
+ // a global regex keeps its position: start from the beginning each time
200
+ INLINE_TOKEN.lastIndex = 0;
201
+ let cursor = 0;
202
+ let match: RegExpExecArray | null;
203
+ while ((match = INLINE_TOKEN.exec(text))) {
204
+ const token = matchToInline(match, text);
205
+ if (!token) {
206
+ // not a fit (half syntax, an unsafe link): rescan from the next character; these characters stay text
207
+ INLINE_TOKEN.lastIndex = match.index + 1;
208
+ continue;
209
+ }
210
+ pushText(text.slice(cursor, match.index));
211
+ out.push(token);
212
+ cursor = match.index + match[0]!.length;
213
+ }
214
+ pushText(text.slice(cursor));
215
+ return out;
216
+ }
217
+
218
+ function matchToInline(match: RegExpExecArray, text: string): MarkdownInline | null {
219
+ // groups that did not match are undefined
220
+ const [, code, strong, em, linkText, href]: (string | undefined)[] = match;
221
+ if (code !== undefined) return { kind: 'code', text: code };
222
+ if (strong !== undefined) return { kind: 'strong', text: strong };
223
+ if (em !== undefined) {
224
+ // next to another `*` it is not italics (inside `**bold**`, or a glob like `**/*.tsx`)
225
+ if (text[match.index - 1] === '*' || text[match.index + match[0]!.length] === '*') return null;
226
+ if (/\s$/.test(em)) return null;
227
+ return { kind: 'em', text: em };
228
+ }
229
+ if (linkText !== undefined && href !== undefined) {
230
+ const safe = safeMarkdownHref(href);
231
+ if (!safe || !linkText.trim()) return null;
232
+ return { kind: 'link', text: linkText, href: safe };
233
+ }
234
+ return null;
235
+ }
236
+
237
+ /**
238
+ * Allowed link targets: http(s) and relative paths only; anything else (`javascript:`, `data:` …) is null and shows as
239
+ * text. The text is model output, so untrusted. Control characters and spaces are removed before the scheme is checked,
240
+ * as a browser would, so `java\nscript:` does not slip through.
241
+ */
242
+ export function safeMarkdownHref(raw: string): string | null {
243
+ const href = raw.trim();
244
+ if (!href) return null;
245
+ const probe = href.replace(/[\u0000-\u0020\u00a0\u2028\u2029]/g, '').toLowerCase();
246
+ if (!probe) return null;
247
+ // `//host` leaves the site: not a relative path
248
+ if (probe.startsWith('//')) return null;
249
+ const scheme = /^([a-z][a-z0-9+.-]*):/.exec(probe)?.[1];
250
+ if (scheme && scheme !== 'http' && scheme !== 'https') return null;
251
+ return href;
252
+ }
@@ -0,0 +1,4 @@
1
+ /** What kind of thing a turn makes. Only `video` (a film arranged by film.json) for now. */
2
+ export const MODALITIES = ['video'] as const;
3
+
4
+ export type Modality = (typeof MODALITIES)[number];
@@ -0,0 +1,113 @@
1
+ /**
2
+ * The things a message points at (its "pills"), as they are sent and stored.
3
+ *
4
+ * Two things here cross process boundaries:
5
+ *
6
+ * 1. The token. A pill in the text is an invisible token (`⁣<id>⁣`), and that string is stored with the
7
+ * turn, so its shape is a format, not a component's private detail.
8
+ * 2. What a pill keeps so it can be drawn again. See `promptReferenceSchema`.
9
+ *
10
+ * The text sent to the model is not this: the client expands pills into plain words (file paths, "[1: beat 2 0:04]").
11
+ * This is what the person saw in the composer; both are kept.
12
+ */
13
+ import { z } from 'zod';
14
+
15
+ /** The token mark: `U+2063 INVISIBLE SEPARATOR` on both sides of the id. Nobody types it, and a stray one is invisible. */
16
+ export const PROMPT_REFERENCE_MARK = '⁣';
17
+
18
+ export function promptReferenceToken(id: string): string {
19
+ return `${PROMPT_REFERENCE_MARK}${id}${PROMPT_REFERENCE_MARK}`;
20
+ }
21
+
22
+ /* A new one each time: a `g` regex remembers where it stopped. */
23
+ function tokenPattern(): RegExp {
24
+ return new RegExp(`${PROMPT_REFERENCE_MARK}([^${PROMPT_REFERENCE_MARK}]+)${PROMPT_REFERENCE_MARK}`, 'g');
25
+ }
26
+
27
+ export type PromptTextSegment =
28
+ | { kind: 'text'; value: string }
29
+ | { kind: 'reference'; id: string };
30
+
31
+ /** Splits tokenized text into alternating text and reference segments (the composer and the chat use the same split). */
32
+ export function splitPromptReferenceText(text: string): PromptTextSegment[] {
33
+ const segments: PromptTextSegment[] = [];
34
+ let cursor = 0;
35
+ for (const match of text.matchAll(tokenPattern())) {
36
+ const at = match.index ?? 0;
37
+ if (at > cursor) segments.push({ kind: 'text', value: text.slice(cursor, at) });
38
+ segments.push({ kind: 'reference', id: match[1]! });
39
+ cursor = at + match[0].length;
40
+ }
41
+ if (cursor < text.length) segments.push({ kind: 'text', value: text.slice(cursor) });
42
+ return segments;
43
+ }
44
+
45
+ /** The text without its tokens: what the person actually typed. */
46
+ export function stripPromptReferenceTokens(text: string): string {
47
+ return text.replace(tokenPattern(), '');
48
+ }
49
+
50
+ /**
51
+ * What a pill keeps: enough to draw it and to go back to what it points at.
52
+ *
53
+ * `kind` is any string, not an enum: a kind the reader does not know falls back to a generic icon instead of failing.
54
+ */
55
+ export const promptReferenceSchema = z.object({
56
+ /** The same id as in the text's token. */
57
+ id: z.string().min(1).max(512),
58
+ kind: z.string().min(1).max(32),
59
+ /** The pill's label (a file name, a beat, a skill's title). */
60
+ label: z.string().min(1).max(200),
61
+ /** A short suffix, e.g. a time like 0:12. */
62
+ detail: z.string().max(64).optional(),
63
+ /**
64
+ * A thumbnail: `src` is the host's own address; `crop` is the part it points at, in pixels of `stage` (the image
65
+ * shows the whole stage).
66
+ */
67
+ image: z.object({
68
+ src: z.string().min(1).max(2048),
69
+ crop: z.object({ x: z.number(), y: z.number(), w: z.number(), h: z.number() }).optional(),
70
+ stage: z.object({ w: z.number(), h: z.number() }).optional(),
71
+ }).optional(),
72
+ /** What it points at, in the host's own shape (e.g. a Studio reference). Stored and returned as is. */
73
+ target: z.record(z.string(), z.unknown()).optional(),
74
+ });
75
+ export type PromptReference = z.infer<typeof promptReferenceSchema>;
76
+
77
+ /** Limits for a field kept only for display (the product's own limit is on the expanded text). */
78
+ export const PROMPT_DISPLAY_MAX_CHARS = 50_000;
79
+ export const PROMPT_DISPLAY_MAX_REFERENCES = 64;
80
+
81
+ /** A message as it looked in the composer. */
82
+ export const promptDisplaySchema = z.object({
83
+ /** The text with its tokens. */
84
+ text: z.string().min(1).max(PROMPT_DISPLAY_MAX_CHARS),
85
+ /** The pills its tokens point at, in order. A token with no pill is dropped when drawn. */
86
+ references: z.array(promptReferenceSchema).max(PROMPT_DISPLAY_MAX_REFERENCES),
87
+ });
88
+ export type PromptDisplay = z.infer<typeof promptDisplaySchema>;
89
+
90
+ /**
91
+ * The composer view of a message, or undefined when it has no pills (then it equals the sent text).
92
+ *
93
+ * `references` is the sender's whole pool; only the ones still in the text are kept (an undo may have removed one).
94
+ * Over a limit, nothing is kept rather than a partial list: the expanded text still reads whole.
95
+ */
96
+ export function buildPromptDisplay(
97
+ text: string,
98
+ references: readonly PromptReference[],
99
+ ): PromptDisplay | undefined {
100
+ const byId = new Map(references.map((item) => [item.id, item]));
101
+ const used: PromptReference[] = [];
102
+ const seen = new Set<string>();
103
+ for (const segment of splitPromptReferenceText(text)) {
104
+ if (segment.kind === 'text' || seen.has(segment.id)) continue;
105
+ seen.add(segment.id);
106
+ const reference = byId.get(segment.id);
107
+ if (reference) used.push(reference);
108
+ }
109
+ if (!used.length) return undefined;
110
+ if (text.length > PROMPT_DISPLAY_MAX_CHARS) return undefined;
111
+ if (used.length > PROMPT_DISPLAY_MAX_REFERENCES) return undefined;
112
+ return { text, references: used };
113
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Title length policy for session titles.
3
+ *
4
+ * A title has to fit one line in cards, the project header, share pages and
5
+ * download filenames. Counting characters alone does not describe that budget:
6
+ * a CJK glyph occupies roughly twice the width of a Latin one, so 60 Chinese
7
+ * characters overflow everywhere that 60 Latin characters fit. We therefore
8
+ * budget *display width* — CJK and other full-width glyphs cost 2, everything
9
+ * else costs 1 — which yields the intended "30 Chinese characters or 60 Latin
10
+ * characters" cap from a single rule.
11
+ */
12
+ export const TITLE_MAX_WIDTH = 60;
13
+
14
+ /** Session titles are shorter: about 15 CJK or 30 Latin characters. */
15
+ export const SESSION_TITLE_MAX_WIDTH = 30;
16
+
17
+ const FULL_WIDTH_RANGES: readonly [number, number][] = [
18
+ [0x1100, 0x115f], // Hangul Jamo
19
+ [0x2e80, 0x303e], // CJK radicals, Kangxi, CJK symbols & punctuation
20
+ [0x3041, 0x33ff], // Hiragana, Katakana, Hangul compat, CJK compat
21
+ [0x3400, 0x4dbf], // CJK ext A
22
+ [0x4e00, 0x9fff], // CJK unified
23
+ [0xa000, 0xa4cf], // Yi
24
+ [0xac00, 0xd7a3], // Hangul syllables
25
+ [0xf900, 0xfaff], // CJK compat ideographs
26
+ [0xfe30, 0xfe6f], // CJK compat forms
27
+ [0xff00, 0xff60], // Full-width forms
28
+ [0xffe0, 0xffe6],
29
+ [0x20000, 0x2fffd], // CJK ext B+
30
+ [0x30000, 0x3fffd],
31
+ ];
32
+
33
+ function charWidth(codePoint: number): number {
34
+ return FULL_WIDTH_RANGES.some(([lo, hi]) => codePoint >= lo && codePoint <= hi) ? 2 : 1;
35
+ }
36
+
37
+ /** Display width of a title: CJK glyphs count as 2, everything else as 1. */
38
+ export function titleWidth(text: string): number {
39
+ let width = 0;
40
+ for (const ch of text) width += charWidth(ch.codePointAt(0)!);
41
+ return width;
42
+ }
43
+
44
+ /**
45
+ * Trim a title to the width budget, appending an ellipsis when it was cut.
46
+ * Whitespace is collapsed first so wrapped or multi-line model output does not
47
+ * waste the budget on newlines. Surrogate pairs are never split.
48
+ */
49
+ export function clampTitle(raw: string, maxWidth = TITLE_MAX_WIDTH): string {
50
+ const text = raw.replace(/\s+/g, ' ').trim();
51
+ if (titleWidth(text) <= maxWidth) return text;
52
+ // Leave room for the ellipsis so the result still fits the budget.
53
+ const budget = Math.max(1, maxWidth - 1);
54
+ let width = 0;
55
+ let out = '';
56
+ for (const ch of text) {
57
+ const w = charWidth(ch.codePointAt(0)!);
58
+ if (width + w > budget) break;
59
+ width += w;
60
+ out += ch;
61
+ }
62
+ return `${out.trimEnd()}…`;
63
+ }
64
+
65
+ /** Cuts to the width budget without an ellipsis (for an input while typing). */
66
+ export function limitTitleWidth(raw: string, maxWidth = TITLE_MAX_WIDTH): string {
67
+ let width = 0;
68
+ let out = '';
69
+ for (const ch of raw) {
70
+ const w = charWidth(ch.codePointAt(0)!);
71
+ if (width + w > maxWidth) break;
72
+ width += w;
73
+ out += ch;
74
+ }
75
+ return out;
76
+ }
@@ -0,0 +1,68 @@
1
+ import type { Modality } from './modality';
2
+ import type { CancelReason, GenResult, TurnAttachment } from './contract';
3
+ import type { PromptDisplay } from './prompt-reference';
4
+
5
+ /**
6
+ * A turn: what the person said, and everything the agent did for it. Projects hold sessions, sessions hold turns; a
7
+ * film a turn makes is a LibraryVideo of its own (an edit makes a new turn and a new film, never changing the parent).
8
+ */
9
+ export type TurnStatus =
10
+ | 'generating'
11
+ | 'failing'
12
+ | 'canceling'
13
+ | 'ready'
14
+ | 'error'
15
+ | 'cancelled';
16
+
17
+ export interface Turn {
18
+ id: string;
19
+ ownerId: string;
20
+ /** The project it belongs to. */
21
+ projectId: string;
22
+ /** The session it belongs to (the agent's conversation memory). */
23
+ sessionId: string;
24
+ /** The session's title, for recents and the conversation; independent of the film's. */
25
+ sessionTitle: string;
26
+ /** The film this turn starts from; null for a new one. */
27
+ baseVideoId?: string | null;
28
+ modality: Modality;
29
+ /** Empty: the project's title is shown. */
30
+ title: string;
31
+ /** The project's title, when the person gave one. Lists include it; elsewhere it may be absent. */
32
+ projectTitle?: string;
33
+ /** A one-line description of the film. */
34
+ description?: string;
35
+ /** Content tags (3 to 6). */
36
+ tags?: string[];
37
+ status: TurnStatus;
38
+ /** The person's message as sent to the model. */
39
+ prompt: string;
40
+ /**
41
+ * The same message as it looked in the composer, with its pills (`prompt` is the expanded text sent to the model).
42
+ * Only when the message has pills.
43
+ */
44
+ promptDisplay?: PromptDisplay | null;
45
+ /** What the person attached (names and thumbnails), for display only. */
46
+ attachments?: TurnAttachment[] | null;
47
+ /** What the turn made; null while it runs. */
48
+ result: GenResult | null;
49
+ error?: string | null;
50
+ /** The model it ran on. */
51
+ model?: string | null;
52
+ /**
53
+ * A turn run by a local agent on the person's computer (Codex, Claude Code), kept only there; `model` is the name
54
+ * shown in its menu (e.g. "gpt-5.5 · Medium").
55
+ */
56
+ localAgent?: { id: string; model?: string | null } | null;
57
+ /** The turn carried pictures. */
58
+ vision?: boolean;
59
+ /** When a stop was asked for, and when it stopped. */
60
+ cancelRequestedAt?: string | null;
61
+ cancelledAt?: string | null;
62
+ /** Why it stopped; null means `'user'`. */
63
+ cancelReason?: CancelReason | null;
64
+ /** When it was removed from recents (the film stays in the library); absent while it is shown. */
65
+ removedFromRecentsAt?: string | null;
66
+ createdAt: string;
67
+ updatedAt: string;
68
+ }
@@ -0,0 +1,26 @@
1
+ import type { VideoResult } from './contract';
2
+
3
+ /**
4
+ * A finished film in the library; a turn makes at most one. Versions chain by `parentVideoId` (editing v3 makes v4).
5
+ */
6
+ export interface LibraryVideo {
7
+ id: string;
8
+ ownerId: string;
9
+ /** The project it belongs to. */
10
+ projectId: string;
11
+ /** The turn that made it. */
12
+ turnId: string;
13
+ /** The session it was made in. */
14
+ sessionId: string;
15
+ /** Empty: a film has no name of its own (the project's title is shown). */
16
+ title: string;
17
+ /** The project's title, when the person gave one. Lists include it; elsewhere it may be absent. */
18
+ projectTitle?: string;
19
+ description?: string;
20
+ tags?: string[];
21
+ result: VideoResult;
22
+ /** The version it was made from; null for a project's first. */
23
+ parentVideoId: string | null;
24
+ createdAt: string;
25
+ updatedAt: string;
26
+ }
@@ -0,0 +1,33 @@
1
+ # Agent 与 Personal Agent
2
+
3
+ 基线:`0.1.0-preview.3`。从 `auricui/agent` 导入,CSS 仍只导入一次 `auricui/styles.css`。这些组件不依赖 Chat Provider 或模型 SDK;宿主传入数据、维护状态并实现回调。
4
+
5
+ | 需求 | 组件 |
6
+ | --- | --- |
7
+ | 消息与滚动 | MessageBubble、MessageActions、MessageList、ResponseSwitcher |
8
+ | 内容与引用 | CodeBlock、Citation、SourceList、ArtifactCard、AttachmentChip |
9
+ | 输入辅助 | Suggestion、PromptTemplate、ContextUsage |
10
+ | 执行状态 | ThinkingIndicator、ReasoningDisclosure、AgentStatus、ToolCall、TaskSteps、RunSummary、Checkpoint |
11
+ | 会话与身份 | AgentCard、ConversationList |
12
+ | 操作确认 | ApprovalCard |
13
+ | 个人助手 | MemoryCard、GoalCard、ScheduleCard、ConnectorCard、ProactiveSuggestion、ActivityTimeline、AutonomyControl、BriefingCard |
14
+
15
+ 先查询真实契约,例如:
16
+
17
+ ```bash
18
+ python3 <Skill目录>/scripts/inspect_api.py --entry agent --symbol ToolCall --project <前端目录>
19
+ python3 <Skill目录>/scripts/inspect_api.py --entry agent --symbol MemoryCard --project <前端目录>
20
+ ```
21
+
22
+ ## 容易接错的行为
23
+
24
+ - MessageList 只在用户位于底部时跟随新增内容;用户向上阅读时保留位置。传入稳定的消息 key,不用随机 key 重建消息。
25
+ - ReasoningDisclosure 展示宿主提供的过程摘要,不生成模型内部思维链。ToolCall 的输入、输出、错误与执行状态也来自宿主。
26
+ - CodeBlock 复制原始字符串,默认没有语法着色;需要时通过 `renderLine` 接入项目的高亮器。
27
+ - Citation 仅接受 HTTP/HTTPS 来源,摘要使用 body Portal,支持 Escape、外部点击和视口边界。Portal 读取全局主题。
28
+ - ResponseSwitcher 索引从 0 开始;Pagination 的页码从 1 开始。ContextUsage 容量未知时传入无效 limit,会展示未知而不是编造百分比。
29
+ - ApprovalCard 的 `status` 来自应用;请求中传 `submitting`,完成后传 `approved` / `rejected`。回调不等同服务端授权。AutonomyControl 只是偏好选择器,权限仍由服务端执行。
30
+ - ScheduleCard 只展示 timezone / nextRun 并通知开关变化,不创建定时任务。ConnectorCard 不实现 OAuth。MemoryCard 的编辑/忘记回调不自动修改存储。
31
+ - ConversationList 的搜索值和筛选结果由宿主管理;PromptTemplate 字段和值受控,提交结果由应用消费。
32
+
33
+ 独立可复制示例位于 `assets/examples/`:MessageList、ToolCall、ApprovalCard、MemoryCard、BriefingCard。示例动作仅改变演示状态,接入应用时替换为实际回调。