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.
- package/LICENSE +21 -0
- package/README.md +29 -2
- package/bin/install.mjs +66 -0
- package/package.json +29 -4
- package/skill/SKILL.md +64 -0
- package/skill/agents/openai.yaml +4 -0
- package/skill/assets/examples/ApprovalCard.tsx +8 -0
- package/skill/assets/examples/BasicApp.tsx +38 -0
- package/skill/assets/examples/BriefingCard.tsx +8 -0
- package/skill/assets/examples/ChatControls.tsx +49 -0
- package/skill/assets/examples/ChatPanel.tsx +73 -0
- package/skill/assets/examples/Checkbox.tsx +13 -0
- package/skill/assets/examples/Combobox.tsx +14 -0
- package/skill/assets/examples/Drawer.tsx +10 -0
- package/skill/assets/examples/MemoryCard.tsx +9 -0
- package/skill/assets/examples/MessageList.tsx +8 -0
- package/skill/assets/examples/Theme.tsx +14 -0
- package/skill/assets/examples/ToolCall.tsx +8 -0
- package/skill/assets/examples/Tree.tsx +15 -0
- package/skill/assets/examples/examples.css +11 -0
- package/skill/assets/library/auricui-0.1.0-preview.1.tgz +0 -0
- package/skill/assets/library/auricui-0.1.0-preview.3.tgz +0 -0
- package/skill/assets/library/auricui-0.1.0-preview.4.tgz +0 -0
- package/skill/assets/upstream/LICENSE +21 -0
- package/skill/assets/upstream/apps/desktop/chat/src/App.tsx +1099 -0
- package/skill/assets/upstream/apps/desktop/chat/src/app-bridge.ts +154 -0
- package/skill/assets/upstream/apps/desktop/chat/src/chat.css +1812 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/AddSkill.tsx +223 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/AgentActivityRow.tsx +716 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/AgentIcons.tsx +46 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/AttachmentCard.tsx +34 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/AttachmentPreview.tsx +331 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/BalanceNotice.tsx +22 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/BrandLogo.tsx +35 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/ComposerCard.tsx +182 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/ConversationSessionBar.tsx +292 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/CopyDiagnostics.tsx +24 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/Divider.tsx +47 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/FileChangesList.tsx +119 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/Markdown.tsx +198 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/ModelPopover.tsx +280 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/NoticeCard.tsx +87 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/Popover.tsx +195 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/PreviewFrame.tsx +129 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/ProjectConversation.tsx +852 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/ProjectStarters.tsx +118 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/Tooltip.tsx +191 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/TurnLog.tsx +583 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/TurnQuestionCard.tsx +133 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/dock-pane-bar.ts +14 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/project-version.ts +37 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/MentionMenuPlugin.tsx +372 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/PromptEditor.tsx +476 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/PromptPill.tsx +399 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/PromptReferenceNode.tsx +164 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/index.ts +31 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/mention-menu.ts +206 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/prompt-text.ts +171 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/useStickToBottom.ts +320 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/useTicker.ts +55 -0
- package/skill/assets/upstream/apps/desktop/chat/src/i18n/index.ts +42 -0
- package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/en-US.ts +408 -0
- package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/es.ts +407 -0
- package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/ja.ts +407 -0
- package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/ko.ts +403 -0
- package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/words.ts +6 -0
- package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/zh-CN.ts +407 -0
- package/skill/assets/upstream/apps/desktop/chat/src/i18n/lookup.ts +12 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/agent-activity-runs.ts +154 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/agent-menu-rows.ts +41 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/agent-refs.ts +105 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/agent-transcript.ts +440 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/asset-lists.ts +75 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/attachment-place.ts +17 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/balance.ts +16 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/chat-layer.ts +10 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/chat-menu.ts +18 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/chat-store.ts +101 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/composer-attachments.ts +189 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/desktop-attachments.ts +178 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/desktop-bridge.ts +291 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/developer.ts +39 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/esc-stop.ts +23 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/file-changes.ts +32 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/live-activity.ts +20 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/local-agent-run.ts +1174 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/local-sessions.ts +25 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/model-calls.ts +87 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/pretty-json.ts +12 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/preview-top.ts +15 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/project-resources.ts +66 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/project-sessions.ts +66 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/project-versions.ts +116 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/ref-pictures.ts +119 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/relative-time.ts +46 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/skill-pages.ts +29 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/step-file.ts +23 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/structural-share.ts +52 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/studio-film.ts +44 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/studio-transfer.ts +40 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/unprompted.ts +27 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/upload-limits.ts +53 -0
- package/skill/assets/upstream/apps/desktop/chat/src/mount.tsx +19 -0
- package/skill/assets/upstream/apps/desktop/chat/src/state/local-agent-store.ts +296 -0
- package/skill/assets/upstream/apps/desktop/chat/src/studio-refs.ts +307 -0
- package/skill/assets/upstream/apps/desktop/package.json +51 -0
- package/skill/assets/upstream/apps/desktop/shell/bridge.ts +415 -0
- package/skill/assets/upstream/apps/desktop/shell/index.html +27 -0
- package/skill/assets/upstream/apps/desktop/shell/main.tsx +17 -0
- package/skill/assets/upstream/apps/desktop/shell/shell.css +17 -0
- package/skill/assets/upstream/apps/desktop/shell/vite.config.ts +65 -0
- package/skill/assets/upstream/apps/desktop/src/agent-definitions.mjs +31 -0
- package/skill/assets/upstream/packages/openfilm/LICENSE +21 -0
- package/skill/assets/upstream/packages/openfilm/package.json +88 -0
- package/skill/assets/upstream/packages/openfilm/src/film-doc.d.mts +125 -0
- package/skill/assets/upstream/packages/openfilm/src/film-doc.mjs +986 -0
- package/skill/assets/upstream/packages/openfilm/src/overrides.mjs +73 -0
- package/skill/assets/upstream/packages/openfilm/src/timeline.mjs +1280 -0
- package/skill/assets/upstream/packages/openfilm/studio/server/bridge.js +209 -0
- package/skill/assets/upstream/packages/openfilm/studio/server/film-subtitle.mjs +785 -0
- package/skill/assets/upstream/packages/openfilm/studio/server/ops.mjs +403 -0
- package/skill/assets/upstream/packages/openfilm/studio/server/stage.js +1649 -0
- package/skill/assets/upstream/packages/openfilm/studio/server/track-layout.mjs +43 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/App.tsx +156 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/api.ts +328 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/AudioMeters.tsx +188 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/BlockThumbs.tsx +84 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/BlockWaveform.tsx +201 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/BrandLoadingScreen.tsx +56 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/BrandLogo.tsx +25 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Card.tsx +89 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ColorPicker.tsx +204 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ConfirmDialog.tsx +96 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ContextMenu.tsx +422 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/DesktopDialog.tsx +271 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ExamplesGallery.tsx +372 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FilmFullscreenBar.tsx +147 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FilmInspector.tsx +2310 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FilmStageSelect.tsx +3296 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FocusNav.tsx +28 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FontFamilyPicker.tsx +293 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FramePicker.tsx +69 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/InspectorPanel.tsx +25 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Launcher.tsx +38 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/LayersPanel.tsx +277 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/LiveTime.tsx +101 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/MediaPool.tsx +1413 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/MediaPreview.tsx +188 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/MenuSelect.tsx +161 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/MgOutline.tsx +24 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/OperationHistory.tsx +184 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/PaneDivider.tsx +292 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/PasteAttrsDialog.tsx +69 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/PlaybackMenu.tsx +110 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Popover.tsx +159 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectCover.tsx +60 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectHistoryControls.tsx +748 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectLayoutMenu.tsx +82 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectMenu.tsx +111 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectSources.tsx +587 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectView.tsx +3222 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectsLibrary.tsx +567 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectsView.tsx +1593 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/PropertiesSection.tsx +418 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ResourceInspector.tsx +100 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SelectionToolbar.tsx +157 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SkillsLibrary.tsx +504 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SourcePreview.tsx +464 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SpendAsks.tsx +88 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/StageMaskOverlay.tsx +299 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/StageTransformFrame.tsx +246 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SubtitleInspector.module.css +46 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SubtitleInspector.tsx +884 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SubtitleOverlay.tsx +148 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SubtitleRow.tsx +419 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/TabStrip.tsx +188 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Timeline.tsx +4911 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/TimelineMarkers.tsx +329 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Toast.tsx +55 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Tooltip.tsx +193 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/UpdateButton.tsx +104 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ViewerBar.tsx +98 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/WhatsNew.tsx +147 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/dock-pane-bar.ts +16 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/export/ExportCenter.tsx +1502 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/export/ExportTray.tsx +284 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/film-stage-hit.ts +18 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/inspector-fields.tsx +863 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/inspector-look.tsx +1357 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/player-controls/controls-bar.tsx +397 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/player-controls/transport.tsx +294 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/replace-drop.ts +20 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/AgentsSection.tsx +613 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/CustomServices.tsx +104 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/DiagnosticsGroup.tsx +202 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ModelsSection.tsx +179 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ProviderMark.tsx +24 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ProvidersSection.tsx +177 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/SettingsModal.tsx +511 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/SettingsSelect.tsx +84 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ShortcutsSection.tsx +291 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/StorageGroup.tsx +119 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/theme.ts +47 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ui.tsx +139 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/use-settings.ts +10 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/stage-menu.tsx +283 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/timeline-head-extras.tsx +91 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/typing-target.ts +45 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/use-editor-tools.tsx +408 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/use-page-changes.ts +48 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/use-project-history.ts +113 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/useBlockDrag.ts +639 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/Preview.tsx +426 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/player.ts +558 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/preview-frames.ts +36 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/steps.ts +36 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/undo.ts +156 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/use-film.ts +212 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/use-preview-renders.ts +89 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/globals.css +559 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/en.ts +1901 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/es.ts +1900 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/index.ts +130 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/ja.ts +1900 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/ko.ts +1896 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/words.ts +6 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/zh-CN.ts +1901 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/agent-row.ts +21 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/asset-timeline.ts +469 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/audio-levels.ts +60 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/batch-map.ts +28 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/browser.ts +10 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/canvas-fit.ts +116 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/chat-marks.ts +114 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-attrs.ts +102 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-fade.ts +70 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-look.ts +520 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-mask.ts +536 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-replace.ts +60 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/component-props.ts +128 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/context-length.ts +12 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/desktop-build.ts +44 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/diagnostics.ts +68 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/double-press.ts +22 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/dropped-overrides.ts +139 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/export-jobs.ts +191 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/export-spec.ts +261 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/field-input.ts +155 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film-clip-edits.ts +82 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film-frame.ts +134 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film-overrides.ts +107 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film-shape.ts +172 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film.ts +80 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/font-menu.ts +236 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/font-styles.ts +129 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/freeze-frame.ts +49 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/host.ts +438 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/inspect-scrub.ts +26 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/keymap-store.ts +74 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/keymap.ts +529 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/layers-tree.ts +133 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/look.ts +83 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/loudness.ts +58 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/markers.ts +152 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-bar.ts +58 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-folders.ts +45 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-place.ts +102 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-queue.ts +107 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-selection.ts +64 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/menu-position.ts +77 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/mg-transform.ts +111 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/mixed.ts +3 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/page-changes.ts +45 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/picture-files.ts +19 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/preview-prefs.ts +46 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/preview-renders.ts +71 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/project-delete.ts +20 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/project-folders.ts +144 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/project-history.ts +188 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/project-sources.ts +283 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/projects-page.ts +40 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/provider-marks.ts +35 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/providers.ts +163 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/resource-drag.ts +131 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/retry-image.ts +17 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/saved-insert.ts +40 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/saved.ts +125 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/selection-toolbar.ts +158 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/shortcut-hint.ts +21 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/similar-layers.ts +46 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/solo.ts +19 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-clip.ts +60 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-crop.ts +232 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-gesture.ts +277 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-layers.ts +71 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-mask.ts +176 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-measure.ts +53 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-types.ts +155 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/studio-refs.ts +248 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/studio-version.ts +41 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/subtitle-cues.ts +238 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/subtitles.ts +263 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/tab-menu.ts +6 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/template-controls.ts +131 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/theme-changes.ts +31 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/thumb-cache.ts +63 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/thumb-cell.ts +8 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/thumb-frame.ts +76 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/thumb-pick.ts +42 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timecode.ts +161 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-clipboard.ts +279 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-drag.ts +589 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-edit.ts +1138 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-keys.ts +63 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-layout.ts +1038 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-nav.ts +160 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-prefs.ts +73 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-split.ts +40 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-view.ts +105 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/title.ts +39 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/track-heights.ts +55 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/track-lock.ts +27 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/transitions.ts +459 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/type-metrics.ts +83 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-film-subtitles.ts +111 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-fonts.ts +181 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-loaded-thumbs.ts +91 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-subtitle-edits.ts +134 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-subtitle-font.ts +51 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-subtitle-style.ts +68 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/waveform-columns.ts +48 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/web-update.ts +41 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/whats-new.ts +401 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/workspace-resources.ts +373 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/main.tsx +10 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/vite.config.ts +12 -0
- package/skill/assets/upstream/packages/shared/package.json +45 -0
- package/skill/assets/upstream/packages/shared/src/agent-activity.ts +263 -0
- package/skill/assets/upstream/packages/shared/src/contract.ts +285 -0
- package/skill/assets/upstream/packages/shared/src/index.ts +17 -0
- package/skill/assets/upstream/packages/shared/src/markdown-blocks.ts +252 -0
- package/skill/assets/upstream/packages/shared/src/modality.ts +4 -0
- package/skill/assets/upstream/packages/shared/src/prompt-reference.ts +113 -0
- package/skill/assets/upstream/packages/shared/src/title.ts +76 -0
- package/skill/assets/upstream/packages/shared/src/turn.ts +68 -0
- package/skill/assets/upstream/packages/shared/src/video.ts +26 -0
- package/skill/references/agent-components.md +33 -0
- package/skill/references/api-index.json +2693 -0
- package/skill/references/chat-components.md +65 -0
- package/skill/references/components.md +23 -0
- package/skill/references/core-components.md +44 -0
- package/skill/references/dependencies.md +22 -0
- package/skill/references/esm-package.md +48 -0
- package/skill/references/integration.md +43 -0
- package/skill/references/library-manifest.json +12 -0
- package/skill/references/source-manifest.json +325 -0
- package/skill/references/studio-components.md +24 -0
- package/skill/references/theme-motion.md +49 -0
- package/skill/references/troubleshooting.md +27 -0
- package/skill/references/verification.md +13 -0
- package/skill/scripts/check_dependencies.py +109 -0
- package/skill/scripts/inspect_api.py +60 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The desktop shell's bridge. In the OpenFilm app (Electron) the window's page puts it on
|
|
3
|
+
* `window.openfilmDesktop`; in a plain browser there is no such object.
|
|
4
|
+
*
|
|
5
|
+
* It holds only what a web page cannot do by itself, such as a system folder picker or showing a path
|
|
6
|
+
* in Finder.
|
|
7
|
+
*
|
|
8
|
+
* The shape matches apps/desktop/shell/bridge.ts; change one, change the other.
|
|
9
|
+
*/
|
|
10
|
+
import type { Balance } from './balance';
|
|
11
|
+
|
|
12
|
+
/** The coding agents the shell can connect to its MCP endpoint. */
|
|
13
|
+
export type DesktopAgentId = 'claude' | 'codex' | 'cursor' | 'copilot' | 'opencode' | 'codebuddy' | 'devin';
|
|
14
|
+
|
|
15
|
+
/** The chat's agents: the person's own (Codex, Claude Code, Qwen Code, …), and the app's own on their own key. */
|
|
16
|
+
export type LocalAgentId = 'claude' | 'codex' | 'copilot' | 'cursor' | 'opencode' | 'codebuddy' | 'qwen' | 'kimi' | 'minimax' | 'deepseek' | 'byok';
|
|
17
|
+
|
|
18
|
+
/** One agent as the app's roster has it (apps/desktop/src/agent-roster.mjs; Studio's lib/host.ts HostAgent). */
|
|
19
|
+
export interface RosterAgent {
|
|
20
|
+
id: LocalAgentId;
|
|
21
|
+
name: string;
|
|
22
|
+
shown: boolean;
|
|
23
|
+
status: 'ready' | 'off' | 'sign-in' | 'waiting' | 'missing' | 'key' | 'checking';
|
|
24
|
+
install?: string | null;
|
|
25
|
+
setupRequired?: string | null;
|
|
26
|
+
error?: string;
|
|
27
|
+
/**
|
|
28
|
+
* The own key's models, each set up on its own (its name, its service, the model asked for there), with the reasoning
|
|
29
|
+
* efforts it offers and the one it starts on (apps/desktop src/pi-config.mjs EFFORTS); the first one to begin with.
|
|
30
|
+
*/
|
|
31
|
+
byok?: { models: Array<{ id: string; name: string; format: 'responses' | 'chat' | 'anthropic'; baseUrl: string; model: string; levels: string[]; effort: string; last4: string }> };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface LocalAgentState {
|
|
35
|
+
setupRequired?: 'code-tab' | null;
|
|
36
|
+
id: LocalAgentId;
|
|
37
|
+
label: string;
|
|
38
|
+
/** The executable it uses: the one the person chose, one found on the PATH or in installers' folders, or the copy inside the maker's app. null = not installed. */
|
|
39
|
+
cli: { path: string; source: 'chosen' | 'path' | 'app' } | null;
|
|
40
|
+
/** Its own reported sign-in state; null when it cannot be asked. */
|
|
41
|
+
signedIn: boolean | null;
|
|
42
|
+
/** The official install page. When it is missing the UI points there; the app does not install it for the user. */
|
|
43
|
+
install: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface LocalAgentSessionInfo {
|
|
47
|
+
/** the agent's own id of the conversation: what `start` takes back as `resume` */
|
|
48
|
+
sessionId: string;
|
|
49
|
+
/** taken up where it stopped (the agent's own record, or the session still open), not a new one */
|
|
50
|
+
resumed?: boolean;
|
|
51
|
+
/** a message sent while it works can join the running turn (`steer`) */
|
|
52
|
+
steering?: boolean;
|
|
53
|
+
/** its commands, as a session opened only to ask said them (`probe`): ACP's availableCommands */
|
|
54
|
+
commands?: unknown[];
|
|
55
|
+
agentInfo: { name: string; title?: string; version?: string } | null;
|
|
56
|
+
authMethods: Array<{ id: string; name: string; description?: string }>;
|
|
57
|
+
/** Whether our MCP tools were handed over (not when the agent does not take HTTP). */
|
|
58
|
+
mcp: boolean;
|
|
59
|
+
models: { availableModels: Array<{ modelId: string; name: string; description?: string }>; currentModelId: string } | null;
|
|
60
|
+
modes: { availableModes: Array<{ id: string; name: string; description?: string }>; currentModeId: string } | null;
|
|
61
|
+
configOptions: Array<{ id: string; name: string; description?: string; category?: string; type?: string; currentValue?: unknown; options?: Array<{ value: unknown; name: string; description?: string }> }> | null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** session/update as is (ACP's SessionUpdate); the UI picks what to draw by `sessionUpdate`. */
|
|
65
|
+
export type LocalAgentEvent =
|
|
66
|
+
| { key: string; kind: 'update'; update: { sessionUpdate: string } & Record<string, unknown> }
|
|
67
|
+
| { key: string; kind: 'permission'; requestId: string; params: { toolCall?: { title?: string }; options: Array<{ optionId: string; name: string; kind: string }> } }
|
|
68
|
+
| { key: string; kind: 'question'; requestId: string; message: string; toolCallId: string | null; questions: LocalAgentQuestion[] }
|
|
69
|
+
| { key: string; kind: 'exit'; code: number | null; stderr: string }
|
|
70
|
+
/* the turn settled — also said on the channel, for a page that was reloaded while it ran */
|
|
71
|
+
| { key: string; kind: 'done'; turnId: string; ok: boolean; stopReason?: string; error?: string; balance?: Balance };
|
|
72
|
+
|
|
73
|
+
/** A picture given to the agent with a message: base64 bytes and their type (an ACP image block). */
|
|
74
|
+
export interface PromptImage { data: string; mimeType: string }
|
|
75
|
+
|
|
76
|
+
/** What the page hands the shell with a prompt, so a reloaded page can put the running turn back. */
|
|
77
|
+
export interface LocalAgentTurnMeta {
|
|
78
|
+
turnId: string;
|
|
79
|
+
projectId: string;
|
|
80
|
+
projectTitle: string;
|
|
81
|
+
sessionId: string;
|
|
82
|
+
agent: LocalAgentId;
|
|
83
|
+
/** the user's words (without the attachment note) */
|
|
84
|
+
prompt: string;
|
|
85
|
+
turnNo: number;
|
|
86
|
+
startedAt: number;
|
|
87
|
+
/** the chat row as it was sent (a Turn) */
|
|
88
|
+
turn: unknown;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** A turn the shell still holds: running, or finished and not yet taken by a page. */
|
|
92
|
+
export interface LocalAgentRunningTurn {
|
|
93
|
+
key: string;
|
|
94
|
+
agent: LocalAgentId;
|
|
95
|
+
cwd: string;
|
|
96
|
+
meta: LocalAgentTurnMeta;
|
|
97
|
+
done: { ok: true; stopReason: string } | { ok: false; error: string; balance?: Balance } | null;
|
|
98
|
+
events: Array<Record<string, unknown> & { kind: string }>;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** A question a local agent asks the user (read by the shell from the ACP form, see formQuestions in apps/desktop/src/agents.mjs). */
|
|
102
|
+
export interface LocalAgentQuestion {
|
|
103
|
+
id: string;
|
|
104
|
+
question: string;
|
|
105
|
+
header: string | null;
|
|
106
|
+
options: Array<{ label: string; description?: string }>;
|
|
107
|
+
/** The free-text field; null = options only (except for text-only questions). */
|
|
108
|
+
customId: string | null;
|
|
109
|
+
multi: boolean;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** An answer: the option picked, or the text written. */
|
|
113
|
+
export type LocalAgentAnswer = { label: string } | { text: string };
|
|
114
|
+
|
|
115
|
+
export interface DesktopBridge {
|
|
116
|
+
/** The shell's version, to spot an old shell when debugging. */
|
|
117
|
+
version: string;
|
|
118
|
+
/** IPC contract version; separate from the installed application's version. */
|
|
119
|
+
bridgeVersion?: string;
|
|
120
|
+
/** darwin / win32 / linux. */
|
|
121
|
+
platform: string;
|
|
122
|
+
/** Opens the system folder picker. null if the user cancels. */
|
|
123
|
+
chooseFolder(opts?: { title?: string; defaultPath?: string }): Promise<string | null>;
|
|
124
|
+
/** Shows this path in the system file manager. */
|
|
125
|
+
revealPath(path: string): Promise<void>;
|
|
126
|
+
/**
|
|
127
|
+
* The system "Save As" dialog (where a local export goes). null if the user cancels.
|
|
128
|
+
* `defaultPath` defaults to the `exportsRoot()` folder.
|
|
129
|
+
*/
|
|
130
|
+
saveDialog?(opts: {
|
|
131
|
+
title?: string;
|
|
132
|
+
defaultPath?: string;
|
|
133
|
+
filters?: { name: string; extensions: string[] }[];
|
|
134
|
+
}): Promise<string | null>;
|
|
135
|
+
/** Where exports go by default: `~/Movies/OpenFilm/Exports` (created by the shell). null when unavailable. */
|
|
136
|
+
exportsRoot?(): Promise<string | null>;
|
|
137
|
+
/** Opens a file or folder with its default app. An empty string on success, else the reason. */
|
|
138
|
+
openPath?(path: string): Promise<string>;
|
|
139
|
+
/**
|
|
140
|
+
* The folder made for a new project in the library (already created, ready to use).
|
|
141
|
+
*
|
|
142
|
+
* The shell makes it rather than asking: when the person presses New they do not yet know what the
|
|
143
|
+
* film will become, and should not be asked where to put it. The library root is fixed under the
|
|
144
|
+
* system Movies folder.
|
|
145
|
+
*/
|
|
146
|
+
newProjectDir?(title: string): Promise<{ ok: true; dir: string } | { ok: false; error: string }>;
|
|
147
|
+
/** Where local projects are stored, shown in Settings. null on an old shell or when unavailable. */
|
|
148
|
+
libraryRoot?(): Promise<string | null>;
|
|
149
|
+
/** The menu's File → Open Folder… was clicked. Returns an unsubscribe function. */
|
|
150
|
+
onOpenLocalFolder?(cb: () => void): () => void;
|
|
151
|
+
onMenuAction?(cb: (action: 'settings') => void): () => void;
|
|
152
|
+
/**
|
|
153
|
+
* The absolute path on disk of a browser File (dragged in, or chosen with `<input type=file>`).
|
|
154
|
+
* A pasted file has no path and gives an empty string; then its bytes can only be uploaded.
|
|
155
|
+
*/
|
|
156
|
+
pathForFile(file: File): string;
|
|
157
|
+
/**
|
|
158
|
+
* Connects a local coding agent (see DesktopAgentId) to the app's MCP endpoint: the shell edits the
|
|
159
|
+
* agent's own config file. On success, a sentence saying what to do next; on failure, the reason.
|
|
160
|
+
*/
|
|
161
|
+
connectAgent?(agent: DesktopAgentId): Promise<
|
|
162
|
+
| { ok: true; how: string; next: string }
|
|
163
|
+
/* `code` is 'not-installed' / 'not-ready': the UI words those in its own language; otherwise it shows `error` as is. */
|
|
164
|
+
| { ok: false; error: string; code?: string; install?: string }
|
|
165
|
+
>;
|
|
166
|
+
/**
|
|
167
|
+
* Disconnects: removes our entry from its config.
|
|
168
|
+
*
|
|
169
|
+
* There is no "reconnect": the only case it would fix is a changed address, which disconnecting and
|
|
170
|
+
* connecting again handles, without one more button to explain. So there are two states: connected or not.
|
|
171
|
+
*/
|
|
172
|
+
disconnectAgent?(agent: DesktopAgentId): Promise<{ ok: true } | { ok: false; error: string }>;
|
|
173
|
+
/**
|
|
174
|
+
* `localAgents`: the user's own Claude Code / Codex in the chat panel (ACP, see
|
|
175
|
+
* apps/desktop/src/local-agents-ipc.mjs). The thinking runs on the user's own subscription; the doing
|
|
176
|
+
* is our MCP tools. Events come from `onEvent`.
|
|
177
|
+
*/
|
|
178
|
+
/** The roster: the agents there are, connected or not, shown in the chat's menu or not. */
|
|
179
|
+
agents?: {
|
|
180
|
+
list(): Promise<RosterAgent[]>;
|
|
181
|
+
connect(id: LocalAgentId): Promise<{ ok: boolean; error?: string }>;
|
|
182
|
+
onChange(listener: (agents: RosterAgent[]) => void): () => void;
|
|
183
|
+
/** The diagnostic report (the computer, the last week's problems, the agents) on the clipboard. Older shells lack it. */
|
|
184
|
+
copyReport?(): Promise<{ ok: boolean }>;
|
|
185
|
+
};
|
|
186
|
+
/** Studio's Settings, on Agents (or Providers). */
|
|
187
|
+
openSettings?(section?: 'agents' | 'providers'): void;
|
|
188
|
+
/** Studio's language, whenever it changes (its <html lang>). */
|
|
189
|
+
onLanguage?(listener: (language: string) => void): () => void;
|
|
190
|
+
localAgents?: {
|
|
191
|
+
list(): Promise<LocalAgentState[]>;
|
|
192
|
+
/** Close OpenFilm's open sessions with it (its own login is left alone). Older shells lack it. */
|
|
193
|
+
disconnect?(agent: LocalAgentId): Promise<{ ok: boolean }>;
|
|
194
|
+
/** Opens Terminal to run its own sign-in command, which opens Anthropic's / OpenAI's sign-in page. */
|
|
195
|
+
signIn(agent: LocalAgentId): Promise<{ ok: true } | { ok: false; error: string }>;
|
|
196
|
+
/** Opens a session and closes it at once, only for its options. Sends no message, so costs nothing. */
|
|
197
|
+
probe(agent: LocalAgentId): Promise<{ ok: true; info: LocalAgentSessionInfo } | { ok: false; error: string; code?: string }>;
|
|
198
|
+
/**
|
|
199
|
+
* `resume`: the agent's own id of a conversation it had (an earlier start's info.sessionId), to go on with.
|
|
200
|
+
* `meta`: the turn it starts for, whose log says why when it does not start.
|
|
201
|
+
*/
|
|
202
|
+
start(agent: LocalAgentId, cwd: string, resume?: string | null, meta?: LocalAgentTurnMeta): Promise<
|
|
203
|
+
| { ok: true; key: string; info: LocalAgentSessionInfo }
|
|
204
|
+
| { ok: false; error: string; code?: string; install?: string }
|
|
205
|
+
>;
|
|
206
|
+
/** `images`: pictures sent after the text, to an agent that takes them (the shell asks the session) */
|
|
207
|
+
/** `balance`: the service the app's own agent runs on had no balance left for it */
|
|
208
|
+
/** `model`: the model that answered, for an agent whose session names none (GitHub Copilot's, from its record) */
|
|
209
|
+
prompt(key: string, text: string, meta?: LocalAgentTurnMeta, images?: PromptImage[]): Promise<{ ok: true; stopReason: string; model?: string } | { ok: false; error: string; balance?: Balance }>;
|
|
210
|
+
/** Turns still held by the shell (a reload mid-turn). Older shells lack it. */
|
|
211
|
+
running?(): Promise<LocalAgentRunningTurn[]>;
|
|
212
|
+
/** The page has put this finished turn back: the shell forgets it. */
|
|
213
|
+
ack?(key: string, turnId: string): Promise<{ ok: true }>;
|
|
214
|
+
/** A message sent while a turn runs, into that turn; ok: false when it did not join it. Older shells lack it. */
|
|
215
|
+
steer?(key: string, text: string, images?: PromptImage[]): Promise<{ ok: boolean; outcome: string }>;
|
|
216
|
+
/** What the agent does with nobody having written is the turn `turnId` (null: no longer), in its log. */
|
|
217
|
+
adopt?(key: string, turnId: string | null, meta?: LocalAgentTurnMeta): Promise<{ ok: boolean }>;
|
|
218
|
+
cancel(key: string): Promise<{ ok: true }>;
|
|
219
|
+
setOption(key: string, configId: string, value: unknown): Promise<{ ok: boolean; error?: string; result?: { configOptions?: LocalAgentSessionInfo['configOptions'] } }>;
|
|
220
|
+
answerPermission(key: string, requestId: string, optionId: string | null): Promise<{ ok: boolean }>;
|
|
221
|
+
/** Answers its question; null = skip. Older shells lack it (and never ask). */
|
|
222
|
+
answerQuestion?(key: string, requestId: string, answers: Record<string, LocalAgentAnswer> | null): Promise<{ ok: boolean }>;
|
|
223
|
+
close(key: string): Promise<{ ok: true }>;
|
|
224
|
+
onEvent(cb: (event: LocalAgentEvent) => void): () => void;
|
|
225
|
+
};
|
|
226
|
+
/** System notifications, the Dock badge, and coming back from a notification. */
|
|
227
|
+
tasks?: {
|
|
228
|
+
notify(payload: { title: string; body?: string; href?: string }): Promise<{ ok: boolean }>;
|
|
229
|
+
setBadge(count: number): void;
|
|
230
|
+
onNavigate(cb: (href: string) => void): () => void;
|
|
231
|
+
};
|
|
232
|
+
/** OpenFilm Studio only: the page runs in a plain browser */
|
|
233
|
+
studio?: boolean;
|
|
234
|
+
/**
|
|
235
|
+
* The agents' status: the MCP endpoint's half (who is connected, who is remembered) plus each agent's
|
|
236
|
+
* config file (who was connected). When the endpoint is not running the first half is empty;
|
|
237
|
+
* `configured` still holds, since it reads files on disk.
|
|
238
|
+
*/
|
|
239
|
+
agentStatus?(): Promise<DesktopAgentStatus | null>;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export interface DesktopAgentStatus {
|
|
243
|
+
/** Executable/app detection; leftover configuration is not installation evidence. */
|
|
244
|
+
installed?: Partial<Record<DesktopAgentId, boolean>>;
|
|
245
|
+
url: string;
|
|
246
|
+
/** Whether the MCP endpoint is open (off by default; Connect opens it). */
|
|
247
|
+
enabled?: boolean;
|
|
248
|
+
sessions: Array<{
|
|
249
|
+
id: string;
|
|
250
|
+
clientName: string;
|
|
251
|
+
clientVersion: string;
|
|
252
|
+
createdAt: number;
|
|
253
|
+
lastSeenAt: number;
|
|
254
|
+
/** How it got in: the shell's pairing secret / approved in a dialog / test pass-through. */
|
|
255
|
+
paired?: 'secret' | 'dialog' | 'auto';
|
|
256
|
+
projectId?: string;
|
|
257
|
+
}>;
|
|
258
|
+
trusted: Array<{ name: string; approvedAt: number; expiresAt: number; secret?: true }>;
|
|
259
|
+
audit: string;
|
|
260
|
+
/**
|
|
261
|
+
* The openfilm address each agent's config holds now; null if never connected.
|
|
262
|
+
*
|
|
263
|
+
* Not the same as `sessions`: connected only means the config is written; the agent connects on its
|
|
264
|
+
* next start. The UI tells three states from the two: never connected / connected (waiting for the
|
|
265
|
+
* agent) / live. An address that differs from `url` means the port changed: that entry is broken and
|
|
266
|
+
* must be connected again.
|
|
267
|
+
*/
|
|
268
|
+
configured?: Partial<Record<DesktopAgentId, string | null>>;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
declare global {
|
|
272
|
+
interface Window {
|
|
273
|
+
openfilmDesktop?: DesktopBridge;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* For a file with no path in a local project (a pasted image): the size up to which its bytes go in one
|
|
279
|
+
* request; larger ones are streamed in parts. Not an upload limit. Files with a path (dragged from
|
|
280
|
+
* Finder) are copied by path.
|
|
281
|
+
*/
|
|
282
|
+
export const LOCAL_PUT_MAX_BYTES = 15 * 1024 * 1024;
|
|
283
|
+
|
|
284
|
+
/** Whether this runs in the desktop shell. Always false during SSR. */
|
|
285
|
+
export function isDesktop(): boolean {
|
|
286
|
+
return typeof window !== 'undefined' && !!window.openfilmDesktop;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
export function desktopBridge(): DesktopBridge | null {
|
|
290
|
+
return typeof window !== 'undefined' ? window.openfilmDesktop ?? null : null;
|
|
291
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Settings → Developer, as the chat follows it: `logs` on, each turn shows its full log (components/TurnLog.tsx);
|
|
3
|
+
* `changes` on (unless turned off), what each turn changed in the files, under its reply (components/FileChangesList).
|
|
4
|
+
* The app keeps the choice; Studio's Settings switches it.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import { app, type DeveloperPrefs } from '../app-bridge';
|
|
8
|
+
|
|
9
|
+
let prefs: DeveloperPrefs = { logs: false, changes: true };
|
|
10
|
+
const listeners = new Set<() => void>();
|
|
11
|
+
const set = (next: DeveloperPrefs) => {
|
|
12
|
+
if (next.logs === prefs.logs && next.changes === prefs.changes) return;
|
|
13
|
+
prefs = next;
|
|
14
|
+
for (const listener of listeners) listener();
|
|
15
|
+
};
|
|
16
|
+
let started = false;
|
|
17
|
+
function start() {
|
|
18
|
+
if (started) return;
|
|
19
|
+
started = true;
|
|
20
|
+
void app.developer.get().then(set).catch(() => {});
|
|
21
|
+
app.developer.onChange(set);
|
|
22
|
+
}
|
|
23
|
+
const subscribe = (listener: () => void) => { start(); listeners.add(listener); return () => { listeners.delete(listener); }; };
|
|
24
|
+
|
|
25
|
+
/** each turn's full log, from its footer */
|
|
26
|
+
export function useDeveloperMode(): boolean {
|
|
27
|
+
return React.useSyncExternalStore(subscribe, () => prefs.logs, () => false);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** what each turn changed in the files, under its reply */
|
|
31
|
+
export function useShowChanges(): boolean {
|
|
32
|
+
return React.useSyncExternalStore(subscribe, () => prefs.changes, () => true);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** The project the chat shows (its folder): where a turn's log is. */
|
|
36
|
+
export const ChatProjectContext = React.createContext<string | null>(null);
|
|
37
|
+
|
|
38
|
+
/** Whether something waits for the person's answer now (a question, a permission, a spend): the status line says so. */
|
|
39
|
+
export const WaitingContext = React.createContext(false);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which Esc stops the turn while it runs (the send button's other half): one pressed in the chat (chat-layer.ts
|
|
3
|
+
* `inChat`). One in Studio closes Studio's menu or dialog, and one already handled is its handler's; neither stops the
|
|
4
|
+
* agent. Nor does an Esc held down, or pressed again just after one of those: Studio's Settings gives the focus back to
|
|
5
|
+
* the chat as it closes, so the key held, or pressed twice to close it, would land in the chat and stop the agent.
|
|
6
|
+
*
|
|
7
|
+
* Pure: no React, no bridge, so `node --test` runs it (src/esc-stop.test.mjs).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** An Esc this soon after one that was not the chat's is still closing, not stopping. */
|
|
11
|
+
export const ESC_AGAIN_MS = 1000;
|
|
12
|
+
|
|
13
|
+
type EscKey = Pick<KeyboardEvent, 'key' | 'repeat' | 'defaultPrevented' | 'timeStamp'>;
|
|
14
|
+
|
|
15
|
+
/** Hears every key pressed (`inChat`: where it was) and says whether it stops the turn. */
|
|
16
|
+
export function escStopper(): (event: EscKey, inChat: boolean) => boolean {
|
|
17
|
+
let elsewhereAt = -Infinity;
|
|
18
|
+
return (event, inChat) => {
|
|
19
|
+
if (event.key !== 'Escape') return false;
|
|
20
|
+
if (event.defaultPrevented || !inChat) { elsewhereAt = event.timeStamp; return false; }
|
|
21
|
+
return !event.repeat && event.timeStamp - elsewhereAt >= ESC_AGAIN_MS;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a turn changed in the project's files (src/file-changes.mjs reads the folder as the turn starts and settles):
|
|
3
|
+
* each file added, removed or changed, its lines added and removed, and the changed lines in hunks. Kept with the
|
|
4
|
+
* turn (`fileChanges` on the saved turn), since afterwards nothing can tell what the files were before.
|
|
5
|
+
*
|
|
6
|
+
* Pure: no React, no bridge, so `node --test` runs it (src/file-changes.test.mjs).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface FileHunk { oldStart: number; oldLines: number; newStart: number; newLines: number; lines: string[] }
|
|
10
|
+
|
|
11
|
+
export interface FileChange {
|
|
12
|
+
/** its path in the project, with `/` */
|
|
13
|
+
path: string;
|
|
14
|
+
change: 'added' | 'removed' | 'changed';
|
|
15
|
+
/** lines added and removed: none for a file that is not text (media, a large file) */
|
|
16
|
+
added?: number;
|
|
17
|
+
removed?: number;
|
|
18
|
+
/** the changed lines, with three around each; `cut`: only the first of them are kept */
|
|
19
|
+
hunks?: FileHunk[];
|
|
20
|
+
cut?: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** What a saved turn keeps of this (lib/chat-store's Turn, extended here: older turns have none). */
|
|
24
|
+
export interface TurnFileChanges { fileChanges?: FileChange[] }
|
|
25
|
+
|
|
26
|
+
/** A saved turn's file changes, as read back from its file: what does not look like one is left out. */
|
|
27
|
+
export function readFileChanges(value: unknown): FileChange[] | null {
|
|
28
|
+
if (!Array.isArray(value)) return null;
|
|
29
|
+
const list = value.filter((c): c is FileChange => Boolean(c) && typeof c.path === 'string'
|
|
30
|
+
&& (c.change === 'added' || c.change === 'removed' || c.change === 'changed'));
|
|
31
|
+
return list.length ? list : null;
|
|
32
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The line under the running turn: "Thinking" while it thinks, nothing while a step or its words are showing,
|
|
3
|
+
* "Planning next moves" in the gaps between.
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { useT } from '@/i18n';
|
|
7
|
+
import { transcriptBusy, transcriptDoneTalking } from '@/lib/agent-transcript';
|
|
8
|
+
import type { LocalTranscriptStore } from '@/lib/local-agent-run';
|
|
9
|
+
|
|
10
|
+
export function useLiveActivityFromStore(store: LocalTranscriptStore, thinking = false, planning = true): string | null {
|
|
11
|
+
const t = useT();
|
|
12
|
+
const read = (): string => {
|
|
13
|
+
const transcript = store.get();
|
|
14
|
+
if (transcriptBusy(transcript)) return '';
|
|
15
|
+
if (thinking) return 'act.thinking';
|
|
16
|
+
return !planning || transcriptDoneTalking(transcript) ? '' : 'act.planning';
|
|
17
|
+
};
|
|
18
|
+
const key = React.useSyncExternalStore(store.subscribe, read, read);
|
|
19
|
+
return key ? t(key) : null;
|
|
20
|
+
}
|